diff --git a/.readthedocs.yaml b/.readthedocs.yaml deleted file mode 100644 index f23e96c0cb8d4f3db1834b20536936292f823c4a..0000000000000000000000000000000000000000 --- a/.readthedocs.yaml +++ /dev/null @@ -1,18 +0,0 @@ -# .readthedocs.yaml -# Read the Docs configuration file -# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details - -# Required -version: 2 - -# Build documentation in the docs/ directory with Sphinx -sphinx: - configuration: rtd_docs/conf.py - -# Optionally build your docs in additional formats such as PDF -formats: - - pdf - -conda: - environment: rtd_docs/environment.yml - diff --git a/isis/cmake/BuildDocs.cmake b/isis/cmake/BuildDocs.cmake index 71d73e67381ca106f2a7c6e1efb5a621dfc0a56a..361ea7added45f578af8774eb8e236bec2d0421a 100644 --- a/isis/cmake/BuildDocs.cmake +++ b/isis/cmake/BuildDocs.cmake @@ -73,93 +73,14 @@ function(build_upper_level) # Create the main documentaion page. This is located in the version directory execute_process(COMMAND ${XALAN} ${XALAN_VALIDATE_OPTION} ${XALAN_PARAM_OPTION} menuPath \"\" ${XALAN_OUTFILE_OPTION} ${docInstallFolder}/${docVersion}/index.html ${XALAN_INFILE_OPTION} ${docBuildFolder}/build/homepage.xml ${XALAN_XSL_OPTION} ${docBuildFolder}/build/main.xsl) + # Copy Favicon + file(COPY ${docBuildFolder}/favicon.ico DESTINATION ${docInstallFolder}/${docVersion}/favicon.ico) endfunction(build_upper_level) - -# Build src/docsys/documents folder. -function(build_documents_folder) - - message("Building documents folder...") - message(" Building table of contents XML...") - - # Create RealeaseNotes.xml, ApiChanges.xml and ParameterChanges.xml if need-be - if(EXISTS "${docBuildFolder}/documents/ReleaseNotes/ReleaseNotesList.xml") - execute_process(COMMAND ${XALAN} ${XALAN_PARAM_OPTION} dirParam \"ReleaseNotes\" ${XALAN_INFILE_OPTION} ${docBuildFolder}/documents/ReleaseNotes/ReleaseNotesList.xml ${XALAN_XSL_OPTION} ${docBuildFolder}/build/ReleaseNotes.xsl OUTPUT_FILE ${docBuildFolder}/documents/ReleaseNotes/ReleaseNotes.xml) - execute_process(COMMAND ${XALAN} ${XALAN_PARAM_OPTION} dirParam \"ParameterChanges\" ${XALAN_INFILE_OPTION} ${docBuildFolder}/documents/ReleaseNotes/ReleaseNotesList.xml ${XALAN_XSL_OPTION} ${docBuildFolder}/build/ParameterChanges.xsl OUTPUT_FILE ${docBuildFolder}/documents/ParameterChanges/ParameterChanges.xml) - execute_process(COMMAND ${XALAN} ${XALAN_PARAM_OPTION} dirParam \"ApiChanges\" ${XALAN_INFILE_OPTION} ${docBuildFolder}/documents/ReleaseNotes/ReleaseNotesList.xml ${XALAN_XSL_OPTION} ${docBuildFolder}/build/ApiChanges.xsl OUTPUT_FILE ${docBuildFolder}/documents/ApiChanges/ApiChanges.xml) - else() - # Confirm that empty directories are not going to be traversed in loops coming up - message(" ReleaseNotesList.xml does not exist. Removing ReleaseNotes/ ParameterChanges/ and ApiChanges/ directories...") - execute_process(COMMAND rm -rf ${docBuildFolder}/documents/ReleaseNotes ${docBuildFolder}/documents/ParameterChanges ${docBuildFolder}/documents/ApiChanges) - endif() - - # Get list of folders of interest - get_subdirectory_list(${docBuildFolder}/documents docFolders) - - # Build doctoc.xml, the documents table of contents file. - set(doctocPath ${docBuildFolder}/build/doctoc.xml) - file(REMOVE ${doctocPath}) - cat(${docBuildFolder}/build/doctoc_header.xml ${doctocPath}) - foreach(f ${docFolders}) - - # Each folder in documents gets a section added to doctoc - get_filename_component(docName ${f} NAME_WE) - - execute_process(COMMAND ${XALAN} ${XALAN_PARAM_OPTION} dirParam \"${docName}\" ${XALAN_INFILE_OPTION} ${f}/${docName}.xml ${XALAN_XSL_OPTION} ${docBuildFolder}/build/IsisDocumentTOCbuild.xsl OUTPUT_VARIABLE result) - file(APPEND ${doctocPath} ${result}) - - endforeach() - cat(${docBuildFolder}/build/doctoc_footer.xml ${doctocPath}) - - # Write out a modified .xsl file with the correct location of the Xalan executable. - set(modDocBuildXslFile ${docBuildFolder}/build/IsisInlineDocumentBuild_mod.xsl) - file(READ ${PROJECT_SOURCE_DIR}/scripts/IsisInlineDocumentBuild_mod.xsl xslContents) - string(REPLACE XALAN_BIN_LOCATION ${XALAN} xslContents "${xslContents}") - file(WRITE ${modDocBuildXslFile} "${xslContents}") - - # Build individual documents folders - message(" Building individual documents...") - file(MAKE_DIRECTORY ${docInstallFolder}/${docVersion}/documents) - foreach(f ${docFolders}) - - message("Building documents folder: ${f}") - - # Handle paths for this folder - get_filename_component(docName ${f} NAME_WE) - set(thisOutputFolder ${docInstallFolder}/${docVersion}/documents/${docName}) - file(MAKE_DIRECTORY ${thisOutputFolder}) - - # Use Xalan to generate an intermediate makefile, then execute that makefile - # to generate the output documentation files. - - set(xalanCommand ${XALAN} ${XALAN_PARAM_OPTION} menuPath "../../" ${XALAN_PARAM_OPTION} dirParam "'${docName}'" ${XALAN_OUTFILE_OPTION} ${f}/Makefile_temp ${XALAN_INFILE_OPTION} ${docName}.xml ${XALAN_XSL_OPTION} ${modDocBuildXslFile}) - execute_process(COMMAND ${xalanCommand} WORKING_DIRECTORY ${f}) - - execute_process(COMMAND make -f Makefile_temp docs WORKING_DIRECTORY ${f}) - execute_process(COMMAND rm -f ${f}/Makefile_temp) # Clean up - - # Copy all generated html files and any assets to the install folder - file(GLOB htmlFiles ${f}/*.html) - file(COPY ${htmlFiles} DESTINATION ${thisOutputFolder}) - if(EXISTS "${f}/assets") - copy_folder(${f}/assets ${thisOutputFolder}/assets) - endif() - if(EXISTS "${f}/images") - copy_folder(${f}/images ${thisOutputFolder}/images) - endif() - - endforeach() - -endfunction(build_documents_folder) - - - - - # Supporting files should already be in /src/docsys/Application function(build_application_docs) @@ -206,7 +127,7 @@ function(build_application_docs) # Set up the file set(appTocPath "${CMAKE_INSTALL_PREFIX}/bin/xml/applicationTOC.xml") file(REMOVE ${appTocPath}) - cat(${docBuildFolder}/Application/build/toc_header.xml ${appTocPath}) + file(APPEND ${appTocPath} "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><tableofcontents>") get_subdirectory_list(${appDataFolder} moduleFolders) # Loop through module folders @@ -225,8 +146,8 @@ function(build_application_docs) endforeach() endforeach() - # Append the footer to complete the TOC file! - cat(${docBuildFolder}/Application/build/toc_footer.xml ${appTocPath}) + # Append closing tag to complete the TOC file + file(APPEND ${appTocPath} "</tableofcontents>") endfunction(build_application_docs) @@ -297,7 +218,6 @@ function(build_object_conf) file(APPEND ${appsConf} "INPUT = ${PROJECT_SOURCE_DIR}/src/ ${objConfDir}/isisDoxyDefs.doxydef\n") file(APPEND ${appsConf} "HTML_HEADER = ${objConfDir}/IsisObjectHeader.html\n") file(APPEND ${appsConf} "HTML_FOOTER = ${objConfDir}/IsisObjectFooter.html\n") - file(APPEND ${appsConf} "PROJECT_LOGO = ${docBuildFolder}/assets/icons/USGS_logo55h.png\n") file(APPEND ${appsConf} "HTML_OUTPUT = apps\n") if(NOT ${DOT_PATH} STREQUAL "") @@ -314,7 +234,6 @@ function(build_object_conf) file(APPEND ${programmerConf} "INPUT = ${PROJECT_SOURCE_DIR}/src/ ${objConfDir}/isisDoxyDefs.doxydef\n") file(APPEND ${programmerConf} "HTML_HEADER = ${objConfDir}/IsisObjectHeader.html\n") file(APPEND ${programmerConf} "HTML_FOOTER = ${objConfDir}/IsisObjectFooter.html\n") - file(APPEND ${programmerConf} "PROJECT_LOGO = ${docBuildFolder}/assets/icons/USGS_logo55h.png\n") file(APPEND ${programmerConf} "HTML_OUTPUT = Programmer\n") file(APPEND ${programmerConf} "IMAGE_PATH = \n") @@ -348,7 +267,6 @@ function(build_object_conf) file(APPEND ${developerConf} "INPUT = ${PROJECT_SOURCE_DIR}/src/ ${objConfDir}/isisDoxyDefs.doxydef\n") file(APPEND ${developerConf} "HTML_HEADER = ${objConfDir}/IsisObjectHeader.html\n") file(APPEND ${developerConf} "HTML_FOOTER = ${objConfDir}/IsisObjectFooter.html\n") - file(APPEND ${developerConf} "PROJECT_LOGO = ${docBuildFolder}/assets/icons/USGS_logo55h.png\n") file(APPEND ${developerConf} "HTML_OUTPUT = Developer\n") file(APPEND ${developerConf} "IMAGE_PATH = \n") string(FIND "${MODE}" "LOUD" pos) @@ -454,8 +372,6 @@ function(build_docs) message("Building upper level directories...") build_upper_level() - build_documents_folder() - message("Building application docs...") build_application_docs() diff --git a/isis/make/isismake.apps b/isis/make/isismake.apps index 41b09bbcaf8f53bda1ea3f5a1a1fdaa5c269f100..a8109dee5475da8a33c9c4c4b5569f9c00d37f4e 100644 --- a/isis/make/isismake.apps +++ b/isis/make/isismake.apps @@ -89,9 +89,6 @@ $(BINS): $(UIHEADERS) $(QTRESOURCEFILES) protos $(OBJS) export PATH="$(CODE_COVERAGE_PATH_DIR):$$PATH"; \ $(CXX) $(ALLINCDIRS) $(ISISCPPFLAGS) $(ISIS_PROTOBUF_FLAGS) -c -o $@ $? -.xml.html : - $(XALAN) $(XALAN_VALIDATE_OPTION) $(XALAN_OUTFILE_OPTION) $@ $(XALAN_INFILE_OPTION) $? $(XALAN_XSL_OPTION) $(ISISROOT)/src/docsys/Application/presentation/ProgTester/IsisApplicationDocStyle.xsl - protos: $(PROTOS:%.proto=%.pb.h) $(PROTOS:%.proto=%.pb.cc) %.pb.cc %.pb.h: %.proto @@ -170,9 +167,6 @@ install: app fi -validxml: - $(XALAN) $(XALAN_VALIDATE_OPTION) $(XALAN_OUTFILE_OPTION) /dev/null $(XALAN_INFILE_OPTION) $(BINS).xml $(XALAN_XSL_OPTION) $(ISISROOT)/src/docsys/Application/presentation/ProgTester/IsisApplicationDocStyle.xsl; - docs: mkdir -p $(ISISROOT)/src/docsys/Application/data/`basename $(CURDIR)` cp -p `basename $(CURDIR)`.xml $(ISISROOT)/src/docsys/Application/data/`basename $(CURDIR)` diff --git a/isis/make/isismake.objs b/isis/make/isismake.objs index d1d5e868a3319be6d7044c29117b8cdf60f97dce..c7d469bff1e3b42f9a7afc84d7fadf6a2838360e 100644 --- a/isis/make/isismake.objs +++ b/isis/make/isismake.objs @@ -172,7 +172,6 @@ help: echo "make plugin : Builds a plugin object if applicable" echo "make install : Calls the make target and copies the object and" echo " plugin to $ISISROOT/..." - echo "make html : Builds the html page for the object" echo "make clean : Removes the application, *.html and *.o files." echo " Also cleans the test directories" echo "make sanitize : Calls the clean target then removes tttt* junk.*" @@ -187,8 +186,6 @@ help: echo "make protos : Builds the object of google protocol buffer(*.proto) files" TEMPDIR:=${CURDIR} -html: force - (cd $(ISISROOT)/src/docsys/Object/ ; make CURDIR=$(TEMPDIR) doProgTest ) clean: localclean $(RM) $(OBJS) $(PROTOSGEN) $(MOCGEN) unitTest.o unitTest print.prt \ diff --git a/isis/src/docsys/Application/build/TOCindex.xsl b/isis/src/docsys/Application/build/TOCindex.xsl deleted file mode 100644 index e1ee3b8240cfcf0d71671e29194967fe7c3bea7c..0000000000000000000000000000000000000000 --- a/isis/src/docsys/Application/build/TOCindex.xsl +++ /dev/null @@ -1,293 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<xsl:stylesheet version="1.0" - xmlns:xsl="http://www.w3.org/1999/XSL/Transform" - xmlns:fo="http://www.w3.org/1999/XSL/Format" - exclude-result-prefixes="xmlns fo"> - -<!-- - -This stylesheet will be used to generate the main TOC for applications - -Author -Deborah Lee Soltesz -4/2002 - ---> - - - <xsl:output - media-type="text/html" - doctype-public="-//W3C//DTD HTML 4.01 Transitional//EN" - doctype-system="http://www.w3.org/TR/html4/loose.dtd" - indent="yes" - encoding="utf-8" - omit-xml-declaration="yes"/> - - - <xsl:include href="../../build/menu.xsl"/> - - - <xsl:key name="categoryMatch" match="/tableofcontents/application" use="category/categoryItem"/> - - - <xsl:template match="/"> - <xsl:apply-templates select="tableofcontents" /> - </xsl:template> - - - <xsl:template match="tableofcontents"> - <html> - <head> - <title> - USGS: ISIS Application Table of Contents - </title> - <link rel="stylesheet" href="../assets/styles/IsisStyleCommon.css"></link> - <link rel="stylesheet" media="print" href="../assets/styles/print.css"/> - - <meta name="keywords" content="Isis, applications, table of contents, image processing"/> - - <meta name="description" content="Isis Applications Table of Contents"/> - <meta name="publisher" content="USGS - GD - Astrogeology Research Program"/> - <meta name="author" content="Deborah Lee Soltesz, webteam@astrogeology.usgs.gov"/> - - <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> - <meta name="country" content="USA"/> - <meta name="state" content="AZ"/> - <meta name="county" content="Coconino"/> - <meta name="city" content="Flagstaff"/> - <meta name="zip" content="86001"/> - - <!-- Dynamic analytics insertion to prevent running on local URLs --> - <xsl:text>
</xsl:text> - <script type="text/javascript"> - //<xsl:comment><![CDATA[ - (function() { - var usgsAnalytics = document.createElement('script'); - usgsAnalytics.type = 'text/javascript'; - usgsAnalytics.async = true; - usgsAnalytics.src = 'http://www.usgs.gov/scripts/analytics/usgs-analytics.js'; - if('http:' == document.location.protocol) { - var s = document.getElementsByTagName('script')[0]; - s.parentNode.insertBefore(usgsAnalytics, s); - } - })(); - ]]></xsl:comment> - <xsl:text>
</xsl:text> - </script> - - </head> - - <body> - - <div class="isisMenu"> - <xsl:call-template name="writeMenu"/> - </div> - - <div class="isisContent"> - - <a href="http://www.usgs.gov"> - <img src="../assets/icons/littleVIS.gif" width="80" height="22" border="0" alt="USGS"/></a><br/> - - - <p style="margin-top:10px; margin-bottom:0px;"> - ISIS Application Documentation</p> - - <hr/> - - - <table width="100%" cellpadding="0" border="0" cellspacing="0"> - <tr valign="top"> - <td align="left"> - <h1> - Table of Contents - </h1> - </td> - <td align="right" class="caption"> - <a href="../index.html">Home</a> - </td> - </tr> - </table> - -<!-- links to categories --> - <h3>Categories</h3> - <h4><a href="'#Core">Core Programs</a></h4> - <ul> - <xsl:for-each select="//application/category/categoryItem[not(normalize-space(.)=preceding::application/category/categoryItem)]"> - <xsl:sort order="ascending" select="normalize-space(.)"/> - <li> - <a href="#{normalize-space(.)}"> - <xsl:value-of select="." /></a> - </li> - </xsl:for-each> - <li><a href="#Alphabetical"> - Alphabetical Listing</a></li> - <li><a href="#OldNames"> - Old Application Names vs. New Application Names</a></li> - </ul> - - <h4><a href="#MissionSpecific">Mission Specific Programs</a></h4> - <ul> - <xsl:for-each select="//application/category/missionItem[not(normalize-space(.)=preceding::application/category/missionItem)]"> - <xsl:sort order="ascending" select="normalize-space(.)"/> - <li> - <a href="#{normalize-space(.)}"> - <xsl:value-of select="." /></a> - </li> - </xsl:for-each> - <li><a href="#Alphabetical"> - Alphabetical Listing</a></li> - <li><a href="#OldNames"> - Old Application Names vs. New Application Names</a></li> - </ul> - - -<!-- tables of links to documentation --> - - <a name="Core"></a> - <hr noshade="noshade"/> - <h2>Core Programs</h2> - <xsl:for-each select="//application/category/categoryItem[not(normalize-space(.)=preceding::application/category/categoryItem)]"> - <xsl:sort order="ascending" select="normalize-space(.)"/> - <hr noshade="noshade"/> - <h3> - <a name="{normalize-space(.)}"> - <xsl:value-of select="."/> - </a> - </h3> - <xsl:variable name="categoryName" select="normalize-space(.)"/> - - <table> - <xsl:for-each select="/tableofcontents/application/category/categoryItem"> - <xsl:if test="normalize-space(.) = $categoryName"> - <tr> - <th class="tableCellLevel1_th"> - <xsl:variable name="appName" select="normalize-space(../../name)"/> - <a href="presentation/Tabbed/{$appName}/{$appName}.html"> - <xsl:value-of select="../../name"/></a> - </th> - <td class="tableCellLevel1"> - <xsl:value-of select="../../brief"/><br/> - </td> - </tr> - </xsl:if> - </xsl:for-each> - </table> - </xsl:for-each> - - <a name="MissionSpecific"></a> - <hr noshade="noshade"/> - <h2>Mission Specific Programs</h2> - <xsl:for-each select="//application/category/missionItem[not(normalize-space(.)=preceding::application/category/missionItem)]"> - <xsl:sort order="ascending" select="normalize-space(.)"/> - <hr/> - <h3> - <a name="{normalize-space(.)}"> - <xsl:value-of select="."/> - </a> - </h3> - <xsl:variable name="missionName" select="normalize-space(.)"/> - - <table> - <xsl:for-each select="/tableofcontents/application/category/missionItem"> - <xsl:if test="normalize-space(.) = $missionName"> - <tr> - <th class="tableCellLevel1_th"> - <xsl:variable name="appName" select="normalize-space(../../name)"/> - <a href="presentation/Tabbed/{$appName}/{$appName}.html"> - <xsl:value-of select="../../name"/></a> - </th> - <td class="tableCellLevel1"> - <xsl:value-of select="../../brief"/><br/> - </td> - </tr> - </xsl:if> - </xsl:for-each> - </table> - </xsl:for-each> - -<!-- Alphabetical tables of links to documentation --> - <a name="Alphabetical"></a> - <hr noshade="noshade"/> - <h2>Alphabetical Listing</h2> - - <table> - <xsl:for-each select="/tableofcontents/application"> - <xsl:sort order="ascending" select="name"/> - <tr> - <th class="tableCellLevel1_th"> - <xsl:variable name="appName" select="normalize-space(name)"/> - <a href="presentation/Tabbed/{$appName}/{$appName}.html"> - <xsl:value-of select="$appName"/></a> - </th> - <td class="tableCellLevel1"> - <xsl:if test="brief"> - <xsl:value-of select="brief"/><br/> - </xsl:if> - </td> - </tr> - </xsl:for-each> - </table> - - -<!-- tables of links to documentation matching old names to new names --> - <a name="OldNames"></a> - <hr noshade="noshade"/> - <h2>Old Names vs. New Names</h2> - - <table> - <tr> - <th class="tableCellLevel1_th"> - Old Name - </th> - <th class="tableCellLevel1_th"> - New Name(s) - </th> - </tr> - - <xsl:for-each select="//application/oldName/item[not(normalize-space(.)=preceding::application/oldName/item)]"> - <xsl:sort order="ascending" select="normalize-space(.)"/> - <xsl:variable name="oldIsisName" select="normalize-space(.)"/> - <tr> - <td class="tableCellLevel1" valign="top"> - <xsl:value-of select="."/> - </td> - <td class="tableCellLevel1" valign="top"> - <ul> - <xsl:for-each select="//application/oldName/item"> - <xsl:if test="normalize-space(.) = $oldIsisName"> - <li> - <xsl:variable name="appName" select="normalize-space(../../name)"/> - <a href="presentation/Tabbed/{$appName}/{$appName}.html"> - <xsl:value-of select="../../name"/></a> - </li> - </xsl:if> - </xsl:for-each> - </ul> - </td> - </tr> - </xsl:for-each> - </table> - - - - - - - - - - - - -<!-- FOOTER --> -<script type="text/javascript" language="JavaScript" src="../assets/scripts/footer.js"></script> -</div> - - - - </body> - </html> - - </xsl:template> - -</xsl:stylesheet> diff --git a/isis/src/docsys/Application/build/TOCindex_alpha.xsl b/isis/src/docsys/Application/build/TOCindex_alpha.xsl index 17b84107e296957c1d46a85bee72438c38d5bb39..79d5d3329cac8fcd0505c3d22fd41ba7f3e773e4 100644 --- a/isis/src/docsys/Application/build/TOCindex_alpha.xsl +++ b/isis/src/docsys/Application/build/TOCindex_alpha.xsl @@ -47,16 +47,16 @@ Deborah Lee Soltesz </title> <!-- ISIS Docs --> - <link rel="stylesheet" href="../assets/styles/IsisStyleCommon.css"/> - <link rel="stylesheet" media="print" href="../assets/styles/print.css"/> + <link rel="stylesheet" href="{$menuPath}assets/styles/IsisStyleCommon.css"/> + <link rel="stylesheet" media="print" href="{$menuPath}assets/styles/print.css"/> <!-- USGS --> - <link rel="stylesheet" href="../assets/styles/usgs/common.css" /> - <link rel="stylesheet" href="../assets/styles/usgs/custom.css" /> + <link rel="stylesheet" href="{$menuPath}assets/styles/usgs/common.css" /> + <link rel="stylesheet" href="{$menuPath}assets/styles/usgs/custom.css" /> <!-- Govt --> - <link rel="stylesheet" href="../assets/styles/uswds.css"/> - <script src="../assets/scripts/uswds-init.min.js"></script> + <link rel="stylesheet" href="{$menuPath}assets/styles/uswds.css"/> + <script src="{$menuPath}assets/scripts/uswds-init.min.js"></script> <meta name="keywords" content="Isis, applications, table of contents, image processing"/> @@ -75,7 +75,7 @@ Deborah Lee Soltesz <body> - <script src="../assets/scripts/uswds.min.js"></script> + <script src="{$menuPath}assets/scripts/uswds.min.js"></script> <xsl:call-template name="writeHeader"/> diff --git a/isis/src/docsys/Application/build/TOCindex_category.xsl b/isis/src/docsys/Application/build/TOCindex_category.xsl index 01f0b184272c8d4ee84f98a68dd8c6101f64d12a..28e4dbf1c7fd64f924ce9823b7d0dfc0f6a9b80c 100644 --- a/isis/src/docsys/Application/build/TOCindex_category.xsl +++ b/isis/src/docsys/Application/build/TOCindex_category.xsl @@ -46,16 +46,16 @@ Deborah Lee Soltesz </title> <!-- ISIS Docs --> - <link rel="stylesheet" href="../assets/styles/IsisStyleCommon.css"/> - <link rel="stylesheet" media="print" href="../assets/styles/print.css"/> + <link rel="stylesheet" href="{$menuPath}assets/styles/IsisStyleCommon.css"/> + <link rel="stylesheet" media="print" href="{$menuPath}assets/styles/print.css"/> <!-- USGS --> - <link rel="stylesheet" href="../assets/styles/usgs/common.css" /> - <link rel="stylesheet" href="../assets/styles/usgs/custom.css" /> + <link rel="stylesheet" href="{$menuPath}assets/styles/usgs/common.css" /> + <link rel="stylesheet" href="{$menuPath}assets/styles/usgs/custom.css" /> <!-- Govt --> - <link rel="stylesheet" href="../assets/styles/uswds.css"/> - <script src="../assets/scripts/uswds-init.min.js"></script> + <link rel="stylesheet" href="{$menuPath}assets/styles/uswds.css"/> + <script src="{$menuPath}assets/scripts/uswds-init.min.js"></script> <meta name="keywords" content="Isis, applications, table of contents, image processing"/> @@ -69,11 +69,11 @@ Deborah Lee Soltesz <meta name="county" content="Coconino"/> <meta name="city" content="Flagstaff"/> <meta name="zip" content="86001"/> - </head> + </head> <body> - <script src="../assets/scripts/uswds.min.js"></script> + <script src="{$menuPath}assets/scripts/uswds.min.js"></script> <xsl:call-template name="writeHeader"/> diff --git a/isis/src/docsys/Application/build/TOCindex_oldvnew.xsl b/isis/src/docsys/Application/build/TOCindex_oldvnew.xsl index 42ee2004fb277069b0e4c2b9ec4387ccb9158f75..22853d7bc47aa826b9d6a22205790c6a4b7b4044 100644 --- a/isis/src/docsys/Application/build/TOCindex_oldvnew.xsl +++ b/isis/src/docsys/Application/build/TOCindex_oldvnew.xsl @@ -47,16 +47,16 @@ <!-- ISIS Docs --> - <link rel="stylesheet" href="../assets/styles/IsisStyleCommon.css"/> - <link rel="stylesheet" media="print" href="../assets/styles/print.css"/> + <link rel="stylesheet" href="{$menuPath}assets/styles/IsisStyleCommon.css"/> + <link rel="stylesheet" media="print" href="{$menuPath}assets/styles/print.css"/> <!-- USGS --> - <link rel="stylesheet" href="../assets/styles/usgs/common.css" /> - <link rel="stylesheet" href="../assets/styles/usgs/custom.css" /> + <link rel="stylesheet" href="{$menuPath}assets/styles/usgs/common.css" /> + <link rel="stylesheet" href="{$menuPath}assets/styles/usgs/custom.css" /> <!-- Govt --> - <link rel="stylesheet" href="../assets/styles/uswds.css"/> - <script src="../assets/scripts/uswds-init.min.js"></script> + <link rel="stylesheet" href="{$menuPath}assets/styles/uswds.css"/> + <script src="{$menuPath}assets/scripts/uswds-init.min.js"></script> <meta name="keywords" content="Isis, applications, table of contents, image processing"/> @@ -75,7 +75,7 @@ <body> - <script src="../assets/scripts/uswds.min.js"></script> + <script src="{$menuPath}assets/scripts/uswds.min.js"></script> <xsl:call-template name="writeHeader"/> diff --git a/isis/src/docsys/Application/build/toc_footer.xml b/isis/src/docsys/Application/build/toc_footer.xml deleted file mode 100644 index 3d8c267325c509716393f71fef37d0a600bbf57d..0000000000000000000000000000000000000000 --- a/isis/src/docsys/Application/build/toc_footer.xml +++ /dev/null @@ -1 +0,0 @@ -</tableofcontents> \ No newline at end of file diff --git a/isis/src/docsys/Application/build/toc_header.xml b/isis/src/docsys/Application/build/toc_header.xml deleted file mode 100644 index 355fbd1ec32aa1eb822dfa3c1ee7c9da28e08c39..0000000000000000000000000000000000000000 --- a/isis/src/docsys/Application/build/toc_header.xml +++ /dev/null @@ -1 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="yes"?><tableofcontents> \ No newline at end of file diff --git a/isis/src/docsys/Application/data/Makefile b/isis/src/docsys/Application/data/Makefile index f293a7daf3bfe137050568da074d6b0923fa9802..16c0c1f0b27320dfec45987a1a8dc3ace87ae590 100644 --- a/isis/src/docsys/Application/data/Makefile +++ b/isis/src/docsys/Application/data/Makefile @@ -46,12 +46,12 @@ toc: ../build/toc.xml ../build/toc.xml: $(APPSDIR) ../build/IsisApplicationTOCbuild.xsl echo " Table of Contents XML" - cat ../build/toc_header.xml > ../build/toc.xml + echo "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><tableofcontents>" >> ../build/toc.xml for dirname in $(APPLICATIONS); do \ echo " Adding [$$dirname]" ; \ $(XALAN) $(XALAN_INFILE_OPTION) $$dirname/$$dirname.xml $(XALAN_XSL_OPTION) ../build/IsisApplicationTOCbuild.xsl >> ../build/toc.xml ; \ done - cat ../build/toc_footer.xml >> ../build/toc.xml + echo "</tableofcontents>" >> ../build/toc.xml mkdir -p $(ISISROOT)/bin/xml/ cp ../build/toc.xml $(ISISROOT)/bin/xml/applicationTOC.xml diff --git a/isis/src/docsys/Application/presentation/ProgTester/IsisApplicationDocStyle.xsl b/isis/src/docsys/Application/presentation/ProgTester/IsisApplicationDocStyle.xsl deleted file mode 100644 index 9c84385eebc080bcafcb44b4766a42b37098ffe6..0000000000000000000000000000000000000000 --- a/isis/src/docsys/Application/presentation/ProgTester/IsisApplicationDocStyle.xsl +++ /dev/null @@ -1,1351 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<xsl:stylesheet version="1.0" - xmlns:xsl="http://www.w3.org/1999/XSL/Transform" - xmlns:fo="http://www.w3.org/1999/XSL/Format" - exclude-result-prefixes="xmlns fo"> - -<!-- - -This stylesheet generates the PROGRAMMERS TEST HTML version of the application documentation, used by ISIS Programmers for testing and previewing their documentation. The stylesheet is used by Xalan during the "make {app name}.html" command. An HTML file will be written to the working directory where she can open it in any browser. - -Author -Deborah Lee Soltesz -4/2002 - ---> - - <xsl:output - media-type="text/html" - doctype-public="-//W3C//DTD HTML 4.01 Transitional//EN" - doctype-system="DTD/xhtml1-transitional.dtd" - indent="yes" - encoding="utf-8" - omit-xml-declaration="yes"/> - - <xsl:template match="/"> - <xsl:apply-templates select="application" /> - </xsl:template> - - <xsl:template name="class" match="application"> - <html> - <head> - <title> - USGS: ISIS <xsl:value-of select="@name"/> Application Documentation - </title> - <link rel="stylesheet" href="../styles/IsisApplicationDocStyle.css"></link> - - <xsl:variable name="keywordList"> - Isis, image processing, - <xsl:value-of select="normalize-space(//application/@name)"/> - <xsl:for-each select="//application/category/item"> - , <xsl:value-of select="normalize-space(.)"/> - </xsl:for-each> - </xsl:variable> - <meta name="keywords" content="{normalize-space($keywordList)}"/> - - - <!-- 'author' is the person who originally wrote this program - see history for detailed list of authors--> - <xsl:for-each select="history/change"> - <xsl:sort order="ascending" select="@date"/> - <xsl:if test="position() = 1"> - <meta name="author" content="{@name}"/> - </xsl:if> - </xsl:for-each> - - <meta name="description" content="{normalize-space(brief)}"/> - <meta name="publisher" content="USGS - GD - Astrogeology Research Program"/> - - <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> - <meta name="country" content="USA"/> - <meta name="state" content="AZ"/> - <meta name="county" content="Coconino"/> - <meta name="city" content="Flagstaff"/> - <meta name="zip" content="86001"/> - - - <script language="javascript" type="text/javascript"> - <xsl:comment><![CDATA[ - // SCRIPT: Utility Functions - // Filename: utility.js - // Purpose: miscellaneous little handy JavaScript fuctions - // - // Author: Deborah Lee Soltesz, USGS, 11/2001 - - // History: added popUpNewWindow - dls 2/5/2003 - - - // browser checks - ns4 = (document.layers) ? true:false ; - ns6 = (document.getElementById) ? true:false ; - isNav = (navigator.appName.indexOf("Netscape") != -1) - isMSIE = (navigator.appName.indexOf("Microsoft") != -1) - - - // ***************************************************************** - // POP UP WINDOW - // Open an image (or other file) in new window sized to width-height. - // If window exists, close and open with new size attributes. - // NO decor (toolbars, menus, scrollbars, etc.) and NOT resizable. - - function popUpWindow (url, width, height) { - if (window["POP"] && window["POP"].closed == false) { - POP = window["POP"] ; - if (ns4) { - POP.close() ; - } - else { - POP.resizeTo (width + 30, height + 50) ; - } - } - POP = open(url,"POP","toolbar=0,location=0,status=0,menubar=0,scrollbars=0,resizable=1,width=" + (width + 20) + ",height=" + (height + 20)); - POP.focus() ; - } - - function popUpWindowScrolling (url, width, height) { - if (window["POPs"] && window["POPs"].closed == false) { - POPs = window["POPs"] ; - if (ns4) { - POP.close() ; - } - else { - POPs.resizeTo (width + 30, height + 50) ; - } - } - POPs = open(url,"POPs","toolbar=0,location=0,status=0,menubar=0,scrollbars=1,resizable=1,width=" + (width + 20) + ",height=" + (height + 20)); - POPs.focus() ; - } - - function popUpNewWindow (url, width, height) { - //create random window name - now = new Date() ; - winname = "POP" + now.getHours() + now.getMinutes() + now.getSeconds() + (String)(Math.round(Math.random() * 1000)) ; - open(url,winname,"toolbar=0,location=0,status=0,menubar=0,scrollbars=0,resizable=1,width=" + (width + 20) + ",height=" + (height + 20)); - } - - // CLEAN UP POP UP WINDOW - function cleanUpPopUpWindow () { - if (window["POP"] && window["POP"].closed == false) { - POP = window["POP"] ; - POP.close() ; - } - } - ]]></xsl:comment> - - </script> - - - - <style type="text/css"> - - /* ISIS APPLICATION DOC STYLE SHEET - * FILENAME: IsisApplicationDocStyle.css - * - * Purpose: formatting style sheet for ISIS Application - * documentation presentation - * - * Author: Deborah Lee Soltesz, USGS, 04/03/2002 - */ - - - /* ---------------------------------------------------------------- - * HEADINGS */ - - /* - H1 { - font-family: Arial Black, Arial, Geneva, sans-serif ; - font-size: 150% ; - font-weight: bold ; - text-decoration: none ; - margin-top: 2px; - margin-bottom: 3px; - color: #336699 ; - } - - H2 { - font-family: Arial, Helvetica, Geneva, sans-serif ; - font-size: 110% ; - font-weight: bold ; - font-variant: small-caps ; - text-decoration: none ; - margin-top:2px; - margin-bottom:3px; - padding: 3px ; - } - - H3 { - font-family: serif ; - font-size: 110% ; - font-weight: bold ; - text-decoration: none ; - margin-top:10px; - margin-bottom:5px; - color: #336699 ; - } - - - H4 { - font-family: Arial, Helvetica, Geneva, sans-serif ; - font-size: 110% ; - font-weight: bold ; - text-decoration: underline ; - margin-top:10px; - margin-bottom:5px; - - } - - H5 { - font-family: serif ; - font-size: 90% ; - font-weight: bold ; - text-decoration: underline ; - margin-top:10px; - margin-bottom:5px; - } - - H6 { - font-family: Arial, Helvetica, Geneva, sans-serif ; - font-size: 80% ; - font-weight: bold ; - font-variant: small-caps ; - text-decoration: underline ; - margin-top:10px; - margin-bottom:5px; - } - - HR { - color: #000099 ; - height: 1px ; - } - - body { - background-color: #FFFFFF; - } - */ - - - /* ---------------------------------------------------------------- - * TABLE CELL FORMATTING: table styles for figures; use with CAPTIONS */ - - - /* History table */ - - - .tableCellHistory_date - { - font-style: italic ; - vertical-align: top ; - padding: 3px ; - } - - .tableCellHistory_name - { - font-weight: bold ; - vertical-align: top ; - padding: 3px ; - } - - .tableCellHistory_description - { - vertical-align: top ; - padding: 3px ; - } - - - - /* LEVEL 1: outside level of table cells*/ - - .tableCellLevel1 - { - border: 1px ; - border-color: #88AACC ; - border-style: solid ; - } - - .tableCellLevel1_th - { - border: 3px ; - border-color: #88AACC ; - border-style: solid ; - background-color: #BBDDEE ; - } - - - .tableCellLevel1_type - { - border: 1px ; - border-color: #88AACC ; - border-style: solid ; - font-style: italic ; - } - - .tableCellLevel1_name - { - border: 1px ; - border-color: #88AACC ; - border-style: solid ; - font-weight: bold ; - } - - .tableCellLevel1_description - { - border: 1px ; - border-color: #88AACC ; - border-style: solid ; - } - - - /* LEVEL 2: level of table cells nested inside an outer table */ - - .tableCellLevel2 - { - border: 1px ; - border-color: #CCCCCC ; - border-style: solid ; - font-size: 80% - font-family: Arial, Helvetica, Geneva, sans-serif ; - } - - .tableCellLevel2_type - { - border: 1px ; - border-color: #CCCCCC ; - border-style: solid ; - font-style: italic ; - font-size: 80% - font-family: Arial, Helvetica, Geneva, sans-serif ; - } - - .tableCellLevel2_name - { - border: 1px ; - border-color: #CCCCCC ; - border-style: solid ; - font-weight: bold ; - font-size: 80% - font-family: Arial, Helvetica, Geneva, sans-serif ; - } - - .tableCellLevel2_description - { - border: 1px ; - border-color: #CCCCCC ; - border-style: solid ; - font-size: 80% - font-family: Arial, Helvetica, Geneva, sans-serif ; - } - - - - - /* ---------------------------------------------------------------- - * TABS: tab styles */ - - .tabOn - { - border: 1px ; - border-bottom: 0px ; - border-color: #333399 ; - border-style: solid ; - background-color: #6666AA; - font-family: Arial, Helvetica, Geneva, sans-serif ; - font-weight: bold ; - padding: 5px ; - color: #FFFFFF ; - margin: 0px; - } - - .tabOff - { - border: 1px ; - border-bottom: 0px ; - border-color: #6666AA; - border-style: solid ; - background-color: #DDCCCC ; - font-family: Arial, Helvetica, Geneva, sans-serif ; - font-weight: normal ; - font-style: italic ; - padding: 5px ; - color: #666666 ; - margin: 0px; - } - - .tabHighlight - { - border: 1px ; - border-bottom: 0px ; - border-color: #6666AA; - border-style: solid ; - background-color: #DDDDEE ; - font-family: Arial, Helvetica, Geneva, sans-serif ; - font-style: italic ; - padding: 5px ; - color: #666666 ; - margin: 0px; - cursor: hand ; - } - - - - /* ---------------------------------------------------------------- - * CAPTION: caption text styles */ - - .caption /* defines style for a text caption using page's default color */ - { - font-family: Arial, Helvetica, Geneva, sans-serif ; - font-size: 80% ; - } - - .captionBold /* defines style for a text caption using page's default color */ - { - font-family: Arial, Helvetica, Geneva, sans-serif ; - font-size: 80% ; - font-weight:bold; - } - - - /* ---------------------------------------------------------------- - * TABLE OF CONTENTS: table of contents text styles */ - .TOCanchors /* defines style for top-of-page table-of-contents anchor links */ - { - font-family: Arial, Helvetica, Geneva, sans-serif ; - font-size: 80% ; - margin-bottom:5px ; - margin-top:5px ; - } - - - /* ---------------------------------------------------------------- - * IMAGE FORMATTING: special formatting for linked images */ - - .blackBorderedImage /* */ - { - border-color: #000000 ; - } - - /* ------------------------------------------------------------- - * TOC Table: color override style for application documentation */ - - table.tableFormattedInformation caption - { - border-color: #369 ; - background-color: #ACE ; - } - - table.tableFormattedInformation th - { - border-color: #68A ; - background-color: #9BD ; - } - - </style> - <!-- Dynamic analytics insertion to prevent running on local URLs --> - <xsl:text>
</xsl:text> - <script type="text/javascript"> - //<xsl:comment><![CDATA[ - (function() { - var usgsAnalytics = document.createElement('script'); - usgsAnalytics.type = 'text/javascript'; - usgsAnalytics.async = true; - usgsAnalytics.src = 'http://www.usgs.gov/scripts/analytics/usgs-analytics.js'; - if('http:' == document.location.protocol) { - var s = document.getElementsByTagName('script')[0]; - s.parentNode.insertBefore(usgsAnalytics, s); - } - })(); - ]]></xsl:comment> - <xsl:text>
</xsl:text> - </script> - - </head> - - <body> - - - <a href="http://www.usgs.gov"> - USGS</a><br/> - - - <p style="margin-top:10px; margin-bottom:0px;"> - ISIS Application Documentation</p> - - <hr/> - - <h1> - <xsl:value-of select="@name"/> - </h1> - - <p style="margin-top:0px; font-style:italic;"> - <xsl:value-of select="brief"/> - </p> - - <!-- table of contents --> - <p class="TOCanchors"> - - <a href="#Description"> - Description</a><br/> - - <xsl:if test="category"> - <a href="#Categories"> - Categories</a><br/> - </xsl:if> - - - <xsl:if test="groups"> - <a href="#Groups"> - Groups</a><br/> - </xsl:if> - - <xsl:if test="examples"> - <a href="#Examples"> - Examples</a><br/> - </xsl:if> - - <xsl:if test="history"> - <a href="#History"> - History</a><br/> - </xsl:if> - - <xsl:if test="liens"> - <a href="#ThingsToDo"> - Things To Do</a><br/> - </xsl:if> - - - </p> - - - <!-- Description --> - <a name="Description"></a> - <hr/> - <h2> - Description - </h2> - - <div> - <xsl:apply-templates select="description/* | description/text()" mode="copyContents"/> - </div> - - - <!-- categories --> - <a name="Categories"></a> - <hr/> - <h2> - Categories - </h2> - - <ul> - <xsl:for-each select="category/categoryItem"> - <li><xsl:value-of select="." /></li> - </xsl:for-each> - <xsl:for-each select="category/missionItem"> - <li> - <xsl:value-of select="." /> - </li> - </xsl:for-each> - </ul> - - - <!-- oldName --> - <xsl:if test="oldName"> - <hr/> - <h2> - Related Applications to Previous Versions of ISIS - </h2> - - This program replaces the following - <xsl:choose> - <xsl:when test="count(oldName/item) > 1"> - applications - </xsl:when> - <xsl:otherwise> - application - </xsl:otherwise> - </xsl:choose> - existing in previous versions of ISIS: - - <ul> - <xsl:for-each select="oldName/item"> - <li><xsl:value-of select="."/></li> - </xsl:for-each> - </ul> - </xsl:if> - - - <!-- SeeAlso --> - <xsl:choose> - <xsl:when test="seeAlso"> - <hr/> - <h2> - <a name="SeeAlso"> - Related Objects and Documents</a> - </h2> - - <!-- seeAlso --> - <xsl:for-each select="seeAlso"> - - <xsl:if test="applications"> - <h3>Applications</h3> - <ul> - <xsl:for-each select="applications"> - <xsl:for-each select="item"> - <li><a href="../{.}/{.}.html"> - <xsl:value-of select="."/></a></li> - </xsl:for-each> - </xsl:for-each> - </ul> - </xsl:if> - - <xsl:if test="documents"> - <h3>Documents</h3> - <ul> - <xsl:for-each select="documents"> - <xsl:for-each select="document"> - <xsl:choose> - - <xsl:when test="source/path"> - <li><a href="{source/path}{source/filename}"> - <xsl:value-of select="title"/></a></li> - </xsl:when> - - <xsl:when test="source/filename"> - <li><a href="../documents/{source/filename}"> - <xsl:value-of select="title"/></a></li> - </xsl:when> - - <xsl:otherwise> - <li> - <xsl:value-of select="title"/> - - <xsl:if test="author"> - , <xsl:value-of select="title"/> - </xsl:if> - - <xsl:if test="date"> - , <xsl:value-of select="date"/> - </xsl:if> - - <xsl:if test="publisher"> - ; <xsl:value-of select="publisher"/> - </xsl:if> - - <xsl:if test="pages"> - ; <xsl:value-of select="pages"/> - </xsl:if> - </li> - </xsl:otherwise> - - </xsl:choose> - </xsl:for-each> - </xsl:for-each> - </ul> - </xsl:if> - - </xsl:for-each> - </xsl:when> - </xsl:choose> - - - - <!-- Groups --> - <xsl:if test="groups"> - - <a name="Groups"></a> - <hr/> - <h2> - Parameter Groups - </h2> - <!-- table of groups links --> - <xsl:for-each select="groups"> - <xsl:for-each select="group"> - <xsl:variable name="groupName" select="@name"/> - <h3><xsl:value-of select="@name"/></h3> - <table> - <tr> - <th class="tableCellLevel1_th"> - Name - </th> - <th class="tableCellLevel1_th"> - Description - </th> - </tr> - <xsl:for-each select="parameter"> - <tr> - <td class="tableCellLevel1_name"> - <a href="#{$groupName}{@name}"> - <xsl:value-of select="@name"/></a> - </td> - <td class="tableCellLevel1"> - <xsl:value-of select="brief"/> - </td> - </tr> - </xsl:for-each> - </table> - </xsl:for-each> - </xsl:for-each> - - <!-- groups information --> - <xsl:for-each select="groups"> - <xsl:for-each select="group"> - <xsl:variable name="groupName" select="@name"/> - - <xsl:for-each select="parameter"> - <a name="{$groupName}{@name}"></a> - <hr/> - <h3> - <span style="font-style:italic; text-decoration:underline;"> - <xsl:value-of select="$groupName"/> - </span>: - <xsl:value-of select="@name"/> - </h3> - <div style="margin-left:20px;"> - <table> - <tr> - <th class="tableCellLevel1_th" align="right"> - Type - </th> - <td class="tableCellLevel1_description"> - <xsl:value-of select="type"/> - </td> - </tr> - - <!-- fileMode --> - <xsl:if test="fileMode"> - <tr> - <th class="tableCellLevel1_th" align="right"> - File Mode - </th> - <td class="tableCellLevel1_description"> - <xsl:value-of select="fileMode"/> - </td> - </tr> - </xsl:if> - - <!-- pixelType --> - <xsl:if test="pixelType"> - <tr> - <th class="tableCellLevel1_th" align="right"> - Pixel Type - </th> - <td class="tableCellLevel1_description"> - <xsl:value-of select="pixelType"/> - </td> - </tr> - </xsl:if> - - <!-- default path --> - <xsl:if test="defaultPath"> - <tr> - <th class="tableCellLevel1_th" align="right"> - Default Path - </th> - <td class="tableCellLevel1_description"> - <xsl:value-of select="defaultPath"/> - </td> - </tr> - </xsl:if> - - <xsl:if test="count"> - <tr> - <th class="tableCellLevel1_th" align="right"> - Count - </th> - <td class="tableCellLevel1_description"> - <xsl:value-of select="count"/> - </td> - </tr> - </xsl:if> - - <xsl:if test="default"> - <tr> - <th class="tableCellLevel1_th"> - Default - </th> - <td class="tableCellLevel1_description"> - <xsl:value-of select="default"/> - </td> - </tr> - </xsl:if> - - <xsl:if test="internalDefault"> - <tr> - <th class="tableCellLevel1_th" align="right"> - Internal Default - </th> - <td class="tableCellLevel1_description"> - <xsl:value-of select="internalDefault"/> - </td> - </tr> - </xsl:if> - - <xsl:if test="list"> - <tr> - <th class="tableCellLevel1_th" align="right"> - Option List: - </th> - <td class="tableCellLevel1_description"> - <table> - <tr> - <th class="tableCellLevel2"> - Option</th> - <th class="tableCellLevel2"> - Brief</th> - <th class="tableCellLevel2"> - Description</th> - <th class="tableCellLevel2"> - Exclusions</th> - <th class="tableCellLevel2"> - Inclusions</th> - </tr> - <xsl:for-each select="list/option"> - <tr> - <td class="tableCellLevel2_name"> - <xsl:value-of select="@value"/> - </td> - <td class="tableCellLevel2_type"> - <xsl:value-of select="brief"/> - </td> - <td class="tableCellLevel2_description"> - <xsl:apply-templates select="description/* | description/text()" mode="copyContents"/> - </td> - <td class="tableCellLevel2_description"> - <xsl:if test="exclusions"> - <xsl:for-each select="exclusions/item"> - <xsl:value-of select="."/><br/> - </xsl:for-each> - </xsl:if> - </td> - <td class="tableCellLevel2_description"> - <xsl:if test="inclusions"> - <xsl:for-each select="inclusions/item"> - <xsl:value-of select="."/><br/> - </xsl:for-each> - </xsl:if> - </td> - </tr> - </xsl:for-each> - </table> - </td> - </tr> - </xsl:if> - - - <xsl:if test="minimum"> - <tr> - <th class="tableCellLevel1_th" align="right"> - Minimum - </th> - <td class="tableCellLevel1_description"> - <xsl:value-of select="minimum"/> - <xsl:choose> - <xsl:when test="minimum/@inclusive = 'yes'"> - (inclusive) - </xsl:when> - <xsl:when test="minimum/@inclusive = 'true'"> - (inclusive) - </xsl:when> - <xsl:otherwise> - (exclusive) - </xsl:otherwise> - </xsl:choose> - </td> - </tr> - </xsl:if> - - <xsl:if test="maximum"> - <tr> - <th class="tableCellLevel1_th" align="right"> - Maximum - </th> - <td class="tableCellLevel1_description"> - <xsl:value-of select="maximum"/> - <xsl:choose> - <xsl:when test="maximum/@inclusive = 'yes'"> - (inclusive) - </xsl:when> - <xsl:when test="maximum/@inclusive = 'true'"> - (inclusive) - </xsl:when> - <xsl:otherwise> - (exclusive) - </xsl:otherwise> - </xsl:choose> - </td> - </tr> - </xsl:if> - - <xsl:if test="greaterThan"> - <tr> - <th class="tableCellLevel1_th" align="right"> - Greater Than - </th> - <td class="tableCellLevel1_description"> - <ul> - <xsl:for-each select="greaterThan/item"> - <li> - <xsl:value-of select="."/> - </li> - </xsl:for-each> - </ul> - </td> - </tr> - </xsl:if> - - <xsl:if test="greaterThanOrEqual"> - <tr> - <th class="tableCellLevel1_th" align="right"> - Greater Than or Equal - </th> - <td class="tableCellLevel1_description"> - <ul> - <xsl:for-each select="greaterThanOrEqual/item"> - <li> - <xsl:value-of select="."/> - </li> - </xsl:for-each> - </ul> - </td> - </tr> - </xsl:if> - - <xsl:if test="lessThan"> - <tr> - <th class="tableCellLevel1_th" align="right"> - Less Than - </th> - <td class="tableCellLevel1_description"> - <ul> - <xsl:for-each select="lessThan/item"> - <li><xsl:value-of select="."/></li> - </xsl:for-each> - </ul> - </td> - </tr> - </xsl:if> - - <xsl:if test="lessThanOrEqual"> - <tr> - <th class="tableCellLevel1_th" align="right"> - Less Than or Equal - </th> - <td class="tableCellLevel1_description"> - <ul> - <xsl:for-each select="lessThanOrEqual/item"> - <li><xsl:value-of select="."/></li> - </xsl:for-each> - </ul> - </td> - </tr> - </xsl:if> - - <xsl:if test="notEqual"> - <tr> - <th class="tableCellLevel1_th" align="right"> - Not Equal - </th> - <td class="tableCellLevel1_description"> - <ul> - <xsl:for-each select="notEqual/item"> - <li><xsl:value-of select="."/></li> - </xsl:for-each> - </ul> - </td> - </tr> - </xsl:if> - - <xsl:if test="odd"> - <tr> - <th class="tableCellLevel1_th" align="right"> - Odd - </th> - <td class="tableCellLevel1_description"> - This value must be an odd number - </td> - </tr> - </xsl:if> - - - <xsl:if test="exclusions"> - <tr> - <th class="tableCellLevel1_th" align="right"> - Exclusions - </th> - <td class="tableCellLevel1_description"> - <ul> - <xsl:for-each select="exclusions/item"> - <li><xsl:value-of select="."/></li> - </xsl:for-each> - </ul> - </td> - </tr> - </xsl:if> - - <xsl:if test="inclusions"> - <tr> - <th class="tableCellLevel1_th" align="right"> - Inclusions - </th> - <td class="tableCellLevel1_description"> - <ul> - <xsl:for-each select="inclusions/item"> - <li><xsl:value-of select="."/></li> - </xsl:for-each> - </ul> - </td> - </tr> - </xsl:if> - - <xsl:if test="filter"> - <tr> - <th class="tableCellLevel1_th" align="right"> - Filter - </th> - <td class="tableCellLevel1_description"> - <xsl:value-of select="filter"/> - </td> - </tr> - </xsl:if> - - - - </table> - - <!-- description --> - <h4> - Description - </h4> - <xsl:apply-templates select="description/* | description/text()" mode="copyContents"/> - </div> - - </xsl:for-each> - - </xsl:for-each> - </xsl:for-each> - - - - </xsl:if> - - - <!-- Examples --> - <xsl:if test="examples"> - <a name="Examples"></a> - <hr/> - <h2> - Examples - </h2> - - <xsl:for-each select="examples"> - <xsl:for-each select="example"> - <hr /> - <h3> - Example <xsl:number/> - </h3> - <p style="margin-top:0px;"> - <xsl:value-of select="brief"/> - </p> - - <h4> - Description - </h4> - - <div style="margin-left:20px;"> - <xsl:apply-templates select="description/* | description/text()" mode="copyContents"/> - </div> - - <xsl:if test="terminalInterface"> - <h4> - Command Line - </h4> - - <div style="margin-left:20px;"> - <xsl:for-each select="terminalInterface"> - <code style="font-weight:bold;"> - <xsl:value-of select="/application/@name"/> - <xsl:text> </xsl:text> - <xsl:value-of select="commandLine"/> - </code> - <br/> - <div style="font-style:italic; font-size:X-SMALL;margin-left:20px; width:400px;"> - <xsl:apply-templates select="description/* | description/text()" mode="copyContents"/> - </div> - </xsl:for-each> - </div> - - </xsl:if> - - <!-- GUI Screenshots --> - - <xsl:if test="guiInterfaces"> - <h4> - GUI Screenshot - </h4> - - <div> - <table cellpadding="5"> - <xsl:for-each select="guiInterfaces/guiInterface/image"> - <xsl:apply-templates mode="tabledImages" select="."/> - </xsl:for-each> - </table> - </div> - - </xsl:if> - - <!-- Input Images --> - - <xsl:if test="inputImages"> - <h4> - <xsl:choose> - <xsl:when test="count(inputImages/image) > 1"> - Input Images - </xsl:when> - <xsl:otherwise> - Input Image - </xsl:otherwise> - </xsl:choose> - </h4> - - <div style="margin-left:20px;"> - <table cellpadding="5" width="600"> - <xsl:for-each select="inputImages/image"> - <xsl:apply-templates mode="tabledImages" select="."/> - </xsl:for-each> - </table> - </div> - - </xsl:if> - - - <!-- Data Files --> - <xsl:if test="dataFiles"> - <h4> - <xsl:choose> - <xsl:when test="count(dataFiles/dataFile) > 1"> - Data Files - </xsl:when> - <xsl:otherwise> - Data File - </xsl:otherwise> - </xsl:choose> - </h4> - - <div style="margin-left:20px;"> - <table cellpadding="5" width="600"> - <xsl:for-each select="dataFiles/dataFile"> - <tr> - <th class="tableCellLevel1_th"> - <a href="{@path}"><xsl:value-of select="brief"/></a> - </th> - <td class="tableCellLevel1"> - <xsl:apply-templates select="description/* | description/text()" mode="copyContents"/> - </td> - </tr> - </xsl:for-each> - </table> - </div> - - </xsl:if> - - - - <xsl:if test="outputImages"> - <h4> - <xsl:choose> - <xsl:when test="count(outputImages/image) > 1"> - Output Images - </xsl:when> - <xsl:otherwise> - Output Image - </xsl:otherwise> - </xsl:choose> - </h4> - - <div style="margin-left:20px;"> - <table cellpadding="5" width="600"> - <xsl:for-each select="outputImages/image"> - <xsl:apply-templates mode="tabledImages" select="."/> - </xsl:for-each> - </table> - </div> - - - </xsl:if> - - </xsl:for-each> - </xsl:for-each> - - </xsl:if> - - - <!-- History --> - <xsl:if test="history"> - <a name="History"></a> - <hr/> - <h2> - History - </h2> - - <p> - <em>All history entries are shown, including those marked hidden</em> - </p> - - <table> - <xsl:for-each select="history/change"> - <tr> - <td class="tableCellHistory_name" nowrap="nowrap"> - <xsl:value-of select="@name"/> - </td> - - <td class="tableCellHistory_date" nowrap="nowrap"> - <xsl:value-of select="@date"/> - </td> - - <td class="tableCellHistory_description"> - <xsl:value-of select="."/> - </td> - </tr> - </xsl:for-each> - </table> - </xsl:if> - - <!-- Liens --> - <xsl:if test="Liens"> - <a name="ThingsToDo"></a> - <hr/> - <h2> - Things To Do - </h2> - - <ul> - <xsl:for-each select="liens/item"> - <li><xsl:value-of select="item"/></li> - </xsl:for-each> - </ul> - </xsl:if> - - - - - - <!-- FOOTER --> - <hr/> - footer will appear here - - </body> - </html> - </xsl:template> - - <xsl:template match="image" mode="tabledImages"> - - <tr valign="top"> - <td class="tableCellLevel1_th" width="{thumbnail/@width}" align="center"> -<!-- start IMAGE LINK TAG: pop up window if javascript, otherwise normal link --> -<script type="text/javascript"> - <xsl:comment> - <![CDATA[ - //<!-- -document.write("<a title='Click to view larger image' href='javascript:popUpNewWindow (\"]]><xsl:value-of select="@src"/><![CDATA[\"," + ]]> -<xsl:value-of select="@width"/><![CDATA[+ ", " + ]]><xsl:value-of select="@height"/><![CDATA[+ ")'>") ; - -document.write("<img src=\"]]><xsl:value-of select="normalize-space(thumbnail/@src)"/><![CDATA[\"" -+ " width=" + ]]><xsl:value-of select="normalize-space(thumbnail/@width)"/><![CDATA[ -+ " height=" + ]]><xsl:value-of select="normalize-space(thumbnail/@height)"/><![CDATA[ -+ " alt=\"]]><xsl:value-of select="normalize-space(thumbnail/@caption)"/><![CDATA[\" class='blackBorderedImage'><" + "/a><br>") ; - //--> - ]]> - </xsl:comment> -</script> - - -<noscript> - <a title='Click to view larger image' href="{@src}" target="_new"> - <img src="{normalize-space(thumbnail/@src)}" width="{normalize-space(thumbnail/@width)}" height="{normalize-space(thumbnail/@height)}" alt="{normalize-space(thumbnail/@caption)}" class="blackBorderedImage"/></a><br/> -</noscript> -<!-- end IMAGE LINK TAG: pop up window if javascript, otherwise normal link --> - - <div class="caption"> - <xsl:value-of select="thumbnail/@caption"/> - </div> - - </td> - <td class="tableCellLevel1"> - <p style="font-weight:bold;"> - <xsl:value-of select="brief"/> - </p> - - <xsl:if test="parameterName"> - <p> - <span style="font-weight:bold;"> - Parameter Name: - </span> - <xsl:value-of select="parameterName"/> - <br/> - <xsl:value-of select="parameterName/description"/> - </p> - </xsl:if> - - <div> - <xsl:apply-templates select="description/* | description/text()" mode="copyContents"/> - </div> - - </td> - </tr> - - </xsl:template> - - <xsl:variable name="lower" select="'abcdefghijklmnopqrstuvwxyz'"/> - <xsl:variable name="upper" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'"/> - - <xsl:template name="Pascalize"> - <xsl:param name="text"/> - - <xsl:if test="$text"> - <xsl:value-of select="translate(substring($text, 1, 1), $lower, $upper)"/> - <xsl:value-of select="substring-before(substring($text, 2), ' ')"/> - - <xsl:call-template name="Pascalize"> - <xsl:with-param name="text" - select="substring-after(substring($text, 2), ' ')"/> - </xsl:call-template> - </xsl:if> - </xsl:template> - - <xsl:template match="def" mode="copyContents"> - <xsl:variable name="text"> - <xsl:choose> - <xsl:when test ="@link"> - <xsl:value-of select="normalize-space(@link)"/> - </xsl:when> - <xsl:otherwise> - <xsl:value-of select="normalize-space(.)"/> - </xsl:otherwise> - </xsl:choose> - </xsl:variable> - - <xsl:variable name="anchor"> - <xsl:variable name="formatted"> - <xsl:call-template name="Pascalize"> - <xsl:with-param name="text" select="concat($text, ' ')"/> - </xsl:call-template> - </xsl:variable> - - <xsl:value-of select="translate(normalize-space($formatted), ' ', '')" /> - </xsl:variable> - - <a href="../../../../doc/documents/Glossary/Glossary.html#{$anchor}"> - <xsl:apply-templates mode="copyContents"/> - </a> - </xsl:template> - - <xsl:template match="*" mode="copyContents"> - <xsl:element name="{name()}" namespace="{namespace-uri()}"> - <xsl:copy-of select="@*"/> - <xsl:apply-templates mode="copyContents"/> - </xsl:element> - </xsl:template> - - <xsl:template match="text()" mode="copyContents"> - <xsl:value-of select="."/> - <xsl:apply-templates mode="copyContents"/> - </xsl:template> - -</xsl:stylesheet> diff --git a/isis/src/docsys/Application/presentation/Tabbed/styles/IsisApplicationDocStyle.xsl b/isis/src/docsys/Application/presentation/Tabbed/styles/IsisApplicationDocStyle.xsl index 18d594de69caa05235fffab5318c0dddbdc1b878..6499525cbc354b58ad83f9468d8a061a54df54b1 100644 --- a/isis/src/docsys/Application/presentation/Tabbed/styles/IsisApplicationDocStyle.xsl +++ b/isis/src/docsys/Application/presentation/Tabbed/styles/IsisApplicationDocStyle.xsl @@ -40,20 +40,20 @@ </title> <!-- Govt --> - <link rel="stylesheet" href="../../../../assets/styles/uswds.css"/> - <script src="../../../../assets/scripts/uswds-init.min.js"></script> + <link rel="stylesheet" href="{$menuPath}assets/styles/uswds.css"/> + <script src="{$menuPath}assets/scripts/uswds-init.min.js"></script> <!-- USGS --> - <link rel="stylesheet" href="../../../../assets/styles/usgs/common.css" /> - <link rel="stylesheet" href="../../../../assets/styles/usgs/custom.css" /> + <link rel="stylesheet" href="{$menuPath}assets/styles/usgs/common.css" /> + <link rel="stylesheet" href="{$menuPath}assets/styles/usgs/custom.css" /> <!-- ISIS Docs --> - <link rel="stylesheet" href="../../../../assets/styles/IsisStyleCommon.css"></link> + <link rel="stylesheet" href="{$menuPath}assets/styles/IsisStyleCommon.css"></link> <link rel="stylesheet" href="../styles/IsisApplicationDocStyle.css"></link> - <link rel="stylesheet" media="print" href="../../../../assets/styles/print.css"/> + <link rel="stylesheet" media="print" href="{$menuPath}assets/styles/print.css"/> <noscript> <!-- Use Print stylesheet, unhide all sections if no script --> - <link rel="stylesheet" href="../../../../assets/styles/print.css"/> + <link rel="stylesheet" href="{$menuPath}assets/styles/print.css"/> </noscript> <!-- Note: currently hides header/menu --> <xsl:variable name="keywordList"> @@ -84,10 +84,6 @@ <meta name="city" content="Flagstaff"/> <meta name="zip" content="86001"/> - <script type="text/javascript" src="../../../../assets/scripts/utility.js"> - <xsl:comment><![CDATA[ - ]]></xsl:comment> - </script> <script type="text/javascript"> numExamples = <xsl:value-of select="count(/application/examples/example)"/> ; @@ -150,7 +146,7 @@ <body onload="contentToggleVisibility('overview');"> - <script src="../../../../assets/scripts/uswds.min.js"></script> + <script src="{$menuPath}assets/scripts/uswds.min.js"></script> <xsl:call-template name="writeHeader"/> diff --git a/isis/src/docsys/Makefile b/isis/src/docsys/Makefile index c69e0b02bbf93cfc907c47905741c0ddd1f51966..e13235d30f0ea352efb7799e72339b18937188d1 100644 --- a/isis/src/docsys/Makefile +++ b/isis/src/docsys/Makefile @@ -76,6 +76,7 @@ upperlevel: echo " [home page]" #rsync -lHptr --delete --rsh=ssh --cvs-exclude *.html $(DOCDIR)/ $(XALAN) $(XALAN_VALIDATE_OPTION) $(XALAN_PARAM_OPTION) menuPath "'./'" $(XALAN_OUTFILE_OPTION) $(DOCDIR)/index.html $(XALAN_INFILE_OPTION) build/homepage.xml $(XALAN_XSL_OPTION) build/main.xsl + cp favicon.ico $(DOCDIR)/favicon.ico echo " Finished Updating Directories" @@ -128,11 +129,9 @@ clean: rm -rf cgi-bin cd Schemas && rm -f *.html ; cd .. ; - cd build && rm -f doctoc.xml ; cd .. ; cd Application ; $(MAKE) clean ; cd .. ; cd Object ; $(MAKE) clean ; cd .. ; - cd documents ; $(MAKE) clean ; cd .. ; cleandocs: rm -r $(DOCDIR)/* diff --git a/isis/src/docsys/Object/Makefile b/isis/src/docsys/Object/Makefile index 82a930a88e80c49beecfe48a819adeda07c9d8d7..beb8a8f2652cf36befcd1f5c3407502ca6f2afea 100644 --- a/isis/src/docsys/Object/Makefile +++ b/isis/src/docsys/Object/Makefile @@ -100,34 +100,8 @@ doProg: doDev: echo " ...building Developer documentation" $(DOXYGEN) build/Developer_temp.conf - -# The doProgTest target can be used to build documentation for an individual Object. -# E.G. from isis/src/base/objs/Camera do -# ( cd ../../../docsys/Object ; make CURDIR=/scratch/m04585/isis/src/base/objs/Camera doProgTest ) -doProgTest: - echo "Building ProgTester configuration in: $(CURDIR) ISISROOT is: $(ISISROOT)" - mkdir -p docbuild - cat $(ISISROOT)/src/docsys/Object/build//Programmer.conf > docbuild/ProgTester_temp.conf - echo "OUTPUT_DIRECTORY = $(CURDIR)/" >> docbuild/ProgTester_temp.conf - echo "STRIP_FROM_PATH = $(CURDIR)/" >> docbuild/ProgTester_temp.conf - echo "INPUT = $(CURDIR)/ \\" >> docbuild/ProgTester_temp.conf - echo " $(ISISROOT)/src/docsys/Object/build/isisDoxyDefs.doxydef" >> docbuild/ProgTester_temp.conf - echo "HTML_HEADER = $(ISISROOT)/src/docsys/Object/build/IsisObjectHeader.html" >> docbuild/ProgTester_temp.conf - echo "HTML_FOOTER = $(ISISROOT)/src/docsys/Object/build/IsisObjectFooter.html" >> docbuild/ProgTester_temp.conf - echo "HTML_OUTPUT = html" >> docbuild/ProgTester_temp.conf - echo "WARN_LOGFILE = " >> docbuild/ProgTester_temp.conf - echo "QUIET = YES" >> docbuild/ProgTester_temp.conf - echo "WARNINGS = YES" >> docbuild/ProgTester_temp.conf - echo "WARN_IF_UNDOCUMENTED = YES" >> docbuild/ProgTester_temp.conf - echo "WARN_IF_DOC_ERROR = YES" >> docbuild/ProgTester_temp.conf - echo "WARN_NO_PARAMDOC = YES" >> docbuild/ProgTester_temp.conf - $(DOXYGEN) docbuild/ProgTester_temp.conf - echo "View your documentation by opening the file html/index.html in a browser" -#do the following on a clean, as well as whacking the html directory created in this dir by doxy - rm -r docbuild - #---- # CLEAN clean: @@ -140,9 +114,7 @@ clean: cleandoc: rm -r $(ISISROOT)/doc/Object - - - + #TODO diff --git a/isis/src/docsys/Object/build/Developer.conf b/isis/src/docsys/Object/build/Developer.conf index a61df7d69044cbc2819a25aae992842ab930ee48..5434dd5f323b128f21e6e48c91a351bd6ed5c9f7 100644 --- a/isis/src/docsys/Object/build/Developer.conf +++ b/isis/src/docsys/Object/build/Developer.conf @@ -51,7 +51,7 @@ PROJECT_BRIEF = # pixels and the maximum width should not exceed 200 pixels. Doxygen will copy # the logo to the output directory. -PROJECT_LOGO = ../../docsys/assets/icons/USGS_logo55h.png +PROJECT_LOGO = # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path # into which the generated documentation will be written. If a relative path is @@ -1211,8 +1211,7 @@ HTML_STYLESHEET = # list). For an example see the documentation. # This tag requires that the tag GENERATE_HTML is set to YES. -HTML_EXTRA_STYLESHEET = ../assets/styles/IsisStyleCommon.css \ - assets/styles/IsisObjectAPIDocStyle.css +HTML_EXTRA_STYLESHEET = # The HTML_EXTRA_FILES tag can be used to specify one or more extra images or # other source files which should be copied to the HTML output directory. Note @@ -1254,15 +1253,6 @@ HTML_COLORSTYLE_SAT = 100 HTML_COLORSTYLE_GAMMA = 80 -# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML -# page will contain the date and time when the page was generated. Setting this -# to YES can help to show when doxygen was last run and thus if the -# documentation is up to date. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_TIMESTAMP = YES - # If the HTML_DYNAMIC_MENUS tag is set to YES then the generated HTML # documentation will contain a main index with vertical navigation menus that # are dynamically created via JavaScript. If disabled, the navigation index will @@ -1573,17 +1563,6 @@ HTML_FORMULA_FORMAT = png FORMULA_FONTSIZE = 10 -# Use the FORMULA_TRANSPARENT tag to determine whether or not the images -# generated for formulas are transparent PNGs. Transparent PNGs are not -# supported properly for IE 6.0, but are supported on all modern browsers. -# -# Note that when changing this option you need to delete any form_*.png files in -# the HTML output directory before the changes have effect. -# The default value is: YES. -# This tag requires that the tag GENERATE_HTML is set to YES. - -FORMULA_TRANSPARENT = YES - # The FORMULA_MACROFILE can contain LaTeX \newcommand and \renewcommand commands # to create new LaTeX commands to be used in formulas as building blocks. See # the section "Including formulas" for details. @@ -1920,14 +1899,6 @@ LATEX_HIDE_INDICES = NO LATEX_BIB_STYLE = plain -# If the LATEX_TIMESTAMP tag is set to YES then the footer of each generated -# page will contain the date and time when the page was generated. Setting this -# to NO can help when comparing the output of multiple runs. -# The default value is: NO. -# This tag requires that the tag GENERATE_LATEX is set to YES. - -LATEX_TIMESTAMP = NO - # The LATEX_EMOJI_DIRECTORY tag is used to specify the (relative or absolute) # path from which the emoji images will be read. If a relative path is entered, # it will be relative to the LATEX_OUTPUT directory. If left blank the @@ -2266,15 +2237,6 @@ EXTERNAL_PAGES = YES # Configuration options related to the dot tool #--------------------------------------------------------------------------- -# If the CLASS_DIAGRAMS tag is set to YES, doxygen will generate a class diagram -# (in HTML and LaTeX) for classes with base or super classes. Setting the tag to -# NO turns the diagrams off. Note that this option also works with HAVE_DOT -# disabled, but it is recommended to install and use dot, since it yields more -# powerful graphs. -# The default value is: YES. - -CLASS_DIAGRAMS = YES - # You can include diagrams made with dia in doxygen documentation. Doxygen will # then run dia to produce the diagram and insert it in the documentation. The # DIA_PATH tag allows you to specify the directory where the dia binary resides. @@ -2307,23 +2269,6 @@ HAVE_DOT = YES DOT_NUM_THREADS = 0 -# When you want a differently looking font in the dot files that doxygen -# generates you can specify the font name using DOT_FONTNAME. You need to make -# sure dot is able to find the font, which can be done by putting it in a -# standard location or by setting the DOTFONTPATH environment variable or by -# setting DOT_FONTPATH to the directory containing the font. -# The default value is: Helvetica. -# This tag requires that the tag HAVE_DOT is set to YES. - -DOT_FONTNAME = Helvetica - -# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of -# dot graphs. -# Minimum value: 4, maximum value: 24, default value: 10. -# This tag requires that the tag HAVE_DOT is set to YES. - -DOT_FONTSIZE = 10 - # By default doxygen will tell dot to use the default font as specified with # DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set # the path where dot can find it using this tag. @@ -2558,18 +2503,6 @@ DOT_GRAPH_MAX_NODES = 50 MAX_DOT_GRAPH_DEPTH = 2 -# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent -# background. This is disabled by default, because dot on Windows does not seem -# to support this out of the box. -# -# Warning: Depending on the platform used, enabling this option may lead to -# badly anti-aliased labels on the edges of a graph (i.e. they become hard to -# read). -# The default value is: NO. -# This tag requires that the tag HAVE_DOT is set to YES. - -DOT_TRANSPARENT = YES - # Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output # files in one run (i.e. multiple -o and -T options on the command line). This # makes dot run faster, but since only newer versions of dot (>1.8.10) support diff --git a/isis/src/docsys/Object/build/IsisObjectFooter.html b/isis/src/docsys/Object/build/IsisObjectFooter.html index 3d5fa86f56ff4ba74f998ed40e2b58b7b4f13c33..43a4afe71b11489abff027089b19d484e7307a3f 100644 --- a/isis/src/docsys/Object/build/IsisObjectFooter.html +++ b/isis/src/docsys/Object/build/IsisObjectFooter.html @@ -1,17 +1,55 @@ -<!-- HTML footer for doxygen 1.8.14--> -<!-- start footer part --> -<!--BEGIN GENERATE_TREEVIEW--> -<div id="nav-path" class="navpath"><!-- id is needed for treeview function! --> - <ul> - $navpath - </ul> -</div> -<!--END GENERATE_TREEVIEW--> -<!--BEGIN !GENERATE_TREEVIEW--> -<hr class="footer"/><address class="footer"><small> -</small></address> -<!--END !GENERATE_TREEVIEW--> + <!-- HTML footer for doxygen 1.8.14--> + <!-- start footer part --> + <!--BEGIN GENERATE_TREEVIEW--> + <div id="nav-path" class="navpath"><!-- id is needed for treeview function! --> + <ul> + $navpath + </ul> + </div> + <!--END GENERATE_TREEVIEW--> + <!--BEGIN !GENERATE_TREEVIEW--> + <hr class="footer"/> + <address class="footer"> + <small> + </small> + </address> + <!--END !GENERATE_TREEVIEW--> -<script type="text/javascript" language="JavaScript" src="../../assets/scripts/footer.js"></script> -</body> + <!-- REQUIRED Official USGS Footer--> + <footer class="footer"> + <div class="tmp-container"> + <div class="footer-doi"> + <ul class="menu nav"> + <li class="first leaf menu-links menu-level-1"><a + href="https://www.doi.gov/privacy">DOI Privacy Policy</a></li> + <li class="leaf menu-links menu-level-1"><a + href="https://www.usgs.gov/policies-and-notices">Legal</a></li> + <li class="leaf menu-links menu-level-1"><a + href="https://www.usgs.gov/accessibility-and-us-geological-survey">Accessibility</a></li> + <li class="leaf menu-links menu-level-1"><a + href="https://www.usgs.gov/sitemap">Site Map</a></li> + <li class="last leaf menu-links menu-level-1"><a + href="https://answers.usgs.gov/">Contact USGS</a></li> + </ul> + </div> + <hr/> + <div class="footer-doi"> + <ul class="menu nav"> + <li class="first leaf menu-links menu-level-1"><a + href="https://www.doi.gov/">U.S. Department of the Interior</a></li> + <li class="leaf menu-links menu-level-1"><a + href="https://www.doioig.gov/">DOI Inspector General</a></li> + <li class="leaf menu-links menu-level-1"><a + href="https://www.whitehouse.gov/">White House</a></li> + <li class="leaf menu-links menu-level-1"><a + href="https://www.whitehouse.gov/omb/management/egov/">E-gov</a></li> + <li class="leaf menu-links menu-level-1"><a + href="https://www.doi.gov/pmb/eeo/no-fear-act">No Fear Act</a></li> + <li class="last leaf menu-links menu-level-1"><a + href="https://www.usgs.gov/about/organization/science-support/foia">FOIA</a></li> + </ul> + </div> + </div> + </footer> + </body> </html> diff --git a/isis/src/docsys/Object/build/IsisObjectHeader.html b/isis/src/docsys/Object/build/IsisObjectHeader.html index 19165ad137f3d40495dcdf8244af30d19f22b201..e4cb398711da333e348294043401e02cdb905586 100644 --- a/isis/src/docsys/Object/build/IsisObjectHeader.html +++ b/isis/src/docsys/Object/build/IsisObjectHeader.html @@ -2,69 +2,188 @@ <!-- HTML header for doxygen 1.8.14--> <!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/xhtml;charset=UTF-8"/> -<meta http-equiv="X-UA-Compatible" content="IE=9"/> -<meta name="generator" content="Doxygen $doxygenversion"/> -<meta name="viewport" content="width=device-width, initial-scale=1"/> + <head> + <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> + <meta http-equiv="X-UA-Compatible" content="IE=9"/> + <meta name="generator" content="Doxygen $doxygenversion"/> + <meta name="viewport" content="width=device-width, initial-scale=1"/> -<!-- Start USGS customized --> -<meta name="keywords" content="Isis, image processing, API, object, class documentation"> -<meta name="author" content="USGS Astrogeology Research Program"> -<meta name="description" content="Documentation for Isis Objects, the Isis API"> -<meta name="publisher" content="USGS - GD - Astrogeology Research Program"> -<meta name="country" content="USA"> -<meta name="state" content="AZ"> -<meta name="county" content="Coconino"> -<meta name="city" content="Flagstaff"> -<meta name="zip" content="86001"> -<!-- End USGS customized --> + <!-- Start USGS customized --> + <meta name="keywords" content="Isis, image processing, API, object, class documentation"> + <meta name="author" content="USGS Astrogeology Research Program"> + <meta name="description" content="Documentation for Isis Objects, the Isis API"> + <meta name="publisher" content="USGS - GD - Astrogeology Research Program"> + <meta name="country" content="USA"> + <meta name="state" content="AZ"> + <meta name="county" content="Coconino"> + <meta name="city" content="Flagstaff"> + <meta name="zip" content="86001"> + <!-- End USGS customized --> -<!--BEGIN PROJECT_NAME--><title>$projectname: $title</title><!--END PROJECT_NAME--> -<!--BEGIN !PROJECT_NAME--><title>$title</title><!--END !PROJECT_NAME--> -<link href="$relpath^tabs.css" rel="stylesheet" type="text/css"/> -<script type="text/javascript" src="$relpath^jquery.js"></script> -<script type="text/javascript" src="$relpath^dynsections.js"></script> -$treeview -$search -$mathjax -<link href="$relpath^$stylesheet" rel="stylesheet" type="text/css" /> -$extrastylesheet -</head> -<body> -<div id="top"><!-- do not remove this div, it is closed by doxygen! --> + <!--BEGIN PROJECT_NAME--><title>$projectname: $title</title><!--END PROJECT_NAME--> + <!--BEGIN !PROJECT_NAME--><title>$title</title><!--END !PROJECT_NAME--> -<!--BEGIN TITLEAREA--> -<div id="titlearea"> -<table cellspacing="0" cellpadding="0"> - <tbody> - <tr style="height: 56px;"> - <!--BEGIN PROJECT_LOGO--> - <td id="projectlogo"><img alt="Logo" src="$relpath^$projectlogo"/></td> - <!--END PROJECT_LOGO--> - <!--BEGIN PROJECT_NAME--> - <td id="projectalign" style="padding-left: 0.5em;"> - <div id="projectname">$projectname - <!--BEGIN PROJECT_NUMBER--> <span id="projectnumber">$projectnumber</span><!--END PROJECT_NUMBER--> - </div> - <!--BEGIN PROJECT_BRIEF--><div id="projectbrief">$projectbrief</div><!--END PROJECT_BRIEF--> - </td> - <!--END PROJECT_NAME--> - <!--BEGIN !PROJECT_NAME--> - <!--BEGIN PROJECT_BRIEF--> - <td style="padding-left: 0.5em;"> - <div id="projectbrief">$projectbrief</div> - </td> - <!--END PROJECT_BRIEF--> - <!--END !PROJECT_NAME--> - <!--BEGIN DISABLE_INDEX--> - <!--BEGIN SEARCHENGINE--> - <td>$searchbox</td> - <!--END SEARCHENGINE--> - <!--END DISABLE_INDEX--> - </tr> - </tbody> -</table> -</div> -<!--END TITLEAREA--> -<!-- end header part --> + <!-- USGS --> + <link rel="stylesheet" href="../../assets/styles/usgs/common.css" /> + <link rel="stylesheet" href="../../assets/styles/usgs/custom.css" /> + + <!-- Govt --> + <link rel="stylesheet" href="../../assets/styles/uswds.css"/> + <script src="../../assets/scripts/uswds-init.min.js"></script> + + <!-- ISIS API Docs --> + <link rel="stylesheet" href="../../assets/styles/IsisStyleAPI.css"/> + + <link href="$relpath^tabs.css" rel="stylesheet" type="text/css"/> + <script type="text/javascript" src="$relpath^jquery.js"></script> + <script type="text/javascript" src="$relpath^dynsections.js"></script> + $treeview + $search + $mathjax + <link href="$relpath^$stylesheet" rel="stylesheet" type="text/css" /> + $extrastylesheet + + </head> + <body> + <div id="top"><!-- do not remove this div, it is closed by doxygen! --> + + <script src="../../assets/scripts/uswds.min.js"></script> + + <!--BEGIN TITLEAREA--> + <div id="titlearea"> + + <header> + <!-- Government Website Banner--> + <section class="usa-banner" aria-label="Official website of the United States government"> + <div class="usa-accordion"> + <header class="usa-banner__header"> + <div class="usa-banner__inner"> + <div class="grid-col-auto"> + <img + aria-hidden="true" + class="usa-banner__header-flag" + src="../../assets/img/us_flag_small.png" + alt="" + /> + </div> + <div class="grid-col-fill tablet:grid-col-auto" aria-hidden="true"> + <p class="usa-banner__header-text"> + An official website of the United States government + </p> + <p class="usa-banner__header-action">Here’s how you know</p> + </div> + <button + type="button" + class="usa-accordion__button usa-banner__button" + aria-expanded="false" + aria-controls="gov-banner-default" + > + <span class="usa-banner__button-text">Here’s how you know</span> + </button> + </div> + </header> + <div + class="usa-banner__content usa-accordion__content" + id="gov-banner-default" + > + <div class="grid-row grid-gap-lg"> + <div class="usa-banner__guidance tablet:grid-col-6"> + <img + class="usa-banner__icon usa-media-block__img" + src="../../assets/img/icon-dot-gov.svg" + role="img" + alt="" + aria-hidden="true" + /> + <div class="usa-media-block__body"> + <p> + <strong>Official websites use .gov</strong><br />A + <strong>.gov</strong> website belongs to an official government + organization in the United States. + </p> + </div> + </div> + <div class="usa-banner__guidance tablet:grid-col-6"> + <img + class="usa-banner__icon usa-media-block__img" + src="../../assets/img/icon-https.svg" + role="img" + alt="" + aria-hidden="true" + /> + <div class="usa-media-block__body"> + <p> + <strong>Secure .gov websites use HTTPS</strong><br />A + <strong>lock</strong> + (<span class="icon-lock" + ><svg + xmlns="http://www.w3.org/2000/svg" + width="14" + height="12" + viewBox="0 100 1000 1000" + class="usa-banner__lock-image-pd" + role="img" + aria-labelledby="banner-lock-description-default" + focusable="false" + > + <title id="banner-lock-title-default">Lock</title> + <desc id="banner-lock-description-default">Locked padlock icon</desc> + <path + fill="#000000" + fill-rule="evenodd" + d="M955.5,560.9v471.4c0,14.3-5.7,28-15.9,38.1-10.1,10.1-23.8,15.8-38.1,15.9H302.5c-14.3,0-28-5.8-38.1-15.9-10.1-10.1-15.8-23.8-15.9-38.1v-471.4c0-14.3,5.7-28,15.9-38.1,10.1-10.1,23.8-15.8,38.1-15.9h58.4v-120.6c0-63.9,25.4-125.2,70.6-170.4,45.2-45.2,106.5-70.6,170.5-70.6s125.2,25.4,170.5,70.6c45.2,45.2,70.6,106.5,70.6,170.5v120.6h58.4,0c14.3,0,28,5.7,38.1,15.9,10.1,10.1,15.8,23.8,15.9,38.1h0ZM767.5,386.3c0-43.9-17.4-86-48.5-117-31-31-73.1-48.5-117-48.5s-86,17.4-117,48.5-48.5,73.1-48.5,117v120.6h330.9v-120.6Z" + /> + </svg> </span + >) or <strong>https://</strong> means you’ve safely connected to + the .gov website. Share sensitive information only on official, + secure websites. + </p> + </div> + </div> + </div> + </div> + </div> + </section> + </header> + + <!-- Official USGS Header --> + <header id="navbar" class="header-nav" role="banner"> + <div class="tmp-container"> + <div class="header-search"> + <a class="logo-header" href="https://www.usgs.gov/" title="Home"> + <img src="https://asc-docs.s3.us-west-2.amazonaws.com/common/img/usgs-vis-2x.png" + style="height: 50px; margin-top: 8px; margin-bottom: 8px;" alt="Home" class="img" border="0" /> + </a> + </div> + </div> + </header> + + <table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <!--BEGIN PROJECT_NAME--> + <td id="projectalign" style="padding-left: 0.5em;"> + <div id="projectname">$projectname + <!--BEGIN PROJECT_NUMBER--> <span id="projectnumber">$projectnumber</span><!--END PROJECT_NUMBER--> + </div> + <!--BEGIN PROJECT_BRIEF--><div id="projectbrief">$projectbrief</div><!--END PROJECT_BRIEF--> + </td> + <!--END PROJECT_NAME--> + <!--BEGIN !PROJECT_NAME--> + <!--BEGIN PROJECT_BRIEF--> + <td style="padding-left: 0.5em;"> + <div id="projectbrief">$projectbrief</div> + </td> + <!--END PROJECT_BRIEF--> + <!--END !PROJECT_NAME--> + <!--BEGIN DISABLE_INDEX--> + <!--BEGIN SEARCHENGINE--> + <td>$searchbox</td> + <!--END SEARCHENGINE--> + <!--END DISABLE_INDEX--> + </tr> + </tbody> + </table> + </div> + <!--END TITLEAREA--> + <!-- end header part --> diff --git a/isis/src/docsys/Object/build/Programmer.conf b/isis/src/docsys/Object/build/Programmer.conf index 9bb594a01e8c14aaea89f583aa8e495da8b063d4..5c340befffd950263f13fb13cbde376c0ee3d0a3 100644 --- a/isis/src/docsys/Object/build/Programmer.conf +++ b/isis/src/docsys/Object/build/Programmer.conf @@ -51,7 +51,7 @@ PROJECT_BRIEF = # pixels and the maximum width should not exceed 200 pixels. Doxygen will copy # the logo to the output directory. -PROJECT_LOGO = ../../docsys/assets/icons/USGS_logo55h.png +PROJECT_LOGO = # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path # into which the generated documentation will be written. If a relative path is @@ -1254,15 +1254,6 @@ HTML_COLORSTYLE_SAT = 100 HTML_COLORSTYLE_GAMMA = 80 -# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML -# page will contain the date and time when the page was generated. Setting this -# to YES can help to show when doxygen was last run and thus if the -# documentation is up to date. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_TIMESTAMP = YES - # If the HTML_DYNAMIC_MENUS tag is set to YES then the generated HTML # documentation will contain a main index with vertical navigation menus that # are dynamically created via JavaScript. If disabled, the navigation index will @@ -1573,17 +1564,6 @@ HTML_FORMULA_FORMAT = png FORMULA_FONTSIZE = 10 -# Use the FORMULA_TRANSPARENT tag to determine whether or not the images -# generated for formulas are transparent PNGs. Transparent PNGs are not -# supported properly for IE 6.0, but are supported on all modern browsers. -# -# Note that when changing this option you need to delete any form_*.png files in -# the HTML output directory before the changes have effect. -# The default value is: YES. -# This tag requires that the tag GENERATE_HTML is set to YES. - -FORMULA_TRANSPARENT = YES - # The FORMULA_MACROFILE can contain LaTeX \newcommand and \renewcommand commands # to create new LaTeX commands to be used in formulas as building blocks. See # the section "Including formulas" for details. @@ -1920,14 +1900,6 @@ LATEX_HIDE_INDICES = NO LATEX_BIB_STYLE = plain -# If the LATEX_TIMESTAMP tag is set to YES then the footer of each generated -# page will contain the date and time when the page was generated. Setting this -# to NO can help when comparing the output of multiple runs. -# The default value is: NO. -# This tag requires that the tag GENERATE_LATEX is set to YES. - -LATEX_TIMESTAMP = NO - # The LATEX_EMOJI_DIRECTORY tag is used to specify the (relative or absolute) # path from which the emoji images will be read. If a relative path is entered, # it will be relative to the LATEX_OUTPUT directory. If left blank the @@ -2266,15 +2238,6 @@ EXTERNAL_PAGES = YES # Configuration options related to the dot tool #--------------------------------------------------------------------------- -# If the CLASS_DIAGRAMS tag is set to YES, doxygen will generate a class diagram -# (in HTML and LaTeX) for classes with base or super classes. Setting the tag to -# NO turns the diagrams off. Note that this option also works with HAVE_DOT -# disabled, but it is recommended to install and use dot, since it yields more -# powerful graphs. -# The default value is: YES. - -CLASS_DIAGRAMS = YES - # You can include diagrams made with dia in doxygen documentation. Doxygen will # then run dia to produce the diagram and insert it in the documentation. The # DIA_PATH tag allows you to specify the directory where the dia binary resides. @@ -2307,23 +2270,6 @@ HAVE_DOT = YES DOT_NUM_THREADS = 0 -# When you want a differently looking font in the dot files that doxygen -# generates you can specify the font name using DOT_FONTNAME. You need to make -# sure dot is able to find the font, which can be done by putting it in a -# standard location or by setting the DOTFONTPATH environment variable or by -# setting DOT_FONTPATH to the directory containing the font. -# The default value is: Helvetica. -# This tag requires that the tag HAVE_DOT is set to YES. - -DOT_FONTNAME = Helvetica - -# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of -# dot graphs. -# Minimum value: 4, maximum value: 24, default value: 10. -# This tag requires that the tag HAVE_DOT is set to YES. - -DOT_FONTSIZE = 10 - # By default doxygen will tell dot to use the default font as specified with # DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set # the path where dot can find it using this tag. @@ -2558,18 +2504,6 @@ DOT_GRAPH_MAX_NODES = 50 MAX_DOT_GRAPH_DEPTH = 2 -# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent -# background. This is disabled by default, because dot on Windows does not seem -# to support this out of the box. -# -# Warning: Depending on the platform used, enabling this option may lead to -# badly anti-aliased labels on the edges of a graph (i.e. they become hard to -# read). -# The default value is: NO. -# This tag requires that the tag HAVE_DOT is set to YES. - -DOT_TRANSPARENT = YES - # Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output # files in one run (i.e. multiple -o and -T options on the command line). This # makes dot run faster, but since only newer versions of dot (>1.8.10) support diff --git a/isis/src/docsys/Object/build/isisDoxyDefs.doxydef b/isis/src/docsys/Object/build/isisDoxyDefs.doxydef index 11d3a08cfa3ca8b231a8ecb97cff25443bcee1a8..3ab53ff11e668d31e5b4d011167c8ce3ee563829 100644 --- a/isis/src/docsys/Object/build/isisDoxyDefs.doxydef +++ b/isis/src/docsys/Object/build/isisDoxyDefs.doxydef @@ -681,7 +681,7 @@ * */ - /* @} end of Missions group */ + /** @} end of Missions group */ // MAIN PAGE - content of the table-of-contents page for the %Isis Object Documentation diff --git a/isis/src/docsys/assets/icons/USGS_logo55h.png b/isis/src/docsys/assets/icons/USGS_logo55h.png deleted file mode 100644 index 84ccf08ddffc18d4fc0fc86af80ff38e49b96e9a..0000000000000000000000000000000000000000 Binary files a/isis/src/docsys/assets/icons/USGS_logo55h.png and /dev/null differ diff --git a/isis/src/docsys/assets/icons/firstgov.gif b/isis/src/docsys/assets/icons/firstgov.gif deleted file mode 100644 index eafecca2273b9d736bc2a8337cace72258b42220..0000000000000000000000000000000000000000 Binary files a/isis/src/docsys/assets/icons/firstgov.gif and /dev/null differ diff --git a/isis/src/docsys/assets/icons/firstgov_trans.gif b/isis/src/docsys/assets/icons/firstgov_trans.gif deleted file mode 100644 index ba5ed0af61192d754dc4cacd7235563b1da26a7f..0000000000000000000000000000000000000000 Binary files a/isis/src/docsys/assets/icons/firstgov_trans.gif and /dev/null differ diff --git a/isis/src/docsys/assets/icons/littleVIS.gif b/isis/src/docsys/assets/icons/littleVIS.gif deleted file mode 100644 index d5b03d321efa2901c14319907a90f76f4b433c6c..0000000000000000000000000000000000000000 Binary files a/isis/src/docsys/assets/icons/littleVIS.gif and /dev/null differ diff --git a/isis/src/docsys/assets/img/00-image-licence-source-notice.md b/isis/src/docsys/assets/img/00-image-licence-source-notice.md index d6de14f4c9eadcb8b838ea5c4b46262330b76e2b..0b93f0e17a82ecdb22ff98ec9b02542c410beb2e 100644 --- a/isis/src/docsys/assets/img/00-image-licence-source-notice.md +++ b/isis/src/docsys/assets/img/00-image-licence-source-notice.md @@ -49,4 +49,11 @@ https://thenounproject.com/creator/cfpb_minicons/ - usa-icons-bg/search--white.svg - by Jacob Cain USGS ASC. CC0 Public Domain. - Derivative work of the following, also public domain: - - noun-magnifying-glass-89626.svg (CFPB via the Noun Project) \ No newline at end of file + - noun-magnifying-glass-89626.svg (CFPB via the Noun Project) + +## Banner Sources + +- moon-cr.jpg + - Modified by Jacob Cain USGS ASC. CC0 Public Domain. + - Modification of a Project Apollo Archive Image (also public domain). + \ No newline at end of file diff --git a/rtd_docs/ISIS_Logo.svg b/isis/src/docsys/assets/img/image-source-files/ISIS_Logo.svg similarity index 100% rename from rtd_docs/ISIS_Logo.svg rename to isis/src/docsys/assets/img/image-source-files/ISIS_Logo.svg diff --git a/rtd_docs/ISIS_Quicklink.svg b/isis/src/docsys/assets/img/image-source-files/ISIS_Quicklink.svg similarity index 100% rename from rtd_docs/ISIS_Quicklink.svg rename to isis/src/docsys/assets/img/image-source-files/ISIS_Quicklink.svg diff --git a/isis/src/docsys/originals/assets/banners/banner.psd b/isis/src/docsys/assets/img/image-source-files/historic/banner.psd similarity index 100% rename from isis/src/docsys/originals/assets/banners/banner.psd rename to isis/src/docsys/assets/img/image-source-files/historic/banner.psd diff --git a/isis/src/docsys/originals/assets/banners/banner2.psd b/isis/src/docsys/assets/img/image-source-files/historic/banner2.psd similarity index 100% rename from isis/src/docsys/originals/assets/banners/banner2.psd rename to isis/src/docsys/assets/img/image-source-files/historic/banner2.psd diff --git a/isis/src/docsys/originals/assets/banners/banner3.psd b/isis/src/docsys/assets/img/image-source-files/historic/banner3.psd similarity index 100% rename from isis/src/docsys/originals/assets/banners/banner3.psd rename to isis/src/docsys/assets/img/image-source-files/historic/banner3.psd diff --git a/isis/src/docsys/originals/assets/banners/banner4.psd b/isis/src/docsys/assets/img/image-source-files/historic/banner4.psd similarity index 100% rename from isis/src/docsys/originals/assets/banners/banner4.psd rename to isis/src/docsys/assets/img/image-source-files/historic/banner4.psd diff --git a/isis/src/docsys/originals/assets/banners/isis_bg_texture.jpg b/isis/src/docsys/assets/img/image-source-files/historic/isis_bg_texture.jpg similarity index 100% rename from isis/src/docsys/originals/assets/banners/isis_bg_texture.jpg rename to isis/src/docsys/assets/img/image-source-files/historic/isis_bg_texture.jpg diff --git a/isis/src/docsys/originals/assets/banners/isis_wallpaper.psd b/isis/src/docsys/assets/img/image-source-files/historic/isis_wallpaper.psd similarity index 100% rename from isis/src/docsys/originals/assets/banners/isis_wallpaper.psd rename to isis/src/docsys/assets/img/image-source-files/historic/isis_wallpaper.psd diff --git a/isis/src/docsys/assets/banners/banner.jpg b/isis/src/docsys/assets/img/image-source-files/historic/jpg/banner.jpg similarity index 100% rename from isis/src/docsys/assets/banners/banner.jpg rename to isis/src/docsys/assets/img/image-source-files/historic/jpg/banner.jpg diff --git a/isis/src/docsys/assets/banners/isis_bg.jpg b/isis/src/docsys/assets/img/image-source-files/historic/jpg/isis_bg.jpg similarity index 100% rename from isis/src/docsys/assets/banners/isis_bg.jpg rename to isis/src/docsys/assets/img/image-source-files/historic/jpg/isis_bg.jpg diff --git a/isis/src/docsys/assets/banners/isis_main.jpg b/isis/src/docsys/assets/img/image-source-files/historic/jpg/isis_main.jpg similarity index 100% rename from isis/src/docsys/assets/banners/isis_main.jpg rename to isis/src/docsys/assets/img/image-source-files/historic/jpg/isis_main.jpg diff --git a/isis/src/docsys/assets/banners/isis_menu.jpg b/isis/src/docsys/assets/img/image-source-files/historic/jpg/isis_menu.jpg similarity index 100% rename from isis/src/docsys/assets/banners/isis_menu.jpg rename to isis/src/docsys/assets/img/image-source-files/historic/jpg/isis_menu.jpg diff --git a/isis/src/docsys/assets/banners/isis_wallpaper.jpg b/isis/src/docsys/assets/img/image-source-files/historic/jpg/isis_wallpaper.jpg similarity index 100% rename from isis/src/docsys/assets/banners/isis_wallpaper.jpg rename to isis/src/docsys/assets/img/image-source-files/historic/jpg/isis_wallpaper.jpg diff --git a/isis/src/docsys/assets/img/image-source-files/isis-logo.ai b/isis/src/docsys/assets/img/image-source-files/isis-logo.ai new file mode 100755 index 0000000000000000000000000000000000000000..9efb70df7e3f0b3b03ecf6099a31eb81edc2335e --- /dev/null +++ b/isis/src/docsys/assets/img/image-source-files/isis-logo.ai @@ -0,0 +1,517 @@ +%PDF-1.6 %���� +1 0 obj <</Metadata 2 0 R/OCProperties<</D<</OFF[23 0 R 24 0 R]/ON[25 0 R]/Order 26 0 R/RBGroups[]>>/OCGs[23 0 R 24 0 R 25 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <</Length 27938/Subtype/XML/Type/Metadata>>stream +<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> +<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 9.1-c002 1.000000, 0000/00/00-00:00:00 "> + <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> + <rdf:Description rdf:about="" + xmlns:xmp="http://ns.adobe.com/xap/1.0/" + xmlns:xmpGImg="http://ns.adobe.com/xap/1.0/g/img/" + xmlns:xmpTPg="http://ns.adobe.com/xap/1.0/t/pg/" + xmlns:stDim="http://ns.adobe.com/xap/1.0/sType/Dimensions#" + xmlns:stFnt="http://ns.adobe.com/xap/1.0/sType/Font#" + xmlns:xmpG="http://ns.adobe.com/xap/1.0/g/" + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" + xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" + xmlns:stEvt="http://ns.adobe.com/xap/1.0/sType/ResourceEvent#" + xmlns:illustrator="http://ns.adobe.com/illustrator/1.0/" + xmlns:pdf="http://ns.adobe.com/pdf/1.3/"> + <xmp:CreatorTool>Adobe Illustrator 28.7 (Macintosh)</xmp:CreatorTool> + <xmp:CreateDate>2024-09-13T16:11:37-07:00</xmp:CreateDate> + <xmp:MetadataDate>2024-09-13T16:11:38-07:00</xmp:MetadataDate> + <xmp:ModifyDate>2024-09-13T16:11:38-07:00</xmp:ModifyDate> + <xmp:Thumbnails> + <rdf:Alt> + <rdf:li rdf:parseType="Resource"> + <xmpGImg:width>256</xmpGImg:width> + <xmpGImg:height>164</xmpGImg:height> + <xmpGImg:format>JPEG</xmpGImg:format> + <xmpGImg:image>/9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA
AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK
DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f
Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgApAEAAwER
AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA
AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB
UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE
1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ
qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy
obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp
0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo
+DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4ql+ta5Z6PDbz3iv6F
xcR2xlQArG0poryVIonKgJ98jKVM4QMuSF84ahq2n6BPc6VEZLpWjBYRmYxxs4EkoiXd+CknjgmS
BsywxBlRQHkvXlvpbu1k11NXljCSRq1q1lcIh2blGwXkvKlCF274Mcr62yzQqjVfG0V5Y1W+1G+1
715A9tZ6g1paKABxWKKMuKgAn4mPXDAkk+9jlgAI+YS6Pzvqj6nehNLWXSrC9+oXLRSFryMhgvrt
bhN4iTtQ1pvkfEN8tmzwRQ33IvyZhlrjOxV2KuxV2KuxVjXnTzi/lgadcy2bT6bcz+jfXat/vOpA
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</xmpGImg:image> + </rdf:li> + </rdf:Alt> + </xmp:Thumbnails> + <xmpTPg:NPages>1</xmpTPg:NPages> + <xmpTPg:HasVisibleTransparency>False</xmpTPg:HasVisibleTransparency> + <xmpTPg:HasVisibleOverprint>False</xmpTPg:HasVisibleOverprint> + <xmpTPg:MaxPageSize rdf:parseType="Resource"> + <stDim:w>330.000000</stDim:w> + <stDim:h>330.000000</stDim:h> + <stDim:unit>Pixels</stDim:unit> + </xmpTPg:MaxPageSize> + <xmpTPg:Fonts> + <rdf:Bag> + <rdf:li rdf:parseType="Resource"> + <stFnt:fontName>UrbaneRounded-Medium</stFnt:fontName> + <stFnt:fontFamily>Urbane Rounded</stFnt:fontFamily> + <stFnt:fontFace>Medium</stFnt:fontFace> + <stFnt:fontType>Open Type</stFnt:fontType> + <stFnt:versionString>Version 7.000;hotconv 1.0.109;makeotfexe 2.5.65596</stFnt:versionString> + <stFnt:composite>False</stFnt:composite> + <stFnt:fontFileName>.38228.otf</stFnt:fontFileName> + </rdf:li> + </rdf:Bag> + </xmpTPg:Fonts> + <xmpTPg:PlateNames> + <rdf:Seq> + <rdf:li>Cyan</rdf:li> + <rdf:li>Magenta</rdf:li> + <rdf:li>Yellow</rdf:li> + <rdf:li>Black</rdf:li> + </rdf:Seq> + </xmpTPg:PlateNames> + <xmpTPg:SwatchGroups> + <rdf:Seq> + <rdf:li rdf:parseType="Resource"> + <xmpG:groupName>Default Swatch Group</xmpG:groupName> + <xmpG:groupType>0</xmpG:groupType> + </rdf:li> + </rdf:Seq> + </xmpTPg:SwatchGroups> + <dc:format>application/pdf</dc:format> + <dc:title> + <rdf:Alt> + <rdf:li xml:lang="x-default">isis-logo</rdf:li> + </rdf:Alt> + </dc:title> + <xmpMM:DocumentID>xmp.did:812a6b46-9c8c-40c7-9a5b-b5457050d8f5</xmpMM:DocumentID> + <xmpMM:InstanceID>uuid:e6af970f-a606-ab4e-bdb6-983f96b2dba7</xmpMM:InstanceID> + <xmpMM:OriginalDocumentID>xmp.did:645a5ea1-3b7e-4280-a3f4-1e0276715760</xmpMM:OriginalDocumentID> + <xmpMM:RenditionClass>proof:pdf</xmpMM:RenditionClass> + <xmpMM:DerivedFrom rdf:parseType="Resource"> + <stRef:instanceID>xmp.iid:2ce48adf-00ed-4397-8796-155ea50801b9</stRef:instanceID> + <stRef:documentID>xmp.did:2ce48adf-00ed-4397-8796-155ea50801b9</stRef:documentID> + <stRef:originalDocumentID>xmp.did:645a5ea1-3b7e-4280-a3f4-1e0276715760</stRef:originalDocumentID> + </xmpMM:DerivedFrom> + <xmpMM:History> + <rdf:Seq> + <rdf:li rdf:parseType="Resource"> + <stEvt:action>saved</stEvt:action> + <stEvt:instanceID>xmp.iid:645a5ea1-3b7e-4280-a3f4-1e0276715760</stEvt:instanceID> + <stEvt:when>2024-09-06T23:44:10-07:00</stEvt:when> + <stEvt:softwareAgent>Adobe Illustrator 28.7 (Macintosh)</stEvt:softwareAgent> + <stEvt:changed>/</stEvt:changed> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <stEvt:action>saved</stEvt:action> + <stEvt:instanceID>xmp.iid:812a6b46-9c8c-40c7-9a5b-b5457050d8f5</stEvt:instanceID> + <stEvt:when>2024-09-10T17:03:39-07:00</stEvt:when> + <stEvt:softwareAgent>Adobe Illustrator 28.7 (Macintosh)</stEvt:softwareAgent> + <stEvt:changed>/</stEvt:changed> + </rdf:li> + </rdf:Seq> + </xmpMM:History> + <illustrator:Type>Document</illustrator:Type> + <illustrator:CreatorSubTool>AIRobin</illustrator:CreatorSubTool> + <pdf:Producer>Adobe PDF library 17.00</pdf:Producer> + </rdf:Description> + </rdf:RDF> +</x:xmpmeta> + + + + + + + + + + + + + + + + + + + + + +<?xpacket end="w"?> endstream endobj 3 0 obj <</Count 6/Kids[5 0 R 19 0 R 20 0 R 21 0 R 22 0 R 27 0 R]/Type/Pages>> endobj 5 0 obj <</ArtBox[29.7019 26.536 300.298 316.791]/BleedBox[0.0 0.0 330.0 330.0]/Contents 28 0 R/CropBox[0.0 0.0 330.0 330.0]/LastModified(D:20240913161137-07'00')/MediaBox[0.0 0.0 330.0 330.0]/Parent 3 0 R/Resources<</ExtGState<</GS0 29 0 R>>/Font<</T1_0 30 0 R>>/ProcSet[/PDF/Text]/Properties<</MC0 23 0 R/MC1 24 0 R/MC2 25 0 R>>>>/TrimBox[0.0 0.0 330.0 330.0]/Type/Page/PieceInfo<</Illustrator 8 0 R>>>> endobj 19 0 obj <</ArtBox[29.7019 26.536 300.298 316.791]/BleedBox[0.0 0.0 330.0 330.0]/Contents 31 0 R/CropBox[0.0 0.0 330.0 330.0]/LastModified(D:20240913161137-07'00')/MediaBox[0.0 0.0 330.0 330.0]/Parent 3 0 R/Resources<</ExtGState<</GS0 29 0 R>>/Properties<</MC0 23 0 R/MC1 24 0 R/MC2 25 0 R>>>>/TrimBox[0.0 0.0 330.0 330.0]/Type/Page/PieceInfo<</Illustrator 8 0 R>>>> endobj 20 0 obj <</ArtBox[29.7019 26.536 300.298 316.791]/BleedBox[0.0 0.0 330.0 330.0]/Contents 32 0 R/CropBox[0.0 0.0 330.0 330.0]/LastModified(D:20240913161137-07'00')/MediaBox[0.0 0.0 330.0 330.0]/Parent 3 0 R/Resources<</ExtGState<</GS0 29 0 R>>/Font<</T1_0 30 0 R>>/ProcSet[/PDF/Text]/Properties<</MC0 23 0 R/MC1 24 0 R/MC2 25 0 R>>>>/TrimBox[0.0 0.0 330.0 330.0]/Type/Page/PieceInfo<</Illustrator 8 0 R>>>> endobj 21 0 obj <</ArtBox[29.7019 26.536 300.298 316.791]/BleedBox[0.0 0.0 330.0 330.0]/Contents 33 0 R/CropBox[0.0 0.0 330.0 330.0]/LastModified(D:20240913161137-07'00')/MediaBox[0.0 0.0 330.0 330.0]/Parent 3 0 R/Resources<</ExtGState<</GS0 29 0 R>>/Properties<</MC0 23 0 R/MC1 24 0 R/MC2 25 0 R>>>>/TrimBox[0.0 0.0 330.0 330.0]/Type/Page/PieceInfo<</Illustrator 8 0 R>>>> endobj 22 0 obj <</ArtBox[29.7019 6.53604 300.298 330.0]/BleedBox[0.0 0.0 330.0 330.0]/Contents 34 0 R/CropBox[0.0 0.0 330.0 330.0]/LastModified(D:20240913161137-07'00')/MediaBox[0.0 0.0 330.0 330.0]/Parent 3 0 R/Resources<</ExtGState<</GS0 29 0 R>>/Font<</T1_0 30 0 R>>/ProcSet[/PDF/Text]/Properties<</MC0 23 0 R/MC1 24 0 R/MC2 25 0 R>>>>/TrimBox[0.0 0.0 330.0 330.0]/Type/Page/PieceInfo<</Illustrator 8 0 R>>>> endobj 27 0 obj <</ArtBox[29.7019 6.53604 300.298 330.0]/BleedBox[0.0 0.0 330.0 330.0]/Contents 35 0 R/CropBox[0.0 0.0 330.0 330.0]/LastModified(D:20240913161137-07'00')/MediaBox[0.0 0.0 330.0 330.0]/Parent 3 0 R/Resources<</ExtGState<</GS0 29 0 R>>/Font<</T1_0 30 0 R>>/ProcSet[/PDF/Text]/Properties<</MC0 23 0 R/MC1 24 0 R/MC2 25 0 R>>>>/TrimBox[0.0 0.0 330.0 330.0]/Type/Page/PieceInfo<</Illustrator 8 0 R>>>> endobj 35 0 obj <</Filter/FlateDecode/Length 1099>>stream +H��Vˎ7��W� G��Wo� #0<@�9b�7���R�z�ջ��m�$��b��巧py�Û�����>��$��t.E.=�ȩ$|u�����/b����%H����*�-� -rm����f[�I�G��G-�3�D2�A[��̹i�ʵ���>���߾@GJ���������bX�p��I�%��n��'5���p�0���c*����!sE�7xYF +�r�dz��#����EB��f�{���p\g�U3b�3�XBE� ��be͌�4T��m�s/��pV�|��?�@/��&�1��P���}���#��FGEĕa��VY�)����ܪ�6� +,C�"�0H#;����*&n�'����:h8^ ��� "��P�A�hq@��h� (�c��<��qB����xLl��� _m zAr��T��C��t �r@���p5��R�U�����v(��W5dj���Q�_�CL��bAR3A��.#��*@ˌӬ����)���Z��J��Z�l��h���4?!�Ϛ���ۥ2[ȁIE�4lh���ǭ�L7Dn[�"�Z����v���vv�Q�:=l!UUs��Ȥ@��sp��[w�h�tOvl<��M��p���X��s̈��XjP)�ܬ���S͎4�Tu���<�T�Ki4����P.��W��g�A:���������A��5+i�Й4���V�Й7���Й:�r�V�Й=�҇�Й@�2�V +љC���VљF+�V�9�Pha�J ZD�=���B��=�<�=��X]�`�Pb��0x�+,���n�K�L�l�vZ�^�݉�_����ˣ�����pl6O��b.�K+��nG�ѭ˹����8��75ԥ�����'_�~i�����=�7��r�?,[F݀�x5�h���7$&<�$�]I�f�����x�{{{�� F�\��V��o��eQ0�[vP9�v�L��h��n�n0�}Y�鸣�ޥ*�GO��T Rp������ku���@���Q��$<�jN~I�\�}�7�JD�S����:®ß������������ endstream endobj 8 0 obj <</LastModified(D:20240913161137-07'00')/Private 9 0 R>> endobj 9 0 obj <</AIMetaData 10 0 R/AIPrivateData1 11 0 R/AIPrivateData2 12 0 R/ContainerVersion 12/CreatorVersion 28/NumBlock 2/RoundtripStreamType 2/RoundtripVersion 24>> endobj 10 0 obj <</Length 1583>>stream +%!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 24.0 %%AI8_CreatorVersion: 28.7.1 %%For: (Cain, Jacob Ryan) () %%Title: (isis-logo.ai) %%CreationDate: 9/13/24 16:11 %%Canvassize: 16383 %%BoundingBox: -355 -376 768 332 %%HiResBoundingBox: -354.05588807154 -375.730426127837 767.29724070026 331.978515625 %%DocumentProcessColors: Cyan Magenta Yellow Black %AI5_FileFormat 14.0 %AI12_BuildNumber: 142 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%RGBProcessColor: 0 0 0 ([Registration]) %AI3_Cropmarks: -383.757776883302 -382.266472615025 -53.7577768833016 -52.2664726150251 %AI3_TemplateBox: 200.5 164 200.5 164 %AI3_TileBox: -506.757776883302 -573.266472615025 69.2422231166984 160.733527384975 %AI3_DocumentPreview: None %AI5_ArtSize: 14400 14400 %AI5_RulerUnits: 6 %AI24_LargeCanvasScale: 1 %AI9_ColorModel: 1 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 3 %AI17_Begin_Content_if_version_gt:24 4 %AI10_OpenToVie: -839.446906761256 475.810144715402 0.805557178768144 0 7975.20660597216 8396.72329620919 2036 1101 18 0 0 2054 45 0 0 0 1 1 0 1 1 0 1 %AI17_Alternate_Content %AI9_OpenToView: -839.446906761256 475.810144715402 0.805557178768144 2036 1101 18 0 0 2054 45 0 0 0 1 1 0 1 1 0 1 %AI17_End_Versioned_Content %AI5_OpenViewLayers: 766 %AI17_Begin_Content_if_version_gt:24 4 %AI17_Alternate_Content %AI17_End_Versioned_Content %%PageOrigin:-759 -376.5 %AI7_GridSettings: 72 8 72 8 1 0 0.800000011920929 0.800000011920929 0.800000011920929 0.899999976158142 0.899999976158142 0.899999976158142 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 11 0 obj <</Length 65536>>stream +%AI24_ZStandard_Data(�/��X��A��'�Dh��1�/�A��D�0� <�����\�T����"���� +� + ��u9��_r�E���-�0ٻf���Qo�g:������2F�B��P�e����ɾW����=KL.���Ҵa�ҴeZ�L�� ���q������l�Q�����=���o������>p�F/����9�!`�4m��i�5�]{�Ӡ��GM�R��ԨN5���|���o�;��7��m�s�;ݚo�y��8�C.�&?9�S��������=���N�����hO���ǽ�y��^���^���^��o���}�������������� r���� �"8�$X�&x�(��:�!{�_�a(�cH�eh�g��i��-r��������(�")��)�"*�����>z�7�c8��8�c9��9�c:jr���G~$H��H�$I��I�$J�$��]�^��`�b9�dY�fy�h����&7�陟 ��)��I��i�������}�������x�'y��y�'z��F7�юz臂h��舒h��艢h��t�<���~)�����)�����)��)�~��vt�MO�<O�,O�O���ļ����'j��i�&i�fh��grS�hy�e9�a����eJ�dI�$Hz$'5���8����}�#*�"6����]�"������ ����vp�)�}��L��Ў����rT�!G������7&�"�鈞f��Q�!��䧷��K?�{�P~�\�?M#I�d:b�9��9�}EQ1p�!��������'~a�P��F���&/E�w�Q��P}�����z���i�XI�bX�%�y��R���t��)��(y�'y�&i�%Y�%I�$I�#)�"�!� ���鑝�$'9��Mj2����s4�r$GrGq�p�o�Fo�#��G=�b*��)�b)�")�b(�"(~�'zb���-j1 �;C3,C2C1C0�B/�!w�C� +�� � ��� z`9�A �����������y_�0��/�P��L��HO�B�>��=���g7{��.�����^�w�S��$y�A�q��o����>���]nr�[��������N5�M]jR�zԢ5�?�iOw����0��x�3���X�Z�W��"��[v��[f�@��� +����[����ʾg�6���i���v�]3}W�h32�z��V��c�{Tۺ�jΟ�?����ˑOmf��W�@ه�E���U,��0ra8����/���yE��,�y�����v�1To�Z([d��N�����Q~î���Ɉە[d����M�z/���۪^n�7��m���ޘ>ݙ\���2u�w�x���3�z}���y�g����ǝ ��]8��]Q-���7��*��t��3w�*?�m��z����V�%w�T˺k;�5�^�n��~^�Wu���s������pg��r�~��l�������C0e�۲0�E�o�� �!����X��Up7�V�����}�:��0����������u�,{w�Y�H��p.��\P�D�c�U~���������(n��;�ĺ��Mu�_��S��m��{b[�[�+���p�rH��5�;����u�������/U�������jU��Z]��߽������_.��[������ο�۶|���ս~��m[�ˍ����2�C�.��~���זg�?w�J��1��X���0�=����^խ���ֿ���]�u�^��Q^�To�~?���zT��Wy��^�Z�W��^��am��{�a�����Z/�oQk�����8�g�v�t~~�V�[]�e=��To��Nne�}˒��w��_Ձc�]���~�_�n��fR�.�;ۆ���[-�d_t�0���Zc��~�<�n�m��`8�|�|�[����m�j +��!��U���Ukg��ߎ>֛���������2��\���{g`�<��98��C������APs��0ә�m�p���i���C��z��z�� ��A���.B��oGp��1Ǥw��Ȭ20�Z�����M�۪|i +��ܰ�E�����k#�/��g�������'M��YX3f�(�W�5c����00��s���w_�=4ҿ�&������GO�!�z9 ��Gܻs�=`���qP����}���ϫ�|h��$���6�C9��ɸ�]�0���b�d���V�����:���g�0�Ed��γy�ں���aYīVYd�rø������kú��4�}!w6����mS�w!Y�z�i�Z�k �g����z��,"�/��P�[f����K�:�^�j�w`f��.lʲG��3���B��a�������3�kj��#�B0��.�|���=侰C2�ۡE��4����Z� �g"f`�!��uH����e�\n���,�hey ��a{G��y�������[F�r� +v!r+��,�ݹ m�Xd�w��N0j�d��]�E�p�m��BN�Y�[���I��ۆi������Y~��%�"�W��m�2�u�?�, u�-�%����,f:����pIY�:�� �ެ��WV��[0�n�/C��I�������K�i��8�W���h����M���+��#�e�;�L1�<}ށ0�?�؞U���ZHϋ� +0�-������h��k��!B@u�����r^PQ�r�JN8n��n|Pb⍎P)=8A��G7��<,(�[�L���Ε�ŁCcX:CSP8�������&��5=��Kuh�������G<�8:m��Z2�"`imc9Z%��]�&�.�V{���%������!p�����n�)d��b�� `'P���c���q��Vh��N#�#d�&� {d��Q������]ɰY��}!%���4���,2I�~��O��~Y�+���y����{��L^��%g��k6�����m�Q�g������fo��|��ٻ�q��xYe\zv�5��̻m*{�L��V9{� +�L�2��3����~Z̯g/����Z��֯��,j��T��ܲ�����g�v}O��*������W�������~u{� X� +~�B�0��>�^��./���/���W(��5�z�?��/�^d��.��+��3�����6s)�O���������Uk'�W�/$믚V�C����}!u���W���lR�m�X�� ��� �d�ۺ����)nY���5���}�����0�uWջ~��d����Z��W ���K�o�a�5�!Nv!3���A���Щ�@&�uב�M�ߏҳ�}���N�i~![~�~��BvuJ�:$u����_d��#����,�����4>� +�Q홑������7u��xm��;� '���7�^�_��.'�߳�J�7��c��.'�p��.{z����V�99nO�����m��Û�7h���T?�b@�a��b��Z��Eq��ׅQ��[ls�,�8��ǐ��Yf�؝����fN��6�υW����q̿P��V�,w���Wc��1�}�^~�1���ܮ��_2�_�~��|x�n�c?Jf�wK|z����v�؏ZɟK����v>� ��~�=���9��V���p,�P�{����rc�̱���̥R�����.���ָ֫M��uS���=q��*f��B������p�>���Wq����|kݨ#Ь�@g�N��]Q �+�x}A]&�e��l���`3=;�?�P��6�� +ծ�v^?^>�@���o��\H�"�/�t]o�亯�B�'������~����Efr��.�� +�2K^[.��ژ �9U@X�p'���z�L��sˢ��B��|�v^]�A2���ξ�}��%=jM��|y����7�/�� ?@]כ+U��]�Đ��� +��{��4`n�6�CcX�)����T�-�����mWr���9�3����q���uޞ'f{����ܾ"-gl�U���������l���+�_��0*[��B��V+g��k��Y��'[�^��r�6����B�/˻��ϫ�m��}!-'�0��1�M����ϴ�y�O�;E����^�l��a�nouȅ:�W�֯<�`�u7�)��_ֳP��ۓ�5@���K�0�ob "�nK�:��w��*G̯S��y��ۮPy� ���������[�x=��¯��"��7 �����E�1�ð�~����@��,��=��ch7����B<����}����oz��}��-�Ϙ���[�O��z�[���� ��'۵9�"���.�= �Q�/��C��W�!�|!_!�ij�"�BL�z�+C�ZÕCƐ� )�=�x�:�7סF�R�P{��)�V���"d�݃�l�!'�������Y�^��!��'���aO���� +�A���o�{GCɌ�ɗֺ�e6�l5��d� +�,@���Z</"�W�42���8�5*9�� ��A� ��>\�.X�l�g�vne���L��C���ow��Ӑ����,2w��.�%�����#�:u#��b~���|��e�cY{Ի��)��~��?��.�z���f�������L�w�����Em~��ۺ�ξOez_H����B�^]d�GƘ�63����U�f�I�����3m�:��Ⱦ�����6Sv0T� �:~���v��[f������@�+5�Z�{Pb `��)RqT���L�ш��ge� @Z4;��P��(/����s�ӡ�{{#����l�ޝ���tֽo��8�`�1�]� ��l�]_�<C�wNc�mS��>��e���ܾ�6�v2 �x/.�]��G�ȰLg���O�3ƀՍ��\d���3ȳ0�}E]��l+�/�{d�g?���tY$����G�9.�Y�J��i�-��S)N�Y�A�V^Kj�A�Q�m�u��mו��"���ۦ�!�� &��>I��g�a�cIR�16� +�&�; �YC�3L���Lc+)5�9��Z�t�[���þ�'���t��O������9�up����7z����\uí9�q2�ݸՂ:��ֺ�2�(���A%��S�Q>[��ް +��t���* oiE�G�&��kf˕ҫ�&f +�Ӌ%�\>ɧoR'ߴ!V +nj''}��E +�10 �úM�vj�+A��m:�ú.E��R�.EJ�%u2b�zb�:^P�7x���7x��:j�������M9�`�,�4�^�H�MD�'B)����5O�R��D +�O�2w"�øF��a��)�����̧cV@����/ �n"�ܢ��06��v�ԡ,^���ɬ�#�ൂE������6��ʪ�D}Td�⋬���.~J�mLЍ%p8��p�3ql��ʐ���L��x�N�G66�4I +�D��r'�A���k����h��W`�,��@GQ��UI��U>��DM�d@��&h��� K"���S9���$p��^ � 8 � ]p!� c��̊�YDF%P��%Oŝ. +8bx���ԃ��!��E!�Z�J�� + @��c�!�AA"4��8��Pbx���i����8�wc�hGAW�&�+�T�]�@� +��P�v&�t�"0��u�+�dv$\4�١o��BĦ�k��q+$�z�Tkd����f(/�ްW�MJ&R�͐3S:S �&��I�O�|R93�_,��gB83�7�[D6lD��&����H$�7�E�L��S��N�ԉ�ɀ�9���N9;�8��R�D�ՏH�(ݜt�.EJ����%u��NC�(���,���,�H"��U!�%3X���� ^3���`��x$X���{��N@�������M�i�&��� +����D��7� V� V�1 +6E(�tW�D +4O�Q��;�1-�:��l���`��M��02\:x����M�t�Q���K_� +\��=�f����4��qQ\�Y�.(� CT��pɝdn"pfJ[T�ť �'�C���)��E�E*�Y[�J��L�ã���7�%�����+0�&��~8�<q���a*k駉C�\Y|�T�щf�+���I�-Q�.(�a���E��ذ��tU�Ɇ5���'��4fQ�;~��բ�K���H�8���3݉u� �(���*H�>ЅĿ$���� Ì%���+A�8 ����jI�Ɔa�i���8�6LS`�K�_4E�W�L��5ql؉������D��x�,zK0XtG)M'糝~Օ2\�llX������� ���`����ֹ��j6 ��҉ãq|@^�[2�l t�uDIDذ��q��SO��"���*�] +��� +�� +U��V&��;�1��*rB d�ǂ�*r�����G� ��U�r6��7,�U�]�LBt�P=9=����`���!=��A)���k:=|��|J檰6�51IE(�!G$,�^=���8����He:�"tZ�e��D3zQӱ`�I�"u�3@� 3Y��aM��@Xh!���@��f�9ږ���S�x]�>'wx��҄:J��7�n��f��g��O@w�0����do� 2��P��"v���3-ׄaz�E(��a�.!��E,���� +�<��_?�a\����V�IX�� ˳�`uG�_�f#�&;"�gh��EX�����D(J�]��Q�BE;@6 �����Pq�>�Y?��m�����k� �s�ȷ~N#��a +/�{��4"��8TQް �+�R +!1誨Pt"-��w�� ��7l4���ᨄ/�%��b�!�5r(�Om$\Zb�2�Ӌ�&�l��3ql�Π7�$X]!��g��1�t4�&]I�0R��iyJ>by�Y��`)4NR���atAC*�i0B�%,6��n0�I�� r&lX�D1p%,@��`aĠd �s��� ��x����R ��� �j��`�S ��!�wf$�'�Ȉ$�Ho�ɹ4��J�%a#IqN ��h~x� R�a2s)@h�>��o� m"M��a��u%�����H�j�a�� +e�� ;x�՟E�����P���x�OFo� e%�#V�,��i�`�3z�J��+H����jV�M"#TШcm�I�zA�6(w�4���[�P�dX�������v����B ��6@ѩ���/��tآ� CT� �?� �Df��d�6ӑ�`�$4�^o�kc�hH��@:��#83|��a��`�e��6�k�:��$��_������A��b���Y�q,:n����|R'����܆�D��0�O�$XM0PIE�'}s��)i��P�DnX�*=��b�-�J��:�`�| 9]r��Mo���Z�>��4��%7��+�o��%��ɱ� k:�f�ٙ��l�^�� +\�р.{�i@��4��p���x��H"�[@@u���%�N����\V��>���Ѕ�ġ�!�ea�м�o?��4c��Mu*�Ia���§�>���X}�^��a���/X#s��0L�}P�f#�Z���\in�bg� "c������Ć�L�L�'X,��q1�8%�N{���Vm�4D�h# +�q�]h���0���&D�[Y�$-�pl�ό��I�O����>]�Ӟ�ce�lX��T��c���(C�2������s�7��0�j�ʀA��t�c��-CM�jJ|9�,�߹&s�ġ�FD39�C+�~�H��9�L�C;yޒ��� �\ ���!�.<�!R�ɞ�!� + R�v�U�Y1!-���qL�y���/�U�"�Аv�<��u��]���kE"�X�`�)j7�t�@��6���@�7�|H�$ݮ�7I# ����P��Q�8".{�$7�>��\^!\��W�K*#�g@6�����B� `�\k�3��:�ݰ�d�pY���@�1 +&atp�6� CY���r�t"���?�#���j�$cm�n�6�A�$�������xɂ�S!c�c��v���l�{nԇ���S�#\ ���� ۰ ۰ �l��SP��q��Cˀ����Ɔ�F��A�DG�{���U����-d�j�X��h�*��mT��h�X��߆m�߰ S�}ô��oأ�a�:Y�rW���L �\u�f$���>P":v�A9�ѦH6�`��N-"Ь�XfJZG�P��i_�X�iZJGԭ�P�a��˴\��/bw��ȯ�/6�҉P��0W?C$�@UτS�@�a��FR� +�)5ณLb�o�r� S}�+�KbA`L�#0��1� �a(��U8��u +,�sR��$�* +szp*"���|ʙn<(����)��q͕�E� ��)��U*�Tf�\�Ja��K�x}ө�dC�x*��@؏�a�AW��@�jh��0�L�d@��lJ/���z�6�@�l#1�P6�!/D1s�b�*[�F*�Ldc6� ��n��Ş�H4��>�Q��s�ʰ���� `ٝ)����o�`"W��0!��84N�zh& �"B4����6ʡĮ����s7��������[�.�EI�p�����{qR)l�@�l� C��w7 �5�R�]*97��F&��6�qɜ6�'v��fe����k�8���y"� ��f�&�rn���Mf���eUC[��S�+��X\�J{�H��DV�ܙ�*X�i�S�iH�uEG6�G=�O� ;�)�3|�ӴJ�T&� ��c����B��)�S�Z`h����A�!˱��e$ԁ�iP����:.�T��Ā�s� �&Ê�N�Gq"uz��o؋E�N�8 ��|7V� +M�ȞԹa�"3*��<Li�[����U~"m���t \I@���Wd�1q,����c� ],���=N�$�����۳���m�r���cA�i:�Ip������`�/��Z� +J���i����34I���NB�I'!(�-q�8����l��?��C9� +�rh����m8�ne�t����ӎJV%�,|:�c���F��sRq�A1��1���BcZ�X$��џ�2k �fî`\U�`"��+0 ���������&= +���}Oy ��c�������G�a���$�����<���F�eh˙�y�V��V��4����z������~a��)�z�<%�͔va#8P�D�hm8����B4���ݯ�l�g,0h�K��y��3-���S����]��2�J���C�(��{{����*�w�*çS������a��UQ��i7h8@Ę�N��pC���O�B���߰����'��J��,(S]Q��ȥ�Ze��i#PH4� ���X��Bj�EPP6�|+s�&�x�4�FX�Сa�N�A��b��6>�2�5 �"b}JO�|�� +8R�Q��%����8��E"~[���BtvM����B��E��R�hA �gTp')f���y1��ޅ�.������:2s��T@��ի�u�M���_��*W���>8�2� �;ߤ�Y0|g� ZsX�aݜ�n������S��R".ť�#�2I$dcwy8|�A�R!E�7l�/ Sz�`6��J;��؆Y��y(Ptt�P�["� ':'��LN�+љ��u0X��J���X�Ni��=�#�ƾ6�`#.���`�E��Ņ��*K(q�zW +����%�'A���C=���UQs2�㕊#Y����A��8�=6�8m�"��G!�a-!�PN7,N +%o��>�2��M����?-ɀC�Ir#Q�h�oD���^�����0���g�RGuP�WB������@i\p�?0�C�UT���2��S�p�t;)VEn8��� {��(�7���R���|R;�L�i�He���O���="PpM��|I�oڋ��] �(1�H��t���V�)]RM-![�Y���Ȍ��m*�P�"q����`�h�E���Q[Іy"��^w/̦`�kذfcZ��,"�)3Ae>E�/����3�Jn"�ܢJl�y�-Ճ�/��ʪ���Y\eSE'YGwq�a����.~�VA{�@PH -?��(�]R:�?R~"4REg�8œs�B�PC�0��������q�"/����<�E���u�7���ՠ!���}^��I�̔�83e�6�Db0��W�+A��N�u���n�Sz���4����%u�F��K�����}Ǚ ��&K�G��#u"")Z�V+���P +₽�(�ċ���=J/���9D��s����L�(�."���Z�)���^�8.6�|>��]\.��Y%+�.(��b�fR�)��� =&���,�Ƅ��,�x�a����.�g��G =@J]@���L@��(��m؆mj�6l�6l�0!�BV>�Ѩ���&*%3�̀���4���0 �&��6��<>"FBL2* 0&�G"�8 ��qbE��dP9gcBЭ]I|�Qń`��H��]�-���Zgh�Ʀ��8�2՚E�8����ġ$v?Y"k�a.eɳTc�������8xE�zf�/�: �S���mV�k� �,MVF{�f�\XY�yj�����y���Q�ҩl��)hf��z�7�?G��A4ti�d�`�/���1OG�Z�<G���y Q�7�&�V3��&$����NL��.!=1R�@�]��V���}y�� "O����j��{��]�<�)��+br?���0^"��d��5l������y��&�Eo�F�q]��|�k7m���+(� ���}CW�4,�)dD�F���UQ�3�QDD�!��9Z%�s� +U ����1ھ������ch,�v��E��g�h���]�ĺs�;�|e��� +v���$ż�j�v6����1�ͷ:up�j�l�� ��e;�7���k�qA]��|�� !�I⛔f��Ejka:��<r������/��; �l�Qc_F��lx�֠��m��w^��V���"�)z�oLG"V��u|&��-W��#m������`L�:�s��"�B܅J��Tg�eY�&��Z~wL��1�t�W������M�HB6�*/9�e����`p_%�Ki�t��$/�O�ZXda`��ci +E����n��6V?�'�0k3�/�B��j#j�Y��q/B)m���F�vP���SD�M<C�Li1$��G~#]2�I;fiV�Y����VR#����w�^��D`[�E��U�w/mN�E��[Ȣ� +�k +(��B�� +��r[v�h�P���mr�=i�Y�F7u=��1P��A��Jj��6���k���m�B<��Rv�q�z��mY;�n���yq�`d�~OeWϜH� +�2��Rʫ�8�����Q�����W�zm�T�s��I:b���3���WI�̡�s6��⡿�C_KOk|l��R�#���L���C��3C>&��d�C��~��/D���0Cnn��q��k��'���l�:����������j�q�4�"��b�,D��Jq�Վו��Ұ��#p A��{��i�����\p��OQC��构*(�ݥ!YӸ��e�T�����@J���ըlT�O_�C��œ*�����1�TS�ʐ,���AY�y"�yVc��3�m��Uk8j5�Sɾ��(�/ºF��\2�L���m�^�z�#1���k��4�+ W���,}!c�v��⎊�2���F�V��;첳JE Y�WL�?��覆g��!F��}Zj=;�+����7� +�4��촾3]�j�#D}mQ�b��Bs6���$z:-��� kt +��?�+�.��x�Z:*��",+���sʋJ�`� +�� �B �������a�����Z�}?$z�p�"[P��M�!*}L��֎Z�1:#L>��-��)����J>����օ����Rtq4Rt�Î�&IfG's<:E�m�z�����fэ��ы�7?���e�F ;��=Z���Ƒmb +����2�;����p��% @�m|��A,<j�k�u�H��G�{�ӛl�3�s������M�rZШ����r�x([}���2�<R��Ӕt�6�4�8R�q�Ar�_�X�u�i"�d~�%���0&�`�?�(x���Y=XYKq���&yY<�G�ɖ�v���z�w3��;�ɪg��� �$H��U�s�yC??$����7��rț�*؛[e���=�n��!�S���Kqo�1�B\�lY�xڹ ���sm8�]~��o�e�"UB��ɨ5�Lq{?���kIq��)�L;�)���j*&4ՓM2/s�s����Ģ�����<���u��q�n�Q����O��o=r!v_��8t�>��-&4��`��tm��ä���sx��I��ȱR�ܞ�E����:���_���2����m��'�]��v��B 'l]����E�X4֫�FK����-�d���(����������L��� v�j�9�:���L,:�-r��l/ݥQ�Q�~Bv#�FVO��_��D����pR��m�Ѕ*�0��1��U�f�SN�W<)s���El�10gu��8�����|W!�c��.�{%l��?6���0 ���DCH�˨����ܥ��d����'*k��0� [�71C'���u�Z���4�7[1Tc�7��/n<z�q�ɰ��KV+<�֟ +#�Y��B��;�=l��e-6�[qg�B�4F����9O��xX@!D�^-~�1B�`;,���V>�X�1�&>xd���f&����m&F�v2�>�P�Ll��e��ߌeL�$ٽ��#��.r�P���c��Q��k[n 5��n���U����n8 +�w ��,�@um�L��G��C�QG������P�zU���%,"{X��$�E��H�������'H �'dv����i��������o�K����\�7�bf��(�~�q�ϱ�`�n��N0<B �A]����z��o���ݿ���-��r +���G�Bh �O��q^�V���w#t�!��m���+ q���+a[��u�{z=���Ni��k�5����t +A�����s�cB͜ �ٜ��P�O�C����k����t�n����> _I@�}xbWj��T��kC��I�օ���C�À��}�Z�~M�q��Bп`�^�����.���͘��1$T�3:����!?��^x�S�������V!�tX��5�w��h-z��<��3'*�m��? �(8�ΐ��_�';Uh|X���č�}u ᨏ`m4���ّ��.���-���O��)��.��T�쿇ݤY8e�L�f-f�ë��뮠��<\_u��\|j�8�.�N��_��O3IV~���\���X%˝+�(א�3?�� ��-zs�W�N�;��hy%�6R��bGJ�O�+B��la�9C��a��4��\0����l݁�sG�q��M[�Ê��(�!���v��P�>fJb�P�J����c�0��վЃd��6�8��Lى�pwǎYKX����7>�=��(��\b{�d���]<����!�Z!�ѯ���x������%T��Qm`Zɒ�x���*����_J�T#��;�]��2����?���F��k�̾��D�Ug����a�E�ΉK�黮{�*�^ �{��|����֬��!�ձ�θ��\r�)�n��T�m���$3H��%��96�T1:]�� �qu�;BaR���&�Ԅ]���FI�(;�����M�Ѻz�G84ddq��][\Ae�1�����u�H����Op饲R$�r�Nh�C��b��i�4uwQ3���д?ӵ�<�f�ש#G<ۥ37%�t_��yW#����o��v��V�*�'�5�C,b���l���u�Ҕu��>��A�D]�3l��we^u��{���u!�тv�Rݦ<P��Fd���h�L��b4� |[�u���+�h�u���d�{~�u� +ㄓ?�r揙f���x Żd +�V�Ԩ�:c�2*�ޫ)wXX6�]���J==�E"�Mr+���W�DVT�2iڢX�ő��x�c�Պ�Dl��W���y��`�|SU���bk�["i�-������C�*6o���rkݾ���U5S���֥�O7�0�Pk(�j +2��\'��%)`O�;�[�uon�%����-���Θ?Xl��% �e7��,�_� �͘�f�c��L���!B�b C�N�^5 +ȓ�y�t��ï�齟S����n�[����ⱃ3�-��MR�,��R�BJ�֏��ZH��һ�D �bLi_��W%�E�t0���2���Mj�� �q�j���5����'=U�1�T��w��:�3�E��X�e��7���Q����O]�on��ʥ��cRf��{ꂂ��? ��.t,�j�^(u 8J�sL֭� +��(q��6"Z�~b��@�LE)uYC��I�9�u� +�%M����)Η�^�Y.ڹDg\�\�6�����ZT�e���_=b�z�XAd���pWP0$�%����i�dv� ���~�egܽ͏^�l��B>�"�hτ^�k�u�v�� +�Q-ߝ�GwA���t��ubs�v�9|4u����蠆�o6�8Yr�D�a�+8�-�.�� +z�JW���oJ�!������s�P��֧shDN^m����_�,���Ė��u��F�@\5"m~�,��ƞ�zk|�\��>צ�t���+��f[��ǎݼ�oP",!��Q��2k�0��gy��Ú�����W9����A�~.�_����t�0�5�"w>��\�YNZ�A]A�,�j�J�[�(F�Ƽ&Z�ȹ��~�<F����3�9ģb@��:�����\~ɸoK����\^���rݣD0Ka�{���X�$�)�!W���q����'�=�2��v���B�<�ȌKH�}/F�d6������.�_��(f'rʼnmJ��pe�nx���C�e�%>��������Ɖ�`�i#R�e�W�ږ1�@8�����f�H�M�&����8�~�4x<˷%��7�YV���Z<���h��)<�z�I�{��Q`{U�/��)�M;��E4�x�>b�A�����;IzX;���Σ���u^ �����t��z���1���\)�Z�H*��\�|��U��V0��:'��f&��(��3ٔ������{J{�@~�2�SC � � 9Y����V�r#���S4�R��̯{�2V &���M;L�%������@�ʂ�A����a0��A��H���^>�r+&Wyz�)�X�xn�Z�#���*���^bk�hv_.�����[�2Ѹ�6�ֳ�@�[.�j�8J*�nvJ���z�'�ܢ�e�� q��iMR�i��-�MSE]2*�"����1��Ӥe�[�3��h�r�~�2s�ݱ���3����ry�Cyh��6z��Z�,~���K`�,+0}�_r��,�'BWk��*�!E5�DA��RDm�N#>)6�Ж�>����y��>�U����[�dnQ��^&h���ٞ���E�Hә��4�v&�>5R��4)}��}�-�~��h���Z��Z����-�q01~�v��j� +�@��iM�J�F�����@[����A��N���� ��`�۞"�m٭^�UmK� �1i���NzR!�7�uM���.���Q��08 +-*�V_�霈=9�� �Y?l�qSI��z7�@ӗZD&Z<�H���*�3��E`�$��}D%�2��^U`�6�dTv$Cx���D�B�;�����l�Y�~��~0T�-y�g��#3���-��x��,�S�̨=K�B�b���8�Q����a���+\(�al��VÚ��u�^�N�ŧ��z�I�.�[�Xpt��[���Ғ�64��_��UcI4X�s"��0�h��^b�|ˎy�N=��k�O�w4�#�����t�;��`��@T":�ց���2;)p��n���q�1�u�$�g�<��? �}m���*�ӭx��'?_u�dD�Y*�z`]�Ƅ��V���N�#f����r��f\u�Fh��S�f;Юy#�m��!h��Lꊥ�-ˀN96�nޮ�2����� 9"�"������Kæ�p8Yw�L��:�FN�?ψ�zJj�^�F�����IE�a�3�GշK�H�@�E@պ��ڙn���-�6�k_�ǔ�&l,��C�j�zCP����?R� �g��%�5�x��Kʨ"����B��:?��\`������E�U7�[F{��zuvA + �Y�G_�Zr%z����'�]$��-�s�7?>$�<J�Bg�p���5Q� ��&�ۊ2��)s��E.�B�~ɚ�R��u`����P�*!oa��8�H�T�/w�/*��~p���R�r���li�ۤ�L�8������QF*�'��A�%3l +�%��{G���9����M�J�=�>��B��v��z�T˜ɣ�r/0���.�,oԫ�8�Kh�F�c�`nRL�z��*�o�'�v��%�;'+����pu��|���ڛ�-� +1�8ggF�0T��z]��t�A�����՟�W��E�8w�]�t<�ʺh����d��t��< +�ʼn���[u�Ź*?���W�o��PC}�^v��C~�~����"�:R��_�&�A�����u��B�Du��N��F�g��M�q^ܽǛ�:Wyg�Ã�����p�����[ ����a�9�+����Df�0B�6㩡�`^���c +��6{x�їu��M��R��꼐��zm��&� ���{�9�?�I��Y�gm�n�N+�����+S�H�,�c:�#no>I�$h�S��*b����W[� b�1����-�8ۭ$�y�wk��H��m+T�ќry�:��@���/Z�}��_��ܚ� �B��*R��l�3�e�T�s@G~�BյD���ρyh.s���3SЌ�b�@�X�����~��ץ~i=��ي�B�rg>���k/��KM��L�n���dEE�v���2�Q����O�(�U�(�\�+��Y|��ͬ����XB�?�Jh.O���X���|�gnu ������dB3r?3��B������"Cs�䘵z��f�|f���G���t-�м��,��мm�_T�9�B�������Օ84_^榍�.�e�3�-�f�Ϭ��PM2`�bA7X7��&c���At��i�ό�/ ��L.�d���������Y n����'ߐ�l�IN;�W������Wh|��uW����df~d��X·�>`1��ސi):�fc�� ��8�U��mwS�o��#~�[���E�����.yX1���lB��|��0D?�n����P�#�����ژ:�=�����$+ o�8��.#.�e�u��5����w��z&����q�9R35I��ArJ�M��W%]�> ��avB��/D?vK-��Q6��R@�A�cI�цsӳ�;0�G����=�r���*���t BP�t��E<7M?h�X�:��s�m�9Nx^��)N��)X���/�d�6U�M�ҥ�v�XW 5��=d>��7rH��̼b㶌��&"k�(^�[[�k %�;�ݑfM�iލb�6�͞qL���8��Ν�1�����á1V�VO&�_<���@�m i11e�K��TViܾi�*�&�ғ�Ms����/,i�+^�g��/��C����ϒ��5",g�}�I�S�"!$�1�G����H��T^���OzN%���ϩ�Fgg���x�fE�?�9u�NЭ�pPH\88U�NS�}_���D��Wʥl��!�ɉ"�d-�>ltE��-2j�L�\v#��&U�vQDs�����yyrŽ��H�pJv��6Q����z��ٓ����zY�R �!euF�{ۃ-�uS�f⺖H +HuNFv�|*��`.�x9��3�l2")eq�|�jy� +����%#mo>k�ț�����.e,�FMڟh�c����~I��! �6����c���LG�������\���]3)�����������:1�!$p�tb�G&,j,���`�"������$�K��3'��V}�Q��yzv�*o+��+��>�1/���g����2>�e嘕�F�3c��E�銱��X�]������ҁ��5P���� �_�94�"h�|Ɛ��J��9w���ֵTd��;p@�����6�d d�3��2%�2?��l�(5�qW��1���8���IP����PO���\U �Cۋ�XZ���/�b�i�M���`�k]�$���J�"�B�F,v��!�9tt��H������Wd�y��1����+�,�O�kߋ��}��܃��E��,�+LF�0�Ux��Е�A&�̖�|�X���X"^o�ťr�����Sž�Ks���Nj�(����Hç@9�k��g~o��a*B���q�/?r4S�>b6-l Z�h���7X¿6�j[ +��u��ဥC��͈�(��H +/�V^�Y���jr�Bw��r�q�J!@�*�n�J�+D��"�}�~���zI�M��[h_ir���_����o�^f��J[�X'�e�a��0����p���Z�{q����p�@R1YvB���k(R�� D�EK�[M9�J.�y��17��-6�F�R5c��D���}n~5$��/�X�eɃ3�j~���Qh$]�Y~"�37��= +��:�]O��G��-c\�������Sڋÿ5��i�3s��E�Ez Ʌ����g2J��v9ݖQ�i.Q���u�`TP����� �۶�I�A�����k@�4�x8�7wl�Ʃ#��1M&��_���=$�)�Q@�76e����y�*�>&�+C~' =��L�2��_�_���KQz�v�����Θ{��oR`FxӦ~JU'I�)���,?��0P����}��ʾta %���UA�bF�X����+;O>���h�ѡo�(z ++�f�𞊧y��k6��$��l�C仌|��#tڰҧ� +�j���ަ��y�Z��8<N�V��>��窴jR��g� [�|c�`���.?��t� �'��#�`_so�B�~!|�S*^v3%��>��E�e'�0(BjV���S�������@)&�zؔ��7�#&���{bU,ՈӖ^��T��ڔ��ӈgKlRh���?\h��jijbY��oc�<����.�kh�� .4ω8,�]��Ύϯ��'����lG,��.~�a,3zx?�,5����#è����������R*Cy�.�HtAi�9��r}�\%�L�{X~�Wr� +�J��J�nH�B�J��%���ۛ���0ٴ +���� i4��W�|�<��TP���0&�20s��'���Ԉh5S��f��#��FT1Q�d�!x��c%�V�q�%�լ�$E�r�~��<%/e��T��&ޭkqpM�Їɪ*DA)�p��q�^�"��bK59Y�Ea�08�'%p��y�ơ]�῏96dY�keG��2 X]�N��b�L�����V�<̔��e'Y�Ⱦ��\ ED�s1�S�"ioa��0_�(�8p0沼q +u��C'}t&.�L}�����R��v�\�^J�,�u�&�^2���������]c�X����_���/,~�����|ٮY�3�L�x�����|Bs3X��*pԮ�t�����p�����@����^U��i��%�j���j���#�ꘫO;��,<��5 <��z��#�m��N�VL��S{/�D�ޏ ������8y��x%�� ƒ(��a�����cc#���%���.�q�����a�[���!��,�|O�V�a4�Jiã�ԢH!͖y\���yx��gv�`���J���:G_S9;���x)�HJ��w�-��W����ݖ�0�s +K�CW$X!�� +�@�I������g�B�©!��5o:?!�K�r����/����צ�^2*l^��c(70X�I$E� +��,���a�_��� a�������a�!Y�\�c��_����:��7�ȫaJ!���jP,3_��8���"����ٺ�3Z2v��j� ��q�)������]1bI@���1�/�f�����v����)J�7�a���1G��"(���<%<?M�>�L�FHG+� �;�+�f�,��?n�IL�Nk@Eʩ���D���P�cG|;V�9�$]��D3B�7�S��~�X`x��`���?�^�x��H34�@z{T����F͌���i�ё��TS;3���45��w���\��?.;]���0����eޜ+��t������n|�%F'?�ǥA@:��>%?08 �ꀆ��w�??�{������b��-�*kx�A@Ԁ�FᏒ�����}�T:^t���l�}���z� +4���\E���_>*G����hjF2���J!�)y�F\�t���V2��A� "��<�� @��0�脆cDܒ�>B�G +�R��M�ef �^��t��obg��w��y6�A�/�K�cu��o@(5u]��7�N�K�.V�cD�h0lDŽLBN��ܥȺ��n�;iV�Z����Y��l]D�K�2�E��s���� ��(N�9myf� � +jb\�5����P�����������jz?\��������S��:&گg�n+p�~�w(2s�f_;��A�i�oē���&�;��2V���VP �L�����yq�t7�����TM�[��-�X{L��Sf4%A��� �Ǔڱ�T���ن����)���'�vW +ג���e�)�"_�:�����t l���g�6���$X,`5�!�Jxfɵ&�2���/��A�F�T����C��M&�)9��;�6���R[���_qE��H>����=��hs�rM����e05b���\r�X��i!�Q�t=h ��ή�`��Q��W��~ّ�\J���ɇ�����F����emQ1t��^����� {tP!���}QDR�Ϩ��"��V�K�Ԅ$���%�D�m؞�O}E�M���'qz~�T?�%��U����f~�4=���YZH�� �t���D�5�F���.ٌ����w�BO� �����"���cL_'���d���#�yJ��Xn��?���?�!�o��[��ڀ KV�#���52祈�L"e�c�r��zF�.��71P�a>,V�&��7�����-��I��[j�g;NB*���Vᯑ�a�2�o�n�;���D�5��B�|�}L�Bt�J��ғ��J˙��WB�o7��fTs�Nc��$��*�*6V4g�.ʌU��K�[�E�&��>�ߜ�ܰ5V�;`j��l����vJ��MI�W�(��ن�PD�L�؟��7|��9����h^K�� +]�ɠ�6y��� 4C���[�oF���`����9;6�"�"lU��߈�o9*\��n�hc�\8R�'��).�Th�)��W�U��p�� �������ٽ3�8�AZןj�>�V.'�Й��e��K5����}d��X�"H-&r�h�}д��Ԥ�q�{1��VM�sq~_��PI���ksd���-T���I1G@�⭌H��]��b���;��@����瓨��~h-uC/�#�{��WL,l���ǝE�] �9�?���zl�����a����!��<i��]ٲ +T2@�R�<o)���¸�AbO���D�l"�̤�:��Cx˵��e��:kv������&����<��\��47�o�M����~n��7�)P�5����0���iXitu���#�9�_��v> j��*5zVߺ�0*ދ7��m�����$aN9�T&��C�:3�("66�(fn�q��UJ_�%�&�H�[o��&����m�a�"|��tF>yD���uI�8�r�mo�6�L��� ++MJ|/N�`��FFk�<я������"�\�:6�Z�ڦ�����v�U1����5����ڀ�I�+��|blډ�2�ɺ�#g���㕝��n;�LJ�I��p~]�9�u{Z�gz_�ȕ!�����cY�[���%�*L��J��,�^�ggݛv�e�g�:y�[��}<ڡJq���+�ӫ_�;�f2��6 �v=��|:�A��?� Ps0�6M�Ү���N6A��d����A�E�_^,�qr���Vl�B�@�HáM+GgxFA`eY���]�?�Tv�`�1֍Hڜp�͙��H�����+��_̪�lΦ=�jp��gb@���]�f?� �2�j��jNzK�3�8����Z��V�{Fu�o�\y\!�k�|\�|��Dq��Yc +�C��&eF��+�#��uA��-����Q%�C��:P.����aY�:��������Å*9B|t߂�5�xgoLP�)kD��/_=�$��}�డ��x��Y������<��tS��k"%E�V"$)㹃@4�c��M2�ٟ_�·{��gnu[�If��l��_6̿���h��a��D�����֮� (?Eo��D��[��DIyɞ�S��b:.���ɘ)�� 银.��9��T�8�9S $=�y�@}�B�c��4n�s���6^s� =H�dπ���Jp� �T���<0`�hs�[�p��j�; +������15����B��|TB}��:9x�pM��t��U���\���)|:���b���(�>3MZ��*W�Gm�b_Pd-V�֍�a�<����|��ـ�>�U}}#7 @*�-�ByR�3�;�`x��Ѣ�ߪ�-K�pU��?�en���[}�f.����ơH�����i����Ŝdi��7ZL��6S+�sLz +���{H�"�o<��' +3����27�D8̅�D��9e��ޛj�y#:M� .��;��[��BgN�b�\>��MGa�4���������G+�~���ݯ��*ʬ@��W�O�r�����g����lf��.B�=���3f��x|��Y����&[h������p��� +�'����(6�=QҢUeӭRq��~��u�]��m��0%"i�R�?iGZIU�*�uGErB`Of��O�D}�8�*�uW�rڐ���Wy09�����mHphB��W��q}I�yo��=9sA�3���='�M����6�O0�8����ٙ_~p9�:�âi�1K_|JDON��Ŧ����Z9(.6V�N����������(Ӏa�[�7���R@`#��L!!}����s�sǒ����|P��e]a/A�s=�f��"$�}sj1;���dq�E�z�u������cp��+���b�����.���X~��KB�j1Y1��?�!���\T�� �?J��A �ѷoZ�s(_�i���Y� ���Iu���*�K/�+�e��G-������R6��Kp@6��r��,!,�$?Y��*�+S+����Ŵ��2�J�;&����%g��Zy���,g��|��YF��`���Ք�����o��sq@(����[��#��x���H��Xؘ�&�t�R�v�<$��>Z4��e� +.� �n�Sz�Mي� �|^V���e3��\*:���Z�.`:�5H� +�f��S����Fg���A �ٽ�c+-��T��q��5��"V�J�kv?�zp�C�#���� {fL�i\�ho1��^��9��L�4*�+��Vw=�J�������|,��-n��V�D��I$B2<��kcw ��pn�!�u��胣]��qa�[����l#b�'�%���=�}�g +��@��ܴb�0"���+�,��6r��5�A�v����{D�>�y�}��-�[����UUP9�5�K��*��F�qk9��f8'�{���ԏu��MU��^ס��Y��\F �z��h4�w����j�$x��mY�hW��D���+�Q��W�qцf�>��2�ju�-fB-sP���*�[o�Dz�u����V���iQ��[Ї�,T˙�c��u%t��-��^a�T��� �s]t��!�����fk\W��u��c�(W�u�JZnH&H6�x��0�OVк08�HZ� ��n���Yy��%Ɓ�`d4\�6�z�vH+Ә�u��;̘������B�ב��cu���%�"���Xh��nO���9K��"e�CV��/��e~����h,�oW�����������0?�xO���d��ᨦ ��D�M�.FT�/Ug?�=������A\�)C_���3�3�����y< +@��*�<@]���j��m�?��n�@�?���+� +q���U�����k_DU3��yWS�z�j�� ��q��,z��Ru,c�P;QV5x0� ˰d��I +�_>4�0�!��W��u�����h(EF�ňi�)��J)PXw�e"�z�,F�sދ����VZ�_��� +����8�Z�c�ٮ8�|@3�,D_^[�,"��Sj$D�$�M��&�DG�����`��CIw��=�C08Z6����.���[� +�@�j&X2 \#������jrJ�@�,�% �� ; +1��h��BW���E�e����f�R���b�M��7A3����_i�+��FK*�8 �����ɍ����[��;}���@�Lmt��P����|کIJ�p��W�Gg�x�w\"�p���<u��+�M�P7�NF���w�]��J +�H����DEQm��CV�zX)��5�<D&� �|?O+�M�N+I3��.��(У)k�������Y��`���֓6�m��P"Л ed���`���vݻ��f�Ā��(�<�����[ǺmTO���b���L#�A��*V����������ڑG�A��AQr�����EbZKm����� Vwǖ�ТՠX��.�ag�����a�����Q���{��|�Sj²9�X�ȅ(m.��4��j]D�Zi-�P�u4� v+�����O<�v�_Su�셒�>�_�3;D��4��A:�lN�#}g�Y�8��n��������? +0p���D-�>�f�</�� mH~�v$r�������������p��Sv���9_,$K,�z6��k�A��KZ���[��~%\�[(�Ն눳��q��c[�q����j��G��8�S��)V���� +�������T5����Q�X����O�Ćm���k?����-�� +2v�l�-�D*K:`�|h�ڵ��ݣ�M�v'ҝ����d7�M +��tj;��rl�x 3� � �&Ƃ�,X���c��*5����D!���B������ �0J�Ԥ�:��t >����)-�ӑ��Nn4c��@(H.&+z�H�`@B5���q ��4Ԇ�E�BCI�^6L4�|��A��H�!YX0��!�$4< �h�x>������AP�� �����I��(��|l�� H*2K! 4���r0ی:�2� �cC��B`C+��P�#�T4x�dF|���hc�!����a�0��c�e���i��t�,�@(Q`@N� �l�fl|D*l�$RJ�#��6 �Q������#��V>��H�g��9�҃T`rt����X)�4�Ӏ��Ј0A��(��� Z�xJ��,��P.M� AY�h(����Y��C��� +)D��ac�aH�CP� *���c�c)%�!�������a�`�wR��$���EK��P1P�s�YC�!%���5 �ؕO҃J`H +�ʧUF(�C� rN !T�,*�`�b����X�����pr,�r�Al��'8��FBHѤ2p�24BB���r�+ U�<0��CF�F )��f�c���Ȗ :D�DbX <�h"�!#*. +���#��<�#��P�q����|6 +�������a-�9�s6� l0dŅ��g�a�$�Hg: �!@Y�`�����ӰN� +�pq�T�hAY����(9�D��� +���l0a��`�4�aȉѮ|<#��A���G���@�8J.>(@N��:3����E�,l�#R*�T�yq*�P����gMJ�fD,V���OWzx�* р%x+`���@F�F��t�#R���+< ,1* k?6�2��%'*�1�������)J�Ʌh�����8����x@`ȧ��P.7�Dq���*��:l��/dT,����B/�t��@0�����0h�� +��t@*^<᠀��N��PC�DqViAO��U,`���F +�#�a���O�h�����l|8�1��Y@����H�9P�@(F}���t�����tkc�V�p"�s"���' r�%�&��,�0yH<�A�� tlA�<�6KC�i``B�/HP2�!J�W�8�Ш���q���8 "J��H��c"7b�c���T$�\���6 &�]��V> ( �� B�nq@X!/ �!/ .0B81 +�[��(4��,Qv,{�(�Up�t� &"T`�9��O��E�i�������hAâs]:�����8q�`��T�06D�P�Њ�.]��Iqxь:����BB:�� vL���Ͱ �)U�!E���r"ea�J��˘���`��iB&r"%�s��Lp.b&6Z��s'w1jД�d�a�&�9]�h��1!��dXDȰ�|(2Ba���8�!�[ <@>8��,n� �EK���qH�5�JNT�V�p.�aa�j"Ąr�� �������$Ń�6�����i�x�|(2�às��ӵ�~p<X`��sZ(]�i�1����'T ���1� s��Ð �ʧS!��qL����6,E��# kU��Dx@�����$F��I �AA�'%- :��ҷT��Ĥ��h?�1�dh�jX X�G�#D 1���M�)0����E�|�xXF>fa���_�a�ȣ�E�F(�"EŰ����Ⱒ����|� E��3���a��͆!�4,Z6��11Q?��� +3I��n�&^Q�}C +J�](`BdJV��Y�1q� ��ς�����H4���HGȀ�t Z��i�`�ra�a�P��5TG��h�2aZH��AB��X�q0��eH�6a�n�tL���`a�&(�bB�ج�8�p�$��D3)��N�A��RHc�@�q@��!���� �. +8�'�F<ŝ<Ip�1�;������E��J40������[p�2��t�DO� ��\��; �>�1� Xf�*}N<�� ��R��X�F������(*�(*�}�s%e��G���2L�%C�S�xy�AI)� ��w�P�PZ�� +�#��%����� ��p a��Ɍ2,Fb�Q1����H�\0��l��ŀ&� �x�x0x0�Xx�Q�@� )�x��I�34��8@R`�A�" �̄������ ��V�sD�lt�|,@����A���h(��A��q3���ـ�V��jl(!INN��0A��<X� 3���g��8N��x@Xrt@��B��-1�f>:"0(��0؎�&"```>*8T���#���R�����]��� +�� F����;ؐ1�Jǚ���j������c����G��#J8��[��(+6>�)�4�$6&ZJPCM4D��KN�"ġs�&&!��9����#MP�����OgB@Z��88L�9�A���'8"�aLl�d�ł +>�Yt���F� 9 Et�b���90�8`L�D��)��E0*�#�A����1�0A �Q +�.!9D!&�y�H@DL@>jb����4�rf�: B L�� ����-RBT��d,��@bA�J/� +�Np.4�!�� �҃H<*(���!=<D9:y!4q.��=�@�p +D1-ƀ& I�s��.O$CbxR4ɠQ��'C�Aj� ��'x,lH�Ȏ"&��@aC�1`��"f�t +WA�p:�$T�#F�q���ǂ8 2Q�X�.<��p�Ѐb�#�� },�$��4�fD�<p,�ӱ�#B��4ę�@Y3(E�b2*h磱 ���H�l�����(0�R2,,$Dg�� 3��鬑K�j�����lJ�pTPi(-��i(�P1σ��&6���!���Ap8���@Д�a�lP p�`H�2�a" N�X��IW�F)�*>H�!ʏI��|�A����l���DD�@�FAE�R�����\ ����H�pK�@&#� �! @0D�|*<J!���� ���!(OX$F'",��Ew���[!,���c +#b&��������(���S ��:X\�c-�!�NL(&I`A+#� � +|ƨ�ыF3�`� $B�B> >6B�� +ހ���lHT�n�p۬� .&r��c1)1 �Pb��x|,fd�<>6����XgE�y��I�LJ�!��ɴ�BrV�p�A��H#�i(���"m Hf},��Ⱥ��&��� ���Kࠠ�Q��HDD4D�� �Yk�:�q: ��J�<�Ĩ84��Q0)Y���(���S�$P���B����� �ʛr�:q�p�A�5X� �0|<)� `q4T�aDdcd����2��dE2x�*5 ���Ѹ(Cv���X*�Ą�I��LJ 4&#*AF��b8 +B *"� +� +��H�HĂ9&., ��N�P`��ql|RF8Y�P�"���!���y�K +V��.��D\ DJC�D6L($2 >H'&`q��[�$�0i��X���bJs���L٢b����U<@ѐ�r���X�t/`P���R�JC��JGCi(���P*�sJ���AX8�� 8��>8��9�@�2���*(,���B��Qj���O/ �@�#��4TŌ��ph�7 ��PX0�`* +jfa4ѥ���0 +$�6�K� +�Ņ��&E��4�Af"t`d��6*���䏏g����776�c�H�����>�#ղ�������G������Ϙ�-���5�ۼ�v����o}���џ�V�G�������Q#?�t�*������*����u��Ȑ��:�!���Q#��>�Z��WS ��T��M�)����]��������Ў2U�O��й����3�7�.�nwu������]����U�˼敷�#;R#\G�k�Ej�Nj|�|�ԩ�oӱ������o�y{��_����(�:!�:�#e�=jć�I�|��?��s�*�w3s�;�F{��G��o��ҏ�e��U�{~�XU�Q��^�yx���/�2<eܻ�㻣F�8oU�o��ٞ����_�������y�g�{�Άm؇�G��ϰ�����t�vX����z;l�F���9��).V��/V�X!?"bգ<��kl�N��h�:R�77�Ê+[��W�j1�7�**[��Տƈx��Z�5j<6��v)��R�=�5R�D���0�ҩ�]�Wɏ��?߿�S���њ�+�R+�F�Xu���{u����X�Zw��M�bή�*\ƫ���D�}������w����Z}�j����U���X�5�<��+�j�¾��ӥi�����Uϯ��qŌ�]��9�Q�v�����ʑ{Msy�Q�\mV�K�څ�L�*�Ŋ���ƪ9�{���U���f�h^['�[V�M�*7��<��.��Z�\?��� +�웊U}�5����_>��4�����-�ܲ���FgY1*��z�q��y�>R���q���_����3�7�%*&5rC��[�ޫ�s{?�B_�F3åv~I��+������E]���_�FUޢb��ꈨ��߈Xݭ�j�;�[�Q���!���f�تn�X�\}��C���R��^�X��v1c�������K������FjT!*�>���⯞���1�����G��E���ڥ�U�驢����]��ؒU�ؿ�ߦ���Z������m�c�K�Q�+�Ͷ?33˥hY��˪u����|�%�R�euim�gf���:*FT�Q/�ʨ�JETٝ�Uߕ�� L���G���+`9�405`�w�13+)' 0*`\B�E�8X��HYip�##�)NJ*�X1A@���ȜT@ VNP��LUe��EUJ����0R���(QeT��"#*Pm����*0Bd,D�QL�+ +�TYe[Y�]}W�X����Ĕ���� �� �GC��&.���$@�'DZ � �O�_���#��s�e`�d��ؑ҃�h?�)u$���Qr�b'"i+z8������1 +[r�1�qD�(O�`A��2�cJ�B�ar���)�@���2��R�D�c�#��Ȝֈ�hl�`I"�d + + �����|���1M���� ƃ���l�ҁr�'Jl�@ +F������36# '�&41�X'Yl|���!��c����t$�����£$43@L�(<tRla�H:#��D�@�B~0<#P P�j�x 4h��νp�(�@����6$@�� 1���zM@0�ц��?��Pϧ����\$�<|F�� ����P��I�:&NVGCy:Ngӹ�mLVg��Hx�P�O� LsF:�HS��<��4ȔdIL�U`�; 'w0�G����"р�"�)]\$ČTH���4�h1�0�X�lb\�!�!��T4ԇcA���<$���}�\"2*l��9���A��H���4�҂8 �փ_�P���@:%�j���`�����Y ,{��,��(��'��`C��ґ�a��lH6tRp J �"GP4R��G����b"T: u1a�� �P��Ð&�(*�-2+�aqq�qN��@����`A �%X�:6�,�d�̀h���,,y�M��8p*�X�[Xh�,��"r"�l��8&�Y�3��@�HOT��RIb�cG`A�H9`��03@��%L���(m�¤��!zX�P�Xǣ� �L!B�ɐ���ǂ8�1q��ǂ8'�9�F�N��qg +��(/<��B�G�. u8BP�n��s�&�8&Ή�wc�Q �s���6(��LJװ�aux�8&%6HPXC�dH�E�/��|B )#!%Q�8P13�0H����h�4%��89Qx���8��`�QX��8Ђj<��BC5�tFh�3<*�m�0��:q,�8`�A�i�P�����P� (}��Rf"�P���l|���G���)��t������ +\��0�CP� 4� ��`�=x@�#T�����#T�Ĵ�ICy�D2�P�C���p�`6L(�DH$A��� +j($�� q �Ã�ς��9H�@����"�P +e�9q.>8 +�;�����`�2� 2��uT��&�ED� D�ќd08��,!��x� j(���E$�qA�`�c�QPb�h�R�$�ňN�@����B��=X1]�G�h�i�-� Ah��a-���'G4���X\$( +��Si�ǁ�I��2`�-bp-�N���,�|T���>��@��XdPC�\��'4��Ł��%�Ƅ�'4�f��3n� 2�I@�64,D��`a��,��4<��A�Q��`FHP��'.��DC}4T������B`��k( �����AB:���ܐ��ZF(���8>-��8�8 1�r $+�a`z9��JCeh( ��\C!���`�Ц�0`d�����,p��(<*�J���%�����8!A99tne��#- 0$�xA�PJC5��`p" P��`H� +j�� m,<��thZ:�D�q:��Fh( ՠ�@�ۀ 8���0l|>Vl�Ah�� ��p�P酄tFXF�r� ��*P�c�Bb�H <B ����ɰ���H��j����P LL7@D��J� �t�c�X�``�@��4{B�E���Ȇ�@�CF���e� +�g�a�������*01�""�bRQ��pIq"��T�j�nzu�M� �P�Ί 5��B�i( ��B��X�<@�D��O+ �8!61��Ak�$@+���s����(�/�D����lIqxi(͔LY�`{4'{�I:ɰF �!�8J�D�DZ�뜃�C��:����H)�����ؕFD2dKl�}'8�R���0���H��� zE�2� a���(GQB���������U���^W�f���h��<U'�!2^��k�A�ˮ�詔=�ז_S-չ??���j��9���k��P���ݩ�o��~�������^\\�vx�� NZ`\8.QD�|w����nM#z�W_���n�n�!���U���_��כ�ކ���S��v�����������3|��T�i����R�B�{D{S]����1=�jPu��J>O��ȗ˒�S�ƨ{����<��Y����J=�����<��x���1���>O���hz�֘jP�����:���T����ژ:Ui�����[��?��W�툞j��?ur�����ʼ2�S-短F�T�ˋ����r�� ue2�R!���j�-���]�^�Lň*�E�Q��翫���ݯ����_G\������ݸ�x�"#��寧bF�~uc]�L�*����d���i�ȹ��2U~��l�����W��{w����r��|k�_�<��Q2�c�J��ʨFŁ������5.��6�\�L��7���RW�kt�_�h歼�4[o����&���!/�<]�EO^�X��:!�)�1�/�>�6\�L�*]���� +�9�S���������c�w._�:��~�N��Z�_�u;K�]�ɔ�F��y�q��RR��n��nm�˾��fE[��m�V���]~V��ݺݍ��v�������ͷ��������}�L�7��ϲUћ�/sW���-�]�?��l%�n�R�^�����ܪ�X;jg6���a�}�*����{��m�]��z۪�N��e�tQP���J��5Z�� +����o���]u�o+��[jT��:�*�q��O�m7�0����y*�^g۪7-}w/m���kժ���|�J��]�5|��Fo驜�9yq�J~3t�KOu���h��mj������������LcjԊ���.�����MO��mw��Ԉ����f�Z�!����bMO��f�x��� +y��/�S��z.7�F����[��_�����S�]jT�73o���bkܿ��_��n[��-3��Wj�Ko���Tx|������'�åF�%�y��C�ͽ���ڛ���O]j����y��6��Vi�������r�M=�\]�K�T�x��=U*{n���B�ãf,������5�����w�~��6����.���]��]v�뽻�y�����Z��:ߨ������Ԑj��S����p��{�vl8�OeDg�F=J~ԑ�-*;�sv��xoh��ԉ5#2Rm��B(���-��u���W[/]|��}�s[m�����j;\v����d�?��:��ev��?��6L\oؖ��2�S#s~����|�S�e����]ˣP#;�ŭ� ��x�S�v]���������=�����r�2�Ӷ�¥�K{���-s����o�q��n.s]v���ׄo�Y�b{\��+.3<괼>W���~;���]ڏK /{����]��\�:i��[���k�N��+�s�&�qu��̼���n&��[^���R�:���S�]��r��R�\�g'S=^���^��K���-̾]˿�}����N������=�^��ۋ}[S[���p�!�Q�[�v�x�ޮϣN�~*�繝�����]��|� ��z>�\ζ��O��/{=�B�\�2u��O}9�R==�dk����-�]����:oU�'��k��^�����Zr}[�エ��ZC�&\m8��Ƨ�m���t��?�e�{��k����۩W��[��-��Kw�)ԨW���!���^���&"u�_���W�J���w�)�Iٍ���\W_�|����Õ�������w�����z���{��r���]x�S�R-�*�y�P#��w��u��������|m9#uZ����Q{������-K���~���W��S'��u���W2.��[�|um��ګ-7\���{�#u�ƅ��|�N��>���텏y����=���u�Ʒ�3{���5t\kw2\���{%�~_�H�P�3_�t��/d�[\�gȻ�o͗7�������{/�y�-��_�輺��ڽ�{��sw�V�/�]����� )�ȱoy��[�e��m�����G괌������O��qq���J��~�q��}�r�v�e���l���^����Qs����̿���o��ʾm�4�^��/��o-_�r_���:5��?7[����?w��>.~�N����!��J3>�՟���;�=j��Cm��*��S_ϸ��|����ӥ���xk_3��._�N�������ʾԅ�y���s���Ŏ{����M��:�_�B��e|z����y��_������ m5#uJ������O�圼;��q/^�N��k����2����{TC]�H��mg5���{��+��W���/^l�Un�_���d�Ra s�RB*0 䁺�F��'n1G~kF���Fk���z�{{���� +D4lA�.�Q:��ߞ3R�k���5fd�F����ny�����q��V�Q�#5��f|�F�ƍ�ɳ������5f:��ck������ϼ��y�����Ne�{Gkm�NS�5�^���e������o�� Y�V�^��q߷�������h��~�y�s�a�����ۮmc�^>�����+���ƅ�ȧ���ޛ�k��ȩ���o���8���u�e2>�v��C�u�j��������[�'g�\�d����S��5�W�3���kG}G<^�{����Oٿ�W��#^>g���ҭ��s!��>~�~�z߮�wsZ"5R�^�v���\��9�9m�RGo�j��O����9���xi��-�Z�j䧧�n�y֧���Ζ�������я�z���o�m��������2�m��ά�qg�q��/�C67�t�G����[�Ȭ��v�iۻT=MoQs17�{�~f�+;�[�+���=]�z�����ǯ�����϶<5q�u�����{�2��=��v|�M�4d�=n��cj"&�������/����CSE\���_���5_��}����̧�k-Ͼ�v�o?����)��z\d�����;Ƶ��ݍ�?Zپ��:-��e�|��:>^η�ϗ�5�^ی��m9�9�b��[V7Q#C]̾��{��/��N��}�߲�k_�ֻ�oiS'�[�k���n����N����[W.��\���t�l���l+�~�S�[�G�Zy�����u.�u�T˺L�f� +y(�P"#J4�Ȕ�wz�v��h��1���K4���qQ;]���T��fK���i��{�%���M���y(єh�J �F���~j���!��-��{k1���2���~eZn�]�U�/]�t��U�4�]��y�m���R�Y�+�L#5�]��2�2�ˣF��ۤM�k�5ղ0�uY2Rً�<����ڙ�������0�>;���Y�/�0��O�T�6��������v�Xώ����0 ����/��O{m]m��o�S7ݍ����4���o�.�:���8S���.��0�_�������r�[�=Ϗ�8�/[� ��[�N�WY��Y��Ӯ�7�s�n}�����_�y��gs�Ӧ��y��~�ӻ�߮��Evss����E|�gk�Ŗ����������./��,�z|�;O���ڊ���k=������=��6��bC��cV�����ٿ��>���/������q�7�k��'v;��bt[]F��^O�x�{k�<nֻ����ʷ���ʿ����g�훽���k��gȸ���y���ƾ���g����<���=����<���~.��&��<��/�ߞ����g��[3�j��٦�j+z�_����7��6���晿��2�?��}㝵�!�m��}{���[{��|�� ��8���Pͣ�hȽ��=��y���˧f��Ι�����t��g�d�_oL�MV;uVV�n�l�~v�F\�݊z������1EOծ��|뻬ѣvޜ��i��T[dw_�E�~���t��o��Nv��4�dw۳��D3p���{����������즍ʯ�|�|̿���}��ǯh���j��Z/�W�i{&�)��wj�>��=OG5sW�UMO|�]��ɶͷ�����Ά������l�����ָ������x��U�O��"6�;~>�-E\�ĥ��|�k��~}ޮ���fm�η�<U���<�O3�������]��.�[��O�{_��z����x��w��fh����˽��w��y�z�z٩�����{j��ڮ���ˍ��91�w�57���ݯ�w��)�����C���;��ņ��뇗�~x��~�k�o֫�����i�����w��hj��fv�ʟ�;�i��������T�]�W6��e���q��'b��/����L���G�ӳWU��f�=�kto��e7V4o�7_E�oC�g6��Kԥ�����:���{9���[Wl3��\ٛ���V�R��}s�b��^�c�n�r�f.��������`��������e���3��Ϙ/]��ݙ����V�h~�*��]��WW�v���K�wՐ�V�R ���\�T��n�z�ʽ��4���S����bn��o缿���̷��:�.5�T��܌�+u9�[���r3����Lo�^��x��|�n��~˝��4�S�f/ۭ������Wg�����]��?���ⴻ�c]�{ݷ�����v�������NM��}�q������������S�w��Se��Zz�7�Z��4?C~�� +Q��v�u��g.��VDJ@�����j�&:b�:u]�L�tu�~�\��iw��+����TO�k�ޝ�λ�l����ج;3�q�}2f��z*��d�F��jyg�����=o}s՛��f���o�߯�v��g�V�oȻ涼n�RՔ��;s�ܽ���?��D��˖ϻ�ʙ���/W�ʪ���ˍ�?����*[���N�k��]����n��zխw�u�������%��&9�B25#i��� 0�$�Ɍ���rN0@@@(&� +�bi�� ��C2ŔA�8�����'ɹ@���i��!wm���c�=7�Ѱ�CR��qc�$A�Rlȗ%�oZ�iǾ2�C�$�X<oY���Ԝ�m.4|��R�G��Pn���j�AjQ1����F@��+z�$z�I ��m��u.B ����y��jR�K�f���_J�aǐ�A�H+l�C&Qc���Uqf$;�1h�,2����O�eȑKK �M�l�)$IN���6����Ôe$u�YC�`������B- ?�gz�� +H�;��?>{ r�gP-PaZ �}�%�����#-��:�ޓl�@�[?T���jEI|�i ������J�:GM�D��ff�|���:��P�_�� �^�� zY��b�J`��,��B�� ����@^��~&3v�/c��������;��@�� 0�����ԡ�>T*��y<�5^��C���tl���F&䲐��494P%jc�A�&�8XB�Ld�A<Q� p-L�YQ�r��@B�4?Q�<�Xz��'�l�����̭�5Ds}X�P�r�L� ���8�u��x������mA�9��'�q�uJ��F��7#Q/M���Sh��.�{X��a_�b~�t'����t`�xᷬ��Z��� o2����,��.��N���T�O�C�g�|��C�\IL9��j�+n�F:�'�)�x�:�-�r�A����5]��|Ek�b��f� �6�sI���b'�P���´�+�Ey�^��Lh|��k�Q�Z��d7'���@��飃,X_��[(etue�_��Z��m, +?��2�2�#=��G���'����$����jp��b�b�i1i�)Yn�h�ҟ�������ܸ�ƯV)�=�W��R����!x-^m*��" ����{J!��9^���E|(]��x��%���Y�"�gpĵ�Vhb�E�2�nE��8e��X��O!��g �z��]�k��8��q���=�w�ehOY�A��x�Up�h��偠�?�K��c�iYhX�#��@��8rҕ���P���B�S�A'��E���+�ς +n��>������z+d{#A��Js;��OI�>(G>�&�Q5��ͣp&G�� ��(���V.�v��&��a���u,,H��%��&��M��6�E>��n�`��4E~�h3q�Ô$��5dǎ�����&'��r�~��d��(���J��¸���7k�r��U�'��guY��^�ZH�DUG�ζ���4V�k:�#�����?$0���g70\j�X�x ���N���I� p�l��C،DeU\@��mY���B�5Ͽr(��Eq� ���[����UFm���-��I&lG����$,�Y�@l9f���FU2��+��.&���Vc��'l\ + +�{��f�l�$���@b�P��߯�ᠠ���j�6��ky ��F��7�'�Bt���İ����Z����`cT�a�! +��9�wy�E.�>�C�+��g�IxE7�D��~��+u"� ������f�ҭ�)3�Ҹ#��f����e,��\�JS*�r}C�m���܇�������Ƅ�H�uF�'dKg{R�CFG������"���4�n������M5�x��% R�1A��!M"��RM1��r$uo�;���(��k��77���O�G.�>1l�y$��� ��d�bYtH^��N�h_dŲ��H��QꞄ�?$q{�@�1%�P̏�D�$ֈPJI�R�a;/݀��PL��Wùl���Gi������V�E�z���FȒ1�W5��^N9�o*�&^tކuM_�-w}Yg��^$�sE%!عhRl���x$KtW�I#�#9qV�&��p���N9���BG92��Jq\��4Ƙ�i^_��'S�"�}�Pݜ<�8C̬Ľ$2N�k�nj��U�� +H�a�>�{�3E�z�E�Q��S��*<g8 +�_��}ɜ�&�����B�+K]u���Xe +�����1�Cԍ*��� �8�b�# �u���FSK>n +!�t�����8���c�M��MJ�ţ�����g�,�ϐ�O�H@��u�@ +A���P��|�#�74��|8��"ǣF����<#ɧ��?�$�"���W�^�]D䷘�!��8�6����Ql=y��)z�bnZ�Ֆ($r ��?y�\�Or��y (�A��(�� -�)�M9@9yT^쏋�`^T֏���V�T��Vi�S�o~W>z����1���z\�,����B-�����[n掋)&ʸ<b� ���[?��]��Ͷ��V���pc�˳W�LP����8�Z���K��@�� +j�I�'f�\�)���5jBuy:�q#�<�r\g_���At�|I8��0��&��x�J�1��o��bk~��"stj|�&��̧��;�7s`4NC★��9�g�9t3NR��j.le����_����qE��x0��*UsA#�76UF ��ߡ6w?{z-@���yW�^X�sl|�fƹ�W�7b���X�z�|B*z�\M��"0s#Ɉ�<����[{��у�<Nf�aP:B��E�ZS���I��%�e�6������]� @Z�'5�D���m��?h��J�M� r�N&�h �=���&�L�t��M���D�&ʓ��iH������a +���� Ѷ���$�~F���7��M~�{n����������'٩�360�����T�o;���=3���8{�q~��_�m����Gǿ7Ԅ����ޠ�������vfƸeq��f6�� +������=�.���k�DM�2(�Ħ5��x���j� +���W�\y�4!N��s&���B\&r̈́No�{\&�Z*�;�k�e9�"rm����K�Z�_D¤e�C@�<���Yf��hԣS^�2�52�8�Dϻ�\�$�x�Y-04�!No���^�1���c�F� ��GS����4��!ºk��̗���絵5ޖr��c�l��1x�.��;�c�Lu�C۔�Zx����yLo�>�Z�j-��c�I�"���/�cB+����7�1��Y_�� >�,RY;�c²>^���1+3d�1 �[K8��t)��[��l����N�.���~�(��6ec�8�w�����/�L錆HC�? +O���G�}Ìr�(6��YZ_J�PI S% � +]J/x�b���2��x_���-�9���"�vY!�+�).n��,�ٛ�'�-���;� ���U'z/����Y�$k����R +�YĂW��N�+���:Б�!� +���Y���֭̽����m�|�y�['�_i7{�K�3�stQc�=i�;^���u�;3��+6��_����RI�e�p�e�N~����{������ё^|{��[��ƛ�7��P*$rtN��*��a��_�Er����ȑ���G�Q������:��e�����o)|5i�JG%C͍W:�t���S �tјn�Yg��62݀�E�b�d�=��V/�Yע��v�\P/3G��� �{aݺ�����F_:�a��a�Hn@s�z�z4��9H�����#&P<t��͡ +#:�6W��ģPz�� +���Y�AS,�E��N�h��nΩ��6�s��a����_�j�h��k�P��;�wǽKM=��:r��!�fr���!rA'E`Q*��;�c Qґk6$��b��mD�nO���pk슊<��v�!6�[� +|S]�l0���y�Ԇ%�����dnެ-� Ao ��U��+�����W5��~~^m���:�M���6��S���s|*N+�4��p�+��b��o��m�5��@�� �?�۞�f��ھ���ot�R�{(�<�'j��;܀s��(�Ma]���� ~7�<����q��vu7�5rRn{Zn<��~P���X�-@t���t�9ݸ�nQ�T�����(Z˺�Hy�F�ݮ��n�\��&@�.eϭ�'����Ow��c�@8�("\$��5|q�'.�CD�-��q�N$��{���wV���������pq.Ŭ +�"\��s�|gx̹��t�C�[�������s��幅�3�zĞ��!�����8��s���G����Ak���:¬B���ޡ;�R:6I��>'���A�3Ӱ�t���<�u+P�� �3�Zё8�)͙���B��Hw\0ݻ�g���6C���.x� "ތjf��3��4�L=���M�\�6��e#~G/7�OW�O�� $Q�k����[�e)�= c���>���l�UB&I� ��m ���s�5 ��i�DH�� �'���]�t^}��F��A��g�iI �rL8&Z.�ȗ���S���{h���p}��꿎O^Lr���Q�&Iɫ�t�E�'����Q�I4D�=c��#���4�5"�Fc҂ +�f���Кr���K�����l⒍L�mт�W��B�'>�[i��7�&'S��R%1�b���9��hbŲ�_�m�TPdyO�l�:S7G��[!¸���يIPx����%��=,�DU���\Krka�����.Ʌ�Ƃ;�� (�^�{���uv�fC���{� ~��8-S[ߔ}f� i���&��z���J!�E��q������.r��Z~j@ւV��j�� +u)_PZ��xׄ�u�_��Yg���UI[�45"�=S�t�">��go��x�?W�Y.B�����/Vj^F���f�a��>�N ���ub`�>��b��`�#���s����}��X����ax��:��{å�A�"��� ��%�&W4VS��ׂ��xF7�d�vnH����83�,ʳ@��q +z)k_&A�u +nбN,m����u�N�e�' iZ��jv�4���V�r�E�[�� A�#�(!V1:8���l ۧez��u�}d ¿I��6�4�?u �)j@v�خ͉R���y}?�����dG���wyRk&�jt�y��y���KQ���V!l�.�¶�m5��f���Jd�X���&�V�5���D붸Gi���ĥP)��:���P�Q>HvZD 薖Wم�c�2W�ꛫ�Pl�$E�u�ncZ߹(�V����� ����zqSs��g�0��hV���w�����M��P��eR?�F$�j��g���5����0$�����Z�hO�X��$[n�y4� ����8��~�3/R(�|�!�;����� �Ώ�窭�{�B&�ltVŜ査�z�аI����ϜO��v<H�r��័��Ā*�+���]%'h�@����EJ$�u2:��|�:�|�d.���%�`�b�65�M)73"-�)V^X�D��M���%�6~�I�qF5����Z=ǡ���Ińaн |`n���<��t�j� +�$���t�V�L��l��U�ѽ�ڢaY����*�`�AH�)$dM��� (��h%/PwY<��k����}�A}FU���]��F����Gk��1!���֊�1a���4܋]EE�>��.=r"�_�*:HI@��z�r�Oh+6(�:���/�����-OJ�) (�v;,=bg�j;lrܜ�{n��h��̑-mnf��B Q�5ʻ�&� �e'��m�2�[�p|1���K-�.�W�T�VR�.���|8�d�<��7����l�8��SF�fD8���e>���jg���f��an����35�����6�������3 #�<�=5|��] +ыK��g� +"A���-�����g�&��(d�f�P�q�n�g�� Y��w�6W0j1%�LF-��;4}�@.r��l'ú�Τ�u�Pb8��(��� +&�������xU-����j2{��uI�� v� ,��ta��a�M���.�ļN�# �̷��@�s$P��|Q� � �2�X9��~������vK/��LA=��SR:���>R��}�.��d�د���n�-���� �W~"��+ۛݫM)���lo���$:��:aX�\N���bc�a>�E�`��u[�V�v1�+g�hp� D�LZ!��U����v���%�P�t�B ���l���&eX{8����uA.c�w\y���$ +AN��}��(KQ_���O{&��DZ�F^��*@�{���r�1)3m�L�St���\�Z3�~��vS���Xn��Nvi�Ii ��7@ٕ$�lD�L�9�2Q^�{����x9i���3cEi�� `2�V��L��#�%AC�5/�0���Ō�q�����x�ΞȀ�9�>x��z;z��&��*s� �+}w�^%sz��'Af�ȥ����"Q�y0��_J?¸�}��-�,M��}���N��ɿ�?~`��n;����� � ��m��0��U�-(Il�Y��*"0t���:�� �Ѷ䘣���m7����'� e��wI���Rb�䛑�1�dnޥ��N�<�������cwO����8ۉ>!�W��D��u�v������L��]Tb�/��5ώ��z�px<��cS;�RME�Q�!Ւ��K�ה��Q9����L�{\~Y��oq5�#$��(o�8塝B2�g:�w^Hi�dƳ�Й�¿Ț��;`Ը�Q)�e�c�W1_�u�DR}- ���[DZ�Vv +_�vqyF6�sg�b�D~��0o�E�-�`�bQ5.(T( ^\M8ڬ�u�Y���Z�M��C~���'/zא��YU ��:�ϧX���_��I���ѼjRk��d���%׆�S,����B�@�aqn� t�)_�۵��;I���>���C� +b@a*�Dqg�ROO�!b�/�xvDl&�J�*_ruG0�#�M����Q'K+vC��5��ZC��tb���+�a?��P��gɒ�B��@�\)����@�]ܩ����a<N���Z?�.܊�����njiA���p���H�F&l�_�s��OďW*˛�W�)�,����φ��5h�<��y���sr*h�{�ڽϕс��&�S���;�˭�+Y���u\5�ȟj1�n箳����,��?��s$J��H������FB�Lз^0~�#ȓ����-M��%Aža�����o�*2pFi��3����^ �������b�����3���o�Ј@Z��@�B`�?��8�/�S!PN�O�wMV�m���a��ecd��^�d)���"��>�<b�Ik I-6��p��Hb� �6�p8Y�\��C��5y1��:�92~uήqj��Aq=j^�qdҢn���i����Y�%i�&g�:$s%�M@��z4�2�tc���'<Xߪ��`2�ɮ"[��+��l +��a��v��sqO�`�R�3i.h��?)U�Pp��-䣀����Q c�&��F�������6���#n�x�/��);آA0�����N��.A4��:ż1��%���.L�[y��F +Cp�����gg�/��t,|�E`��*Ι�W�LM]~ȓ�C�1��Z +�/�3u����4�r�dȐ���N9o�8/�0��OeyP�sLO�e��]��� I�맟�<x<����O$ny�����vA��t��1���$|��@ ��f�fnOk)S�,a��4:t�h��*�0D~$]�X@[z�ъ)0wW!w��;Â�(_�'fW�LM,N��.�P%_[t�aۆ���q;�*p�Q=���gm� +����ך�e�g�5M�?렛r|�4l��E��%�A�~a�9��A7��D��������$�� ���4B�s���m�d�������$I��t�����1�/KE�<$&5�m3GR�~t9��A�\ )�4&c�|K�a�2_�,�����Ã^���@+�����Q}�N%���z���-d�?v1��� �����5L�LO�8�!6$[�Z[�V�̧:(:��_�L��V�X�k�B�{�L�PP��������&�~&@Ss&M1"�/��?�j�!|�^�����`�1�0�Â��%�2J��Ō:��������c�āq������,��W&�\%��a����W=FP��5����N&?�vT�dW��h&�W�.֜�DtH� D��d��J��)�����#��"��( ���BE���a�RGCqy�t�/���}�^�e�L�B�=S�pEG͝#�U ���<�Q�1.�O�Y�c7�_�e�I���X �\�����H��Z�w��0�]|����z^ȟ;���VP�v�Y)�R 8��&�TP���R�.�Z�G�o��ѓ(��ױ�{�E�0��TB �}�jB�gQ� �L�� +�� +��UB��!g��iL�U�v�/;^ފh����o3�o�(,��O2>KΪ�B�'��8xr����VR����>z��9�&����H(r! M#u&�¹tA �;�f!�-��ZP��s�"�?�)N��ש�x�>8�=՚9`��@;�E|��4)��EI�8��.�5k�Xt~l#�itp���j�U�ZX�:����{���C����8+ ����1Hl:u�\��� ڼ�;�t+W���EI��%��t�h#����Q/�Nr��h<��g�����xD��S�`��s2�y�,����<9���U3B����� ����d����(�Z5�U���RY�bѤ��H��{jG�_�Z[�a�9{ɑ�V�9�Z���hM�R~Ʀ�`?r1�� �d`�~m���|.�f:����8�ۍ>��1C���!d_ 7!�-��L�='>w{8h�����j6"�D���$jE����q�KkEqU����Hkԋ��n�����`l{�������iNL�R��=fB��(غ����O8�&}�� f��OE�q��0 �aF�J)��" +�9(C�,�6������P��L�W��[4��$jy1+�@ȓQ��c�l +�2Q��8$jTR���M�����ѵ$Q�� �=������������ʑ�~xqv4U���U�+�6����=���n`@R��l~��|�?B�(yJ-�ީG�ώ`��H��+�T�&�H���Am���z�Q@��o@%�_��)wf�b���T��K('xT�"��d�(�{Y��)�Q&���F���%g5�sL�BO�x� +����'i E=�ƣ�{�Zn���Q��]�/�$>��$ή�F��<:i��D� ��A�pFV�pa����� �R�s!�7�@�9fΎ�Du�-+W(`�p��d���Zt)��ɣ�K�ph��'�hG]zT]Q ��?��-ٷk�³ҮE ���C�?=@���Q5�������[�������&�8}�x`�a���e&���A �Co�_�,p@�<Un��<�t�1Დ'�O�<?�YQs*��|u��]�Xs��͜1&q���'9��Ĝ�ld�Du�N^��iEPI�� +�q!�(jl�Nɴ���X 1�C��[������i�����������TcP0L04 +Lزv.6�DV�,TA˦�G�qIKl��>'�t<���y�C9mN߰g���I#�B(�78��2�_�e���4+����ѫ[m�SX1Z. G,�a������(�#X�+���� ������R]�w3��)���U����{o������H�fƐw�s�h� �C��=��9����Em�Ga��?7�N%�L[=o�=�-G��h���؈�N��I���V^�娴�=��2�����,{�pK��T��:�s�z��Q�!y�/���KB� <�������]1o�,9�_��;�y��*�J� ��x6���F.�I3�B�}�7�ʔ�~��������o����1\#q E�I.�S�M��Z� +��!U���XM��j�㞔�R�c3F"�X�����:�ˋ�ػ2ӭ���9�O�+��/gka*����⇼�<fi�ĥ|�sX�2�����h��~��S�q�ط!K��nЋ*%�5-�|��˳yDV���S���e1�6!��'���f��J��)E���m�I�Y1�/{+�E���,�Q�;�o#M�>�`k��;ٍ���Tyf�(!�Q�3'��G��G��P�v�2� Q���hN5��MY|�����T _]��у�� +|�)�Ed$,d3���@|:l�+V�q���j8}�Vt�x�� �I��G�%<◘�FC�N8]�n16�c1�ս��he�.��2�TS�i��Ǡ��N$�@���2�kE�� ()�/C�g��S:����l̆�SdU�/�V�-��3�U�j���k����SSϵ"�f}$�|0�[HM���2����� 4����R +R +Z�� +� y��U}J��,�>g�c�+�v�%J��!��ڌ�c��V ���pn[ロ:�}�Uz;�D���cB%�I%���-ˁ'8?-��_'g��FV���O>Ҽ������1�Kn�%��:+E@���Ћ�&5{~#F9ȏ:'W4c�4�}[x^���}��$��<��=�i�5�ND(���Ir��3���Km��$f���xb��&��"�0N{�0�B��&'�T�xf6�v��N��� �r�-�Ƈ�{g���Eθ.w7���(���:�N�xRF +)���z���R���s���p[�%��h=>��2D��bC�5��"��M�?%�]�6����ؗ1Ƹ0t{p��R��]��E�.�U��wg�r�)u�p����A4e�3Q;g�ʮ6q�F3���9b�r���4%�N61��WD��fpV���_�^:��ߛp��d�'Ɏ��;=�08_�ø[��b�O�z�{Q��|�W��ZugEY�De{�,j V���_�;��RF*m�Kv]f���B��>ؤPX(�������-��7�K�p�Vv�r2g]���LnJ��B�8>�W��+� ��]&Q��J�049�� �e�ѿ" +�N����z��䟈��G5�p|qB@|�#T�QR��A#��EB����\sZ�Aʂ����^�r����x�K̡}+�+H����:�H������ �����ę;W]�t��~,�A���bJP����ґ���K)�[����Uh�L�Xu,6����D�H��)��<�.��U��!�'��r�\2�=/�ɸȿ����s�i=d��;�U�e"� �RE��>w�i7=\T�D�kb������A�U�;�ȏ�p�썶���v!��Ÿ���n��ab��)0�<�ɕ����Ŭ�"l� +��e��L���ё(�Ç��A&+�Jñ8�������c0G0��3���!�)סſ�'Q��t���,2C����/ +D����2���$r$P�͢+"��^,q�Y��E�ʨGb�y:�3�`�q��gxʛڭ+�_�@Ă��2�oUcT�Xi�9v�V�%� i-f��4�ѹB�m*؆Ċ�BC:~gN7B���Ƭ�[ a�M6}�Zs�ɎI۠}�5�nR(slgR�`a��֊L��/%Ek �l�h��QK���0��iЙ#X��D^�<4|�O8�T.���I��L�����$�JzM���5<��A4�(9$ Q����n^R��ԕg��P�� �o"�v��QX� �c6�L��pv��$���I߁2�g�0oF�di��L +��a巘Cm��gT��9PI�1�G�-A"�cg#I�O/�U������ކ�`)��:�����HV�ެ�?�)؉7���>:BS�2�����v�`K�3���p �����i,�P�q��Elg>�P�hud%�Ȉ���b�nN�Be�.���f�:����B����p^`��ce�x��[�� ��J�Ic<94� +�ipq��p)i!�:a��$JT�=��܄��a�S%���bfi�ׅ7E���3E�B�J��(�#��D�l�����C��G��I�FM4����o|+*�@_��㑋�h�DAM����Q������[rF�-��Hu�5� )o�CoiO~�u�|+��r�徍���B�%����|"���v_�j(�F鐜7�l6��( ��k�D�F��S5���;�-�e�Љ8�\���@��XY��xx�)��'�3��Va3~�B�'#��B?#���ЩH���V�|K~Ԫ�rd!���;8e�?ٌd�ꊛI_v���|�H��V�b�\Kj�m�0L�ʻ4A�v{T���7Jl��L��Hk����&Y���\+k>�_�VI����}f_���˶"mB�9��CwQ�Y�q�p` \1;��� ��y���MBݧ}�cU�J�����5��}�:�_��V䚟qD� Ư�i�c0[�����*|��j�uX�h��^�Yo�x�%��.&sB�MF)���:PyM,��P��t�~�_kq�<gdo~$�G���'�>��6��>��� ��pYtk����d�=�E+���8������n 4x�^���7z�7S���HH:���Y=$���,<�T�q�� �ӉM�.���T��dO��b�|�f�n��r[����O�Xk|o��#{ȫ4 cj�a��P+������qgz����T��nK���'�ܬ%�f@zI�>�4�L����>{���{��,�:�������S5WXs5=Ui�)+������D�2�F���Ⱦ�藞��Jq�D��W�[���{t3�nr&@�[.<�`�S��/��*�`<ݓ���J����3XZ���L�vP�hM�6�^b���e,1��}cUD,��ɖ��A��H���e��#=S+fu�~ڍ�e�t݅p~`�#��G9���5������vS��2���,�O������28Bc\�v�[ZYQ�oI"�܄�����*#H�QE!Ri���.��n�� J6��W[�FɆ �l�~\�����a� �X~Ռ�?v:y���� zȗ�����kN- +�Ո���!�Gf���5Y�8S�8>�I&a�W�T0GOK*��7��9N1�>��ib2�rbB�nq���#�9��dlj�2���r�~����"W�7HA3��#$���H�#q��Aw� +oo�;�0}(Ha�>���OʍS���P �/���=_�S��-|/����J��Q�W��j�S�v!�a����ө��^i ��|+wC"��ۄp �B�_8��L�δ}9*�q2F��_����[0*-H�����8xi~I�j�%��vܙ�8���ƆN�𤌌����h���ϱ�t~��7��ڨt���=�K�sql��w�v�#�+E|/����\U�.������U� 騣�`�� ���!����M&,������Qn$�.ǐ���g4���=t@ V�)�o[�ck w�?dd<�51��$��Y���9�l����ïx�4: +�(k�����g��i��p�Q@ӄ�G�د�[: g����i�[��*_�; +Tb!ט@��y���Y��Te�P�"Q���D�&g h@fO��揳��1 �@^�oqQ�v������Ih��6 +h�zȹ��ֲo�זk0e f�(@h�Ea( +xt��;�Nё��<��(0+i �(� ��)e�b����3t���N:@ �fuco.���(�@ ���B�9�htL{IkS ��R�����=mGlB��'���A�)�)lOuצn2�Y�������~2���pV��� R�͐�"�vJ��QWǞ��fw����!Z���Xi��(� �fEE-�������x���_|���VMr��J��h�5���s��/F�SUVb�eo��[rāR�9�pe�<���U[�byvmܾ��ш(�5��7zH*�m&���Sʲ�]}��.�����ȵ'M�s�F>���&$������l�h,�o��K>��h�v�b^��WH]@?Y�� +��4�^�4�u�斶C��9#�=��?Ѕ1�|r�_�u��- +)(j�H� �Pi���5�M��%ޫU�I�+�� +�� �+^����0�@�A�Kl�*�+�Zrz@]��� �L�4��{��t��h3H7/��C(�Y �q�h�hU|��r�E���,���eP��%�γ�ţ,�.?��oӖv��2Q/��q���#"�ꢦ@t���7)a�ʹN����\�7��:TL��������� +<+�qrBѯš���)2���P�=��=փ�v�I�Z�[�a�X �MdS��TTv���}�&H�q`G�>�>��Ǥp���_$�)�KY%X�vJ�3���e=�e=�G���Y��H�l���M!�8��(�a�UbXU��G,�����Q���������:Ϭ��ظOE������rH|�4h����_ ��\�"��c��`��8��LzF�Z +������}�#$z ؇��|ۓ?0V'>.-�i�G�����CtT�XV�����:Q��Y�}�$�Sq�'�j\���{��B���GT�� ��iy�*�J W b������$����Pυ�Xc�,Rﰏ��>��+P�O��>�!�8�zF�#�DU�)P�Ϸ�Ta�9( �XO�_ (��c�x�^�A�����V�����1[ +�ڊ�Q��ͩA���6j�g^f������z�:q&��I��:S���.|�Ȃ`A�� ���~~���@����z��n��Y�\�+����o����G/��@6��w�g��ѷo�� +�ܗ�d��w�^��p4Mfc��S:w�o'J���ӕ�s ����zs�����3��c�U�<�0�&��(�����d$��M��W#F祷cs�MNJ���D&����;�kIH�nb�e�}V��v�����M� �F�/�.�!>� ,k���fM�����|�ER��j���n�2]ůK�P8��ݓ�PH�t�O���.���]��hoK�SKbk6G7ƹ����!Vy�5+=� +�c���u�uj�~ۊCW7��� �V)! ��7��Aa�U�mA_kw�(]4��g�ǸG�#I��_������ϯ`,�\�M�f��x�^��� +#rO�'��OC�!FdV#ʈ�z#Rc�@D�\#RdTB�k�!��ۈ$�B�Q�Ԉ��="j������ʢ��r7�\/k�(Ҳ�M +���������9#j�ș0"�0���ޖԝ�ۜ���F� ?�xR��u�QG����g�+G��JGW�����ʹ��].�*��Rv(iX�F�J�́�r�@ꍶ<�B���K��4(�\(�f3��<����S.�*a���xOcxv��'��T�p|Úzq2&{�Ґ2�Ԑ���$74IU�Z-٨���}�;v��OPM6�M��,b��B9�,L��[����܇Ų(hd�/��Lo��Q�r���L�lޔ���U�x�/�Q���ݩ3$A��D�㬅ҡnԙV���vJ|��ԍ���\�cq���f�!�j�!%"�[4��+�v�1bo��%^6������ͳ��s���ń�U?z4��"����e[f�1��'`�#9ƶ��)ѐ���q��!Q����ˬ���5�={(��A��B�D���ķݣ��(B��i��h�-*VgA�P���� �*��r���p +����^A�B'�fZ�� 057fyd�ðZN㍌�P^�xa'�ic�SAܸf�w�f�_^���ȯg2]~����I��틝��n�k>'��jszn�6@<��/���N\8_�Ѐz=��~���Lż�d�Y��XW��mZl�<����F0�*S������R��Q� �D��HT��"B���;7��9�}re�<xD����f{�ır��R,tm-G�<��\����X����?m����l�����������F au�x5H�9#��&�0�a:�N5C(.>�[����W�FD�,0��r���UA2ٳ#�i\}T�(V�Bh���������.�D��&"��B��9�h�Y�� ���m��:�wu����Ę[��m{l���i���%��<��vVt�;��'y6��c���G���N��8 ��k]�*�c�o�ǔ���]y�Z��TL7 PHE��A[S�Ee�05wO�P(�"˩�*V��:%i��I�Wc�ý +�6P��rĄ��Ez��z�S�`�^ %+��G��t�˔9���;�yu�X��e�#&���磍�)+���KFp"J�����B|��nٓ��h��B-l]T�N��E-�R���`�)-��Db�Y��H�s�]�a+Fr�)2nZ���k�� +.��Q���$M�$TΧ��^�i%�ͮre��@}`�o��v�ՃYe��ƽ�1?$��4�(,^jpU!I���0g��a��{I+�����;�!�ŧ�@F���R��vu�~5��W�D�3��յ��k��42}:�� ��}ke��Ό4���1y旃�Bd?��q��xFzÒ +��pGi����2p�����F�f����ఈ�E2B>��� +�V�^��+�!e I��9 +��l��NK�UR��T7�����1^����[|&Q�^甁Σ_�N^��kL�u9i��m��V"���x�s��z��2�zқ�Y, �p�{���kq�C�C(����/y����`6��<��C���C�B���Bڽ��y.�H�S!�4侙z�p�#v�8Y��%����1����G4�4��b�j�|`n|k�<\�\�ȵ[˝,vd�$"����AN�x5�\� +p��r~5ɨ;TN��l;��D��NT�蔃��f[`=�E�87�`p��Pa5��������8�����f���r�ٍk�X��L/.07r}��@GL5a¯G}6v�~��v�dD0=i*{,�D�3K��\�8D�Z��O�:�^�"�T�Rj��ۤ����&�I� ��Sl��u5�/�hͷL�����p{c�FҺ�f(}��g4Q�,ԣXF� D*L ��>�tt3��K���.�a���}�����q��|�+2xL?�ϝ�XJ�u]@@J�%��no�q����7��-U�3d��"FS6��4"{\7�p��*�HH�Nh8�9�#$ ��I�Kx�t�"�A'��Qx��Z���2��([Q,�/��/�]�ϭj~�c1�#b_�W:ܡ�x��;*Г��^1�ߏ�ǔc�.¢�*�`�z�(-�o���}F揿����y@�fV��ph���즆+�W-���O��P��`�t����t�}R��0�w�����:U^+5_��,�BmA���-����_�J��z�����-L��%)j=X��|S�A��H�lht�88���Vz,}2��ɐ���^�<*�/��r�&9�E�e���1җ��QD�U畤�t +�������� ���@BHjs����aDo���{����g�h����1IVN�gAd��=P�飳IC�����2��N����#�N��F^�(���t�'���'�!�U%��A�d���_*.,b���6����I{�[��\����(LG�2�Ӿ��qD�,X�����;�5闅�*�����$���X��+7�т�����~�F�#O�sO�MS�B��6�>;6ݥ�H�&��6A=��}�aT��ns��:$z&�5%_w��U/����D�RH�,�(�$) +�6���Ș�2F����K��n%�դ�� ���lYp*N_�_e�ޤN8�]b��R������@>�����.F7���Tb�� ?6�D>��3-nO�{쀻����d4����tG�϶��<��J��f,�wm]�&�������Ww�=-6�l���`� �J��K�t_���0�m��N�9�%�8z� I3 ��&8��'�[Mq��J�I4���n-�~������ЇE�;���ރI>ǁvV-O]�-E?�g ���I���<���5�n�F���|$�ޤonk���(�zE�'Ǒ(}��oW#��k=>m���=��r.e4�F�d��A�y�si�V��K��T��ᶌϰ��{��~F��m4���h;���I����r>ڎ؎ÿ�7 +���m��&3�4˱����렍!Mf��:����g?l��i����7>)�g=ؾ��cG�� &���o*�:�Z�*)�mH�6x������ZO�����?���;�L9��4���C���?��ՙ��!��i$De3S(0 ����I?���5��y��7u��(���xdB�Qy��U����~+T��ʮ%g�^����͌^wY]����J�df6����F�-��t��u5j*�۫T�QE��^;z*�o�fjfl��d�F%�\#���lu������j�{ :;�x�{�qf��bc�|��U�+��f57B6���m�Q�q/��d�J �Z�M_�똍�7�y�h�[�C�Ir�jP��v�����/%c^㝔fD��Z��~�k��5�X.�f�[�6�����h����{ +t_L�a�3ƨe����0�?u���;E��´�1l:L�1T�F��`��V[��O�Qo;�TG��1ïQ| +�v�[��5 ����t����qǖڴ�.�`S>�7���`���w����XG�,UhP0([��I :�Z�ht#MyX��4"SB�D͕ά֛N�������j$'$ԫkwzK�y'�T#^�LGL'q�x2/�\H�EZް��lVa���uK�Nk�.�(�]��d:&1��y�z?�1��t����2F5�9���ZEG^���@Ag<$��gn(0 �j�3s�t����͵� �{($�hmL~vv��.sU7rm檪qC��N��g����j��|�^8�}u7����|��w�b,���L�) +|�)�#�Ϝ��DF��"&+���g&b*��ʀ���B��GX�@WkM m46�;-��bi� R�H�H�'~��zh}���jw���f\����m��s��Z���{���5���%$��|�D��T�:sW�o�n��n���9�Ӥ)6ّ �u� �;�Jb���u,�?N|Uv+��ve"d�$粪�JC�Q���ey�M"qnn����?�3�]�W,�?W��pH)�$E��ц|gvs��,�r������gg���1ɔ.�1֙-���Rb;��uV?�*D��Ig{'�{��ͮcF�ڀ �ŁG�>�8���P�#2C��7JX�(��ǀ��R�cC7�Z �D,����BZȲ�BG�'� {s2�NZ֘::1���MuC3{u39N������T_��Ų(��X���+����J�,9.��<��W�9sD��qdI����e��N�ò�ٝ���̰V���.��LϷ]\]jƖ���Cij-^̍Q�]�!�drf�U�{�-<����0&}�l����]�fܒ-$��.Z�dT&!o��]�ՅA�PO�l!��݉�FS�Q�.�xP]Xq�����au�N`��:�sZtɬ�J���Օvb��⫹3���:{��*�ҙ_˦��K�ΘkG��1`�� T �0!� $ ,Dh@8 ����1���3�T���k��-��H|e"�ς���J���-�Q��镑U;$�1sy�dhLi̚�y��ɟ���YQ����1���)#�x�Ұ��nw�8���y2��!�qW����WQh��P��JHD��Z�u������� �t�l�q��A�\�T��дΔ):�y�=��Uij6�8жs�"!��7%v'V����]�"��͔��R�1��:N~���㰑)���쓲�R����š̨��T��J�Ϙ��íf]Kf�Jd�|M-u3rbª!�T���u���P�H��݈�TH��i�SM��v]�ֱw��r�fd2�uuv�ؙ�d�N������4�D|WB�^lh�QR���̄F�!˘�x���Nd7�Hhj'�`���^����(�A��!+�(�i#����8g:;=�EN=�n���gGe���|O{��E'���PgT4�َbcw�Y�qRt��@&�߸}8������|��N�T�Q��~6e�d:r�i�2�$�����Ds���U�w#U���),���*Rkڢ�ϗ�)��<�N䢳��n�8���dT���k�Tcxp�H�š��p�蓞��p$}�xe"��C��_��N8���43%s�%[�d¢ۄ5��V�W���m�57�rf]��?�̬������?���p� +(0$ X��$���D $L����!��� ,L��!B�A"8����!\>�P��H����$,,��$PX�@�C�`H�1d�T|S}-)�����k�ʻ��0@8�<��ߖ�Twb��$D``>@���q���0�%za�������s��͈�bw��#�MI�]��hnگ���?N�v-[K��c��k�*SSΘ�6���G�rݢo�:��wTv'������;���E���q�Îu;InH(B��n���L�9w&d�u����X�H�XD�(�WL��o���������&�t�KD��+j�r�_�"��ܚ�&6K�ë���ȯ]NJ=9 +ݚGlm�T��&�����Y�c>�6�X��>:��#Gr$9����W�J,��;譏Y��}�kKDe�����w��"�������k��֩6�h�g��>���52�.�Nc��ODHc܃��K��z,��RӅ�ٴ���\��G�\ٲ�ݑ��L$��EJ"��?r1a�ȴئ�vUM��\ y*R뾚�~(7��XYD��R�f���\����Q�T#mՄV��L+ƫ�XS2��P�a݇�Tӹ+���|��z�����b���9�b~�TI)��+�5 & +V/^uP4( eV�L��������ܵ��@�H��p��"��k�"�A�� ��D�Ҡ,�"��<'"C:��MB&$��43�ca�Q������P01,ʢ���~H"80& (� It5H����@����HB�(������]�^c�6%6/E��)6mZ�Y��F�p��-%�r��(E0%���6�lŪ��r�e�6�Tq7����^�l��&��bK�t�;$YG7S�0;���Yԃlbw�]^ ���n��z��@��M�I�j��(I�f����8�?��"W�v�J�Q�u��X�$�{�!c]ڙ�-� $-i�i��Owh2ؠ�e7���N�F:�2P�{%�<e`"��2$��?��U"�i�g \Bl�+�JOh�Y ���C�0��V��(��Pޕ�ڗ��20��e� ?�wZ��3�D��϶�xQ�� `z$ѯ����⒩��;3���y���^�7 /s�7�*�e-������it��3Fx[3�?[��{ Զi\B���f����sD|Zx�4Wg8#V|��A#Yr���ze����b�_`��g @}���㦞��,8�d���3�?$A�g�5p��?���4� ��� h���x�B!mpbd��$�jN�8y�9h �Wah�]��X�W�q�2�_��'��n4��#�ׇ�a�)�Ѱ)ǒ}֢�R��h��jV���G�H��z�60SM�h��|�`���(NIBhħ3H F���34$9��3��-�K,�������25ԉ�2�d �a+�n�k���S��@jlհ�5��Y�_5��:#7�9�UT������jpI�ἴЫ���� k(2?[�q�z������p"f�M�7�t�05(�Z�W^��Sc�\��|H�Z���V�ZFY�?��,��'�PJo�u l��ë"�l�<'riŘ������4�8h�6q������"��Ƕ�L +���aŸ��P���e����tKAO2����A[(�b��s�P <UȈ���o���4z^7`���W���4��� ~05����\qy ؐ<t��j�-t �����{mg�W���aꀍ��o(��bzM�7������+�[��7@J�`߰�t��Eಈ��a�$��o���� � ��o��|k��$��q�|:d�[K�n�S�@����M�C�h/uxk������v�.��%�;8��$]��@V�VR=p!�%|x|�\|0k�� ��A��x�~��x�X[�@��X�k�A��n��A��p$����A�?��>��jBP�E���DB�>��="��Bpw�BUb}�؋�O��������Ev! +������H�=��}�r&�Q�"��YD�Qg�>A�*�є�dW���I,"HK�H�όC F�VTt%n]´��I�L���p^f�kF6AI X�[L�3άYl��`"y�R��S�3_-���2�V�*��_�#̈́�� qS��|��"AԑEh�;�?a��0�v"A�&�2@��9��2�d}6�&4���<\���d���&RM����B.ؙC0g�̹D0��<.��(o��%�#a,i +æ�o�f��oBH��X1����cK�c�'g���y�MCj"q��r�� +1ʓ�c�r�V�9sޜ��c�;'��:!����M'Fn��� �2~�\v�WeL�N<X���"c�;�u�� �KFU<!G�Ee���0�}�xόy�ı3r�T�Ɩ{��4�P-܉��1�p4V����#�4 +�b��i���j�bMktT�d�gA�lTz*�gc-fl�*�=���Ƣ�L��l���@���WlL�6{�W &,���C�⾯0�ץ9'e�g�O��<������u�>���'ky��ʢs�Zdi�+[]N�,>�`c���<�,R�cg�Y��輒��E����g�?���vgᨕC�Z!ܳ`,���g���h��3�Oh�33O-^���1Zx��,r�����aq8i1g���q�MZ�3 �<](-p_�����I�8-�£���p�{y��N=G\�����"҅��vc��/��/}���,R���/`�m�^�'|a4|�b͵m�$e��X�`g3��|�~�mpN hV6�w���İT�';��`�d�1j�`�(d��#��w��'���u���a_z�8zp��J�/V�Ų ����ʸ����U�A{�PS�E�|�Qɞ!(6�u)K�l,6��8�����N��D��ﵰ���[��U������26�����6�j�DG�\H���IMn�>�w���d3�z,�����U��;���Z���-�d 1���&��P��V�D�#{_��]&�������%�E��"}+���+��e�S �(V*TI��������`~����ZⷢG:�㳶��B��g��X?K�Y�bg@��8bS�l�36�[����vFQݞ:������t�1Y����9����Q{V��� +hU�.�����zț6�I�զ��M��� �o���� z���*n����no� ����fmAC�.�q6,"G $�M�j��Jyh�%�'oa� N� *�x����-�$\�9K�֪K�[|w������.>����~�1�˩6��� +�=�.��#&3�c�12�.7������pZ�2�|�c-����!q�#�R������������ct�0uJ*�KHJ�:�DB��O��4��E��J��z|�"�>e����G�3}��YM��7��`%�����9��0�'����1���Lx��� +,9���Ɛ����5I�f���CI�$�C����!˼�����&a���'��2xz §�p_q�;O�����P�� +]�A������'\�*�OMe��a����BO�2e�ee0Y1No���\��˷�j��V~<,<&�^�Gbli ����/���R;�GT]�U�Al�R���P��8�`}�H/�oY[**���c���y�o� ��\*��є�6�Φ��=메{:Ќx�p1�e�(q����J0��ၚ +�Ác��s��� ��2��)��vF�Y�7@�d?*����*�gN����k�,�S��Q;�m�e������[�l<k����&'PC�a0����n�+(KS���PZ�V�aC3�{�g�z���3i�J)�C���� �Dy\��3��<��:D�b]/1��lҳ�H�*���(��N"�#��^S��9��0�p#3�H���O��Mh��-��\�&BK�]�� �������P��/ Q\���D���}����@� ���i�� ��e@�����R:�c���u���Z�ӈT�Nc[��R"n2����G:�K��"JD�Wݭ��8��F�ɀ)�ʫO�|+^��^�n�r��`��ۨ��A�f��%��s 7�JW�٫z�\�y�٧�`��~����7��d���ր�ͦO��Ai��6�nXW%J֓�;-t���Zb�:��Q6��[�?�sY�{>V�]�4�@�uFq����Ds + duĥ�WC88e� %�!�3~��Ek�C�!�EI+����:�Ġ���\�XY˹�� ��F�=Z�� Z��~�rܕ�t^;�����B6�J�X��V8�=��F�����.�4������!ߺp�U�ۜÿ3���=���T��Y^N��� ���σ���YR��B�^js0o�p�� ����O�e�Da~��}�#���{��R�|����f�o����?5��lQ"�aހ +H�0_BOÁ0��U�$u �s�4n��$̿4�3a�y*ߥ^P�/X� �=�jk�`m�¼6�H�m��^�Ѩn�-Jx?m�O��V�yP0� l�?\��� +���y�Xh����Û�aj�.��ʅ���B'1�[j�8}.�=>_P��B��d +?�5�a^xhb��A� �]P�$���t.� ����{�N����.:b��G�����@��nsqmV�R��/Kx�Wh���4(�,�'a�,{8Z��ےU£����]�b>Gt�<��Eu7�2�%�{����®�h�)R��$!�~����h�Ds0e[�����z�l�mv�ٲ~Q�c�F�-�� + Ӌr��F�w��\p-8����?���$G� ���x���7 q��� �0�ע:�%�n2�s��/���� +�{#9GH<��BY.Oɽ�.�"���jyF&w�U E&�iL7rO�Gʼ, ����]C��jX����J�����T���}8�: ��W.Q�����(o�\N ��Ή��%�F/ +�0�2c\��$�f`�:3�r-����h�3 ��44Cnf���$�ܛ��a�/=��� /}�+�Xܨp����3�i�Uhr�6˥�p6�r}3�b�^NN q����Cp��\�5GS�fWs� +_�� I�-\��x�8r�\dCT����S� Ʌ��HL��<�M�%Ka���-;��k��?ܨk'E��ո�Z�{��`�����?r�������k��2J����H�VrLmW�� �@gk�t��e�Z�)ow�\v,�k.�J�| ��6T�:�-��M��f�u��7��Y����$n�&�wA-kg����;Y�6�'�D���_�������*�}�yꂒ(X��=gM�Θ�͟�i�������mW���2����r�HY�~�H5S,FrWV{�k������U�4��sx|�՟����v��A����ͦSm��7<�����}4�}o�!�� �������� +��A��ˤ2��BS;��9^93N���+r�i��j �q����b2>5S���������]R�I(�D2_b�J�!�@��yI������$��NH�WV�&�nikI����%�Q$.�8�E$�]�* +�쒔' �oA�L��-�h"kQ +iSh�l�@�-�FRe8�&�e����A�HR�S�:&-�i���#�Դ��^��-6��v|FһW�f�^ů��(�z.L�`�gٰcۨ���AE��G$Ő���"�Tg�'6P˓p�$�ʞ�T^��4�yY�p">Y (f�RN)V��"���T������MARb2b%BF�W ��� �H|����ǒ�G�ی�~n�H���W�����W&$�n�l���V���Z��m7ȰJOi7�\پ��|4V�ݴ��e��������1����?2�rÁ�P�#-�ħ�T{�;�W�/2�<'�+�}= w�H�ˬ�^n�y��؏�����$A<�G�͎��˶��p������<(E��mxվb/?҉\�V�$��=ެ�a<�5ia7o:dN�n���K���O�GZi�c�EVq��#m�����7Հ2�'/�P�F������0}��U�<�Gb;F���n>���v����6�1�j��H�,a�`��$?R�����L�B�5�(]F���#!*$K�+͇�GjV����.�ix]�W�~$���r��z�խ� 5~j��·z��kw�S(�<~��-B�G�/l/%��!�#�5(sE���nO���#�Y�^��7�=��ua_lF�s9�v�G +��W��UB�J_�>�� U�������5'Г�%:`#M$ $�?�� �KA�Q�rng`�]L�&�^q#��F�C�����G|�cmؑ�Tp��:�$��#ji��$u���)��y�@������S�-��C�x��å�ԯ�&�zp%4$e�4�b��'���S܆$�Ԍ�%]#62Jh��}���I���m�k4I���f��De�VnrH#"�m!��h�N])E�F�9&���K{Hd��rGz�$~��j*!i�9 V���!i���B��D�?�~��;K +I�縪���:$7�`�I��6�i�3���r '��~�s9a$X'�W=�.�)$�.b��2�h��B�����! �L�/�GVڑ���Ϟ�I%�!OS�B&��}E�OtN Nm`� +Il��"� I9-Y�Al:vf吤��_3�Z�b*%a�-��@��z�oTi�.T�6!i�eo"k�I���<�W@`�� ��1 ��B�V�i!�#I�t�$�p�����$��ބ�T<? ��������K��˶����W$��� ���]�r�?H\^�,&PftP;����Nf^5��tU����q$K6��C��������w�=��o������01�Lip�p��J���|H3���O ��ت���u�k���iIy����X�&��i��'�l�`������-.������[����$w�F1 �4�)�h!���$uv}����5iq��6p��+�����H�|�)o�0��I�A�OB��?�7�?PBKl�Q��Ob����� P�=A)ՆU�i�Z��Jx�\:)0��x?!k�4kRT]�����T���UiѥDc0 ��@�h�G �9pc)Q2E3)(�F9%���}5{tJ�$�;���~ Ք#�ޥ�J\p��W#���JFIۯ�`m��̀/QZ%��N�5����Ȟ ̎ʅ�Tf��T}��ԁ���g�D��V����op��E +ˈ��iqx�aG�јQQ��3�����y�%sW+����h��B�|Ӄ�7�!$t�J5T���Y#��R$�%ٴ�����F�P� +4K�c��Ś�z���9G���b�5��s���j%i�2ӳF�PU�n�D@mt�.�>Ƅ,>�3%�+e��܊d;0��M�P~�S +�#����qa� ����I��~%� endstream endobj 12 0 obj <</Length 517>>stream +T��m2�.��9�p1���% +�:7@��N��� +Y�)w���ϛ�� �]��%_����~�\���`f�$84�W���"��^�N(�����ɓT�C +*����/sY�N P�[� +bMk�lj�ȯ?��p�*��@*� ��j���dJ�l���e�@}�>1���<Q��p�4$�u�Pu�������oѽ�R���6B�i���f�4hiH���LI��� p7��OUy*�6yeA��-8Fa2#o�����2V��_\����E;������O-րJ�\��@�]Χc�L���35I<�n +��f\�����Y�DX�A,$������Zq�}����Tm�M�&*f�\5�����iE�V=�K�ҫ����)�[W�b+Z��W��4���hPD.O ��6< ��d�eSq C�s�đ�����#��J~�@,�x#g�7��5q�]xzZpR�@��bi�\v�/�+�|��1 +B&�-,%%�xb>�)�B:�U4a�k.w�� endstream endobj 23 0 obj <</Intent 36 0 R/Name(Layer 2)/Type/OCG/Usage 37 0 R>> endobj 24 0 obj <</Intent 38 0 R/Name(Layer 1)/Type/OCG/Usage 39 0 R>> endobj 25 0 obj <</Intent 40 0 R/Name(Layer 3)/Type/OCG/Usage 41 0 R>> endobj 40 0 obj [/View/Design] endobj 41 0 obj <</CreatorInfo<</Creator(Adobe Illustrator 28.7)/Subtype/Artwork>>>> endobj 38 0 obj [/View/Design] endobj 39 0 obj <</CreatorInfo<</Creator(Adobe Illustrator 28.7)/Subtype/Artwork>>>> endobj 36 0 obj [/View/Design] endobj 37 0 obj <</CreatorInfo<</Creator(Adobe Illustrator 28.7)/Subtype/Artwork>>>> endobj 30 0 obj <</BaseFont/RGWEDU+UrbaneRounded-Medium/Encoding/WinAnsiEncoding/FirstChar 32/FontDescriptor 42 0 R/LastChar 83/Subtype/Type1/Type/Font/Widths[279 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 269 0 0 0 0 0 0 0 0 0 626]>> endobj 42 0 obj <</Ascent 1020/CapHeight 724/CharSet(/space/I/S)/Descent -304/Flags 32/FontBBox[-667 -304 1570 1020]/FontFamily(Urbane Rounded Medium)/FontFile3 43 0 R/FontName/RGWEDU+UrbaneRounded-Medium/FontStretch/Normal/FontWeight 500/ItalicAngle 0/StemV 112/Type/FontDescriptor/XHeight 572>> endobj 43 0 obj <</Filter/FlateDecode/Length 1101/Subtype/Type1C>>stream +H�dT{L[e?�{T(�0J{�d��:f�� lc�cQ�IL�����`�Eg�b&3�qT؆�ɒ��B��92-������,Q�sʎ绽�P�_�~��;�w�s�ǁ*8�3VW�Vl�~����:��:��w�]k��]ގf�Ϗ�p�LUԨ1,���6�����ƴ>�Ԛ��Qݕ �T���鰈��:�Xձ���.�Q�n�U,��;�N�� �w�oS����Ѱ�]ls���:�.�X����۴Q��=�2�g�v�3`��Y�Zw�F������ڭ��[ܢ]t�=@�`�kKXH�����m�mC(O_@0�U!��0�Lc�=YF��t+V��nŻ���=2��?b����o����}%�ʙlɸ��6���5/cĭ{���ڷS19��Aq5�ֱj��+G��͈���&l6�a�c<��#�gbW{����B|�I�-:�Ȁ�s�����W����+�uO���.~���x?�w��Ғ�x,t*�:(}1� ��ux���|{��R���8PBԧ/�:Ж���W�d�^�u�h���">�@�̮�)���ew�L��zti���}���~����QA���e�A��>���R�M5�M)���Lʔ<$���M��_h>��<�����8t|k�o,A�1�g�=�M�W�_��y�ȓɼ����%�ܹ���*C�O�]�n����!ꦄ~Y�:��OS�p�4|�s�����������ᡡ�yQ%��C>S7�}�%�� +�M����+�e4���v����;+��������ɻ�j���@���L���=f鍿�eJ���fG��BXM �G�/P2B(�?��`�>\x��0;dBȽ�<���!���Q��n��y���F"��e/kV�=K":�����2&!��Z��x����d+1@*1�@����ן6���;��X�*��*M����v a�e�㟖�@XG˃_��&�巀���Vz�w&H4��5��=�d��d��>O��+�k���ݟLc��ק'�Y�qJ������~�rC�C|���`:�5+^Ф\J��)�i4�z�������������mJ�/ endstream endobj 29 0 obj <</AIS false/BM/Normal/CA 1.0/OP false/OPM 1/SA true/SMask/None/Type/ExtGState/ca 1.0/op false>> endobj 34 0 obj <</Filter/FlateDecode/Length 996>>stream +H��Vˮ7��Wp� -R�mn�"����.�0�En����~%ۣ�M��0�i�<<����':� +���'��r�G����Q��iQ�Ƣ���v��9�翷��C���T��JZ���+]^6����&�7bk�K�/8R�0.V��$I�H��ֱ�c����a� +1�?�������8֦J(�1����M�A���� 5D�,9��U���JM��z�$%G� � �#�"i�'�:e���MT)wI�;X ���Zwu��VI�Yg�B��+�#a�ƪ;�6L��lMR˄J��� ��X� +�)���+T{-r��=É.���^�q8��1@䚑!�a]j�u��K��(9���Fqp�gw�.q� Р^�4�;D0Q&���<�e/��&�����t�hO4����cb�]T���+*�ri����YG�y�1�H�3��hXHm���cM��,�Wq��Q��ѣ��Ǯ.�lq�����A�b�h�)�r'�-�.�GI���y���[%�� K^+2��z�'d���OڼRI|t���°��R�R�k2��luF��:�� YE�>v�iD��a�X<UK �!#�9ʨ���0�O7�Vs�q���"7�hyH��z������1TaR�9p��F�"�j�R}).:����ZA������w�KE��^Q���;i��^h�o�F��7;mv֬��9�G���^i�G��Jޙ�G���^��G��J���G�� ^)�G�J"^Y�G�,ZIt��B��A+�xa/�t'Н?}�����b�����a*����@,�_)�����:¼�0�s����<''��.�ãG���������zȘ҆A<�x���֊��փ%��8��7-8�9�����G��m?�?w�Z�7��t�߽�O���������M���v���Z +�ݿ��'��w��<���=Ϗ�ۿ������������7�D endstream endobj 33 0 obj <</Filter/FlateDecode/Length 929>>stream +H��M�7��} +��U��fdeF9��8��;��^Q#����`Z��d���W�^~{ /_S���k8~���� +�s�V�ۑB��_x����G�z�8G )�����������S����- �? ��ZK Y[�5\��94� )�`���h�3�.�)l॥�#HKx+|��c R9p(fɈ9�T�̀��!�#f*�����H��lY���Zcz���1*g[�x���1cF�@�Ę�S盱�}T���f�T5�g����4��3����K!�6C�\�uÀfKEq她����q�V�aEU�+��,��hfP�����]>��Q}�[� ���Q�r`��Nn�� W��e�4N�4u].��*L�9�41=m����F��K�� �1#7h�D�l��ƍ��s��͝��;3r�Fvjd�F�����ɑ3:��#;<r�Gv|�Ώ��� ��3C�C$;Er�h�h���І�F��lɆН�@7~6|��,x����]�l�FN����n��8f�?���k�Z���lC���,�w���������o��>mVJn�#��(��C�2������ѿ��V�Z���^�_=�|��X�$�]�s'�g��b�Yz�{/���Y�goԏ.����#8h^� ��v����h�n������ 젍�1��D�QlP;�"�b��p�� �5s@��5����-� 1�_n3-�q�pE�{Pq���i_��������It��gzgq�Fj������'�2;��K�c�&��`U(���̣�\Jl+���(:�D8U��Ϯ���J�w~on�䉅���[�<�`�nt�!8!T���0? ����v���觟ŋӢ7���T7u��S��l���^n,k0{�q�F�˛uE�_��@ym�����t������������(c�� endstream endobj 32 0 obj <</Filter/FlateDecode/Length 997>>stream +H�ܖˎ7E��Z&��������0�i �,�����"��{�~��@0����ȫCU><�����^���7�q9LS|4�4}݂Ki�/�~�~um���]�=E\S�������9��o_����_J�.��[q�����-��$���7�W<)l�M#��R��N2�s�I x+HK>;)t�����dD:h�!�F��<fF�;�<��`dM�4l��1�V�גa?m�p�ւQ�����#d��9����l^�����Ui���3��ͧS���f��m��X�6�CՙE��s�lç�R5w䇊蕓eN1�L��&%�n����҇6���<L:$�AH�$�rڰ?��n�� Wx�)�TNi�T�Z^�h��0��p�����ӫ��B���s.��2#WhdG�,��\��qs��F� +͍�C#+5�b#{ndGn��Yّ��#+>r�G���J��ɞ!Y!��"�c�R�B�ghAh!hH�dA�F��+?>gz&<�_��j]W��BN���0M]ξ�|_��لY� ��l���(���v��~�c������|:��r����WW�0����&0*��(u)eoO�r��n�c���w�]�~�����[Ku�e���5������Ha�S���'|Cz�����d� �A�h}]�����«��J�KǺ�|����,ڕ́�3wih�LpT@�<�}w��VǗ�gkG��͑'�HGX�uXq� �B8�l�+��P��c�`���)7�M��2�P� (�k�g`�O8�H4w�5���h��?+��6��Ƙ�����.� ��=�d�B5ѰP����� +�0ʔ��Dĵ���f���"����c�K +N���Ν*��J3�\҇<�6A�:_��Q�h�Ȕd���D�[�8�F-�.L��0�����;�o��i��x�y��?g�X���_y8�d-�q�/�O��=�|�s{s��+������������m� endstream endobj 31 0 obj <</Filter/FlateDecode/Length 927>>stream +H��M�7��} +��U��fdeF9��8��;��^Q#����`Z��d���W�^~{ /_S���k8~���� +�s�V�ۑB��_x����G�z�XG )�q��>^~�=���߂��? ��ZK Y[�5\��94� H�7{P$��!v9L�`/-��$ -��Az�%H����%#� S9�2�;�h���P��Ϧ#Qd2�e�G�^0�k���/Ǩ�m��i0�&ƌ��c�O�oƺ�Q�)R�H�i�3Ӡ�>|̠#��/�X��sA� �-ŕ��j+��ƥZЇqTɮ�f��*��A�:|xv�Sw���#F�n(7jF�ˁ��28:�U��7\1J�Q�8���8�u�в�0�������察�O1�K,��'d�ƌܠ�5�a#7�Ν�;6wjvh���٩�9s#;8r'G���Ύ��ș��;?rHv�dGH���������3CBA;@�$Bw�n�����ҳ����G�w]�a98�2K�`��R������2�!�j��� �Z*���]��W�S��?Կ ���Y)��4�Ϣ�kI�����kL�F�VZ]k]��;xy~�0�9�c���w�ϝ��9��f�|FLs�fŞ�Q?��{3[o�� �y-6������f�%�e(�Z��'��6��\��a�F�]@��~����9���7���-R���J3T�P&��S|��X�8�v�5�A��Z@�ͦkm1%�fi���b����☍Ԩ��cO�ev�� �ǔM�C��PN��G�!�6�2�VL7�Qt��p��Ek��]Q�+��d���ܶ�+�{��9x��,��CpB�z��a~f] C��M��O?��Eo�7� +,�n(�*w�.C��y���X�`�r�j�,?�7��b�J3�������������������������� endstream endobj 28 0 obj <</Filter/FlateDecode/Length 5499>>stream +H�dWˮ� �߯�:@����6N�� ���ٌ����Tu����awK�"��_ۗ�����?}m����||���{���|�Z�"z߯l�����?���_j���߰T����,�G��G�P���k�s�-{�f�^���wϿ��k�_!A �e�5���u��,�0��h0�%��M߽=xk��ŧQ��=W���[���� /�2Vu�|<y�h�T�מZ���0k�7u�,s�`���M�wp���{�g�M+�K +7ϲ=��|d��gՒuj=��`�#rFqs�<<����XZ��+Au�Q��oi���z?��_���?�7y�e����ܭS��'8~���1��%�V�R�9e;u����9��,�-�dη�|0F֤r�kK"�t�0��H�[T�w�t�&4�g���/XqL�rO~�F�&�H��I� +m��S�D����I��nI+(â��)k��5]���Z��ZeIa���Zإ��+�`��6$=����|�V9��>-��m���"*;ME��c +h[�x�S�Je��OX�%%�QF$�q���j#w�w��H��߷���c7Q�,�7�vI +��'�FoO�o�(ef.�~�+$?Y�G���$�%�1dpF�4F4旺A�2F�~�'����� 2�����y�\ +ߒ���X�V�� �.���r�4�)^��U��V�$���@���&@�E.1��bz���q�pC;��x�&��X��>S:16��Pa�=Xx*d'a�ҍ�h۩L���z��\���m��J^��R?�HS� +bn�3i@�AW���G�緸����u�["��W��E�/� +��z�(U�}��O,�����STM���r�)i/�;&���3+Y4���֩Z��A�8����f�Ǝ~[%��\�:Kt��$$����rX���N�V�תڭ!�:��W����j�2r��oY�����*����HmG�p ��O�����{�5�XU�c��"Y:�?�"���J��T{��Ϋi�W'a18�1�H�P��gT}y��Y���=ɢ +�y�G}R�����h�O��YX����K�k�s�*�%M���t�ۘ�^3�e[��shk�*�t9(�w�@���C�d�*�j^pw0������F2�r�m���P�]��;�MM�5 ���O�X��K���ywyyVo�$�kBHU�3т���i�*�ۮ���:�I��Jfq�gӷT7��'��T������ +v�@�Q����>��٬�����dJ���m\���\Y���+�C�����x��O94�-�i��N�O�P�l!�H�(y�\�5�`+�����*h��������[�KL%�y�q�+�.�R+���G#��vF�p+��a�/d����Dz�AOE��<�e�_e��Y��UP��U_�� 'x����R��@�믓oő���~�V��zx�W��'i�����i決t����箉H��y���Y4�>��DU<ѕ\S�GX�u��Q�2��V��^�BE�����G�ѩ �H��Ġ�����^�Q�DG]x�5|Lf�aڟSD �5Ք�0� +��j�P尚�P�����{P-҅)CYԧ��?�e��kzJr�ݑ$[Z�]��\n��ٯ%��4���!�Uo������*����5)X�~��P�I0�VcK][����KT�b�b�ӶB�L��������Z��TD�E���Y�mo��B%nF���e4X�v�dAp���D�jf4Z�?��U3���I����-k!�GMj�^3"��u{�y�d;� Vn��꽋���c�P,ԩYJ��B��Rj&���U�?��VQM�/Mʾi��� +�W+8M�<p�!z��O��^S}��j�:�]��J-��UNN�'��0��2d��"�6�`�u��Z�B9ۗ�����TnR,@�RN�K2Ckw�)�L�_���/\��>��������o�$B+Lσ� +�����u�I���d�ej*~���U������bygyuۚ�����O�_�>���M��$r�}���U� �C��C�������)�N9��Oi�N���.����K���W�e���bߐ��!�'c���9]Sg$���=0���ڜ}L '/� +�h� +��5{n��|�� o��N��4�Ty�h�Q3w=��e,Oȕ��X~ +�����neV��8c���Z�h�e�&�]1<�+̋��h`���a�ؑ�rv_��30#���a"";�b��'�{� u"�T���>�:,���J���(��H�\@�h�� ^`AW�4���/���{)|���L�����ź6�`���tN�?�YLJ%��x!5��klS��0|j&���˫%g��&P���`S�Y!Uۃl��_~>¢����)o1�k�^�j&��"��V�X{LsQ�5��U��#������Z�>�k����Լ�F^ϭ��!x�<�?�{����Y�;�9����PNd����-q��8ˡ%b��|%d��h�'sԴ�Na!G��B Dh^<�P�Z(�����������^NS��r�8��x�+]���P���v�&��/��P�K��JH�o�`7<MX��H�0��V�P�Z �(ٮj&Tg��v 6��N��p_�:�G��)Ɣ�^���� � p�2Q�(��^_�E������2n����:+322"���Ze�4�P���i�b52���j�9z�����%C��5d`��<�H�ѫ"�+t �[�P{C(�P��\e�DAk�\"x>.�T��T�VШ$c�����j��b���e��L�p�L�#Tm�ɂ<#y����a�x{L�,U2%�����}�����+%�6�`K�틒���g�_�˵�ؓ��V$�g��שJp�+}��ھ�+���:r=�pƲ� �� ��*��>~��5�>{LS�F5SW�R��E����Ms��(j�1Ϭ�ZZ���}��a��xF�#�&� +"j^�a*\���شm'D=�話v��>e��!ŇT=����a�~CG�$��iH,�I����n>�����p�,�9��ºu��7����q��c�ɼR�y�C�:I�:���jN��<�c�V��T̴�;��æ�Z)���ӫ,�L�֥ᮤv�a%W�+��c7呁���Ɍ�V(N��w��+14]�������.�p-���>_w�u��4�������="t��P� ؐ���(��D��E��B�Rż����t��>��U�l��ʆ�e�ʈ@�mIj�iY��첏��ÞO��blt�!�F��8V�����$���-2�'�?��5�}۽�Vt�+���Z��<��gXr,���T�k�z�wb%���PZ�N�e��[I��`�X�L}��{�#���� I��L#&3�� faf�o�������jy3R��i���� ж�B&����I�=�� +�[ul�Xq1q@` ǩ���m9���w�n5�Wz �(v�)y;�O� \�ba-\t��^V����p9nd�K+�Hʹ���������f�ip���@��Q�4ԥq�i79�Z%��>4S 9utV7�N,��Sc��PN�](�t�^ Ή�� ��q.� Ԙ<� �<�t�0�Ȁi�.��2��ٜ��[FY*e�H��&�:\a��� +Iޓ��c�L�X}C���>贎����b딠��AH��+��{W����]z��G3m*<��V�f���z@v�V@&���"��$wK��ul���%�W�L�g����G�N"����x�h��=%���E�"���%�����ȫ^ �Ɣm���Q�)D�.u:0�ذ�����ӭ����8~�vZZ�0��dCQr�j)z�:F�Py{L�Y�L�ɐ���䌬(}GG{�Y�[/u- P��@�ZT��>]�)_��R�u5�*�5�A�z��i9�i�4s�����M��U�31U�j�Xם+�3��0�#� ��')/�JK�.e�Qh4� ��5�Tm�涠���a�B0"2��6�md��U���9 +��ڷ��q�Ta� �}�ߛ +UO�sLX�^L�j1�;(H� +��$ +f�qz;���R�u#Wuې��2��{4�BF{��S����E����.�������v^��|�Q�Xyk���Zң쬔�yECԶm+�(����>�I���mK��Z��+�%q9<z�V�f1��s�����Ω���D"��烜��՛��[���P&١�=w�1ڬt���f-ګY�w{;k�D�)�3E�3�ʕ�'h�`�=�`���l8���j���7k��g�y�y��</��K�<�\2������)Ϯ{�X�90�}�l4 &4Lcd�NĽ��$�H��IPM�`��>G@�!_oڽ}?Qn %�����ǖ_����|�~r�d��o��*.N��O7s�P�63n����KMp�H����a9���̀�i�qtvC1+_ns������WP�a�0� ��1N��&�_���%�I5B�W���@h>��}`ƪ������-��aƵ�~�����?�}�ӧr��OZ�:N���������_RG}�fu��̮��w����ʯ9��ށ��-��5a�l��D{�G���8U�ފ:��W�'�=�Bk�(��^��*5��rso�eTH�h��?h��y ��&OV\���R���:�����厒̈p�Gs��'u��s͑��"܅u=d&�u=G��[L�*���-g� ��9L�,���N݄ԐS�Ri� +;�f�����U�F;F�P� ��������*S�� s�c�x����゛��n�y�� +�f�g�W�W�ϸ9��9�9��s\�s\�s<����x��x�qE�q���� +�㊢�FW]A��.�� �@聠w�����=�㿡'w�(��r�BUK|W���f���X��w��-���������߯��}����{`���:#���ZI�\kT��rgI��7.q���I�}R�[K�W�����z +��ם�A��)(=�ᥗ��M�/��6���6Z��<-]�Z���ٜry )s���.3��Fz+��뻵O���^�7������U�%l��B � +��������SR[,�j�PW8ݞg����L�ɧ��+#�ErR��>��"����1�:~��f=�뫗���Ny�G>�Fn�M*'���q��cZ$R���aG��l�a��R3:�O�m�þ�qY��٬A��+%�;�1+ ��BS*��i��0>��Z�� ��|a������HϷMt�T�"��Cz��;1�'�//߿}S�}���F��~}a��� +���7Q~N�{���F�m,��KY�����~��ǟ���ϗ�BG�������������U endstream endobj 26 0 obj [25 0 R 24 0 R 23 0 R] endobj 44 0 obj <</CreationDate(D:20240913161137-07'00')/Creator(Adobe Illustrator 28.7 \(Macintosh\))/ModDate(D:20240913161138-07'00')/Producer(Adobe PDF library 17.00)/Title(isis-logo)>> endobj xref +0 45 +0000000004 65535 f +0000000016 00000 n +0000000180 00000 n +0000028195 00000 n +0000000000 00000 f +0000028281 00000 n +0000000000 00000 f +0000000000 00000 f +0000031851 00000 n +0000031923 00000 n +0000032096 00000 n +0000033730 00000 n +0000099318 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000028694 00000 n +0000029068 00000 n +0000029482 00000 n +0000029856 00000 n +0000099885 00000 n +0000099956 00000 n +0000100027 00000 n +0000112008 00000 n +0000030269 00000 n +0000106439 00000 n +0000102201 00000 n +0000100446 00000 n +0000105443 00000 n +0000104377 00000 n +0000103379 00000 n +0000102314 00000 n +0000030682 00000 n +0000100330 00000 n +0000100361 00000 n +0000100214 00000 n +0000100245 00000 n +0000100098 00000 n +0000100129 00000 n +0000100718 00000 n +0000101015 00000 n +0000112047 00000 n +trailer <</Size 45/Root 1 0 R/Info 44 0 R/ID[<0CE8A94149614A3685ED787958388BD7><0E50F4C93FDA472D9AB1425F0B18F098>]>> startxref 112236 %%EOF \ No newline at end of file diff --git a/isis/src/docsys/assets/banners/moon-cr.jpg b/isis/src/docsys/assets/img/moon-cr.jpg similarity index 100% rename from isis/src/docsys/assets/banners/moon-cr.jpg rename to isis/src/docsys/assets/img/moon-cr.jpg diff --git a/isis/src/docsys/assets/scripts/feed2js/build.php b/isis/src/docsys/assets/scripts/feed2js/build.php deleted file mode 100644 index c559556428b3ce247fa06a2340dc8f3872d31570..0000000000000000000000000000000000000000 --- a/isis/src/docsys/assets/scripts/feed2js/build.php +++ /dev/null @@ -1,213 +0,0 @@ -<?php -/* Feed2JS : RSS feed to JavaScript - build.php - - ABOUT - This script can be used to create a form that is useful - for creating the JavaScript strings and testing the output - - Developed by Alan Levine - http://cogdogblog.com/ - - MORE: - Part of the Feed2JS package - See http://feed2js.org/ - -*/ - - - -// GET VARIABLES --------------------------------------------- -// Get variables from input form and set default values - - - - $src = (isset($_GET['src'])) ? $_GET['src'] : ''; - $chan = (isset($_GET['chan'])) ? $_GET['chan'] : 'y'; - $num = (isset($_GET['num'])) ? $_GET['num'] : 0; - $desc = (isset($_GET['desc'])) ? $_GET['desc'] : 1; - $date = (isset($_GET['date'])) ? $_GET['date'] : 'n'; - $tz = (isset($_GET['tz'])) ? $_GET['tz'] : 'feed'; - $targ = (isset($_GET['targ'])) ? $_GET['targ'] : 'n'; - $html = (isset($_GET['html'])) ? $_GET['html'] : 'n'; - $utf = (isset($_GET['utf'])) ? $_GET['utf'] : 'n'; - $rss_box_id = (isset($_GET['rss_box_id'])) ? $_GET['rss_box_id'] : ''; - $pc = (isset($_GET['pc'])) ? $_GET['pc'] : 'n'; - - -// test for malicious use of script tages -if (strpos($src, '<script>')) { - $src = preg_replace("/(\<script)(.*?)(script>)/si", "SCRIPT DELETED", "$src"); - die("Warning! Attempt to inject javascript detected. Aborted and tracking log updated."); -} - - -// check for status of submit buttons - $generate = (isset($_GET['generate'])) ? $_GET['generate'] : ''; - if (isset($generate)) $generate = $_GET['generate']; - -// update to full descriptions for html turned on - if ($html=='a') $desc = 0; - -// build parameter string for the feed2js url - $options = ''; - if ($chan != 'n') $options .= "&chan=$chan"; - if ($num != 0) $options .= "&num=$num"; - if ($desc != 0) $options .= "&desc=$desc"; - if ($date != 'n') $options .= "&date=$date"; - if ($tz != 'feed') $options .= "&tz=$tz"; - if ($targ != 'n') $options .= "&targ=$targ"; - if ($html != 'n') $html_options = "&html=$html"; - if ($utf == 'y') $options .= '&utf=y'; - if ($rss_box_id != '') $options .= "&css=$rss_box_id"; - if ($pc == 'y') $options .= '&pc=y'; - - - -if ($generate) { - // URLs for a preview or a generated feed link - - $my_dir = 'http://' . $_SERVER['SERVER_NAME'] . dirname($_SERVER['PHP_SELF']); - - $rss_str = "$my_dir/feed2js.php?src=" . urlencode($src) . htmlentities($options . $html_options); - - $noscript_rss_str = "$my_dir/feed2js.php?src=" . urlencode($src) . htmlentities($options . '&html=y'); - -} - -?> - -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" - "http://www.w3.org/TR/html4/loose.dtd"> -<html> -<head> - <title>Cut n' Paste JavaScript RSS Feed</title> - <link rel="stylesheet" href="style/main.css" media="all" /> -<script type="text/javascript" language="Javascript"> -<!-- -function query_str(form) { - - // builds a proper query string by extracting Javascript form variables - // so we can open a preview in a new window - options = encodeURIComponent(form.src.value); - - if (form.chan[2].checked) { - options += '&chan=n'; - } else if (form.chan[1].checked) { - options += '&chan=title'; - } - - if (form.num.value != 0) options += '&num=' + form.num.value; - if (form.desc.value != 1 && !form.html[0].checked) options += '&desc=' + form.desc.value; - - if (form.date[0].checked) options += '&date=y'; - if (form.tz.value != 'feed') options += '&tz=' + form.tz.value; - - if (form.html[0].checked) { - options += '&html=a'; - } else if (form.html[2].checked) { - options += '&html=p'; - } - - - options += '&targ=' + form.targ.value; - - if (form.utf.checked) options += '&utf=y'; - options += '&css=' + form.rss_box_id.value; - - if (form.pc[0].checked) options += '&pc=y'; - - return(options); - - -} -//--> -</script> - - <script src="popup.js" type="text/javascript" language="Javascript"> -</script> - -</head> -<body> -<div id="content"> -<h1>Feed2JS Build JavaScript and Preview</h1> -<p class="first">The tool below will help you format a feed's display with the information you want to use on your web site. All you need to enter is the URL for the RSS source, and select the desired options below. </p> - -<p>First, be sure to <strong>preview</strong> the feed to verify the content and format. Once the content is displayed how you like, just use the <strong>generate javascript</strong> button to get your code. Once the content looks okay, move on to our <a href="style.php">style tool</a> to make it pretty.</p> - -<?php if ($generate):?> - - -<h2>Get Your Code Here</h2> -<p class="first">Below is the code you need to copy and paste to your own web page to include this RSS feed. The NOSCRIPT tag provides a link to a HTML display of the feed for users who may not have JavaScript enabled. </p> -<form> -<span class="caption">cut and paste javascript:</span><br><textarea name="t" rows="8" cols="70"> -<script language="JavaScript" src="<?php echo htmlentities($rss_str)?>" type="text/javascript"></script> - -<noscript> -<a href="<?php echo htmlentities($noscript_rss_str)?>">View RSS feed</a> -</noscript> -</textarea> -</form> - - -<?php endif?> - -<form method="get" action="build.php" name="builder"> - -<p><strong>URL</strong> Enter the web address of the RSS Feed (must be in http:// format, not feed://)<br> - -<input type="text" name="src" size="50" value="<?php echo $src?>"> <br> -<span style="font-size:x-small">Note: Please verify the URL of your feed (make sure it presents raw RSS) and <a href="http://feedvalidator.org/" onClick="window.open('http://feedvalidator.org/check.cgi?url=' + encodeURIComponent(document.builder.src.value), 'check'); return false;">check that it is valid</a> before using this form.</span> -</p> - -<div id="badge" style="width:250px; padding:0;"> -<h3 class="badge-header">Show n' Tell!</h3> - <div align="center"> - <input type="button" name="preview" value="Preview Feed" onClick="pr=window.open('preview.php?src=' + query_str(document.builder), 'prev', 'scrollbars,resizable,left=20,screenX=20,top=40,screenY=40,height=580,width=700'); pr.focus();" - /> <br /> - <input type="submit" name="generate" value="Generate JavaScript" /> - </div> -</div> - - -<p><strong>Show channel?</strong> (yes/no/title) Display information about the publisher of the feed (yes=show the title and description; title= display title only, no=do not display anything) <br> -<input type="radio" name="chan" value="y" <?php if ($chan=='y') echo 'checked="checked"'?> /> yes <input type="radio" name="chan" value="title" <?php if ($chan=='title') echo 'checked="checked"'?>/> title <input type="radio" name="chan" value="n" <?php if ($chan=='n') echo 'checked="checked"'?>/> no</p> - -<p><strong>Number of items to display.</strong> Enter the number of items to be displayed (enter 0 to show all available)<br> -<input type="text" name="num" size="10" value="<?php echo $num?>"></p> - -<p><strong>Show/Hide item descriptions? How much?</strong> (0=no descriptions; 1=show full description text; n>1 = display first n characters of description; n=-1 do not link item title, just display item contents)<br> -<input type="text" name="desc" size="10" value="<?php echo $desc?>"></p> - -<p><strong>Use HTML in item display? </strong> ("yes" = use HTML from feed and the full item descriptions will be used, ignoring any character limit set above; "no" = output is text-only formatted by CSS; "preserve paragraphs" = no HTML but convert all RETURN/linefeeds to <br> to preserve paragraph breaks)<br> -<input type="radio" name="html" value="a" <?php if ($html=='a') echo 'checked="checked"'?>/> yes <input type="radio" name="html" value="n" <?php if ($html=='n') echo 'checked="checked"'?> /> no <input type="radio" name="html" value="p" <?php if ($html=='p') echo 'checked="checked"'?> /> preserve paragraphs only</p> - -<p><strong>Show item posting date?</strong> (yes/no) Display the time and date for each item.<br> -<input type="radio" name="date" value="y" <?php if ($date=='y') echo 'checked="checked"'?>/> yes <input type="radio" name="date" value="n" <?php if ($date!='y') echo 'checked="checked"'?> /> no</p> - -<p><strong>Time Zone Offset</strong> (+n/-n/'feed') Date and timer are converted to GMT time; to have display in local time, you must enter an offset from your current local time to <strong><?php echo gmdate("r")?> (GMT)</strong>. If your local time is 5 hours before GMT, enter <code>-5</code>. If your local time is 8 hours past GMT, enter <code>+8</code>. Fractional offsets such as +10:30 must be entered as decimal <code>+10.5</code>. If you prefer to just display the date is recorded in the RSS, use a value = <code>feed</code><br> -<input type="text" name="tz" size="10" value="<?php echo $tz?>"></p> - -<p><strong>Target links in the new window?</strong> (n="no, links open the same page", y="yes, open links in a new window", "xxxx" = open links in a frame named 'xxxx', 'popup' = use a <a href="popup.js">JavaScript function</a> <code>popupfeed()</code> to open in new window) <br> -<input type="text" name="targ" size="10" value="<?php echo $targ?>"></p> - -<p><strong>UTF-8 Character Encoding</strong><br> Required for many non-western language web pages and also may help if you see strange characters replacing quotes in your output (see <a href="http://jade.mcli.dist.maricopa.edu/feed/index.php?s=help#chars">help pages</a> for more information).<br /> -<input type="checkbox" name="utf" value="y" <?php if ($utf=='y') echo 'checked="checked"'?> /> use UTF-8 character encoding -</p> - -<p><strong>Podcast enclosures</strong><br> For RSS 2.0 feeds with enclosures, display link to media files<br /> -<input type="radio" name="pc" value="y" <?php if ($pc=='y') echo 'checked="checked"'?> /> yes -<input type="radio" name="pc" value="n" <?php if ($pc!='y') echo 'checked="checked"'?> /> no -</p> - -<p><strong>Custom CSS Class (advanced users)</strong> <br> Use to create different styles for multiple feeds per page. Specify class for content as <code>rss-box-XXXX</code> where XXXX is the value entered below. Style sheets must be created in accordance with <a href="style.php#2style">Feed2JS guidelines</a>.<br> -<input type="text" name="rss_box_id" size="10" value="<?php echo $rss_box_id?>"></p> - -</form> -</div> - -<?php include 'footer'?> - -</body> -</html> diff --git a/isis/src/docsys/assets/scripts/feed2js/feed2js.php b/isis/src/docsys/assets/scripts/feed2js/feed2js.php deleted file mode 100644 index 93b099a0a0395370ffd29915fd6b1f8a8bf6a126..0000000000000000000000000000000000000000 --- a/isis/src/docsys/assets/scripts/feed2js/feed2js.php +++ /dev/null @@ -1,316 +0,0 @@ -<?php -/* Feed2JS : RSS feed to JavaScript src file - - VERSION 1.93 (2007 nov 13) - - ABOUT - This PHP script will take an RSS feed as a value of src="...." - and return a JavaScript file that can be linked - remotely from any other web page. Output includes - site title, link, and description as well as item site, link, and - description with these outouts contolled by extra parameters. - - Developed by Alan Levine initially released 13.may.2004 - http://cogdogblog.com/ - - PRIMARY SITE: - http://feed2js.org/ - - USAGE: - See http://eduforge.org/projects/feed2js/ - - Feed2JS makes use of the Magpie RSS parser from - http://magpierss.sourceforge.net/ - - ------------- small print --------------------------------------- - GNU General Public License - Copyright (C) 2004-2005 Alan Levine - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2 - of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details - http://www.gnu.org/licenses/gpl.html - ------------- small print --------------------------------------- - -*/ - -// ERROR CHECKING FOR NO SOURCE ------------------------------- - -$script_msg = ''; -$src = (isset($_GET['src'])) ? $_GET['src'] : ''; - -// trap for missing src param for the feed, use a dummy one so it gets displayed. -if (!$src or strpos($src, 'http://')!=0) $src= 'http://' . $_SERVER['SERVER_NAME'] . dirname($_SERVER['PHP_SELF']) . '/nosource.rss'; - -// test for malicious use of script tages -if (strpos($src, '<script>')) { - $src = preg_replace("/(\<script)(.*?)(script>)/si", "SCRIPT DELETED", "$src"); - die("Warning! Attempt to inject javascript detected. Aborted and tracking log updated."); -} - - -// MAGPIE SETUP ---------------------------------------------------- -// access configuration settings -require_once('feed2js_config.php'); - -// check for utf encoding type -$utf = (isset($_GET['utf'])) ? $_GET['utf'] : 'n'; - -if ($utf == 'y') { - define('MAGPIE_CACHE_DIR', MAGPIE_DIR . 'cache_utf8/'); - // chacrater encoding - define('MAGPIE_OUTPUT_ENCODING', 'UTF-8'); - -} else { - define('MAGPIE_CACHE_DIR', MAGPIE_DIR . 'cache/'); -} - -// GET VARIABLES --------------------------------------------- -// retrieve values from posted variables - -// flag to show channel info -$chan = (isset($_GET['chan'])) ? $_GET['chan'] : 'n'; - -// variable to limit number of displayed items; default = 0 (show all, 100 is a safe bet to list a big list of feeds) - -$num = (isset($_GET['num'])) ? $_GET['num'] : 0; -if ($num==0) $num = 100; - -// indicator to show item description, 0 = no; 1=all; n>1 = characters to display -// values of -1 indicate to displa item without the title as a link -// (default=0) -$desc = (isset($_GET['desc'])) ? $_GET['desc'] : 0; - -// flag to show date of posts, values: no/yes (default=no) -$date = (isset($_GET['date'])) ? $_GET['date'] : 'n'; - -// time zone offset for making local time, -// e.g. +7, =-10.5; 'feed' = print the time string in the RSS w/o conversion -$tz = (isset($_GET['tz'])) ? $_GET['tz'] : 'feed'; - - -// flag to open target window in new window; n = same window, y = new window, -// other = targeted window, 'popup' = call JavaScript function popupfeed() to display -// in new window (default is n) - -$targ = (isset($_GET['targ'])) ? $_GET['targ'] : 'n'; -if ($targ == 'n') { - $target_window = ' target="_self"'; -} elseif ($targ == 'y' ) { - $target_window = ' target="_blank"'; -} elseif ($targ == 'popup') { - $target_window = ' onClick="popupfeed(this.href);return false"'; -} else { - $target_window = ' target="' . $targ . '"'; -} - -// flag to show feed as full html output rather than JavaScript, used for alternative -// views for JavaScript-less users. -// y = display html only for non js browsers (NO LONGER USED) -// n = default (JavaScript view) -// a = display javascript output but allow HTML -// p = display text only items but convert linefeeds to BR tags - -// default setting for no conversion of linebreaks -$html = (isset($_GET['html'])) ? $_GET['html'] : 'n'; - -$br = ' '; -if ($html == 'a') { - $desc = 1; -} elseif ($html == 'p') { - $br = '<br />'; -} - -// optional parameter to use different class for the CSS container -$rss_box_id = (isset($_GET['css'])) ? '-' . $_GET['css'] : ''; - -// optional parameter to use different class for the CSS container -$play_podcast = (isset($_GET['pc'])) ? $_GET['pc'] : 'n'; - - -// PARSE FEED and GENERATE OUTPUT ------------------------------- -// This is where it all happens! - -$rss = @fetch_rss( $src ); - -// begin javascript output string for channel info -$str= "document.write('<div class=\"rss-box" . $rss_box_id . "\">');\n"; - - -// no feed found by magpie, return error statement -if (!$rss) { - $str.= "document.write('<p class=\"rss-item\">$script_msg<em>Error:</em> Feed failed! Causes may be (1) No data found for RSS feed $src; (2) There are no items are available for this feed; (3) The RSS feed does not validate.<br /><br /> Please verify that the URL <a href=\"$src\">$src</a> works first in your browser and that the feed passes a <a href=\"http://feedvalidator.org/check.cgi?url=" . urlencode($src) . "\">validator test</a>.</p></div>');\n"; - - -} else { - - - // Create CONNECTION CONFIRM - // create output string for local javascript variable to let - // browser know that the server has been contacted - $feedcheck_str = "feed2js_ck = true;\n\n"; - - // we have a feed, so let's process - if ($chan == 'y') { - - // output channel title and description - $str.= "document.write('<p class=\"rss-title\"><a class=\"rss-title\" href=\"" . trim($rss->channel['link']) . '"' . $target_window . ">" . addslashes(strip_returns($rss->channel['title'])) . "</a><br /><span class=\"rss-item\">" . addslashes(strip_returns(strip_tags($rss->channel['description']))) . "</span></p>');\n"; - - } elseif ($chan == 'title') { - // output title only - $str.= "document.write('<p class=\"rss-title\"><a class=\"rss-title\" href=\"" . trim($rss->channel['link']) . '"' . $target_window . ">" . addslashes(strip_returns($rss->channel['title'])) . "</a></p>');\n"; - - } - - // begin item listing - $str.= "document.write('<ul class=\"rss-items\">');\n"; - - // Walk the items and process each one - $all_items = array_slice($rss->items, 0, $num); - - foreach ( $all_items as $item ) { - - // set defaults thanks RPFK - if (!isset($item['summary'])) $item['summary'] = ''; - $more_link = ''; - - if ($item['link']) { - // link url - $my_url = addslashes($item['link']); - } elseif ($item['guid']) { - // feeds lacking item -> link - $my_url = ($item['guid']); - } - - - if ($desc < 0) { - $str.= "document.write('<li class=\"rss-item\">');\n"; - - } elseif ($item['title']) { - // format item title - $my_title = addslashes(strip_returns($item['title'])); - - // create a title attribute. thanks Seb! - $title_str = substr(addslashes(strip_returns(strip_tags((htmlspecialchars($item['summary']))))), 0, 255) . '...'; - - // write the title strng - $str.= "document.write('<li class=\"rss-item\"><a class=\"rss-item\" href=\"" . trim($my_url) . "\" title=\"$title_str\"". $target_window . '>' . $my_title . "</a><br />');\n"; - - } else { - // if no title, build a link to tag on the description - $str.= "document.write('<li class=\"rss-item\">');\n"; - $more_link = " <a class=\"rss-item\" href=\"" . trim($my_url) . '"' . $target_window . ">«details»</a>"; - } - - // print out date if option indicated - - if ($date == 'y') { - - if ($tz == 'feed') { - // echo the date/time stamp reported in the feed - - if ($item['pubdate'] != '') { - // RSS 2.0 is alreayd formatted, so just use it - $pretty_date = $item['pubdate']; - } elseif ($item['published'] != "") { - // ATOM 1.0 format, remove the "T" and "Z" and the time zone offset - $pretty_date = str_replace("T", " ", $item['published']); - $pretty_date= str_replace("Z", " ", $pretty_date); - - } elseif ($item['issued'] != "") { - // ATOM 0.3 format, remove the "T" and "Z" and the time zone offset - $pretty_date = str_replace("T", " ", $item['issued']); - $pretty_date= str_replace("Z", " ", $pretty_date); - } elseif ( $item['dc']['date'] != "") { - // RSS 1.0, remove the "T" and the time zone offset - $pretty_date = str_replace("T", " ", $item['dc']['date']); - $pretty_date = substr($pretty_date, 0,-6); - } else { - - // no time/date stamp, - $pretty_date = 'n/a'; - } - - } else { - // convert to local time via conversion to GMT + offset - - // adjust local server time to GMT and then adjust time according to user - // entered offset. - - $pretty_date = date($date_format, $item['date_timestamp'] - $tz_offset + $tz * 3600); - - } - - $str.= "document.write('<span class=\"rss-date\">$pretty_date</span><br />');\n"; - } - - // link to podcast media if availavle - - if ($play_podcast == 'y' and is_array($item['enclosure'])) { - $str.= "document.write('<div class=\"pod-play-box\">');\n"; - for ($i = 0; $i < count($item['enclosure']); $i++) { - - // display only if enclosure is a valid URL - //if (strpos($item['enclosure'][$i]['url'], 'http://')!=0) { - $str.= "document.write('<a class=\"pod-play\" href=\"" . trim($item['enclosure'][$i]['url']) . "\" title=\"Play Now\" target=\"_blank\"><em>Play</em> <span> " . substr(trim($item['enclosure'][$i]['url']), -3) . "</span></a> ');\n"; - //} - - } - - $str.= "document.write('</div>');\n"; - - } - - - // output description of item if desired - if ($desc) { - - // Atom/encocded content support (thanks David Carter-Tod) - - if ($item['content']['encoded']) { - $my_blurb = html_entity_decode ( $item['content']['encoded'], ENT_NOQUOTES); - - - } else { - $my_blurb = $item['summary']; - } - - // strip html - if ($html != 'a') $my_blurb = strip_tags($my_blurb); - - // trim descriptions - if ($desc > 1) { - - // display specified substring numbers of chars; - // html is stripped to prevent cut off tags - $my_blurb = substr($my_blurb, 0, $desc) . '...'; - } - - - $str.= "document.write('" . addslashes(strip_returns($my_blurb, $br)) . "');\n"; - - } - - $str.= "document.write('$more_link</li>');\n"; - } - - - $str .= "document.write('</ul></div>');\n"; - -} - -// Render as JavaScript -// START OUTPUT -// headers to tell browser this is a JS file -if ($rss) header("Content-type: application/x-javascript"); - -// Spit out the results as the series of JS statements -echo $feedcheck_str . $str; - - -?> diff --git a/isis/src/docsys/assets/scripts/feed2js/feed2js_config.php b/isis/src/docsys/assets/scripts/feed2js/feed2js_config.php deleted file mode 100644 index 6e2f4115569a6f324f39541703cfd5c8b219f675..0000000000000000000000000000000000000000 --- a/isis/src/docsys/assets/scripts/feed2js/feed2js_config.php +++ /dev/null @@ -1,66 +0,0 @@ -<?php -/* Feed2JS : RSS feed to JavaScript Configuration include - - Use this include to establish server specific paths - and other common functions used by the feed2js.php - - See main script for all the gory details - - created 10.sep.2004 -*/ - - -// MAGPIE SETUP ---------------------------------------------------- -// Define path to Magpie files and load library -// The easiest setup is to put the 4 Magpie include -// files in the same directory: -// define('MAGPIE_DIR', './') - -// Otherwise, provide a full valid file path to the directory -// where magpie sites - -define('MAGPIE_DIR', './magpie/'); - -// access magpie libraries -require_once(MAGPIE_DIR.'rss_fetch.inc'); -require_once(MAGPIE_DIR.'rss_utils.inc'); - -// value of 2 optionally show lots of debugging info but breaks JavaScript -// This should be set to 0 unless debugging -define('MAGPIE_DEBUG', 0); - -// Define cache age in seconds. -define('MAGPIE_CACHE_AGE', 60*60); - -// OTHER SETTIINGS ---------------------------------------------- -// Output spec for item date string if used -// see http://www.php.net/manual/en/function.date.php -$date_format = "F d, Y h:i:s a"; - - -// server time zone offset from GMT -// If this line generates errors (common on Windoze servers, -// then figure out your time zone offset from GMT and enter -// manually, e.g. $tz_offset = -7; - -$tz_offset = gmmktime(0,0,0,1,1,1970) - mktime(0,0,0,1,1,1970); - -// ERROR Handling ------------------------------------------------ - -// Report all errors except E_NOTICE -// This is the default value set in php.ini for Apache but often not Windows -// We recommend changing the value to 0 once your scripts are working -ini_set('display_errors', 1); -ini_set('error_reporting', E_ALL^ E_NOTICE); - - -// Utility to remove return characters from strings that might -// pollute JavaScript commands. While we are at it, substitute -// valid single quotes as well and get rid of any escaped quote -// characters -function strip_returns ($text, $linefeed=" ") { - $subquotes = ereg_replace("'", "'", stripslashes($text)); - return ereg_replace("(\r\n|\n|\r)", $linefeed, $subquotes); -} - -?> \ No newline at end of file diff --git a/isis/src/docsys/assets/scripts/feed2js/feed2php.inc b/isis/src/docsys/assets/scripts/feed2js/feed2php.inc deleted file mode 100644 index 0b9ae69f3036eee380de44a42f3c667869f4fc34..0000000000000000000000000000000000000000 --- a/isis/src/docsys/assets/scripts/feed2js/feed2php.inc +++ /dev/null @@ -1,300 +0,0 @@ -<?php -/* Feed2inc : RSS feed to PHP include file - - ABOUT - This PHP code can be used as an include to provide the - same functionality of our Feed2JS concept, but without - the need to generate content via JavaScript - - Developed by Alan Levine 04.aug.2004 - http://cogdogblog.com/ - - This is a modified version of Fee22JS and merely replaces - the output of Javascript to that for a PHP. See the original - feed2js.php for change history. - - USAGE: - See http://feed2js.org/index.php?s=php - - HISTORY - See: - http://feed2js.org/index.php?s=history - - or the RSS feed: - http://feed2js.org/content/feed2js.xml - - - This makes use of the Magpie RSS parser from - http://magpierss.sourceforge.net/ - - ------------- small print --------------------------------------- - GNU General Public License - Copyright (C) 2004 Alan Levine - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2 - of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details - http://www.gnu.org/licenses/gpl.html - ------------- small print --------------------------------------- - -*/ - -require_once('feed2js_config.php'); - -/// trap for missing src param for the feed, use a dummy one so it gets displayed. - -if (!$src or strpos($src, 'http://')!=0) $src= 'http://' . $_SERVER['SERVER_NAME'] . dirname($_SERVER['PHP_SELF']) . '/nosource.rss'; - -// check for utf encoding type -if (!isset($utf)) $utf = 'n'; - -if ($utf == 'y') { - define('MAGPIE_CACHE_DIR', MAGPIE_DIR . 'cache_utf8/'); - // character encoding - define('MAGPIE_OUTPUT_ENCODING', 'UTF-8'); - -} else { - define('MAGPIE_CACHE_DIR', MAGPIE_DIR . 'cache/'); - -} - - -// GET VARIABLES --------------------------------------------- -// retrieve values from posted variables - -// flag to show channel info -if (!isset($chan)) $chan = 'n'; - -// variable to limit number of displayed items; default = 0 (show all, 20 is a safe bet to list a big list of feeds) - -if (!isset($num)) $num = 0; -if ($num==0) $num = 100; - -// indicator to show item description, 0 = no; 1=all; n>1 = characters to display -// values of -1 indicate to display item without the title as a link -// (default=0) -if (!isset($desc)) $desc = 0; - -// flag to show date of posts, values: no/yes (default=no) -$date = (isset($date)) ? $date : 'n'; - -// time zone offset for making local time, -// e.g. +7, =-10.5; 'feed' = print the time string in the RSS w/o conversion -$tz = (isset($tz)) ? $tz : 'feed'; - -// flag to open target window in new window; n = same window, y = new window, -// other = targeted window, 'popup' = call JavaScript function popupfeed to display -// in new window -// (default is n) - -if (!isset($targ)) $targ = 'n'; - -if ($targ == 'n') { - $target_window = ' target="_self"'; -} elseif ($targ == 'y' ) { - $target_window = ' target="_blank"'; -} elseif ($targ == 'popup') { - $target_window = ' onClick="popupfeed(this.href);return false"'; -} else { - $target_window = ' target="' . $targ . '"'; -} - -// flag to show feed as full html output rather than JavaScript, used for alternative -// views for JavaScript-less users. -// y = display html only for non js browsers -// n = default (JavaScript view) -// a = display javascript output but allow HTML -// p = display text only items but convert linefeeds to BR tags - -// default setting for no conversion of linebreaks -if (!isset($html)) $html = 'n'; - -$br = ' '; -if ($html == 'a') { - $desc = 1; -} elseif ($html == 'p') { - $br = '<br />'; -} - -// optional parameter to use different class for the CSS container -if (isset($css)) { - $rss_box_id = '-' . $css; -} else { - $rss_box_id = ''; -} - -if (isset($pc)) { - $play_podcast = $pc; -} else { - $play_podcast = 'n'; -} - - -// PARSE FEED and GENERATE OUTPUT ------------------------------- -// This is where it all happens! - -// Fetch the data, thanks Magpie -$rss = @fetch_rss( $src ); - -// begin javascript output string for channel info -$str = "<div class=\"rss-box" . $rss_box_id . "\">\n"; - -// no feed found by magpie, return error statement -if (!$rss) { - // error, nothing grabbed - $str.= "<p class=\"rss-item\"><em>Error:</em> Feed failed! Causes may be (1) No data found for RSS feed $src; (2) There are no items are available for this feed; (3) The RSS feed does not validate.<br /><br /> Please verify that the URL <a href=\"$src\">$src</a> works first in your browser and that the feed passes a <a href=\"http://feedvalidator.org/check.cgi?url=" . urlencode($src) . "\">validator test</a>.</p>\n"; -} else { - - if ($chan == 'y') { - - // output channel title and description - $str.= "<p class=\"rss-title\"><a class=\"rss-title\" href=\"" . trim($rss->channel['link']) . "\" target=\"" . $target_window . "\">" . strip_returns($rss->channel['title']) . "</a><br /><span class=\"rss-item\">" . strip_returns($rss->channel['description']) . "</span></p>\n"; - - } elseif ($chan == 'title') { - // output title only - $str.= "<p class=\"rss-title\"><a class=\"rss-title\" href=\"" . trim($rss->channel['link']) . "\" target=\"" . $target_window . "\">" . strip_returns($rss->channel['title']) . "</a></p>\n"; - - } - - // begin item listing - $str.= "<ul class=\"rss-items\">\n"; - - - // Walk the items and process each one - $all_items = array_slice($rss->items, 0, $num); - - foreach ( $all_items as $item ) { - - if ($item['link']) { - // link url - $my_url = $item['link']; - } elseif ($item['guid']) { - // feeds lacking item -> link - $my_url = ($item['guid']); - } - - - if ($desc < 0) { - $str.= "<li class=\"rss-item\">\n"; - - } elseif ($item['title']) { - // format item title - $my_title = strip_returns($item['title']); - - // create a title attribute. thanks Seb! - $title_str = substr(strip_returns(strip_tags($item['summary'])), 0, 255) . '...'; - - // write the item - $str.= "<li class=\"rss-item\"><a class=\"rss-item\" href=\"" . trim($my_url) . "\" title=\"$title_str\"" . $target_window . ">" . $my_title . "</a><br />\n"; - - } else { - // if no title, build a link to tag on the description - $str.= "<li class=\"rss-item\">\n"; - $more_link = " <a class=\"rss-item\" href=\"" .trim($my_url) . '"' . $target_window . ">«details»</a>"; - } - - - // print out date if option indicated and feed returns a value. - // Use the new date_timestamp function in Magpie 0.71 - if ($date == 'y') { - if ($tz == 'feed') { - // echo the date/time stamp reported in the feed - - if ($item['pubdate'] != '') { - // RSS 2.0 is already formatted, so just use it - $pretty_date = 'published on ' . $item['pubdate']; - } elseif ($item['published'] != "") { - // ATOM 1.0 format, remove the "T" and "Z" and the time zone offset - $pretty_date = str_replace("T", " ", $item['published']); - $pretty_date= 'published on ' . str_replace("Z", " ", $pretty_date); - - } elseif ($item['issued'] != "") { - // ATOM 0.3 format, remove the "T" and "Z" and the time zone offset - $pretty_date = str_replace("T", " ", $item['issued']); - $pretty_date= 'published on ' . str_replace("Z", " ", $pretty_date); - } elseif ( $item['dc']['date'] != "") { - // RSS 1.0, remove the "T" and the time zone offset - $pretty_date = str_replace("T", " ", $item['dc']['date']); - $pretty_date = 'published on ' . substr($pretty_date, 0,-6); - } else { - - // no time/date stamp, just use the server time - $pretty_date = 'published date n/a'; - } - - } else { - // convert to local time via conversion to GMT + offset - - // adjust local server time to GMT and then adjust time according to user - // entered offset. - - $pretty_date = 'published on ' . date($date_format, $item['date_timestamp'] - $tz_offset + $tz * 3600); - - } - - - - $str.= "<span class=\"rss-date\">$pretty_date</span><br />\n"; - } - - // link to podcast media if available - - if ($play_podcast == 'y' and is_array($item['enclosure'])) { - $str.= "<div class=\"pod-play-box\">Media: "; - - for ($i = 0; $i < count($item['enclosure']); $i++) { - - // display only if enclosure is a valid URL - //if (strpos($item['enclosure'][$i]['url'], 'http://')!=0) { - $str.= "<a class=\"pod-play\"><a href=\"" . trim($item['enclosure'][$i]['url']) . "\" title=\"Play Now\" target=\"_blank\"><em>Play</em> <span>" . substr(trim($item['enclosure'][$i]['url']), -3) . "</span></a> "; - //} - - } - $str.= "</div>"; - - } - - - - - // output description of item if desired - if ($desc) { - - // Atom/encoded content support (thanks David Carter-Tod) - - if ($item['content']['encoded']) { - $my_blurb = html_entity_decode ( $item['content']['encoded'], ENT_NOQUOTES); - - } else { - $my_blurb = $item['summary']; - } - - - - // strip html - if ($html != 'a') $my_blurb = strip_tags($my_blurb); - - // trim descriptions - if ($desc > 1) { - - // display specified substring numbers of chars; - // html is stripped to prevent cut off tags - $my_blurb = substr($my_blurb, 0, $desc) . '...'; - } - - $str.= strip_returns($my_blurb, $br) . "\n"; - } - - $str.= "$more_link</li>\n"; - } -} - -$str .= "</ul></div>\n"; -echo $str; - -?> diff --git a/isis/src/docsys/assets/scripts/feed2js/footer b/isis/src/docsys/assets/scripts/feed2js/footer deleted file mode 100644 index 8d6f68bcc7d2cd9d1c65b8eaa12cd5e5db35cedb..0000000000000000000000000000000000000000 --- a/isis/src/docsys/assets/scripts/feed2js/footer +++ /dev/null @@ -1,9 +0,0 @@ -<div id="footer"> -<p class="smallprint"> -<strong>Feed2JS v1.93</strong><br> -http://<?php echo $_SERVER['SERVER_NAME'] . $_SERVER['PHP_SELF']?><br><br> -Feed2JS code is Copyright (C) 2004-<?php echo date("Y")?> Created by <a href="http://cogdogblog.com/">Alan Levine</a>. It is available as both a free service at <a href="http://feed2js.org/">http://feed2js.org/</a> and open source code from <a href="https://eduforge.org/projects/feed2js/">eduforge</a>. <br><br> -This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.<br><br> - -This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details <a href="http://www.gnu.org/licenses/gpl.html">http://www.gnu.org/licenses/gpl.html</a></p> -</div> diff --git a/isis/src/docsys/assets/scripts/feed2js/magpie/extlib/Snoopy.class.inc b/isis/src/docsys/assets/scripts/feed2js/magpie/extlib/Snoopy.class.inc deleted file mode 100644 index 531161059d7630be85f43119224fc7b58cc48c73..0000000000000000000000000000000000000000 --- a/isis/src/docsys/assets/scripts/feed2js/magpie/extlib/Snoopy.class.inc +++ /dev/null @@ -1,1250 +0,0 @@ -<?php - -/************************************************* - -Snoopy - the PHP net client -Author: Monte Ohrt <monte@ispi.net> -Copyright (c): 1999-2008 New Digital Group, all rights reserved -Version: 1.2.4 - - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -You may contact the author of Snoopy by e-mail at: -monte@ohrt.com - -The latest version of Snoopy can be obtained from: -http://snoopy.sourceforge.net/ - -*************************************************/ - -class Snoopy -{ - /**** Public variables ****/ - - /* user definable vars */ - - var $host = "www.php.net"; // host name we are connecting to - var $port = 80; // port we are connecting to - var $proxy_host = ""; // proxy host to use - var $proxy_port = ""; // proxy port to use - var $proxy_user = ""; // proxy user to use - var $proxy_pass = ""; // proxy password to use - - var $agent = "Snoopy v1.2.4"; // agent we masquerade as - var $referer = ""; // referer info to pass - var $cookies = array(); // array of cookies to pass - // $cookies["username"]="joe"; - var $rawheaders = array(); // array of raw headers to send - // $rawheaders["Content-type"]="text/html"; - - var $maxredirs = 5; // http redirection depth maximum. 0 = disallow - var $lastredirectaddr = ""; // contains address of last redirected address - var $offsiteok = true; // allows redirection off-site - var $maxframes = 0; // frame content depth maximum. 0 = disallow - var $expandlinks = true; // expand links to fully qualified URLs. - // this only applies to fetchlinks() - // submitlinks(), and submittext() - var $passcookies = true; // pass set cookies back through redirects - // NOTE: this currently does not respect - // dates, domains or paths. - - var $user = ""; // user for http authentication - var $pass = ""; // password for http authentication - - // http accept types - var $accept = "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*"; - - var $results = ""; // where the content is put - - var $error = ""; // error messages sent here - var $response_code = ""; // response code returned from server - var $headers = array(); // headers returned from server sent here - var $maxlength = 500000; // max return data length (body) - var $read_timeout = 0; // timeout on read operations, in seconds - // supported only since PHP 4 Beta 4 - // set to 0 to disallow timeouts - var $timed_out = false; // if a read operation timed out - var $status = 0; // http request status - - var $temp_dir = "/tmp"; // temporary directory that the webserver - // has permission to write to. - // under Windows, this should be C:\temp - - var $curl_path = "/usr/local/bin/curl"; - // Snoopy will use cURL for fetching - // SSL content if a full system path to - // the cURL binary is supplied here. - // set to false if you do not have - // cURL installed. See http://curl.haxx.se - // for details on installing cURL. - // Snoopy does *not* use the cURL - // library functions built into php, - // as these functions are not stable - // as of this Snoopy release. - - /**** Private variables ****/ - - var $_maxlinelen = 4096; // max line length (headers) - - var $_httpmethod = "GET"; // default http request method - var $_httpversion = "HTTP/1.0"; // default http request version - var $_submit_method = "POST"; // default submit method - var $_submit_type = "application/x-www-form-urlencoded"; // default submit type - var $_mime_boundary = ""; // MIME boundary for multipart/form-data submit type - var $_redirectaddr = false; // will be set if page fetched is a redirect - var $_redirectdepth = 0; // increments on an http redirect - var $_frameurls = array(); // frame src urls - var $_framedepth = 0; // increments on frame depth - - var $_isproxy = false; // set if using a proxy server - var $_fp_timeout = 30; // timeout for socket connection - -/*======================================================================*\ - Function: fetch - Purpose: fetch the contents of a web page - (and possibly other protocols in the - future like ftp, nntp, gopher, etc.) - Input: $URI the location of the page to fetch - Output: $this->results the output text from the fetch -\*======================================================================*/ - - function fetch($URI) - { - - //preg_match("|^([^:]+)://([^:/]+)(:[\d]+)*(.*)|",$URI,$URI_PARTS); - $URI_PARTS = parse_url($URI); - if (!empty($URI_PARTS["user"])) - $this->user = $URI_PARTS["user"]; - if (!empty($URI_PARTS["pass"])) - $this->pass = $URI_PARTS["pass"]; - if (empty($URI_PARTS["query"])) - $URI_PARTS["query"] = ''; - if (empty($URI_PARTS["path"])) - $URI_PARTS["path"] = ''; - - switch(strtolower($URI_PARTS["scheme"])) - { - case "http": - $this->host = $URI_PARTS["host"]; - if(!empty($URI_PARTS["port"])) - $this->port = $URI_PARTS["port"]; - if($this->_connect($fp)) - { - if($this->_isproxy) - { - // using proxy, send entire URI - $this->_httprequest($URI,$fp,$URI,$this->_httpmethod); - } - else - { - $path = $URI_PARTS["path"].($URI_PARTS["query"] ? "?".$URI_PARTS["query"] : ""); - // no proxy, send only the path - $this->_httprequest($path, $fp, $URI, $this->_httpmethod); - } - - $this->_disconnect($fp); - - if($this->_redirectaddr) - { - /* url was redirected, check if we've hit the max depth */ - if($this->maxredirs > $this->_redirectdepth) - { - // only follow redirect if it's on this site, or offsiteok is true - if(preg_match("|^http://".preg_quote($this->host)."|i",$this->_redirectaddr) || $this->offsiteok) - { - /* follow the redirect */ - $this->_redirectdepth++; - $this->lastredirectaddr=$this->_redirectaddr; - $this->fetch($this->_redirectaddr); - } - } - } - - if($this->_framedepth < $this->maxframes && count($this->_frameurls) > 0) - { - $frameurls = $this->_frameurls; - $this->_frameurls = array(); - - while(list(,$frameurl) = each($frameurls)) - { - if($this->_framedepth < $this->maxframes) - { - $this->fetch($frameurl); - $this->_framedepth++; - } - else - break; - } - } - } - else - { - return false; - } - return true; - break; - case "https": - if(!$this->curl_path) - return false; - if(function_exists("is_executable")) - if (!is_executable($this->curl_path)) - return false; - $this->host = $URI_PARTS["host"]; - if(!empty($URI_PARTS["port"])) - $this->port = $URI_PARTS["port"]; - if($this->_isproxy) - { - // using proxy, send entire URI - $this->_httpsrequest($URI,$URI,$this->_httpmethod); - } - else - { - $path = $URI_PARTS["path"].($URI_PARTS["query"] ? "?".$URI_PARTS["query"] : ""); - // no proxy, send only the path - $this->_httpsrequest($path, $URI, $this->_httpmethod); - } - - if($this->_redirectaddr) - { - /* url was redirected, check if we've hit the max depth */ - if($this->maxredirs > $this->_redirectdepth) - { - // only follow redirect if it's on this site, or offsiteok is true - if(preg_match("|^http://".preg_quote($this->host)."|i",$this->_redirectaddr) || $this->offsiteok) - { - /* follow the redirect */ - $this->_redirectdepth++; - $this->lastredirectaddr=$this->_redirectaddr; - $this->fetch($this->_redirectaddr); - } - } - } - - if($this->_framedepth < $this->maxframes && count($this->_frameurls) > 0) - { - $frameurls = $this->_frameurls; - $this->_frameurls = array(); - - while(list(,$frameurl) = each($frameurls)) - { - if($this->_framedepth < $this->maxframes) - { - $this->fetch($frameurl); - $this->_framedepth++; - } - else - break; - } - } - return true; - break; - default: - // not a valid protocol - $this->error = 'Invalid protocol "'.$URI_PARTS["scheme"].'"\n'; - return false; - break; - } - return true; - } - -/*======================================================================*\ - Function: submit - Purpose: submit an http form - Input: $URI the location to post the data - $formvars the formvars to use. - format: $formvars["var"] = "val"; - $formfiles an array of files to submit - format: $formfiles["var"] = "/dir/filename.ext"; - Output: $this->results the text output from the post -\*======================================================================*/ - - function submit($URI, $formvars="", $formfiles="") - { - unset($postdata); - - $postdata = $this->_prepare_post_body($formvars, $formfiles); - - $URI_PARTS = parse_url($URI); - if (!empty($URI_PARTS["user"])) - $this->user = $URI_PARTS["user"]; - if (!empty($URI_PARTS["pass"])) - $this->pass = $URI_PARTS["pass"]; - if (empty($URI_PARTS["query"])) - $URI_PARTS["query"] = ''; - if (empty($URI_PARTS["path"])) - $URI_PARTS["path"] = ''; - - switch(strtolower($URI_PARTS["scheme"])) - { - case "http": - $this->host = $URI_PARTS["host"]; - if(!empty($URI_PARTS["port"])) - $this->port = $URI_PARTS["port"]; - if($this->_connect($fp)) - { - if($this->_isproxy) - { - // using proxy, send entire URI - $this->_httprequest($URI,$fp,$URI,$this->_submit_method,$this->_submit_type,$postdata); - } - else - { - $path = $URI_PARTS["path"].($URI_PARTS["query"] ? "?".$URI_PARTS["query"] : ""); - // no proxy, send only the path - $this->_httprequest($path, $fp, $URI, $this->_submit_method, $this->_submit_type, $postdata); - } - - $this->_disconnect($fp); - - if($this->_redirectaddr) - { - /* url was redirected, check if we've hit the max depth */ - if($this->maxredirs > $this->_redirectdepth) - { - if(!preg_match("|^".$URI_PARTS["scheme"]."://|", $this->_redirectaddr)) - $this->_redirectaddr = $this->_expandlinks($this->_redirectaddr,$URI_PARTS["scheme"]."://".$URI_PARTS["host"]); - - // only follow redirect if it's on this site, or offsiteok is true - if(preg_match("|^http://".preg_quote($this->host)."|i",$this->_redirectaddr) || $this->offsiteok) - { - /* follow the redirect */ - $this->_redirectdepth++; - $this->lastredirectaddr=$this->_redirectaddr; - if( strpos( $this->_redirectaddr, "?" ) > 0 ) - $this->fetch($this->_redirectaddr); // the redirect has changed the request method from post to get - else - $this->submit($this->_redirectaddr,$formvars, $formfiles); - } - } - } - - if($this->_framedepth < $this->maxframes && count($this->_frameurls) > 0) - { - $frameurls = $this->_frameurls; - $this->_frameurls = array(); - - while(list(,$frameurl) = each($frameurls)) - { - if($this->_framedepth < $this->maxframes) - { - $this->fetch($frameurl); - $this->_framedepth++; - } - else - break; - } - } - - } - else - { - return false; - } - return true; - break; - case "https": - if(!$this->curl_path) - return false; - if(function_exists("is_executable")) - if (!is_executable($this->curl_path)) - return false; - $this->host = $URI_PARTS["host"]; - if(!empty($URI_PARTS["port"])) - $this->port = $URI_PARTS["port"]; - if($this->_isproxy) - { - // using proxy, send entire URI - $this->_httpsrequest($URI, $URI, $this->_submit_method, $this->_submit_type, $postdata); - } - else - { - $path = $URI_PARTS["path"].($URI_PARTS["query"] ? "?".$URI_PARTS["query"] : ""); - // no proxy, send only the path - $this->_httpsrequest($path, $URI, $this->_submit_method, $this->_submit_type, $postdata); - } - - if($this->_redirectaddr) - { - /* url was redirected, check if we've hit the max depth */ - if($this->maxredirs > $this->_redirectdepth) - { - if(!preg_match("|^".$URI_PARTS["scheme"]."://|", $this->_redirectaddr)) - $this->_redirectaddr = $this->_expandlinks($this->_redirectaddr,$URI_PARTS["scheme"]."://".$URI_PARTS["host"]); - - // only follow redirect if it's on this site, or offsiteok is true - if(preg_match("|^http://".preg_quote($this->host)."|i",$this->_redirectaddr) || $this->offsiteok) - { - /* follow the redirect */ - $this->_redirectdepth++; - $this->lastredirectaddr=$this->_redirectaddr; - if( strpos( $this->_redirectaddr, "?" ) > 0 ) - $this->fetch($this->_redirectaddr); // the redirect has changed the request method from post to get - else - $this->submit($this->_redirectaddr,$formvars, $formfiles); - } - } - } - - if($this->_framedepth < $this->maxframes && count($this->_frameurls) > 0) - { - $frameurls = $this->_frameurls; - $this->_frameurls = array(); - - while(list(,$frameurl) = each($frameurls)) - { - if($this->_framedepth < $this->maxframes) - { - $this->fetch($frameurl); - $this->_framedepth++; - } - else - break; - } - } - return true; - break; - - default: - // not a valid protocol - $this->error = 'Invalid protocol "'.$URI_PARTS["scheme"].'"\n'; - return false; - break; - } - return true; - } - -/*======================================================================*\ - Function: fetchlinks - Purpose: fetch the links from a web page - Input: $URI where you are fetching from - Output: $this->results an array of the URLs -\*======================================================================*/ - - function fetchlinks($URI) - { - if ($this->fetch($URI)) - { - if($this->lastredirectaddr) - $URI = $this->lastredirectaddr; - if(is_array($this->results)) - { - for($x=0;$x<count($this->results);$x++) - $this->results[$x] = $this->_striplinks($this->results[$x]); - } - else - $this->results = $this->_striplinks($this->results); - - if($this->expandlinks) - $this->results = $this->_expandlinks($this->results, $URI); - return true; - } - else - return false; - } - -/*======================================================================*\ - Function: fetchform - Purpose: fetch the form elements from a web page - Input: $URI where you are fetching from - Output: $this->results the resulting html form -\*======================================================================*/ - - function fetchform($URI) - { - - if ($this->fetch($URI)) - { - - if(is_array($this->results)) - { - for($x=0;$x<count($this->results);$x++) - $this->results[$x] = $this->_stripform($this->results[$x]); - } - else - $this->results = $this->_stripform($this->results); - - return true; - } - else - return false; - } - - -/*======================================================================*\ - Function: fetchtext - Purpose: fetch the text from a web page, stripping the links - Input: $URI where you are fetching from - Output: $this->results the text from the web page -\*======================================================================*/ - - function fetchtext($URI) - { - if($this->fetch($URI)) - { - if(is_array($this->results)) - { - for($x=0;$x<count($this->results);$x++) - $this->results[$x] = $this->_striptext($this->results[$x]); - } - else - $this->results = $this->_striptext($this->results); - return true; - } - else - return false; - } - -/*======================================================================*\ - Function: submitlinks - Purpose: grab links from a form submission - Input: $URI where you are submitting from - Output: $this->results an array of the links from the post -\*======================================================================*/ - - function submitlinks($URI, $formvars="", $formfiles="") - { - if($this->submit($URI,$formvars, $formfiles)) - { - if($this->lastredirectaddr) - $URI = $this->lastredirectaddr; - if(is_array($this->results)) - { - for($x=0;$x<count($this->results);$x++) - { - $this->results[$x] = $this->_striplinks($this->results[$x]); - if($this->expandlinks) - $this->results[$x] = $this->_expandlinks($this->results[$x],$URI); - } - } - else - { - $this->results = $this->_striplinks($this->results); - if($this->expandlinks) - $this->results = $this->_expandlinks($this->results,$URI); - } - return true; - } - else - return false; - } - -/*======================================================================*\ - Function: submittext - Purpose: grab text from a form submission - Input: $URI where you are submitting from - Output: $this->results the text from the web page -\*======================================================================*/ - - function submittext($URI, $formvars = "", $formfiles = "") - { - if($this->submit($URI,$formvars, $formfiles)) - { - if($this->lastredirectaddr) - $URI = $this->lastredirectaddr; - if(is_array($this->results)) - { - for($x=0;$x<count($this->results);$x++) - { - $this->results[$x] = $this->_striptext($this->results[$x]); - if($this->expandlinks) - $this->results[$x] = $this->_expandlinks($this->results[$x],$URI); - } - } - else - { - $this->results = $this->_striptext($this->results); - if($this->expandlinks) - $this->results = $this->_expandlinks($this->results,$URI); - } - return true; - } - else - return false; - } - - - -/*======================================================================*\ - Function: set_submit_multipart - Purpose: Set the form submission content type to - multipart/form-data -\*======================================================================*/ - function set_submit_multipart() - { - $this->_submit_type = "multipart/form-data"; - } - - -/*======================================================================*\ - Function: set_submit_normal - Purpose: Set the form submission content type to - application/x-www-form-urlencoded -\*======================================================================*/ - function set_submit_normal() - { - $this->_submit_type = "application/x-www-form-urlencoded"; - } - - - - -/*======================================================================*\ - Private functions -\*======================================================================*/ - - -/*======================================================================*\ - Function: _striplinks - Purpose: strip the hyperlinks from an html document - Input: $document document to strip. - Output: $match an array of the links -\*======================================================================*/ - - function _striplinks($document) - { - preg_match_all("'<\s*a\s.*?href\s*=\s* # find <a href= - ([\"\'])? # find single or double quote - (?(1) (.*?)\\1 | ([^\s\>]+)) # if quote found, match up to next matching - # quote, otherwise match up to next space - 'isx",$document,$links); - - - // catenate the non-empty matches from the conditional subpattern - - while(list($key,$val) = each($links[2])) - { - if(!empty($val)) - $match[] = $val; - } - - while(list($key,$val) = each($links[3])) - { - if(!empty($val)) - $match[] = $val; - } - - // return the links - return $match; - } - -/*======================================================================*\ - Function: _stripform - Purpose: strip the form elements from an html document - Input: $document document to strip. - Output: $match an array of the links -\*======================================================================*/ - - function _stripform($document) - { - preg_match_all("'<\/?(FORM|INPUT|SELECT|TEXTAREA|(OPTION))[^<>]*>(?(2)(.*(?=<\/?(option|select)[^<>]*>[\r\n]*)|(?=[\r\n]*))|(?=[\r\n]*))'Usi",$document,$elements); - - // catenate the matches - $match = implode("\r\n",$elements[0]); - - // return the links - return $match; - } - - - -/*======================================================================*\ - Function: _striptext - Purpose: strip the text from an html document - Input: $document document to strip. - Output: $text the resulting text -\*======================================================================*/ - - function _striptext($document) - { - - // I didn't use preg eval (//e) since that is only available in PHP 4.0. - // so, list your entities one by one here. I included some of the - // more common ones. - - $search = array("'<script[^>]*?>.*?</script>'si", // strip out javascript - "'<[\/\!]*?[^<>]*?>'si", // strip out html tags - "'([\r\n])[\s]+'", // strip out white space - "'&(quot|#34|#034|#x22);'i", // replace html entities - "'&(amp|#38|#038|#x26);'i", // added hexadecimal values - "'&(lt|#60|#060|#x3c);'i", - "'&(gt|#62|#062|#x3e);'i", - "'&(nbsp|#160|#xa0);'i", - "'&(iexcl|#161);'i", - "'&(cent|#162);'i", - "'&(pound|#163);'i", - "'&(copy|#169);'i", - "'&(reg|#174);'i", - "'&(deg|#176);'i", - "'&(#39|#039|#x27);'", - "'&(euro|#8364);'i", // europe - "'&a(uml|UML);'", // german - "'&o(uml|UML);'", - "'&u(uml|UML);'", - "'&A(uml|UML);'", - "'&O(uml|UML);'", - "'&U(uml|UML);'", - "'ß'i", - ); - $replace = array( "", - "", - "\\1", - "\"", - "&", - "<", - ">", - " ", - chr(161), - chr(162), - chr(163), - chr(169), - chr(174), - chr(176), - chr(39), - chr(128), - "�", - "�", - "�", - "�", - "�", - "�", - "�", - ); - - $text = preg_replace($search,$replace,$document); - - return $text; - } - -/*======================================================================*\ - Function: _expandlinks - Purpose: expand each link into a fully qualified URL - Input: $links the links to qualify - $URI the full URI to get the base from - Output: $expandedLinks the expanded links -\*======================================================================*/ - - function _expandlinks($links,$URI) - { - - preg_match("/^[^\?]+/",$URI,$match); - - $match = preg_replace("|/[^\/\.]+\.[^\/\.]+$|","",$match[0]); - $match = preg_replace("|/$|","",$match); - $match_part = parse_url($match); - $match_root = - $match_part["scheme"]."://".$match_part["host"]; - - $search = array( "|^http://".preg_quote($this->host)."|i", - "|^(\/)|i", - "|^(?!http://)(?!mailto:)|i", - "|/\./|", - "|/[^\/]+/\.\./|" - ); - - $replace = array( "", - $match_root."/", - $match."/", - "/", - "/" - ); - - $expandedLinks = preg_replace($search,$replace,$links); - - return $expandedLinks; - } - -/*======================================================================*\ - Function: _httprequest - Purpose: go get the http data from the server - Input: $url the url to fetch - $fp the current open file pointer - $URI the full URI - $body body contents to send if any (POST) - Output: -\*======================================================================*/ - - function _httprequest($url,$fp,$URI,$http_method,$content_type="",$body="") - { - $cookie_headers = ''; - if($this->passcookies && $this->_redirectaddr) - $this->setcookies(); - - $URI_PARTS = parse_url($URI); - if(empty($url)) - $url = "/"; - $headers = $http_method." ".$url." ".$this->_httpversion."\r\n"; - if(!empty($this->agent)) - $headers .= "User-Agent: ".$this->agent."\r\n"; - if(!empty($this->host) && !isset($this->rawheaders['Host'])) { - $headers .= "Host: ".$this->host; - if(!empty($this->port)) - $headers .= ":".$this->port; - $headers .= "\r\n"; - } - if(!empty($this->accept)) - $headers .= "Accept: ".$this->accept."\r\n"; - if(!empty($this->referer)) - $headers .= "Referer: ".$this->referer."\r\n"; - if(!empty($this->cookies)) - { - if(!is_array($this->cookies)) - $this->cookies = (array)$this->cookies; - - reset($this->cookies); - if ( count($this->cookies) > 0 ) { - $cookie_headers .= 'Cookie: '; - foreach ( $this->cookies as $cookieKey => $cookieVal ) { - $cookie_headers .= $cookieKey."=".urlencode($cookieVal)."; "; - } - $headers .= substr($cookie_headers,0,-2) . "\r\n"; - } - } - if(!empty($this->rawheaders)) - { - if(!is_array($this->rawheaders)) - $this->rawheaders = (array)$this->rawheaders; - while(list($headerKey,$headerVal) = each($this->rawheaders)) - $headers .= $headerKey.": ".$headerVal."\r\n"; - } - if(!empty($content_type)) { - $headers .= "Content-type: $content_type"; - if ($content_type == "multipart/form-data") - $headers .= "; boundary=".$this->_mime_boundary; - $headers .= "\r\n"; - } - if(!empty($body)) - $headers .= "Content-length: ".strlen($body)."\r\n"; - if(!empty($this->user) || !empty($this->pass)) - $headers .= "Authorization: Basic ".base64_encode($this->user.":".$this->pass)."\r\n"; - - //add proxy auth headers - if(!empty($this->proxy_user)) - $headers .= 'Proxy-Authorization: ' . 'Basic ' . base64_encode($this->proxy_user . ':' . $this->proxy_pass)."\r\n"; - - - $headers .= "\r\n"; - - // set the read timeout if needed - if ($this->read_timeout > 0) - socket_set_timeout($fp, $this->read_timeout); - $this->timed_out = false; - - fwrite($fp,$headers.$body,strlen($headers.$body)); - - $this->_redirectaddr = false; - unset($this->headers); - - while($currentHeader = fgets($fp,$this->_maxlinelen)) - { - if ($this->read_timeout > 0 && $this->_check_timeout($fp)) - { - $this->status=-100; - return false; - } - - if($currentHeader == "\r\n") - break; - - // if a header begins with Location: or URI:, set the redirect - if(preg_match("/^(Location:|URI:)/i",$currentHeader)) - { - // get URL portion of the redirect - preg_match("/^(Location:|URI:)[ ]+(.*)/i",chop($currentHeader),$matches); - // look for :// in the Location header to see if hostname is included - if(!preg_match("|\:\/\/|",$matches[2])) - { - // no host in the path, so prepend - $this->_redirectaddr = $URI_PARTS["scheme"]."://".$this->host.":".$this->port; - // eliminate double slash - if(!preg_match("|^/|",$matches[2])) - $this->_redirectaddr .= "/".$matches[2]; - else - $this->_redirectaddr .= $matches[2]; - } - else - $this->_redirectaddr = $matches[2]; - } - - if(preg_match("|^HTTP/|",$currentHeader)) - { - if(preg_match("|^HTTP/[^\s]*\s(.*?)\s|",$currentHeader, $status)) - { - $this->status= $status[1]; - } - $this->response_code = $currentHeader; - } - - $this->headers[] = $currentHeader; - } - - $results = ''; - do { - $_data = fread($fp, $this->maxlength); - if (strlen($_data) == 0) { - break; - } - $results .= $_data; - } while(true); - - if ($this->read_timeout > 0 && $this->_check_timeout($fp)) - { - $this->status=-100; - return false; - } - - // check if there is a a redirect meta tag - - if(preg_match("'<meta[\s]*http-equiv[^>]*?content[\s]*=[\s]*[\"\']?\d+;[\s]*URL[\s]*=[\s]*([^\"\']*?)[\"\']?>'i",$results,$match)) - - { - $this->_redirectaddr = $this->_expandlinks($match[1],$URI); - } - - // have we hit our frame depth and is there frame src to fetch? - if(($this->_framedepth < $this->maxframes) && preg_match_all("'<frame\s+.*src[\s]*=[\'\"]?([^\'\"\>]+)'i",$results,$match)) - { - $this->results[] = $results; - for($x=0; $x<count($match[1]); $x++) - $this->_frameurls[] = $this->_expandlinks($match[1][$x],$URI_PARTS["scheme"]."://".$this->host); - } - // have we already fetched framed content? - elseif(is_array($this->results)) - $this->results[] = $results; - // no framed content - else - $this->results = $results; - - return true; - } - -/*======================================================================*\ - Function: _httpsrequest - Purpose: go get the https data from the server using curl - Input: $url the url to fetch - $URI the full URI - $body body contents to send if any (POST) - Output: -\*======================================================================*/ - - function _httpsrequest($url,$URI,$http_method,$content_type="",$body="") - { - if($this->passcookies && $this->_redirectaddr) - $this->setcookies(); - - $headers = array(); - - $URI_PARTS = parse_url($URI); - if(empty($url)) - $url = "/"; - // GET ... header not needed for curl - //$headers[] = $http_method." ".$url." ".$this->_httpversion; - if(!empty($this->agent)) - $headers[] = "User-Agent: ".$this->agent; - if(!empty($this->host)) - if(!empty($this->port)) - $headers[] = "Host: ".$this->host.":".$this->port; - else - $headers[] = "Host: ".$this->host; - if(!empty($this->accept)) - $headers[] = "Accept: ".$this->accept; - if(!empty($this->referer)) - $headers[] = "Referer: ".$this->referer; - if(!empty($this->cookies)) - { - if(!is_array($this->cookies)) - $this->cookies = (array)$this->cookies; - - reset($this->cookies); - if ( count($this->cookies) > 0 ) { - $cookie_str = 'Cookie: '; - foreach ( $this->cookies as $cookieKey => $cookieVal ) { - $cookie_str .= $cookieKey."=".urlencode($cookieVal)."; "; - } - $headers[] = substr($cookie_str,0,-2); - } - } - if(!empty($this->rawheaders)) - { - if(!is_array($this->rawheaders)) - $this->rawheaders = (array)$this->rawheaders; - while(list($headerKey,$headerVal) = each($this->rawheaders)) - $headers[] = $headerKey.": ".$headerVal; - } - if(!empty($content_type)) { - if ($content_type == "multipart/form-data") - $headers[] = "Content-type: $content_type; boundary=".$this->_mime_boundary; - else - $headers[] = "Content-type: $content_type"; - } - if(!empty($body)) - $headers[] = "Content-length: ".strlen($body); - if(!empty($this->user) || !empty($this->pass)) - $headers[] = "Authorization: BASIC ".base64_encode($this->user.":".$this->pass); - - for($curr_header = 0; $curr_header < count($headers); $curr_header++) { - $safer_header = strtr( $headers[$curr_header], "\"", " " ); - $cmdline_params .= " -H \"".$safer_header."\""; - } - - if(!empty($body)) - $cmdline_params .= " -d \"$body\""; - - if($this->read_timeout > 0) - $cmdline_params .= " -m ".$this->read_timeout; - - $headerfile = tempnam($temp_dir, "sno"); - - exec($this->curl_path." -k -D \"$headerfile\"".$cmdline_params." \"".escapeshellcmd($URI)."\"",$results,$return); - - if($return) - { - $this->error = "Error: cURL could not retrieve the document, error $return."; - return false; - } - - - $results = implode("\r\n",$results); - - $result_headers = file("$headerfile"); - - $this->_redirectaddr = false; - unset($this->headers); - - for($currentHeader = 0; $currentHeader < count($result_headers); $currentHeader++) - { - - // if a header begins with Location: or URI:, set the redirect - if(preg_match("/^(Location: |URI: )/i",$result_headers[$currentHeader])) - { - // get URL portion of the redirect - preg_match("/^(Location: |URI:)\s+(.*)/",chop($result_headers[$currentHeader]),$matches); - // look for :// in the Location header to see if hostname is included - if(!preg_match("|\:\/\/|",$matches[2])) - { - // no host in the path, so prepend - $this->_redirectaddr = $URI_PARTS["scheme"]."://".$this->host.":".$this->port; - // eliminate double slash - if(!preg_match("|^/|",$matches[2])) - $this->_redirectaddr .= "/".$matches[2]; - else - $this->_redirectaddr .= $matches[2]; - } - else - $this->_redirectaddr = $matches[2]; - } - - if(preg_match("|^HTTP/|",$result_headers[$currentHeader])) - $this->response_code = $result_headers[$currentHeader]; - - $this->headers[] = $result_headers[$currentHeader]; - } - - // check if there is a a redirect meta tag - - if(preg_match("'<meta[\s]*http-equiv[^>]*?content[\s]*=[\s]*[\"\']?\d+;[\s]*URL[\s]*=[\s]*([^\"\']*?)[\"\']?>'i",$results,$match)) - { - $this->_redirectaddr = $this->_expandlinks($match[1],$URI); - } - - // have we hit our frame depth and is there frame src to fetch? - if(($this->_framedepth < $this->maxframes) && preg_match_all("'<frame\s+.*src[\s]*=[\'\"]?([^\'\"\>]+)'i",$results,$match)) - { - $this->results[] = $results; - for($x=0; $x<count($match[1]); $x++) - $this->_frameurls[] = $this->_expandlinks($match[1][$x],$URI_PARTS["scheme"]."://".$this->host); - } - // have we already fetched framed content? - elseif(is_array($this->results)) - $this->results[] = $results; - // no framed content - else - $this->results = $results; - - unlink("$headerfile"); - - return true; - } - -/*======================================================================*\ - Function: setcookies() - Purpose: set cookies for a redirection -\*======================================================================*/ - - function setcookies() - { - for($x=0; $x<count($this->headers); $x++) - { - if(preg_match('/^set-cookie:[\s]+([^=]+)=([^;]+)/i', $this->headers[$x],$match)) - $this->cookies[$match[1]] = urldecode($match[2]); - } - } - - -/*======================================================================*\ - Function: _check_timeout - Purpose: checks whether timeout has occurred - Input: $fp file pointer -\*======================================================================*/ - - function _check_timeout($fp) - { - if ($this->read_timeout > 0) { - $fp_status = socket_get_status($fp); - if ($fp_status["timed_out"]) { - $this->timed_out = true; - return true; - } - } - return false; - } - -/*======================================================================*\ - Function: _connect - Purpose: make a socket connection - Input: $fp file pointer -\*======================================================================*/ - - function _connect(&$fp) - { - if(!empty($this->proxy_host) && !empty($this->proxy_port)) - { - $this->_isproxy = true; - - $host = $this->proxy_host; - $port = $this->proxy_port; - } - else - { - $host = $this->host; - $port = $this->port; - } - - $this->status = 0; - - if($fp = fsockopen( - $host, - $port, - $errno, - $errstr, - $this->_fp_timeout - )) - { - // socket connection succeeded - - return true; - } - else - { - // socket connection failed - $this->status = $errno; - switch($errno) - { - case -3: - $this->error="socket creation failed (-3)"; - case -4: - $this->error="dns lookup failure (-4)"; - case -5: - $this->error="connection refused or timed out (-5)"; - default: - $this->error="connection failed (".$errno.")"; - } - return false; - } - } -/*======================================================================*\ - Function: _disconnect - Purpose: disconnect a socket connection - Input: $fp file pointer -\*======================================================================*/ - - function _disconnect($fp) - { - return(fclose($fp)); - } - - -/*======================================================================*\ - Function: _prepare_post_body - Purpose: Prepare post body according to encoding type - Input: $formvars - form variables - $formfiles - form upload files - Output: post body -\*======================================================================*/ - - function _prepare_post_body($formvars, $formfiles) - { - settype($formvars, "array"); - settype($formfiles, "array"); - $postdata = ''; - - if (count($formvars) == 0 && count($formfiles) == 0) - return; - - switch ($this->_submit_type) { - case "application/x-www-form-urlencoded": - reset($formvars); - while(list($key,$val) = each($formvars)) { - if (is_array($val) || is_object($val)) { - while (list($cur_key, $cur_val) = each($val)) { - $postdata .= urlencode($key)."[]=".urlencode($cur_val)."&"; - } - } else - $postdata .= urlencode($key)."=".urlencode($val)."&"; - } - break; - - case "multipart/form-data": - $this->_mime_boundary = "Snoopy".md5(uniqid(microtime())); - - reset($formvars); - while(list($key,$val) = each($formvars)) { - if (is_array($val) || is_object($val)) { - while (list($cur_key, $cur_val) = each($val)) { - $postdata .= "--".$this->_mime_boundary."\r\n"; - $postdata .= "Content-Disposition: form-data; name=\"$key\[\]\"\r\n\r\n"; - $postdata .= "$cur_val\r\n"; - } - } else { - $postdata .= "--".$this->_mime_boundary."\r\n"; - $postdata .= "Content-Disposition: form-data; name=\"$key\"\r\n\r\n"; - $postdata .= "$val\r\n"; - } - } - - reset($formfiles); - while (list($field_name, $file_names) = each($formfiles)) { - settype($file_names, "array"); - while (list(, $file_name) = each($file_names)) { - if (!is_readable($file_name)) continue; - - $fp = fopen($file_name, "r"); - $file_content = fread($fp, filesize($file_name)); - fclose($fp); - $base_name = basename($file_name); - - $postdata .= "--".$this->_mime_boundary."\r\n"; - $postdata .= "Content-Disposition: form-data; name=\"$field_name\"; filename=\"$base_name\"\r\n\r\n"; - $postdata .= "$file_content\r\n"; - } - } - $postdata .= "--".$this->_mime_boundary."--\r\n"; - break; - } - - return $postdata; - } -} - -?> diff --git a/isis/src/docsys/assets/scripts/feed2js/magpie/rss_cache.inc b/isis/src/docsys/assets/scripts/feed2js/magpie/rss_cache.inc deleted file mode 100644 index f54ec3ed25eec6123fad99aad70e84ca92d66000..0000000000000000000000000000000000000000 --- a/isis/src/docsys/assets/scripts/feed2js/magpie/rss_cache.inc +++ /dev/null @@ -1,200 +0,0 @@ -<?php -/* - * Project: MagpieRSS: a simple RSS integration tool - * File: rss_cache.inc, a simple, rolling(no GC), cache - * for RSS objects, keyed on URL. - * Author: Kellan Elliott-McCrea <kellan@protest.net> - * Version: 0.51 - * License: GPL - * - * The latest version of MagpieRSS can be obtained from: - * http://magpierss.sourceforge.net - * - * For questions, help, comments, discussion, etc., please join the - * Magpie mailing list: - * http://lists.sourceforge.net/lists/listinfo/magpierss-general - * - */ - -class RSSCache { - var $BASE_CACHE = './cache'; // where the cache files are stored - var $MAX_AGE = 3600; // when are files stale, default one hour - var $ERROR = ""; // accumulate error messages - - function RSSCache ($base='', $age='') { - if ( $base ) { - $this->BASE_CACHE = $base; - } - if ( $age ) { - $this->MAX_AGE = $age; - } - - // attempt to make the cache directory - if ( ! file_exists( $this->BASE_CACHE ) ) { - $status = @mkdir( $this->BASE_CACHE, 0755 ); - - // if make failed - if ( ! $status ) { - $this->error( - "Cache couldn't make dir '" . $this->BASE_CACHE . "'." - ); - } - } - } - -/*=======================================================================*\ - Function: set - Purpose: add an item to the cache, keyed on url - Input: url from which the rss file was fetched - Output: true on sucess -\*=======================================================================*/ - function set ($url, $rss) { - $this->ERROR = ""; - $cache_file = $this->file_name( $url ); - $fp = @fopen( $cache_file, 'w' ); - - if ( ! $fp ) { - $this->error( - "Cache unable to open file for writing: $cache_file" - ); - return 0; - } - - - $data = $this->serialize( $rss ); - fwrite( $fp, $data ); - fclose( $fp ); - - return $cache_file; - } - -/*=======================================================================*\ - Function: get - Purpose: fetch an item from the cache - Input: url from which the rss file was fetched - Output: cached object on HIT, false on MISS -\*=======================================================================*/ - function get ($url) { - $this->ERROR = ""; - $cache_file = $this->file_name( $url ); - - if ( ! file_exists( $cache_file ) ) { - $this->debug( - "Cache doesn't contain: $url (cache file: $cache_file)" - ); - return 0; - } - - $fp = @fopen($cache_file, 'r'); - if ( ! $fp ) { - $this->error( - "Failed to open cache file for reading: $cache_file" - ); - return 0; - } - - if ($filesize = filesize($cache_file) ) { - $data = fread( $fp, filesize($cache_file) ); - $rss = $this->unserialize( $data ); - - return $rss; - } - - return 0; - } - -/*=======================================================================*\ - Function: check_cache - Purpose: check a url for membership in the cache - and whether the object is older then MAX_AGE (ie. STALE) - Input: url from which the rss file was fetched - Output: cached object on HIT, false on MISS -\*=======================================================================*/ - function check_cache ( $url ) { - $this->ERROR = ""; - $filename = $this->file_name( $url ); - - if ( file_exists( $filename ) ) { - // find how long ago the file was added to the cache - // and whether that is longer then MAX_AGE - $mtime = filemtime( $filename ); - $age = time() - $mtime; - if ( $this->MAX_AGE > $age ) { - // object exists and is current - return 'HIT'; - } - else { - // object exists but is old - return 'STALE'; - } - } - else { - // object does not exist - return 'MISS'; - } - } - - function cache_age( $cache_key ) { - $filename = $this->file_name( $url ); - if ( file_exists( $filename ) ) { - $mtime = filemtime( $filename ); - $age = time() - $mtime; - return $age; - } - else { - return -1; - } - } - -/*=======================================================================*\ - Function: serialize -\*=======================================================================*/ - function serialize ( $rss ) { - return serialize( $rss ); - } - -/*=======================================================================*\ - Function: unserialize -\*=======================================================================*/ - function unserialize ( $data ) { - return unserialize( $data ); - } - -/*=======================================================================*\ - Function: file_name - Purpose: map url to location in cache - Input: url from which the rss file was fetched - Output: a file name -\*=======================================================================*/ - function file_name ($url) { - $filename = md5( $url ); - return join( DIRECTORY_SEPARATOR, array( $this->BASE_CACHE, $filename ) ); - } - -/*=======================================================================*\ - Function: error - Purpose: register error -\*=======================================================================*/ - function error ($errormsg, $lvl=E_USER_WARNING) { - // append PHP's error message if track_errors enabled - if ( isset($php_errormsg) ) { - $errormsg .= " ($php_errormsg)"; - } - $this->ERROR = $errormsg; - if ( MAGPIE_DEBUG ) { - trigger_error( $errormsg, $lvl); - } - else { - error_log( $errormsg, 0); - } - } - - function debug ($debugmsg, $lvl=E_USER_NOTICE) { - if ( MAGPIE_DEBUG ) { - $this->error("MagpieRSS [debug] $debugmsg", $lvl); - } - } - -} - -?> diff --git a/isis/src/docsys/assets/scripts/feed2js/magpie/rss_fetch.inc b/isis/src/docsys/assets/scripts/feed2js/magpie/rss_fetch.inc deleted file mode 100644 index 68e2ba4eaa238c83d29c8385030b1ddaf79ba62d..0000000000000000000000000000000000000000 --- a/isis/src/docsys/assets/scripts/feed2js/magpie/rss_fetch.inc +++ /dev/null @@ -1,458 +0,0 @@ -<?php -/* - * Project: MagpieRSS: a simple RSS integration tool - * File: rss_fetch.inc, a simple functional interface - to fetching and parsing RSS files, via the - function fetch_rss() - * Author: Kellan Elliott-McCrea <kellan@protest.net> - * License: GPL - * - * The latest version of MagpieRSS can be obtained from: - * http://magpierss.sourceforge.net - * - * For questions, help, comments, discussion, etc., please join the - * Magpie mailing list: - * magpierss-general@lists.sourceforge.net - * - */ - -// Setup MAGPIE_DIR for use on hosts that don't include -// the current path in include_path. -// with thanks to rajiv and smarty -if (!defined('DIR_SEP')) { - define('DIR_SEP', DIRECTORY_SEPARATOR); -} - -if (!defined('MAGPIE_DIR')) { - define('MAGPIE_DIR', dirname(__FILE__) . DIR_SEP); -} - -require_once( MAGPIE_DIR . 'rss_parse.inc' ); -require_once( MAGPIE_DIR . 'rss_cache.inc' ); - -// for including 3rd party libraries -define('MAGPIE_EXTLIB', MAGPIE_DIR . 'extlib' . DIR_SEP); -require_once( MAGPIE_EXTLIB . 'Snoopy.class.inc'); - - -/* - * CONSTANTS - redefine these in your script to change the - * behaviour of fetch_rss() currently, most options effect the cache - * - * MAGPIE_CACHE_ON - Should Magpie cache parsed RSS objects? - * For me a built in cache was essential to creating a "PHP-like" - * feel to Magpie, see rss_cache.inc for rationale - * - * - * MAGPIE_CACHE_DIR - Where should Magpie cache parsed RSS objects? - * This should be a location that the webserver can write to. If this - * directory does not already exist Magpie will try to be smart and create - * it. This will often fail for permissions reasons. - * - * - * MAGPIE_CACHE_AGE - How long to store cached RSS objects? In seconds. - * - * - * MAGPIE_CACHE_FRESH_ONLY - If remote fetch fails, throw error - * instead of returning stale object? - * - * MAGPIE_DEBUG - Display debugging notices? - * -*/ - - -/*=======================================================================*\ - Function: fetch_rss: - Purpose: return RSS object for the give url - maintain the cache - Input: url of RSS file - Output: parsed RSS object (see rss_parse.inc) - - NOTES ON CACHEING: - If caching is on (MAGPIE_CACHE_ON) fetch_rss will first check the cache. - - NOTES ON RETRIEVING REMOTE FILES: - If conditional gets are on (MAGPIE_CONDITIONAL_GET_ON) fetch_rss will - return a cached object, and touch the cache object upon receiving a - 304. - - NOTES ON FAILED REQUESTS: - If there is an HTTP error while fetching an RSS object, the cached - version will be return, if it exists (and if MAGPIE_CACHE_FRESH_ONLY is off) -\*=======================================================================*/ - -define('MAGPIE_VERSION', '0.72'); - -$MAGPIE_ERROR = ""; - -function fetch_rss ($url) { - // initialize constants - init(); - - if ( !isset($url) ) { - error("fetch_rss called without a url"); - return false; - } - - // if cache is disabled - if ( !MAGPIE_CACHE_ON ) { - // fetch file, and parse it - $resp = _fetch_remote_file( $url ); - if ( is_success( $resp->status ) ) { - return _response_to_rss( $resp ); - } - else { - error("Failed to fetch $url and cache is off"); - return false; - } - } - // else cache is ON - else { - // Flow - // 1. check cache - // 2. if there is a hit, make sure its fresh - // 3. if cached obj fails freshness check, fetch remote - // 4. if remote fails, return stale object, or error - - $cache = new RSSCache( MAGPIE_CACHE_DIR, MAGPIE_CACHE_AGE ); - - if (MAGPIE_DEBUG and $cache->ERROR) { - debug($cache->ERROR, E_USER_WARNING); - } - - - $cache_status = 0; // response of check_cache - $request_headers = array(); // HTTP headers to send with fetch - $rss = 0; // parsed RSS object - $errormsg = 0; // errors, if any - - // store parsed XML by desired output encoding - // as character munging happens at parse time - $cache_key = $url . MAGPIE_OUTPUT_ENCODING; - - if (!$cache->ERROR) { - // return cache HIT, MISS, or STALE - $cache_status = $cache->check_cache( $cache_key); - } - - // if object cached, and cache is fresh, return cached obj - if ( $cache_status == 'HIT' ) { - $rss = $cache->get( $cache_key ); - if ( isset($rss) and $rss ) { - // should be cache age - $rss->from_cache = 1; - if ( MAGPIE_DEBUG > 1) { - debug("MagpieRSS: Cache HIT", E_USER_NOTICE); - } - return $rss; - } - } - - // else attempt a conditional get - - // setup headers - if ( $cache_status == 'STALE' ) { - $rss = $cache->get( $cache_key ); - if ( $rss and $rss->etag and $rss->last_modified ) { - $request_headers['If-None-Match'] = $rss->etag; - $request_headers['If-Last-Modified'] = $rss->last_modified; - } - } - - $resp = _fetch_remote_file( $url, $request_headers ); - - if (isset($resp) and $resp) { - if ($resp->status == '304' ) { - // we have the most current copy - if ( MAGPIE_DEBUG > 1) { - debug("Got 304 for $url"); - } - // reset cache on 304 (at minutillo insistent prodding) - $cache->set($cache_key, $rss); - return $rss; - } - elseif ( is_success( $resp->status ) ) { - $rss = _response_to_rss( $resp ); - if ( $rss ) { - if (MAGPIE_DEBUG > 1) { - debug("Fetch successful"); - } - // add object to cache - $cache->set( $cache_key, $rss ); - return $rss; - } - } - else { - $errormsg = "Failed to fetch $url "; - if ( $resp->status == '-100' ) { - $errormsg .= "(Request timed out after " . MAGPIE_FETCH_TIME_OUT . " seconds)"; - } - elseif ( $resp->error ) { - # compensate for Snoopy's annoying habbit to tacking - # on '\n' - $http_error = substr($resp->error, 0, -2); - $errormsg .= "(HTTP Error: $http_error)"; - } - else { - $errormsg .= "(HTTP Response: " . $resp->response_code .')'; - } - } - } - else { - $errormsg = "Unable to retrieve RSS file for unknown reasons."; - } - - // else fetch failed - - // attempt to return cached object - if ($rss) { - if ( MAGPIE_DEBUG ) { - debug("Returning STALE object for $url"); - } - return $rss; - } - - // else we totally failed - error( $errormsg ); - - return false; - - } // end if ( !MAGPIE_CACHE_ON ) { -} // end fetch_rss() - -/*=======================================================================*\ - Function: error - Purpose: set MAGPIE_ERROR, and trigger error -\*=======================================================================*/ - -function error ($errormsg, $lvl=E_USER_WARNING) { - global $MAGPIE_ERROR; - - // append PHP's error message if track_errors enabled - if ( isset($php_errormsg) ) { - $errormsg .= " ($php_errormsg)"; - } - if ( $errormsg ) { - $errormsg = "MagpieRSS: $errormsg"; - $MAGPIE_ERROR = $errormsg; - trigger_error( $errormsg, $lvl); - } -} - -function debug ($debugmsg, $lvl=E_USER_NOTICE) { - trigger_error("MagpieRSS [debug] $debugmsg", $lvl); -} - -/*=======================================================================*\ - Function: magpie_error - Purpose: accessor for the magpie error variable -\*=======================================================================*/ -function magpie_error ($errormsg="") { - global $MAGPIE_ERROR; - - if ( isset($errormsg) and $errormsg ) { - $MAGPIE_ERROR = $errormsg; - } - - return $MAGPIE_ERROR; -} - -/*=======================================================================*\ - Function: _fetch_remote_file - Purpose: retrieve an arbitrary remote file - Input: url of the remote file - headers to send along with the request (optional) - Output: an HTTP response object (see Snoopy.class.inc) -\*=======================================================================*/ -function _fetch_remote_file ($url, $headers = "" ) { - // Snoopy is an HTTP client in PHP - $client = new Snoopy(); - $client->agent = MAGPIE_USER_AGENT; - $client->read_timeout = MAGPIE_FETCH_TIME_OUT; - $client->use_gzip = MAGPIE_USE_GZIP; - if (is_array($headers) ) { - $client->rawheaders = $headers; - } - - @$client->fetch($url); - return $client; - -} - -/*=======================================================================*\ - Function: _response_to_rss - Purpose: parse an HTTP response object into an RSS object - Input: an HTTP response object (see Snoopy) - Output: parsed RSS object (see rss_parse) -\*=======================================================================*/ -function _response_to_rss ($resp) { - $rss = new MagpieRSS( $resp->results, MAGPIE_OUTPUT_ENCODING, MAGPIE_INPUT_ENCODING, MAGPIE_DETECT_ENCODING ); - - // if RSS parsed successfully - if ( $rss and !$rss->ERROR) { - - // find Etag, and Last-Modified - foreach($resp->headers as $h) { - // 2003-03-02 - Nicola Asuni (www.tecnick.com) - fixed bug "Undefined offset: 1" - if (strpos($h, ": ")) { - list($field, $val) = explode(": ", $h, 2); - } - else { - $field = $h; - $val = ""; - } - - if ( $field == 'ETag' ) { - $rss->etag = $val; - } - - if ( $field == 'Last-Modified' ) { - $rss->last_modified = $val; - } - } - - return $rss; - } // else construct error message - else { - $errormsg = "Failed to parse RSS file."; - - if ($rss) { - $errormsg .= " (" . $rss->ERROR . ")"; - } - error($errormsg); - - return false; - } // end if ($rss and !$rss->error) -} - -/*=======================================================================*\ - Function: init - Purpose: setup constants with default values - check for user overrides -\*=======================================================================*/ -function init () { - if ( defined('MAGPIE_INITALIZED') ) { - return; - } - else { - define('MAGPIE_INITALIZED', true); - } - - if ( !defined('MAGPIE_CACHE_ON') ) { - define('MAGPIE_CACHE_ON', true); - } - - if ( !defined('MAGPIE_CACHE_DIR') ) { - define('MAGPIE_CACHE_DIR', './cache'); - } - - if ( !defined('MAGPIE_CACHE_AGE') ) { - define('MAGPIE_CACHE_AGE', 60*60); // one hour - } - - if ( !defined('MAGPIE_CACHE_FRESH_ONLY') ) { - define('MAGPIE_CACHE_FRESH_ONLY', false); - } - - if ( !defined('MAGPIE_OUTPUT_ENCODING') ) { - define('MAGPIE_OUTPUT_ENCODING', 'ISO-8859-1'); - } - - if ( !defined('MAGPIE_INPUT_ENCODING') ) { - define('MAGPIE_INPUT_ENCODING', null); - } - - if ( !defined('MAGPIE_DETECT_ENCODING') ) { - define('MAGPIE_DETECT_ENCODING', true); - } - - if ( !defined('MAGPIE_DEBUG') ) { - define('MAGPIE_DEBUG', 0); - } - - if ( !defined('MAGPIE_USER_AGENT') ) { - $ua = 'MagpieRSS/'. MAGPIE_VERSION . ' (+http://magpierss.sf.net'; - - if ( MAGPIE_CACHE_ON ) { - $ua = $ua . ')'; - } - else { - $ua = $ua . '; No cache)'; - } - - define('MAGPIE_USER_AGENT', $ua); - } - - if ( !defined('MAGPIE_FETCH_TIME_OUT') ) { - define('MAGPIE_FETCH_TIME_OUT', 5); // 5 second timeout - } - - // use gzip encoding to fetch rss files if supported? - if ( !defined('MAGPIE_USE_GZIP') ) { - define('MAGPIE_USE_GZIP', true); - } -} - -// NOTE: the following code should really be in Snoopy, or at least -// somewhere other then rss_fetch! - -/*=======================================================================*\ - HTTP STATUS CODE PREDICATES - These functions attempt to classify an HTTP status code - based on RFC 2616 and RFC 2518. - - All of them take an HTTP status code as input, and return true or false - - All this code is adapted from LWP's HTTP::Status. -\*=======================================================================*/ - - -/*=======================================================================*\ - Function: is_info - Purpose: return true if Informational status code -\*=======================================================================*/ -function is_info ($sc) { - return $sc >= 100 && $sc < 200; -} - -/*=======================================================================*\ - Function: is_success - Purpose: return true if Successful status code -\*=======================================================================*/ -function is_success ($sc) { - return $sc >= 200 && $sc < 300; -} - -/*=======================================================================*\ - Function: is_redirect - Purpose: return true if Redirection status code -\*=======================================================================*/ -function is_redirect ($sc) { - return $sc >= 300 && $sc < 400; -} - -/*=======================================================================*\ - Function: is_error - Purpose: return true if Error status code -\*=======================================================================*/ -function is_error ($sc) { - return $sc >= 400 && $sc < 600; -} - -/*=======================================================================*\ - Function: is_client_error - Purpose: return true if Error status code, and its a client error -\*=======================================================================*/ -function is_client_error ($sc) { - return $sc >= 400 && $sc < 500; -} - -/*=======================================================================*\ - Function: is_client_error - Purpose: return true if Error status code, and its a server error -\*=======================================================================*/ -function is_server_error ($sc) { - return $sc >= 500 && $sc < 600; -} - -?> diff --git a/isis/src/docsys/assets/scripts/feed2js/magpie/rss_parse.inc b/isis/src/docsys/assets/scripts/feed2js/magpie/rss_parse.inc deleted file mode 100644 index 4deb848c11903a72f03399fc3c9d8ad48b5bfe21..0000000000000000000000000000000000000000 --- a/isis/src/docsys/assets/scripts/feed2js/magpie/rss_parse.inc +++ /dev/null @@ -1,613 +0,0 @@ -<?php - -/** -* Project: MagpieRSS: a simple RSS integration tool -* File: rss_parse.inc - parse an RSS or Atom feed -* return as a simple object. -* -* Handles RSS 0.9x, RSS 2.0, RSS 1.0, and Atom 0.3 -* -* The lastest version of MagpieRSS can be obtained from: -* http://magpierss.sourceforge.net -* -* For questions, help, comments, discussion, etc., please join the -* Magpie mailing list: -* magpierss-general@lists.sourceforge.net -* -* @author Kellan Elliott-McCrea <kellan@protest.net> -* @version 0.7a (with patch for RSS enclosures at line 209) -* @license GPL -* -*/ - -define('RSS', 'RSS'); -define('ATOM', 'Atom'); - -require_once (MAGPIE_DIR . 'rss_utils.inc'); - -/** -* Hybrid parser, and object, takes RSS as a string and returns a simple object. -* -* see: rss_fetch.inc for a simpler interface with integrated caching support -* -*/ -class MagpieRSS { - var $parser; - - var $current_item = array(); // item currently being parsed - var $items = array(); // collection of parsed items - var $channel = array(); // hash of channel fields - var $textinput = array(); - var $image = array(); - var $feed_type; - var $feed_version; - var $encoding = ''; // output encoding of parsed rss - - var $_source_encoding = ''; // only set if we have to parse xml prolog - - var $ERROR = ""; - var $WARNING = ""; - - // define some constants - - var $_CONTENT_CONSTRUCTS = array('content', 'summary', 'info', 'title', 'tagline', 'copyright'); - var $_KNOWN_ENCODINGS = array('UTF-8', 'US-ASCII', 'ISO-8859-1'); - - // parser variables, useless if you're not a parser, treat as private - var $stack = array(); // parser stack - var $inchannel = false; - var $initem = false; - var $incontent = false; // if in Atom <content mode="xml"> field - var $intextinput = false; - var $inimage = false; - var $current_namespace = false; - - - /** - * Set up XML parser, parse source, and return populated RSS object.. - * - * @param string $source string containing the RSS to be parsed - * - * NOTE: Probably a good idea to leave the encoding options alone unless - * you know what you're doing as PHP's character set support is - * a little weird. - * - * NOTE: A lot of this is unnecessary but harmless with PHP5 - * - * - * @param string $output_encoding output the parsed RSS in this character - * set defaults to ISO-8859-1 as this is PHP's - * default. - * - * NOTE: might be changed to UTF-8 in future - * versions. - * - * @param string $input_encoding the character set of the incoming RSS source. - * Leave blank and Magpie will try to figure it - * out. - * - * - * @param bool $detect_encoding if false Magpie won't attempt to detect - * source encoding. (caveat emptor) - * - */ - function MagpieRSS ($source, $output_encoding='ISO-8859-1', - $input_encoding=null, $detect_encoding=true) - { - # if PHP xml isn't compiled in, die - # - if (!function_exists('xml_parser_create')) { - $this->error( "Failed to load PHP's XML Extension. " . - "http://www.php.net/manual/en/ref.xml.php", - E_USER_ERROR ); - } - - list($parser, $source) = $this->create_parser($source, - $output_encoding, $input_encoding, $detect_encoding); - - - if (!is_resource($parser)) { - $this->error( "Failed to create an instance of PHP's XML parser. " . - "http://www.php.net/manual/en/ref.xml.php", - E_USER_ERROR ); - } - - - $this->parser = $parser; - - # pass in parser, and a reference to this object - # setup handlers - # - xml_set_object( $this->parser, $this ); - xml_set_element_handler($this->parser, - 'feed_start_element', 'feed_end_element' ); - - xml_set_character_data_handler( $this->parser, 'feed_cdata' ); - - $status = xml_parse( $this->parser, $source ); - - if (! $status ) { - $errorcode = xml_get_error_code( $this->parser ); - if ( $errorcode != XML_ERROR_NONE ) { - $xml_error = xml_error_string( $errorcode ); - $error_line = xml_get_current_line_number($this->parser); - $error_col = xml_get_current_column_number($this->parser); - $errormsg = "$xml_error at line $error_line, column $error_col"; - - $this->error( $errormsg ); - } - } - - xml_parser_free( $this->parser ); - - $this->normalize(); - } - - function feed_start_element($p, $element, &$attrs) { - $el = $element = strtolower($element); - $attrs = array_change_key_case($attrs, CASE_LOWER); - - // check for a namespace, and split if found - $ns = false; - if ( strpos( $element, ':' ) ) { - list($ns, $el) = split( ':', $element, 2); - } - if ( $ns and $ns != 'rdf' ) { - $this->current_namespace = $ns; - } - - # if feed type isn't set, then this is first element of feed - # identify feed from root element - # - if (!isset($this->feed_type) ) { - if ( $el == 'rdf' ) { - $this->feed_type = RSS; - $this->feed_version = '1.0'; - } - elseif ( $el == 'rss' ) { - $this->feed_type = RSS; - $this->feed_version = $attrs['version']; - } - elseif ( $el == 'feed' ) { - $this->feed_type = ATOM; - $this->feed_version = $attrs['version']; - $this->inchannel = true; - } - return; - } - - if ( $el == 'channel' ) - { - $this->inchannel = true; - } - elseif ($el == 'item' or $el == 'entry' ) - { - $this->initem = true; - if ( isset($attrs['rdf:about']) ) { - $this->current_item['about'] = $attrs['rdf:about']; - } - } - - // if we're in the default namespace of an RSS feed, - // record textinput or image fields - elseif ( - $this->feed_type == RSS and - $this->current_namespace == '' and - $el == 'textinput' ) - { - $this->intextinput = true; - } - - elseif ( - $this->feed_type == RSS and - $this->current_namespace == '' and - $el == 'image' ) - { - $this->inimage = true; - } - - elseif ( - $this->feed_type == RSS and - $el == 'enclosure' ) - { - $this->current_item[$el][] = $attrs; - $this->incontent = $el; - } - - # handle atom content constructs - elseif ( $this->feed_type == ATOM and in_array($el, $this->_CONTENT_CONSTRUCTS) ) - { - // avoid clashing w/ RSS mod_content - if ($el == 'content' ) { - $el = 'atom_content'; - } - - $this->incontent = $el; - - - } - - // if inside an Atom content construct (e.g. content or summary) field treat tags as text - elseif ($this->feed_type == ATOM and $this->incontent ) - { - // if tags are inlined, then flatten - $attrs_str = join(' ', - array_map('map_attrs', - array_keys($attrs), - array_values($attrs) ) ); - - $this->append_content( "<$element $attrs_str>" ); - - array_unshift( $this->stack, $el ); - } - - // Atom support many links per containging element. - // Magpie treats link elements of type rel='alternate' - // as being equivalent to RSS's simple link element. - // - elseif ($this->feed_type == ATOM and $el == 'link' ) - { - if ( isset($attrs['rel']) and $attrs['rel'] == 'alternate' ) - { - $link_el = 'link'; - } - else { - $link_el = 'link_' . $attrs['rel']; - } - - $this->append($link_el, $attrs['href']); - } - // set stack[0] to current element - else { - array_unshift($this->stack, $el); - } - } - - - - function feed_cdata ($p, $text) { - if ($this->feed_type == ATOM and $this->incontent) - { - $this->append_content( $text ); - } - else { - $current_el = join('_', array_reverse($this->stack)); - $this->append($current_el, $text); - } - } - - function feed_end_element ($p, $el) { - $el = strtolower($el); - - if ( $el == 'item' or $el == 'entry' ) - { - $this->items[] = $this->current_item; - $this->current_item = array(); - $this->initem = false; - } - elseif ($this->feed_type == RSS and $this->current_namespace == '' and $el == 'textinput' ) - { - $this->intextinput = false; - } - elseif ($this->feed_type == RSS and $this->current_namespace == '' and $el == 'image' ) - { - $this->inimage = false; - } - elseif ($this->feed_type == ATOM and in_array($el, $this->_CONTENT_CONSTRUCTS) ) - { - $this->incontent = false; - } - elseif ($el == 'channel' or $el == 'feed' ) - { - $this->inchannel = false; - } - elseif ($this->feed_type == ATOM and $this->incontent ) { - // balance tags properly - // note: i don't think this is actually neccessary - if ( $this->stack[0] == $el ) - { - $this->append_content("</$el>"); - } - else { - $this->append_content("<$el />"); - } - - array_shift( $this->stack ); - } - else { - array_shift( $this->stack ); - } - - $this->current_namespace = false; - } - - function concat (&$str1, $str2="") { - if (!isset($str1) ) { - $str1=""; - } - $str1 .= $str2; - } - - - - function append_content($text) { - if ( $this->initem ) { - $this->concat( $this->current_item[ $this->incontent ], $text ); - } - elseif ( $this->inchannel ) { - $this->concat( $this->channel[ $this->incontent ], $text ); - } - } - - // smart append - field and namespace aware - function append($el, $text) { - if (!$el) { - return; - } - if ( $this->current_namespace ) - { - if ( $this->initem ) { - $this->concat( - $this->current_item[ $this->current_namespace ][ $el ], $text); - } - elseif ($this->inchannel) { - $this->concat( - $this->channel[ $this->current_namespace][ $el ], $text ); - } - elseif ($this->intextinput) { - $this->concat( - $this->textinput[ $this->current_namespace][ $el ], $text ); - } - elseif ($this->inimage) { - $this->concat( - $this->image[ $this->current_namespace ][ $el ], $text ); - } - } - else { - if ( $this->initem ) { - $this->concat( - $this->current_item[ $el ], $text); - } - elseif ($this->intextinput) { - $this->concat( - $this->textinput[ $el ], $text ); - } - elseif ($this->inimage) { - $this->concat( - $this->image[ $el ], $text ); - } - elseif ($this->inchannel) { - $this->concat( - $this->channel[ $el ], $text ); - } - - } - } - - function normalize () { - // if atom populate rss fields - if ( $this->is_atom() ) { - $this->channel['description'] = $this->channel['tagline']; - for ( $i = 0; $i < count($this->items); $i++) { - $item = $this->items[$i]; - if ( isset($item['summary']) ) - $item['description'] = $item['summary']; - if ( isset($item['atom_content'])) - $item['content']['encoded'] = $item['atom_content']; - - $atom_date = (isset($item['issued']) ) ? $item['issued'] : $item['modified']; - if ( $atom_date ) { - $epoch = @parse_w3cdtf($atom_date); - if ($epoch and $epoch > 0) { - $item['date_timestamp'] = $epoch; - } - } - - $this->items[$i] = $item; - } - } - elseif ( $this->is_rss() ) { - $this->channel['tagline'] = $this->channel['description']; - for ( $i = 0; $i < count($this->items); $i++) { - $item = $this->items[$i]; - if ( isset($item['description'])) - $item['summary'] = $item['description']; - if ( isset($item['content']['encoded'] ) ) - $item['atom_content'] = $item['content']['encoded']; - - if ( $this->is_rss() == '1.0' and isset($item['dc']['date']) ) { - $epoch = @parse_w3cdtf($item['dc']['date']); - if ($epoch and $epoch > 0) { - $item['date_timestamp'] = $epoch; - } - } - elseif ( isset($item['pubdate']) ) { - $epoch = @strtotime($item['pubdate']); - if ($epoch > 0) { - $item['date_timestamp'] = $epoch; - } - } - - $this->items[$i] = $item; - } - } - } - - - function is_rss () { - if ( $this->feed_type == RSS ) { - return $this->feed_version; - } - else { - return false; - } - } - - function is_atom() { - if ( $this->feed_type == ATOM ) { - return $this->feed_version; - } - else { - return false; - } - } - - /** - * return XML parser, and possibly re-encoded source - * - */ - function create_parser($source, $out_enc, $in_enc, $detect) { - if ( substr(phpversion(),0,1) == 5) { - $parser = $this->php5_create_parser($in_enc, $detect); - } - else { - list($parser, $source) = $this->php4_create_parser($source, $in_enc, $detect); - } - if ($out_enc) { - $this->encoding = $out_enc; - xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, $out_enc); - } - - return array($parser, $source); - } - - /** - * Instantiate an XML parser under PHP5 - * - * PHP5 will do a fine job of detecting input encoding - * if passed an empty string as the encoding. - * - * All hail libxml2! - * - */ - function php5_create_parser($in_enc, $detect) { - // by default php5 does a fine job of detecting input encodings - if(!$detect && $in_enc) { - return xml_parser_create($in_enc); - } - else { - return xml_parser_create(''); - } - } - - /** - * Instaniate an XML parser under PHP4 - * - * Unfortunately PHP4's support for character encodings - * and especially XML and character encodings sucks. As - * long as the documents you parse only contain characters - * from the ISO-8859-1 character set (a superset of ASCII, - * and a subset of UTF-8) you're fine. However once you - * step out of that comfy little world things get mad, bad, - * and dangerous to know. - * - * The following code is based on SJM's work with FoF - * @see http://minutillo.com/steve/weblog/2004/6/17/php-xml-and-character-encodings-a-tale-of-sadness-rage-and-data-loss - * - */ - function php4_create_parser($source, $in_enc, $detect) { - if ( !$detect ) { - return array(xml_parser_create($in_enc), $source); - } - - if (!$in_enc) { - if (preg_match('/<?xml.*encoding=[\'"](.*?)[\'"].*?>/m', $source, $m)) { - $in_enc = strtoupper($m[1]); - $this->source_encoding = $in_enc; - } - else { - $in_enc = 'UTF-8'; - } - } - - if ($this->known_encoding($in_enc)) { - return array(xml_parser_create($in_enc), $source); - } - - // the dectected encoding is not one of the simple encodings PHP knows - - // attempt to use the iconv extension to - // cast the XML to a known encoding - // @see http://php.net/iconv - - if (function_exists('iconv')) { - $encoded_source = iconv($in_enc,'UTF-8', $source); - if ($encoded_source) { - return array(xml_parser_create('UTF-8'), $encoded_source); - } - } - - // iconv didn't work, try mb_convert_encoding - // @see http://php.net/mbstring - if(function_exists('mb_convert_encoding')) { - $encoded_source = mb_convert_encoding($source, 'UTF-8', $in_enc ); - if ($encoded_source) { - return array(xml_parser_create('UTF-8'), $encoded_source); - } - } - - // else - $this->error("Feed is in an unsupported character encoding. ($in_enc) " . - "You may see strange artifacts, and mangled characters.", - E_USER_NOTICE); - - return array(xml_parser_create(), $source); - } - - function known_encoding($enc) { - $enc = strtoupper($enc); - if ( in_array($enc, $this->_KNOWN_ENCODINGS) ) { - return $enc; - } - else { - return false; - } - } - - function error ($errormsg, $lvl=E_USER_WARNING) { - // append PHP's error message if track_errors enabled - if ( isset($php_errormsg) ) { - $errormsg .= " ($php_errormsg)"; - } - if ( MAGPIE_DEBUG ) { - trigger_error( $errormsg, $lvl); - } - else { - error_log( $errormsg, 0); - } - - $notices = E_USER_NOTICE|E_NOTICE; - if ( $lvl&$notices ) { - $this->WARNING = $errormsg; - } else { - $this->ERROR = $errormsg; - } - } - - -} // end class RSS - -function map_attrs($k, $v) { - return "$k=\"$v\""; -} - -// patch to support medieval versions of PHP4.1.x, -// courtesy, Ryan Currie, ryan@digibliss.com - -if (!function_exists('array_change_key_case')) { - define("CASE_UPPER",1); - define("CASE_LOWER",0); - - - function array_change_key_case($array,$case=CASE_LOWER) { - if ($case=CASE_LOWER) $cmd=strtolower; - elseif ($case=CASE_UPPER) $cmd=strtoupper; - foreach($array as $key=>$value) { - $output[$cmd($key)]=$value; - } - return $output; - } - -} - -?> diff --git a/isis/src/docsys/assets/scripts/feed2js/magpie/rss_utils.inc b/isis/src/docsys/assets/scripts/feed2js/magpie/rss_utils.inc deleted file mode 100644 index 2a29e72a9696598bd8f1eca21aa4f955ebf4b243..0000000000000000000000000000000000000000 --- a/isis/src/docsys/assets/scripts/feed2js/magpie/rss_utils.inc +++ /dev/null @@ -1,67 +0,0 @@ -<?php -/* - * Project: MagpieRSS: a simple RSS integration tool - * File: rss_utils.inc, utility methods for working with RSS - * Author: Kellan Elliott-McCrea <kellan@protest.net> - * Version: 0.51 - * License: GPL - * - * The lastest version of MagpieRSS can be obtained from: - * http://magpierss.sourceforge.net - * - * For questions, help, comments, discussion, etc., please join the - * Magpie mailing list: - * magpierss-general@lists.sourceforge.net - */ - - -/*======================================================================*\ - Function: parse_w3cdtf - Purpose: parse a W3CDTF date into unix epoch - - NOTE: http://www.w3.org/TR/NOTE-datetime -\*======================================================================*/ - -function parse_w3cdtf ( $date_str ) { - - # regex to match wc3dtf - $pat = "/(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2})(:(\d{2}))?(?:([-+])(\d{2}):?(\d{2})|(Z))?/"; - - if ( preg_match( $pat, $date_str, $match ) ) { - list( $year, $month, $day, $hours, $minutes, $seconds) = - array( $match[1], $match[2], $match[3], $match[4], $match[5], $match[6]); - - # calc epoch for current date assuming GMT - $epoch = gmmktime( $hours, $minutes, $seconds, $month, $day, $year); - - $offset = 0; - if ( $match[10] == 'Z' ) { - # zulu time, aka GMT - } - else { - list( $tz_mod, $tz_hour, $tz_min ) = - array( $match[8], $match[9], $match[10]); - - # zero out the variables - if ( ! $tz_hour ) { $tz_hour = 0; } - if ( ! $tz_min ) { $tz_min = 0; } - - $offset_secs = (($tz_hour*60)+$tz_min)*60; - - # is timezone ahead of GMT? then subtract offset - # - if ( $tz_mod == '+' ) { - $offset_secs = $offset_secs * -1; - } - - $offset = $offset_secs; - } - $epoch = $epoch + $offset; - return $epoch; - } - else { - return -1; - } -} - -?> diff --git a/isis/src/docsys/assets/scripts/feed2js/magpie_debug.php b/isis/src/docsys/assets/scripts/feed2js/magpie_debug.php deleted file mode 100644 index 3e8e0e010e775794eb0ec4fbaac20cecd023671e..0000000000000000000000000000000000000000 --- a/isis/src/docsys/assets/scripts/feed2js/magpie_debug.php +++ /dev/null @@ -1,87 +0,0 @@ -<?php - -ini_set('display_errors', 1); -ini_set('error_reporting', E_ALL); -define('MAGPIE_OUTPUT_ENCODING', 'UTF-8'); - -// set magpie root -define('MAGPIE_DIR', './magpie/'); - - -// define magpie cache directory -define('MAGPIE_CACHE_DIR', MAGPIE_DIR . 'cache/'); - -define('MAGPIE_DEBUG', 1); - -// flush cache quickly for debugging purposes, don't do this on a live site -define('MAGPIE_CACHE_AGE', 10); - -require_once(MAGPIE_DIR.'rss_fetch.inc'); - - -if ( isset($_GET['url']) ) { - $url = $_GET['url']; -} -else { - $url = 'http://magpierss.sf.net/test.rss'; -} - - -test_library_support(); - -$rss = fetch_rss( $url ); - -if ($rss) { - echo "<h3>Example Output</h3>"; - echo "Channel: " . $rss->channel['title'] . "<p>"; - echo "<ul>"; - foreach ($rss->items as $item) { - $href = $item['link']; - $title = $item['title']; - echo "<li><a href=$href>$title</a></li>"; - } - echo "</ul>"; -} -else { - echo "Error: " . magpie_error(); -} -?> - -<form> - RSS URL: <input type="text" size="30" name="url" value="<?php echo $url ?>"><br /> - <input type="submit" value="Parse RSS"> -</form> - -<h3>Parsed Results (var_dump'ed)</h3> -<pre> -<?php var_dump($rss); ?> -</pre> - -<?php - -function test_library_support() { - if (!function_exists('xml_parser_create')) { - echo "<b>Error:</b> PHP compiled without XML support (--with-xml), Magpie won't work without PHP support for XML.<br />\n"; - exit; - } - else { - echo "<b>OK:</b> Found an XML parser. <br />\n"; - } - - if ( ! function_exists('gzinflate') ) { - echo "<b>Warning:</b> PHP compiled without Zlib support (--with-zlib). No support for GZIP encoding.<br />\n"; - } - else { - echo "<b>OK:</b> Support for GZIP encoding.<br />\n"; - } - - if ( ! (function_exists('iconv') and function_exists('mb_convert_encoding') ) ) { - echo "<b>Warning:</b> No support for iconv (--with-iconv) or multi-byte strings (--enable-mbstring)." . - "No support character set munging.<br />\n"; - } - else { - echo "<b>OK:</b> Support for character munging.<br />\n"; - } -} - -?> diff --git a/isis/src/docsys/assets/scripts/feed2js/magpie_simple.php b/isis/src/docsys/assets/scripts/feed2js/magpie_simple.php deleted file mode 100644 index ae84b5e174a046c75746368e389e2fd5aa8f9880..0000000000000000000000000000000000000000 --- a/isis/src/docsys/assets/scripts/feed2js/magpie_simple.php +++ /dev/null @@ -1,28 +0,0 @@ -<?php - -include 'feed2js_config.php'; - -$url = $_GET['url']; - -if ( $url ) { - $rss = fetch_rss( $url ); - echo "Channel: " . $rss->channel['title'] . "<p>"; - echo "<ul>"; - foreach ($rss->items as $item) { - $href = $item['link']; - $title = $item['title']; - echo "<li><a href=$href>$title</a></li>"; - } - echo "</ul>"; -} -?> - -<form> - RSS URL: <input type="text" size="30" name="url" value="<?php echo $url ?>"><br /> - <input type="submit" value="Parse RSS"> -</form> - -<p> -<h2>Security Note:</h2> -This is a simple <b>example</b> script. If this was a <b>real</b> script we probably wouldn't allow strangers to submit random URLs, and we certainly wouldn't simply echo anything passed in the URL. Additionally its a bad idea to leave this example script lying around. -</p> \ No newline at end of file diff --git a/isis/src/docsys/assets/scripts/feed2js/nosource.php b/isis/src/docsys/assets/scripts/feed2js/nosource.php deleted file mode 100644 index 0e70486ecf6c08a9d708d5f314c75032bf819a2a..0000000000000000000000000000000000000000 --- a/isis/src/docsys/assets/scripts/feed2js/nosource.php +++ /dev/null @@ -1,41 +0,0 @@ -<?php - -// function to return the path to the correct directory for the RSS2Js files -function whatsmypath() { - return 'http://' . $_SERVER['SERVER_NAME'] . dirname($_SERVER['PHP_SELF']); -} -?> - -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" - "http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd"> -<html> -<head> - <title>No XML Source</title> -<style type="text/css" > -<!-- -A:link {color: #002244;} -A:visited {color: #663300;} -body {background-color:#D8D9D5; padding:0; margin:0;} -#main {margin: 5% 10%; padding: 10px 60px; background-color:#FFF; border:2px dotted #444;} -h1 { font-family: Courier, "Courier New", monospaced; font-size: xx-large; margin-bottom:0;} -p {font-family: Georgia, Bookman, "Times New Roman", Times, serif; line-height:150%;} -.blurb { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: x-small; color:#933; margin:1em 5%;} ---> -</style> -</head> -<body> -<div id="main"> -<h1 align="center">XML error</h1> -<p>There is an error in the requested URL as no xml source was provided. A correct request should look like:</p> - - -<p class="blurb"> -<script type="text/javascript" language="Javascript"<br> src="<?php echo whatsmypath()?>feed2js.php?<strong>src=http://www.somesite.com/myfeed.xml</strong>"> -</script> -</p> - -<p>You should check your source code!</p> - -</div> -</body> -</html> diff --git a/isis/src/docsys/assets/scripts/feed2js/popup.js b/isis/src/docsys/assets/scripts/feed2js/popup.js deleted file mode 100644 index dd20b0c4b14bfcf4c586f59ab059ceb2038f9c51..0000000000000000000000000000000000000000 --- a/isis/src/docsys/assets/scripts/feed2js/popup.js +++ /dev/null @@ -1,17 +0,0 @@ -function popupfeed(url) { -/* - Use this function to generate a pop up window for item links generated - by the Feed2JS service. The name of this function must exactly be - popupfeed - - and you can use the code below to specify specific window features - See http://jade.mcli.dist.maricopa.edu/feed/index.php?s=mod -*/ - - // string to specify window features - - var myfeatures = "toolbar=no,location=no,directories=no,menubar=no,scrollbars=yes,status=yes,resizable=no,width=800,height=400"; - - thefeed = window.open( url, 'feed2jspop', myfeatures); - if (window.focus) {thefeed.focus()} -} diff --git a/isis/src/docsys/assets/scripts/feed2js/preview.php b/isis/src/docsys/assets/scripts/feed2js/preview.php deleted file mode 100644 index c97123b71f2d7d9bde67bd9612ecdca094da4357..0000000000000000000000000000000000000000 --- a/isis/src/docsys/assets/scripts/feed2js/preview.php +++ /dev/null @@ -1,92 +0,0 @@ -<?php - -// Get variables from input - - -$src = (isset($_GET['src'])) ? $_GET['src'] : ''; -$chan = (isset($_GET['chan'])) ? $_GET['chan'] : 'y'; -$num = (isset($_GET['num'])) ? $_GET['num'] : 0; -$desc = (isset($_GET['desc'])) ? $_GET['desc'] : 1; -$date = (isset($_GET['date'])) ? $_GET['date'] : 'n'; -$tz = (isset($_GET['tz'])) ? $_GET['tz'] : 'feed'; -$targ = (isset($_GET['targ'])) ? $_GET['targ'] : 'n'; -$html = (isset($_GET['html'])) ? $_GET['html'] : 'n'; -$utf = (isset($_GET['utf'])) ? $_GET['utf'] : 'n'; -$rss_box_id = (isset($_GET['rss_box_id'])) ? $_GET['rss_box_id'] : ''; -$pc = (isset($_GET['pc'])) ? $_GET['pc'] : 'n'; - - -// test for malicious use of script tages -if (strpos($src, '<script>')) { - $src = preg_replace("/(\<script)(.*?)(script>)/si", "SCRIPT DELETED", "$src"); - die("Warning! Attempt to inject javascript detected. Aborted and tracking log updated."); -} - -// update to full descriptions for html turned on -if ($html=='a') $desc = 0; - -// build parameter string for the feed2js url -$options = ''; -if ($chan != 'n') $options .= "&chan=$chan"; -if ($num != 0) $options .= "&num=$num"; -if ($desc != 0) $options .= "&desc=$desc"; -if ($date != 'n') $options .= "&date=$date"; -if ($tz != 'feed') $options .= "&tz=$tz"; -if ($targ != 'n') $options .= "&targ=$targ"; -if ($html != 'n') $html_options = "&html=$html"; -if ($utf == 'y') $options .= '&utf=y'; -if ($rss_box_id != '') $options .= "&css=$rss_box_id"; -if ($pc == 'y') $options .= '&pc=y'; - - -$rss_str = "feed2js.php?src=" . urlencode($src) . $options . $html_options; - -$noscript_rss_str = "feed2js.php?src=" . urlencode($src) . $options . '&html=y'; -?> - -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" - "http://www.w3.org/TR/html4/loose.dtd"> -<html lang="en"> -<head> - <?php - if ($utf== 'y') { - echo '<meta http-equiv="content-type" content="text/html; charset=utf-8">'; - } else { - echo '<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">'; - } - ?> - <title>Feed Sneak Preview</title> - <link rel="stylesheet" href="style/basic1.css"> - - <style type="text/css"> -body {background-color:#fff; margin: 12px;} -h1 { font-family: Verdana, Arial, Helvetica, sans-serif; -margin-bottom:0;} -p, li { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13px; color:#444; margin:0 0 1em;} -</style> - -<script src="popup.js" type="text/javascript" language="Javascript"></script> - -</head> -<body> - -<div id="main"> -<h1>Look At Your Feed</h1> -<p>Below is a preview of your feed using a basic style (learn how to customize this via the Feed2JS style pages). If this looks like the correct content and display, close this window and use the <strong>Generate JavaScript</strong> button to create your own web page code.</p> - -<script language="JavaScript" src="<?php echo $rss_str?>"></script> -<noscript> -<a href="<?php echo $noscript_rss_str?>">View Feed</a> -</noscript> - -<div align="center"> -<form> -<input type="button" value="Close Window" onClick="self.close()"> - -</form> -</div> - -</div> -</body> -</html> - diff --git a/isis/src/docsys/assets/scripts/feed2js/readme.pdf b/isis/src/docsys/assets/scripts/feed2js/readme.pdf deleted file mode 100644 index a1a28d31cbcb86d69511a1208c3aec1725a94070..0000000000000000000000000000000000000000 Binary files a/isis/src/docsys/assets/scripts/feed2js/readme.pdf and /dev/null differ diff --git a/isis/src/docsys/assets/scripts/feed2js/style.php b/isis/src/docsys/assets/scripts/feed2js/style.php deleted file mode 100644 index 3ca4e228df0cea94f6ddb33b889d810fd315aba2..0000000000000000000000000000000000000000 --- a/isis/src/docsys/assets/scripts/feed2js/style.php +++ /dev/null @@ -1,165 +0,0 @@ -<?php -/* Feed2JS : RSS feed to JavaScript Style Maker - style.php - - ABOUT - This script can be used to select and create variations - of style sheets used for Feed2JS - - Developed by Alan Levine 26.may.2004 - http://cogdogblog.com/ - - MORE: - Part of the Feed2JS package - See http://jade.mcli.dist.maricopa.edu/feed/ - -*/ - - - -// POSTED VARIABLES --------------------------------------------- -// get PHP variables - - $feed = $_REQUEST['feed']; - $flavor = $_REQUEST['flavor']; - - include 'style/style_pile.php'; -?> - -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" - "http://www.w3.org/TR/html4/loose.dtd"> -<html> -<head> - <title>Stylize Your JavaScript RSS Feed</title> - <link rel="stylesheet" href="style/main.css" media="all" /> - -</head> -<body> -<div id="content"> - -<h1>Feed2JS: Style a Feed</h1> -<p>Once you have <a href="build.php">built the code for your Feed2JS</a>, you can see how the output of RSS content generated by Feed2JS can be customized by applying different style sheets. Each part of the feed has an identifier, allowing you to add styles to the box containing the feeds, the title, the item display, and the date posting text. A few sample styles are provided here; for more see the <a href="http://jade.mcli.dist.maricopa.edu/feed/index.php?s=style">Feed2JS Style Center</a>. -</p> - -<form method="post" action="style_preview.php" target="sty"> -<h2>Try on a Style Sheet</h2> -<p><strong>URL</strong> Enter the web address for the RSS Feed to "stylize"; if you do not have one handy, you can use the one below from <a href="http://cogdogblog.com/">CogDogBlog</a>.<br /> -<input type="text" name="feed" size="50" value="<?php if ($feed) {echo urldecode($feed);} else {echo 'http://cogdogblog.com/feed/';}?>"></p> - -<p><strong>Style Selector</strong><br> -These are but a few style varieties to sample- you are invited to modify or create your own. If you have a snazzy, prettier version, please send it our way. For a blank slate, select the "none/template" style.<br> -<select name="flavor"> -<option value="">Select a style...</option> - -<?php - foreach ($mystyles as $cname => $ctitle) { - if ($flavor == $cname) { - $selected = 'selected'; - } else { - $selected = ''; - } - - echo "<option value=\"$cname\" $selected>$ctitle</option>"; - } -?> -</select> -<input type="submit" value="style this feed!" /> -</p> - -</form> - -<h2>Using a Style Sheet</h2> -<p>You will need to incorporate the CSS code or linkage in your own HTML files; there are two ways you can do this:</p> - -<ol class="spread"> -<li><strong>Insert the CSS directly into the HTML for the page that will display the feed.</strong> This methods is best for sites that only are displaying the feed on one or a few pages. Use the form below to find the style you desire, copy the CSS, and paste it somewhere into the <code><HEAD>...</HEAD></code> of your HTML file that contains the Feed2JS code, surrounded by the <code><style>...</style></code> tags shown below. -<pre><style type="text/css" media="all"> - -<!-- this is where you paste the CSS provided by the form below --> - -</style></pre></li> - -<li><strong>Link to an external style sheet.</strong> This method is best if you will be using the feeds on multiple pages, as the CSS is stored externally, and thus allows you to change the output display of many pages by editing a single file. Just copy the CSS provided by the form below, and paste it into a new text file. Save it as something called "myfeed.css". Think smart about where you decided to store this file, as other HTML pages that call it need to define a correct path to the file. Many web sites just create a top level directory named <code>style</code> and store all style sheet files in this directory.<br><br> -Regardless, to connect the HTML file that contains the Feed2JS code to an external style sheet, insert this line into the <code><HEAD>...</HEAD></code> of your HTML. -<pre> -<link rel="stylesheet" href="style/myfeed.css" media="all"> -</pre> -Remember again that the value of <code>href=</code> must be a correct relative path (or a full valid URL such as http://www.blah.com/style/myfeed.css) from the HTML file to the CSS file.</li> -</ol> - -<h4>CSS classes</h4> -<img src="style/css_classes.gif" alt="" width="360" height="223" border="0" align="right"> -<p>This sketch represents the CSS classes created by Feed2JS.</p> -<ul class="nospread"> -<li><strong>rss-box</strong> defines the bounding div for the entire display- use to define borders, fill, etc.</li> -<li><strong>rss-title</strong> the title of the feed and link style if displayed. Use with variants of <code>rss-title a:link, rss-title a:hover</code>, etc for rollowver styles</li> -<li><strong>rss-items</strong> defines the unordered list <code><ul>...</ul></code> for the feed items- use to define the padding/margins for items.</li> -<li><strong>rss-item</strong> display of each feed item description and title, <code><li>...</li></code> as well as the channel description, if displayed.</li> -<li><strong>rss-item a:</strong> variant for the item title and link style</li> -<li><strong>rss-date</strong> defines the display of item posting dates</li> -</ul> - -<p>For any RSS 2.0 feeds with podcast enclosures, Feed2JS will provide a <strong>Play XXX</strong> link, where "XXX" is the extension of the media file, e.g. "mp3", "m4a", etc. The styles applied are modeled after <a href="http://www.wellstyled.com/css-inline-buttons.html">Well Styled's Inline Buttons</a> method. -<pre> -<div class="pod-play-box"> -<a class="pod-play" href="podcastURL"><em>Play</em><span> File</span></a> -</div> -</pre> - -<img src="style/play-button.jpg" alt="" width="81" height="16" hspace="8" vspace="4" align="right" border="2"> - -<p>Custom colors may be achieved by editing appropriate foreground and background colors from the base styles (emphasized below):</p> -<pre> -.pod-play { - _width:12em; - margin: 0 0.2em; padding: 0.1em 0; _padding:0; - - white-space:nowrap; - text-decoration: none; - vertical-align:middle; - <strong>background: #fb6; - color: black;</strong> - } -.pod-play em { - _width:1em; _cursor:hand; - font-style: normal; - margin:0; padding: 0.1em 0.5em; - <strong>background: white; - color: #222; </strong> - } -.pod-play span { - _width:1em; _cursor:hand; - margin:0; padding: 0.1em 0.5em 0.1em 0.3em; - } -.pod-play:hover { - <strong>background: #666; - color: white; </strong> - } -.pod-play:hover em { - <strong>background: black; - color: white </strong> - } -</pre> - - -<br clear="right"> - -<a name="2style"><h4>Advanced: Two Styles in One Page</h4></a> -<p>If you have more than one feed displayed per page, you can assign different styles to each display. <em>You will need a solid understanding of CSS and inheritance to get this to work!</em>.</p> - -<p>By supplying a value for CSS Custom Class in the <a href="build.php">build form</a> you can now create different top level classes. The value passed will create a CSS class named <strong>rss-box-XXXX</strong> where <strong>XXXX</strong> is this value. This implies that you may have to define more specific classes for the other classes listed above, or use the top level <strong>rss-box-XXXX</strong> classes to say define a different background color.</p> - -<p>See two examples:</p> -<ul class="spread"> -<li><strong><a href="http://jade.mcli.dist.maricopa.edu/feed/2css_a.html">Two Completely Different Styles</a></strong>. The second style has a value of <code>css=spirit</code>, so all CSS elements are defined to be a descendant of this class.</li> - -<li><strong><a href="http://jade.mcli.dist.maricopa.edu/feed/2css_b.html">Two Similar Styles</a></strong>. In this case, the only difference is the background color, which can be specified in the <strong>rss_box_w</strong> and <strong>rss_box_g</strong> classes.</li> -</ul> - - -</div> - -<?php include 'footer'?> - -</body> -</html> diff --git a/isis/src/docsys/assets/scripts/feed2js/style/.css b/isis/src/docsys/assets/scripts/feed2js/style/.css deleted file mode 100644 index 78d6e436fd407bf4975c5c3160c08dc1b1ec8492..0000000000000000000000000000000000000000 --- a/isis/src/docsys/assets/scripts/feed2js/style/.css +++ /dev/null @@ -1,103 +0,0 @@ -/* begin styles for RSS Feed */ - - - -.rss_box { - - margin: 1em; - - width: 300px; - - background-color: #99CCFF; - - border: 1px solid ##5F74CC; - - - -} - -.rss_items { - - margin-top:0px; - - padding:0.5em; 0.5em; - - margin-left:0px; - - color:##0099ff; - -} - -p.rss_title {padding:0.5em;} - -.rss_title { - - text-decoration: none; - - font-family: verdana, sans-serif; - - font-size: 85%; - - background-color:#330066; - - color:#ffffff; - - font-weight:bold; - - margin: 0px; - - padding:0em; - - text-align: left; - -} - - - -.rss_item { - - font-family: verdana, arial, sans-serif; - - font-size: 0.75em; - - font-weight : normal; - - list-style:none; - - padding-bottom:1em; - -} - - - -.rss_item a { - - color:blue; - - font-size: 105%; - - font-weight:bold; - - font-family:arial, sans-serif; - - } - - - -.rss_item a:visited { - - color:#330066; - -} - - - -.rss_date { - - font-size: 85%; - - font-weight : normal; - - color: #F60; - - } \ No newline at end of file diff --git a/isis/src/docsys/assets/scripts/feed2js/style/basic1.css b/isis/src/docsys/assets/scripts/feed2js/style/basic1.css deleted file mode 100644 index 8765b8c4831e2182221eef66f2a4acc65bec8547..0000000000000000000000000000000000000000 --- a/isis/src/docsys/assets/scripts/feed2js/style/basic1.css +++ /dev/null @@ -1,80 +0,0 @@ -/* begin styles for RSS Feed */ - -.rss-box { - margin: 10px 5%; - padding: 4px 8px; - - background-color: #ededed; - border: 2px dashed #7485CA; -} - -.rss-title, rss-title a { - font-family: "American Typewriter", "Trebuchet MS", Trebuchet, Lucida, sans-serif; - font-size: 18px; - font-weight:bold; - margin: 5px 0; - padding: 0; - letter-spacing: 1px; -} - -.rss-items { - -} - -.rss-item { - font-family: verdana, arial, sans-serif; - font-size: 13px; - font-weight : bold; - margin: 8px 0; -} - -.rss-item a:link, .rss-item a:visited, .rss-item a:active { - text-decoration : none; - border-bottom: 1px solid #ededed; - color: #88b; - } - -.rss-item a:hover { - text-decoration : none; - color: #e0861e; - border-bottom: 1px dotted #e0861e; - } - -.rss-date { - font-size: 11px; - font-weight : normal; - color: #F60; - } - -/* buttons modeled from http://www.wellstyled.com/css-inline-buttons.html */ - -.pod-play { - _width:12em; - margin: 0 0.2em; padding: 0.1em 0; _padding:0; - - white-space:nowrap; - text-decoration: none; - vertical-align:middle; - background: #fb6; - color: black; - } -.pod-play em { - _width:1em; _cursor:hand; - font-style: normal; - margin:0; padding: 0.1em 0.5em; - background: white; - color: #222; - } -.pod-play span { - _width:1em; _cursor:hand; - margin:0; padding: 0.1em 0.5em 0.1em 0.3em; - } -.pod-play:hover { - background: #666; - color: white; - } -.pod-play:hover em { - background: black; - color: white - } - diff --git a/isis/src/docsys/assets/scripts/feed2js/style/bbc_style.css b/isis/src/docsys/assets/scripts/feed2js/style/bbc_style.css deleted file mode 100644 index 9a55b6f31354b4a081daf1d36889aa9c4b8d9d6b..0000000000000000000000000000000000000000 --- a/isis/src/docsys/assets/scripts/feed2js/style/bbc_style.css +++ /dev/null @@ -1 +0,0 @@ -/* begin styles for RSS Feed */ .rss-box { margin: 0.5em; width: 200px; background-color: #FFFFCC; border: 7px solid #990000; } .rss-items { margin-top:0px; padding:0.5em; 0.5em; margin-left:0px; color: #FFFFFF; } p.rss-title {padding:0.5em;} .rss-title { text-decoration: none; font-family: small tahoma, "Bitstream Vera Sans", "Trebuchet MS", "Lucida Grande", lucida, helvetica, sans-serif; font-size: 15px; background-color:#990000; color:white; font-weight:bold; margin: 0px; padding:0em; text-align: left; } .rss-item { font-family: small tahoma, "Bitstream Vera Sans", "Trebuchet MS", "Lucida Grande", lucida, helvetica, sans-serif; font-size: 10px; font-weight : normal; list-style:none; padding-bottom:1em; } .rss-item a { text-decoration : none; color: #330066; font-size: 12px; font-weight:light; font-family:small tahoma, "Bitstream Vera Sans", "Trebuchet MS", "Lucida Grande", lucida, helvetica, sans-serif; } .rss-item a:visited { color:white; } .rss-date { font-size: 85%; font-weight : normal; color: #fff; } /* buttons modeled from http://www.wellstyled.com/css-inline-buttons.html */ .pod-play { _width:12em; margin: 0 0.2em; padding: 0.1em 0; _padding:0; white-space:nowrap; text-decoration: none; vertical-align:middle; background: #fb6; color: black; } .pod-play em { _width:1em; _cursor:hand; font-style: normal; margin:0; padding: 0.1em 0.5em; background: white; color: #222; } .pod-play span { _width:1em; _cursor:hand; margin:0; padding: 0.1em 0.5em 0.1em 0.3em; } .pod-play:hover { background: #666; color: white; } .pod-play:hover em { background: black; color: white } \ No newline at end of file diff --git a/isis/src/docsys/assets/scripts/feed2js/style/blackbox.css b/isis/src/docsys/assets/scripts/feed2js/style/blackbox.css deleted file mode 100644 index dc56eea9fe63709813f11d0f04c40853e0bc86ec..0000000000000000000000000000000000000000 --- a/isis/src/docsys/assets/scripts/feed2js/style/blackbox.css +++ /dev/null @@ -1 +0,0 @@ -/* begin styles for RSS Feed */ .rss-box { margin: 1em; width: 200px; background-color: #000000; border: 1px dashed #240; } .rss-items { margin-top:0px; padding:0.5em; 0.5em; margin-left:0px; color:#FFFFFF; } p.rss-title {padding:0.5em;} .rss-title { text-decoration: none; font-family: small tahoma, "Bitstream Vera Sans", "Trebuchet MS", "Lucida Grande", lucida, helvetica, sans-serif; font-size: 12px; background-color:#000; color:#fff; font-weight:bold; margin: 0px; padding:0em; text-align: left; } .rss-item { font-family: small tahoma, "Bitstream Vera Sans", "Trebuchet MS", "Lucida Grande", lucida, helvetica, sans-serif; font-size: 12px; font-weight : normal; list-style:none; padding-bottom:1em; } .rss-item a { text-decoration : none; color: white; font-size: 12px; font-weight:light; font-family:small tahoma, "Bitstream Vera Sans", "Trebuchet MS", "Lucida Grande", lucida, helvetica, sans-serif; } .rss-item a:visited { color:white; } .rss-date { font-size: 85%; font-weight : normal; color: #fff; } /* buttons modeled from http://www.wellstyled.com/css-inline-buttons.html */ .pod-play { _width:12em; margin: 0 0.2em; padding: 0.1em 0; _padding:0; white-space:nowrap; text-decoration: none; vertical-align:middle; background: #fb6; color: black; } .pod-play em { _width:1em; _cursor:hand; font-style: normal; margin:0; padding: 0.1em 0.5em; background: white; color: #222; } .pod-play span { _width:1em; _cursor:hand; margin:0; padding: 0.1em 0.5em 0.1em 0.3em; } .pod-play:hover { background: #666; color: white; } .pod-play:hover em { background: black; color: white } \ No newline at end of file diff --git a/isis/src/docsys/assets/scripts/feed2js/style/css_classes.gif b/isis/src/docsys/assets/scripts/feed2js/style/css_classes.gif deleted file mode 100644 index 02298dd1ec136702ec732d5ef5a1df7add8075d5..0000000000000000000000000000000000000000 Binary files a/isis/src/docsys/assets/scripts/feed2js/style/css_classes.gif and /dev/null differ diff --git a/isis/src/docsys/assets/scripts/feed2js/style/dog.css b/isis/src/docsys/assets/scripts/feed2js/style/dog.css deleted file mode 100644 index de7ac552da6af9d4200e7eb8efa31d0728d49855..0000000000000000000000000000000000000000 --- a/isis/src/docsys/assets/scripts/feed2js/style/dog.css +++ /dev/null @@ -1,86 +0,0 @@ -/* begin styles for RSS Feed */ - -.rss-box { - width: 500px; - background:#fff url(dog.jpg) bottom left no-repeat; - padding: 5px 10px 5px 120px; - border-left: 8px solid #111; - border-top: 8px solid #111; -} - -.rss-title, .rss-title a:link -{ - font-family: Georgia, "Times New Roman", Times, serif; - font-size: 44px; - font-weight: bold; - text-decoration:none; - margin: 5px 0; - padding: 0; - text-align:right; - -} - -.rss-title a:visited, .rss-title a:active { - color: #922; -} - -rss-title a:hover { -text-decoration:underline; -} - -.rss-items { - -} - -.rss-item { - font-family: Arial, Verdana, sans-serif; - font-size: 14px; - margin-bottom: 1em -} - -.rss-item a:link, .rss-item a:visited, .rss-item a:active { - text-decoration : none; - color: #26590D; - } - -.rss-item a:hover { - text-decoration : underline; - color: #F66025; - } - -.rss-date { - font-size: 11px; - font-weight : normal; - color: #338; - } -/* buttons modeled from http://www.wellstyled.com/css-inline-buttons.html */ - -.pod-play { - _width:12em; - margin: 0 0.2em; padding: 0.1em 0; _padding:0; - - white-space:nowrap; - text-decoration: none; - vertical-align:middle; - background: #fb6; - color: black; - } -.pod-play em { - _width:1em; _cursor:hand; - font-style: normal; - margin:0; padding: 0.1em 0.5em; - background: white; - color: #222; - } -.pod-play span { - _width:1em; _cursor:hand; - margin:0; padding: 0.1em 0.5em 0.1em 0.3em; - } -.pod-play:hover { - background: #666; - color: white; - } -.pod-play:hover em { - background: black; - color: white - } diff --git a/isis/src/docsys/assets/scripts/feed2js/style/dog.jpg b/isis/src/docsys/assets/scripts/feed2js/style/dog.jpg deleted file mode 100644 index e0c5ccbc85d520eef9545799abe69fbeca1c0ed4..0000000000000000000000000000000000000000 Binary files a/isis/src/docsys/assets/scripts/feed2js/style/dog.jpg and /dev/null differ diff --git a/isis/src/docsys/assets/scripts/feed2js/style/essc.css b/isis/src/docsys/assets/scripts/feed2js/style/essc.css deleted file mode 100644 index 2983906fb37558496900e7c23c56646402c800b4..0000000000000000000000000000000000000000 --- a/isis/src/docsys/assets/scripts/feed2js/style/essc.css +++ /dev/null @@ -1 +0,0 @@ -/* begin styles for RSS Feed */ .rss-box { margin: 1em; width: 250px; background-color: #CCCCFF; border: 1px solid #9B72CF; } .rss-items { margin-top:0px; padding:0.5em; 0.5em; margin-left:0px; color:#000000; } p.rss-title {padding:0.5em;} .rss-title { text-decoration: none; font-family: verdana, sans-serif; font-size: 85%; background-color:#A4A4FF; color:#ffffff; font-weight:bold; margin: 0px; padding:0em; text-align: left; } .rss-item { font-family: verdana, arial, sans-serif; font-size: 0.75em; font-weight : normal; list-style:none; padding-bottom:1em; } .rss-item a { text-decoration : underline; color:blue; font-size: 105%; font-weight:bold; font-family:arial, sans-serif; } .rss-item a:visited { color:purple; } .rss-date { font-size: 85%; font-weight : normal; color: #F60; } /* buttons modeled from http://www.wellstyled.com/css-inline-buttons.html */ .pod-play { _width:12em; margin: 0 0.2em; padding: 0.1em 0; _padding:0; white-space:nowrap; text-decoration: none; vertical-align:middle; background: #fb6; color: black; } .pod-play em { _width:1em; _cursor:hand; font-style: normal; margin:0; padding: 0.1em 0.5em; background: white; color: #222; } .pod-play span { _width:1em; _cursor:hand; margin:0; padding: 0.1em 0.5em 0.1em 0.3em; } .pod-play:hover { background: #666; color: white; } .pod-play:hover em { background: black; color: white } \ No newline at end of file diff --git a/isis/src/docsys/assets/scripts/feed2js/style/feed2js.jpg b/isis/src/docsys/assets/scripts/feed2js/style/feed2js.jpg deleted file mode 100644 index 094f15cfe3a786ac0c8776f74cd5e32156df42ad..0000000000000000000000000000000000000000 Binary files a/isis/src/docsys/assets/scripts/feed2js/style/feed2js.jpg and /dev/null differ diff --git a/isis/src/docsys/assets/scripts/feed2js/style/greenbars.css b/isis/src/docsys/assets/scripts/feed2js/style/greenbars.css deleted file mode 100644 index d761e428646643f93bf777dfeda3ac4de48ac57c..0000000000000000000000000000000000000000 --- a/isis/src/docsys/assets/scripts/feed2js/style/greenbars.css +++ /dev/null @@ -1,84 +0,0 @@ -/* begin styles for RSS Feed */ - -.rss-box { - width: 240px; - padding: 4px 8px; - background-color: #CF9; - border-left: 60px solid #238912; - border-top: 1px dotted #238912; - border-right: 1px dotted #238912; - border-bottom: 1px dotted #238912; -} - -.rss-title, .rss-title a:link -{ - font-family: Arial, Verdana, sans-serif; - font-size: 30px; - font-weight: bold; - margin: 5px 0; - padding: 0; - text-align:center; - -} - -.rss-title a:visited, .rss-title a:active, .rss-title a:hover { - color: #692; -} - -.rss-items { - list-style:none; - -} - -.rss-item { - font-family: Arial, Verdana, sans-serif; - font-size: 11px; - margin-bottom: 1em -} - -.rss-item a:link, .rss-item a:visited, .rss-item a:active { - text-decoration : none; - color: #26590D; - } - -.rss-item a:hover { - text-decoration : underline; - color: #F66025; - } - -.rss-date { - font-size: 10px; - font-weight : normal; - color: #333; - } -/* buttons modeled from http://www.wellstyled.com/css-inline-buttons.html */ - -.pod-play { - _width:12em; - margin: 0 0.2em; padding: 0.1em 0; _padding:0; - - white-space:nowrap; - text-decoration: none; - vertical-align:middle; - background: #fb6; - color: black; - } -.pod-play em { - _width:1em; _cursor:hand; - font-style: normal; - margin:0; padding: 0.1em 0.5em; - background: white; - color: #222; - } -.pod-play span { - _width:1em; _cursor:hand; - margin:0; padding: 0.1em 0.5em 0.1em 0.3em; - } -.pod-play:hover { - background: #666; - color: white; - } -.pod-play:hover em { - background: black; - color: white - } diff --git a/isis/src/docsys/assets/scripts/feed2js/style/kp.css b/isis/src/docsys/assets/scripts/feed2js/style/kp.css deleted file mode 100644 index 8666524069edc8f9c41f5fdee4abb5da21a08c9e..0000000000000000000000000000000000000000 --- a/isis/src/docsys/assets/scripts/feed2js/style/kp.css +++ /dev/null @@ -1 +0,0 @@ -/* begin styles for RSS Feed */ .rss-box { margin: 5px 5%; padding: 4px 8px; width: 219px; background-color: #ffffff; } .rss-title, rss-title a { font-family: verdana, arial, sans-serif; font-size: 11; font-weight:normal; margin: 0px 0; padding: 0; letter-spacing: 1px; } .rss-items { } .rss-item { font-family: verdana, arial, sans-serif; font-size: 11px; font-weight : normal; margin: 0px 0; } .rss-item a:link, .rss-item a:visited, .rss-item a:active { text-decoration : none; border-bottom: 1px solid #336699; color: #336699; } .rss-item a:hover { text-decoration : none; color: #336699; border-bottom: 1px dotted #336699; } .rss-date { font-size: 11px; font-weight : normal; color: #336699; } /* buttons modeled from http://www.wellstyled.com/css-inline-buttons.html */ .pod-play { _width:12em; margin: 0 0.2em; padding: 0.1em 0; _padding:0; white-space:nowrap; text-decoration: none; vertical-align:middle; background: #fb6; color: black; } .pod-play em { _width:1em; _cursor:hand; font-style: normal; margin:0; padding: 0.1em 0.5em; background: white; color: #222; } .pod-play span { _width:1em; _cursor:hand; margin:0; padding: 0.1em 0.5em 0.1em 0.3em; } .pod-play:hover { background: #666; color: white; } .pod-play:hover em { background: black; color: white } \ No newline at end of file diff --git a/isis/src/docsys/assets/scripts/feed2js/style/main.css b/isis/src/docsys/assets/scripts/feed2js/style/main.css deleted file mode 100644 index 98839bf7e6e09e7a991eb68d7f5061415d1a4455..0000000000000000000000000000000000000000 --- a/isis/src/docsys/assets/scripts/feed2js/style/main.css +++ /dev/null @@ -1,75 +0,0 @@ -body { - background:#ededed; - font-family: "Trebuchet MS", verdana, arial, helvetica, sans-sarif; - font-size: small; - margin:0; - padding:0; -} - -#content { - background:#fff; - margin: 20px 5%; - padding: 4px 20px; - border: 1px dotted #777; -} - -p { - - margin: 0 0 1em; - } - -.first { margin-top:0;} - -h1, h2, h3, h4 { margin-bottom:0;} - -.spread, .nospread { - margin-top:0; - margin-left:20px; - } - -.spread li { - margin-bottom:0.5em; -} - -pre { - border: #777777 1px solid; - padding: 0.5em; - margin-left: 1em; - margin-right: 2em; - white-space: pre; - background-color: #e6e6e6; - color: black; -} - -#badge { - float:right; - padding: 4px; - background: #ededed; - border: 1px solid #777; - font-size: 10px; - margin: 4px 0 4px 1em; - text-align:center; -} - -.badge-header { - background-color: #f60; - color: #fff; - font-size: 12px; - margin: 0 4px 0 0; - padding:0; -} - -#content .caption { - font-size: 11px; - color: #555; - text-align:center; - margin: 2em 0; -} - -#footer { - margin: 60px 20% 10px; -} - -#footer p.smallprint { - font-family: "American Typewriter", "Courier New", Courier, monospaced; font-size: 11px; color: #222; padding: 0.5em 1em; background-color:#ccf;} - diff --git a/isis/src/docsys/assets/scripts/feed2js/style/marooned2.css b/isis/src/docsys/assets/scripts/feed2js/style/marooned2.css deleted file mode 100644 index 70719bd219e5f10b683131e4106bf6e7a22f3368..0000000000000000000000000000000000000000 --- a/isis/src/docsys/assets/scripts/feed2js/style/marooned2.css +++ /dev/null @@ -1 +0,0 @@ -/* begin styles for RSS Feed */ h2 { color: maroon; font-size: 170%; text-decoration: none font-weight: bold; ffont-family: FontName, Tahoma } h3 { color: maroon; font-size: 140%; text-decoration: none font-weight: bold; text-indent: 5em; ffont-family: FontName, Tahoma } .rss-box { background-color: white; margin: 10px 15%; padding: 4px 8px; border: solid 5px maroon } .rss-title, rss-title a { font-size: 120%; font-family: FontName, Tahoma; font-weight: bold; letter-spacing: 1px; margin: 5px 0; padding: 0 } .rss-items { list-style-type: none; list-style-image: url("http://142.27.144.70/gerry/pointer.jpg") } .rss-item { color: black; font-size: 75%; font-family: Tahoma; font-weight: bold; margin: 8px 0 } .rss-item a:link, .rss-item a:visited { color: maroon; font-size: 120%; text-decoration: none } .rss-item a:hover { color: gray; text-decoration: underline } .rss-date { color: gray; font-size: 80%; font-weight: normal } /* buttons modeled from http://www.wellstyled.com/css-inline-buttons.html */ .pod-play { _width:12em; margin: 0 0.2em; padding: 0.1em 0; _padding:0; white-space:nowrap; text-decoration: none; vertical-align:middle; background: #fb6; color: black; } .pod-play em { _width:1em; _cursor:hand; font-style: normal; margin:0; padding: 0.1em 0.5em; background: white; color: #222; } .pod-play span { _width:1em; _cursor:hand; margin:0; padding: 0.1em 0.5em 0.1em 0.3em; } .pod-play:hover { background: #666; color: white; } .pod-play:hover em { background: black; color: white } \ No newline at end of file diff --git a/isis/src/docsys/assets/scripts/feed2js/style/nobullets.css b/isis/src/docsys/assets/scripts/feed2js/style/nobullets.css deleted file mode 100644 index 1bf7eaa126f9f73491184a185fc861bf97b186a5..0000000000000000000000000000000000000000 --- a/isis/src/docsys/assets/scripts/feed2js/style/nobullets.css +++ /dev/null @@ -1 +0,0 @@ -/* begin styles for RSS Feed This is the most basic style to use for a list with no bullets */ .rss-box { width: 300px; background-color: #ffffff; } .rss-title, rss-title a { margin: 0px 0; padding: 0; } .rss-items { list-style:none; margin:0; padding:0; } .rss-item { font-size: x-small; margin-bottom: 1em;; } .rss-item a:link, .rss-item a:visited, .rss-item a:active { } .rss-item a:hover { } .rss-date { font-size: xx-small; } /* buttons modeled from http://www.wellstyled.com/css-inline-buttons.html */ .pod-play { _width:12em; margin: 0 0.2em; padding: 0.1em 0; _padding:0; white-space:nowrap; text-decoration: none; vertical-align:middle; background: #fb6; color: black; } .pod-play em { _width:1em; _cursor:hand; font-style: normal; margin:0; padding: 0.1em 0.5em; background: white; color: #222; } .pod-play span { _width:1em; _cursor:hand; margin:0; padding: 0.1em 0.5em 0.1em 0.3em; } .pod-play:hover { background: #666; color: white; } .pod-play:hover em { background: black; color: white } \ No newline at end of file diff --git a/isis/src/docsys/assets/scripts/feed2js/style/none.css b/isis/src/docsys/assets/scripts/feed2js/style/none.css deleted file mode 100644 index 8733a52b5eb608c87971c8a49160f5b98d56a004..0000000000000000000000000000000000000000 --- a/isis/src/docsys/assets/scripts/feed2js/style/none.css +++ /dev/null @@ -1,61 +0,0 @@ -/* no css just to show an unstyled feed - and to provide a template for creating new styles */ - - .rss-box { - - } - - .rss-title, rss-title a { - - } - - .rss-items { - -} - - -.rss-item a:link, .rss-item a:visited, .rss-item a:active { - -} - -.rss-item a:hover { - -} - -.rss-date { - -} - - - -/* buttons modeled from http://www.wellstyled.com/css-inline-buttons.html */ - -.pod-play { - _width:12em; - margin: 0 0.2em; padding: 0.1em 0; _padding:0; - - white-space:nowrap; - text-decoration: none; - vertical-align:middle; - background: #fb6; - color: black; - } -.pod-play em { - _width:1em; _cursor:hand; - font-style: normal; - margin:0; padding: 0.1em 0.5em; - background: white; - color: #222; - } -.pod-play span { - _width:1em; _cursor:hand; - margin:0; padding: 0.1em 0.5em 0.1em 0.3em; - } -.pod-play:hover { - background: #666; - color: white; - } -.pod-play:hover em { - background: black; - color: white - } diff --git a/isis/src/docsys/assets/scripts/feed2js/style/outlive.css b/isis/src/docsys/assets/scripts/feed2js/style/outlive.css deleted file mode 100644 index ea68e6449ea0a66fd001efadac791daecf29281a..0000000000000000000000000000000000000000 --- a/isis/src/docsys/assets/scripts/feed2js/style/outlive.css +++ /dev/null @@ -1,76 +0,0 @@ -/* begin styles for RSS Feed */ - -.rss-box { - margin: 1em; - width: 98%; - background-color: #EEE; - border: 1px solid silver; - -} -.rss-items { - margin-top:0px; - padding:0.5em; 0.5em; - margin-left:0px; - color:#000000; -} -p.rss-title {padding:0.5em;} -.rss-title { - font-size: 8pt; - background-color: silver; - color: gray; - font-weight:bold; - text-align: left; -} - -.rss-item { - font-size: 7pt; - list-style:none; - padding-bottom:1em; -} - -.rss-item a { - color:navy; - font-size: 9pt; - font-weight:bold; - } - -.rss-item a:visited { - color: black; -} - -.rss-date { - font-size: 7pt; - color: red; - } - -/* buttons modeled from http://www.wellstyled.com/css-inline-buttons.html */ - -.pod-play { - _width:12em; - margin: 0 0.2em; padding: 0.1em 0; _padding:0; - - white-space:nowrap; - text-decoration: none; - vertical-align:middle; - background: #fb6; - color: black; - } -.pod-play em { - _width:1em; _cursor:hand; - font-style: normal; - margin:0; padding: 0.1em 0.5em; - background: white; - color: #222; - } -.pod-play span { - _width:1em; _cursor:hand; - margin:0; padding: 0.1em 0.5em 0.1em 0.3em; - } -.pod-play:hover { - background: #666; - color: white; - } -.pod-play:hover em { - background: black; - color: white - } diff --git a/isis/src/docsys/assets/scripts/feed2js/style/play-button.jpg b/isis/src/docsys/assets/scripts/feed2js/style/play-button.jpg deleted file mode 100644 index 1768671a41992b3cfb9f2199776940e7655e06d7..0000000000000000000000000000000000000000 Binary files a/isis/src/docsys/assets/scripts/feed2js/style/play-button.jpg and /dev/null differ diff --git a/isis/src/docsys/assets/scripts/feed2js/style/plum.css b/isis/src/docsys/assets/scripts/feed2js/style/plum.css deleted file mode 100644 index 3dc43875d6f84aad2174a7a1cdd3e17a072f6edb..0000000000000000000000000000000000000000 --- a/isis/src/docsys/assets/scripts/feed2js/style/plum.css +++ /dev/null @@ -1 +0,0 @@ -/* begin styles for RSS Feed */ .rss-box { margin: 1em; width: 250px; background-color: #99CCFF; border: 1px solid ##5F74CC; } .rss-items { margin-top:0px; padding:0.5em; 0.5em; margin-left:0px; color:##0099ff; } p.rss-title {padding:0.5em;} .rss-title { text-decoration: none; font-family: verdana, sans-serif; font-size: 85%; background-color:#330066; color:#ffffff; font-weight:bold; margin: 0px; padding:0em; text-align: left; } .rss-item { font-family: verdana, arial, sans-serif; font-size: 0.75em; font-weight : normal; list-style:none; padding-bottom:1em; } .rss-item a { color:blue; font-size: 105%; font-weight:bold; font-family:arial, sans-serif; } .rss-item a:visited { color:#330066; } .rss-date { font-size: 85%; font-weight : normal; color: #F60; } /* buttons modeled from http://www.wellstyled.com/css-inline-buttons.html */ .pod-play { _width:12em; margin: 0 0.2em; padding: 0.1em 0; _padding:0; white-space:nowrap; text-decoration: none; vertical-align:middle; background: #fb6; color: black; } .pod-play em { _width:1em; _cursor:hand; font-style: normal; margin:0; padding: 0.1em 0.5em; background: white; color: #222; } .pod-play span { _width:1em; _cursor:hand; margin:0; padding: 0.1em 0.5em 0.1em 0.3em; } .pod-play:hover { background: #666; color: white; } .pod-play:hover em { background: black; color: white } \ No newline at end of file diff --git a/isis/src/docsys/assets/scripts/feed2js/style/rss.css b/isis/src/docsys/assets/scripts/feed2js/style/rss.css deleted file mode 100644 index e8dc2c7c1960b7619eb657ac7ff8141a8aa73c62..0000000000000000000000000000000000000000 --- a/isis/src/docsys/assets/scripts/feed2js/style/rss.css +++ /dev/null @@ -1 +0,0 @@ -/* begin styles for RSS Feed */ .rss-box { margin: 10px o%; padding: 4px 8px; width: 250px; background-color: #ededed; border: 2px dashed #7485CA; } .rss-title, rss-title a { font-family: "American Typewriter", "Trebuchet MS", Trebuchet, Lucida, sans-serif; font-size: 13px; font-weight:bold; margin: 5px 0; padding: 0; letter-spacing: 1px; } .rss-items { } .rss-item { font-family: verdana, arial, sans-serif; font-size: 8px; font-weight : bold; margin: 8px 0; } .rss-item a:link, .rss-item a:visited, .rss-item a:active { text-decoration : none; border-bottom: 1px solid #ededed; color: #88b; } .rss-item a:hover { text-decoration : none; color: #e0861e; border-bottom: 1px dotted #e0861e; } .rss-date { font-size: 11px; font-weight : normal; color: #F60; } /* buttons modeled from http://www.wellstyled.com/css-inline-buttons.html */ .pod-play { _width:12em; margin: 0 0.2em; padding: 0.1em 0; _padding:0; white-space:nowrap; text-decoration: none; vertical-align:middle; background: #fb6; color: black; } .pod-play em { _width:1em; _cursor:hand; font-style: normal; margin:0; padding: 0.1em 0.5em; background: white; color: #222; } .pod-play span { _width:1em; _cursor:hand; margin:0; padding: 0.1em 0.5em 0.1em 0.3em; } .pod-play:hover { background: #666; color: white; } .pod-play:hover em { background: black; color: white } \ No newline at end of file diff --git a/isis/src/docsys/assets/scripts/feed2js/style/sekodeng.css b/isis/src/docsys/assets/scripts/feed2js/style/sekodeng.css deleted file mode 100644 index 928416e33ca15523f7ea5e4cc9218c43aa99857b..0000000000000000000000000000000000000000 --- a/isis/src/docsys/assets/scripts/feed2js/style/sekodeng.css +++ /dev/null @@ -1 +0,0 @@ -/* begin styles for RSS Feed */ .rss-box { margin: 1em; width: 160px; background-color: #333333; border: 1px solid #000000; } .rss-items { margin-top:0px; padding:0.5em; 0.5em; margin-left:0px; color:#000000; } p.rss-title {padding:0.5em;} .rss-title { font-size: 8pt; background-color: #000000; color: #f76b08; font-weight:bold; text-align: center; } .rss-item { color:#DFDFDF; font-size: 7pt; list-style:none; padding-bottom:1em; } .rss-item a { color:#f67b08; font-size: 8pt; font-weight:bold; } .rss-item a:visited { color: #f67b08; } .rss-item a:hover { color: #00FFFF; } .rss-date { font-size: 7pt; color: #f76b08; } /* buttons modeled from http://www.wellstyled.com/css-inline-buttons.html */ .pod-play { _width:12em; margin: 0 0.2em; padding: 0.1em 0; _padding:0; white-space:nowrap; text-decoration: none; vertical-align:middle; background: #fb6; color: black; } .pod-play em { _width:1em; _cursor:hand; font-style: normal; margin:0; padding: 0.1em 0.5em; background: white; color: #222; } .pod-play span { _width:1em; _cursor:hand; margin:0; padding: 0.1em 0.5em 0.1em 0.3em; } .pod-play:hover { background: #666; color: white; } .pod-play:hover em { background: black; color: white } \ No newline at end of file diff --git a/isis/src/docsys/assets/scripts/feed2js/style/style_pile.php b/isis/src/docsys/assets/scripts/feed2js/style/style_pile.php deleted file mode 100644 index 831179c8982b4fa8555e1f01bb19ea15e8a1224c..0000000000000000000000000000000000000000 --- a/isis/src/docsys/assets/scripts/feed2js/style/style_pile.php +++ /dev/null @@ -1,20 +0,0 @@ -<?php -// css file name => title -$mystyles = array( - 'basic1'=> 'Basic Blue', - 'bbc_style' => 'BBC', - 'blackbox' => 'Blackbox', - 'dog' => 'Dog\'s Eye View', - 'essc' => 'ESSC', - 'greenbars' => 'Green Bars', - 'kp' => 'KP', - 'marooned2' => 'Marooned', - 'none' => 'No Style / Blank Template', - 'nobullets' => 'No Bullets', - 'outlive' => 'OutlivE', - 'plum' => 'Plum', - 'princessthing' => 'Princess', - 'sekodeng' => 'Sekodeng', - 'zanestate' => 'Zanestate Yahoo', - ); -?> diff --git a/isis/src/docsys/assets/scripts/feed2js/style/zanestate.css b/isis/src/docsys/assets/scripts/feed2js/style/zanestate.css deleted file mode 100644 index 90c71bf2f18144aa0ecbf744792a739b7b390f7a..0000000000000000000000000000000000000000 --- a/isis/src/docsys/assets/scripts/feed2js/style/zanestate.css +++ /dev/null @@ -1,85 +0,0 @@ -/* begin styles for RSS Feed */ - -.rss-box { - margin: 1em; - width: 250px; - background-color: #F1F1FD; - border: 1px solid #9B72CF; - -} -.rss-items { - margin-top:0px; - padding:0.5em; 0.5em; - margin-left:0px; - color:#000000; -} -p.rss-title {padding:0.5em;} -.rss-title { - text-decoration: none; - font-family: verdana, sans-serif; - font-size: 85%; - background-color:#9B72CF; - color:#ffffff; - font-weight:bold; - margin: 0px; - padding:0em; - text-align: left; -} - -.rss-item { - font-family: verdana, arial, sans-serif; - font-size: 0.75em; - font-weight : normal; - list-style:none; - padding-bottom:1em; -} - -.rss-item a { - text-decoration : underline; - color:blue; - font-size: 105%; - font-weight:bold; - font-family:arial, sans-serif; - } - -.rss-item a:visited { - color:purple; -} - -.rss-date { - font-size: 85%; - font-weight : normal; - color: #F60; - } - -/* buttons modeled from http://www.wellstyled.com/css-inline-buttons.html */ - -.pod-play { - _width:12em; - margin: 0 0.2em; padding: 0.1em 0; _padding:0; - - white-space:nowrap; - text-decoration: none; - vertical-align:middle; - background: #fb6; - color: black; - } -.pod-play em { - _width:1em; _cursor:hand; - font-style: normal; - margin:0; padding: 0.1em 0.5em; - background: white; - color: #222; - } -.pod-play span { - _width:1em; _cursor:hand; - margin:0; padding: 0.1em 0.5em 0.1em 0.3em; - } -.pod-play:hover { - background: #666; - color: white; - } -.pod-play:hover em { - background: black; - color: white - } diff --git a/isis/src/docsys/assets/scripts/feed2js/style_preview.php b/isis/src/docsys/assets/scripts/feed2js/style_preview.php deleted file mode 100644 index 30e3f35828dfaf59c0ed864da13ce8ff0235ab9a..0000000000000000000000000000000000000000 --- a/isis/src/docsys/assets/scripts/feed2js/style_preview.php +++ /dev/null @@ -1,98 +0,0 @@ -<?php - include 'style/style_pile.php'; - - // get PHP variables - - $flavor = $_REQUEST['flavor']; - $feed = $_REQUEST['feed']; - $new_css = $_REQUEST['new_css']; - - $mod = $_REQUEST['mod']; - - $my_dir = 'http://' . $_SERVER['SERVER_NAME'] . dirname($_SERVER['PHP_SELF']); - $rss_str = "feed2js.php?src=" . urlencode($feed) . "&chan=y&num=3&desc=200&date=y&html=n"; - - if ($mod) { - $style_title = "modified / original"; - } else { - $style_title = $mystyles[$flavor]; - } -?> - -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" - "http://www.w3.org/TR/html4/loose.dtd"> -<html lang="en"> -<head> - <meta http-equiv="content-type" content="text/html; charset=iso-8859-1"> - <title>Styled Feed</title> - - - <?php - if ($mod) { - echo "<style type=\"text/css\">\n" . stripslashes($new_css) . "\n</style>\n"; - } else { - echo '<link rel="stylesheet" href="style/' . $flavor . '.css">'; - } - ?> - - <style type="text/css"> -body {background-color:#fff; margin: 0; padding: 10px 5%;} -h1, h2, h3 { font-family: "American Typewriter", "Courier New", Courier, monospaced; margin-bottom:0;} -p, li { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13px; color:#444; margin:0 0 1em;} -</style> - - -</head> -<body> - -<div id="main"> -<h1>Style Preview!</h1> - -<p>Here is a preview of the <strong><?php echo $style_title?></strong> style sheet applied to the RSS Feed <strong><?php echo "$feed"?></strong>. The URL to generate this view is: -<form> -<textarea name="f" rows="4" cols="60"><?php echo $my_dir?>/style_preview.php?feed=<?php echo urlencode($feed)?>&flavor=<?php echo urlencode($flavor)?></textarea> -</form> - -<script language="JavaScript" src="<?php echo $rss_str?>"></script> -<noscript> -<a href="<?php echo $rss_str?>">View Feed</a> -</noscript> - -<h2>CSS Applied</h2> -<p>Below is the CSS applied here, yours for copy and pasting pleasure. See below for a description of the classes provided and refer to the Feed2JS style selection site for more details on where to use this code.</p> - -<p>You may also use the form below to <strong>modify</strong> the CSS to experiment with your own variants.</p> - -<form method="post" action="<?php echo $PHP_SELF?>"> -<input type="hidden" name="feed" value="<?php echo $feed?>"> -<input type="hidden" name="flavor" value="<?php echo $flavor?>"> -<textarea name="new_css" rows="20" cols="70"><?php - if ($mod) { - echo stripslashes($new_css); - } else { - include "style/$flavor.css"; - } - ?> -</textarea> -<p>Make changes and <input type="submit" name="mod" value="Preview Modified CSS"> -or <input type="submit" name="revert" value="Revert to <?php echo $mystyles[$flavor]?>"></p> - -</form> - -<h3>CSS classes</h3> -<img src="style/css_classes.gif" alt="" width="360" height="223" border="0" align="right"> -<p>This sketch represents the CSS classes created by Feed2JS.</p> -<ul> -<li><strong>rss-box</strong> defines the bounding div for the entire display- use to define borders, fill, etc.</li> -<li><strong>rss-title</strong> the title of the feed and link style if displayed. Use with variants of <code>rss-title a:link, rss-title a:hover</code>, etc for rollover styles</li> -<li><strong>rss-items</strong> defines the unordered list <code><ul>...</ul></code> for the feed items- use to define the padding/margins for items.</li> -<li><strong>rss-item</strong> display of each feed item description and title, <code><li>...</li></code> as well as the channel description, if displayed.</li> -<li><strong>rss-item a:</strong> variant for the item title and link style</li> -<li><strong>rss-date</strong> defines the display of item posting dates</li> -</ul> - -<br clear="right"> - -</div> -</body> -</html> diff --git a/isis/src/docsys/assets/scripts/footer.js b/isis/src/docsys/assets/scripts/footer.js deleted file mode 100644 index 1e3e391b8c0f9c4466b4809209a703f87060a922..0000000000000000000000000000000000000000 --- a/isis/src/docsys/assets/scripts/footer.js +++ /dev/null @@ -1,46 +0,0 @@ - // FOOTER - // FILENAME: footer.js - // - // Purpose: write standard footer - // - // Author: Deborah Lee Soltesz, USGS, 10/2001 - - - document.write(" <hr noshade size=1> "); - document.write(" "); - document.write(" <table width=\"100%\" cellpadding=0 cellspacing=0 border=0> "); - document.write(" <tr valign=top> "); - document.write(" <td align=left class=\"captionDefault\"> "); - document.write(" "); - document.write(" <a href=\"http://www.doi.gov\" target=\"_top\"> "); - document.write(" U.S. Department of the Interior</a> | "); - document.write(" "); - document.write(" <a href=\"http://www.usgs.gov\" target=\"_top\"> "); - document.write(" U.S. Geological Survey</a> "); - document.write(" "); - document.write(" <br> "); - document.write(" "); - document.write(" "); - document.write(" <a href=\"http://isis.astrogeology.usgs.gov\" target=\"_top\"> "); - document.write(" ISIS</a> | "); - document.write(" <a href=\"http://isis.astrogeology.usgs.gov/documents/Disclaimers/Disclaimers.html\" target=\"_top\"> "); - document.write(" Privacy & Disclaimers</a> | "); - document.write(" <a href=\"http://astrogeology.usgs.gov\" target=\"_top\"> "); - document.write(" Astrogeology Research Program</a> "); - document.write(" "); - document.write(" "); - document.write(" <br> "); - document.write(" <i> "); - document.write(" To contact us, please post comments and questions on the "); - document.write(" <a href=\"https://astrodiscuss.usgs.gov/\" target=\"_top\"> "); - document.write(" USGS Astrogeology Discussion Board</a></i> "); - document.write(" <br>") - document.write(" <i>To report a bug, or suggest a feature go to: <a href=\"https://github.com/USGS-Astrogeology/ISIS3\" target=\"top\">ISIS Github</a></i>"); - document.write(" <br>"); - document.write(" "); - document.write(" <script language=\"javaScript\" type=\"text/javascript\"> "); - document.write(" document.write(\"File Modified: \" + document.lastModified); "); - document.write(" </script><br> "); - document.write(" "); - document.write(" "); - document.write(" </table> "); diff --git a/isis/src/docsys/assets/scripts/homepage.js b/isis/src/docsys/assets/scripts/homepage.js deleted file mode 100644 index 535edb4acfe1fc6bd44822eaef32e8d13dce2863..0000000000000000000000000000000000000000 --- a/isis/src/docsys/assets/scripts/homepage.js +++ /dev/null @@ -1,65 +0,0 @@ -/*********************************** - * Script: homepage.js - * Purpose: write little HTML snippets on Isis homepage, - * avoiding XML/XSLT weirdness - * Author: Deborah Lee Soltesz - * Date: 2006-11-13 - * - ***********************************/ - -function writeAnnouncements() { - /* This code, which pulls posts from the support board, is not currently - * working. I have left it here as a reference, or in case we decide to fix it - * to work with our current version of the support board. - * - isWeb = (document.URL.lastIndexOf("isis.astrogeology.usgs.gov") > 0) || - (document.URL.lastIndexOf("isis-dev.wr.usgs.gov") > 0) || - (document.URL.lastIndexOf("blackflag") > 0) ; - if (isWeb) { - document.write ( - "<div><script language=\"JavaScript\" type=\"text/javascript\" src=\"http://isis.astrogeology.usgs.gov/IsisSupport/topics_anywhere.php?mode=show&f=1&n=3&a=y&t=_top&rt=n&so=d&b=dis&lpd=3&af=p3R0pyCnbHB0pw%3D%3D&l=y\"></script></div>" ); - } else { - document.write ( "Visit the <a href=\"http://isis.astrogeology.usgs.gov/IsisSupport/\" target=\"_top\">ISIS Support Center</a> for the latest news and announcements.") ; - } - if (isWeb) { - document.write ( - "<p class=\"caption\" style=\"text-align:right;\">" + - " <a href=\"http://isis.astrogeology.usgs.gov/IsisSupport/viewforum.php?f=1\" target=\"_top\">" + - " More...</a>" + - "</p>" ) ; - } - */ - document.write("Visit the <a href=\"https://astrodiscuss.usgs.gov/\" target=\"_top\">Astro Discussion Board</a> for the latest news and announcements."); -} - -function writeWhatsUpAtTheSupportCenter () { - /* - * Again, this code is not working with our support board. - * - isWeb = (document.URL.lastIndexOf("isis.astrogeology.usgs.gov") > 0) || - (document.URL.lastIndexOf("isis-dev.wr.usgs.gov") > 0) || - (document.URL.lastIndexOf("blackflag") > 0) ; - if (isWeb) { - document.write ( - "<!- - Isis Support - -> " + - "<h2>What's Up at the ISIS Support Center?</h2> " + - "<div style=\"text-align:center;\"> " + - "<div style=\"padding:10px; text-align: left;\"> " - ); - } - if (isWeb) { - document.write ( - "<script language=\"JavaScript\" type=\"text/javascript\" src=\"http://isis.astrogeology.usgs.gov/IsisSupport/topics_anywhere.php?mode=show&f=a&n=10&jlp=y&ct=caption&sfn=y&fnl=y&r=y&a=y&s=y&l=y&h=mpl&so=d&b=lpi&lpb=0&lpd=3&lpi=y&bl=y&ct=caption&t=_top\"></script>" ); - } - if (isWeb) { - document.write ( - "<p class=\"caption\" style=\"text-align:right;\"> " + - " <a href=\"http://isis.astrogeology.usgs.gov/IsisSupport\" target=\"_top\"> " + - " More...</a> " + - "</p> " + - "</div> " + - "</div> " - ); - } - */ -} diff --git a/isis/src/docsys/assets/scripts/navigationBar.js b/isis/src/docsys/assets/scripts/navigationBar.js deleted file mode 100644 index ecfe384fd177b6ad5cd768d66cf9aeb1f3a2a5e4..0000000000000000000000000000000000000000 --- a/isis/src/docsys/assets/scripts/navigationBar.js +++ /dev/null @@ -1,272 +0,0 @@ - - // SCRIPT: Navigation Bar - // Filename: navigationBar.js - // Purpose: behavior for the horizontal navigation bar - // Author: Deborah Lee Soltesz, USGS, 10/2001 - // History: 12/2005 dls implemented writing of navbar in this script - // to allow changing the menu in one place for - // the entire site - - - - navWidth = 600 ; - navHeight = 19 ; - navSubImgName = "bsubtopics" ; - - site = "http://astrogeology.usgs.gov" ; - - // array indices - navFilenameCool = 0 ; - navFilenameHot = 1 ; - navImgName = 2 ; - navSubFilename = 3 ; - navMap = 4 ; - - imageNumChoice = 0 ; // current image highlighted - - defaultBar = 0 ; // the bar to be displayed when none is highlighted - - // customize: edit path - navBaseURL = "/assets/navigation/menubar/" ; - - // customize: name of blank submenu bars - navSubBlank = "blank_menu_bar.gif" ; - navSubBase = "starfield_menu_bar.gif" ; - - Timeout = 5000 ; - TimeoutID = 0 ; - - // customize: list images to be used in the script - navArr = new Array ( - new Array ("", "", ""), // no 0 - new Array ("solarsystem_menu_button.gif", "solarsystem_menu_button_hot.gif", "bsolarsystem", "solarsystem_menu_bar.gif" , "SolarSystemMap"), - new Array ("missions_menu_button.gif", "missions_menu_button_hot.gif", "bmissions" , "missions_menu_bar.gif" , "MissionsMap" ), - new Array ("technology_menu_button.gif", "technology_menu_button_hot.gif", "btechnology" , "technology_menu_bar.gif" , "TechnologyMap" ), - new Array ("datainfo_menu_button.gif", "datainfo_menu_button_hot.gif", "bdatainfo" , "datainfo_menu_bar.gif" , "DataAndInformationMap"), - new Array ("research_menu_button.gif", "research_menu_button_hot.gif", "bresearch" , "research_menu_bar.gif" , ""), - new Array ("hottopics_menu_button.gif", "hottopics_menu_button_hot.gif", "bhottopics" , navSubBlank , ""), - new Array ("gallery_menu_button.gif", "gallery_menu_button_hot.gif", "bgallery" , "gallery_menu_bar.gif" , ""), - new Array ("about_menu_button.gif", "about_menu_button_hot.gif", "babout" , "about_menu_bar.gif" , ""), - new Array ("search_menu_button.gif", "search_menu_button_hot.gif", "bsearch" , navSubBlank , ""), - new Array ("kidszone_menu_button.gif", "kidszone_menu_button_hot.gif", "bkids" , navSubBlank , "") - ) ; - numNavImages = navArr.length ; - - // preloading images needs to be looked into -- it seems to clear up - // some problems in Netscape4.7, but there's still a lag on changing - // images on mouseover the first time in all browsers, suggesting the - // preload may not be working? - preloadImage = new Array (numNavImages) ; - preloadImageSub = new Array (numNavImages) ; - for (loop = 1 ; loop < numNavImages ; loop++) { - preloadImage[loop] = new Image () ; - preloadImageSub[loop] = new Image () ; - preloadImage[loop].src = site + navBaseURL + navArr [loop][navFilenameHot] ; - preloadImageSub[loop].src = site + navBaseURL + navArr [loop][navSubFilename] ; - } - - // customize: list links for altering submenu image map - // Up to 12 links, array corresponds to same order above - // First element is path to subtopics - navLinkArr = new Array ( - new Array ("", "/", "/", "/", "/", "/", "/", "/", "/", "/", "/", "/", "/"), // no 0 - new Array ("/SolarSystem/", "Sun/", "Mercury/", "Venus/", "Earth/", "Mars/", "Jupiter/", "Saturn/", "Uranus/", "Neptune/", "Pluto/", "OtherObjects/", "Beyond/"), - new Array ("/Missions/", "Cassini/", "Clementine/", "Galileo/", "LunarOrbiter/", "LunarOrbiter/", "Magellan/", "Mariner/", "MarsPathfinder/", "MarsGlobalSurveyor/", "Viking/", "Voyager/", "More/"), - new Array ("/Technology/", "Software/", "Software/", "ImageProcessing/", "ImageProcessing/", "LabsAndFacilities/", "LabsAndFacilities/", "OtherTechnology/", "OtherTechnology/", "TechnicalInformationLinks/", "TechnicalInformationLinks/", "TechnicalInformationLinks/", "TechnicalInformationLinks/"), - new Array ("/DataAndInformation/", "Databases/", "Databases/", "Databases/", "Databases/", "Databases/", "Databases/", "ImagesAndMaps/", "ImagesAndMaps/", "ImagesAndMaps/", "ImagesAndMaps/", "ImagesAndMaps/", "ImagesAndMaps/"), - new Array ("/Research/", "Geology/", "Monitoring/", "Monitoring/", "RemoteSensing/", "RemoteSensing/", "IceAndPolar/", "IceAndPolar/", "InTheLab/", "OtherResearch/", "OtherResearch/", "Organizations/", "Organizations/"), - new Array ("/HotTopics/", "", "", "", "", "", "", "", "", "", "", "", ""), - new Array ("/Gallery/", "ImageGallery/", "ImageGallery/", "DesktopWallpaper/", "DesktopWallpaper/", "DesktopWallpaper/", "MoviesAndAnimations/", "MoviesAndAnimations/", "MoviesAndAnimations/", "Posters/", "Posters/", "ScreenSavers/", "ScreenSavers/"), - new Array ("/About/", "AstroHistory/", "AstroToday/", "AstroFuture/", "People/", "Teams/", "Contact/", "Contact/", "Visitors/", "Visitors/", "Careers/", "Crediting/", "Crediting/"), - new Array ("/Search/", "", "", "", "", "", "", "", "", "", "", "", ""), - new Array ("/Kids/", "", "", "", "", "", "", "", "", "", "", "", "") - ) ; - numLinks = navLinkArr.length ; - - // customize: list corresponding alt/title tags for submenu image map - navLinkAltArr = new Array ( - new Array ("", "", "", "", "", "", "", "", "", "", "", "", ""), // no 0 - new Array ("", "Sun", "Mercury", "Venus", "Earth", "Mars", "Jupiter", "Saturn", "Uranus", "Neptune", "Pluto", "Other Objects", "Beyond the Solar System"), - new Array ("", "Cassini", "Clementine", "Galileo", "Lunar Orbiter", "Lunar Orbiter", "Magellan", "Mariner", "Mars Pathfinder", "Mars Global Surveyor", "Viking", "Voyager", "More Missions"), - new Array ("", "Software", "Software", "Image Processing", "Image Processing", "Labs and Facilities", "Labs and Facilities", "Other Technology", "Other Technology", "Technical Information Links", "Technical Information Links", "Technical Information Links", "TechnicalInformationLinks"), - new Array ("", "", "", "", "", "Databases", "Databases", "ImagesAndMaps", "ImagesAndMaps", "", "", "", ""), - new Array ("", "Geology", "Monitoring", "Monitoring", "Remote Sensing", "Remote Sensing", "Ice and Polar", "Ice and Polar", "In the Lab", "Other Research", "Other Research", "Organizations", "Organizations"), - new Array ("", "", "", "", "", "", "", "", "", "", "", "", ""), - new Array ("", "Image Gallery", "Image Gallery", "Desktop Wallpaper", "Desktop Wallpaper", "Desktop Wallpaper", "Movies and Animations", "Movies and Animations", "Movies and Animations", "Posters", "Posters", "Screen Savers", "Screen Savers"), - new Array ("", "History", "Now", "Future", "People", "Teams", "Contact Us", "Contact Us", "Visitor Information", "Visitors Information", "Careers", "Using Our Images", "Using Our Images"), - new Array ("", "", "", "", "", "", "", "", "", "", "", "", ""), - new Array ("", "", "", "", "", "", "", "", "", "", "", "", "") - ) ; - - // 'enumed' types for referring to each topic corresponding to arrays - noBar = 0 ; - solarBar = 1 ; - missionBar = 2 ; - techBar = 3 ; - datainfoBar = 4 ; - researchBar = 5 ; - hottopicsBar = 6 ; - galleryBar = 7 ; - aboutBar = 8 ; - searchBar = 9 ; - kidsBar = 10 ; - - gonnaReheat = 0 ; // lets cool function know it's been called from the heat function - - // writes the image width - function writeNavWidth () { - document.write(navWidth) ; - } - - // writes the image height - function writeNavHeight () { - document.write(navHeight) ; - } - - // write out the path and filename to the chosen image - function writeNavPathAndFilename (imageNum) { - document.write(site + navBaseURL + navArr[imageNum][navFilename]) ; - } - - // change specified image tag named 'imgName' to chosen image - function heatNavButton (imageNum) { - gonnaReheat = 1 ; - coolAllNavButtons () ; - window.clearTimeout(TimeoutID) ; - gonnaReheat = 0 ; - setImageNum (imageNum) ; - document.images[navArr[imageNum][navImgName]].src = site + navBaseURL + navArr[imageNum][navFilenameHot] ; - document.images[navSubImgName].src = site + navBaseURL + navArr[imageNum][navSubFilename] ; - TimeoutID = window.setTimeout("coolAllNavButtons()", Timeout); - } - - - // functions for changing the image map area hrefs and titles - function setImageNum (imageNum) { - imageNumChoice = imageNum ; - } - - // set which is the default bar to highlight for the page - function setDefaultBarTo (imgNum) { - defaultBar = imgNum ; - } - - function getMapAreaHref (i) { - return site + navLinkArr[imageNumChoice][0] + navLinkArr[imageNumChoice][i] ; - } - - function getMapAreaAlt (i) { - return navLinkAltArr[imageNumChoice][i] ; - } - - - - // change specified image tag named 'imgName' to cool state - function coolNavButton (imageNum) { - document.images[navArr[imageNum][navImgName]].src = site + navBaseURL + navArr[imageNum][navFilenameCool] ; - document.images[navSubImgName].src = site + navBaseURL + navSubBase ; - } - - // change all buttons to cool state - function coolAllNavButtons () { - document.images[navSubImgName].src = site + navBaseURL + navSubBase ; - for (i = 1 ; i < numNavImages ; i++) { - document.images[navArr[i][navImgName]].src = site + navBaseURL + navArr[i][navFilenameCool] ; - } - - if (gonnaReheat != 1) { - imageNumChoice = defaultBar ; - if (imageNumChoice) { - heatNavButton (imageNumChoice) ; - } - } - } - - - function writeNavigationBar () { - document.write(" <table cellpadding=\"0\" cellspacing=\"0\" border=\"0\" width=\"600\" bgcolor=\"white\">") ; - document.write(" <tr valign=top align=left>") ; - - document.write(" <!-- Solar System -->") ; - document.write(" <td>") ; - document.write(" <a href=\"" + site + "/SolarSystem/\" onMouseOver=\"heatNavButton(1);\" accesskey=\"1\">") ; - document.write(" <img src=\"" + site + "/assets/navigation/menubar/solarsystem_menu_button.gif\" alt=\"[Solar System]\" name=\"bsolarsystem\" width=\"70\" height=\"19\" border=0></a></td>") ; - - document.write(" <!-- Missions -->") ; - document.write(" <td>") ; - - document.write(" <a href=\"" + site + "/Missions/\" onMouseOver=\"heatNavButton(2);\" accesskey=\"2\">") ; - document.write(" <img src=\"" + site + "/assets/navigation/menubar/missions_menu_button.gif\" alt=\"[Missions]\" name=\"bmissions\" width=\"53\" height=\"19\" border=0></a></td>") ; - - document.write(" <!-- Technology -->") ; - document.write(" <td>") ; - document.write(" <a href=\"" + site + "/Technology/\" onMouseOver=\"heatNavButton(3);\" accesskey=\"3\">") ; - document.write(" <img src=\"" + site + "/assets/navigation/menubar/technology_menu_button.gif\" alt=\"[Technology]\" name=\"btechnology\" width=\"66\" height=\"19\" border=0 hspace=0 vspace=0></a></td>") ; - - document.write(" <!-- Data and Information -->") ; - document.write(" <td>") ; - - document.write(" <a href=\"" + site + "/DataAndInformation/\" target=_top onMouseOver=\"heatNavButton(4);\" accesskey=\"4\">") ; - document.write(" <img src=\"" + site + "/assets/navigation/menubar/datainfo_menu_button.gif\" alt=\"[Data & Information]\" name=\"bdatainfo\" width=\"102\" height=\"19\" border=0 hspace=0 vspace=0></a></td>") ; - - document.write(" <!-- Research -->") ; - document.write(" <td>") ; - document.write(" <a href=\"" + site + "/Research/\" target=_top onMouseOver=\"heatNavButton(5);\" accesskey=\"5\">") ; - document.write(" <img src=\"" + site + "/assets/navigation/menubar/research_menu_button.gif\" alt=\"[Research]\" name=\"bresearch\" width=\"54\" height=\"19\" border=0 hspace=0 vspace=0></a></td>") ; - - document.write(" <!-- Hot Topics -->") ; - document.write(" <td>") ; - - document.write(" <a href=\"" + site + "/HotTopics/\" target=_top onMouseOver=\"heatNavButton(6);\" accesskey=\"6\">") ; - document.write(" <img src=\"" + site + "/assets/navigation/menubar/hottopics_menu_button.gif\" alt=\"[Hot Topics]\" name=\"bhottopics\" width=\"60\" height=\"19\" border=0 hspace=0 vspace=0></a></td>") ; - - document.write(" <!-- Gallery -->") ; - document.write(" <td>") ; - document.write(" <a href=\"" + site + "/Gallery/\" target=_top onMouseOver=\"heatNavButton(7);\" accesskey=\"7\">") ; - document.write(" <img src=\"" + site + "/assets/navigation/menubar/gallery_menu_button.gif\" alt=\"[Gallery]\" name=\"bgallery\" width=\"46\" height=\"19\" border=0 hspace=0 vspace=0></a></td>") ; - - document.write(" <!-- About Us -->") ; - document.write(" <td>") ; - - document.write(" <a href=\"" + site + "/About/\" target=_top onMouseOver=\"heatNavButton(8);\" accesskey=\"8\">") ; - document.write(" <img src=\"" + site + "/assets/navigation/menubar/about_menu_button.gif\" alt=\"[About Us]\" name=\"babout\" width=\"53\" height=\"19\" border=0 hspace=0 vspace=0></a></td>") ; - - document.write(" <!-- Search -->") ; - document.write(" <td>") ; - document.write(" <a href=\"" + site + "/Search/\" target=_top onMouseOver=\"heatNavButton(9);\" accesskey=\"9\">") ; - document.write(" <img src=\"" + site + "/assets/navigation/menubar/search_menu_button.gif\" alt=\"[Search]\" name=\"bsearch\" width=\"43\" height=\"19\" border=0 hspace=0 vspace=0></a></td>") ; - - document.write(" <!-- Kids' Zone -->") ; - document.write(" <td>") ; - - document.write(" <a href=\"" + site + "/Kids/\" title=\"\" onMouseOver=\"heatNavButton(10);\" accesskey=\"0\">") ; - document.write(" <img src=\"" + site + "/assets/navigation/menubar/kidszone_menu_button.gif\" alt=\"[Kids' Zone]\" name=\"bkids\" width=\"52\" height=\"19\" border=0></a></td>") ; - document.write(" </tr>") ; - - document.write(" <tr>") ; - document.write(" <td colspan=\"10\">") ; - document.write(" <img src=\"" + site + "/assets/navigation/menubar/starfield_menu_bar.gif\" alt=\" [end navigation bar] \" name=\"bsubtopics\" width=600 height=21 border=0 usemap=\"#menumap\" hspace=\"0\" vspace=\"0\"></td>") ; - document.write(" </tr>") ; - - document.write(" </table>") ; - - document.write(" <map name=\"menumap\">") ; - - document.write(" <area shape=\"rect\" coords=\"0,0,50,21\" href=\"#top\" title=\"\" target=\"_top\" alt=\"\" name=\"link1\" onmouseover=\"this.href=getMapAreaHref(1); this.alt=getMapAreaAlt(1); this.title=getMapAreaAlt(1); \">") ; - document.write(" <area shape=\"rect\" coords=\"50,0,100,21\" href=\"#top\" title=\"\" target=\"_top\" alt=\"\" name=\"link2\" onmouseover=\"this.href=getMapAreaHref(2); this.alt=getMapAreaAlt(2); this.title=getMapAreaAlt(2); \">") ; - document.write(" <area shape=\"rect\" coords=\"100,0,150,21\" href=\"#top\" title=\"\" target=\"_top\" alt=\"\" name=\"link3\" onmouseover=\"this.href=getMapAreaHref(3); this.alt=getMapAreaAlt(3); this.title=getMapAreaAlt(3); \">") ; - document.write(" <area shape=\"rect\" coords=\"150,0,200,21\" href=\"#top\" title=\"\" target=\"_top\" alt=\"\" name=\"link4\" onmouseover=\"this.href=getMapAreaHref(4); this.alt=getMapAreaAlt(4); this.title=getMapAreaAlt(4); \">") ; - document.write(" <area shape=\"rect\" coords=\"200,0,250,21\" href=\"#top\" title=\"\" target=\"_top\" alt=\"\" name=\"link5\" onmouseover=\"this.href=getMapAreaHref(5); this.alt=getMapAreaAlt(5); this.title=getMapAreaAlt(5); \">") ; - document.write(" <area shape=\"rect\" coords=\"250,0,300,21\" href=\"#top\" title=\"\" target=\"_top\" alt=\"\" name=\"link6\" onmouseover=\"this.href=getMapAreaHref(6); this.alt=getMapAreaAlt(6); this.title=getMapAreaAlt(6); \">") ; - document.write(" <area shape=\"rect\" coords=\"300,0,350,21\" href=\"#top\" title=\"\" target=\"_top\" alt=\"\" name=\"link7\" onmouseover=\"this.href=getMapAreaHref(7); this.alt=getMapAreaAlt(7); this.title=getMapAreaAlt(7); \">") ; - document.write(" <area shape=\"rect\" coords=\"350,0,400,21\" href=\"#top\" title=\"\" target=\"_top\" alt=\"\" name=\"link8\" onmouseover=\"this.href=getMapAreaHref(8); this.alt=getMapAreaAlt(8); this.title=getMapAreaAlt(8); \">") ; - document.write(" <area shape=\"rect\" coords=\"400,0,450,21\" href=\"#top\" title=\"\" target=\"_top\" alt=\"\" name=\"link9\" onmouseover=\"this.href=getMapAreaHref(9); this.alt=getMapAreaAlt(9); this.title=getMapAreaAlt(9); \">") ; - - document.write(" <area shape=\"rect\" coords=\"450,0,500,21\" href=\"#top\" title=\"\" target=\"_top\" alt=\"\" name=\"link10\" onmouseover=\"this.href=getMapAreaHref(10); this.alt=getMapAreaAlt(10); this.title=getMapAreaAlt(10);\">") ; - document.write(" <area shape=\"rect\" coords=\"500,0,550,21\" href=\"#top\" title=\"\" target=\"_top\" alt=\"\" name=\"link11\" onmouseover=\"this.href=getMapAreaHref(11); this.alt=getMapAreaAlt(11); this.title=getMapAreaAlt(11);\">") ; - document.write(" <area shape=\"rect\" coords=\"550,0,600,21\" href=\"#top\" title=\"\" target=\"_top\" alt=\"\" name=\"link12\" onmouseover=\"this.href=getMapAreaHref(12); this.alt=getMapAreaAlt(12); this.title=getMapAreaAlt(12);\">") ; - document.write(" <area shape=\"default\" nohref alt=\"\">") ; - document.write(" </map>") ; - document.write(" <!-- END MAIN TOPIC NAVIGATION -->") ; - } - diff --git a/isis/src/docsys/assets/scripts/uswds-init.min.js.map b/isis/src/docsys/assets/scripts/uswds-init.min.js.map new file mode 100755 index 0000000000000000000000000000000000000000..ecb295ff5eda5481eb3882d476e0c90ae658ff8c --- /dev/null +++ b/isis/src/docsys/assets/scripts/uswds-init.min.js.map @@ -0,0 +1 @@ +{"version":3,"file":"uswds-init.min.js","sources":["uswds-init.js"],"sourcesContent":["/* eslint-disable no-var */\n(function uswdsInit() {\n \"use strict\";\n\n var loadingClass = \"usa-js-loading\";\n var fallback;\n\n document.documentElement.classList.add(loadingClass);\n function revertClass() {\n document.documentElement.classList.remove(loadingClass);\n }\n\n fallback = setTimeout(revertClass, 8000);\n\n function verifyLoaded() {\n if (window.uswdsPresent) {\n clearTimeout(fallback);\n revertClass();\n window.removeEventListener(\"load\", verifyLoaded, true);\n }\n }\n\n window.addEventListener(\"load\", verifyLoaded, true);\n})();\n"],"names":["fallback","loadingClass","revertClass","document","documentElement","classList","remove","add","setTimeout","window","addEventListener","verifyLoaded","uswdsPresent","clearTimeout","removeEventListener"],"mappings":"AACA,CAAA,WAGE,IACIA,EADAC,EAAe,iBAInB,SAASC,IACPC,SAASC,gBAAgBC,UAAUC,OAAOL,CAAY,CACxD,CAHAE,SAASC,gBAAgBC,UAAUE,IAAIN,CAAY,EAKnDD,EAAWQ,WAAWN,EAAa,GAAI,EAUvCO,OAAOC,iBAAiB,OARxB,SAASC,IACHF,OAAOG,eACTC,aAAab,CAAQ,EACrBE,EAAY,EACZO,OAAOK,oBAAoB,OAAQH,EAAc,CAAA,CAAI,EAEzD,EAE8C,CAAA,CAAI,CACnD,EAAE"} \ No newline at end of file diff --git a/isis/src/docsys/assets/scripts/uswds.min.js.map b/isis/src/docsys/assets/scripts/uswds.min.js.map new file mode 100755 index 0000000000000000000000000000000000000000..ca0f084504278be6e725909145a2237276bb45be --- /dev/null +++ b/isis/src/docsys/assets/scripts/uswds.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["node_modules/browser-pack/_prelude.js","node_modules/element-closest/element-closest.js","node_modules/keyboardevent-key-polyfill/index.js","node_modules/object-assign/index.js","node_modules/receptor/behavior/index.js","node_modules/receptor/compose/index.js","node_modules/receptor/delegate/index.js","node_modules/receptor/delegateAll/index.js","node_modules/receptor/ignore/index.js","node_modules/receptor/index.js","node_modules/receptor/keymap/index.js","node_modules/receptor/once/index.js","node_modules/resolve-id-refs/index.js","packages/_usa-password/src/index.js","packages/usa-accordion/src/index.js","packages/usa-banner/src/index.js","packages/usa-button/src/index.js","packages/usa-character-count/src/index.js","packages/usa-combo-box/src/index.js","packages/usa-date-picker/src/index.js","packages/usa-date-range-picker/src/index.js","packages/usa-file-input/src/index.js","packages/usa-footer/src/index.js","packages/usa-header/src/index.js","packages/usa-in-page-navigation/src/index.js","packages/usa-input-mask/src/index.js","packages/usa-language-selector/src/index.js","packages/usa-modal/src/index.js","packages/usa-range/src/index.js","packages/usa-search/src/index.js","packages/usa-skipnav/src/index.js","packages/usa-table/src/index.js","packages/usa-time-picker/src/index.js","packages/usa-tooltip/src/index.js","packages/usa-validation/src/index.js","packages/uswds-core/src/js/config.js","packages/uswds-core/src/js/events.js","packages/uswds-core/src/js/index.js","packages/uswds-core/src/js/polyfills/custom-event.js","packages/uswds-core/src/js/polyfills/element-hidden.js","packages/uswds-core/src/js/polyfills/index.js","packages/uswds-core/src/js/polyfills/number-is-nan.js","packages/uswds-core/src/js/polyfills/svg4everybody.js","packages/uswds-core/src/js/start.js","packages/uswds-core/src/js/utils/active-element.js","packages/uswds-core/src/js/utils/behavior.js","packages/uswds-core/src/js/utils/debounce.js","packages/uswds-core/src/js/utils/focus-trap.js","packages/uswds-core/src/js/utils/is-in-viewport.js","packages/uswds-core/src/js/utils/is-ios-device.js","packages/uswds-core/src/js/utils/sanitizer.js","packages/uswds-core/src/js/utils/scrollbar-width.js","packages/uswds-core/src/js/utils/select-or-matches.js","packages/uswds-core/src/js/utils/select.js","packages/uswds-core/src/js/utils/toggle-field-mask.js","packages/uswds-core/src/js/utils/toggle-form-input.js","packages/uswds-core/src/js/utils/toggle.js","packages/uswds-core/src/js/utils/validate-input.js"],"names":["r","e","n","t","o","i","f","c","require","u","a","Error","code","p","exports","call","length","1","module","ElementProto","window","Element","prototype","matches","msMatchesSelector","mozMatchesSelector","webkitMatchesSelector","selector","element","this","elements","document","ownerDocument","querySelectorAll","index","Boolean","closest","nodeType","parentNode","keyboardeventKeyPolyfill","polyfill","KeyboardEvent","proto","get","x","key","keys","which","keyCode","Array","isArray","shiftKey","Object","defineProperty","3","6","8","9","12","13","16","17","18","19","20","27","28","29","30","31","32","33","34","35","36","37","38","39","40","41","42","43","44","45","46","48","49","50","51","52","53","54","55","56","57","91","93","144","145","181","182","183","186","187","188","189","190","191","192","219","220","221","222","224","225","246","247","248","249","250","251","letter","String","fromCharCode","toLowerCase","toUpperCase","define","amd","getOwnPropertySymbols","hasOwnProperty","propIsEnumerable","propertyIsEnumerable","assign","test1","getOwnPropertyNames","test2","test3","order2","map","join","split","forEach","err","target","source","from","to","val","TypeError","s","arguments","symbols","delegate","delegateAll","DELEGATE_PATTERN","popKey","obj","value","events","props","listeners","reduce","memo","type","handler","match","options","capture","passive","listener","indexOf","_type","concat","add","addEventListener","remove","removeEventListener","functions","some","fn","event","compose","selectors","delegates","push","contains","behavior","ignore","keymap","MODIFIERS","Alt","Control","Ctrl","Shift","hasModifiers","modifier","result","_key","undefined","wrapped","currentTarget","RE_TRIM","RE_SPLIT","trim","str","replace","ids","doc","getElementById","id","querySelector","bind","el","toggleFormInput","CLICK","PREFIX","preventDefault","select","toggle","isElementInViewport","ACCORDION","BUTTON","EXPANDED","getAccordionButtons","accordion","filter","button","toggleButton","expanded","safeExpanded","multiselectable","hasAttribute","other","getAttribute","scrollIntoView","init","root","show","hide","getButtons","HEADER","EXPANDED_CLASS","BANNER_BUTTON","trigger","classList","anchorButton","keydown","a[class*=\"usa-button\"]"," ","click","debounce","CHARACTER_COUNT_CLASS","CHARACTER_COUNT","INPUT","MESSAGE","VALIDATION_MESSAGE","MESSAGE_INVALID_CLASS","STATUS_MESSAGE_CLASS","STATUS_MESSAGE_SR_ONLY_CLASS","STATUS_MESSAGE","STATUS_MESSAGE_SR_ONLY","DEFAULT_STATUS_LABEL","getCharacterCountElements","inputEl","characterCountEl","messageEl","createStatusMessages","statusMessage","createElement","srStatusMessage","defaultMessage","dataset","maxlength","setAttribute","textContent","append","getCountMessage","currentLength","maxLength","let","newMessage","difference","Math","abs","srUpdateStatus","msgEl","updateCountMessage","parseInt","currentStatusMessage","isOverLimit","validationMessage","setCustomValidity","enhanceCharacterCount","removeAttribute","characterCount","input","selectOrMatches","Sanitizer","COMBO_BOX_CLASS","COMBO_BOX_PRISTINE_CLASS","SELECT_CLASS","INPUT_CLASS","CLEAR_INPUT_BUTTON_CLASS","CLEAR_INPUT_BUTTON_WRAPPER_CLASS","INPUT_BUTTON_SEPARATOR_CLASS","TOGGLE_LIST_BUTTON_CLASS","TOGGLE_LIST_BUTTON_WRAPPER_CLASS","LIST_CLASS","LIST_OPTION_CLASS","LIST_OPTION_FOCUSED_CLASS","LIST_OPTION_SELECTED_CLASS","STATUS_CLASS","COMBO_BOX","SELECT","CLEAR_INPUT_BUTTON","TOGGLE_LIST_BUTTON","LIST","LIST_OPTION","LIST_OPTION_FOCUSED","LIST_OPTION_SELECTED","STATUS","DEFAULT_FILTER","changeElementValue","elementToChange","CustomEvent","bubbles","cancelable","detail","dispatchEvent","getComboBoxContext","selectEl","listEl","statusEl","focusedOptionEl","selectedOptionEl","toggleListBtnEl","clearInputBtnEl","isPristine","comboBoxEl","disableFiltering","disable","hidden","disabled","enhanceComboBox","_comboBoxEl","enhanced","selectId","selectLabel","listId","listIdLabel","assistiveHintID","additionalAttributes","defaultValue","placeholder","selectedOption","len","optionEl","name","attr","escapeHTML","insertAdjacentElement","insertAdjacentHTML","text","highlightOption","nextEl","skipFocus","preventScroll","optionBottom","offsetTop","offsetHeight","scrollTop","focus","generateDynamicRegExp","query","extras","escapeRegExp","find","m","$1","queryFilter","matcher","RegExp","displayList","selectedItemId","firstFoundId","listOptionBaseId","inputValue","regex","optionId","test","numOptions","optionHtml","option","classes","tabindex","ariaSelected","li","noResults","innerHTML","item","itemToFocus","hideList","selectItem","listOptionEl","resetSelection","selectValue","handleDownFromInput","nextOptionEl","handleDownFromListOption","nextSibling","handleUpFromListOption","previousSibling","listShown","comboBox","clearButtonEl","focusout","relatedTarget","Escape","Enter","ArrowDown","Down","ArrowUp","Up","Shift+Tab","mouseover","enable","activeElement","isIosDevice","DATE_PICKER_CLASS","DATE_PICKER_WRAPPER_CLASS","DATE_PICKER_INITIALIZED_CLASS","DATE_PICKER_ACTIVE_CLASS","DATE_PICKER_INTERNAL_INPUT_CLASS","DATE_PICKER_EXTERNAL_INPUT_CLASS","DATE_PICKER_BUTTON_CLASS","DATE_PICKER_CALENDAR_CLASS","DATE_PICKER_STATUS_CLASS","CALENDAR_DATE_CLASS","CALENDAR_DATE_FOCUSED_CLASS","CALENDAR_DATE_SELECTED_CLASS","CALENDAR_DATE_PREVIOUS_MONTH_CLASS","CALENDAR_DATE_CURRENT_MONTH_CLASS","CALENDAR_DATE_NEXT_MONTH_CLASS","CALENDAR_DATE_RANGE_DATE_CLASS","CALENDAR_DATE_TODAY_CLASS","CALENDAR_DATE_RANGE_DATE_START_CLASS","CALENDAR_DATE_RANGE_DATE_END_CLASS","CALENDAR_DATE_WITHIN_RANGE_CLASS","CALENDAR_PREVIOUS_YEAR_CLASS","CALENDAR_PREVIOUS_MONTH_CLASS","CALENDAR_NEXT_YEAR_CLASS","CALENDAR_NEXT_MONTH_CLASS","CALENDAR_MONTH_SELECTION_CLASS","CALENDAR_YEAR_SELECTION_CLASS","CALENDAR_MONTH_CLASS","CALENDAR_MONTH_FOCUSED_CLASS","CALENDAR_MONTH_SELECTED_CLASS","CALENDAR_YEAR_CLASS","CALENDAR_YEAR_FOCUSED_CLASS","CALENDAR_YEAR_SELECTED_CLASS","CALENDAR_PREVIOUS_YEAR_CHUNK_CLASS","CALENDAR_NEXT_YEAR_CHUNK_CLASS","CALENDAR_DATE_PICKER_CLASS","CALENDAR_MONTH_PICKER_CLASS","CALENDAR_YEAR_PICKER_CLASS","CALENDAR_TABLE_CLASS","CALENDAR_ROW_CLASS","CALENDAR_CELL_CLASS","CALENDAR_CELL_CENTER_ITEMS_CLASS","CALENDAR_MONTH_LABEL_CLASS","CALENDAR_DAY_OF_WEEK_CLASS","DATE_PICKER","DATE_PICKER_BUTTON","DATE_PICKER_INTERNAL_INPUT","DATE_PICKER_EXTERNAL_INPUT","DATE_PICKER_CALENDAR","DATE_PICKER_STATUS","CALENDAR_DATE","CALENDAR_DATE_FOCUSED","CALENDAR_DATE_CURRENT_MONTH","CALENDAR_PREVIOUS_YEAR","CALENDAR_PREVIOUS_MONTH","CALENDAR_NEXT_YEAR","CALENDAR_NEXT_MONTH","CALENDAR_YEAR_SELECTION","CALENDAR_MONTH_SELECTION","CALENDAR_MONTH","CALENDAR_YEAR","CALENDAR_PREVIOUS_YEAR_CHUNK","CALENDAR_NEXT_YEAR_CHUNK","CALENDAR_DATE_PICKER","CALENDAR_MONTH_PICKER","CALENDAR_YEAR_PICKER","CALENDAR_MONTH_FOCUSED","CALENDAR_YEAR_FOCUSED","MONTH_LABELS","DAY_OF_WEEK_LABELS","YEAR_CHUNK","DEFAULT_EXTERNAL_DATE_FORMAT","INTERNAL_DATE_FORMAT","processFocusableSelectors","DATE_PICKER_FOCUSABLE","MONTH_PICKER_FOCUSABLE","YEAR_PICKER_FOCUSABLE","keepDateWithinMonth","dateToCheck","month","getMonth","setDate","year","date","newDate","Date","setFullYear","today","day","getDate","getFullYear","startOfMonth","lastDayOfMonth","addDays","_date","numDays","getTime","subDays","addWeeks","numWeeks","startOfWeek","dayOfWeek","getDay","addMonths","numMonths","dateMonth","setMonth","subMonths","addYears","numYears","subYears","setYear","min","dateA","dateB","max","isSameYear","isSameMonth","isSameDay","keepDateBetweenMinAndMax","minDate","maxDate","isDateWithinMinAndMax","isDatesMonthOutsideMinOrMax","isDatesYearOutsideMinOrMax","parseDateString","dateString","dateFormat","adjustDate","parsed","monthStr","dayStr","yearStr","Number","isNaN","currentYearStub","currentYear","lastDayOfTheMonth","formatDate","padZeros","slice","listToGridHtml","htmlArray","rowSize","grid","row","tr","td","createTableBody","tableBody","getDatePickerContext","datePickerEl","internalInputEl","externalInputEl","calendarEl","toggleBtnEl","firstYearChunkEl","inputDate","selectedDate","calendarDate","rangeDate","defaultDate","ariaDisable","isDateInputInvalid","checkDate","isInvalid","dateStringParts","validateDateInput","setCalendarValue","parsedDate","formattedDate","renderCalendar","_dateToDisplay","todaysDate","dateToDisplay","calendarWasHidden","focusedDate","focusedMonth","focusedYear","prevMonth","nextMonth","currentFormattedDate","firstOfMonth","prevButtonsDisabled","nextButtonsDisabled","rangeConclusionDate","rangeStartDate","rangeEndDate","withinRangeStartDate","withinRangeEndDate","monthLabel","days","dateToRender","isDisabled","isSelected","btn","datesGrid","newCalendar","cloneNode","table","style","top","tableHead","tableHeadRow","daysOfWeek","Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","th","replaceChild","statuses","hideCalendar","updateCalendarIfVisible","displayMonthSelection","monthToDisplay","selectedMonth","months","monthToCheck","monthsHtml","monthsGrid","displayYearSelection","yearToDisplay","selectedYear","yearToChunk","prevYearChunkDisabled","nextYearChunkDisabled","years","yearIndex","yearsCalendarWrapper","yearsTableParent","yearsHTMLTableBody","yearsHTMLTableBodyRow","previousYearsBtn","nextYearsBtn","yearsTable","yearsGrid","yearsTableBody","yearsHTMLTableBodyDetailPrev","yearsHTMLTableBodyYearsDetail","yearsHTMLTableBodyDetailNext","handleEscapeFromCalendar","adjustCalendar","adjustDateFn","cappedDate","handleUpFromDate","subWeeks","handleDownFromDate","handleLeftFromDate","handleRightFromDate","handleHomeFromDate","handleEndFromDate","endOfWeek","handlePageDownFromDate","handlePageUpFromDate","handleShiftPageDownFromDate","handleShiftPageUpFromDate","adjustMonthSelectionScreen","adjustMonthFn","monthEl","currentDate","adjustedMonth","handleUpFromMonth","handleDownFromMonth","handleLeftFromMonth","handleRightFromMonth","handleHomeFromMonth","handleEndFromMonth","handlePageDownFromMonth","handlePageUpFromMonth","adjustYearSelectionScreen","adjustYearFn","yearEl","adjustedYear","handleUpFromYear","handleDownFromYear","handleLeftFromYear","handleRightFromYear","handleHomeFromYear","handleEndFromYear","handlePageUpFromYear","handlePageDownFromYear","tabHandler","focusable","getFocusableContext","focusableElements","lastTabIndex","firstTabStop","lastTabStop","focusIndex","isNotFound","isFirstTab","isLastTab","tabAhead","tabBack","datePickerTabEventHandler","monthPickerTabEventHandler","yearPickerTabEventHandler","datePickerEvents","calendarDateEl","_buttonEl","nextToFocus","keyup","keydownKeyCode","Left","ArrowLeft","Right","ArrowRight","Home","End","PageDown","PageUp","Shift+PageDown","Shift+PageUp","Tab","newValue","datePicker","dateEl","currentCalendarDate","hoverDate","focusMonth","focusYear","calendarWrapper","appendChild","display","required","DATE_RANGE_PICKER_CLASS","DATE_RANGE_PICKER_RANGE_START_CLASS","DATE_RANGE_PICKER_RANGE_END_CLASS","DATE_RANGE_PICKER","DATE_RANGE_PICKER_RANGE_START","DATE_RANGE_PICKER_RANGE_END","getDateRangePickerContext","rangeStartEl","rangeEndEl","dateRangePickerEl","handleRangeStartUpdate","updatedDate","handleRangeEndUpdate","dateRangePicker","input change","rangeStart","rangeEnd","DROPZONE_CLASS","DROPZONE","TARGET_CLASS","BOX_CLASS","INSTRUCTIONS_CLASS","PREVIEW_CLASS","PREVIEW_HEADING_CLASS","DISABLED_CLASS","CHOOSE_CLASS","ACCEPTED_FILE_MESSAGE_CLASS","DRAG_TEXT_CLASS","DRAG_CLASS","LOADING_CLASS","INVALID_FILE_CLASS","GENERIC_PREVIEW_CLASS_NAME","GENERIC_PREVIEW_CLASS","PDF_PREVIEW_CLASS","WORD_PREVIEW_CLASS","VIDEO_PREVIEW_CLASS","EXCEL_PREVIEW_CLASS","SR_ONLY_CLASS","SPACER_GIF","TYPE_IS_VALID","DEFAULT_ARIA_LABEL_TEXT","DEFAULT_FILE_STATUS_TEXT","getFileInputContext","dropZoneEl","replaceName","charCodeAt","toString","makeSafeForID","createUniqueID","floor","now","getItemsLabel","fileInputEl","enhanceFileInput","itemsLabel","isInputDisabled","dropTarget","fileInputParent","box","prepend","insertBefore","instructions","dragText","chooseText","navigator","userAgent","outerHTML","fileInputTarget","removeOldPreviews","filePreviews","currentPreviewHeading","currentErrorMessage","node","removeChild","updateStatusMessage","statusElement","fileNames","fileStore","setTimeout","addPreviewHeading","filePreviewsHeading","changeItemText","previewHeadingText","handleUpload","acceptedFilesAttr","acceptedFiles","errorMessage","allFilesAllowed","scannedFiles","files","dataTransfer","file","j","fileType","returnValue","pos","errormessage","stopPropagation","reader","FileReader","fileName","imageId","onloadstart","onloadend","previewImage","src","readAsDataURL","fileInput","teardown","fileInputTopElement","parentElement","className","SCOPE","toggleHtmlTag","isMobile","bigFooter","currentElement","currentElementClasses","preservedHtmlTag","tagName","newElement","menuId","random","nextElementSibling","after","resize","isOpen","innerWidth","HIDE_MAX_WIDTH","mediaQueryList","matchMedia","addListener","removeListener","FocusTrap","ScrollBarWidth","NAV","NAV_CONTAINER","NAV_PRIMARY","NAV_PRIMARY_ITEM","NAV_CONTROL","NAV_LINKS","NON_NAV_HIDDEN_ATTRIBUTE","OPENERS","CLOSE_BUTTON","CLOSERS","TOGGLES","NON_NAV_ELEMENTS","NON_NAV_HIDDEN","ACTIVE_CLASS","navigation","navActive","nonNavElements","isActive","body","isSafari","includes","SCROLLBAR_WIDTH","INITIAL_PADDING","getComputedStyle","getPropertyValue","TEMPORARY_PADDING","hideNonNavItems","headerParent","nonNavElement","showNonNavItems","toggleNav","active","safeActive","currentScrollPosition","scrollY","setProperty","focusTrap","update","closeButton","menuButton","paddingRight","closer","getBoundingClientRect","width","onMenuClose","hideActiveNavDropdown","acc","parentNavItem","navControl","trapContainer","once","CURRENT_CLASS","IN_PAGE_NAV_VALID_HEADINGS","IN_PAGE_NAV_SCROLL_OFFSET","IN_PAGE_NAV_CLASS","IN_PAGE_NAV_ANCHOR_CLASS","IN_PAGE_NAV_NAV_CLASS","IN_PAGE_NAV_LIST_CLASS","IN_PAGE_NAV_ITEM_CLASS","IN_PAGE_NAV_PRIMARY_ITEM_CLASS","IN_PAGE_NAV_LINK_CLASS","IN_PAGE_NAV_TITLE_CLASS","setActive","allLinks","isIntersecting","intersectionRatio","link","createSectionHeadingsArray","selectedContentRegion","selectedHeadingTypes","selectedHeadingTypesArray","contentRegion","headingType","sectionHeadingsArray","handleScrollToSection","inPageNavScrollOffset","scrollOffset","scroll","block","location","hash","history","pushState","createInPageNav","inPageNavEl","inPageNavTitleText","titleText","inPageNavTitleHeadingLevel","titleHeadingLevel","inPageNavRootMargin","rootMargin","inPageNavThreshold","threshold","inPageNavContentSelector","mainContentSelector","inPageNavHeadingSelector","headingElements","sectionHeadings","heading","headingStyle","inPageNav","inPageNavTitle","inPageNavList","listItem","navLinks","anchorTag","textContentOfLink","tag","topHeadingLevel","headingId","baseId","suffix","anchorTags","observeSections","IntersectionObserver","observe","inPageNavigation","elementToScrollTo","targetAnchor","hashFragment","MASKED","MASK","MASK_CONTENT","PLACEHOLDER","maskedNumber","maskedLetter","strippedValue","isCharsetPresent","isInteger","isLetter","handleValueChange","maskVal","charset","charIndex","strippedVal","isInt","isLet","matchesNumber","matchesLetter","placeholderVal","substr","theIEl","maskEl","replaceChildren","inputMask","maskedInput","shell","content","LANGUAGE_SUB","LANGUAGE_PRIMARY","LANGUAGE_PRIMARY_ITEM","LANGUAGE_CONTROL","languageSelector","languageActive","onLanguageClose","toggleLanguage","hideActiveLanguageDropdown","parentLanguageItem","MODAL_CLASSNAME","OVERLAY_CLASSNAME","WRAPPER_CLASSNAME","OPENER_ATTRIBUTE","CLOSER_ATTRIBUTE","FORCE_ACTION_ATTRIBUTE","NON_MODAL_HIDDEN_ATTRIBUTE","MODAL","INITIAL_FOCUS","NON_MODALS","HIDDEN_CLASS","modal","INITIAL_BODY_PADDING","TEMPORARY_BODY_PADDING","toggleModal","setTemporaryBodyPadding","originalOpener","clickedElement","openFocusEl","returnFocus","forceUserAction","modalId","targetModal","removeProperty","nonModal","setModalAttributes","baseComponent","modalContentWrapper","modalID","ariaLabelledBy","ariaDescribedBy","setUpModal","originalLocationPlaceHolder","modalAttributes","attributes","attribute","modalComponent","overlayDiv","modalContent","modalWindow","modalTrigger","nodeName","startsWith","RANGE","updateCallout","targetRange","prep","rangeSlider","textPreposition","unit","textUnit","callout","range","change","FORM","CONTEXT","lastButton","getForm","context","toggleSearch","form","hideSearch","search",".js-search-button","encodeURI","outline","TABLE","SORTED","ASCENDING","DESCENDING","SORT_OVERRIDE","SORT_BUTTON_CLASS","SORT_BUTTON","SORTABLE_HEADER","ANNOUNCEMENT_REGION","getCellValue","children","innerText","compareFunction","isAscending","thisRow","nextRow","value1","value2","localeCompare","language","numeric","ignorePunctuation","updateSortLabel","header","headerName","sortedAscending","headerLabel","headerButtonLabel","toggleSort","safeAscending","tbody","allRows","thisHeaderIndex","sort","otherHeader","sortedHeader","caption","liveRegion","sortAnnouncement","sortDir","sortableHeaders","firstSorted","createHeaderButton","buttonEl","TIME_PICKER","FILTER_DATASET","apQueryFilter","hourQueryFilter","minuteQueryFilter","parseTimeString","timeStr","minutes","mins","hours","transformTimePicker","timePickerEl","initialInputEl","minTime","maxTime","step","time","minute","hour24","hour12","ampm","timePicker","TOOLTIP","TOOLTIP_TRIGGER","TOOLTIP_TRIGGER_CLASS","TOOLTIP_CLASS","TOOLTIP_BODY_CLASS","SET_CLASS","VISIBLE_CLASS","ADJUST_WIDTH_CLASS","getTooltipElements","wrapper","showToolTip","tooltipBody","tooltipTrigger","position","setPositionClass","setPos","resetPositionStyles","bottom","right","left","margin","offsetMargin","propertyValue","calculateMarginOffset","marginPosition","tooltipBodyOffset","positionTop","topMargin","leftMargin","offsetWidth","positionBottom","positionRight","offsetLeft","positionLeft","findBestPosition","attempt","positions","hasVisiblePosition","tryPositions","hideToolTip","setUpAttributes","tooltipID","tooltipContent","additionalClasses","classname","tooltip","mouseover focusin","activeTooltips","activeTooltip","tooltipWrapper","setup","validate","VALIDATE_INPUT","CHECKLIST_ITEM","enhanceValidation","checklistItems","validationElement","validationContainer","statusSummaryID","statusSummaryContainer","currentStatus","itemStatus","validator","input[data-validation-element],textarea[data-validation-element]","prefix","banner","footer","password","skipnav","_params","params","evt","createEvent","initCustomEvent","elproto","HTMLElement","HIDDEN","set","embed","parent","svg","use","fragment","createDocumentFragment","viewBox","clone","importNode","g","createElementNS","namespaceURI","childNodes","firstChild","rawopts","opts","inIframe","self","requests","requestAnimationFrame","uses","getElementsByTagName","numberOfSvgUseElementsToBypass","oninterval","url","xhr","attributeName","srcSplit","shift","XMLHttpRequest","open","send","_embeds","onreadystatechange","cachedDocument","readyState","_cachedDocument","implementation","createHTMLDocument","responseText","domain","_cachedTarget","splice","uswdsPresent","uswds","components","svg4everybody","initComponents","on","default","htmlDocument","Behavior","sequence","seq","method","off","callback","delay","timer","args","clearTimeout","apply","additionalKeyBindings","tabEventHandler","Esc","keyMappings","win","docEl","documentElement","rect","innerHeight","clientHeight","clientWidth","platform","maxTouchPoints","MSStream","_entity","_entities","&","<",">","\"","'","/","getEntity","strings","createSafeHTML","_len","values","escaped","__html","info","unwrapSafeHTML","htmlObjects","markupList","outer","inner","visibility","overflow","msOverflowStyle","scrollbarWidth","selection","field","mask","resolveIdRefs","toggleFieldMask","PRESSED","SHOW_ATTR","pressed","showText","hideText","controls","CHECKED_CLASS","checkList","charAt","statusSummary","entries","validatorName","validatorPattern","validatorSelector","validatorCheckbox","checked","statusComplete","validationComplete","statusIncomplete","validationIncomplete","checkboxContent"],"mappings":"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","file":"uswds.min.js","sourcesContent":["(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c=\"function\"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error(\"Cannot find module '\"+i+\"'\");throw a.code=\"MODULE_NOT_FOUND\",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u=\"function\"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()","// element-closest | CC0-1.0 | github.com/jonathantneal/closest\n\n(function (ElementProto) {\n\tif (typeof ElementProto.matches !== 'function') {\n\t\tElementProto.matches = ElementProto.msMatchesSelector || ElementProto.mozMatchesSelector || ElementProto.webkitMatchesSelector || function matches(selector) {\n\t\t\tvar element = this;\n\t\t\tvar elements = (element.document || element.ownerDocument).querySelectorAll(selector);\n\t\t\tvar index = 0;\n\n\t\t\twhile (elements[index] && elements[index] !== element) {\n\t\t\t\t++index;\n\t\t\t}\n\n\t\t\treturn Boolean(elements[index]);\n\t\t};\n\t}\n\n\tif (typeof ElementProto.closest !== 'function') {\n\t\tElementProto.closest = function closest(selector) {\n\t\t\tvar element = this;\n\n\t\t\twhile (element && element.nodeType === 1) {\n\t\t\t\tif (element.matches(selector)) {\n\t\t\t\t\treturn element;\n\t\t\t\t}\n\n\t\t\t\telement = element.parentNode;\n\t\t\t}\n\n\t\t\treturn null;\n\t\t};\n\t}\n})(window.Element.prototype);\n","/* global define, KeyboardEvent, module */\n\n(function () {\n\n var keyboardeventKeyPolyfill = {\n polyfill: polyfill,\n keys: {\n 3: 'Cancel',\n 6: 'Help',\n 8: 'Backspace',\n 9: 'Tab',\n 12: 'Clear',\n 13: 'Enter',\n 16: 'Shift',\n 17: 'Control',\n 18: 'Alt',\n 19: 'Pause',\n 20: 'CapsLock',\n 27: 'Escape',\n 28: 'Convert',\n 29: 'NonConvert',\n 30: 'Accept',\n 31: 'ModeChange',\n 32: ' ',\n 33: 'PageUp',\n 34: 'PageDown',\n 35: 'End',\n 36: 'Home',\n 37: 'ArrowLeft',\n 38: 'ArrowUp',\n 39: 'ArrowRight',\n 40: 'ArrowDown',\n 41: 'Select',\n 42: 'Print',\n 43: 'Execute',\n 44: 'PrintScreen',\n 45: 'Insert',\n 46: 'Delete',\n 48: ['0', ')'],\n 49: ['1', '!'],\n 50: ['2', '@'],\n 51: ['3', '#'],\n 52: ['4', '$'],\n 53: ['5', '%'],\n 54: ['6', '^'],\n 55: ['7', '&'],\n 56: ['8', '*'],\n 57: ['9', '('],\n 91: 'OS',\n 93: 'ContextMenu',\n 144: 'NumLock',\n 145: 'ScrollLock',\n 181: 'VolumeMute',\n 182: 'VolumeDown',\n 183: 'VolumeUp',\n 186: [';', ':'],\n 187: ['=', '+'],\n 188: [',', '<'],\n 189: ['-', '_'],\n 190: ['.', '>'],\n 191: ['/', '?'],\n 192: ['`', '~'],\n 219: ['[', '{'],\n 220: ['\\\\', '|'],\n 221: [']', '}'],\n 222: [\"'\", '\"'],\n 224: 'Meta',\n 225: 'AltGraph',\n 246: 'Attn',\n 247: 'CrSel',\n 248: 'ExSel',\n 249: 'EraseEof',\n 250: 'Play',\n 251: 'ZoomOut'\n }\n };\n\n // Function keys (F1-24).\n var i;\n for (i = 1; i < 25; i++) {\n keyboardeventKeyPolyfill.keys[111 + i] = 'F' + i;\n }\n\n // Printable ASCII characters.\n var letter = '';\n for (i = 65; i < 91; i++) {\n letter = String.fromCharCode(i);\n keyboardeventKeyPolyfill.keys[i] = [letter.toLowerCase(), letter.toUpperCase()];\n }\n\n function polyfill () {\n if (!('KeyboardEvent' in window) ||\n 'key' in KeyboardEvent.prototype) {\n return false;\n }\n\n // Polyfill `key` on `KeyboardEvent`.\n var proto = {\n get: function (x) {\n var key = keyboardeventKeyPolyfill.keys[this.which || this.keyCode];\n\n if (Array.isArray(key)) {\n key = key[+this.shiftKey];\n }\n\n return key;\n }\n };\n Object.defineProperty(KeyboardEvent.prototype, 'key', proto);\n return proto;\n }\n\n if (typeof define === 'function' && define.amd) {\n define('keyboardevent-key-polyfill', keyboardeventKeyPolyfill);\n } else if (typeof exports !== 'undefined' && typeof module !== 'undefined') {\n module.exports = keyboardeventKeyPolyfill;\n } else if (window) {\n window.keyboardeventKeyPolyfill = keyboardeventKeyPolyfill;\n }\n\n})();\n","/*\nobject-assign\n(c) Sindre Sorhus\n@license MIT\n*/\n\n'use strict';\n/* eslint-disable no-unused-vars */\nvar getOwnPropertySymbols = Object.getOwnPropertySymbols;\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nvar propIsEnumerable = Object.prototype.propertyIsEnumerable;\n\nfunction toObject(val) {\n\tif (val === null || val === undefined) {\n\t\tthrow new TypeError('Object.assign cannot be called with null or undefined');\n\t}\n\n\treturn Object(val);\n}\n\nfunction shouldUseNative() {\n\ttry {\n\t\tif (!Object.assign) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Detect buggy property enumeration order in older V8 versions.\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=4118\n\t\tvar test1 = new String('abc'); // eslint-disable-line no-new-wrappers\n\t\ttest1[5] = 'de';\n\t\tif (Object.getOwnPropertyNames(test1)[0] === '5') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test2 = {};\n\t\tfor (var i = 0; i < 10; i++) {\n\t\t\ttest2['_' + String.fromCharCode(i)] = i;\n\t\t}\n\t\tvar order2 = Object.getOwnPropertyNames(test2).map(function (n) {\n\t\t\treturn test2[n];\n\t\t});\n\t\tif (order2.join('') !== '0123456789') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test3 = {};\n\t\t'abcdefghijklmnopqrst'.split('').forEach(function (letter) {\n\t\t\ttest3[letter] = letter;\n\t\t});\n\t\tif (Object.keys(Object.assign({}, test3)).join('') !==\n\t\t\t\t'abcdefghijklmnopqrst') {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t} catch (err) {\n\t\t// We don't expect any of the above to throw, but better to be safe.\n\t\treturn false;\n\t}\n}\n\nmodule.exports = shouldUseNative() ? Object.assign : function (target, source) {\n\tvar from;\n\tvar to = toObject(target);\n\tvar symbols;\n\n\tfor (var s = 1; s < arguments.length; s++) {\n\t\tfrom = Object(arguments[s]);\n\n\t\tfor (var key in from) {\n\t\t\tif (hasOwnProperty.call(from, key)) {\n\t\t\t\tto[key] = from[key];\n\t\t\t}\n\t\t}\n\n\t\tif (getOwnPropertySymbols) {\n\t\t\tsymbols = getOwnPropertySymbols(from);\n\t\t\tfor (var i = 0; i < symbols.length; i++) {\n\t\t\t\tif (propIsEnumerable.call(from, symbols[i])) {\n\t\t\t\t\tto[symbols[i]] = from[symbols[i]];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn to;\n};\n","const assign = require('object-assign');\nconst delegate = require('../delegate');\nconst delegateAll = require('../delegateAll');\n\nconst DELEGATE_PATTERN = /^(.+):delegate\\((.+)\\)$/;\nconst SPACE = ' ';\n\nconst getListeners = function(type, handler) {\n var match = type.match(DELEGATE_PATTERN);\n var selector;\n if (match) {\n type = match[1];\n selector = match[2];\n }\n\n var options;\n if (typeof handler === 'object') {\n options = {\n capture: popKey(handler, 'capture'),\n passive: popKey(handler, 'passive')\n };\n }\n\n var listener = {\n selector: selector,\n delegate: (typeof handler === 'object')\n ? delegateAll(handler)\n : selector\n ? delegate(selector, handler)\n : handler,\n options: options\n };\n\n if (type.indexOf(SPACE) > -1) {\n return type.split(SPACE).map(function(_type) {\n return assign({type: _type}, listener);\n });\n } else {\n listener.type = type;\n return [listener];\n }\n};\n\nvar popKey = function(obj, key) {\n var value = obj[key];\n delete obj[key];\n return value;\n};\n\nmodule.exports = function behavior(events, props) {\n const listeners = Object.keys(events)\n .reduce(function(memo, type) {\n var listeners = getListeners(type, events[type]);\n return memo.concat(listeners);\n }, []);\n\n return assign({\n add: function addBehavior(element) {\n listeners.forEach(function(listener) {\n element.addEventListener(\n listener.type,\n listener.delegate,\n listener.options\n );\n });\n },\n remove: function removeBehavior(element) {\n listeners.forEach(function(listener) {\n element.removeEventListener(\n listener.type,\n listener.delegate,\n listener.options\n );\n });\n }\n }, props);\n};\n","module.exports = function compose(functions) {\n return function(e) {\n return functions.some(function(fn) {\n return fn.call(this, e) === false;\n }, this);\n };\n};\n","// polyfill Element.prototype.closest\nrequire('element-closest');\n\nmodule.exports = function delegate(selector, fn) {\n return function delegation(event) {\n var target = event.target.closest(selector);\n if (target) {\n return fn.call(target, event);\n }\n }\n};\n","const delegate = require('../delegate');\nconst compose = require('../compose');\n\nconst SPLAT = '*';\n\nmodule.exports = function delegateAll(selectors) {\n const keys = Object.keys(selectors)\n\n // XXX optimization: if there is only one handler and it applies to\n // all elements (the \"*\" CSS selector), then just return that\n // handler\n if (keys.length === 1 && keys[0] === SPLAT) {\n return selectors[SPLAT];\n }\n\n const delegates = keys.reduce(function(memo, selector) {\n memo.push(delegate(selector, selectors[selector]));\n return memo;\n }, []);\n return compose(delegates);\n};\n","module.exports = function ignore(element, fn) {\n return function ignorance(e) {\n if (element !== e.target && !element.contains(e.target)) {\n return fn.call(this, e);\n }\n };\n};\n","module.exports = {\n behavior: require('./behavior'),\n delegate: require('./delegate'),\n delegateAll: require('./delegateAll'),\n ignore: require('./ignore'),\n keymap: require('./keymap'),\n};\n","require('keyboardevent-key-polyfill');\n\n// these are the only relevant modifiers supported on all platforms,\n// according to MDN:\n// <https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/getModifierState>\nconst MODIFIERS = {\n 'Alt': 'altKey',\n 'Control': 'ctrlKey',\n 'Ctrl': 'ctrlKey',\n 'Shift': 'shiftKey'\n};\n\nconst MODIFIER_SEPARATOR = '+';\n\nconst getEventKey = function(event, hasModifiers) {\n var key = event.key;\n if (hasModifiers) {\n for (var modifier in MODIFIERS) {\n if (event[MODIFIERS[modifier]] === true) {\n key = [modifier, key].join(MODIFIER_SEPARATOR);\n }\n }\n }\n return key;\n};\n\nmodule.exports = function keymap(keys) {\n const hasModifiers = Object.keys(keys).some(function(key) {\n return key.indexOf(MODIFIER_SEPARATOR) > -1;\n });\n return function(event) {\n var key = getEventKey(event, hasModifiers);\n return [key, key.toLowerCase()]\n .reduce(function(result, _key) {\n if (_key in keys) {\n result = keys[key].call(this, event);\n }\n return result;\n }, undefined);\n };\n};\n\nmodule.exports.MODIFIERS = MODIFIERS;\n","module.exports = function once(listener, options) {\n var wrapped = function wrappedOnce(e) {\n e.currentTarget.removeEventListener(e.type, wrapped, options);\n return listener.call(this, e);\n };\n return wrapped;\n};\n\n","'use strict';\n\nvar RE_TRIM = /(^\\s+)|(\\s+$)/g;\nvar RE_SPLIT = /\\s+/;\n\nvar trim = String.prototype.trim\n ? function(str) { return str.trim(); }\n : function(str) { return str.replace(RE_TRIM, ''); };\n\nvar queryById = function(id) {\n return this.querySelector('[id=\"' + id.replace(/\"/g, '\\\\\"') + '\"]');\n};\n\nmodule.exports = function resolveIds(ids, doc) {\n if (typeof ids !== 'string') {\n throw new Error('Expected a string but got ' + (typeof ids));\n }\n\n if (!doc) {\n doc = window.document;\n }\n\n var getElementById = doc.getElementById\n ? doc.getElementById.bind(doc)\n : queryById.bind(doc);\n\n ids = trim(ids).split(RE_SPLIT);\n\n // XXX we can short-circuit here because trimming and splitting a\n // string of just whitespace produces an array containing a single,\n // empty string\n if (ids.length === 1 && ids[0] === '') {\n return [];\n }\n\n return ids\n .map(function(id) {\n var el = getElementById(id);\n if (!el) {\n throw new Error('no element with id: \"' + id + '\"');\n }\n return el;\n });\n};\n","const behavior = require(\"../../uswds-core/src/js/utils/behavior\");\nconst toggleFormInput = require(\"../../uswds-core/src/js/utils/toggle-form-input\");\n\nconst { CLICK } = require(\"../../uswds-core/src/js/events\");\nconst { prefix: PREFIX } = require(\"../../uswds-core/src/js/config\");\n\nconst LINK = `.${PREFIX}-show-password`;\n\nfunction toggle(event) {\n event.preventDefault();\n toggleFormInput(this);\n}\n\nmodule.exports = behavior({\n [CLICK]: {\n [LINK]: toggle,\n },\n});\n","const select = require(\"../../uswds-core/src/js/utils/select\");\nconst behavior = require(\"../../uswds-core/src/js/utils/behavior\");\nconst toggle = require(\"../../uswds-core/src/js/utils/toggle\");\nconst isElementInViewport = require(\"../../uswds-core/src/js/utils/is-in-viewport\");\nconst { CLICK } = require(\"../../uswds-core/src/js/events\");\nconst { prefix: PREFIX } = require(\"../../uswds-core/src/js/config\");\n\nconst ACCORDION = `.${PREFIX}-accordion, .${PREFIX}-accordion--bordered`;\nconst BANNER_BUTTON = `.${PREFIX}-banner__button`;\nconst BUTTON = `.${PREFIX}-accordion__button[aria-controls]:not(${BANNER_BUTTON})`;\nconst EXPANDED = \"aria-expanded\";\nconst MULTISELECTABLE = \"data-allow-multiple\";\n\n/**\n * Get an Array of button elements belonging directly to the given\n * accordion element.\n * @param {HTMLElement} accordion\n * @return {array<HTMLButtonElement>}\n */\nconst getAccordionButtons = (accordion) => {\n const buttons = select(BUTTON, accordion);\n\n return buttons.filter((button) => button.closest(ACCORDION) === accordion);\n};\n\n/**\n * Toggle a button's \"pressed\" state, optionally providing a target\n * state.\n *\n * @param {HTMLButtonElement} button\n * @param {boolean?} expanded If no state is provided, the current\n * state will be toggled (from false to true, and vice-versa).\n * @return {boolean} the resulting state\n */\nconst toggleButton = (button, expanded) => {\n const accordion = button.closest(ACCORDION);\n let safeExpanded = expanded;\n\n if (!accordion) {\n throw new Error(`${BUTTON} is missing outer ${ACCORDION}`);\n }\n\n safeExpanded = toggle(button, expanded);\n\n // XXX multiselectable is opt-in, to preserve legacy behavior\n const multiselectable = accordion.hasAttribute(MULTISELECTABLE);\n\n if (safeExpanded && !multiselectable) {\n getAccordionButtons(accordion).forEach((other) => {\n if (other !== button) {\n toggle(other, false);\n }\n });\n }\n};\n\n/**\n * @param {HTMLButtonElement} button\n * @return {boolean} true\n */\nconst showButton = (button) => toggleButton(button, true);\n\n/**\n * @param {HTMLButtonElement} button\n * @return {boolean} false\n */\nconst hideButton = (button) => toggleButton(button, false);\n\nconst accordion = behavior(\n {\n [CLICK]: {\n [BUTTON]() {\n toggleButton(this);\n\n if (this.getAttribute(EXPANDED) === \"true\") {\n // We were just expanded, but if another accordion was also just\n // collapsed, we may no longer be in the viewport. This ensures\n // that we are still visible, so the user isn't confused.\n if (!isElementInViewport(this)) this.scrollIntoView();\n }\n },\n },\n },\n {\n init(root) {\n select(BUTTON, root).forEach((button) => {\n const expanded = button.getAttribute(EXPANDED) === \"true\";\n toggleButton(button, expanded);\n });\n },\n ACCORDION,\n BUTTON,\n show: showButton,\n hide: hideButton,\n toggle: toggleButton,\n getButtons: getAccordionButtons,\n },\n);\n\nmodule.exports = accordion;\n","const behavior = require(\"../../uswds-core/src/js/utils/behavior\");\nconst select = require(\"../../uswds-core/src/js/utils/select\");\nconst { CLICK } = require(\"../../uswds-core/src/js/events\");\nconst { prefix: PREFIX } = require(\"../../uswds-core/src/js/config\");\nconst toggle = require(\"../../uswds-core/src/js/utils/toggle\");\n\nconst HEADER = `.${PREFIX}-banner__header`;\nconst EXPANDED_CLASS = `${PREFIX}-banner__header--expanded`;\nconst BANNER_BUTTON = `${HEADER} [aria-controls]`;\n\n/**\n * Toggle Banner display and class.\n * @param {Event} event\n */\nconst toggleBanner = function toggleEl(event) {\n event.preventDefault();\n const trigger = event.target.closest(BANNER_BUTTON);\n\n toggle(trigger);\n this.closest(HEADER).classList.toggle(EXPANDED_CLASS);\n};\n\nmodule.exports = behavior(\n {\n [CLICK]: {\n [BANNER_BUTTON]: toggleBanner,\n },\n },\n {\n init(root) {\n select(BANNER_BUTTON, root).forEach((button) => {\n const expanded = button.getAttribute(EXPANDED_CLASS) === \"true\";\n toggle(button, expanded);\n });\n },\n },\n);\n","const keymap = require(\"receptor/keymap\");\nconst behavior = require(\"../../uswds-core/src/js/utils/behavior\");\n\nconst ANCHOR_BUTTON = `a[class*=\"usa-button\"]`;\n\nconst toggleButton = (event) => {\n event.preventDefault();\n event.target.click();\n};\n\nconst anchorButton = behavior({\n keydown: {\n [ANCHOR_BUTTON]: keymap({\n \" \": toggleButton,\n }),\n },\n});\n\nmodule.exports = anchorButton;\n","const select = require(\"../../uswds-core/src/js/utils/select\");\nconst behavior = require(\"../../uswds-core/src/js/utils/behavior\");\nconst debounce = require(\"../../uswds-core/src/js/utils/debounce\");\nconst { prefix: PREFIX } = require(\"../../uswds-core/src/js/config\");\n\nconst CHARACTER_COUNT_CLASS = `${PREFIX}-character-count`;\nconst CHARACTER_COUNT = `.${CHARACTER_COUNT_CLASS}`;\nconst INPUT = `.${PREFIX}-character-count__field`;\nconst MESSAGE = `.${PREFIX}-character-count__message`;\nconst VALIDATION_MESSAGE = \"The content is too long.\";\nconst MESSAGE_INVALID_CLASS = `${PREFIX}-character-count__status--invalid`;\nconst STATUS_MESSAGE_CLASS = `${CHARACTER_COUNT_CLASS}__status`;\nconst STATUS_MESSAGE_SR_ONLY_CLASS = `${CHARACTER_COUNT_CLASS}__sr-status`;\nconst STATUS_MESSAGE = `.${STATUS_MESSAGE_CLASS}`;\nconst STATUS_MESSAGE_SR_ONLY = `.${STATUS_MESSAGE_SR_ONLY_CLASS}`;\nconst DEFAULT_STATUS_LABEL = `characters allowed`;\n\n/**\n * Returns the root and message element for an character count input\n *\n * @param {HTMLInputElement|HTMLTextAreaElement} inputEl The character count input element\n * @returns {CharacterCountElements} elements The root and message element.\n */\nconst getCharacterCountElements = (inputEl) => {\n const characterCountEl = inputEl.closest(CHARACTER_COUNT);\n\n if (!characterCountEl) {\n throw new Error(`${INPUT} is missing outer ${CHARACTER_COUNT}`);\n }\n\n const messageEl = characterCountEl.querySelector(MESSAGE);\n\n if (!messageEl) {\n throw new Error(`${CHARACTER_COUNT} is missing inner ${MESSAGE}`);\n }\n\n return { characterCountEl, messageEl };\n};\n\n/**\n * Move maxlength attribute to a data attribute on usa-character-count\n *\n * @param {HTMLInputElement|HTMLTextAreaElement} inputEl The character count input element\n */\nconst setDataLength = (inputEl) => {\n const { characterCountEl } = getCharacterCountElements(inputEl);\n\n const maxlength = inputEl.getAttribute(\"maxlength\");\n\n if (!maxlength) return;\n\n inputEl.removeAttribute(\"maxlength\");\n characterCountEl.setAttribute(\"data-maxlength\", maxlength);\n};\n\n/**\n * Create and append status messages for visual and screen readers\n *\n * @param {HTMLDivElement} characterCountEl - Div with `.usa-character-count` class\n * @description Create two status messages for number of characters left;\n * one visual status and another for screen readers\n */\nconst createStatusMessages = (characterCountEl) => {\n const statusMessage = document.createElement(\"div\");\n const srStatusMessage = document.createElement(\"div\");\n const maxLength = characterCountEl.dataset.maxlength;\n const defaultMessage = `${maxLength} ${DEFAULT_STATUS_LABEL}`;\n\n statusMessage.classList.add(`${STATUS_MESSAGE_CLASS}`, \"usa-hint\");\n srStatusMessage.classList.add(\n `${STATUS_MESSAGE_SR_ONLY_CLASS}`,\n \"usa-sr-only\",\n );\n\n statusMessage.setAttribute(\"aria-hidden\", true);\n srStatusMessage.setAttribute(\"aria-live\", \"polite\");\n\n statusMessage.textContent = defaultMessage;\n srStatusMessage.textContent = defaultMessage;\n\n characterCountEl.append(statusMessage, srStatusMessage);\n};\n\n/**\n * Returns message with how many characters are left\n *\n * @param {number} currentLength - The number of characters used\n * @param {number} maxLength - The total number of characters allowed\n * @returns {string} A string description of how many characters are left\n */\nconst getCountMessage = (currentLength, maxLength) => {\n let newMessage = \"\";\n\n if (currentLength === 0) {\n newMessage = `${maxLength} ${DEFAULT_STATUS_LABEL}`;\n } else {\n const difference = Math.abs(maxLength - currentLength);\n const characters = `character${difference === 1 ? \"\" : \"s\"}`;\n const guidance = currentLength > maxLength ? \"over limit\" : \"left\";\n\n newMessage = `${difference} ${characters} ${guidance}`;\n }\n\n return newMessage;\n};\n\n/**\n * Updates the character count status for screen readers after a 1000ms delay.\n *\n * @param {HTMLElement} msgEl - The screen reader status message element\n * @param {string} statusMessage - A string of the current character status\n */\nconst srUpdateStatus = debounce((msgEl, statusMessage) => {\n const srStatusMessage = msgEl;\n srStatusMessage.textContent = statusMessage;\n}, 1000);\n\n/**\n * Update the character count component\n *\n * @description On input, it will update visual status, screenreader\n * status and update input validation (if over character length)\n * @param {HTMLInputElement|HTMLTextAreaElement} inputEl The character count input element\n */\nconst updateCountMessage = (inputEl) => {\n const { characterCountEl } = getCharacterCountElements(inputEl);\n const currentLength = inputEl.value.length;\n const maxLength = parseInt(\n characterCountEl.getAttribute(\"data-maxlength\"),\n 10,\n );\n const statusMessage = characterCountEl.querySelector(STATUS_MESSAGE);\n const srStatusMessage = characterCountEl.querySelector(\n STATUS_MESSAGE_SR_ONLY,\n );\n const currentStatusMessage = getCountMessage(currentLength, maxLength);\n\n if (!maxLength) return;\n\n const isOverLimit = currentLength && currentLength > maxLength;\n\n statusMessage.textContent = currentStatusMessage;\n srUpdateStatus(srStatusMessage, currentStatusMessage);\n\n if (isOverLimit && !inputEl.validationMessage) {\n inputEl.setCustomValidity(VALIDATION_MESSAGE);\n }\n\n if (!isOverLimit && inputEl.validationMessage === VALIDATION_MESSAGE) {\n inputEl.setCustomValidity(\"\");\n }\n\n statusMessage.classList.toggle(MESSAGE_INVALID_CLASS, isOverLimit);\n};\n\n/**\n * Initialize component\n *\n * @description On init this function will create elements and update any\n * attributes so it can tell the user how many characters are left.\n * @param {HTMLInputElement|HTMLTextAreaElement} inputEl the components input\n */\nconst enhanceCharacterCount = (inputEl) => {\n const { characterCountEl, messageEl } = getCharacterCountElements(inputEl);\n\n // Hide hint and remove aria-live for backwards compatibility\n messageEl.classList.add(\"usa-sr-only\");\n messageEl.removeAttribute(\"aria-live\");\n\n setDataLength(inputEl);\n createStatusMessages(characterCountEl);\n};\n\nconst characterCount = behavior(\n {\n input: {\n [INPUT]() {\n updateCountMessage(this);\n },\n },\n },\n {\n init(root) {\n select(INPUT, root).forEach((input) => enhanceCharacterCount(input));\n },\n MESSAGE_INVALID_CLASS,\n VALIDATION_MESSAGE,\n STATUS_MESSAGE_CLASS,\n STATUS_MESSAGE_SR_ONLY_CLASS,\n DEFAULT_STATUS_LABEL,\n createStatusMessages,\n getCountMessage,\n updateCountMessage,\n },\n);\n\nmodule.exports = characterCount;\n","const keymap = require(\"receptor/keymap\");\nconst selectOrMatches = require(\"../../uswds-core/src/js/utils/select-or-matches\");\nconst behavior = require(\"../../uswds-core/src/js/utils/behavior\");\nconst Sanitizer = require(\"../../uswds-core/src/js/utils/sanitizer\");\nconst { prefix: PREFIX } = require(\"../../uswds-core/src/js/config\");\nconst { CLICK } = require(\"../../uswds-core/src/js/events\");\n\nconst COMBO_BOX_CLASS = `${PREFIX}-combo-box`;\nconst COMBO_BOX_PRISTINE_CLASS = `${COMBO_BOX_CLASS}--pristine`;\nconst SELECT_CLASS = `${COMBO_BOX_CLASS}__select`;\nconst INPUT_CLASS = `${COMBO_BOX_CLASS}__input`;\nconst CLEAR_INPUT_BUTTON_CLASS = `${COMBO_BOX_CLASS}__clear-input`;\nconst CLEAR_INPUT_BUTTON_WRAPPER_CLASS = `${CLEAR_INPUT_BUTTON_CLASS}__wrapper`;\nconst INPUT_BUTTON_SEPARATOR_CLASS = `${COMBO_BOX_CLASS}__input-button-separator`;\nconst TOGGLE_LIST_BUTTON_CLASS = `${COMBO_BOX_CLASS}__toggle-list`;\nconst TOGGLE_LIST_BUTTON_WRAPPER_CLASS = `${TOGGLE_LIST_BUTTON_CLASS}__wrapper`;\nconst LIST_CLASS = `${COMBO_BOX_CLASS}__list`;\nconst LIST_OPTION_CLASS = `${COMBO_BOX_CLASS}__list-option`;\nconst LIST_OPTION_FOCUSED_CLASS = `${LIST_OPTION_CLASS}--focused`;\nconst LIST_OPTION_SELECTED_CLASS = `${LIST_OPTION_CLASS}--selected`;\nconst STATUS_CLASS = `${COMBO_BOX_CLASS}__status`;\n\nconst COMBO_BOX = `.${COMBO_BOX_CLASS}`;\nconst SELECT = `.${SELECT_CLASS}`;\nconst INPUT = `.${INPUT_CLASS}`;\nconst CLEAR_INPUT_BUTTON = `.${CLEAR_INPUT_BUTTON_CLASS}`;\nconst TOGGLE_LIST_BUTTON = `.${TOGGLE_LIST_BUTTON_CLASS}`;\nconst LIST = `.${LIST_CLASS}`;\nconst LIST_OPTION = `.${LIST_OPTION_CLASS}`;\nconst LIST_OPTION_FOCUSED = `.${LIST_OPTION_FOCUSED_CLASS}`;\nconst LIST_OPTION_SELECTED = `.${LIST_OPTION_SELECTED_CLASS}`;\nconst STATUS = `.${STATUS_CLASS}`;\n\nconst DEFAULT_FILTER = \".*{{query}}.*\";\n\nconst noop = () => {};\n\n/**\n * set the value of the element and dispatch a change event\n *\n * @param {HTMLInputElement|HTMLSelectElement} el The element to update\n * @param {string} value The new value of the element\n */\nconst changeElementValue = (el, value = \"\") => {\n const elementToChange = el;\n elementToChange.value = value;\n\n const event = new CustomEvent(\"change\", {\n bubbles: true,\n cancelable: true,\n detail: { value },\n });\n elementToChange.dispatchEvent(event);\n};\n\n/**\n * The elements within the combo box.\n * @typedef {Object} ComboBoxContext\n * @property {HTMLElement} comboBoxEl\n * @property {HTMLSelectElement} selectEl\n * @property {HTMLInputElement} inputEl\n * @property {HTMLUListElement} listEl\n * @property {HTMLDivElement} statusEl\n * @property {HTMLLIElement} focusedOptionEl\n * @property {HTMLLIElement} selectedOptionEl\n * @property {HTMLButtonElement} toggleListBtnEl\n * @property {HTMLButtonElement} clearInputBtnEl\n * @property {boolean} isPristine\n * @property {boolean} disableFiltering\n */\n\n/**\n * Get an object of elements belonging directly to the given\n * combo box component.\n *\n * @param {HTMLElement} el the element within the combo box\n * @returns {ComboBoxContext} elements\n */\nconst getComboBoxContext = (el) => {\n const comboBoxEl = el.closest(COMBO_BOX);\n\n if (!comboBoxEl) {\n throw new Error(`Element is missing outer ${COMBO_BOX}`);\n }\n\n const selectEl = comboBoxEl.querySelector(SELECT);\n const inputEl = comboBoxEl.querySelector(INPUT);\n const listEl = comboBoxEl.querySelector(LIST);\n const statusEl = comboBoxEl.querySelector(STATUS);\n const focusedOptionEl = comboBoxEl.querySelector(LIST_OPTION_FOCUSED);\n const selectedOptionEl = comboBoxEl.querySelector(LIST_OPTION_SELECTED);\n const toggleListBtnEl = comboBoxEl.querySelector(TOGGLE_LIST_BUTTON);\n const clearInputBtnEl = comboBoxEl.querySelector(CLEAR_INPUT_BUTTON);\n\n const isPristine = comboBoxEl.classList.contains(COMBO_BOX_PRISTINE_CLASS);\n const disableFiltering = comboBoxEl.dataset.disableFiltering === \"true\";\n\n return {\n comboBoxEl,\n selectEl,\n inputEl,\n listEl,\n statusEl,\n focusedOptionEl,\n selectedOptionEl,\n toggleListBtnEl,\n clearInputBtnEl,\n isPristine,\n disableFiltering,\n };\n};\n\n/**\n * Disable the combo-box component\n *\n * @param {HTMLInputElement} el An element within the combo box component\n */\nconst disable = (el) => {\n const { inputEl, toggleListBtnEl, clearInputBtnEl } = getComboBoxContext(el);\n\n clearInputBtnEl.hidden = true;\n clearInputBtnEl.disabled = true;\n toggleListBtnEl.disabled = true;\n inputEl.disabled = true;\n};\n\n/**\n * Check for aria-disabled on initialization\n *\n * @param {HTMLInputElement} el An element within the combo box component\n */\nconst ariaDisable = (el) => {\n const { inputEl, toggleListBtnEl, clearInputBtnEl } = getComboBoxContext(el);\n\n clearInputBtnEl.hidden = true;\n clearInputBtnEl.setAttribute(\"aria-disabled\", true);\n toggleListBtnEl.setAttribute(\"aria-disabled\", true);\n inputEl.setAttribute(\"aria-disabled\", true);\n};\n\n/**\n * Enable the combo-box component\n *\n * @param {HTMLInputElement} el An element within the combo box component\n */\nconst enable = (el) => {\n const { inputEl, toggleListBtnEl, clearInputBtnEl } = getComboBoxContext(el);\n\n clearInputBtnEl.hidden = false;\n clearInputBtnEl.disabled = false;\n toggleListBtnEl.disabled = false;\n inputEl.disabled = false;\n};\n\n/**\n * Enhance a select element into a combo box component.\n *\n * @param {HTMLElement} _comboBoxEl The initial element of the combo box component\n */\nconst enhanceComboBox = (_comboBoxEl) => {\n const comboBoxEl = _comboBoxEl.closest(COMBO_BOX);\n\n if (comboBoxEl.dataset.enhanced) return;\n\n const selectEl = comboBoxEl.querySelector(\"select\");\n\n if (!selectEl) {\n throw new Error(`${COMBO_BOX} is missing inner select`);\n }\n\n const selectId = selectEl.id;\n const selectLabel = document.querySelector(`label[for=\"${selectId}\"]`);\n const listId = `${selectId}--list`;\n const listIdLabel = `${selectId}-label`;\n const assistiveHintID = `${selectId}--assistiveHint`;\n const additionalAttributes = [];\n const { defaultValue } = comboBoxEl.dataset;\n const { placeholder } = comboBoxEl.dataset;\n let selectedOption;\n\n if (placeholder) {\n additionalAttributes.push({ placeholder });\n }\n\n if (defaultValue) {\n for (let i = 0, len = selectEl.options.length; i < len; i += 1) {\n const optionEl = selectEl.options[i];\n\n if (optionEl.value === defaultValue) {\n selectedOption = optionEl;\n break;\n }\n }\n }\n\n /**\n * Throw error if combobox is missing a label or label is missing\n * `for` attribute. Otherwise, set the ID to match the <ul> aria-labelledby\n */\n if (!selectLabel || !selectLabel.matches(`label[for=\"${selectId}\"]`)) {\n throw new Error(\n `${COMBO_BOX} for ${selectId} is either missing a label or a \"for\" attribute`,\n );\n } else {\n selectLabel.setAttribute(\"id\", listIdLabel);\n }\n\n selectLabel.setAttribute(\"id\", listIdLabel);\n selectEl.setAttribute(\"aria-hidden\", \"true\");\n selectEl.setAttribute(\"tabindex\", \"-1\");\n selectEl.classList.add(\"usa-sr-only\", SELECT_CLASS);\n selectEl.id = \"\";\n selectEl.value = \"\";\n\n [\"required\", \"aria-label\", \"aria-labelledby\"].forEach((name) => {\n if (selectEl.hasAttribute(name)) {\n const value = selectEl.getAttribute(name);\n additionalAttributes.push({ [name]: value });\n selectEl.removeAttribute(name);\n }\n });\n\n // sanitize doesn't like functions in template literals\n const input = document.createElement(\"input\");\n input.setAttribute(\"id\", selectId);\n input.setAttribute(\"aria-owns\", listId);\n input.setAttribute(\"aria-controls\", listId);\n input.setAttribute(\"aria-autocomplete\", \"list\");\n input.setAttribute(\"aria-describedby\", assistiveHintID);\n input.setAttribute(\"aria-expanded\", \"false\");\n input.setAttribute(\"autocapitalize\", \"off\");\n input.setAttribute(\"autocomplete\", \"off\");\n input.setAttribute(\"class\", INPUT_CLASS);\n input.setAttribute(\"type\", \"text\");\n input.setAttribute(\"role\", \"combobox\");\n additionalAttributes.forEach((attr) =>\n Object.keys(attr).forEach((key) => {\n const value = Sanitizer.escapeHTML`${attr[key]}`;\n input.setAttribute(key, value);\n }),\n );\n\n comboBoxEl.insertAdjacentElement(\"beforeend\", input);\n\n comboBoxEl.insertAdjacentHTML(\n \"beforeend\",\n Sanitizer.escapeHTML`\n <span class=\"${CLEAR_INPUT_BUTTON_WRAPPER_CLASS}\" tabindex=\"-1\">\n <button type=\"button\" class=\"${CLEAR_INPUT_BUTTON_CLASS}\" aria-label=\"Clear the select contents\"> </button>\n </span>\n <span class=\"${INPUT_BUTTON_SEPARATOR_CLASS}\"> </span>\n <span class=\"${TOGGLE_LIST_BUTTON_WRAPPER_CLASS}\" tabindex=\"-1\">\n <button type=\"button\" tabindex=\"-1\" class=\"${TOGGLE_LIST_BUTTON_CLASS}\" aria-label=\"Toggle the dropdown list\"> </button>\n </span>\n <ul\n tabindex=\"-1\"\n id=\"${listId}\"\n class=\"${LIST_CLASS}\"\n role=\"listbox\"\n aria-labelledby=\"${listIdLabel}\"\n hidden>\n </ul>\n <div class=\"${STATUS_CLASS} usa-sr-only\" role=\"status\"></div>\n <span id=\"${assistiveHintID}\" class=\"usa-sr-only\">\n When autocomplete results are available use up and down arrows to review and enter to select.\n Touch device users, explore by touch or with swipe gestures.\n </span>`,\n );\n\n if (selectedOption) {\n const { inputEl } = getComboBoxContext(comboBoxEl);\n changeElementValue(selectEl, selectedOption.value);\n changeElementValue(inputEl, selectedOption.text);\n comboBoxEl.classList.add(COMBO_BOX_PRISTINE_CLASS);\n }\n\n if (selectEl.disabled) {\n disable(comboBoxEl);\n selectEl.disabled = false;\n }\n\n if (selectEl.hasAttribute(\"aria-disabled\")) {\n ariaDisable(comboBoxEl);\n selectEl.removeAttribute(\"aria-disabled\");\n }\n\n comboBoxEl.dataset.enhanced = \"true\";\n};\n\n/**\n * Manage the focused element within the list options when\n * navigating via keyboard.\n *\n * @param {HTMLElement} el An anchor element within the combo box component\n * @param {HTMLElement} nextEl An element within the combo box component\n * @param {Object} options options\n * @param {boolean} options.skipFocus skip focus of highlighted item\n * @param {boolean} options.preventScroll should skip procedure to scroll to element\n */\nconst highlightOption = (el, nextEl, { skipFocus, preventScroll } = {}) => {\n const { inputEl, listEl, focusedOptionEl } = getComboBoxContext(el);\n\n if (focusedOptionEl) {\n focusedOptionEl.classList.remove(LIST_OPTION_FOCUSED_CLASS);\n focusedOptionEl.setAttribute(\"tabIndex\", \"-1\");\n }\n\n if (nextEl) {\n inputEl.setAttribute(\"aria-activedescendant\", nextEl.id);\n nextEl.setAttribute(\"tabIndex\", \"0\");\n nextEl.classList.add(LIST_OPTION_FOCUSED_CLASS);\n\n if (!preventScroll) {\n const optionBottom = nextEl.offsetTop + nextEl.offsetHeight;\n const currentBottom = listEl.scrollTop + listEl.offsetHeight;\n\n if (optionBottom > currentBottom) {\n listEl.scrollTop = optionBottom - listEl.offsetHeight;\n }\n\n if (nextEl.offsetTop < listEl.scrollTop) {\n listEl.scrollTop = nextEl.offsetTop;\n }\n }\n\n if (!skipFocus) {\n nextEl.focus({ preventScroll });\n }\n } else {\n inputEl.setAttribute(\"aria-activedescendant\", \"\");\n inputEl.focus();\n }\n};\n\n/**\n * Generate a dynamic regular expression based off of a replaceable and possibly filtered value.\n *\n * @param {string} el An element within the combo box component\n * @param {string} query The value to use in the regular expression\n * @param {object} extras An object of regular expressions to replace and filter the query\n */\nconst generateDynamicRegExp = (filter, query = \"\", extras = {}) => {\n const escapeRegExp = (text) =>\n text.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, \"\\\\$&\");\n\n let find = filter.replace(/{{(.*?)}}/g, (m, $1) => {\n const key = $1.trim();\n const queryFilter = extras[key];\n if (key !== \"query\" && queryFilter) {\n const matcher = new RegExp(queryFilter, \"i\");\n const matches = query.match(matcher);\n\n if (matches) {\n return escapeRegExp(matches[1]);\n }\n\n return \"\";\n }\n return escapeRegExp(query);\n });\n\n find = `^(?:${find})$`;\n\n return new RegExp(find, \"i\");\n};\n\n/**\n * Display the option list of a combo box component.\n *\n * @param {HTMLElement} el An element within the combo box component\n */\nconst displayList = (el) => {\n const {\n comboBoxEl,\n selectEl,\n inputEl,\n listEl,\n statusEl,\n isPristine,\n disableFiltering,\n } = getComboBoxContext(el);\n let selectedItemId;\n let firstFoundId;\n\n const listOptionBaseId = `${listEl.id}--option-`;\n\n const inputValue = (inputEl.value || \"\").toLowerCase();\n const filter = comboBoxEl.dataset.filter || DEFAULT_FILTER;\n const regex = generateDynamicRegExp(filter, inputValue, comboBoxEl.dataset);\n\n const options = [];\n for (let i = 0, len = selectEl.options.length; i < len; i += 1) {\n const optionEl = selectEl.options[i];\n const optionId = `${listOptionBaseId}${options.length}`;\n\n if (\n optionEl.value &&\n (disableFiltering ||\n isPristine ||\n !inputValue ||\n regex.test(optionEl.text))\n ) {\n if (selectEl.value && optionEl.value === selectEl.value) {\n selectedItemId = optionId;\n }\n\n if (disableFiltering && !firstFoundId && regex.test(optionEl.text)) {\n firstFoundId = optionId;\n }\n options.push(optionEl);\n }\n }\n\n const numOptions = options.length;\n const optionHtml = options.map((option, index) => {\n const optionId = `${listOptionBaseId}${index}`;\n const classes = [LIST_OPTION_CLASS];\n let tabindex = \"-1\";\n let ariaSelected = \"false\";\n\n if (optionId === selectedItemId) {\n classes.push(LIST_OPTION_SELECTED_CLASS, LIST_OPTION_FOCUSED_CLASS);\n tabindex = \"0\";\n ariaSelected = \"true\";\n }\n\n if (!selectedItemId && index === 0) {\n classes.push(LIST_OPTION_FOCUSED_CLASS);\n tabindex = \"0\";\n }\n\n const li = document.createElement(\"li\");\n\n li.setAttribute(\"aria-setsize\", options.length);\n li.setAttribute(\"aria-posinset\", index + 1);\n li.setAttribute(\"aria-selected\", ariaSelected);\n li.setAttribute(\"id\", optionId);\n li.setAttribute(\"class\", classes.join(\" \"));\n li.setAttribute(\"tabindex\", tabindex);\n li.setAttribute(\"role\", \"option\");\n li.setAttribute(\"data-value\", option.value);\n li.textContent = option.text;\n\n return li;\n });\n\n const noResults = document.createElement(\"li\");\n noResults.setAttribute(\"class\", `${LIST_OPTION_CLASS}--no-results`);\n noResults.textContent = \"No results found\";\n\n listEl.hidden = false;\n\n if (numOptions) {\n listEl.innerHTML = \"\";\n optionHtml.forEach((item) =>\n listEl.insertAdjacentElement(\"beforeend\", item),\n );\n } else {\n listEl.innerHTML = \"\";\n listEl.insertAdjacentElement(\"beforeend\", noResults);\n }\n\n inputEl.setAttribute(\"aria-expanded\", \"true\");\n\n statusEl.textContent = numOptions\n ? `${numOptions} result${numOptions > 1 ? \"s\" : \"\"} available.`\n : \"No results.\";\n\n let itemToFocus;\n\n if (isPristine && selectedItemId) {\n itemToFocus = listEl.querySelector(`#${selectedItemId}`);\n } else if (disableFiltering && firstFoundId) {\n itemToFocus = listEl.querySelector(`#${firstFoundId}`);\n }\n\n if (itemToFocus) {\n highlightOption(listEl, itemToFocus, {\n skipFocus: true,\n });\n }\n};\n\n/**\n * Hide the option list of a combo box component.\n *\n * @param {HTMLElement} el An element within the combo box component\n */\nconst hideList = (el) => {\n const { inputEl, listEl, statusEl, focusedOptionEl } = getComboBoxContext(el);\n\n statusEl.innerHTML = \"\";\n\n inputEl.setAttribute(\"aria-expanded\", \"false\");\n inputEl.setAttribute(\"aria-activedescendant\", \"\");\n\n if (focusedOptionEl) {\n focusedOptionEl.classList.remove(LIST_OPTION_FOCUSED_CLASS);\n }\n\n listEl.scrollTop = 0;\n listEl.hidden = true;\n};\n\n/**\n * Select an option list of the combo box component.\n *\n * @param {HTMLElement} listOptionEl The list option being selected\n */\nconst selectItem = (listOptionEl) => {\n const { comboBoxEl, selectEl, inputEl } = getComboBoxContext(listOptionEl);\n\n changeElementValue(selectEl, listOptionEl.dataset.value);\n changeElementValue(inputEl, listOptionEl.textContent);\n comboBoxEl.classList.add(COMBO_BOX_PRISTINE_CLASS);\n hideList(comboBoxEl);\n inputEl.focus();\n};\n\n/**\n * Clear the input of the combo box\n *\n * @param {HTMLButtonElement} clearButtonEl The clear input button\n */\nconst clearInput = (clearButtonEl) => {\n const { comboBoxEl, listEl, selectEl, inputEl } =\n getComboBoxContext(clearButtonEl);\n const listShown = !listEl.hidden;\n\n if (selectEl.value) changeElementValue(selectEl);\n if (inputEl.value) changeElementValue(inputEl);\n comboBoxEl.classList.remove(COMBO_BOX_PRISTINE_CLASS);\n\n if (listShown) displayList(comboBoxEl);\n inputEl.focus();\n};\n\n/**\n * Reset the select based off of currently set select value\n *\n * @param {HTMLElement} el An element within the combo box component\n */\nconst resetSelection = (el) => {\n const { comboBoxEl, selectEl, inputEl } = getComboBoxContext(el);\n\n const selectValue = selectEl.value;\n const inputValue = (inputEl.value || \"\").toLowerCase();\n\n if (selectValue) {\n for (let i = 0, len = selectEl.options.length; i < len; i += 1) {\n const optionEl = selectEl.options[i];\n if (optionEl.value === selectValue) {\n if (inputValue !== optionEl.text) {\n changeElementValue(inputEl, optionEl.text);\n }\n comboBoxEl.classList.add(COMBO_BOX_PRISTINE_CLASS);\n return;\n }\n }\n }\n\n if (inputValue) {\n changeElementValue(inputEl);\n }\n};\n\n/**\n * Select an option list of the combo box component based off of\n * having a current focused list option or\n * having test that completely matches a list option.\n * Otherwise it clears the input and select.\n *\n * @param {HTMLElement} el An element within the combo box component\n */\nconst completeSelection = (el) => {\n const { comboBoxEl, selectEl, inputEl, statusEl } = getComboBoxContext(el);\n\n statusEl.textContent = \"\";\n\n const inputValue = (inputEl.value || \"\").toLowerCase();\n\n if (inputValue) {\n for (let i = 0, len = selectEl.options.length; i < len; i += 1) {\n const optionEl = selectEl.options[i];\n if (optionEl.text.toLowerCase() === inputValue) {\n changeElementValue(selectEl, optionEl.value);\n changeElementValue(inputEl, optionEl.text);\n comboBoxEl.classList.add(COMBO_BOX_PRISTINE_CLASS);\n return;\n }\n }\n }\n\n resetSelection(comboBoxEl);\n};\n\n/**\n * Handle the escape event within the combo box component.\n *\n * @param {KeyboardEvent} event An event within the combo box component\n */\nconst handleEscape = (event) => {\n const { comboBoxEl, inputEl } = getComboBoxContext(event.target);\n\n hideList(comboBoxEl);\n resetSelection(comboBoxEl);\n inputEl.focus();\n};\n\n/**\n * Handle the down event within the combo box component.\n *\n * @param {KeyboardEvent} event An event within the combo box component\n */\nconst handleDownFromInput = (event) => {\n const { comboBoxEl, listEl } = getComboBoxContext(event.target);\n\n if (listEl.hidden) {\n displayList(comboBoxEl);\n }\n\n const nextOptionEl =\n listEl.querySelector(LIST_OPTION_FOCUSED) ||\n listEl.querySelector(LIST_OPTION);\n\n if (nextOptionEl) {\n highlightOption(comboBoxEl, nextOptionEl);\n }\n\n event.preventDefault();\n};\n\n/**\n * Handle the enter event from an input element within the combo box component.\n *\n * @param {KeyboardEvent} event An event within the combo box component\n */\nconst handleEnterFromInput = (event) => {\n const { comboBoxEl, listEl } = getComboBoxContext(event.target);\n const listShown = !listEl.hidden;\n\n completeSelection(comboBoxEl);\n\n if (listShown) {\n hideList(comboBoxEl);\n }\n\n event.preventDefault();\n};\n\n/**\n * Handle the down event within the combo box component.\n *\n * @param {KeyboardEvent} event An event within the combo box component\n */\nconst handleDownFromListOption = (event) => {\n const focusedOptionEl = event.target;\n const nextOptionEl = focusedOptionEl.nextSibling;\n\n if (nextOptionEl) {\n highlightOption(focusedOptionEl, nextOptionEl);\n }\n\n event.preventDefault();\n};\n\n/**\n * Handle the space event from an list option element within the combo box component.\n *\n * @param {KeyboardEvent} event An event within the combo box component\n */\nconst handleSpaceFromListOption = (event) => {\n selectItem(event.target);\n event.preventDefault();\n};\n\n/**\n * Handle the enter event from list option within the combo box component.\n *\n * @param {KeyboardEvent} event An event within the combo box component\n */\nconst handleEnterFromListOption = (event) => {\n selectItem(event.target);\n event.preventDefault();\n};\n\n/**\n * Handle the up event from list option within the combo box component.\n *\n * @param {KeyboardEvent} event An event within the combo box component\n */\nconst handleUpFromListOption = (event) => {\n const { comboBoxEl, listEl, focusedOptionEl } = getComboBoxContext(\n event.target,\n );\n const nextOptionEl = focusedOptionEl && focusedOptionEl.previousSibling;\n const listShown = !listEl.hidden;\n\n highlightOption(comboBoxEl, nextOptionEl);\n\n if (listShown) {\n event.preventDefault();\n }\n\n if (!nextOptionEl) {\n hideList(comboBoxEl);\n }\n};\n\n/**\n * Select list option on the mouseover event.\n *\n * @param {MouseEvent} event The mouseover event\n * @param {HTMLLIElement} listOptionEl An element within the combo box component\n */\nconst handleMouseover = (listOptionEl) => {\n const isCurrentlyFocused = listOptionEl.classList.contains(\n LIST_OPTION_FOCUSED_CLASS,\n );\n\n if (isCurrentlyFocused) return;\n\n highlightOption(listOptionEl, listOptionEl, {\n preventScroll: true,\n });\n};\n\n/**\n * Toggle the list when the button is clicked\n *\n * @param {HTMLElement} el An element within the combo box component\n */\nconst toggleList = (el) => {\n const { comboBoxEl, listEl, inputEl } = getComboBoxContext(el);\n\n if (listEl.hidden) {\n displayList(comboBoxEl);\n } else {\n hideList(comboBoxEl);\n }\n\n inputEl.focus();\n};\n\n/**\n * Handle click from input\n *\n * @param {HTMLInputElement} el An element within the combo box component\n */\nconst handleClickFromInput = (el) => {\n const { comboBoxEl, listEl } = getComboBoxContext(el);\n\n if (listEl.hidden) {\n displayList(comboBoxEl);\n }\n};\n\nconst comboBox = behavior(\n {\n [CLICK]: {\n [INPUT]() {\n if (this.disabled) return;\n handleClickFromInput(this);\n },\n [TOGGLE_LIST_BUTTON]() {\n if (this.disabled) return;\n toggleList(this);\n },\n [LIST_OPTION]() {\n if (this.disabled) return;\n selectItem(this);\n },\n [CLEAR_INPUT_BUTTON]() {\n if (this.disabled) return;\n clearInput(this);\n },\n },\n focusout: {\n [COMBO_BOX](event) {\n if (!this.contains(event.relatedTarget)) {\n resetSelection(this);\n hideList(this);\n }\n },\n },\n keydown: {\n [COMBO_BOX]: keymap({\n Escape: handleEscape,\n }),\n [INPUT]: keymap({\n Enter: handleEnterFromInput,\n ArrowDown: handleDownFromInput,\n Down: handleDownFromInput,\n }),\n [LIST_OPTION]: keymap({\n ArrowUp: handleUpFromListOption,\n Up: handleUpFromListOption,\n ArrowDown: handleDownFromListOption,\n Down: handleDownFromListOption,\n Enter: handleEnterFromListOption,\n \" \": handleSpaceFromListOption,\n \"Shift+Tab\": noop,\n }),\n },\n input: {\n [INPUT]() {\n const comboBoxEl = this.closest(COMBO_BOX);\n comboBoxEl.classList.remove(COMBO_BOX_PRISTINE_CLASS);\n displayList(this);\n },\n },\n mouseover: {\n [LIST_OPTION]() {\n handleMouseover(this);\n },\n },\n },\n {\n init(root) {\n selectOrMatches(COMBO_BOX, root).forEach((comboBoxEl) => {\n enhanceComboBox(comboBoxEl);\n });\n },\n getComboBoxContext,\n enhanceComboBox,\n generateDynamicRegExp,\n disable,\n enable,\n displayList,\n hideList,\n COMBO_BOX_CLASS,\n },\n);\n\nmodule.exports = comboBox;\n","const keymap = require(\"receptor/keymap\");\nconst behavior = require(\"../../uswds-core/src/js/utils/behavior\");\nconst select = require(\"../../uswds-core/src/js/utils/select\");\nconst selectOrMatches = require(\"../../uswds-core/src/js/utils/select-or-matches\");\nconst { prefix: PREFIX } = require(\"../../uswds-core/src/js/config\");\nconst { CLICK } = require(\"../../uswds-core/src/js/events\");\nconst activeElement = require(\"../../uswds-core/src/js/utils/active-element\");\nconst isIosDevice = require(\"../../uswds-core/src/js/utils/is-ios-device\");\nconst Sanitizer = require(\"../../uswds-core/src/js/utils/sanitizer\");\n\nconst DATE_PICKER_CLASS = `${PREFIX}-date-picker`;\nconst DATE_PICKER_WRAPPER_CLASS = `${DATE_PICKER_CLASS}__wrapper`;\nconst DATE_PICKER_INITIALIZED_CLASS = `${DATE_PICKER_CLASS}--initialized`;\nconst DATE_PICKER_ACTIVE_CLASS = `${DATE_PICKER_CLASS}--active`;\nconst DATE_PICKER_INTERNAL_INPUT_CLASS = `${DATE_PICKER_CLASS}__internal-input`;\nconst DATE_PICKER_EXTERNAL_INPUT_CLASS = `${DATE_PICKER_CLASS}__external-input`;\nconst DATE_PICKER_BUTTON_CLASS = `${DATE_PICKER_CLASS}__button`;\nconst DATE_PICKER_CALENDAR_CLASS = `${DATE_PICKER_CLASS}__calendar`;\nconst DATE_PICKER_STATUS_CLASS = `${DATE_PICKER_CLASS}__status`;\nconst CALENDAR_DATE_CLASS = `${DATE_PICKER_CALENDAR_CLASS}__date`;\n\nconst CALENDAR_DATE_FOCUSED_CLASS = `${CALENDAR_DATE_CLASS}--focused`;\nconst CALENDAR_DATE_SELECTED_CLASS = `${CALENDAR_DATE_CLASS}--selected`;\nconst CALENDAR_DATE_PREVIOUS_MONTH_CLASS = `${CALENDAR_DATE_CLASS}--previous-month`;\nconst CALENDAR_DATE_CURRENT_MONTH_CLASS = `${CALENDAR_DATE_CLASS}--current-month`;\nconst CALENDAR_DATE_NEXT_MONTH_CLASS = `${CALENDAR_DATE_CLASS}--next-month`;\nconst CALENDAR_DATE_RANGE_DATE_CLASS = `${CALENDAR_DATE_CLASS}--range-date`;\nconst CALENDAR_DATE_TODAY_CLASS = `${CALENDAR_DATE_CLASS}--today`;\nconst CALENDAR_DATE_RANGE_DATE_START_CLASS = `${CALENDAR_DATE_CLASS}--range-date-start`;\nconst CALENDAR_DATE_RANGE_DATE_END_CLASS = `${CALENDAR_DATE_CLASS}--range-date-end`;\nconst CALENDAR_DATE_WITHIN_RANGE_CLASS = `${CALENDAR_DATE_CLASS}--within-range`;\nconst CALENDAR_PREVIOUS_YEAR_CLASS = `${DATE_PICKER_CALENDAR_CLASS}__previous-year`;\nconst CALENDAR_PREVIOUS_MONTH_CLASS = `${DATE_PICKER_CALENDAR_CLASS}__previous-month`;\nconst CALENDAR_NEXT_YEAR_CLASS = `${DATE_PICKER_CALENDAR_CLASS}__next-year`;\nconst CALENDAR_NEXT_MONTH_CLASS = `${DATE_PICKER_CALENDAR_CLASS}__next-month`;\nconst CALENDAR_MONTH_SELECTION_CLASS = `${DATE_PICKER_CALENDAR_CLASS}__month-selection`;\nconst CALENDAR_YEAR_SELECTION_CLASS = `${DATE_PICKER_CALENDAR_CLASS}__year-selection`;\nconst CALENDAR_MONTH_CLASS = `${DATE_PICKER_CALENDAR_CLASS}__month`;\nconst CALENDAR_MONTH_FOCUSED_CLASS = `${CALENDAR_MONTH_CLASS}--focused`;\nconst CALENDAR_MONTH_SELECTED_CLASS = `${CALENDAR_MONTH_CLASS}--selected`;\nconst CALENDAR_YEAR_CLASS = `${DATE_PICKER_CALENDAR_CLASS}__year`;\nconst CALENDAR_YEAR_FOCUSED_CLASS = `${CALENDAR_YEAR_CLASS}--focused`;\nconst CALENDAR_YEAR_SELECTED_CLASS = `${CALENDAR_YEAR_CLASS}--selected`;\nconst CALENDAR_PREVIOUS_YEAR_CHUNK_CLASS = `${DATE_PICKER_CALENDAR_CLASS}__previous-year-chunk`;\nconst CALENDAR_NEXT_YEAR_CHUNK_CLASS = `${DATE_PICKER_CALENDAR_CLASS}__next-year-chunk`;\nconst CALENDAR_DATE_PICKER_CLASS = `${DATE_PICKER_CALENDAR_CLASS}__date-picker`;\nconst CALENDAR_MONTH_PICKER_CLASS = `${DATE_PICKER_CALENDAR_CLASS}__month-picker`;\nconst CALENDAR_YEAR_PICKER_CLASS = `${DATE_PICKER_CALENDAR_CLASS}__year-picker`;\nconst CALENDAR_TABLE_CLASS = `${DATE_PICKER_CALENDAR_CLASS}__table`;\nconst CALENDAR_ROW_CLASS = `${DATE_PICKER_CALENDAR_CLASS}__row`;\nconst CALENDAR_CELL_CLASS = `${DATE_PICKER_CALENDAR_CLASS}__cell`;\nconst CALENDAR_CELL_CENTER_ITEMS_CLASS = `${CALENDAR_CELL_CLASS}--center-items`;\nconst CALENDAR_MONTH_LABEL_CLASS = `${DATE_PICKER_CALENDAR_CLASS}__month-label`;\nconst CALENDAR_DAY_OF_WEEK_CLASS = `${DATE_PICKER_CALENDAR_CLASS}__day-of-week`;\n\nconst DATE_PICKER = `.${DATE_PICKER_CLASS}`;\nconst DATE_PICKER_BUTTON = `.${DATE_PICKER_BUTTON_CLASS}`;\nconst DATE_PICKER_INTERNAL_INPUT = `.${DATE_PICKER_INTERNAL_INPUT_CLASS}`;\nconst DATE_PICKER_EXTERNAL_INPUT = `.${DATE_PICKER_EXTERNAL_INPUT_CLASS}`;\nconst DATE_PICKER_CALENDAR = `.${DATE_PICKER_CALENDAR_CLASS}`;\nconst DATE_PICKER_STATUS = `.${DATE_PICKER_STATUS_CLASS}`;\nconst CALENDAR_DATE = `.${CALENDAR_DATE_CLASS}`;\nconst CALENDAR_DATE_FOCUSED = `.${CALENDAR_DATE_FOCUSED_CLASS}`;\nconst CALENDAR_DATE_CURRENT_MONTH = `.${CALENDAR_DATE_CURRENT_MONTH_CLASS}`;\nconst CALENDAR_PREVIOUS_YEAR = `.${CALENDAR_PREVIOUS_YEAR_CLASS}`;\nconst CALENDAR_PREVIOUS_MONTH = `.${CALENDAR_PREVIOUS_MONTH_CLASS}`;\nconst CALENDAR_NEXT_YEAR = `.${CALENDAR_NEXT_YEAR_CLASS}`;\nconst CALENDAR_NEXT_MONTH = `.${CALENDAR_NEXT_MONTH_CLASS}`;\nconst CALENDAR_YEAR_SELECTION = `.${CALENDAR_YEAR_SELECTION_CLASS}`;\nconst CALENDAR_MONTH_SELECTION = `.${CALENDAR_MONTH_SELECTION_CLASS}`;\nconst CALENDAR_MONTH = `.${CALENDAR_MONTH_CLASS}`;\nconst CALENDAR_YEAR = `.${CALENDAR_YEAR_CLASS}`;\nconst CALENDAR_PREVIOUS_YEAR_CHUNK = `.${CALENDAR_PREVIOUS_YEAR_CHUNK_CLASS}`;\nconst CALENDAR_NEXT_YEAR_CHUNK = `.${CALENDAR_NEXT_YEAR_CHUNK_CLASS}`;\nconst CALENDAR_DATE_PICKER = `.${CALENDAR_DATE_PICKER_CLASS}`;\nconst CALENDAR_MONTH_PICKER = `.${CALENDAR_MONTH_PICKER_CLASS}`;\nconst CALENDAR_YEAR_PICKER = `.${CALENDAR_YEAR_PICKER_CLASS}`;\nconst CALENDAR_MONTH_FOCUSED = `.${CALENDAR_MONTH_FOCUSED_CLASS}`;\nconst CALENDAR_YEAR_FOCUSED = `.${CALENDAR_YEAR_FOCUSED_CLASS}`;\n\nconst VALIDATION_MESSAGE = \"Please enter a valid date\";\n\nconst MONTH_LABELS = [\n \"January\",\n \"February\",\n \"March\",\n \"April\",\n \"May\",\n \"June\",\n \"July\",\n \"August\",\n \"September\",\n \"October\",\n \"November\",\n \"December\",\n];\n\nconst DAY_OF_WEEK_LABELS = [\n \"Sunday\",\n \"Monday\",\n \"Tuesday\",\n \"Wednesday\",\n \"Thursday\",\n \"Friday\",\n \"Saturday\",\n];\n\nconst ENTER_KEYCODE = 13;\n\nconst YEAR_CHUNK = 12;\n\nconst DEFAULT_MIN_DATE = \"0000-01-01\";\nconst DEFAULT_EXTERNAL_DATE_FORMAT = \"MM/DD/YYYY\";\nconst INTERNAL_DATE_FORMAT = \"YYYY-MM-DD\";\n\nconst NOT_DISABLED_SELECTOR = \":not([disabled])\";\n\nconst processFocusableSelectors = (...selectors) =>\n selectors.map((query) => query + NOT_DISABLED_SELECTOR).join(\", \");\n\nconst DATE_PICKER_FOCUSABLE = processFocusableSelectors(\n CALENDAR_PREVIOUS_YEAR,\n CALENDAR_PREVIOUS_MONTH,\n CALENDAR_YEAR_SELECTION,\n CALENDAR_MONTH_SELECTION,\n CALENDAR_NEXT_YEAR,\n CALENDAR_NEXT_MONTH,\n CALENDAR_DATE_FOCUSED,\n);\n\nconst MONTH_PICKER_FOCUSABLE = processFocusableSelectors(\n CALENDAR_MONTH_FOCUSED,\n);\n\nconst YEAR_PICKER_FOCUSABLE = processFocusableSelectors(\n CALENDAR_PREVIOUS_YEAR_CHUNK,\n CALENDAR_NEXT_YEAR_CHUNK,\n CALENDAR_YEAR_FOCUSED,\n);\n\n// #region Date Manipulation Functions\n\n/**\n * Keep date within month. Month would only be over by 1 to 3 days\n *\n * @param {Date} dateToCheck the date object to check\n * @param {number} month the correct month\n * @returns {Date} the date, corrected if needed\n */\nconst keepDateWithinMonth = (dateToCheck, month) => {\n if (month !== dateToCheck.getMonth()) {\n dateToCheck.setDate(0);\n }\n\n return dateToCheck;\n};\n\n/**\n * Set date from month day year\n *\n * @param {number} year the year to set\n * @param {number} month the month to set (zero-indexed)\n * @param {number} date the date to set\n * @returns {Date} the set date\n */\nconst setDate = (year, month, date) => {\n const newDate = new Date(0);\n newDate.setFullYear(year, month, date);\n return newDate;\n};\n\n/**\n * todays date\n *\n * @returns {Date} todays date\n */\nconst today = () => {\n const newDate = new Date();\n const day = newDate.getDate();\n const month = newDate.getMonth();\n const year = newDate.getFullYear();\n return setDate(year, month, day);\n};\n\n/**\n * Set date to first day of the month\n *\n * @param {number} date the date to adjust\n * @returns {Date} the adjusted date\n */\nconst startOfMonth = (date) => {\n const newDate = new Date(0);\n newDate.setFullYear(date.getFullYear(), date.getMonth(), 1);\n return newDate;\n};\n\n/**\n * Set date to last day of the month\n *\n * @param {number} date the date to adjust\n * @returns {Date} the adjusted date\n */\nconst lastDayOfMonth = (date) => {\n const newDate = new Date(0);\n newDate.setFullYear(date.getFullYear(), date.getMonth() + 1, 0);\n return newDate;\n};\n\n/**\n * Add days to date\n *\n * @param {Date} _date the date to adjust\n * @param {number} numDays the difference in days\n * @returns {Date} the adjusted date\n */\nconst addDays = (_date, numDays) => {\n const newDate = new Date(_date.getTime());\n newDate.setDate(newDate.getDate() + numDays);\n return newDate;\n};\n\n/**\n * Subtract days from date\n *\n * @param {Date} _date the date to adjust\n * @param {number} numDays the difference in days\n * @returns {Date} the adjusted date\n */\nconst subDays = (_date, numDays) => addDays(_date, -numDays);\n\n/**\n * Add weeks to date\n *\n * @param {Date} _date the date to adjust\n * @param {number} numWeeks the difference in weeks\n * @returns {Date} the adjusted date\n */\nconst addWeeks = (_date, numWeeks) => addDays(_date, numWeeks * 7);\n\n/**\n * Subtract weeks from date\n *\n * @param {Date} _date the date to adjust\n * @param {number} numWeeks the difference in weeks\n * @returns {Date} the adjusted date\n */\nconst subWeeks = (_date, numWeeks) => addWeeks(_date, -numWeeks);\n\n/**\n * Set date to the start of the week (Sunday)\n *\n * @param {Date} _date the date to adjust\n * @returns {Date} the adjusted date\n */\nconst startOfWeek = (_date) => {\n const dayOfWeek = _date.getDay();\n return subDays(_date, dayOfWeek);\n};\n\n/**\n * Set date to the end of the week (Saturday)\n *\n * @param {Date} _date the date to adjust\n * @param {number} numWeeks the difference in weeks\n * @returns {Date} the adjusted date\n */\nconst endOfWeek = (_date) => {\n const dayOfWeek = _date.getDay();\n return addDays(_date, 6 - dayOfWeek);\n};\n\n/**\n * Add months to date and keep date within month\n *\n * @param {Date} _date the date to adjust\n * @param {number} numMonths the difference in months\n * @returns {Date} the adjusted date\n */\nconst addMonths = (_date, numMonths) => {\n const newDate = new Date(_date.getTime());\n\n const dateMonth = (newDate.getMonth() + 12 + numMonths) % 12;\n newDate.setMonth(newDate.getMonth() + numMonths);\n keepDateWithinMonth(newDate, dateMonth);\n\n return newDate;\n};\n\n/**\n * Subtract months from date\n *\n * @param {Date} _date the date to adjust\n * @param {number} numMonths the difference in months\n * @returns {Date} the adjusted date\n */\nconst subMonths = (_date, numMonths) => addMonths(_date, -numMonths);\n\n/**\n * Add years to date and keep date within month\n *\n * @param {Date} _date the date to adjust\n * @param {number} numYears the difference in years\n * @returns {Date} the adjusted date\n */\nconst addYears = (_date, numYears) => addMonths(_date, numYears * 12);\n\n/**\n * Subtract years from date\n *\n * @param {Date} _date the date to adjust\n * @param {number} numYears the difference in years\n * @returns {Date} the adjusted date\n */\nconst subYears = (_date, numYears) => addYears(_date, -numYears);\n\n/**\n * Set months of date\n *\n * @param {Date} _date the date to adjust\n * @param {number} month zero-indexed month to set\n * @returns {Date} the adjusted date\n */\nconst setMonth = (_date, month) => {\n const newDate = new Date(_date.getTime());\n\n newDate.setMonth(month);\n keepDateWithinMonth(newDate, month);\n\n return newDate;\n};\n\n/**\n * Set year of date\n *\n * @param {Date} _date the date to adjust\n * @param {number} year the year to set\n * @returns {Date} the adjusted date\n */\nconst setYear = (_date, year) => {\n const newDate = new Date(_date.getTime());\n\n const month = newDate.getMonth();\n newDate.setFullYear(year);\n keepDateWithinMonth(newDate, month);\n\n return newDate;\n};\n\n/**\n * Return the earliest date\n *\n * @param {Date} dateA date to compare\n * @param {Date} dateB date to compare\n * @returns {Date} the earliest date\n */\nconst min = (dateA, dateB) => {\n let newDate = dateA;\n\n if (dateB < dateA) {\n newDate = dateB;\n }\n\n return new Date(newDate.getTime());\n};\n\n/**\n * Return the latest date\n *\n * @param {Date} dateA date to compare\n * @param {Date} dateB date to compare\n * @returns {Date} the latest date\n */\nconst max = (dateA, dateB) => {\n let newDate = dateA;\n\n if (dateB > dateA) {\n newDate = dateB;\n }\n\n return new Date(newDate.getTime());\n};\n\n/**\n * Check if dates are the in the same year\n *\n * @param {Date} dateA date to compare\n * @param {Date} dateB date to compare\n * @returns {boolean} are dates in the same year\n */\nconst isSameYear = (dateA, dateB) =>\n dateA && dateB && dateA.getFullYear() === dateB.getFullYear();\n\n/**\n * Check if dates are the in the same month\n *\n * @param {Date} dateA date to compare\n * @param {Date} dateB date to compare\n * @returns {boolean} are dates in the same month\n */\nconst isSameMonth = (dateA, dateB) =>\n isSameYear(dateA, dateB) && dateA.getMonth() === dateB.getMonth();\n\n/**\n * Check if dates are the same date\n *\n * @param {Date} dateA the date to compare\n * @param {Date} dateA the date to compare\n * @returns {boolean} are dates the same date\n */\nconst isSameDay = (dateA, dateB) =>\n isSameMonth(dateA, dateB) && dateA.getDate() === dateB.getDate();\n\n/**\n * return a new date within minimum and maximum date\n *\n * @param {Date} date date to check\n * @param {Date} minDate minimum date to allow\n * @param {Date} maxDate maximum date to allow\n * @returns {Date} the date between min and max\n */\nconst keepDateBetweenMinAndMax = (date, minDate, maxDate) => {\n let newDate = date;\n\n if (date < minDate) {\n newDate = minDate;\n } else if (maxDate && date > maxDate) {\n newDate = maxDate;\n }\n\n return new Date(newDate.getTime());\n};\n\n/**\n * Check if dates is valid.\n *\n * @param {Date} date date to check\n * @param {Date} minDate minimum date to allow\n * @param {Date} maxDate maximum date to allow\n * @return {boolean} is there a day within the month within min and max dates\n */\nconst isDateWithinMinAndMax = (date, minDate, maxDate) =>\n date >= minDate && (!maxDate || date <= maxDate);\n\n/**\n * Check if dates month is invalid.\n *\n * @param {Date} date date to check\n * @param {Date} minDate minimum date to allow\n * @param {Date} maxDate maximum date to allow\n * @return {boolean} is the month outside min or max dates\n */\nconst isDatesMonthOutsideMinOrMax = (date, minDate, maxDate) =>\n lastDayOfMonth(date) < minDate || (maxDate && startOfMonth(date) > maxDate);\n\n/**\n * Check if dates year is invalid.\n *\n * @param {Date} date date to check\n * @param {Date} minDate minimum date to allow\n * @param {Date} maxDate maximum date to allow\n * @return {boolean} is the month outside min or max dates\n */\nconst isDatesYearOutsideMinOrMax = (date, minDate, maxDate) =>\n lastDayOfMonth(setMonth(date, 11)) < minDate ||\n (maxDate && startOfMonth(setMonth(date, 0)) > maxDate);\n\n/**\n * Parse a date with format M-D-YY\n *\n * @param {string} dateString the date string to parse\n * @param {string} dateFormat the format of the date string\n * @param {boolean} adjustDate should the date be adjusted\n * @returns {Date} the parsed date\n */\nconst parseDateString = (\n dateString,\n dateFormat = INTERNAL_DATE_FORMAT,\n adjustDate = false,\n) => {\n let date;\n let month;\n let day;\n let year;\n let parsed;\n\n if (dateString) {\n let monthStr;\n let dayStr;\n let yearStr;\n\n if (dateFormat === DEFAULT_EXTERNAL_DATE_FORMAT) {\n [monthStr, dayStr, yearStr] = dateString.split(\"/\");\n } else {\n [yearStr, monthStr, dayStr] = dateString.split(\"-\");\n }\n\n if (yearStr) {\n parsed = parseInt(yearStr, 10);\n if (!Number.isNaN(parsed)) {\n year = parsed;\n if (adjustDate) {\n year = Math.max(0, year);\n if (yearStr.length < 3) {\n const currentYear = today().getFullYear();\n const currentYearStub =\n currentYear - (currentYear % 10 ** yearStr.length);\n year = currentYearStub + parsed;\n }\n }\n }\n }\n\n if (monthStr) {\n parsed = parseInt(monthStr, 10);\n if (!Number.isNaN(parsed)) {\n month = parsed;\n if (adjustDate) {\n month = Math.max(1, month);\n month = Math.min(12, month);\n }\n }\n }\n\n if (month && dayStr && year != null) {\n parsed = parseInt(dayStr, 10);\n if (!Number.isNaN(parsed)) {\n day = parsed;\n if (adjustDate) {\n const lastDayOfTheMonth = setDate(year, month, 0).getDate();\n day = Math.max(1, day);\n day = Math.min(lastDayOfTheMonth, day);\n }\n }\n }\n\n if (month && day && year != null) {\n date = setDate(year, month - 1, day);\n }\n }\n\n return date;\n};\n\n/**\n * Format a date to format MM-DD-YYYY\n *\n * @param {Date} date the date to format\n * @param {string} dateFormat the format of the date string\n * @returns {string} the formatted date string\n */\nconst formatDate = (date, dateFormat = INTERNAL_DATE_FORMAT) => {\n const padZeros = (value, length) => `0000${value}`.slice(-length);\n\n const month = date.getMonth() + 1;\n const day = date.getDate();\n const year = date.getFullYear();\n\n if (dateFormat === DEFAULT_EXTERNAL_DATE_FORMAT) {\n return [padZeros(month, 2), padZeros(day, 2), padZeros(year, 4)].join(\"/\");\n }\n\n return [padZeros(year, 4), padZeros(month, 2), padZeros(day, 2)].join(\"-\");\n};\n\n// #endregion Date Manipulation Functions\n\n/**\n * Create a grid string from an array of html strings\n *\n * @param {string[]} htmlArray the array of html items\n * @param {number} rowSize the length of a row\n * @returns {string} the grid string\n */\nconst listToGridHtml = (htmlArray, rowSize) => {\n const grid = [];\n let row = [];\n\n let i = 0;\n while (i < htmlArray.length) {\n row = [];\n\n const tr = document.createElement(\"tr\");\n while (i < htmlArray.length && row.length < rowSize) {\n const td = document.createElement(\"td\");\n td.insertAdjacentElement(\"beforeend\", htmlArray[i]);\n row.push(td);\n i += 1;\n }\n\n row.forEach((element) => {\n tr.insertAdjacentElement(\"beforeend\", element);\n });\n\n grid.push(tr);\n }\n\n return grid;\n};\n\nconst createTableBody = (grid) => {\n const tableBody = document.createElement(\"tbody\");\n grid.forEach((element) => {\n tableBody.insertAdjacentElement(\"beforeend\", element);\n });\n\n return tableBody;\n};\n\n/**\n * set the value of the element and dispatch a change event\n *\n * @param {HTMLInputElement} el The element to update\n * @param {string} value The new value of the element\n */\nconst changeElementValue = (el, value = \"\") => {\n const elementToChange = el;\n elementToChange.value = value;\n\n const event = new CustomEvent(\"change\", {\n bubbles: true,\n cancelable: true,\n detail: { value },\n });\n elementToChange.dispatchEvent(event);\n};\n\n/**\n * The properties and elements within the date picker.\n * @typedef {Object} DatePickerContext\n * @property {HTMLDivElement} calendarEl\n * @property {HTMLElement} datePickerEl\n * @property {HTMLInputElement} internalInputEl\n * @property {HTMLInputElement} externalInputEl\n * @property {HTMLDivElement} statusEl\n * @property {HTMLDivElement} firstYearChunkEl\n * @property {Date} calendarDate\n * @property {Date} minDate\n * @property {Date} maxDate\n * @property {Date} selectedDate\n * @property {Date} rangeDate\n * @property {Date} defaultDate\n */\n\n/**\n * Get an object of the properties and elements belonging directly to the given\n * date picker component.\n *\n * @param {HTMLElement} el the element within the date picker\n * @returns {DatePickerContext} elements\n */\nconst getDatePickerContext = (el) => {\n const datePickerEl = el.closest(DATE_PICKER);\n\n if (!datePickerEl) {\n throw new Error(`Element is missing outer ${DATE_PICKER}`);\n }\n\n const internalInputEl = datePickerEl.querySelector(\n DATE_PICKER_INTERNAL_INPUT,\n );\n const externalInputEl = datePickerEl.querySelector(\n DATE_PICKER_EXTERNAL_INPUT,\n );\n const calendarEl = datePickerEl.querySelector(DATE_PICKER_CALENDAR);\n const toggleBtnEl = datePickerEl.querySelector(DATE_PICKER_BUTTON);\n const statusEl = datePickerEl.querySelector(DATE_PICKER_STATUS);\n const firstYearChunkEl = datePickerEl.querySelector(CALENDAR_YEAR);\n\n const inputDate = parseDateString(\n externalInputEl.value,\n DEFAULT_EXTERNAL_DATE_FORMAT,\n true,\n );\n const selectedDate = parseDateString(internalInputEl.value);\n\n const calendarDate = parseDateString(calendarEl.dataset.value);\n const minDate = parseDateString(datePickerEl.dataset.minDate);\n const maxDate = parseDateString(datePickerEl.dataset.maxDate);\n const rangeDate = parseDateString(datePickerEl.dataset.rangeDate);\n const defaultDate = parseDateString(datePickerEl.dataset.defaultDate);\n\n if (minDate && maxDate && minDate > maxDate) {\n throw new Error(\"Minimum date cannot be after maximum date\");\n }\n\n return {\n calendarDate,\n minDate,\n toggleBtnEl,\n selectedDate,\n maxDate,\n firstYearChunkEl,\n datePickerEl,\n inputDate,\n internalInputEl,\n externalInputEl,\n calendarEl,\n rangeDate,\n defaultDate,\n statusEl,\n };\n};\n\n/**\n * Disable the date picker component\n *\n * @param {HTMLElement} el An element within the date picker component\n */\nconst disable = (el) => {\n const { externalInputEl, toggleBtnEl } = getDatePickerContext(el);\n\n toggleBtnEl.disabled = true;\n externalInputEl.disabled = true;\n};\n\n/**\n * Check for aria-disabled on initialization\n *\n * @param {HTMLElement} el An element within the date picker component\n */\nconst ariaDisable = (el) => {\n const { externalInputEl, toggleBtnEl } = getDatePickerContext(el);\n\n toggleBtnEl.setAttribute(\"aria-disabled\", true);\n externalInputEl.setAttribute(\"aria-disabled\", true);\n};\n\n/**\n * Enable the date picker component\n *\n * @param {HTMLElement} el An element within the date picker component\n */\nconst enable = (el) => {\n const { externalInputEl, toggleBtnEl } = getDatePickerContext(el);\n\n toggleBtnEl.disabled = false;\n externalInputEl.disabled = false;\n};\n\n// #region Validation\n\n/**\n * Validate the value in the input as a valid date of format M/D/YYYY\n *\n * @param {HTMLElement} el An element within the date picker component\n */\nconst isDateInputInvalid = (el) => {\n const { externalInputEl, minDate, maxDate } = getDatePickerContext(el);\n\n const dateString = externalInputEl.value;\n let isInvalid = false;\n\n if (dateString) {\n isInvalid = true;\n\n const dateStringParts = dateString.split(\"/\");\n const [month, day, year] = dateStringParts.map((str) => {\n let value;\n const parsed = parseInt(str, 10);\n if (!Number.isNaN(parsed)) value = parsed;\n return value;\n });\n\n if (month && day && year != null) {\n const checkDate = setDate(year, month - 1, day);\n\n if (\n checkDate.getMonth() === month - 1 &&\n checkDate.getDate() === day &&\n checkDate.getFullYear() === year &&\n dateStringParts[2].length === 4 &&\n isDateWithinMinAndMax(checkDate, minDate, maxDate)\n ) {\n isInvalid = false;\n }\n }\n }\n\n return isInvalid;\n};\n\n/**\n * Validate the value in the input as a valid date of format M/D/YYYY\n *\n * @param {HTMLElement} el An element within the date picker component\n */\nconst validateDateInput = (el) => {\n const { externalInputEl } = getDatePickerContext(el);\n const isInvalid = isDateInputInvalid(externalInputEl);\n\n if (isInvalid && !externalInputEl.validationMessage) {\n externalInputEl.setCustomValidity(VALIDATION_MESSAGE);\n }\n\n if (!isInvalid && externalInputEl.validationMessage === VALIDATION_MESSAGE) {\n externalInputEl.setCustomValidity(\"\");\n }\n};\n\n// #endregion Validation\n\n/**\n * Enable the date picker component\n *\n * @param {HTMLElement} el An element within the date picker component\n */\nconst reconcileInputValues = (el) => {\n const { internalInputEl, inputDate } = getDatePickerContext(el);\n let newValue = \"\";\n\n if (inputDate && !isDateInputInvalid(el)) {\n newValue = formatDate(inputDate);\n }\n\n if (internalInputEl.value !== newValue) {\n changeElementValue(internalInputEl, newValue);\n }\n};\n\n/**\n * Select the value of the date picker inputs.\n *\n * @param {HTMLButtonElement} el An element within the date picker component\n * @param {string} dateString The date string to update in YYYY-MM-DD format\n */\nconst setCalendarValue = (el, dateString) => {\n const parsedDate = parseDateString(dateString);\n\n if (parsedDate) {\n const formattedDate = formatDate(parsedDate, DEFAULT_EXTERNAL_DATE_FORMAT);\n\n const { datePickerEl, internalInputEl, externalInputEl } =\n getDatePickerContext(el);\n\n changeElementValue(internalInputEl, dateString);\n changeElementValue(externalInputEl, formattedDate);\n\n validateDateInput(datePickerEl);\n }\n};\n\n/**\n * Enhance an input with the date picker elements\n *\n * @param {HTMLElement} el The initial wrapping element of the date picker component\n */\nconst enhanceDatePicker = (el) => {\n const datePickerEl = el.closest(DATE_PICKER);\n const { defaultValue } = datePickerEl.dataset;\n\n const internalInputEl = datePickerEl.querySelector(`input`);\n\n if (!internalInputEl) {\n throw new Error(`${DATE_PICKER} is missing inner input`);\n }\n\n if (internalInputEl.value) {\n internalInputEl.value = \"\";\n }\n\n const minDate = parseDateString(\n datePickerEl.dataset.minDate || internalInputEl.getAttribute(\"min\"),\n );\n datePickerEl.dataset.minDate = minDate\n ? formatDate(minDate)\n : DEFAULT_MIN_DATE;\n\n const maxDate = parseDateString(\n datePickerEl.dataset.maxDate || internalInputEl.getAttribute(\"max\"),\n );\n if (maxDate) {\n datePickerEl.dataset.maxDate = formatDate(maxDate);\n }\n\n const calendarWrapper = document.createElement(\"div\");\n calendarWrapper.classList.add(DATE_PICKER_WRAPPER_CLASS);\n\n const externalInputEl = internalInputEl.cloneNode();\n externalInputEl.classList.add(DATE_PICKER_EXTERNAL_INPUT_CLASS);\n externalInputEl.type = \"text\";\n\n calendarWrapper.appendChild(externalInputEl);\n calendarWrapper.insertAdjacentHTML(\n \"beforeend\",\n Sanitizer.escapeHTML`\n <button type=\"button\" class=\"${DATE_PICKER_BUTTON_CLASS}\" aria-haspopup=\"true\" aria-label=\"Toggle calendar\"></button>\n <div class=\"${DATE_PICKER_CALENDAR_CLASS}\" role=\"application\" hidden></div>\n <div class=\"usa-sr-only ${DATE_PICKER_STATUS_CLASS}\" role=\"status\" aria-live=\"polite\"></div>`,\n );\n\n internalInputEl.setAttribute(\"aria-hidden\", \"true\");\n internalInputEl.setAttribute(\"tabindex\", \"-1\");\n internalInputEl.style.display = \"none\";\n internalInputEl.classList.add(DATE_PICKER_INTERNAL_INPUT_CLASS);\n internalInputEl.removeAttribute(\"id\");\n internalInputEl.removeAttribute(\"name\");\n internalInputEl.required = false;\n\n datePickerEl.appendChild(calendarWrapper);\n datePickerEl.classList.add(DATE_PICKER_INITIALIZED_CLASS);\n\n if (defaultValue) {\n setCalendarValue(datePickerEl, defaultValue);\n }\n\n if (internalInputEl.disabled) {\n disable(datePickerEl);\n internalInputEl.disabled = false;\n }\n\n if (internalInputEl.hasAttribute(\"aria-disabled\")) {\n ariaDisable(datePickerEl);\n internalInputEl.removeAttribute(\"aria-disabled\");\n }\n};\n\n// #region Calendar - Date Selection View\n\n/**\n * render the calendar.\n *\n * @param {HTMLElement} el An element within the date picker component\n * @param {Date} _dateToDisplay a date to render on the calendar\n * @returns {HTMLElement} a reference to the new calendar element\n */\nconst renderCalendar = (el, _dateToDisplay) => {\n const {\n datePickerEl,\n calendarEl,\n statusEl,\n selectedDate,\n maxDate,\n minDate,\n rangeDate,\n } = getDatePickerContext(el);\n const todaysDate = today();\n let dateToDisplay = _dateToDisplay || todaysDate;\n\n const calendarWasHidden = calendarEl.hidden;\n\n const focusedDate = addDays(dateToDisplay, 0);\n const focusedMonth = dateToDisplay.getMonth();\n const focusedYear = dateToDisplay.getFullYear();\n\n const prevMonth = subMonths(dateToDisplay, 1);\n const nextMonth = addMonths(dateToDisplay, 1);\n\n const currentFormattedDate = formatDate(dateToDisplay);\n\n const firstOfMonth = startOfMonth(dateToDisplay);\n const prevButtonsDisabled = isSameMonth(dateToDisplay, minDate);\n const nextButtonsDisabled = isSameMonth(dateToDisplay, maxDate);\n\n const rangeConclusionDate = selectedDate || dateToDisplay;\n const rangeStartDate = rangeDate && min(rangeConclusionDate, rangeDate);\n const rangeEndDate = rangeDate && max(rangeConclusionDate, rangeDate);\n\n const withinRangeStartDate = rangeDate && addDays(rangeStartDate, 1);\n const withinRangeEndDate = rangeDate && subDays(rangeEndDate, 1);\n\n const monthLabel = MONTH_LABELS[focusedMonth];\n\n const generateDateHtml = (dateToRender) => {\n const classes = [CALENDAR_DATE_CLASS];\n const day = dateToRender.getDate();\n const month = dateToRender.getMonth();\n const year = dateToRender.getFullYear();\n const dayOfWeek = dateToRender.getDay();\n\n const formattedDate = formatDate(dateToRender);\n\n let tabindex = \"-1\";\n\n const isDisabled = !isDateWithinMinAndMax(dateToRender, minDate, maxDate);\n const isSelected = isSameDay(dateToRender, selectedDate);\n\n if (isSameMonth(dateToRender, prevMonth)) {\n classes.push(CALENDAR_DATE_PREVIOUS_MONTH_CLASS);\n }\n\n if (isSameMonth(dateToRender, focusedDate)) {\n classes.push(CALENDAR_DATE_CURRENT_MONTH_CLASS);\n }\n\n if (isSameMonth(dateToRender, nextMonth)) {\n classes.push(CALENDAR_DATE_NEXT_MONTH_CLASS);\n }\n\n if (isSelected) {\n classes.push(CALENDAR_DATE_SELECTED_CLASS);\n }\n\n if (isSameDay(dateToRender, todaysDate)) {\n classes.push(CALENDAR_DATE_TODAY_CLASS);\n }\n\n if (rangeDate) {\n if (isSameDay(dateToRender, rangeDate)) {\n classes.push(CALENDAR_DATE_RANGE_DATE_CLASS);\n }\n\n if (isSameDay(dateToRender, rangeStartDate)) {\n classes.push(CALENDAR_DATE_RANGE_DATE_START_CLASS);\n }\n\n if (isSameDay(dateToRender, rangeEndDate)) {\n classes.push(CALENDAR_DATE_RANGE_DATE_END_CLASS);\n }\n\n if (\n isDateWithinMinAndMax(\n dateToRender,\n withinRangeStartDate,\n withinRangeEndDate,\n )\n ) {\n classes.push(CALENDAR_DATE_WITHIN_RANGE_CLASS);\n }\n }\n\n if (isSameDay(dateToRender, focusedDate)) {\n tabindex = \"0\";\n classes.push(CALENDAR_DATE_FOCUSED_CLASS);\n }\n\n const monthStr = MONTH_LABELS[month];\n const dayStr = DAY_OF_WEEK_LABELS[dayOfWeek];\n\n const btn = document.createElement(\"button\");\n btn.setAttribute(\"type\", \"button\");\n btn.setAttribute(\"tabindex\", tabindex);\n btn.setAttribute(\"class\", classes.join(\" \"));\n btn.setAttribute(\"data-day\", day);\n btn.setAttribute(\"data-month\", month + 1);\n btn.setAttribute(\"data-year\", year);\n btn.setAttribute(\"data-value\", formattedDate);\n btn.setAttribute(\n \"aria-label\",\n Sanitizer.escapeHTML`${day} ${monthStr} ${year} ${dayStr}`,\n );\n btn.setAttribute(\"aria-selected\", isSelected ? \"true\" : \"false\");\n if (isDisabled === true) {\n btn.disabled = true;\n }\n btn.textContent = day;\n\n return btn;\n };\n\n // set date to first rendered day\n dateToDisplay = startOfWeek(firstOfMonth);\n\n const days = [];\n\n while (\n days.length < 28 ||\n dateToDisplay.getMonth() === focusedMonth ||\n days.length % 7 !== 0\n ) {\n days.push(generateDateHtml(dateToDisplay));\n dateToDisplay = addDays(dateToDisplay, 1);\n }\n\n const datesGrid = listToGridHtml(days, 7);\n\n const newCalendar = calendarEl.cloneNode();\n newCalendar.dataset.value = currentFormattedDate;\n newCalendar.style.top = `${datePickerEl.offsetHeight}px`;\n newCalendar.hidden = false;\n newCalendar.innerHTML = Sanitizer.escapeHTML`\n <div tabindex=\"-1\" class=\"${CALENDAR_DATE_PICKER_CLASS}\">\n <div class=\"${CALENDAR_ROW_CLASS}\">\n <div class=\"${CALENDAR_CELL_CLASS} ${CALENDAR_CELL_CENTER_ITEMS_CLASS}\">\n <button\n type=\"button\"\n class=\"${CALENDAR_PREVIOUS_YEAR_CLASS}\"\n aria-label=\"Navigate back one year\"\n ${prevButtonsDisabled ? `disabled=\"disabled\"` : \"\"}\n ></button>\n </div>\n <div class=\"${CALENDAR_CELL_CLASS} ${CALENDAR_CELL_CENTER_ITEMS_CLASS}\">\n <button\n type=\"button\"\n class=\"${CALENDAR_PREVIOUS_MONTH_CLASS}\"\n aria-label=\"Navigate back one month\"\n ${prevButtonsDisabled ? `disabled=\"disabled\"` : \"\"}\n ></button>\n </div>\n <div class=\"${CALENDAR_CELL_CLASS} ${CALENDAR_MONTH_LABEL_CLASS}\">\n <button\n type=\"button\"\n class=\"${CALENDAR_MONTH_SELECTION_CLASS}\" aria-label=\"${monthLabel}. Select month\"\n >${monthLabel}</button>\n <button\n type=\"button\"\n class=\"${CALENDAR_YEAR_SELECTION_CLASS}\" aria-label=\"${focusedYear}. Select year\"\n >${focusedYear}</button>\n </div>\n <div class=\"${CALENDAR_CELL_CLASS} ${CALENDAR_CELL_CENTER_ITEMS_CLASS}\">\n <button\n type=\"button\"\n class=\"${CALENDAR_NEXT_MONTH_CLASS}\"\n aria-label=\"Navigate forward one month\"\n ${nextButtonsDisabled ? `disabled=\"disabled\"` : \"\"}\n ></button>\n </div>\n <div class=\"${CALENDAR_CELL_CLASS} ${CALENDAR_CELL_CENTER_ITEMS_CLASS}\">\n <button\n type=\"button\"\n class=\"${CALENDAR_NEXT_YEAR_CLASS}\"\n aria-label=\"Navigate forward one year\"\n ${nextButtonsDisabled ? `disabled=\"disabled\"` : \"\"}\n ></button>\n </div>\n </div>\n </div>\n `;\n\n const table = document.createElement(\"table\");\n table.setAttribute(\"class\", CALENDAR_TABLE_CLASS);\n\n const tableHead = document.createElement(\"thead\");\n table.insertAdjacentElement(\"beforeend\", tableHead);\n const tableHeadRow = document.createElement(\"tr\");\n tableHead.insertAdjacentElement(\"beforeend\", tableHeadRow);\n\n const daysOfWeek = {\n Sunday: \"S\",\n Monday: \"M\",\n Tuesday: \"T\",\n Wednesday: \"W\",\n Thursday: \"Th\",\n Friday: \"Fr\",\n Saturday: \"S\",\n };\n\n Object.keys(daysOfWeek).forEach((key) => {\n const th = document.createElement(\"th\");\n th.setAttribute(\"class\", CALENDAR_DAY_OF_WEEK_CLASS);\n th.setAttribute(\"scope\", \"col\");\n th.setAttribute(\"aria-label\", key);\n th.textContent = daysOfWeek[key];\n tableHeadRow.insertAdjacentElement(\"beforeend\", th);\n });\n\n const tableBody = createTableBody(datesGrid);\n table.insertAdjacentElement(\"beforeend\", tableBody);\n\n // Container for Years, Months, and Days\n const datePickerCalendarContainer =\n newCalendar.querySelector(CALENDAR_DATE_PICKER);\n\n datePickerCalendarContainer.insertAdjacentElement(\"beforeend\", table);\n\n calendarEl.parentNode.replaceChild(newCalendar, calendarEl);\n\n datePickerEl.classList.add(DATE_PICKER_ACTIVE_CLASS);\n\n const statuses = [];\n\n if (isSameDay(selectedDate, focusedDate)) {\n statuses.push(\"Selected date\");\n }\n\n if (calendarWasHidden) {\n statuses.push(\n \"You can navigate by day using left and right arrows\",\n \"Weeks by using up and down arrows\",\n \"Months by using page up and page down keys\",\n \"Years by using shift plus page up and shift plus page down\",\n \"Home and end keys navigate to the beginning and end of a week\",\n );\n statusEl.textContent = \"\";\n } else {\n statuses.push(`${monthLabel} ${focusedYear}`);\n }\n statusEl.textContent = statuses.join(\". \");\n\n return newCalendar;\n};\n\n/**\n * Navigate back one year and display the calendar.\n *\n * @param {HTMLButtonElement} _buttonEl An element within the date picker component\n */\nconst displayPreviousYear = (_buttonEl) => {\n if (_buttonEl.disabled) return;\n const { calendarEl, calendarDate, minDate, maxDate } =\n getDatePickerContext(_buttonEl);\n let date = subYears(calendarDate, 1);\n date = keepDateBetweenMinAndMax(date, minDate, maxDate);\n const newCalendar = renderCalendar(calendarEl, date);\n\n let nextToFocus = newCalendar.querySelector(CALENDAR_PREVIOUS_YEAR);\n if (nextToFocus.disabled) {\n nextToFocus = newCalendar.querySelector(CALENDAR_DATE_PICKER);\n }\n nextToFocus.focus();\n};\n\n/**\n * Navigate back one month and display the calendar.\n *\n * @param {HTMLButtonElement} _buttonEl An element within the date picker component\n */\nconst displayPreviousMonth = (_buttonEl) => {\n if (_buttonEl.disabled) return;\n const { calendarEl, calendarDate, minDate, maxDate } =\n getDatePickerContext(_buttonEl);\n let date = subMonths(calendarDate, 1);\n date = keepDateBetweenMinAndMax(date, minDate, maxDate);\n const newCalendar = renderCalendar(calendarEl, date);\n\n let nextToFocus = newCalendar.querySelector(CALENDAR_PREVIOUS_MONTH);\n if (nextToFocus.disabled) {\n nextToFocus = newCalendar.querySelector(CALENDAR_DATE_PICKER);\n }\n nextToFocus.focus();\n};\n\n/**\n * Navigate forward one month and display the calendar.\n *\n * @param {HTMLButtonElement} _buttonEl An element within the date picker component\n */\nconst displayNextMonth = (_buttonEl) => {\n if (_buttonEl.disabled) return;\n const { calendarEl, calendarDate, minDate, maxDate } =\n getDatePickerContext(_buttonEl);\n let date = addMonths(calendarDate, 1);\n date = keepDateBetweenMinAndMax(date, minDate, maxDate);\n const newCalendar = renderCalendar(calendarEl, date);\n\n let nextToFocus = newCalendar.querySelector(CALENDAR_NEXT_MONTH);\n if (nextToFocus.disabled) {\n nextToFocus = newCalendar.querySelector(CALENDAR_DATE_PICKER);\n }\n nextToFocus.focus();\n};\n\n/**\n * Navigate forward one year and display the calendar.\n *\n * @param {HTMLButtonElement} _buttonEl An element within the date picker component\n */\nconst displayNextYear = (_buttonEl) => {\n if (_buttonEl.disabled) return;\n const { calendarEl, calendarDate, minDate, maxDate } =\n getDatePickerContext(_buttonEl);\n let date = addYears(calendarDate, 1);\n date = keepDateBetweenMinAndMax(date, minDate, maxDate);\n const newCalendar = renderCalendar(calendarEl, date);\n\n let nextToFocus = newCalendar.querySelector(CALENDAR_NEXT_YEAR);\n if (nextToFocus.disabled) {\n nextToFocus = newCalendar.querySelector(CALENDAR_DATE_PICKER);\n }\n nextToFocus.focus();\n};\n\n/**\n * Hide the calendar of a date picker component.\n *\n * @param {HTMLElement} el An element within the date picker component\n */\nconst hideCalendar = (el) => {\n const { datePickerEl, calendarEl, statusEl } = getDatePickerContext(el);\n\n datePickerEl.classList.remove(DATE_PICKER_ACTIVE_CLASS);\n calendarEl.hidden = true;\n statusEl.textContent = \"\";\n};\n\n/**\n * Select a date within the date picker component.\n *\n * @param {HTMLButtonElement} calendarDateEl A date element within the date picker component\n */\nconst selectDate = (calendarDateEl) => {\n if (calendarDateEl.disabled) return;\n\n const { datePickerEl, externalInputEl } =\n getDatePickerContext(calendarDateEl);\n\n setCalendarValue(calendarDateEl, calendarDateEl.dataset.value);\n hideCalendar(datePickerEl);\n\n externalInputEl.focus();\n};\n\n/**\n * Toggle the calendar.\n *\n * @param {HTMLButtonElement} el An element within the date picker component\n */\nconst toggleCalendar = (el) => {\n if (el.disabled) return;\n const { calendarEl, inputDate, minDate, maxDate, defaultDate } =\n getDatePickerContext(el);\n\n if (calendarEl.hidden) {\n const dateToDisplay = keepDateBetweenMinAndMax(\n inputDate || defaultDate || today(),\n minDate,\n maxDate,\n );\n const newCalendar = renderCalendar(calendarEl, dateToDisplay);\n newCalendar.querySelector(CALENDAR_DATE_FOCUSED).focus();\n } else {\n hideCalendar(el);\n }\n};\n\n/**\n * Update the calendar when visible.\n *\n * @param {HTMLElement} el an element within the date picker\n */\nconst updateCalendarIfVisible = (el) => {\n const { calendarEl, inputDate, minDate, maxDate } = getDatePickerContext(el);\n const calendarShown = !calendarEl.hidden;\n\n if (calendarShown && inputDate) {\n const dateToDisplay = keepDateBetweenMinAndMax(inputDate, minDate, maxDate);\n renderCalendar(calendarEl, dateToDisplay);\n }\n};\n\n// #endregion Calendar - Date Selection View\n\n// #region Calendar - Month Selection View\n/**\n * Display the month selection screen in the date picker.\n *\n * @param {HTMLButtonElement} el An element within the date picker component\n * @returns {HTMLElement} a reference to the new calendar element\n */\nconst displayMonthSelection = (el, monthToDisplay) => {\n const { calendarEl, statusEl, calendarDate, minDate, maxDate } =\n getDatePickerContext(el);\n\n const selectedMonth = calendarDate.getMonth();\n const focusedMonth = monthToDisplay == null ? selectedMonth : monthToDisplay;\n\n const months = MONTH_LABELS.map((month, index) => {\n const monthToCheck = setMonth(calendarDate, index);\n\n const isDisabled = isDatesMonthOutsideMinOrMax(\n monthToCheck,\n minDate,\n maxDate,\n );\n\n let tabindex = \"-1\";\n\n const classes = [CALENDAR_MONTH_CLASS];\n const isSelected = index === selectedMonth;\n\n if (index === focusedMonth) {\n tabindex = \"0\";\n classes.push(CALENDAR_MONTH_FOCUSED_CLASS);\n }\n\n if (isSelected) {\n classes.push(CALENDAR_MONTH_SELECTED_CLASS);\n }\n\n const btn = document.createElement(\"button\");\n btn.setAttribute(\"type\", \"button\");\n btn.setAttribute(\"tabindex\", tabindex);\n btn.setAttribute(\"class\", classes.join(\" \"));\n btn.setAttribute(\"data-value\", index);\n btn.setAttribute(\"data-label\", month);\n btn.setAttribute(\"aria-selected\", isSelected ? \"true\" : \"false\");\n if (isDisabled === true) {\n btn.disabled = true;\n }\n btn.textContent = month;\n\n return btn;\n });\n\n const monthsHtml = document.createElement(\"div\");\n monthsHtml.setAttribute(\"tabindex\", \"-1\");\n monthsHtml.setAttribute(\"class\", CALENDAR_MONTH_PICKER_CLASS);\n\n const table = document.createElement(\"table\");\n table.setAttribute(\"class\", CALENDAR_TABLE_CLASS);\n table.setAttribute(\"role\", \"presentation\");\n\n const monthsGrid = listToGridHtml(months, 3);\n const tableBody = createTableBody(monthsGrid);\n table.insertAdjacentElement(\"beforeend\", tableBody);\n monthsHtml.insertAdjacentElement(\"beforeend\", table);\n\n const newCalendar = calendarEl.cloneNode();\n newCalendar.insertAdjacentElement(\"beforeend\", monthsHtml);\n calendarEl.parentNode.replaceChild(newCalendar, calendarEl);\n\n statusEl.textContent = \"Select a month.\";\n\n return newCalendar;\n};\n\n/**\n * Select a month in the date picker component.\n *\n * @param {HTMLButtonElement} monthEl An month element within the date picker component\n */\nconst selectMonth = (monthEl) => {\n if (monthEl.disabled) return;\n const { calendarEl, calendarDate, minDate, maxDate } =\n getDatePickerContext(monthEl);\n const selectedMonth = parseInt(monthEl.dataset.value, 10);\n let date = setMonth(calendarDate, selectedMonth);\n date = keepDateBetweenMinAndMax(date, minDate, maxDate);\n const newCalendar = renderCalendar(calendarEl, date);\n newCalendar.querySelector(CALENDAR_DATE_FOCUSED).focus();\n};\n\n// #endregion Calendar - Month Selection View\n\n// #region Calendar - Year Selection View\n\n/**\n * Display the year selection screen in the date picker.\n *\n * @param {HTMLButtonElement} el An element within the date picker component\n * @param {number} yearToDisplay year to display in year selection\n * @returns {HTMLElement} a reference to the new calendar element\n */\nconst displayYearSelection = (el, yearToDisplay) => {\n const { calendarEl, statusEl, calendarDate, minDate, maxDate } =\n getDatePickerContext(el);\n\n const selectedYear = calendarDate.getFullYear();\n const focusedYear = yearToDisplay == null ? selectedYear : yearToDisplay;\n\n let yearToChunk = focusedYear;\n yearToChunk -= yearToChunk % YEAR_CHUNK;\n yearToChunk = Math.max(0, yearToChunk);\n\n const prevYearChunkDisabled = isDatesYearOutsideMinOrMax(\n setYear(calendarDate, yearToChunk - 1),\n minDate,\n maxDate,\n );\n\n const nextYearChunkDisabled = isDatesYearOutsideMinOrMax(\n setYear(calendarDate, yearToChunk + YEAR_CHUNK),\n minDate,\n maxDate,\n );\n\n const years = [];\n let yearIndex = yearToChunk;\n while (years.length < YEAR_CHUNK) {\n const isDisabled = isDatesYearOutsideMinOrMax(\n setYear(calendarDate, yearIndex),\n minDate,\n maxDate,\n );\n\n let tabindex = \"-1\";\n\n const classes = [CALENDAR_YEAR_CLASS];\n const isSelected = yearIndex === selectedYear;\n\n if (yearIndex === focusedYear) {\n tabindex = \"0\";\n classes.push(CALENDAR_YEAR_FOCUSED_CLASS);\n }\n\n if (isSelected) {\n classes.push(CALENDAR_YEAR_SELECTED_CLASS);\n }\n\n const btn = document.createElement(\"button\");\n btn.setAttribute(\"type\", \"button\");\n btn.setAttribute(\"tabindex\", tabindex);\n btn.setAttribute(\"class\", classes.join(\" \"));\n btn.setAttribute(\"data-value\", yearIndex);\n btn.setAttribute(\"aria-selected\", isSelected ? \"true\" : \"false\");\n if (isDisabled === true) {\n btn.disabled = true;\n }\n btn.textContent = yearIndex;\n\n years.push(btn);\n yearIndex += 1;\n }\n\n const newCalendar = calendarEl.cloneNode();\n\n // create the years calendar wrapper\n const yearsCalendarWrapper = document.createElement(\"div\");\n yearsCalendarWrapper.setAttribute(\"tabindex\", \"-1\");\n yearsCalendarWrapper.setAttribute(\"class\", CALENDAR_YEAR_PICKER_CLASS);\n\n // create table parent\n const yearsTableParent = document.createElement(\"table\");\n yearsTableParent.setAttribute(\"class\", CALENDAR_TABLE_CLASS);\n\n // create table body and table row\n const yearsHTMLTableBody = document.createElement(\"tbody\");\n const yearsHTMLTableBodyRow = document.createElement(\"tr\");\n\n // create previous button\n const previousYearsBtn = document.createElement(\"button\");\n previousYearsBtn.setAttribute(\"type\", \"button\");\n previousYearsBtn.setAttribute(\"class\", CALENDAR_PREVIOUS_YEAR_CHUNK_CLASS);\n previousYearsBtn.setAttribute(\n \"aria-label\",\n `Navigate back ${YEAR_CHUNK} years`,\n );\n if (prevYearChunkDisabled === true) {\n previousYearsBtn.disabled = true;\n }\n previousYearsBtn.innerHTML = Sanitizer.escapeHTML` `;\n\n // create next button\n const nextYearsBtn = document.createElement(\"button\");\n nextYearsBtn.setAttribute(\"type\", \"button\");\n nextYearsBtn.setAttribute(\"class\", CALENDAR_NEXT_YEAR_CHUNK_CLASS);\n nextYearsBtn.setAttribute(\n \"aria-label\",\n `Navigate forward ${YEAR_CHUNK} years`,\n );\n if (nextYearChunkDisabled === true) {\n nextYearsBtn.disabled = true;\n }\n nextYearsBtn.innerHTML = Sanitizer.escapeHTML` `;\n\n // create the actual years table\n const yearsTable = document.createElement(\"table\");\n yearsTable.setAttribute(\"class\", CALENDAR_TABLE_CLASS);\n yearsTable.setAttribute(\"role\", \"presentation\");\n\n // create the years child table\n const yearsGrid = listToGridHtml(years, 3);\n const yearsTableBody = createTableBody(yearsGrid);\n\n // append the grid to the years child table\n yearsTable.insertAdjacentElement(\"beforeend\", yearsTableBody);\n\n // create the prev button td and append the prev button\n const yearsHTMLTableBodyDetailPrev = document.createElement(\"td\");\n yearsHTMLTableBodyDetailPrev.insertAdjacentElement(\n \"beforeend\",\n previousYearsBtn,\n );\n\n // create the years td and append the years child table\n const yearsHTMLTableBodyYearsDetail = document.createElement(\"td\");\n yearsHTMLTableBodyYearsDetail.setAttribute(\"colspan\", \"3\");\n yearsHTMLTableBodyYearsDetail.insertAdjacentElement(\"beforeend\", yearsTable);\n\n // create the next button td and append the next button\n const yearsHTMLTableBodyDetailNext = document.createElement(\"td\");\n yearsHTMLTableBodyDetailNext.insertAdjacentElement(\"beforeend\", nextYearsBtn);\n\n // append the three td to the years child table row\n yearsHTMLTableBodyRow.insertAdjacentElement(\n \"beforeend\",\n yearsHTMLTableBodyDetailPrev,\n );\n yearsHTMLTableBodyRow.insertAdjacentElement(\n \"beforeend\",\n yearsHTMLTableBodyYearsDetail,\n );\n yearsHTMLTableBodyRow.insertAdjacentElement(\n \"beforeend\",\n yearsHTMLTableBodyDetailNext,\n );\n\n // append the table row to the years child table body\n yearsHTMLTableBody.insertAdjacentElement(\"beforeend\", yearsHTMLTableBodyRow);\n\n // append the years table body to the years parent table\n yearsTableParent.insertAdjacentElement(\"beforeend\", yearsHTMLTableBody);\n\n // append the parent table to the calendar wrapper\n yearsCalendarWrapper.insertAdjacentElement(\"beforeend\", yearsTableParent);\n\n // append the years calender to the new calendar\n newCalendar.insertAdjacentElement(\"beforeend\", yearsCalendarWrapper);\n\n // replace calendar\n calendarEl.parentNode.replaceChild(newCalendar, calendarEl);\n\n statusEl.textContent = Sanitizer.escapeHTML`Showing years ${yearToChunk} to ${\n yearToChunk + YEAR_CHUNK - 1\n }. Select a year.`;\n\n return newCalendar;\n};\n\n/**\n * Navigate back by years and display the year selection screen.\n *\n * @param {HTMLButtonElement} el An element within the date picker component\n */\nconst displayPreviousYearChunk = (el) => {\n if (el.disabled) return;\n\n const { calendarEl, calendarDate, minDate, maxDate } =\n getDatePickerContext(el);\n const yearEl = calendarEl.querySelector(CALENDAR_YEAR_FOCUSED);\n const selectedYear = parseInt(yearEl.textContent, 10);\n\n let adjustedYear = selectedYear - YEAR_CHUNK;\n adjustedYear = Math.max(0, adjustedYear);\n\n const date = setYear(calendarDate, adjustedYear);\n const cappedDate = keepDateBetweenMinAndMax(date, minDate, maxDate);\n const newCalendar = displayYearSelection(\n calendarEl,\n cappedDate.getFullYear(),\n );\n\n let nextToFocus = newCalendar.querySelector(CALENDAR_PREVIOUS_YEAR_CHUNK);\n if (nextToFocus.disabled) {\n nextToFocus = newCalendar.querySelector(CALENDAR_YEAR_PICKER);\n }\n nextToFocus.focus();\n};\n\n/**\n * Navigate forward by years and display the year selection screen.\n *\n * @param {HTMLButtonElement} el An element within the date picker component\n */\nconst displayNextYearChunk = (el) => {\n if (el.disabled) return;\n\n const { calendarEl, calendarDate, minDate, maxDate } =\n getDatePickerContext(el);\n const yearEl = calendarEl.querySelector(CALENDAR_YEAR_FOCUSED);\n const selectedYear = parseInt(yearEl.textContent, 10);\n\n let adjustedYear = selectedYear + YEAR_CHUNK;\n adjustedYear = Math.max(0, adjustedYear);\n\n const date = setYear(calendarDate, adjustedYear);\n const cappedDate = keepDateBetweenMinAndMax(date, minDate, maxDate);\n const newCalendar = displayYearSelection(\n calendarEl,\n cappedDate.getFullYear(),\n );\n\n let nextToFocus = newCalendar.querySelector(CALENDAR_NEXT_YEAR_CHUNK);\n if (nextToFocus.disabled) {\n nextToFocus = newCalendar.querySelector(CALENDAR_YEAR_PICKER);\n }\n nextToFocus.focus();\n};\n\n/**\n * Select a year in the date picker component.\n *\n * @param {HTMLButtonElement} yearEl A year element within the date picker component\n */\nconst selectYear = (yearEl) => {\n if (yearEl.disabled) return;\n const { calendarEl, calendarDate, minDate, maxDate } =\n getDatePickerContext(yearEl);\n const selectedYear = parseInt(yearEl.innerHTML, 10);\n let date = setYear(calendarDate, selectedYear);\n date = keepDateBetweenMinAndMax(date, minDate, maxDate);\n const newCalendar = renderCalendar(calendarEl, date);\n newCalendar.querySelector(CALENDAR_DATE_FOCUSED).focus();\n};\n\n// #endregion Calendar - Year Selection View\n\n// #region Calendar Event Handling\n\n/**\n * Hide the calendar.\n *\n * @param {KeyboardEvent} event the keydown event\n */\nconst handleEscapeFromCalendar = (event) => {\n const { datePickerEl, externalInputEl } = getDatePickerContext(event.target);\n\n hideCalendar(datePickerEl);\n externalInputEl.focus();\n\n event.preventDefault();\n};\n\n// #endregion Calendar Event Handling\n\n// #region Calendar Date Event Handling\n\n/**\n * Adjust the date and display the calendar if needed.\n *\n * @param {function} adjustDateFn function that returns the adjusted date\n */\nconst adjustCalendar = (adjustDateFn) => (event) => {\n const { calendarEl, calendarDate, minDate, maxDate } = getDatePickerContext(\n event.target,\n );\n\n const date = adjustDateFn(calendarDate);\n\n const cappedDate = keepDateBetweenMinAndMax(date, minDate, maxDate);\n if (!isSameDay(calendarDate, cappedDate)) {\n const newCalendar = renderCalendar(calendarEl, cappedDate);\n newCalendar.querySelector(CALENDAR_DATE_FOCUSED).focus();\n }\n event.preventDefault();\n};\n\n/**\n * Navigate back one week and display the calendar.\n *\n * @param {KeyboardEvent} event the keydown event\n */\nconst handleUpFromDate = adjustCalendar((date) => subWeeks(date, 1));\n\n/**\n * Navigate forward one week and display the calendar.\n *\n * @param {KeyboardEvent} event the keydown event\n */\nconst handleDownFromDate = adjustCalendar((date) => addWeeks(date, 1));\n\n/**\n * Navigate back one day and display the calendar.\n *\n * @param {KeyboardEvent} event the keydown event\n */\nconst handleLeftFromDate = adjustCalendar((date) => subDays(date, 1));\n\n/**\n * Navigate forward one day and display the calendar.\n *\n * @param {KeyboardEvent} event the keydown event\n */\nconst handleRightFromDate = adjustCalendar((date) => addDays(date, 1));\n\n/**\n * Navigate to the start of the week and display the calendar.\n *\n * @param {KeyboardEvent} event the keydown event\n */\nconst handleHomeFromDate = adjustCalendar((date) => startOfWeek(date));\n\n/**\n * Navigate to the end of the week and display the calendar.\n *\n * @param {KeyboardEvent} event the keydown event\n */\nconst handleEndFromDate = adjustCalendar((date) => endOfWeek(date));\n\n/**\n * Navigate forward one month and display the calendar.\n *\n * @param {KeyboardEvent} event the keydown event\n */\nconst handlePageDownFromDate = adjustCalendar((date) => addMonths(date, 1));\n\n/**\n * Navigate back one month and display the calendar.\n *\n * @param {KeyboardEvent} event the keydown event\n */\nconst handlePageUpFromDate = adjustCalendar((date) => subMonths(date, 1));\n\n/**\n * Navigate forward one year and display the calendar.\n *\n * @param {KeyboardEvent} event the keydown event\n */\nconst handleShiftPageDownFromDate = adjustCalendar((date) => addYears(date, 1));\n\n/**\n * Navigate back one year and display the calendar.\n *\n * @param {KeyboardEvent} event the keydown event\n */\nconst handleShiftPageUpFromDate = adjustCalendar((date) => subYears(date, 1));\n\n/**\n * display the calendar for the mouseover date.\n *\n * @param {MouseEvent} event The mouseover event\n * @param {HTMLButtonElement} dateEl A date element within the date picker component\n */\nconst handleMouseoverFromDate = (dateEl) => {\n if (dateEl.disabled) return;\n\n const calendarEl = dateEl.closest(DATE_PICKER_CALENDAR);\n\n const currentCalendarDate = calendarEl.dataset.value;\n const hoverDate = dateEl.dataset.value;\n\n if (hoverDate === currentCalendarDate) return;\n\n const dateToDisplay = parseDateString(hoverDate);\n const newCalendar = renderCalendar(calendarEl, dateToDisplay);\n newCalendar.querySelector(CALENDAR_DATE_FOCUSED).focus();\n};\n\n// #endregion Calendar Date Event Handling\n\n// #region Calendar Month Event Handling\n\n/**\n * Adjust the month and display the month selection screen if needed.\n *\n * @param {function} adjustMonthFn function that returns the adjusted month\n */\nconst adjustMonthSelectionScreen = (adjustMonthFn) => (event) => {\n const monthEl = event.target;\n const selectedMonth = parseInt(monthEl.dataset.value, 10);\n const { calendarEl, calendarDate, minDate, maxDate } =\n getDatePickerContext(monthEl);\n const currentDate = setMonth(calendarDate, selectedMonth);\n\n let adjustedMonth = adjustMonthFn(selectedMonth);\n adjustedMonth = Math.max(0, Math.min(11, adjustedMonth));\n\n const date = setMonth(calendarDate, adjustedMonth);\n const cappedDate = keepDateBetweenMinAndMax(date, minDate, maxDate);\n if (!isSameMonth(currentDate, cappedDate)) {\n const newCalendar = displayMonthSelection(\n calendarEl,\n cappedDate.getMonth(),\n );\n newCalendar.querySelector(CALENDAR_MONTH_FOCUSED).focus();\n }\n event.preventDefault();\n};\n\n/**\n * Navigate back three months and display the month selection screen.\n *\n * @param {KeyboardEvent} event the keydown event\n */\nconst handleUpFromMonth = adjustMonthSelectionScreen((month) => month - 3);\n\n/**\n * Navigate forward three months and display the month selection screen.\n *\n * @param {KeyboardEvent} event the keydown event\n */\nconst handleDownFromMonth = adjustMonthSelectionScreen((month) => month + 3);\n\n/**\n * Navigate back one month and display the month selection screen.\n *\n * @param {KeyboardEvent} event the keydown event\n */\nconst handleLeftFromMonth = adjustMonthSelectionScreen((month) => month - 1);\n\n/**\n * Navigate forward one month and display the month selection screen.\n *\n * @param {KeyboardEvent} event the keydown event\n */\nconst handleRightFromMonth = adjustMonthSelectionScreen((month) => month + 1);\n\n/**\n * Navigate to the start of the row of months and display the month selection screen.\n *\n * @param {KeyboardEvent} event the keydown event\n */\nconst handleHomeFromMonth = adjustMonthSelectionScreen(\n (month) => month - (month % 3),\n);\n\n/**\n * Navigate to the end of the row of months and display the month selection screen.\n *\n * @param {KeyboardEvent} event the keydown event\n */\nconst handleEndFromMonth = adjustMonthSelectionScreen(\n (month) => month + 2 - (month % 3),\n);\n\n/**\n * Navigate to the last month (December) and display the month selection screen.\n *\n * @param {KeyboardEvent} event the keydown event\n */\nconst handlePageDownFromMonth = adjustMonthSelectionScreen(() => 11);\n\n/**\n * Navigate to the first month (January) and display the month selection screen.\n *\n * @param {KeyboardEvent} event the keydown event\n */\nconst handlePageUpFromMonth = adjustMonthSelectionScreen(() => 0);\n\n/**\n * update the focus on a month when the mouse moves.\n *\n * @param {MouseEvent} event The mouseover event\n * @param {HTMLButtonElement} monthEl A month element within the date picker component\n */\nconst handleMouseoverFromMonth = (monthEl) => {\n if (monthEl.disabled) return;\n if (monthEl.classList.contains(CALENDAR_MONTH_FOCUSED_CLASS)) return;\n\n const focusMonth = parseInt(monthEl.dataset.value, 10);\n\n const newCalendar = displayMonthSelection(monthEl, focusMonth);\n newCalendar.querySelector(CALENDAR_MONTH_FOCUSED).focus();\n};\n\n// #endregion Calendar Month Event Handling\n\n// #region Calendar Year Event Handling\n\n/**\n * Adjust the year and display the year selection screen if needed.\n *\n * @param {function} adjustYearFn function that returns the adjusted year\n */\nconst adjustYearSelectionScreen = (adjustYearFn) => (event) => {\n const yearEl = event.target;\n const selectedYear = parseInt(yearEl.dataset.value, 10);\n const { calendarEl, calendarDate, minDate, maxDate } =\n getDatePickerContext(yearEl);\n const currentDate = setYear(calendarDate, selectedYear);\n\n let adjustedYear = adjustYearFn(selectedYear);\n adjustedYear = Math.max(0, adjustedYear);\n\n const date = setYear(calendarDate, adjustedYear);\n const cappedDate = keepDateBetweenMinAndMax(date, minDate, maxDate);\n if (!isSameYear(currentDate, cappedDate)) {\n const newCalendar = displayYearSelection(\n calendarEl,\n cappedDate.getFullYear(),\n );\n newCalendar.querySelector(CALENDAR_YEAR_FOCUSED).focus();\n }\n event.preventDefault();\n};\n\n/**\n * Navigate back three years and display the year selection screen.\n *\n * @param {KeyboardEvent} event the keydown event\n */\nconst handleUpFromYear = adjustYearSelectionScreen((year) => year - 3);\n\n/**\n * Navigate forward three years and display the year selection screen.\n *\n * @param {KeyboardEvent} event the keydown event\n */\nconst handleDownFromYear = adjustYearSelectionScreen((year) => year + 3);\n\n/**\n * Navigate back one year and display the year selection screen.\n *\n * @param {KeyboardEvent} event the keydown event\n */\nconst handleLeftFromYear = adjustYearSelectionScreen((year) => year - 1);\n\n/**\n * Navigate forward one year and display the year selection screen.\n *\n * @param {KeyboardEvent} event the keydown event\n */\nconst handleRightFromYear = adjustYearSelectionScreen((year) => year + 1);\n\n/**\n * Navigate to the start of the row of years and display the year selection screen.\n *\n * @param {KeyboardEvent} event the keydown event\n */\nconst handleHomeFromYear = adjustYearSelectionScreen(\n (year) => year - (year % 3),\n);\n\n/**\n * Navigate to the end of the row of years and display the year selection screen.\n *\n * @param {KeyboardEvent} event the keydown event\n */\nconst handleEndFromYear = adjustYearSelectionScreen(\n (year) => year + 2 - (year % 3),\n);\n\n/**\n * Navigate to back 12 years and display the year selection screen.\n *\n * @param {KeyboardEvent} event the keydown event\n */\nconst handlePageUpFromYear = adjustYearSelectionScreen(\n (year) => year - YEAR_CHUNK,\n);\n\n/**\n * Navigate forward 12 years and display the year selection screen.\n *\n * @param {KeyboardEvent} event the keydown event\n */\nconst handlePageDownFromYear = adjustYearSelectionScreen(\n (year) => year + YEAR_CHUNK,\n);\n\n/**\n * update the focus on a year when the mouse moves.\n *\n * @param {MouseEvent} event The mouseover event\n * @param {HTMLButtonElement} dateEl A year element within the date picker component\n */\nconst handleMouseoverFromYear = (yearEl) => {\n if (yearEl.disabled) return;\n if (yearEl.classList.contains(CALENDAR_YEAR_FOCUSED_CLASS)) return;\n\n const focusYear = parseInt(yearEl.dataset.value, 10);\n\n const newCalendar = displayYearSelection(yearEl, focusYear);\n newCalendar.querySelector(CALENDAR_YEAR_FOCUSED).focus();\n};\n\n// #endregion Calendar Year Event Handling\n\n// #region Focus Handling Event Handling\n\nconst tabHandler = (focusable) => {\n const getFocusableContext = (el) => {\n const { calendarEl } = getDatePickerContext(el);\n const focusableElements = select(focusable, calendarEl);\n\n const firstTabIndex = 0;\n const lastTabIndex = focusableElements.length - 1;\n const firstTabStop = focusableElements[firstTabIndex];\n const lastTabStop = focusableElements[lastTabIndex];\n const focusIndex = focusableElements.indexOf(activeElement());\n\n const isLastTab = focusIndex === lastTabIndex;\n const isFirstTab = focusIndex === firstTabIndex;\n const isNotFound = focusIndex === -1;\n\n return {\n focusableElements,\n isNotFound,\n firstTabStop,\n isFirstTab,\n lastTabStop,\n isLastTab,\n };\n };\n\n return {\n tabAhead(event) {\n const { firstTabStop, isLastTab, isNotFound } = getFocusableContext(\n event.target,\n );\n\n if (isLastTab || isNotFound) {\n event.preventDefault();\n firstTabStop.focus();\n }\n },\n tabBack(event) {\n const { lastTabStop, isFirstTab, isNotFound } = getFocusableContext(\n event.target,\n );\n\n if (isFirstTab || isNotFound) {\n event.preventDefault();\n lastTabStop.focus();\n }\n },\n };\n};\n\nconst datePickerTabEventHandler = tabHandler(DATE_PICKER_FOCUSABLE);\nconst monthPickerTabEventHandler = tabHandler(MONTH_PICKER_FOCUSABLE);\nconst yearPickerTabEventHandler = tabHandler(YEAR_PICKER_FOCUSABLE);\n\n// #endregion Focus Handling Event Handling\n\n// #region Date Picker Event Delegation Registration / Component\n\nconst datePickerEvents = {\n [CLICK]: {\n [DATE_PICKER_BUTTON]() {\n toggleCalendar(this);\n },\n [CALENDAR_DATE]() {\n selectDate(this);\n },\n [CALENDAR_MONTH]() {\n selectMonth(this);\n },\n [CALENDAR_YEAR]() {\n selectYear(this);\n },\n [CALENDAR_PREVIOUS_MONTH]() {\n displayPreviousMonth(this);\n },\n [CALENDAR_NEXT_MONTH]() {\n displayNextMonth(this);\n },\n [CALENDAR_PREVIOUS_YEAR]() {\n displayPreviousYear(this);\n },\n [CALENDAR_NEXT_YEAR]() {\n displayNextYear(this);\n },\n [CALENDAR_PREVIOUS_YEAR_CHUNK]() {\n displayPreviousYearChunk(this);\n },\n [CALENDAR_NEXT_YEAR_CHUNK]() {\n displayNextYearChunk(this);\n },\n [CALENDAR_MONTH_SELECTION]() {\n const newCalendar = displayMonthSelection(this);\n newCalendar.querySelector(CALENDAR_MONTH_FOCUSED).focus();\n },\n [CALENDAR_YEAR_SELECTION]() {\n const newCalendar = displayYearSelection(this);\n newCalendar.querySelector(CALENDAR_YEAR_FOCUSED).focus();\n },\n },\n keyup: {\n [DATE_PICKER_CALENDAR](event) {\n const keydown = this.dataset.keydownKeyCode;\n if (`${event.keyCode}` !== keydown) {\n event.preventDefault();\n }\n },\n },\n keydown: {\n [DATE_PICKER_EXTERNAL_INPUT](event) {\n if (event.keyCode === ENTER_KEYCODE) {\n validateDateInput(this);\n }\n },\n [CALENDAR_DATE]: keymap({\n Up: handleUpFromDate,\n ArrowUp: handleUpFromDate,\n Down: handleDownFromDate,\n ArrowDown: handleDownFromDate,\n Left: handleLeftFromDate,\n ArrowLeft: handleLeftFromDate,\n Right: handleRightFromDate,\n ArrowRight: handleRightFromDate,\n Home: handleHomeFromDate,\n End: handleEndFromDate,\n PageDown: handlePageDownFromDate,\n PageUp: handlePageUpFromDate,\n \"Shift+PageDown\": handleShiftPageDownFromDate,\n \"Shift+PageUp\": handleShiftPageUpFromDate,\n Tab: datePickerTabEventHandler.tabAhead,\n }),\n [CALENDAR_DATE_PICKER]: keymap({\n Tab: datePickerTabEventHandler.tabAhead,\n \"Shift+Tab\": datePickerTabEventHandler.tabBack,\n }),\n [CALENDAR_MONTH]: keymap({\n Up: handleUpFromMonth,\n ArrowUp: handleUpFromMonth,\n Down: handleDownFromMonth,\n ArrowDown: handleDownFromMonth,\n Left: handleLeftFromMonth,\n ArrowLeft: handleLeftFromMonth,\n Right: handleRightFromMonth,\n ArrowRight: handleRightFromMonth,\n Home: handleHomeFromMonth,\n End: handleEndFromMonth,\n PageDown: handlePageDownFromMonth,\n PageUp: handlePageUpFromMonth,\n }),\n [CALENDAR_MONTH_PICKER]: keymap({\n Tab: monthPickerTabEventHandler.tabAhead,\n \"Shift+Tab\": monthPickerTabEventHandler.tabBack,\n }),\n [CALENDAR_YEAR]: keymap({\n Up: handleUpFromYear,\n ArrowUp: handleUpFromYear,\n Down: handleDownFromYear,\n ArrowDown: handleDownFromYear,\n Left: handleLeftFromYear,\n ArrowLeft: handleLeftFromYear,\n Right: handleRightFromYear,\n ArrowRight: handleRightFromYear,\n Home: handleHomeFromYear,\n End: handleEndFromYear,\n PageDown: handlePageDownFromYear,\n PageUp: handlePageUpFromYear,\n }),\n [CALENDAR_YEAR_PICKER]: keymap({\n Tab: yearPickerTabEventHandler.tabAhead,\n \"Shift+Tab\": yearPickerTabEventHandler.tabBack,\n }),\n [DATE_PICKER_CALENDAR](event) {\n this.dataset.keydownKeyCode = event.keyCode;\n },\n [DATE_PICKER](event) {\n const keyMap = keymap({\n Escape: handleEscapeFromCalendar,\n });\n\n keyMap(event);\n },\n },\n focusout: {\n [DATE_PICKER_EXTERNAL_INPUT]() {\n validateDateInput(this);\n },\n [DATE_PICKER](event) {\n if (!this.contains(event.relatedTarget)) {\n hideCalendar(this);\n }\n },\n },\n input: {\n [DATE_PICKER_EXTERNAL_INPUT]() {\n reconcileInputValues(this);\n updateCalendarIfVisible(this);\n },\n },\n};\n\nif (!isIosDevice()) {\n datePickerEvents.mouseover = {\n [CALENDAR_DATE_CURRENT_MONTH]() {\n handleMouseoverFromDate(this);\n },\n [CALENDAR_MONTH]() {\n handleMouseoverFromMonth(this);\n },\n [CALENDAR_YEAR]() {\n handleMouseoverFromYear(this);\n },\n };\n}\n\nconst datePicker = behavior(datePickerEvents, {\n init(root) {\n selectOrMatches(DATE_PICKER, root).forEach((datePickerEl) => {\n enhanceDatePicker(datePickerEl);\n });\n },\n getDatePickerContext,\n disable,\n ariaDisable,\n enable,\n isDateInputInvalid,\n setCalendarValue,\n validateDateInput,\n renderCalendar,\n updateCalendarIfVisible,\n});\n\n// #endregion Date Picker Event Delegation Registration / Component\n\nmodule.exports = datePicker;\n","const behavior = require(\"../../uswds-core/src/js/utils/behavior\");\nconst select = require(\"../../uswds-core/src/js/utils/select\");\nconst selectOrMatches = require(\"../../uswds-core/src/js/utils/select-or-matches\");\nconst { prefix: PREFIX } = require(\"../../uswds-core/src/js/config\");\nconst {\n getDatePickerContext,\n isDateInputInvalid,\n updateCalendarIfVisible,\n} = require(\"../../usa-date-picker/src/index\");\n\nconst DATE_PICKER_CLASS = `${PREFIX}-date-picker`;\nconst DATE_RANGE_PICKER_CLASS = `${PREFIX}-date-range-picker`;\nconst DATE_RANGE_PICKER_RANGE_START_CLASS = `${DATE_RANGE_PICKER_CLASS}__range-start`;\nconst DATE_RANGE_PICKER_RANGE_END_CLASS = `${DATE_RANGE_PICKER_CLASS}__range-end`;\n\nconst DATE_PICKER = `.${DATE_PICKER_CLASS}`;\nconst DATE_RANGE_PICKER = `.${DATE_RANGE_PICKER_CLASS}`;\nconst DATE_RANGE_PICKER_RANGE_START = `.${DATE_RANGE_PICKER_RANGE_START_CLASS}`;\nconst DATE_RANGE_PICKER_RANGE_END = `.${DATE_RANGE_PICKER_RANGE_END_CLASS}`;\n\nconst DEFAULT_MIN_DATE = \"0000-01-01\";\n\n/**\n * The properties and elements within the date range picker.\n * @typedef {Object} DateRangePickerContext\n * @property {HTMLElement} dateRangePickerEl\n * @property {HTMLElement} rangeStartEl\n * @property {HTMLElement} rangeEndEl\n */\n\n/**\n * Get an object of the properties and elements belonging directly to the given\n * date picker component.\n *\n * @param {HTMLElement} el the element within the date picker\n * @returns {DateRangePickerContext} elements\n */\nconst getDateRangePickerContext = (el) => {\n const dateRangePickerEl = el.closest(DATE_RANGE_PICKER);\n\n if (!dateRangePickerEl) {\n throw new Error(`Element is missing outer ${DATE_RANGE_PICKER}`);\n }\n\n const rangeStartEl = dateRangePickerEl.querySelector(\n DATE_RANGE_PICKER_RANGE_START,\n );\n const rangeEndEl = dateRangePickerEl.querySelector(\n DATE_RANGE_PICKER_RANGE_END,\n );\n\n return {\n dateRangePickerEl,\n rangeStartEl,\n rangeEndEl,\n };\n};\n\n/**\n * handle update from range start date picker\n *\n * @param {HTMLElement} el an element within the date range picker\n */\nconst handleRangeStartUpdate = (el) => {\n const { dateRangePickerEl, rangeStartEl, rangeEndEl } =\n getDateRangePickerContext(el);\n const { internalInputEl } = getDatePickerContext(rangeStartEl);\n const updatedDate = internalInputEl.value;\n\n if (updatedDate && !isDateInputInvalid(internalInputEl)) {\n rangeEndEl.dataset.minDate = updatedDate;\n rangeEndEl.dataset.rangeDate = updatedDate;\n rangeEndEl.dataset.defaultDate = updatedDate;\n } else {\n rangeEndEl.dataset.minDate = dateRangePickerEl.dataset.minDate || \"\";\n rangeEndEl.dataset.rangeDate = \"\";\n rangeEndEl.dataset.defaultDate = \"\";\n }\n\n updateCalendarIfVisible(rangeEndEl);\n};\n\n/**\n * handle update from range start date picker\n *\n * @param {HTMLElement} el an element within the date range picker\n */\nconst handleRangeEndUpdate = (el) => {\n const { dateRangePickerEl, rangeStartEl, rangeEndEl } =\n getDateRangePickerContext(el);\n const { internalInputEl } = getDatePickerContext(rangeEndEl);\n const updatedDate = internalInputEl.value;\n\n if (updatedDate && !isDateInputInvalid(internalInputEl)) {\n rangeStartEl.dataset.maxDate = updatedDate;\n rangeStartEl.dataset.rangeDate = updatedDate;\n rangeStartEl.dataset.defaultDate = updatedDate;\n } else {\n rangeStartEl.dataset.maxDate = dateRangePickerEl.dataset.maxDate || \"\";\n rangeStartEl.dataset.rangeDate = \"\";\n rangeStartEl.dataset.defaultDate = \"\";\n }\n\n updateCalendarIfVisible(rangeStartEl);\n};\n\n/**\n * Enhance an input with the date picker elements\n *\n * @param {HTMLElement} el The initial wrapping element of the date range picker component\n */\nconst enhanceDateRangePicker = (el) => {\n const dateRangePickerEl = el.closest(DATE_RANGE_PICKER);\n\n const [rangeStart, rangeEnd] = select(DATE_PICKER, dateRangePickerEl);\n\n if (!rangeStart) {\n throw new Error(\n `${DATE_RANGE_PICKER} is missing inner two '${DATE_PICKER}' elements`,\n );\n }\n\n if (!rangeEnd) {\n throw new Error(\n `${DATE_RANGE_PICKER} is missing second '${DATE_PICKER}' element`,\n );\n }\n\n rangeStart.classList.add(DATE_RANGE_PICKER_RANGE_START_CLASS);\n rangeEnd.classList.add(DATE_RANGE_PICKER_RANGE_END_CLASS);\n\n if (!dateRangePickerEl.dataset.minDate) {\n dateRangePickerEl.dataset.minDate = DEFAULT_MIN_DATE;\n }\n\n const { minDate } = dateRangePickerEl.dataset;\n rangeStart.dataset.minDate = minDate;\n rangeEnd.dataset.minDate = minDate;\n\n const { maxDate } = dateRangePickerEl.dataset;\n if (maxDate) {\n rangeStart.dataset.maxDate = maxDate;\n rangeEnd.dataset.maxDate = maxDate;\n }\n\n handleRangeStartUpdate(dateRangePickerEl);\n handleRangeEndUpdate(dateRangePickerEl);\n};\n\nconst dateRangePicker = behavior(\n {\n \"input change\": {\n [DATE_RANGE_PICKER_RANGE_START]() {\n handleRangeStartUpdate(this);\n },\n [DATE_RANGE_PICKER_RANGE_END]() {\n handleRangeEndUpdate(this);\n },\n },\n },\n {\n init(root) {\n selectOrMatches(DATE_RANGE_PICKER, root).forEach((dateRangePickerEl) => {\n enhanceDateRangePicker(dateRangePickerEl);\n });\n },\n },\n);\n\nmodule.exports = dateRangePicker;\n","const selectOrMatches = require(\"../../uswds-core/src/js/utils/select-or-matches\");\nconst behavior = require(\"../../uswds-core/src/js/utils/behavior\");\nconst Sanitizer = require(\"../../uswds-core/src/js/utils/sanitizer\");\nconst { prefix: PREFIX } = require(\"../../uswds-core/src/js/config\");\n\nconst DROPZONE_CLASS = `${PREFIX}-file-input`;\nconst DROPZONE = `.${DROPZONE_CLASS}`;\nconst INPUT_CLASS = `${PREFIX}-file-input__input`;\nconst TARGET_CLASS = `${PREFIX}-file-input__target`;\nconst INPUT = `.${INPUT_CLASS}`;\nconst BOX_CLASS = `${PREFIX}-file-input__box`;\nconst INSTRUCTIONS_CLASS = `${PREFIX}-file-input__instructions`;\nconst PREVIEW_CLASS = `${PREFIX}-file-input__preview`;\nconst PREVIEW_HEADING_CLASS = `${PREFIX}-file-input__preview-heading`;\nconst DISABLED_CLASS = `${PREFIX}-file-input--disabled`;\nconst CHOOSE_CLASS = `${PREFIX}-file-input__choose`;\nconst ACCEPTED_FILE_MESSAGE_CLASS = `${PREFIX}-file-input__accepted-files-message`;\nconst DRAG_TEXT_CLASS = `${PREFIX}-file-input__drag-text`;\nconst DRAG_CLASS = `${PREFIX}-file-input--drag`;\nconst LOADING_CLASS = \"is-loading\";\nconst INVALID_FILE_CLASS = \"has-invalid-file\";\nconst GENERIC_PREVIEW_CLASS_NAME = `${PREFIX}-file-input__preview-image`;\nconst GENERIC_PREVIEW_CLASS = `${GENERIC_PREVIEW_CLASS_NAME}--generic`;\nconst PDF_PREVIEW_CLASS = `${GENERIC_PREVIEW_CLASS_NAME}--pdf`;\nconst WORD_PREVIEW_CLASS = `${GENERIC_PREVIEW_CLASS_NAME}--word`;\nconst VIDEO_PREVIEW_CLASS = `${GENERIC_PREVIEW_CLASS_NAME}--video`;\nconst EXCEL_PREVIEW_CLASS = `${GENERIC_PREVIEW_CLASS_NAME}--excel`;\nconst SR_ONLY_CLASS = `${PREFIX}-sr-only`;\nconst SPACER_GIF =\n \"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\";\n\nlet TYPE_IS_VALID = Boolean(true); // logic gate for change listener\nlet DEFAULT_ARIA_LABEL_TEXT = \"\";\nlet DEFAULT_FILE_STATUS_TEXT = \"\";\n\n/**\n * The properties and elements within the file input.\n * @typedef {Object} FileInputContext\n * @property {HTMLDivElement} dropZoneEl\n * @property {HTMLInputElement} inputEl\n */\n\n/**\n * Get an object of the properties and elements belonging directly to the given\n * file input component.\n *\n * @param {HTMLElement} el the element within the file input\n * @returns {FileInputContext} elements\n */\nconst getFileInputContext = (el) => {\n const dropZoneEl = el.closest(DROPZONE);\n\n if (!dropZoneEl) {\n throw new Error(`Element is missing outer ${DROPZONE}`);\n }\n\n const inputEl = dropZoneEl.querySelector(INPUT);\n\n return {\n dropZoneEl,\n inputEl,\n };\n};\n\n/**\n * Disable the file input component\n *\n * @param {HTMLElement} el An element within the file input component\n */\nconst disable = (el) => {\n const { dropZoneEl, inputEl } = getFileInputContext(el);\n\n inputEl.disabled = true;\n dropZoneEl.classList.add(DISABLED_CLASS);\n};\n\n/**\n * Set aria-disabled attribute to file input component\n *\n * @param {HTMLElement} el An element within the file input component\n */\nconst ariaDisable = (el) => {\n const { dropZoneEl } = getFileInputContext(el);\n\n dropZoneEl.classList.add(DISABLED_CLASS);\n};\n\n/**\n * Enable the file input component\n *\n * @param {HTMLElement} el An element within the file input component\n */\nconst enable = (el) => {\n const { dropZoneEl, inputEl } = getFileInputContext(el);\n\n inputEl.disabled = false;\n dropZoneEl.classList.remove(DISABLED_CLASS);\n dropZoneEl.removeAttribute(\"aria-disabled\");\n};\n\n/**\n *\n * @param {String} s special characters\n * @returns {String} replaces specified values\n */\nconst replaceName = (s) => {\n const c = s.charCodeAt(0);\n if (c === 32) return \"-\";\n if (c >= 65 && c <= 90) return `img_${s.toLowerCase()}`;\n return `__${(\"000\", c.toString(16)).slice(-4)}`;\n};\n\n/**\n * Creates an ID name for each file that strips all invalid characters.\n * @param {String} name - name of the file added to file input (searchvalue)\n * @returns {String} same characters as the name with invalid chars removed (newvalue)\n */\nconst makeSafeForID = (name) => name.replace(/[^a-z0-9]/g, replaceName);\n\n// Takes a generated safe ID and creates a unique ID.\nconst createUniqueID = (name) =>\n `${name}-${Math.floor(Date.now().toString() / 1000)}`;\n\n/**\n * Determines if the singular or plural item label should be used\n * Determination is based on the presence of the `multiple` attribute\n *\n * @param {HTMLInputElement} fileInputEl - The input element.\n * @returns {HTMLDivElement} The singular or plural version of \"item\"\n */\nconst getItemsLabel = (fileInputEl) => {\n const acceptsMultiple = fileInputEl.hasAttribute(\"multiple\");\n const itemsLabel = acceptsMultiple ? \"files\" : \"file\";\n\n return itemsLabel;\n};\n\n/**\n * Scaffold the file input component with a parent wrapper and\n * Create a target area overlay for drag and drop functionality\n *\n * @param {HTMLInputElement} fileInputEl - The input element.\n * @returns {HTMLDivElement} The drag and drop target area.\n */\nconst createTargetArea = (fileInputEl) => {\n const fileInputParent = document.createElement(\"div\");\n const dropTarget = document.createElement(\"div\");\n const box = document.createElement(\"div\");\n\n // Adds class names and other attributes\n fileInputEl.classList.remove(DROPZONE_CLASS);\n fileInputEl.classList.add(INPUT_CLASS);\n fileInputParent.classList.add(DROPZONE_CLASS);\n box.classList.add(BOX_CLASS);\n dropTarget.classList.add(TARGET_CLASS);\n\n // Adds child elements to the DOM\n dropTarget.prepend(box);\n fileInputEl.parentNode.insertBefore(dropTarget, fileInputEl);\n fileInputEl.parentNode.insertBefore(fileInputParent, dropTarget);\n dropTarget.appendChild(fileInputEl);\n fileInputParent.appendChild(dropTarget);\n\n return dropTarget;\n};\n\n/**\n * Build the visible element with default interaction instructions.\n *\n * @param {HTMLInputElement} fileInputEl - The input element.\n * @returns {HTMLDivElement} The container for visible interaction instructions.\n */\nconst createVisibleInstructions = (fileInputEl) => {\n const fileInputParent = fileInputEl.closest(DROPZONE);\n const itemsLabel = getItemsLabel(fileInputEl);\n const instructions = document.createElement(\"div\");\n const dragText = `Drag ${itemsLabel} here or`;\n const chooseText = \"choose from folder\";\n\n // Create instructions text for aria-label\n DEFAULT_ARIA_LABEL_TEXT = `${dragText} ${chooseText}`;\n\n // Adds class names and other attributes\n instructions.classList.add(INSTRUCTIONS_CLASS);\n instructions.setAttribute(\"aria-hidden\", \"true\");\n\n // Add initial instructions for input usage\n fileInputEl.setAttribute(\"aria-label\", DEFAULT_ARIA_LABEL_TEXT);\n instructions.innerHTML = Sanitizer.escapeHTML`<span class=\"${DRAG_TEXT_CLASS}\">${dragText}</span> <span class=\"${CHOOSE_CLASS}\">${chooseText}</span>`;\n\n // Add the instructions element to the DOM\n fileInputEl.parentNode.insertBefore(instructions, fileInputEl);\n\n // IE11 and Edge do not support drop files on file inputs, so we've removed text that indicates that\n if (\n /rv:11.0/i.test(navigator.userAgent) ||\n /Edge\\/\\d./i.test(navigator.userAgent)\n ) {\n fileInputParent.querySelector(`.${DRAG_TEXT_CLASS}`).outerHTML = \"\";\n }\n\n return instructions;\n};\n\n/**\n * Build a screen reader-only message element that contains file status updates and\n * Create and set the default file status message\n *\n * @param {HTMLInputElement} fileInputEl - The input element.\n */\nconst createSROnlyStatus = (fileInputEl) => {\n const statusEl = document.createElement(\"div\");\n const itemsLabel = getItemsLabel(fileInputEl);\n const fileInputParent = fileInputEl.closest(DROPZONE);\n const fileInputTarget = fileInputEl.closest(`.${TARGET_CLASS}`);\n\n DEFAULT_FILE_STATUS_TEXT = `No ${itemsLabel} selected.`;\n\n // Adds class names and other attributes\n statusEl.classList.add(SR_ONLY_CLASS);\n statusEl.setAttribute(\"aria-live\", \"polite\");\n\n // Add initial file status message\n statusEl.textContent = DEFAULT_FILE_STATUS_TEXT;\n\n // Add the status element to the DOM\n fileInputParent.insertBefore(statusEl, fileInputTarget);\n};\n\n/**\n * Scaffold the component with all required elements\n *\n * @param {HTMLInputElement} fileInputEl - The original input element.\n */\nconst enhanceFileInput = (fileInputEl) => {\n const isInputDisabled =\n fileInputEl.hasAttribute(\"aria-disabled\") ||\n fileInputEl.hasAttribute(\"disabled\");\n const dropTarget = createTargetArea(fileInputEl);\n const instructions = createVisibleInstructions(fileInputEl);\n const { dropZoneEl } = getFileInputContext(fileInputEl);\n\n if (isInputDisabled) {\n dropZoneEl.classList.add(DISABLED_CLASS);\n } else {\n createSROnlyStatus(fileInputEl);\n }\n\n return { instructions, dropTarget };\n};\n\n/**\n * Removes image previews\n * We want to start with a clean list every time files are added to the file input\n *\n * @param {HTMLDivElement} dropTarget - The drag and drop target area.\n * @param {HTMLDivElement} instructions - The container for visible interaction instructions.\n */\nconst removeOldPreviews = (dropTarget, instructions) => {\n const filePreviews = dropTarget.querySelectorAll(`.${PREVIEW_CLASS}`);\n const currentPreviewHeading = dropTarget.querySelector(\n `.${PREVIEW_HEADING_CLASS}`,\n );\n const currentErrorMessage = dropTarget.querySelector(\n `.${ACCEPTED_FILE_MESSAGE_CLASS}`,\n );\n\n /**\n * finds the parent of the passed node and removes the child\n * @param {HTMLElement} node\n */\n const removeImages = (node) => {\n node.parentNode.removeChild(node);\n };\n\n // Remove the heading above the previews\n if (currentPreviewHeading) {\n currentPreviewHeading.outerHTML = \"\";\n }\n\n // Remove existing error messages\n if (currentErrorMessage) {\n currentErrorMessage.outerHTML = \"\";\n dropTarget.classList.remove(INVALID_FILE_CLASS);\n }\n\n // Get rid of existing previews if they exist, show instructions\n if (filePreviews !== null) {\n if (instructions) {\n instructions.removeAttribute(\"hidden\");\n }\n Array.prototype.forEach.call(filePreviews, removeImages);\n }\n};\n\n/**\n * Update the screen reader-only status message after interaction\n *\n * @param {HTMLDivElement} statusElement - The screen reader-only container for file status updates.\n * @param {Object} fileNames - The selected files found in the fileList object.\n * @param {Array} fileStore - The array of uploaded file names created from the fileNames object.\n */\nconst updateStatusMessage = (statusElement, fileNames, fileStore) => {\n const statusEl = statusElement;\n let statusMessage = DEFAULT_FILE_STATUS_TEXT;\n\n // If files added, update the status message with file name(s)\n if (fileNames.length === 1) {\n statusMessage = `You have selected the file: ${fileStore}`;\n } else if (fileNames.length > 1) {\n statusMessage = `You have selected ${\n fileNames.length\n } files: ${fileStore.join(\", \")}`;\n }\n\n // Add delay to encourage screen reader readout\n setTimeout(() => {\n statusEl.textContent = statusMessage;\n }, 1000);\n};\n\n/**\n * Show the preview heading, hide the initial instructions and\n * Update the aria-label with new instructions text\n *\n * @param {HTMLInputElement} fileInputEl - The input element.\n * @param {Object} fileNames - The selected files found in the fileList object.\n */\nconst addPreviewHeading = (fileInputEl, fileNames) => {\n const filePreviewsHeading = document.createElement(\"div\");\n const dropTarget = fileInputEl.closest(`.${TARGET_CLASS}`);\n const instructions = dropTarget.querySelector(`.${INSTRUCTIONS_CLASS}`);\n let changeItemText = \"Change file\";\n let previewHeadingText = \"\";\n\n if (fileNames.length === 1) {\n previewHeadingText = Sanitizer.escapeHTML`Selected file <span class=\"usa-file-input__choose\">${changeItemText}</span>`;\n } else if (fileNames.length > 1) {\n changeItemText = \"Change files\";\n previewHeadingText = Sanitizer.escapeHTML`${fileNames.length} files selected <span class=\"usa-file-input__choose\">${changeItemText}</span>`;\n }\n\n // Hides null state content and sets preview heading\n instructions.setAttribute(\"hidden\", \"true\");\n filePreviewsHeading.classList.add(PREVIEW_HEADING_CLASS);\n filePreviewsHeading.innerHTML = previewHeadingText;\n dropTarget.insertBefore(filePreviewsHeading, instructions);\n\n // Update aria label to match the visible action text\n fileInputEl.setAttribute(\"aria-label\", changeItemText);\n};\n\n/**\n * When new files are applied to file input, this function generates previews\n * and removes old ones.\n *\n * @param {event} e\n * @param {HTMLInputElement} fileInputEl - The input element.\n * @param {HTMLDivElement} instructions - The container for visible interaction instructions.\n * @param {HTMLDivElement} dropTarget - The drag and drop target area.\n */\n\nconst handleChange = (e, fileInputEl, instructions, dropTarget) => {\n const fileNames = e.target.files;\n const inputParent = dropTarget.closest(`.${DROPZONE_CLASS}`);\n const statusElement = inputParent.querySelector(`.${SR_ONLY_CLASS}`);\n const fileStore = [];\n\n // First, get rid of existing previews\n removeOldPreviews(dropTarget, instructions);\n\n // Then, iterate through files list and create previews\n for (let i = 0; i < fileNames.length; i += 1) {\n const reader = new FileReader();\n const fileName = fileNames[i].name;\n let imageId;\n\n // Push updated file names into the store array\n fileStore.push(fileName);\n\n // Starts with a loading image while preview is created\n reader.onloadstart = function createLoadingImage() {\n imageId = createUniqueID(makeSafeForID(fileName));\n\n instructions.insertAdjacentHTML(\n \"afterend\",\n Sanitizer.escapeHTML`<div class=\"${PREVIEW_CLASS}\" aria-hidden=\"true\">\n <img id=\"${imageId}\" src=\"${SPACER_GIF}\" alt=\"\" class=\"${GENERIC_PREVIEW_CLASS_NAME} ${LOADING_CLASS}\"/>${fileName}\n <div>`,\n );\n };\n\n // Not all files will be able to generate previews. In case this happens, we provide several types \"generic previews\" based on the file extension.\n reader.onloadend = function createFilePreview() {\n const previewImage = document.getElementById(imageId);\n if (fileName.indexOf(\".pdf\") > 0) {\n previewImage.setAttribute(\n \"onerror\",\n `this.onerror=null;this.src=\"${SPACER_GIF}\"; this.classList.add(\"${PDF_PREVIEW_CLASS}\")`,\n );\n } else if (\n fileName.indexOf(\".doc\") > 0 ||\n fileName.indexOf(\".pages\") > 0\n ) {\n previewImage.setAttribute(\n \"onerror\",\n `this.onerror=null;this.src=\"${SPACER_GIF}\"; this.classList.add(\"${WORD_PREVIEW_CLASS}\")`,\n );\n } else if (\n fileName.indexOf(\".xls\") > 0 ||\n fileName.indexOf(\".numbers\") > 0\n ) {\n previewImage.setAttribute(\n \"onerror\",\n `this.onerror=null;this.src=\"${SPACER_GIF}\"; this.classList.add(\"${EXCEL_PREVIEW_CLASS}\")`,\n );\n } else if (fileName.indexOf(\".mov\") > 0 || fileName.indexOf(\".mp4\") > 0) {\n previewImage.setAttribute(\n \"onerror\",\n `this.onerror=null;this.src=\"${SPACER_GIF}\"; this.classList.add(\"${VIDEO_PREVIEW_CLASS}\")`,\n );\n } else {\n previewImage.setAttribute(\n \"onerror\",\n `this.onerror=null;this.src=\"${SPACER_GIF}\"; this.classList.add(\"${GENERIC_PREVIEW_CLASS}\")`,\n );\n }\n\n // Removes loader and displays preview\n previewImage.classList.remove(LOADING_CLASS);\n previewImage.src = reader.result;\n };\n\n if (fileNames[i]) {\n reader.readAsDataURL(fileNames[i]);\n }\n }\n\n if (fileNames.length === 0) {\n // Reset input aria-label with default message\n fileInputEl.setAttribute(\"aria-label\", DEFAULT_ARIA_LABEL_TEXT);\n } else {\n addPreviewHeading(fileInputEl, fileNames);\n }\n\n updateStatusMessage(statusElement, fileNames, fileStore);\n};\n\n/**\n * When using an Accept attribute, invalid files will be hidden from\n * file browser, but they can still be dragged to the input. This\n * function prevents them from being dragged and removes error states\n * when correct files are added.\n *\n * @param {event} e\n * @param {HTMLInputElement} fileInputEl - The input element.\n * @param {HTMLDivElement} instructions - The container for visible interaction instructions.\n * @param {HTMLDivElement} dropTarget - The drag and drop target area.\n */\nconst preventInvalidFiles = (e, fileInputEl, instructions, dropTarget) => {\n const acceptedFilesAttr = fileInputEl.getAttribute(\"accept\");\n dropTarget.classList.remove(INVALID_FILE_CLASS);\n\n /**\n * We can probably move away from this once IE11 support stops, and replace\n * with a simple es `.includes`\n * check if element is in array\n * check if 1 or more alphabets are in string\n * if element is present return the position value and -1 otherwise\n * @param {Object} file\n * @param {String} value\n * @returns {Boolean}\n */\n const isIncluded = (file, value) => {\n let returnValue = false;\n const pos = file.indexOf(value);\n if (pos >= 0) {\n returnValue = true;\n }\n return returnValue;\n };\n\n // Runs if only specific files are accepted\n if (acceptedFilesAttr) {\n const acceptedFiles = acceptedFilesAttr.split(\",\");\n const errorMessage = document.createElement(\"div\");\n\n // If multiple files are dragged, this iterates through them and look for any files that are not accepted.\n let allFilesAllowed = true;\n const scannedFiles = e.target.files || e.dataTransfer.files;\n for (let i = 0; i < scannedFiles.length; i += 1) {\n const file = scannedFiles[i];\n if (allFilesAllowed) {\n for (let j = 0; j < acceptedFiles.length; j += 1) {\n const fileType = acceptedFiles[j];\n allFilesAllowed =\n file.name.indexOf(fileType) > 0 ||\n isIncluded(file.type, fileType.replace(/\\*/g, \"\"));\n if (allFilesAllowed) {\n TYPE_IS_VALID = true;\n break;\n }\n }\n } else break;\n }\n\n // If dragged files are not accepted, this removes them from the value of the input and creates and error state\n if (!allFilesAllowed) {\n removeOldPreviews(dropTarget, instructions);\n fileInputEl.value = \"\"; // eslint-disable-line no-param-reassign\n dropTarget.insertBefore(errorMessage, fileInputEl);\n errorMessage.textContent =\n fileInputEl.dataset.errormessage || `This is not a valid file type.`;\n errorMessage.classList.add(ACCEPTED_FILE_MESSAGE_CLASS);\n dropTarget.classList.add(INVALID_FILE_CLASS);\n TYPE_IS_VALID = false;\n e.preventDefault();\n e.stopPropagation();\n }\n }\n};\n\n/**\n * 1. passes through gate for preventing invalid files\n * 2. handles updates if file is valid\n *\n * @param {event} event\n * @param {HTMLInputElement} fileInputEl - The input element.\n * @param {HTMLDivElement} instructions - The container for visible interaction instructions.\n * @param {HTMLDivElement} dropTarget - The drag and drop target area.\n */\nconst handleUpload = (event, fileInputEl, instructions, dropTarget) => {\n preventInvalidFiles(event, fileInputEl, instructions, dropTarget);\n if (TYPE_IS_VALID === true) {\n handleChange(event, fileInputEl, instructions, dropTarget);\n }\n};\n\nconst fileInput = behavior(\n {},\n {\n init(root) {\n selectOrMatches(DROPZONE, root).forEach((fileInputEl) => {\n const { instructions, dropTarget } = enhanceFileInput(fileInputEl);\n\n dropTarget.addEventListener(\n \"dragover\",\n function handleDragOver() {\n this.classList.add(DRAG_CLASS);\n },\n false,\n );\n\n dropTarget.addEventListener(\n \"dragleave\",\n function handleDragLeave() {\n this.classList.remove(DRAG_CLASS);\n },\n false,\n );\n\n dropTarget.addEventListener(\n \"drop\",\n function handleDrop() {\n this.classList.remove(DRAG_CLASS);\n },\n false,\n );\n\n fileInputEl.addEventListener(\n \"change\",\n (e) => handleUpload(e, fileInputEl, instructions, dropTarget),\n false,\n );\n });\n },\n teardown(root) {\n selectOrMatches(INPUT, root).forEach((fileInputEl) => {\n const fileInputTopElement = fileInputEl.parentElement.parentElement;\n fileInputTopElement.parentElement.replaceChild(\n fileInputEl,\n fileInputTopElement,\n );\n // eslint-disable-next-line no-param-reassign\n fileInputEl.className = DROPZONE_CLASS;\n });\n },\n getFileInputContext,\n disable,\n ariaDisable,\n enable,\n },\n);\n\nmodule.exports = fileInput;\n","const behavior = require(\"../../uswds-core/src/js/utils/behavior\");\nconst { CLICK } = require(\"../../uswds-core/src/js/events\");\nconst { prefix: PREFIX } = require(\"../../uswds-core/src/js/config\");\n\nconst SCOPE = `.${PREFIX}-footer--big`;\nconst NAV = `${SCOPE} nav`;\nconst BUTTON = `${NAV} .${PREFIX}-footer__primary-link`;\nconst HIDE_MAX_WIDTH = 480;\n\n/**\n * Expands selected footer menu panel, while collapsing others\n */\nfunction showPanel() {\n if (window.innerWidth < HIDE_MAX_WIDTH) {\n const isOpen = this.getAttribute(\"aria-expanded\") === \"true\";\n const thisFooter = this.closest(SCOPE);\n\n // Close all other menus\n thisFooter.querySelectorAll(BUTTON).forEach((button) => {\n button.setAttribute(\"aria-expanded\", false);\n });\n\n this.setAttribute(\"aria-expanded\", !isOpen);\n }\n}\n\n/**\n * Swaps the <h4> element for a <button> element (and vice-versa) and sets id\n * of menu list\n *\n * @param {Boolean} isMobile - If the footer is in mobile configuration\n */\nfunction toggleHtmlTag(isMobile) {\n const bigFooter = document.querySelector(SCOPE);\n\n if (!bigFooter) {\n return;\n }\n\n const primaryLinks = bigFooter.querySelectorAll(BUTTON);\n\n primaryLinks.forEach((currentElement) => {\n const currentElementClasses = currentElement.getAttribute(\"class\");\n const preservedHtmlTag =\n currentElement.getAttribute(\"data-tag\") || currentElement.tagName;\n\n const newElementType = isMobile ? \"button\" : preservedHtmlTag;\n\n // Create the new element\n const newElement = document.createElement(newElementType);\n newElement.setAttribute(\"class\", currentElementClasses);\n newElement.classList.toggle(\n `${PREFIX}-footer__primary-link--button`,\n isMobile,\n );\n newElement.textContent = currentElement.textContent;\n\n if (isMobile) {\n newElement.setAttribute(\"data-tag\", currentElement.tagName);\n const menuId = `${PREFIX}-footer-menu-list-${Math.floor(\n Math.random() * 100000,\n )}`;\n\n newElement.setAttribute(\"aria-controls\", menuId);\n newElement.setAttribute(\"aria-expanded\", \"false\");\n currentElement.nextElementSibling.setAttribute(\"id\", menuId);\n newElement.setAttribute(\"type\", \"button\");\n }\n\n // Insert the new element and delete the old\n currentElement.after(newElement);\n currentElement.remove();\n });\n}\n\nconst resize = (event) => {\n toggleHtmlTag(event.matches);\n};\n\nmodule.exports = behavior(\n {\n [CLICK]: {\n [BUTTON]: showPanel,\n },\n },\n {\n // export for use elsewhere\n HIDE_MAX_WIDTH,\n\n init() {\n toggleHtmlTag(window.innerWidth < HIDE_MAX_WIDTH);\n this.mediaQueryList = window.matchMedia(\n `(max-width: ${HIDE_MAX_WIDTH - 0.1}px)`,\n );\n this.mediaQueryList.addListener(resize);\n },\n\n teardown() {\n this.mediaQueryList.removeListener(resize);\n },\n },\n);\n","const keymap = require(\"receptor/keymap\");\nconst behavior = require(\"../../uswds-core/src/js/utils/behavior\");\nconst select = require(\"../../uswds-core/src/js/utils/select\");\nconst toggle = require(\"../../uswds-core/src/js/utils/toggle\");\nconst FocusTrap = require(\"../../uswds-core/src/js/utils/focus-trap\");\nconst accordion = require(\"../../usa-accordion/src/index\");\nconst ScrollBarWidth = require(\"../../uswds-core/src/js/utils/scrollbar-width\");\n\nconst { CLICK } = require(\"../../uswds-core/src/js/events\");\nconst { prefix: PREFIX } = require(\"../../uswds-core/src/js/config\");\n\nconst BODY = \"body\";\nconst HEADER = `.${PREFIX}-header`;\nconst NAV = `.${PREFIX}-nav`;\nconst NAV_CONTAINER = `.${PREFIX}-nav-container`;\nconst NAV_PRIMARY = `.${PREFIX}-nav__primary`;\nconst NAV_PRIMARY_ITEM = `.${PREFIX}-nav__primary-item`;\nconst NAV_CONTROL = `button.${PREFIX}-nav__link`;\nconst NAV_LINKS = `${NAV} a`;\nconst NON_NAV_HIDDEN_ATTRIBUTE = `data-nav-hidden`;\nconst OPENERS = `.${PREFIX}-menu-btn`;\nconst CLOSE_BUTTON = `.${PREFIX}-nav__close`;\nconst OVERLAY = `.${PREFIX}-overlay`;\nconst CLOSERS = `${CLOSE_BUTTON}, .${PREFIX}-overlay`;\nconst TOGGLES = [NAV, OVERLAY].join(\", \");\nconst NON_NAV_ELEMENTS = `body *:not(${HEADER}, ${NAV_CONTAINER}, ${NAV}, ${NAV} *):not([aria-hidden])`;\nconst NON_NAV_HIDDEN = `[${NON_NAV_HIDDEN_ATTRIBUTE}]`;\n\nconst ACTIVE_CLASS = \"usa-js-mobile-nav--active\";\nconst VISIBLE_CLASS = \"is-visible\";\n\nlet navigation;\nlet navActive;\nlet nonNavElements;\n\nconst isActive = () => document.body.classList.contains(ACTIVE_CLASS);\n// Detect Safari\n// Note: Chrome also reports the Safari userAgent so this specifically excludes Chrome.\nconst isSafari =\n navigator.userAgent.includes(\"Safari\") &&\n !navigator.userAgent.includes(\"Chrome\");\nconst SCROLLBAR_WIDTH = ScrollBarWidth();\nconst INITIAL_PADDING = window\n .getComputedStyle(document.body)\n .getPropertyValue(\"padding-right\");\nconst TEMPORARY_PADDING = `${\n parseInt(INITIAL_PADDING.replace(/px/, \"\"), 10) +\n parseInt(SCROLLBAR_WIDTH.replace(/px/, \"\"), 10)\n}px`;\n\nconst hideNonNavItems = () => {\n const headerParent = document.querySelector(`${HEADER}`).parentNode;\n nonNavElements = document.querySelectorAll(NON_NAV_ELEMENTS);\n\n nonNavElements.forEach((nonNavElement) => {\n if (nonNavElement !== headerParent) {\n nonNavElement.setAttribute(\"aria-hidden\", true);\n nonNavElement.setAttribute(NON_NAV_HIDDEN_ATTRIBUTE, \"\");\n }\n });\n};\n\nconst showNonNavItems = () => {\n nonNavElements = document.querySelectorAll(NON_NAV_HIDDEN);\n\n if (!nonNavElements) {\n return;\n }\n\n // Remove aria-hidden from non-header elements\n nonNavElements.forEach((nonNavElement) => {\n nonNavElement.removeAttribute(\"aria-hidden\");\n nonNavElement.removeAttribute(NON_NAV_HIDDEN_ATTRIBUTE);\n });\n};\n\n// Toggle all non-header elements #3527.\nconst toggleNonNavItems = (active) => {\n if (active) {\n hideNonNavItems();\n } else {\n showNonNavItems();\n }\n};\n\n/**\n * Detect Safari and add body class for a Safari-only CSS bug fix.\n * More details in https://github.com/uswds/uswds/pull/5443\n */\nconst addSafariClass = () => {\n if (isSafari) {\n document.body.classList.add(\"is-safari\");\n }\n};\n\n/**\n * Set the value for the --scrolltop CSS var when the mobile menu is open.\n * This allows the CSS to lock the current scroll position in Safari\n * when overflow-y is set to scroll.\n * More details in https://github.com/uswds/uswds/pull/5443\n */\nconst setSafariScrollPosition = (body) => {\n const currentScrollPosition = `-${window.scrollY}px`;\n if (isSafari) {\n body.style.setProperty(\"--scrolltop\", currentScrollPosition);\n }\n};\n\nconst toggleNav = (active) => {\n const { body } = document;\n const safeActive = typeof active === \"boolean\" ? active : !isActive();\n\n setSafariScrollPosition(body);\n\n body.classList.toggle(ACTIVE_CLASS, safeActive);\n\n select(TOGGLES).forEach((el) =>\n el.classList.toggle(VISIBLE_CLASS, safeActive),\n );\n\n navigation.focusTrap.update(safeActive);\n\n const closeButton = body.querySelector(CLOSE_BUTTON);\n const menuButton = document.querySelector(OPENERS);\n\n body.style.paddingRight =\n body.style.paddingRight === TEMPORARY_PADDING\n ? INITIAL_PADDING\n : TEMPORARY_PADDING;\n\n toggleNonNavItems(safeActive);\n\n if (safeActive && closeButton) {\n // The mobile nav was just activated. Focus on the close button, which is\n // just before all the nav elements in the tab order.\n closeButton.focus();\n } else if (\n !safeActive &&\n menuButton &&\n getComputedStyle(menuButton).display !== \"none\"\n ) {\n // The mobile nav was just deactivated. We don't want the focus to\n // disappear into the void, so focus on the menu button if it's\n // visible (this may have been what the user was just focused on,\n // if they triggered the mobile nav by mistake).\n menuButton.focus();\n }\n\n return safeActive;\n};\n\nconst resize = () => {\n const closer = document.body.querySelector(CLOSE_BUTTON);\n\n if (isActive() && closer && closer.getBoundingClientRect().width === 0) {\n // When the mobile nav is active, and the close box isn't visible,\n // we know the user's viewport has been resized to be larger.\n // Let's make the page state consistent by deactivating the mobile nav.\n navigation.toggleNav.call(closer, false);\n }\n};\n\nconst onMenuClose = () => navigation.toggleNav.call(navigation, false);\n\nconst hideActiveNavDropdown = () => {\n if (!navActive) {\n return;\n }\n\n toggle(navActive, false);\n navActive = null;\n};\n\nconst focusNavButton = (event) => {\n const parentNavItem = event.target.closest(NAV_PRIMARY_ITEM);\n\n // Only shift focus if within dropdown\n if (!event.target.matches(NAV_CONTROL)) {\n const navControl = parentNavItem.querySelector(NAV_CONTROL);\n if (navControl) {\n navControl.focus();\n }\n }\n};\n\nconst handleEscape = (event) => {\n hideActiveNavDropdown();\n focusNavButton(event);\n};\n\nnavigation = behavior(\n {\n [CLICK]: {\n [NAV_CONTROL]() {\n // If another nav is open, close it\n if (navActive !== this) {\n hideActiveNavDropdown();\n }\n // store a reference to the last clicked nav link element, so we\n // can hide the dropdown if another element on the page is clicked\n if (!navActive) {\n navActive = this;\n toggle(navActive, true);\n }\n\n // Do this so the event handler on the body doesn't fire\n return false;\n },\n [BODY]: hideActiveNavDropdown,\n [OPENERS]: toggleNav,\n [CLOSERS]: toggleNav,\n [NAV_LINKS]() {\n // A navigation link has been clicked! We want to collapse any\n // hierarchical navigation UI it's a part of, so that the user\n // can focus on whatever they've just selected.\n\n // Some navigation links are inside accordions; when they're\n // clicked, we want to collapse those accordions.\n const acc = this.closest(accordion.ACCORDION);\n\n if (acc) {\n accordion.getButtons(acc).forEach((btn) => accordion.hide(btn));\n }\n\n // If the mobile navigation menu is active, we want to hide it.\n if (isActive()) {\n navigation.toggleNav.call(navigation, false);\n }\n },\n },\n keydown: {\n [NAV_PRIMARY]: keymap({ Escape: handleEscape }),\n },\n focusout: {\n [NAV_PRIMARY](event) {\n const nav = event.target.closest(NAV_PRIMARY);\n\n if (!nav.contains(event.relatedTarget)) {\n hideActiveNavDropdown();\n }\n },\n },\n },\n {\n init(root) {\n const trapContainer = root.matches(NAV) ? root : root.querySelector(NAV);\n\n if (trapContainer) {\n navigation.focusTrap = FocusTrap(trapContainer, {\n Escape: onMenuClose,\n });\n }\n\n addSafariClass();\n resize();\n window.addEventListener(\"resize\", resize, false);\n },\n teardown() {\n window.removeEventListener(\"resize\", resize, false);\n navActive = false;\n },\n focusTrap: null,\n toggleNav,\n },\n);\n\nmodule.exports = navigation;\n","const once = require(\"receptor/once\");\nconst keymap = require(\"receptor/keymap\");\nconst selectOrMatches = require(\"../../uswds-core/src/js/utils/select-or-matches\");\nconst behavior = require(\"../../uswds-core/src/js/utils/behavior\");\nconst { prefix: PREFIX } = require(\"../../uswds-core/src/js/config\");\nconst { CLICK } = require(\"../../uswds-core/src/js/events\");\nconst Sanitizer = require(\"../../uswds-core/src/js/utils/sanitizer\");\n\nconst CURRENT_CLASS = `${PREFIX}-current`;\nconst IN_PAGE_NAV_HEADINGS = \"h2 h3\";\nconst IN_PAGE_NAV_VALID_HEADINGS = [\"h1\", \"h2\", \"h3\", \"h4\", \"h5\", \"h6\"];\nconst IN_PAGE_NAV_TITLE_TEXT = \"On this page\";\nconst IN_PAGE_NAV_TITLE_HEADING_LEVEL = \"h4\";\nconst IN_PAGE_NAV_SCROLL_OFFSET = 0;\nconst IN_PAGE_NAV_ROOT_MARGIN = \"0px 0px 0px 0px\";\nconst IN_PAGE_NAV_THRESHOLD = \"1\";\nconst IN_PAGE_NAV_CLASS = `${PREFIX}-in-page-nav`;\nconst IN_PAGE_NAV_ANCHOR_CLASS = `${PREFIX}-anchor`;\nconst IN_PAGE_NAV_NAV_CLASS = `${IN_PAGE_NAV_CLASS}__nav`;\nconst IN_PAGE_NAV_LIST_CLASS = `${IN_PAGE_NAV_CLASS}__list`;\nconst IN_PAGE_NAV_ITEM_CLASS = `${IN_PAGE_NAV_CLASS}__item`;\nconst IN_PAGE_NAV_PRIMARY_ITEM_CLASS = `${IN_PAGE_NAV_ITEM_CLASS}--primary`;\nconst IN_PAGE_NAV_LINK_CLASS = `${IN_PAGE_NAV_CLASS}__link`;\nconst IN_PAGE_NAV_TITLE_CLASS = `${IN_PAGE_NAV_CLASS}__heading`;\nconst MAIN_ELEMENT = \"main\";\n\n/**\n * Set the active link state for the currently observed section\n *\n * @param {HTMLElement} el An element within the in-page nav component\n */\nconst setActive = (el) => {\n const allLinks = document.querySelectorAll(`.${IN_PAGE_NAV_LINK_CLASS}`);\n el.map((i) => {\n if (i.isIntersecting === true && i.intersectionRatio >= 1) {\n allLinks.forEach((link) => link.classList.remove(CURRENT_CLASS));\n document\n .querySelector(`a[href=\"#${i.target.id}\"]`)\n .classList.add(CURRENT_CLASS);\n return true;\n }\n return false;\n });\n};\n\n/**\n * Return an array of the designated heading types found in the designated content region.\n * Throw an error if an invalid header element is designated.\n *\n * @param {HTMLElement} selectedContentRegion The content region the component should pull headers from\n * @param {String} selectedHeadingTypes The list of heading types that should be included in the nav list\n *\n * @return {Array} - An array of designated heading types from the designated content region\n */\nconst createSectionHeadingsArray = (\n selectedContentRegion,\n selectedHeadingTypes,\n) => {\n // Convert designated headings list to an array\n const selectedHeadingTypesArray = selectedHeadingTypes.indexOf(\" \")\n ? selectedHeadingTypes.split(\" \")\n : selectedHeadingTypes;\n const contentRegion = document.querySelector(selectedContentRegion);\n\n selectedHeadingTypesArray.forEach((headingType) => {\n if (!IN_PAGE_NAV_VALID_HEADINGS.includes(headingType)) {\n throw new Error(\n `In-page navigation: data-heading-elements attribute defined with an invalid heading type: \"${headingType}\".\n Define the attribute with one or more of the following: \"${IN_PAGE_NAV_VALID_HEADINGS}\".\n Do not use commas or other punctuation in the attribute definition.`,\n );\n }\n });\n\n const sectionHeadingsArray = Array.from(\n contentRegion.querySelectorAll(selectedHeadingTypesArray),\n );\n\n return sectionHeadingsArray;\n};\n\n/**\n * Return an array of the visible headings from sectionHeadingsArray.\n * This function removes headings that are hidden with display:none or visibility:none style rules.\n * These items will be added to the component nav list.\n *\n * @param {HTMLElement} selectedContentRegion The content region the component should pull headers from\n * @param {String} selectedHeadingTypes The list of heading types that should be included in the nav list\n *\n * @return {Array} - An array of visible headings from the designated content region\n */\nconst getVisibleSectionHeadings = (\n selectedContentRegion,\n selectedHeadingTypes,\n) => {\n const sectionHeadings = createSectionHeadingsArray(\n selectedContentRegion,\n selectedHeadingTypes,\n );\n\n // Find all headings with hidden styling and remove them from the array\n const visibleSectionHeadings = sectionHeadings.filter((heading) => {\n const headingStyle = window.getComputedStyle(heading);\n const visibleHeading =\n headingStyle.getPropertyValue(\"display\") !== \"none\" &&\n headingStyle.getPropertyValue(\"visibility\") !== \"hidden\";\n\n return visibleHeading;\n });\n\n return visibleSectionHeadings;\n};\n\n/**\n * Return the highest-level header tag included in the link list\n *\n * @param {HTMLElement} sectionHeadings The array of headings selected for inclusion in the link list\n *\n * @return {tagName} - The tag name for the highest level of header in the link list\n */\n\nconst getTopLevelHeading = (sectionHeadings) => {\n const topHeading = sectionHeadings[0].tagName.toLowerCase();\n return topHeading;\n};\n\n/**\n * Return a node list of section anchor tags\n *\n * @return {HTMLElement[]} - An array of DOM nodes\n */\nconst getSectionAnchors = () => {\n const sectionAnchors = document.querySelectorAll(\n `.${IN_PAGE_NAV_ANCHOR_CLASS}`,\n );\n return sectionAnchors;\n};\n\n/**\n * Generates a unique ID for the given heading element.\n *\n * @param {HTMLHeadingElement} heading\n *\n * @return {string} - Unique ID\n */\nconst getHeadingId = (heading) => {\n const baseId = heading.textContent\n .toLowerCase()\n // Replace non-alphanumeric characters with dashes\n .replace(/[^a-z\\d]/g, \"-\")\n // Replace a sequence of two or more dashes with a single dash\n .replace(/-{2,}/g, \"-\")\n // Trim leading or trailing dash (there should only ever be one)\n .replace(/^-|-$/g, \"\");\n\n let id;\n let suffix = 0;\n do {\n id = baseId;\n\n // To avoid conflicts with existing IDs on the page, loop and append an\n // incremented suffix until a unique ID is found.\n suffix += 1;\n if (suffix > 1) {\n id += `-${suffix}`;\n }\n } while (document.getElementById(id));\n\n return id;\n};\n\n/**\n * Return a section id/anchor hash without the number sign\n *\n * @return {String} - Id value with the number sign removed\n */\nconst getSectionId = (value) => {\n let id;\n\n // Check if value is an event or element and get the cleaned up id\n if (value && value.nodeType === 1) {\n id = value.getAttribute(\"href\").replace(\"#\", \"\");\n } else {\n id = value.target.hash.replace(\"#\", \"\");\n }\n\n return id;\n};\n\n/**\n * Scroll smoothly to a section based on the passed in element\n *\n * @param {HTMLElement} - Id value with the number sign removed\n */\nconst handleScrollToSection = (el) => {\n const inPageNavEl = document.querySelector(`.${IN_PAGE_NAV_CLASS}`);\n const inPageNavScrollOffset =\n inPageNavEl.dataset.scrollOffset || IN_PAGE_NAV_SCROLL_OFFSET;\n\n window.scroll({\n behavior: \"smooth\",\n top: el.offsetTop - inPageNavScrollOffset,\n block: \"start\",\n });\n\n if (window.location.hash.slice(1) !== el.id) {\n window.history.pushState(null, \"\", `#${el.id}`);\n }\n};\n\n/**\n * Scrolls the page to the section corresponding to the current hash fragment, if one exists.\n */\nconst scrollToCurrentSection = () => {\n const hashFragment = window.location.hash.slice(1);\n if (hashFragment) {\n const anchorTag = document.getElementById(hashFragment);\n if (anchorTag) {\n handleScrollToSection(anchorTag);\n }\n }\n};\n\n/**\n * Create the in-page navigation component\n *\n * @param {HTMLElement} inPageNavEl The in-page nav element\n */\nconst createInPageNav = (inPageNavEl) => {\n const inPageNavTitleText = Sanitizer.escapeHTML`${\n inPageNavEl.dataset.titleText || IN_PAGE_NAV_TITLE_TEXT\n }`;\n const inPageNavTitleHeadingLevel = Sanitizer.escapeHTML`${\n inPageNavEl.dataset.titleHeadingLevel || IN_PAGE_NAV_TITLE_HEADING_LEVEL\n }`;\n const inPageNavRootMargin = Sanitizer.escapeHTML`${\n inPageNavEl.dataset.rootMargin || IN_PAGE_NAV_ROOT_MARGIN\n }`;\n const inPageNavThreshold = Sanitizer.escapeHTML`${\n inPageNavEl.dataset.threshold || IN_PAGE_NAV_THRESHOLD\n }`;\n const inPageNavContentSelector = Sanitizer.escapeHTML`${\n inPageNavEl.dataset.mainContentSelector || MAIN_ELEMENT\n }`;\n const inPageNavHeadingSelector = Sanitizer.escapeHTML`${\n inPageNavEl.dataset.headingElements || IN_PAGE_NAV_HEADINGS\n }`;\n\n const options = {\n root: null,\n rootMargin: inPageNavRootMargin,\n threshold: [inPageNavThreshold],\n };\n\n const sectionHeadings = getVisibleSectionHeadings(\n inPageNavContentSelector,\n inPageNavHeadingSelector,\n );\n const inPageNav = document.createElement(\"nav\");\n inPageNav.setAttribute(\"aria-label\", inPageNavTitleText);\n inPageNav.classList.add(IN_PAGE_NAV_NAV_CLASS);\n\n const inPageNavTitle = document.createElement(inPageNavTitleHeadingLevel);\n inPageNavTitle.classList.add(IN_PAGE_NAV_TITLE_CLASS);\n inPageNavTitle.setAttribute(\"tabindex\", \"0\");\n inPageNavTitle.textContent = inPageNavTitleText;\n inPageNav.appendChild(inPageNavTitle);\n\n const inPageNavList = document.createElement(\"ul\");\n inPageNavList.classList.add(IN_PAGE_NAV_LIST_CLASS);\n inPageNav.appendChild(inPageNavList);\n\n sectionHeadings.forEach((el) => {\n const listItem = document.createElement(\"li\");\n const navLinks = document.createElement(\"a\");\n const anchorTag = document.createElement(\"a\");\n const textContentOfLink = el.textContent;\n const tag = el.tagName.toLowerCase();\n const topHeadingLevel = getTopLevelHeading(sectionHeadings);\n const headingId = getHeadingId(el);\n\n listItem.classList.add(IN_PAGE_NAV_ITEM_CLASS);\n\n if (tag === topHeadingLevel) {\n listItem.classList.add(IN_PAGE_NAV_PRIMARY_ITEM_CLASS);\n }\n\n navLinks.setAttribute(\"href\", `#${headingId}`);\n navLinks.setAttribute(\"class\", IN_PAGE_NAV_LINK_CLASS);\n navLinks.textContent = textContentOfLink;\n\n anchorTag.setAttribute(\"id\", headingId);\n anchorTag.setAttribute(\"class\", IN_PAGE_NAV_ANCHOR_CLASS);\n el.insertAdjacentElement(\"afterbegin\", anchorTag);\n\n inPageNavList.appendChild(listItem);\n listItem.appendChild(navLinks);\n });\n\n inPageNavEl.appendChild(inPageNav);\n\n const anchorTags = getSectionAnchors();\n const observeSections = new window.IntersectionObserver(setActive, options);\n\n anchorTags.forEach((tag) => {\n observeSections.observe(tag);\n });\n};\n\n/**\n * Handle click from link\n *\n * @param {HTMLElement} el An element within the in-page nav component\n */\nconst handleClickFromLink = (el) => {\n const elementToScrollTo = document.getElementById(el.hash.slice(1));\n handleScrollToSection(elementToScrollTo);\n};\n\n/**\n * Handle the enter event from a link within the in-page nav component\n *\n * @param {KeyboardEvent} event An event within the in-page nav component\n */\nconst handleEnterFromLink = (event) => {\n const id = getSectionId(event);\n const targetAnchor = document.getElementById(id);\n const target = targetAnchor.parentElement;\n\n if (target) {\n target.setAttribute(\"tabindex\", 0);\n target.focus();\n target.addEventListener(\n \"blur\",\n once(() => {\n target.setAttribute(\"tabindex\", -1);\n }),\n );\n } else {\n // throw an error?\n }\n handleScrollToSection(targetAnchor);\n};\n\nconst inPageNavigation = behavior(\n {\n [CLICK]: {\n [`.${IN_PAGE_NAV_LINK_CLASS}`](event) {\n event.preventDefault();\n if (this.disabled) return;\n handleClickFromLink(this);\n },\n },\n keydown: {\n [`.${IN_PAGE_NAV_LINK_CLASS}`]: keymap({\n Enter: handleEnterFromLink,\n }),\n },\n },\n {\n init(root) {\n selectOrMatches(`.${IN_PAGE_NAV_CLASS}`, root).forEach((inPageNavEl) => {\n createInPageNav(inPageNavEl);\n scrollToCurrentSection();\n });\n },\n },\n);\n\nmodule.exports = inPageNavigation;\n","const selectOrMatches = require(\"../../uswds-core/src/js/utils/select-or-matches\");\nconst behavior = require(\"../../uswds-core/src/js/utils/behavior\");\nconst { prefix: PREFIX } = require(\"../../uswds-core/src/js/config\");\n\nconst MASKED_CLASS = `${PREFIX}-masked`;\nconst MASKED = `.${MASKED_CLASS}`;\nconst MASK = `${PREFIX}-input-mask`;\nconst MASK_CONTENT = `${MASK}--content`;\nconst PLACEHOLDER = \"placeholder\";\n\n// User defined Values\nconst maskedNumber = \"_#dDmMyY9\";\nconst maskedLetter = \"A\";\n\n// replaces each masked input with a shell containing the input and it's mask.\nconst createMaskedInputShell = (input) => {\n const placeholder = input.getAttribute(`${PLACEHOLDER}`);\n if (placeholder) {\n input.setAttribute(\"maxlength\", placeholder.length);\n input.setAttribute(\"data-placeholder\", placeholder);\n input.removeAttribute(`${PLACEHOLDER}`);\n } else {\n return;\n }\n\n const shell = document.createElement(\"span\");\n shell.classList.add(MASK);\n shell.setAttribute(\"data-mask\", placeholder);\n\n const content = document.createElement(\"span\");\n content.classList.add(MASK_CONTENT);\n content.setAttribute(\"aria-hidden\", \"true\");\n content.id = `${input.id}Mask`;\n content.textContent = placeholder;\n\n shell.appendChild(content);\n input.parentNode.insertBefore(shell, input);\n shell.appendChild(input);\n};\n\nconst setValueOfMask = (el) => {\n const { value } = el;\n const placeholderVal = `${el.dataset.placeholder.substr(value.length)}`;\n\n const theIEl = document.createElement(\"i\");\n theIEl.textContent = value;\n return [theIEl, placeholderVal];\n};\n\nconst strippedValue = (isCharsetPresent, value) =>\n isCharsetPresent ? value.replace(/\\W/g, \"\") : value.replace(/\\D/g, \"\");\n\nconst isInteger = (value) => !Number.isNaN(parseInt(value, 10));\n\nconst isLetter = (value) => (value ? value.match(/[A-Z]/i) : false);\n\nconst handleCurrentValue = (el) => {\n const isCharsetPresent = el.dataset.charset;\n const placeholder = isCharsetPresent || el.dataset.placeholder;\n const { value } = el;\n const len = placeholder.length;\n let newValue = \"\";\n let i;\n let charIndex;\n\n const strippedVal = strippedValue(isCharsetPresent, value);\n\n for (i = 0, charIndex = 0; i < len; i += 1) {\n const isInt = isInteger(strippedVal[charIndex]);\n const isLet = isLetter(strippedVal[charIndex]);\n const matchesNumber = maskedNumber.indexOf(placeholder[i]) >= 0;\n const matchesLetter = maskedLetter.indexOf(placeholder[i]) >= 0;\n\n if (\n (matchesNumber && isInt) ||\n (isCharsetPresent && matchesLetter && isLet)\n ) {\n newValue += strippedVal[charIndex];\n charIndex += 1;\n } else if (\n (!isCharsetPresent && !isInt && matchesNumber) ||\n (isCharsetPresent &&\n ((matchesLetter && !isLet) || (matchesNumber && !isInt)))\n ) {\n return newValue;\n } else {\n newValue += placeholder[i];\n }\n // break if no characters left and the pattern is non-special character\n if (strippedVal[charIndex] === undefined) {\n break;\n }\n }\n\n return newValue;\n};\n\nconst handleValueChange = (el) => {\n const inputEl = el;\n const id = inputEl.getAttribute(\"id\");\n inputEl.value = handleCurrentValue(inputEl);\n\n const maskVal = setValueOfMask(el);\n const maskEl = document.getElementById(`${id}Mask`);\n maskEl.textContent = \"\";\n maskEl.replaceChildren(maskVal[0], maskVal[1]);\n};\n\nconst inputMaskEvents = {\n keyup: {\n [MASKED]() {\n handleValueChange(this);\n },\n },\n};\n\nconst inputMask = behavior(inputMaskEvents, {\n init(root) {\n selectOrMatches(MASKED, root).forEach((maskedInput) => {\n createMaskedInputShell(maskedInput);\n });\n },\n});\n\nmodule.exports = inputMask;\n","const keymap = require(\"receptor/keymap\");\nconst behavior = require(\"../../uswds-core/src/js/utils/behavior\");\nconst toggle = require(\"../../uswds-core/src/js/utils/toggle\");\nconst FocusTrap = require(\"../../uswds-core/src/js/utils/focus-trap\");\nconst accordion = require(\"../../usa-accordion/src/index\");\n\nconst { CLICK } = require(\"../../uswds-core/src/js/events\");\nconst { prefix: PREFIX } = require(\"../../uswds-core/src/js/config\");\n\nconst BODY = \"body\";\nconst LANGUAGE = `.${PREFIX}-language`;\nconst LANGUAGE_SUB = `.${PREFIX}-language__submenu`;\nconst LANGUAGE_PRIMARY = `.${PREFIX}-language__primary`;\nconst LANGUAGE_PRIMARY_ITEM = `.${PREFIX}-language__primary-item`;\nconst LANGUAGE_CONTROL = `button.${PREFIX}-language__link`;\nconst LANGUAGE_LINKS = `${LANGUAGE} a`;\n\nlet languageSelector;\nlet languageActive;\n\nconst onLanguageClose = () =>\n languageSelector.toggleLanguage.call(languageSelector, false);\n\nconst hideActiveLanguageDropdown = () => {\n if (!languageActive) {\n return;\n }\n\n toggle(languageActive, false);\n languageActive = null;\n};\n\nconst focusLanguageButton = (event) => {\n const parentLanguageItem = event.target.closest(LANGUAGE_PRIMARY_ITEM);\n\n if (!event.target.matches(LANGUAGE_CONTROL)) {\n parentLanguageItem.querySelector(LANGUAGE_CONTROL).focus();\n }\n};\n\nconst handleEscape = (event) => {\n hideActiveLanguageDropdown();\n focusLanguageButton(event);\n};\n\nlanguageSelector = behavior(\n {\n [CLICK]: {\n [LANGUAGE_CONTROL]() {\n if (languageActive !== this) {\n hideActiveLanguageDropdown();\n }\n if (languageActive === this) {\n hideActiveLanguageDropdown();\n return false;\n }\n if (!languageActive) {\n languageActive = this;\n toggle(languageActive, true);\n }\n\n return false;\n },\n [BODY]: hideActiveLanguageDropdown,\n [LANGUAGE_LINKS]() {\n const acc = this.closest(accordion.ACCORDION);\n\n if (acc) {\n accordion.getButtons(acc).forEach((btn) => accordion.hide(btn));\n }\n },\n },\n keydown: {\n [LANGUAGE_PRIMARY]: keymap({ Escape: handleEscape }),\n },\n focusout: {\n [LANGUAGE_PRIMARY](event) {\n const language = event.target.closest(LANGUAGE_PRIMARY);\n\n if (!language.contains(event.relatedTarget)) {\n hideActiveLanguageDropdown();\n }\n },\n },\n },\n {\n init(root) {\n const trapContainer = root.matches(LANGUAGE_SUB)\n ? root\n : root.querySelector(LANGUAGE_SUB);\n\n if (trapContainer) {\n languageSelector.focusTrap = FocusTrap(trapContainer, {\n Escape: onLanguageClose,\n });\n }\n },\n teardown() {\n languageActive = false;\n },\n focusTrap: null,\n },\n);\n\nmodule.exports = languageSelector;\n","const selectOrMatches = require(\"../../uswds-core/src/js/utils/select-or-matches\");\nconst FocusTrap = require(\"../../uswds-core/src/js/utils/focus-trap\");\nconst ScrollBarWidth = require(\"../../uswds-core/src/js/utils/scrollbar-width\");\nconst behavior = require(\"../../uswds-core/src/js/utils/behavior\");\n\nconst { prefix: PREFIX } = require(\"../../uswds-core/src/js/config\");\n\nconst MODAL_CLASSNAME = `${PREFIX}-modal`;\nconst OVERLAY_CLASSNAME = `${MODAL_CLASSNAME}-overlay`;\nconst WRAPPER_CLASSNAME = `${MODAL_CLASSNAME}-wrapper`;\nconst OPENER_ATTRIBUTE = \"data-open-modal\";\nconst CLOSER_ATTRIBUTE = \"data-close-modal\";\nconst FORCE_ACTION_ATTRIBUTE = \"data-force-action\";\nconst NON_MODAL_HIDDEN_ATTRIBUTE = `data-modal-hidden`;\nconst MODAL = `.${MODAL_CLASSNAME}`;\nconst INITIAL_FOCUS = `.${WRAPPER_CLASSNAME} *[data-focus]`;\nconst CLOSE_BUTTON = `${WRAPPER_CLASSNAME} *[${CLOSER_ATTRIBUTE}]`;\nconst OPENERS = `*[${OPENER_ATTRIBUTE}][aria-controls]`;\nconst CLOSERS = `${CLOSE_BUTTON}, .${OVERLAY_CLASSNAME}:not([${FORCE_ACTION_ATTRIBUTE}])`;\nconst NON_MODALS = `body > *:not(.${WRAPPER_CLASSNAME}):not([aria-hidden])`;\nconst NON_MODALS_HIDDEN = `[${NON_MODAL_HIDDEN_ATTRIBUTE}]`;\n\nconst ACTIVE_CLASS = \"usa-js-modal--active\";\nconst PREVENT_CLICK_CLASS = \"usa-js-no-click\";\nconst VISIBLE_CLASS = \"is-visible\";\nconst HIDDEN_CLASS = \"is-hidden\";\n\nlet modal;\nlet INITIAL_BODY_PADDING;\nlet TEMPORARY_BODY_PADDING;\n\nconst isActive = () => document.body.classList.contains(ACTIVE_CLASS);\nconst SCROLLBAR_WIDTH = ScrollBarWidth();\n\n/**\n * Closes modal when bound to a button and pressed.\n */\nconst onMenuClose = () => {\n modal.toggleModal.call(modal, false);\n};\n\n/**\n * Set the value for temporary body padding that will be applied when the modal is open.\n * Value is created by checking for initial body padding and adding the width of the scrollbar.\n */\nconst setTemporaryBodyPadding = () => {\n INITIAL_BODY_PADDING = window\n .getComputedStyle(document.body)\n .getPropertyValue(\"padding-right\");\n TEMPORARY_BODY_PADDING = `${\n parseInt(INITIAL_BODY_PADDING.replace(/px/, \"\"), 10) +\n parseInt(SCROLLBAR_WIDTH.replace(/px/, \"\"), 10)\n }px`;\n};\n\n/**\n * Toggle the visibility of a modal window\n *\n * @param {KeyboardEvent} event the keydown event.\n * @returns {boolean} safeActive if mobile is open.\n */\nfunction toggleModal(event) {\n let originalOpener;\n let clickedElement = event.target;\n const { body } = document;\n const safeActive = !isActive();\n const modalId = clickedElement\n ? clickedElement.getAttribute(\"aria-controls\")\n : document.querySelector(\".usa-modal-wrapper.is-visible\");\n const targetModal = safeActive\n ? document.getElementById(modalId)\n : document.querySelector(\".usa-modal-wrapper.is-visible\");\n\n // if there is no modal we return early\n if (!targetModal) {\n return false;\n }\n\n const openFocusEl = targetModal.querySelector(INITIAL_FOCUS)\n ? targetModal.querySelector(INITIAL_FOCUS)\n : targetModal.querySelector(\".usa-modal\");\n const returnFocus = document.getElementById(\n targetModal.getAttribute(\"data-opener\"),\n );\n const menuButton = body.querySelector(OPENERS);\n const forceUserAction = targetModal.getAttribute(FORCE_ACTION_ATTRIBUTE);\n\n // Sets the clicked element to the close button\n // so esc key always closes modal\n if (event.type === \"keydown\" && targetModal !== null) {\n clickedElement = targetModal.querySelector(CLOSE_BUTTON);\n }\n\n // When we're not hitting the escape key…\n if (clickedElement) {\n // Make sure we click the opener\n // If it doesn't have an ID, make one\n // Store id as data attribute on modal\n if (clickedElement.hasAttribute(OPENER_ATTRIBUTE)) {\n if (this.getAttribute(\"id\") === null) {\n originalOpener = `modal-${Math.floor(Math.random() * 900000) + 100000}`;\n this.setAttribute(\"id\", originalOpener);\n } else {\n originalOpener = this.getAttribute(\"id\");\n }\n targetModal.setAttribute(\"data-opener\", originalOpener);\n }\n\n // This basically stops the propagation if the element\n // is inside the modal and not a close button or\n // element inside a close button\n if (clickedElement.closest(`.${MODAL_CLASSNAME}`)) {\n if (\n clickedElement.hasAttribute(CLOSER_ATTRIBUTE) ||\n clickedElement.closest(`[${CLOSER_ATTRIBUTE}]`)\n ) {\n // do nothing. move on.\n } else {\n return false;\n }\n }\n }\n\n body.classList.toggle(ACTIVE_CLASS, safeActive);\n targetModal.classList.toggle(VISIBLE_CLASS, safeActive);\n targetModal.classList.toggle(HIDDEN_CLASS, !safeActive);\n\n // If user is forced to take an action, adding\n // a class to the body that prevents clicking underneath\n // overlay\n if (forceUserAction) {\n body.classList.toggle(PREVENT_CLICK_CLASS, safeActive);\n }\n\n // Temporarily increase body padding to include the width of the scrollbar.\n // This accounts for the content shift when the scrollbar is removed on modal open.\n if (body.style.paddingRight === TEMPORARY_BODY_PADDING) {\n body.style.removeProperty(\"padding-right\");\n } else {\n body.style.paddingRight = TEMPORARY_BODY_PADDING;\n }\n\n // Handle the focus actions\n if (safeActive && openFocusEl) {\n // The modal window is opened. Focus is set to close button.\n\n // Binds escape key if we're not forcing\n // the user to take an action\n if (forceUserAction) {\n modal.focusTrap = FocusTrap(targetModal);\n } else {\n modal.focusTrap = FocusTrap(targetModal, {\n Escape: onMenuClose,\n });\n }\n\n // Handles focus setting and interactions\n modal.focusTrap.update(safeActive);\n openFocusEl.focus();\n\n // Hides everything that is not the modal from screen readers\n document.querySelectorAll(NON_MODALS).forEach((nonModal) => {\n nonModal.setAttribute(\"aria-hidden\", \"true\");\n nonModal.setAttribute(NON_MODAL_HIDDEN_ATTRIBUTE, \"\");\n });\n } else if (!safeActive && menuButton && returnFocus) {\n // The modal window is closed.\n // Non-modals now accesible to screen reader\n document.querySelectorAll(NON_MODALS_HIDDEN).forEach((nonModal) => {\n nonModal.removeAttribute(\"aria-hidden\");\n nonModal.removeAttribute(NON_MODAL_HIDDEN_ATTRIBUTE);\n });\n\n // Focus is returned to the opener\n returnFocus.focus();\n modal.focusTrap.update(safeActive);\n }\n\n return safeActive;\n}\n\n/**\n * Creates a placeholder with data attributes for cleanup function.\n * The cleanup function uses this placeholder to easily restore the original Modal HTML on teardown.\n *\n * @param {HTMLDivElement} baseComponent - Modal HTML from the DOM.\n * @returns {HTMLDivElement} Placeholder used for cleanup function.\n */\nconst createPlaceHolder = (baseComponent) => {\n const modalID = baseComponent.getAttribute(\"id\");\n const originalLocationPlaceHolder = document.createElement(\"div\");\n const modalAttributes = Array.from(baseComponent.attributes);\n\n setTemporaryBodyPadding();\n\n originalLocationPlaceHolder.setAttribute(`data-placeholder-for`, modalID);\n originalLocationPlaceHolder.style.display = \"none\";\n originalLocationPlaceHolder.setAttribute(\"aria-hidden\", \"true\");\n\n modalAttributes.forEach((attribute) => {\n originalLocationPlaceHolder.setAttribute(\n `data-original-${attribute.name}`,\n attribute.value,\n );\n });\n\n return originalLocationPlaceHolder;\n};\n\n/**\n * Moves necessary attributes from Modal HTML to wrapper element.\n *\n * @param {HTMLDivElement} baseComponent - Modal HTML in the DOM.\n * @param {HTMLDivElement} modalContentWrapper - Modal component wrapper element.\n * @returns Modal wrapper with correct attributes.\n */\nconst setModalAttributes = (baseComponent, modalContentWrapper) => {\n const modalID = baseComponent.getAttribute(\"id\");\n const ariaLabelledBy = baseComponent.getAttribute(\"aria-labelledby\");\n const ariaDescribedBy = baseComponent.getAttribute(\"aria-describedby\");\n const forceUserAction = baseComponent.hasAttribute(FORCE_ACTION_ATTRIBUTE);\n\n if (!ariaLabelledBy)\n throw new Error(`${modalID} is missing aria-labelledby attribute`);\n\n if (!ariaDescribedBy)\n throw new Error(`${modalID} is missing aria-desribedby attribute`);\n\n // Set attributes\n modalContentWrapper.setAttribute(\"role\", \"dialog\");\n modalContentWrapper.setAttribute(\"id\", modalID);\n modalContentWrapper.setAttribute(\"aria-labelledby\", ariaLabelledBy);\n modalContentWrapper.setAttribute(\"aria-describedby\", ariaDescribedBy);\n\n if (forceUserAction) {\n modalContentWrapper.setAttribute(FORCE_ACTION_ATTRIBUTE, forceUserAction);\n }\n\n // Add aria-controls\n const modalClosers = modalContentWrapper.querySelectorAll(CLOSERS);\n modalClosers.forEach((el) => {\n el.setAttribute(\"aria-controls\", modalID);\n });\n\n // Update the base element HTML\n baseComponent.removeAttribute(\"id\");\n baseComponent.removeAttribute(\"aria-labelledby\");\n baseComponent.removeAttribute(\"aria-describedby\");\n baseComponent.setAttribute(\"tabindex\", \"-1\");\n\n return modalContentWrapper;\n};\n\n/**\n * Creates a hidden modal content wrapper.\n * Rebuilds the original Modal HTML in the new wrapper and adds a page overlay.\n * Then moves original Modal HTML attributes to the new wrapper.\n *\n * @param {HTMLDivElement} baseComponent - Original Modal HTML in the DOM.\n * @returns Modal component - Modal wrapper w/ nested Overlay and Modal Content.\n */\nconst rebuildModal = (baseComponent) => {\n const modalContent = baseComponent;\n const modalContentWrapper = document.createElement(\"div\");\n const overlayDiv = document.createElement(\"div\");\n\n // Add classes\n modalContentWrapper.classList.add(HIDDEN_CLASS, WRAPPER_CLASSNAME);\n overlayDiv.classList.add(OVERLAY_CLASSNAME);\n\n // Rebuild the modal element\n modalContentWrapper.append(overlayDiv);\n overlayDiv.append(modalContent);\n\n // Add attributes\n setModalAttributes(modalContent, modalContentWrapper);\n\n return modalContentWrapper;\n};\n\n/**\n * Builds modal window from base HTML and appends to the end of the DOM.\n *\n * @param {HTMLDivElement} baseComponent - The modal div element in the DOM.\n */\nconst setUpModal = (baseComponent) => {\n const modalID = baseComponent.getAttribute(\"id\");\n\n if (!modalID) {\n throw new Error(`Modal markup is missing ID`);\n }\n\n // Create placeholder where modal is for cleanup\n const originalLocationPlaceHolder = createPlaceHolder(baseComponent);\n baseComponent.after(originalLocationPlaceHolder);\n\n // Build modal component\n const modalComponent = rebuildModal(baseComponent);\n\n // Move all modals to the end of the DOM. Doing this allows us to\n // more easily find the elements to hide from screen readers\n // when the modal is open.\n document.body.appendChild(modalComponent);\n};\n\n/**\n * Removes dynamically created Modal and Wrapper elements and restores original Modal HTML.\n *\n * @param {HTMLDivElement} baseComponent - The modal div element in the DOM.\n */\nconst cleanUpModal = (baseComponent) => {\n const modalContent = baseComponent;\n const modalContentWrapper = modalContent.parentElement.parentElement;\n const modalID = modalContentWrapper.getAttribute(\"id\");\n\n // if there is no modalID, return early\n if (!modalID) {\n return;\n }\n\n const originalLocationPlaceHolder = document.querySelector(\n `[data-placeholder-for=\"${modalID}\"]`,\n );\n\n if (originalLocationPlaceHolder) {\n const modalAttributes = Array.from(originalLocationPlaceHolder.attributes);\n modalAttributes.forEach((attribute) => {\n if (attribute.name.startsWith(\"data-original-\")) {\n // data-original- is 14 long\n modalContent.setAttribute(attribute.name.substr(14), attribute.value);\n }\n });\n\n originalLocationPlaceHolder.after(modalContent);\n originalLocationPlaceHolder.parentElement.removeChild(\n originalLocationPlaceHolder,\n );\n }\n\n modalContentWrapper.parentElement.removeChild(modalContentWrapper);\n};\n\nmodal = behavior(\n {},\n {\n init(root) {\n selectOrMatches(MODAL, root).forEach((modalWindow) => {\n const modalId = modalWindow.id;\n\n setUpModal(modalWindow);\n\n // Query all openers and closers including the overlay\n selectOrMatches(`[aria-controls=\"${modalId}\"]`, document).forEach(\n (modalTrigger) => {\n // If modalTrigger is an anchor...\n if (modalTrigger.nodeName === \"A\") {\n // Turn anchor links into buttons for screen readers\n modalTrigger.setAttribute(\"role\", \"button\");\n\n // Prevent modal triggers from acting like links\n modalTrigger.addEventListener(\"click\", (e) => e.preventDefault());\n }\n\n // Can uncomment when aria-haspopup=\"dialog\" is supported\n // https://a11ysupport.io/tech/aria/aria-haspopup_attribute\n // Most screen readers support aria-haspopup, but might announce\n // as opening a menu if \"dialog\" is not supported.\n // modalTrigger.setAttribute(\"aria-haspopup\", \"dialog\");\n\n modalTrigger.addEventListener(\"click\", toggleModal);\n },\n );\n });\n },\n teardown(root) {\n selectOrMatches(MODAL, root).forEach((modalWindow) => {\n const modalId = modalWindow.id;\n cleanUpModal(modalWindow);\n\n selectOrMatches(`[aria-controls=\"${modalId}\"]`, document).forEach(\n (modalTrigger) =>\n modalTrigger.removeEventListener(\"click\", toggleModal),\n );\n });\n },\n focusTrap: null,\n toggleModal,\n },\n);\n\nmodule.exports = modal;\n","const selectOrMatches = require(\"../../uswds-core/src/js/utils/select-or-matches\");\nconst behavior = require(\"../../uswds-core/src/js/utils/behavior\");\n\nconst { prefix: PREFIX } = require(\"../../uswds-core/src/js/config\");\n\nconst RANGE_CLASSNAME = `${PREFIX}-range`;\nconst RANGE = `.${RANGE_CLASSNAME}`;\n\n/**\n * Update range callout for screen readers using the optional data attributes.\n *\n * Get optional data attributes, construct and appends aria-valuetext attribute.\n *\n * @example\n *\n * <input id=\"usa-range\" class=\"usa-range\" type=\"range\" min=\"0\" max=\"100\" step=\"10\" value=\"20\" data-text-unit=\"degrees\">\n *\n * Callout returns \"20 degrees of 100.\"\n *\n * <input id=\"usa-range\" class=\"usa-range\" type=\"range\" min=\"0\" max=\"100\" step=\"10\" value=\"20\" data-text-preposition=\"de\">\n *\n * Callout returns \"20 de 100.\"\n *\n * @param {HTMLInputElement} targetRange - The range slider input element\n */\nconst updateCallout = (targetRange) => {\n const rangeSlider = targetRange;\n const defaultPrep = \"of\";\n const optionalPrep = rangeSlider.dataset.textPreposition;\n const prep = optionalPrep || defaultPrep;\n const unit = rangeSlider.dataset.textUnit;\n const val = rangeSlider.value;\n // Note: 100 is the max attribute's native default value on range inputs\n // Reference: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/range#validation\n const max = rangeSlider.getAttribute(\"max\") || 100;\n\n let callout;\n\n if (unit) {\n callout = `${val} ${unit} ${prep} ${max}`;\n } else {\n callout = `${val} ${prep} ${max}`;\n }\n\n rangeSlider.setAttribute(\"aria-valuetext\", callout);\n};\n\nconst rangeEvents = {\n change: {\n [RANGE]() {\n updateCallout(this);\n },\n },\n};\n\nconst range = behavior(rangeEvents, {\n init(root) {\n selectOrMatches(RANGE, root).forEach((rangeSlider) => {\n updateCallout(rangeSlider);\n });\n },\n updateCallout,\n});\n\nmodule.exports = range;\n","const ignore = require(\"receptor/ignore\");\nconst behavior = require(\"../../uswds-core/src/js/utils/behavior\");\nconst select = require(\"../../uswds-core/src/js/utils/select\");\n\nconst { CLICK } = require(\"../../uswds-core/src/js/events\");\n\nconst BUTTON = \".js-search-button\";\nconst FORM = \".js-search-form\";\nconst INPUT = \"[type=search]\";\nconst CONTEXT = \"header\"; // XXX\n\nlet lastButton;\n\nconst getForm = (button) => {\n const context = button.closest(CONTEXT);\n return context ? context.querySelector(FORM) : document.querySelector(FORM);\n};\n\nconst toggleSearch = (button, active) => {\n const form = getForm(button);\n\n if (!form) {\n throw new Error(`No ${FORM} found for search toggle in ${CONTEXT}!`);\n }\n\n /* eslint-disable no-param-reassign */\n button.hidden = active;\n form.hidden = !active;\n /* eslint-enable */\n\n if (!active) {\n return;\n }\n\n const input = form.querySelector(INPUT);\n\n if (input) {\n input.focus();\n }\n // when the user clicks _outside_ of the form w/ignore(): hide the\n // search, then remove the listener\n const listener = ignore(form, () => {\n if (lastButton) {\n hideSearch.call(lastButton); // eslint-disable-line no-use-before-define\n }\n\n document.body.removeEventListener(CLICK, listener);\n });\n\n // Normally we would just run this code without a timeout, but\n // IE11 and Edge will actually call the listener *immediately* because\n // they are currently handling this exact type of event, so we'll\n // make sure the browser is done handling the current click event,\n // if any, before we attach the listener.\n setTimeout(() => {\n document.body.addEventListener(CLICK, listener);\n }, 0);\n};\n\nfunction showSearch() {\n toggleSearch(this, true);\n lastButton = this;\n}\n\nfunction hideSearch() {\n toggleSearch(this, false);\n lastButton = undefined;\n}\n\nconst search = behavior(\n {\n [CLICK]: {\n [BUTTON]: showSearch,\n },\n },\n {\n init(target) {\n select(BUTTON, target).forEach((button) => {\n toggleSearch(button, false);\n });\n },\n teardown() {\n // forget the last button clicked\n lastButton = undefined;\n },\n },\n);\n\nmodule.exports = search;\n","const once = require(\"receptor/once\");\nconst behavior = require(\"../../uswds-core/src/js/utils/behavior\");\nconst { CLICK } = require(\"../../uswds-core/src/js/events\");\nconst { prefix: PREFIX } = require(\"../../uswds-core/src/js/config\");\n\nconst LINK = `.${PREFIX}-skipnav[href^=\"#\"], .${PREFIX}-footer__return-to-top [href^=\"#\"]`;\nconst MAINCONTENT = \"main-content\";\n\nfunction setTabindex() {\n // NB: we know because of the selector we're delegating to below that the\n // href already begins with '#'\n const id = encodeURI(this.getAttribute(\"href\"));\n const target = document.getElementById(\n id === \"#\" ? MAINCONTENT : id.slice(1),\n );\n\n if (target) {\n target.style.outline = \"0\";\n target.setAttribute(\"tabindex\", 0);\n target.focus();\n target.addEventListener(\n \"blur\",\n once(() => {\n target.setAttribute(\"tabindex\", -1);\n }),\n );\n } else {\n // throw an error?\n }\n}\n\nmodule.exports = behavior({\n [CLICK]: {\n [LINK]: setTabindex,\n },\n});\n","const select = require(\"../../uswds-core/src/js/utils/select\");\nconst behavior = require(\"../../uswds-core/src/js/utils/behavior\");\nconst { CLICK } = require(\"../../uswds-core/src/js/events\");\nconst { prefix: PREFIX } = require(\"../../uswds-core/src/js/config\");\nconst Sanitizer = require(\"../../uswds-core/src/js/utils/sanitizer\");\n\nconst TABLE = `.${PREFIX}-table`;\nconst SORTED = \"aria-sort\";\nconst ASCENDING = \"ascending\";\nconst DESCENDING = \"descending\";\nconst SORT_OVERRIDE = \"data-sort-value\";\nconst SORT_BUTTON_CLASS = `${PREFIX}-table__header__button`;\nconst SORT_BUTTON = `.${SORT_BUTTON_CLASS}`;\nconst SORTABLE_HEADER = `th[data-sortable]`;\nconst ANNOUNCEMENT_REGION = `.${PREFIX}-table__announcement-region[aria-live=\"polite\"]`;\n\n/** Gets the data-sort-value attribute value, if provided — otherwise, gets\n * the innerText or textContent — of the child element (HTMLTableCellElement)\n * at the specified index of the given table row\n *\n * @param {number} index\n * @param {array<HTMLTableRowElement>} tr\n * @return {boolean}\n */\nconst getCellValue = (tr, index) =>\n tr.children[index].getAttribute(SORT_OVERRIDE) ||\n tr.children[index].innerText ||\n tr.children[index].textContent;\n\n/**\n * Compares the values of two row array items at the given index, then sorts by the given direction\n * @param {number} index\n * @param {string} direction\n * @return {boolean}\n */\nconst compareFunction = (index, isAscending) => (thisRow, nextRow) => {\n // get values to compare from data attribute or cell content\n const value1 = getCellValue(isAscending ? thisRow : nextRow, index);\n const value2 = getCellValue(isAscending ? nextRow : thisRow, index);\n\n // if neither value is empty, and if both values are already numbers, compare numerically\n if (\n value1 &&\n value2 &&\n !Number.isNaN(Number(value1)) &&\n !Number.isNaN(Number(value2))\n ) {\n return value1 - value2;\n }\n // Otherwise, compare alphabetically based on current user locale\n return value1.toString().localeCompare(value2, navigator.language, {\n numeric: true,\n ignorePunctuation: true,\n });\n};\n\n/**\n * Get an Array of column headers elements belonging directly to the given\n * table element.\n * @param {HTMLTableElement} table\n * @return {array<HTMLTableHeaderCellElement>}\n */\nconst getColumnHeaders = (table) => {\n const headers = select(SORTABLE_HEADER, table);\n return headers.filter((header) => header.closest(TABLE) === table);\n};\n\n/**\n * Update the button label within the given header element, resetting it\n * to the default state (ready to sort ascending) if it's no longer sorted\n * @param {HTMLTableHeaderCellElement} header\n */\nconst updateSortLabel = (header) => {\n const headerName = header.innerText;\n const sortedAscending = header.getAttribute(SORTED) === ASCENDING;\n const isSorted =\n header.getAttribute(SORTED) === ASCENDING ||\n header.getAttribute(SORTED) === DESCENDING ||\n false;\n const headerLabel = `${headerName}, sortable column, currently ${\n isSorted\n ? `${sortedAscending ? `sorted ${ASCENDING}` : `sorted ${DESCENDING}`}`\n : \"unsorted\"\n }`;\n const headerButtonLabel = `Click to sort by ${headerName} in ${\n sortedAscending ? DESCENDING : ASCENDING\n } order.`;\n header.setAttribute(\"aria-label\", headerLabel);\n header.querySelector(SORT_BUTTON).setAttribute(\"title\", headerButtonLabel);\n};\n\n/**\n * Remove the aria-sort attribute on the given header element, and reset the label and button icon\n * @param {HTMLTableHeaderCellElement} header\n */\nconst unsetSort = (header) => {\n header.removeAttribute(SORTED);\n updateSortLabel(header);\n};\n\n/**\n * Sort rows either ascending or descending, based on a given header's aria-sort attribute\n * @param {HTMLTableHeaderCellElement} header\n * @param {boolean} isAscending\n * @return {boolean} true\n */\nconst sortRows = (header, isAscending) => {\n header.setAttribute(SORTED, isAscending === true ? DESCENDING : ASCENDING);\n updateSortLabel(header);\n\n const tbody = header.closest(TABLE).querySelector(\"tbody\");\n\n // We can use Array.from() and Array.sort() instead once we drop IE11 support, likely in the summer of 2021\n //\n // Array.from(tbody.querySelectorAll('tr').sort(\n // compareFunction(\n // Array.from(header.parentNode.children).indexOf(header),\n // !isAscending)\n // )\n // .forEach(tr => tbody.appendChild(tr) );\n\n // [].slice.call() turns array-like sets into true arrays so that we can sort them\n const allRows = [].slice.call(tbody.querySelectorAll(\"tr\"));\n const allHeaders = [].slice.call(header.parentNode.children);\n const thisHeaderIndex = allHeaders.indexOf(header);\n allRows.sort(compareFunction(thisHeaderIndex, !isAscending)).forEach((tr) => {\n [].slice\n .call(tr.children)\n .forEach((td) => td.removeAttribute(\"data-sort-active\"));\n tr.children[thisHeaderIndex].setAttribute(\"data-sort-active\", true);\n tbody.appendChild(tr);\n });\n\n return true;\n};\n\n/**\n * Update the live region immediately following the table whenever sort changes.\n * @param {HTMLTableElement} table\n * @param {HTMLTableHeaderCellElement} sortedHeader\n */\n\nconst updateLiveRegion = (table, sortedHeader) => {\n const caption = table.querySelector(\"caption\").innerText;\n const sortedAscending = sortedHeader.getAttribute(SORTED) === ASCENDING;\n const headerLabel = sortedHeader.innerText;\n const liveRegion = table.nextElementSibling;\n if (liveRegion && liveRegion.matches(ANNOUNCEMENT_REGION)) {\n const sortAnnouncement = `The table named \"${caption}\" is now sorted by ${headerLabel} in ${\n sortedAscending ? ASCENDING : DESCENDING\n } order.`;\n liveRegion.innerText = sortAnnouncement;\n } else {\n throw new Error(\n `Table containing a sortable column header is not followed by an aria-live region.`,\n );\n }\n};\n\n/**\n * Toggle a header's sort state, optionally providing a target\n * state.\n *\n * @param {HTMLTableHeaderCellElement} header\n * @param {boolean?} isAscending If no state is provided, the current\n * state will be toggled (from false to true, and vice-versa).\n */\nconst toggleSort = (header, isAscending) => {\n const table = header.closest(TABLE);\n let safeAscending = isAscending;\n if (typeof safeAscending !== \"boolean\") {\n safeAscending = header.getAttribute(SORTED) === ASCENDING;\n }\n\n if (!table) {\n throw new Error(`${SORTABLE_HEADER} is missing outer ${TABLE}`);\n }\n\n safeAscending = sortRows(header, isAscending);\n\n if (safeAscending) {\n getColumnHeaders(table).forEach((otherHeader) => {\n if (otherHeader !== header) {\n unsetSort(otherHeader);\n }\n });\n updateLiveRegion(table, header);\n }\n};\n\n/**\n ** Inserts a button with icon inside a sortable header\n * @param {HTMLTableHeaderCellElement} header\n */\n\nconst createHeaderButton = (header) => {\n const buttonEl = document.createElement(\"button\");\n buttonEl.setAttribute(\"tabindex\", \"0\");\n buttonEl.classList.add(SORT_BUTTON_CLASS);\n // ICON_SOURCE\n buttonEl.innerHTML = Sanitizer.escapeHTML`\n <svg class=\"${PREFIX}-icon\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\">\n <g class=\"descending\" fill=\"transparent\">\n <path d=\"M17 17L15.59 15.59L12.9999 18.17V2H10.9999V18.17L8.41 15.58L7 17L11.9999 22L17 17Z\" />\n </g>\n <g class=\"ascending\" fill=\"transparent\">\n <path transform=\"rotate(180, 12, 12)\" d=\"M17 17L15.59 15.59L12.9999 18.17V2H10.9999V18.17L8.41 15.58L7 17L11.9999 22L17 17Z\" />\n </g>\n <g class=\"unsorted\" fill=\"transparent\">\n <polygon points=\"15.17 15 13 17.17 13 6.83 15.17 9 16.58 7.59 12 3 7.41 7.59 8.83 9 11 6.83 11 17.17 8.83 15 7.42 16.41 12 21 16.59 16.41 15.17 15\"/>\n </g>\n </svg>\n `;\n header.appendChild(buttonEl);\n updateSortLabel(header);\n};\n\nconst table = behavior(\n {\n [CLICK]: {\n [SORT_BUTTON](event) {\n event.preventDefault();\n toggleSort(\n event.target.closest(SORTABLE_HEADER),\n event.target.closest(SORTABLE_HEADER).getAttribute(SORTED) ===\n ASCENDING,\n );\n },\n },\n },\n {\n init(root) {\n const sortableHeaders = select(SORTABLE_HEADER, root);\n sortableHeaders.forEach((header) => createHeaderButton(header));\n\n const firstSorted = sortableHeaders.filter(\n (header) =>\n header.getAttribute(SORTED) === ASCENDING ||\n header.getAttribute(SORTED) === DESCENDING,\n )[0];\n if (typeof firstSorted === \"undefined\") {\n // no sortable headers found\n return;\n }\n const sortDir = firstSorted.getAttribute(SORTED);\n if (sortDir === ASCENDING) {\n toggleSort(firstSorted, true);\n } else if (sortDir === DESCENDING) {\n toggleSort(firstSorted, false);\n }\n },\n TABLE,\n SORTABLE_HEADER,\n SORT_BUTTON,\n },\n);\n\nmodule.exports = table;\n","const behavior = require(\"../../uswds-core/src/js/utils/behavior\");\nconst selectOrMatches = require(\"../../uswds-core/src/js/utils/select-or-matches\");\nconst { prefix: PREFIX } = require(\"../../uswds-core/src/js/config\");\nconst {\n COMBO_BOX_CLASS,\n enhanceComboBox,\n} = require(\"../../usa-combo-box/src/index\");\n\nconst TIME_PICKER_CLASS = `${PREFIX}-time-picker`;\nconst TIME_PICKER = `.${TIME_PICKER_CLASS}`;\nconst MAX_TIME = 60 * 24 - 1;\nconst MIN_TIME = 0;\nconst DEFAULT_STEP = 30;\nconst MIN_STEP = 1;\n\nconst FILTER_DATASET = {\n filter:\n \"0?{{ hourQueryFilter }}:{{minuteQueryFilter}}.*{{ apQueryFilter }}m?\",\n apQueryFilter: \"([ap])\",\n hourQueryFilter: \"([1-9][0-2]?)\",\n minuteQueryFilter: \"[\\\\d]+:([0-9]{0,2})\",\n};\n\n/**\n * Parse a string of hh:mm into minutes\n *\n * @param {string} timeStr the time string to parse\n * @returns {number} the number of minutes\n */\nconst parseTimeString = (timeStr) => {\n let minutes;\n\n if (timeStr) {\n const [hours, mins] = timeStr.split(\":\").map((str) => {\n let value;\n const parsed = parseInt(str, 10);\n if (!Number.isNaN(parsed)) value = parsed;\n return value;\n });\n\n if (hours != null && mins != null) {\n minutes = hours * 60 + mins;\n }\n }\n\n return minutes;\n};\n\n/**\n * Enhance an input with the date picker elements\n *\n * @param {HTMLElement} el The initial wrapping element of the date picker component\n */\nconst transformTimePicker = (el) => {\n const timePickerEl = el.closest(TIME_PICKER);\n\n const initialInputEl = timePickerEl.querySelector(`input`);\n\n if (!initialInputEl) {\n throw new Error(`${TIME_PICKER} is missing inner input`);\n }\n\n const selectEl = document.createElement(\"select\");\n\n [\n \"id\",\n \"name\",\n \"required\",\n \"aria-label\",\n \"aria-labelledby\",\n \"disabled\",\n \"aria-disabled\",\n ].forEach((name) => {\n if (initialInputEl.hasAttribute(name)) {\n const value = initialInputEl.getAttribute(name);\n selectEl.setAttribute(name, value);\n initialInputEl.removeAttribute(name);\n }\n });\n\n const padZeros = (value, length) => `0000${value}`.slice(-length);\n\n const getTimeContext = (minutes) => {\n const minute = minutes % 60;\n const hour24 = Math.floor(minutes / 60);\n const hour12 = hour24 % 12 || 12;\n const ampm = hour24 < 12 ? \"am\" : \"pm\";\n\n return {\n minute,\n hour24,\n hour12,\n ampm,\n };\n };\n\n const minTime = Math.max(\n MIN_TIME,\n parseTimeString(timePickerEl.dataset.minTime) || MIN_TIME,\n );\n const maxTime = Math.min(\n MAX_TIME,\n parseTimeString(timePickerEl.dataset.maxTime) || MAX_TIME,\n );\n const step = Math.floor(\n Math.max(MIN_STEP, timePickerEl.dataset.step || DEFAULT_STEP),\n );\n\n let defaultValue;\n for (let time = minTime; time <= maxTime; time += step) {\n const { minute, hour24, hour12, ampm } = getTimeContext(time);\n\n const option = document.createElement(\"option\");\n option.value = `${padZeros(hour24, 2)}:${padZeros(minute, 2)}`;\n option.text = `${hour12}:${padZeros(minute, 2)}${ampm}`;\n if (option.text === initialInputEl.value) {\n defaultValue = option.value;\n }\n selectEl.appendChild(option);\n }\n\n timePickerEl.classList.add(COMBO_BOX_CLASS);\n\n // combo box properties\n Object.keys(FILTER_DATASET).forEach((key) => {\n timePickerEl.dataset[key] = FILTER_DATASET[key];\n });\n timePickerEl.dataset.disableFiltering = \"true\";\n timePickerEl.dataset.defaultValue = defaultValue;\n\n timePickerEl.appendChild(selectEl);\n initialInputEl.remove();\n};\n\nconst timePicker = behavior(\n {},\n {\n init(root) {\n selectOrMatches(TIME_PICKER, root).forEach((timePickerEl) => {\n transformTimePicker(timePickerEl);\n enhanceComboBox(timePickerEl);\n });\n },\n FILTER_DATASET,\n },\n);\n\nmodule.exports = timePicker;\n","// Tooltips\nconst keymap = require(\"receptor/keymap\");\nconst selectOrMatches = require(\"../../uswds-core/src/js/utils/select-or-matches\");\nconst behavior = require(\"../../uswds-core/src/js/utils/behavior\");\nconst { prefix: PREFIX } = require(\"../../uswds-core/src/js/config\");\nconst isElementInViewport = require(\"../../uswds-core/src/js/utils/is-in-viewport\");\n\nconst BODY = \"body\";\nconst TOOLTIP = `.${PREFIX}-tooltip`;\nconst TOOLTIP_TRIGGER = `.${PREFIX}-tooltip__trigger`;\nconst TOOLTIP_TRIGGER_CLASS = `${PREFIX}-tooltip__trigger`;\nconst TOOLTIP_CLASS = `${PREFIX}-tooltip`;\nconst TOOLTIP_BODY_CLASS = `${PREFIX}-tooltip__body`;\nconst SET_CLASS = \"is-set\";\nconst VISIBLE_CLASS = \"is-visible\";\nconst TRIANGLE_SIZE = 5;\nconst ADJUST_WIDTH_CLASS = `${PREFIX}-tooltip__body--wrap`;\n\n/**\n *\n * @param {DOMElement} trigger - The tooltip trigger\n * @returns {object} Elements for initialized tooltip; includes trigger, wrapper, and body\n */\nconst getTooltipElements = (trigger) => {\n const wrapper = trigger.parentNode;\n const body = wrapper.querySelector(`.${TOOLTIP_BODY_CLASS}`);\n\n return { trigger, wrapper, body };\n};\n\n/**\n * Shows the tooltip\n * @param {HTMLElement} tooltipTrigger - the element that initializes the tooltip\n */\nconst showToolTip = (tooltipBody, tooltipTrigger, position) => {\n tooltipBody.setAttribute(\"aria-hidden\", \"false\");\n\n // This sets up the tooltip body. The opacity is 0, but\n // we can begin running the calculations below.\n tooltipBody.classList.add(SET_CLASS);\n\n /**\n * Position the tooltip body when the trigger is hovered\n * Removes old positioning classnames and reapplies. This allows\n * positioning to change in case the user resizes browser or DOM manipulation\n * causes tooltip to get clipped from viewport\n *\n * @param {string} setPos - can be \"top\", \"bottom\", \"right\", \"left\"\n */\n const setPositionClass = (setPos) => {\n tooltipBody.classList.remove(`${TOOLTIP_BODY_CLASS}--top`);\n tooltipBody.classList.remove(`${TOOLTIP_BODY_CLASS}--bottom`);\n tooltipBody.classList.remove(`${TOOLTIP_BODY_CLASS}--right`);\n tooltipBody.classList.remove(`${TOOLTIP_BODY_CLASS}--left`);\n tooltipBody.classList.add(`${TOOLTIP_BODY_CLASS}--${setPos}`);\n };\n\n /**\n * Removes old positioning styles. This allows\n * re-positioning to change without inheriting other\n * dynamic styles\n *\n * @param {HTMLElement} e - this is the tooltip body\n */\n const resetPositionStyles = (e) => {\n // we don't override anything in the stylesheet when finding alt positions\n e.style.top = null;\n e.style.bottom = null;\n e.style.right = null;\n e.style.left = null;\n e.style.margin = null;\n };\n\n /**\n * get margin offset calculations\n *\n * @param {HTMLElement} target - this is the tooltip body\n * @param {String} propertyValue - this is the tooltip body\n */\n\n const offsetMargin = (target, propertyValue) =>\n parseInt(\n window.getComputedStyle(target).getPropertyValue(propertyValue),\n 10,\n );\n\n // offsetLeft = the left position, and margin of the element, the left\n // padding, scrollbar and border of the offsetParent element\n // offsetWidth = The offsetWidth property returns the viewable width of an\n // element in pixels, including padding, border and scrollbar, but not\n // the margin.\n\n /**\n * Calculate margin offset\n * tooltip trigger margin(position) offset + tooltipBody offsetWidth\n * @param {String} marginPosition\n * @param {Number} tooltipBodyOffset\n * @param {HTMLElement} trigger\n */\n const calculateMarginOffset = (\n marginPosition,\n tooltipBodyOffset,\n trigger,\n ) => {\n const offset =\n offsetMargin(trigger, `margin-${marginPosition}`) > 0\n ? tooltipBodyOffset - offsetMargin(trigger, `margin-${marginPosition}`)\n : tooltipBodyOffset;\n\n return offset;\n };\n\n /**\n * Positions tooltip at the top\n * @param {HTMLElement} e - this is the tooltip body\n */\n const positionTop = (e) => {\n resetPositionStyles(e); // ensures we start from the same point\n // get details on the elements object with\n\n const topMargin = calculateMarginOffset(\n \"top\",\n e.offsetHeight,\n tooltipTrigger,\n );\n\n const leftMargin = calculateMarginOffset(\n \"left\",\n e.offsetWidth,\n tooltipTrigger,\n );\n\n setPositionClass(\"top\");\n e.style.left = `50%`; // center the element\n e.style.top = `-${TRIANGLE_SIZE}px`; // consider the pseudo element\n // apply our margins based on the offset\n e.style.margin = `-${topMargin}px 0 0 -${leftMargin / 2}px`;\n };\n\n /**\n * Positions tooltip at the bottom\n * @param {HTMLElement} e - this is the tooltip body\n */\n const positionBottom = (e) => {\n resetPositionStyles(e);\n\n const leftMargin = calculateMarginOffset(\n \"left\",\n e.offsetWidth,\n tooltipTrigger,\n );\n\n setPositionClass(\"bottom\");\n e.style.left = `50%`;\n e.style.margin = `${TRIANGLE_SIZE}px 0 0 -${leftMargin / 2}px`;\n };\n\n /**\n * Positions tooltip at the right\n * @param {HTMLElement} e - this is the tooltip body\n */\n const positionRight = (e) => {\n resetPositionStyles(e);\n\n const topMargin = calculateMarginOffset(\n \"top\",\n e.offsetHeight,\n tooltipTrigger,\n );\n\n setPositionClass(\"right\");\n e.style.top = `50%`;\n e.style.left = `${\n tooltipTrigger.offsetLeft + tooltipTrigger.offsetWidth + TRIANGLE_SIZE\n }px`;\n e.style.margin = `-${topMargin / 2}px 0 0 0`;\n };\n\n /**\n * Positions tooltip at the right\n * @param {HTMLElement} e - this is the tooltip body\n */\n const positionLeft = (e) => {\n resetPositionStyles(e);\n\n const topMargin = calculateMarginOffset(\n \"top\",\n e.offsetHeight,\n tooltipTrigger,\n );\n\n // we have to check for some utility margins\n const leftMargin = calculateMarginOffset(\n \"left\",\n tooltipTrigger.offsetLeft > e.offsetWidth\n ? tooltipTrigger.offsetLeft - e.offsetWidth\n : e.offsetWidth,\n tooltipTrigger,\n );\n\n setPositionClass(\"left\");\n e.style.top = `50%`;\n e.style.left = `-${TRIANGLE_SIZE}px`;\n e.style.margin = `-${topMargin / 2}px 0 0 ${\n tooltipTrigger.offsetLeft > e.offsetWidth ? leftMargin : -leftMargin\n }px`; // adjust the margin\n };\n\n /**\n * We try to set the position based on the\n * original intention, but make adjustments\n * if the element is clipped out of the viewport\n * we constrain the width only as a last resort\n * @param {HTMLElement} element(alias tooltipBody)\n * @param {Number} attempt (--flag)\n */\n\n const maxAttempts = 2;\n\n function findBestPosition(element, attempt = 1) {\n // create array of optional positions\n const positions = [\n positionTop,\n positionBottom,\n positionRight,\n positionLeft,\n ];\n\n let hasVisiblePosition = false;\n\n // we take a recursive approach\n function tryPositions(i) {\n if (i < positions.length) {\n const pos = positions[i];\n pos(element);\n\n if (!isElementInViewport(element)) {\n // eslint-disable-next-line no-param-reassign\n tryPositions((i += 1));\n } else {\n hasVisiblePosition = true;\n }\n }\n }\n\n tryPositions(0);\n // if we can't find a position we compress it and try again\n if (!hasVisiblePosition) {\n element.classList.add(ADJUST_WIDTH_CLASS);\n if (attempt <= maxAttempts) {\n // eslint-disable-next-line no-param-reassign\n findBestPosition(element, (attempt += 1));\n }\n }\n }\n\n switch (position) {\n case \"top\":\n positionTop(tooltipBody);\n if (!isElementInViewport(tooltipBody)) {\n findBestPosition(tooltipBody);\n }\n break;\n case \"bottom\":\n positionBottom(tooltipBody);\n if (!isElementInViewport(tooltipBody)) {\n findBestPosition(tooltipBody);\n }\n break;\n case \"right\":\n positionRight(tooltipBody);\n if (!isElementInViewport(tooltipBody)) {\n findBestPosition(tooltipBody);\n }\n break;\n case \"left\":\n positionLeft(tooltipBody);\n if (!isElementInViewport(tooltipBody)) {\n findBestPosition(tooltipBody);\n }\n break;\n\n default:\n // skip default case\n break;\n }\n\n /**\n * Actually show the tooltip. The VISIBLE_CLASS\n * will change the opacity to 1\n */\n setTimeout(() => {\n tooltipBody.classList.add(VISIBLE_CLASS);\n }, 20);\n};\n\n/**\n * Removes all the properties to show and position the tooltip,\n * and resets the tooltip position to the original intention\n * in case the window is resized or the element is moved through\n * DOM manipulation.\n * @param {HTMLElement} tooltipBody - The body of the tooltip\n */\nconst hideToolTip = (tooltipBody) => {\n tooltipBody.classList.remove(VISIBLE_CLASS);\n tooltipBody.classList.remove(SET_CLASS);\n tooltipBody.classList.remove(ADJUST_WIDTH_CLASS);\n tooltipBody.setAttribute(\"aria-hidden\", \"true\");\n};\n\n/**\n * Setup the tooltip component\n * @param {HTMLElement} tooltipTrigger The element that creates the tooltip\n */\nconst setUpAttributes = (tooltipTrigger) => {\n const tooltipID = `tooltip-${Math.floor(Math.random() * 900000) + 100000}`;\n const tooltipContent = tooltipTrigger.getAttribute(\"title\");\n const wrapper = document.createElement(\"span\");\n const tooltipBody = document.createElement(\"span\");\n const additionalClasses = tooltipTrigger.getAttribute(\"data-classes\");\n let position = tooltipTrigger.getAttribute(\"data-position\");\n\n // Apply default position if not set as attribute\n if (!position) {\n position = \"top\";\n tooltipTrigger.setAttribute(\"data-position\", position);\n }\n\n // Set up tooltip attributes\n tooltipTrigger.setAttribute(\"aria-describedby\", tooltipID);\n tooltipTrigger.setAttribute(\"tabindex\", \"0\");\n tooltipTrigger.removeAttribute(\"title\");\n tooltipTrigger.classList.remove(TOOLTIP_CLASS);\n tooltipTrigger.classList.add(TOOLTIP_TRIGGER_CLASS);\n\n // insert wrapper before el in the DOM tree\n tooltipTrigger.parentNode.insertBefore(wrapper, tooltipTrigger);\n\n // set up the wrapper\n wrapper.appendChild(tooltipTrigger);\n wrapper.classList.add(TOOLTIP_CLASS);\n wrapper.appendChild(tooltipBody);\n\n // Apply additional class names to wrapper element\n if (additionalClasses) {\n const classesArray = additionalClasses.split(\" \");\n classesArray.forEach((classname) => wrapper.classList.add(classname));\n }\n\n // set up the tooltip body\n tooltipBody.classList.add(TOOLTIP_BODY_CLASS);\n tooltipBody.setAttribute(\"id\", tooltipID);\n tooltipBody.setAttribute(\"role\", \"tooltip\");\n tooltipBody.setAttribute(\"aria-hidden\", \"true\");\n\n // place the text in the tooltip\n tooltipBody.textContent = tooltipContent;\n\n return { tooltipBody, position, tooltipContent, wrapper };\n};\n\n/**\n * Hide all active tooltips when escape key is pressed.\n */\n\nconst handleEscape = () => {\n const activeTooltips = selectOrMatches(`.${TOOLTIP_BODY_CLASS}.${SET_CLASS}`);\n\n if (!activeTooltips) {\n return;\n }\n\n activeTooltips.forEach((activeTooltip) => hideToolTip(activeTooltip));\n};\n\n// Setup our function to run on various events\nconst tooltip = behavior(\n {\n \"mouseover focusin\": {\n [TOOLTIP](e) {\n const trigger = e.target;\n const elementType = trigger.nodeName;\n\n // Initialize tooltip if it hasn't already\n if (elementType === \"BUTTON\" && trigger.hasAttribute(\"title\")) {\n setUpAttributes(trigger);\n }\n },\n [TOOLTIP_TRIGGER](e) {\n const { trigger, body } = getTooltipElements(e.target);\n\n showToolTip(body, trigger, trigger.dataset.position);\n },\n },\n focusout: {\n [TOOLTIP_TRIGGER](e) {\n const { body } = getTooltipElements(e.target);\n\n hideToolTip(body);\n },\n },\n keydown: {\n [BODY]: keymap({ Escape: handleEscape }),\n },\n },\n {\n init(root) {\n selectOrMatches(TOOLTIP, root).forEach((tooltipTrigger) => {\n setUpAttributes(tooltipTrigger);\n\n const { body, wrapper } = getTooltipElements(tooltipTrigger);\n wrapper.addEventListener(\"mouseleave\", () => hideToolTip(body));\n });\n },\n teardown(root) {\n selectOrMatches(TOOLTIP, root).forEach((tooltipWrapper) => {\n tooltipWrapper.removeEventListener(\"mouseleave\", hideToolTip);\n });\n },\n setup: setUpAttributes,\n getTooltipElements,\n show: showToolTip,\n hide: hideToolTip,\n },\n);\n\nmodule.exports = tooltip;\n","const behavior = require(\"../../uswds-core/src/js/utils/behavior\");\nconst validate = require(\"../../uswds-core/src/js/utils/validate-input\");\nconst { prefix: PREFIX } = require(\"../../uswds-core/src/js/config\");\nconst selectOrMatches = require(\"../../uswds-core/src/js/utils/select-or-matches\");\n\nconst VALIDATE_INPUT =\n \"input[data-validation-element],textarea[data-validation-element]\";\nconst CHECKLIST_ITEM = `.${PREFIX}-checklist__item`;\n\n// Trigger validation on input change\nconst handleChange = (el) => validate(el);\n\n// Create container to hold aria readout\nconst createStatusElement = (input) => {\n const validationContainer = input.parentNode;\n const inputID = input.getAttribute(\"id\");\n const statusSummaryID = `${inputID}-sr-summary`;\n input.setAttribute(\"aria-describedby\", statusSummaryID);\n\n const statusSummaryContainer = document.createElement(\"span\");\n\n statusSummaryContainer.setAttribute(\"data-validation-status\", \"\");\n statusSummaryContainer.classList.add(\"usa-sr-only\");\n statusSummaryContainer.setAttribute(\"aria-live\", \"polite\");\n statusSummaryContainer.setAttribute(\"aria-atomic\", true);\n statusSummaryContainer.setAttribute(\"id\", statusSummaryID);\n validationContainer.append(statusSummaryContainer);\n};\n\n// Set up checklist items with initial aria-label (incomplete) values\nconst createInitialStatus = (input) => {\n const validationContainer = input.parentNode;\n const checklistItems = validationContainer.querySelectorAll(CHECKLIST_ITEM);\n const validationElement = input.getAttribute(\"data-validation-element\");\n\n input.setAttribute(\"aria-controls\", validationElement);\n\n checklistItems.forEach((listItem) => {\n let currentStatus = \"status incomplete\";\n if (input.hasAttribute(\"data-validation-incomplete\")) {\n currentStatus = input.getAttribute(\"data-validation-incomplete\");\n }\n const itemStatus = `${listItem.textContent} ${currentStatus} `;\n listItem.setAttribute(\"aria-label\", itemStatus);\n });\n};\n\nconst enhanceValidation = (input) => {\n createStatusElement(input);\n createInitialStatus(input);\n};\n\nconst validator = behavior(\n {\n \"input change\": {\n [VALIDATE_INPUT](event) {\n handleChange(event.target);\n },\n },\n },\n {\n init(root) {\n selectOrMatches(VALIDATE_INPUT, root).forEach((input) =>\n enhanceValidation(input),\n );\n },\n },\n);\n\nmodule.exports = validator;\n","module.exports = {\n prefix: \"usa\",\n};\n","module.exports = {\n // This used to be conditionally dependent on whether the\n // browser supported touch events; if it did, `CLICK` was set to\n // `touchstart`. However, this had downsides:\n //\n // * It pre-empted mobile browsers' default behavior of detecting\n // whether a touch turned into a scroll, thereby preventing\n // users from using some of our components as scroll surfaces.\n //\n // * Some devices, such as the Microsoft Surface Pro, support *both*\n // touch and clicks. This meant the conditional effectively dropped\n // support for the user's mouse, frustrating users who preferred\n // it on those systems.\n CLICK: \"click\",\n};\n","const accordion = require(\"../../../usa-accordion/src/index\");\nconst banner = require(\"../../../usa-banner/src/index\");\nconst button = require(\"../../../usa-button/src/index\");\nconst characterCount = require(\"../../../usa-character-count/src/index\");\nconst comboBox = require(\"../../../usa-combo-box/src/index\");\nconst datePicker = require(\"../../../usa-date-picker/src/index\");\nconst dateRangePicker = require(\"../../../usa-date-range-picker/src/index\");\nconst fileInput = require(\"../../../usa-file-input/src/index\");\nconst footer = require(\"../../../usa-footer/src/index\");\nconst inPageNavigation = require(\"../../../usa-in-page-navigation/src/index\");\nconst inputMask = require(\"../../../usa-input-mask/src/index\");\nconst languageSelector = require(\"../../../usa-language-selector/src/index\");\nconst modal = require(\"../../../usa-modal/src/index\");\nconst navigation = require(\"../../../usa-header/src/index\");\nconst password = require(\"../../../_usa-password/src/index\");\nconst range = require(\"../../../usa-range/src/index\");\nconst search = require(\"../../../usa-search/src/index\");\nconst skipnav = require(\"../../../usa-skipnav/src/index\");\nconst table = require(\"../../../usa-table/src/index\");\nconst timePicker = require(\"../../../usa-time-picker/src/index\");\nconst tooltip = require(\"../../../usa-tooltip/src/index\");\nconst validator = require(\"../../../usa-validation/src/index\");\n\nmodule.exports = {\n accordion,\n banner,\n button,\n characterCount,\n comboBox,\n datePicker,\n dateRangePicker,\n fileInput,\n footer,\n inPageNavigation,\n inputMask,\n languageSelector,\n modal,\n navigation,\n password,\n range,\n search,\n skipnav,\n table,\n timePicker,\n tooltip,\n validator,\n};\n","/* eslint-disable consistent-return */\n/* eslint-disable func-names */\n(function () {\n if (typeof window.CustomEvent === \"function\") return false;\n\n function CustomEvent(event, _params) {\n const params = _params || {\n bubbles: false,\n cancelable: false,\n detail: null,\n };\n const evt = document.createEvent(\"CustomEvent\");\n evt.initCustomEvent(\n event,\n params.bubbles,\n params.cancelable,\n params.detail,\n );\n return evt;\n }\n\n window.CustomEvent = CustomEvent;\n})();\n","const elproto = window.HTMLElement.prototype;\nconst HIDDEN = \"hidden\";\n\nif (!(HIDDEN in elproto)) {\n Object.defineProperty(elproto, HIDDEN, {\n get() {\n return this.hasAttribute(HIDDEN);\n },\n set(value) {\n if (value) {\n this.setAttribute(HIDDEN, \"\");\n } else {\n this.removeAttribute(HIDDEN);\n }\n },\n });\n}\n","// polyfills HTMLElement.prototype.hidden\nrequire(\"./element-hidden\");\n// polyfills Number.isNaN()\nrequire(\"./number-is-nan\");\n// polyfills CustomEvent\nrequire(\"./custom-event\");\n// polyfills svg4everybody\nrequire(\"./svg4everybody\");\n","Number.isNaN =\n Number.isNaN ||\n function isNaN(input) {\n // eslint-disable-next-line no-self-compare\n return typeof input === \"number\" && input !== input;\n };\n","/* eslint-disable */\n!(function (factory) {\n module.exports = factory();\n})(function () {\n /*! svg4everybody v2.1.9 | github.com/jonathantneal/svg4everybody */\n function embed(parent, svg, target, use) {\n // if the target exists\n if (target) {\n // create a document fragment to hold the contents of the target\n var fragment = document.createDocumentFragment(),\n viewBox =\n !svg.hasAttribute(\"viewBox\") && target.getAttribute(\"viewBox\");\n // conditionally set the viewBox on the svg\n viewBox && svg.setAttribute(\"viewBox\", viewBox);\n // copy the contents of the clone into the fragment\n for (\n // clone the target\n var clone = document.importNode\n ? document.importNode(target, !0)\n : target.cloneNode(!0),\n g = document.createElementNS(\n svg.namespaceURI || \"http://www.w3.org/2000/svg\",\n \"g\",\n );\n clone.childNodes.length;\n\n ) {\n g.appendChild(clone.firstChild);\n }\n if (use) {\n for (var i = 0; use.attributes.length > i; i++) {\n var attr = use.attributes[i];\n \"xlink:href\" !== attr.name &&\n \"href\" !== attr.name &&\n g.setAttribute(attr.name, attr.value);\n }\n }\n fragment.appendChild(g), // append the fragment into the svg\n parent.appendChild(fragment);\n }\n }\n function loadreadystatechange(xhr, use) {\n // listen to changes in the request\n (xhr.onreadystatechange = function () {\n // if the request is ready\n if (4 === xhr.readyState) {\n // get the cached html document\n var cachedDocument = xhr._cachedDocument;\n // ensure the cached html document based on the xhr response\n cachedDocument ||\n ((cachedDocument = xhr._cachedDocument =\n document.implementation.createHTMLDocument(\"\")),\n (cachedDocument.body.innerHTML = xhr.responseText), // ensure domains are the same, otherwise we'll have issues appending the\n // element in IE 11\n cachedDocument.domain !== document.domain &&\n (cachedDocument.domain = document.domain),\n (xhr._cachedTarget = {})), // clear the xhr embeds list and embed each item\n xhr._embeds.splice(0).map(function (item) {\n // get the cached target\n var target = xhr._cachedTarget[item.id];\n // ensure the cached target\n target ||\n (target = xhr._cachedTarget[item.id] =\n cachedDocument.getElementById(item.id)),\n // embed the target into the svg\n embed(item.parent, item.svg, target, use);\n });\n }\n }), // test the ready state change immediately\n xhr.onreadystatechange();\n }\n function svg4everybody(rawopts) {\n function oninterval() {\n // if all <use>s in the array are being bypassed, don't proceed.\n if (\n numberOfSvgUseElementsToBypass &&\n uses.length - numberOfSvgUseElementsToBypass <= 0\n ) {\n return void requestAnimationFrame(oninterval, 67);\n }\n // if there are <use>s to process, proceed.\n // reset the bypass counter, since the counter will be incremented for every bypassed element,\n // even ones that were counted before.\n numberOfSvgUseElementsToBypass = 0;\n // while the index exists in the live <use> collection\n for (\n // get the cached <use> index\n var index = 0;\n index < uses.length;\n\n ) {\n // get the current <use>\n var use = uses[index],\n parent = use.parentNode,\n svg = getSVGAncestor(parent),\n src = use.getAttribute(\"xlink:href\") || use.getAttribute(\"href\");\n if (\n (!src &&\n opts.attributeName &&\n (src = use.getAttribute(opts.attributeName)),\n svg && src)\n ) {\n if (polyfill) {\n if (!opts.validate || opts.validate(src, svg, use)) {\n // remove the <use> element\n parent.removeChild(use);\n // parse the src and get the url and id\n var srcSplit = src.split(\"#\"),\n url = srcSplit.shift(),\n id = srcSplit.join(\"#\");\n // if the link is external\n if (url.length) {\n // get the cached xhr request\n var xhr = requests[url];\n // ensure the xhr request exists\n xhr ||\n ((xhr = requests[url] = new XMLHttpRequest()),\n xhr.open(\"GET\", url),\n xhr.send(),\n (xhr._embeds = [])), // add the svg and id as an item to the xhr embeds list\n xhr._embeds.push({\n parent: parent,\n svg: svg,\n id: id,\n }), // prepare the xhr ready state change event\n loadreadystatechange(xhr, use);\n } else {\n // embed the local id into the svg\n embed(parent, svg, document.getElementById(id), use);\n }\n } else {\n // increase the index when the previous value was not \"valid\"\n ++index, ++numberOfSvgUseElementsToBypass;\n }\n }\n } else {\n // increase the index when the previous value was not \"valid\"\n ++index;\n }\n }\n // continue the interval\n requestAnimationFrame(oninterval, 67);\n }\n var polyfill,\n opts = Object(rawopts),\n newerIEUA = /\\bTrident\\/[567]\\b|\\bMSIE (?:9|10)\\.0\\b/,\n webkitUA = /\\bAppleWebKit\\/(\\d+)\\b/,\n olderEdgeUA = /\\bEdge\\/12\\.(\\d+)\\b/,\n edgeUA = /\\bEdge\\/.(\\d+)\\b/,\n inIframe = window.top !== window.self;\n polyfill =\n \"polyfill\" in opts\n ? opts.polyfill\n : newerIEUA.test(navigator.userAgent) ||\n (navigator.userAgent.match(olderEdgeUA) || [])[1] < 10547 ||\n (navigator.userAgent.match(webkitUA) || [])[1] < 537 ||\n (edgeUA.test(navigator.userAgent) && inIframe);\n // create xhr requests object\n var requests = {},\n requestAnimationFrame = window.requestAnimationFrame || setTimeout,\n uses = document.getElementsByTagName(\"use\"),\n numberOfSvgUseElementsToBypass = 0;\n // conditionally start the interval if the polyfill is active\n polyfill && oninterval();\n }\n function getSVGAncestor(node) {\n for (\n var svg = node;\n \"svg\" !== svg.nodeName.toLowerCase() && (svg = svg.parentNode);\n\n ) {}\n return svg;\n }\n return svg4everybody;\n});\n","window.uswdsPresent = true; // GLOBAL variable to indicate that the uswds.js has loaded in the DOM.\n\n/**\n * The 'polyfills' define key ECMAScript 5 methods that may be missing from\n * older browsers, so must be loaded first.\n */\nrequire(\"./polyfills\");\n\nconst uswds = require(\"./config\");\n\nconst components = require(\"./index\");\nconst svg4everybody = require(\"./polyfills/svg4everybody\");\n\nuswds.components = components;\n\nconst initComponents = () => {\n const target = document.body;\n Object.keys(components).forEach((key) => {\n const behavior = components[key];\n behavior.on(target);\n });\n svg4everybody();\n};\n\nif (document.readyState === \"loading\") {\n document.addEventListener(\"DOMContentLoaded\", initComponents, { once: true });\n} else {\n initComponents();\n}\n\nexports.default = uswds;\nexports.initComponents = initComponents;\n","module.exports = (htmlDocument = document) => htmlDocument.activeElement;\n","const assign = require(\"object-assign\");\nconst Behavior = require(\"receptor/behavior\");\n\n/**\n * @name sequence\n * @param {...Function} seq an array of functions\n * @return { closure } callHooks\n */\n// We use a named function here because we want it to inherit its lexical scope\n// from the behavior props object, not from the module\nconst sequence = (...seq) =>\n function callHooks(target = document.body) {\n seq.forEach((method) => {\n if (typeof this[method] === \"function\") {\n this[method].call(this, target);\n }\n });\n };\n\n/**\n * @name behavior\n * @param {object} events\n * @param {object?} props\n * @return {receptor.behavior}\n */\nmodule.exports = (events, props) =>\n Behavior(\n events,\n assign(\n {\n on: sequence(\"init\", \"add\"),\n off: sequence(\"teardown\", \"remove\"),\n },\n props,\n ),\n );\n","/**\n * Call a function every X amount of milliseconds.\n *\n * @param {Function} callback - A callback function to be debounced\n * @param {number} delay - Milliseconds to wait before calling function\n * @returns {Function} A debounced function\n * @example const updateStatus = debounce((string) => console.log(string), 2000)\n */\n\nmodule.exports = function debounce(callback, delay = 500) {\n let timer = null;\n return (...args) => {\n window.clearTimeout(timer);\n timer = window.setTimeout(() => {\n callback.apply(this, args);\n }, delay);\n };\n};\n","const assign = require(\"object-assign\");\nconst { keymap } = require(\"receptor\");\nconst behavior = require(\"./behavior\");\nconst select = require(\"./select\");\nconst activeElement = require(\"./active-element\");\n\nconst FOCUSABLE =\n 'a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, [tabindex=\"0\"], [contenteditable]';\n\nconst tabHandler = (context) => {\n const focusableElements = select(FOCUSABLE, context);\n const firstTabStop = focusableElements[0];\n const lastTabStop = focusableElements[focusableElements.length - 1];\n\n // Special rules for when the user is tabbing forward from the last focusable element,\n // or when tabbing backwards from the first focusable element\n function tabAhead(event) {\n if (activeElement() === lastTabStop) {\n event.preventDefault();\n firstTabStop.focus();\n }\n }\n\n function tabBack(event) {\n if (activeElement() === firstTabStop) {\n event.preventDefault();\n lastTabStop.focus();\n }\n // This checks if you want to set the initial focus to a container\n // instead of an element within, and the user tabs back.\n // Then we set the focus to the first\n else if (!focusableElements.includes(activeElement())) {\n event.preventDefault();\n firstTabStop.focus();\n }\n }\n\n return {\n firstTabStop,\n lastTabStop,\n tabAhead,\n tabBack,\n };\n};\n\nmodule.exports = (context, additionalKeyBindings = {}) => {\n const tabEventHandler = tabHandler(context);\n const bindings = additionalKeyBindings;\n const { Esc, Escape } = bindings;\n\n if (Escape && !Esc) bindings.Esc = Escape;\n\n // TODO: In the future, loop over additional keybindings and pass an array\n // of functions, if necessary, to the map keys. Then people implementing\n // the focus trap could pass callbacks to fire when tabbing\n const keyMappings = keymap(\n assign(\n {\n Tab: tabEventHandler.tabAhead,\n \"Shift+Tab\": tabEventHandler.tabBack,\n },\n additionalKeyBindings,\n ),\n );\n\n const focusTrap = behavior(\n {\n keydown: keyMappings,\n },\n {\n init() {\n // TODO: is this desireable behavior? Should the trap always do this by default or should\n // the component getting decorated handle this?\n if (tabEventHandler.firstTabStop) {\n tabEventHandler.firstTabStop.focus();\n }\n },\n update(isActive) {\n if (isActive) {\n this.on();\n } else {\n this.off();\n }\n },\n },\n );\n\n return focusTrap;\n};\n","// https://stackoverflow.com/a/7557433\nfunction isElementInViewport(\n el,\n win = window,\n docEl = document.documentElement,\n) {\n const rect = el.getBoundingClientRect();\n\n return (\n rect.top >= 0 &&\n rect.left >= 0 &&\n rect.bottom <= (win.innerHeight || docEl.clientHeight) &&\n rect.right <= (win.innerWidth || docEl.clientWidth)\n );\n}\n\nmodule.exports = isElementInViewport;\n","// iOS detection from: http://stackoverflow.com/a/9039885/177710\nfunction isIosDevice() {\n return (\n typeof navigator !== \"undefined\" &&\n (navigator.userAgent.match(/(iPod|iPhone|iPad)/g) ||\n (navigator.platform === \"MacIntel\" && navigator.maxTouchPoints > 1)) &&\n !window.MSStream\n );\n}\n\nmodule.exports = isIosDevice;\n","/* eslint-disable */\n/* globals define, module */\n\n/**\n * A simple library to help you escape HTML using template strings.\n *\n * It's the counterpart to our eslint \"no-unsafe-innerhtml\" plugin that helps us\n * avoid unsafe coding practices.\n * A full write-up of the Hows and Whys are documented\n * for developers at\n * https://developer.mozilla.org/en-US/Firefox_OS/Security/Security_Automation\n * with additional background information and design docs at\n * https://wiki.mozilla.org/User:Fbraun/Gaia/SafeinnerHTMLRoadmap\n *\n */\n\n!(function (factory) {\n module.exports = factory();\n})(function () {\n \"use strict\";\n\n var Sanitizer = {\n _entity: /[&<>\"'/]/g,\n\n _entities: {\n \"&\": \"&\",\n \"<\": \"<\",\n \">\": \">\",\n '\"': \""\",\n \"'\": \"'\",\n \"/\": \"/\",\n },\n\n getEntity: function (s) {\n return Sanitizer._entities[s];\n },\n\n /**\n * Escapes HTML for all values in a tagged template string.\n */\n escapeHTML: function (strings) {\n var result = \"\";\n\n for (var i = 0; i < strings.length; i++) {\n result += strings[i];\n if (i + 1 < arguments.length) {\n var value = arguments[i + 1] || \"\";\n result += String(value).replace(\n Sanitizer._entity,\n Sanitizer.getEntity,\n );\n }\n }\n\n return result;\n },\n /**\n * Escapes HTML and returns a wrapped object to be used during DOM insertion\n */\n createSafeHTML: function (strings) {\n var _len = arguments.length;\n var values = new Array(_len > 1 ? _len - 1 : 0);\n for (var _key = 1; _key < _len; _key++) {\n values[_key - 1] = arguments[_key];\n }\n\n var escaped = Sanitizer.escapeHTML.apply(\n Sanitizer,\n [strings].concat(values),\n );\n return {\n __html: escaped,\n toString: function () {\n return \"[object WrappedHTMLObject]\";\n },\n info:\n \"This is a wrapped HTML object. See https://developer.mozilla.or\" +\n \"g/en-US/Firefox_OS/Security/Security_Automation for more.\",\n };\n },\n /**\n * Unwrap safe HTML created by createSafeHTML or a custom replacement that\n * underwent security review.\n */\n unwrapSafeHTML: function () {\n var _len = arguments.length;\n var htmlObjects = new Array(_len);\n for (var _key = 0; _key < _len; _key++) {\n htmlObjects[_key] = arguments[_key];\n }\n\n var markupList = htmlObjects.map(function (obj) {\n return obj.__html;\n });\n return markupList.join(\"\");\n },\n };\n\n return Sanitizer;\n});\n","module.exports = function getScrollbarWidth() {\n // Creating invisible container\n const outer = document.createElement(\"div\");\n outer.style.visibility = \"hidden\";\n outer.style.overflow = \"scroll\"; // forcing scrollbar to appear\n outer.style.msOverflowStyle = \"scrollbar\"; // needed for WinJS apps\n document.body.appendChild(outer);\n\n // Creating inner element and placing it in the container\n const inner = document.createElement(\"div\");\n outer.appendChild(inner);\n\n // Calculating difference between container's full width and the child width\n const scrollbarWidth = `${outer.offsetWidth - inner.offsetWidth}px`;\n\n // Removing temporary elements from the DOM\n outer.parentNode.removeChild(outer);\n\n return scrollbarWidth;\n};\n","const select = require(\"./select\");\n/**\n * @name isElement\n * @desc returns whether or not the given argument is a DOM element.\n * @param {any} value\n * @return {boolean}\n */\nconst isElement = (value) =>\n value && typeof value === \"object\" && value.nodeType === 1;\n\n/**\n * @name selectOrMatches\n * @desc selects elements from the DOM by class selector or ID selector.\n * @param {string} selector - The selector to traverse the DOM with.\n * @param {Document|HTMLElement?} context - The context to traverse the DOM\n * in. If not provided, it defaults to the document.\n * @return {HTMLElement[]} - An array of DOM nodes or an empty array.\n */\nmodule.exports = (selector, context) => {\n const selection = select(selector, context);\n if (typeof selector !== \"string\") {\n return selection;\n }\n\n if (isElement(context) && context.matches(selector)) {\n selection.push(context);\n }\n\n return selection;\n};\n","/**\n * @name isElement\n * @desc returns whether or not the given argument is a DOM element.\n * @param {any} value\n * @return {boolean}\n */\nconst isElement = (value) =>\n value && typeof value === \"object\" && value.nodeType === 1;\n\n/**\n * @name select\n * @desc selects elements from the DOM by class selector or ID selector.\n * @param {string} selector - The selector to traverse the DOM with.\n * @param {Document|HTMLElement?} context - The context to traverse the DOM\n * in. If not provided, it defaults to the document.\n * @return {HTMLElement[]} - An array of DOM nodes or an empty array.\n */\nmodule.exports = (selector, context) => {\n if (typeof selector !== \"string\") {\n return [];\n }\n\n if (!context || !isElement(context)) {\n context = window.document; // eslint-disable-line no-param-reassign\n }\n\n const selection = context.querySelectorAll(selector);\n return Array.prototype.slice.call(selection);\n};\n","/**\n * Flips given INPUT elements between masked (hiding the field value) and unmasked\n * @param {Array.HTMLElement} fields - An array of INPUT elements\n * @param {Boolean} mask - Whether the mask should be applied, hiding the field value\n */\nmodule.exports = (field, mask) => {\n field.setAttribute(\"autocapitalize\", \"off\");\n field.setAttribute(\"autocorrect\", \"off\");\n field.setAttribute(\"type\", mask ? \"password\" : \"text\");\n};\n","const resolveIdRefs = require(\"resolve-id-refs\");\nconst toggleFieldMask = require(\"./toggle-field-mask\");\n\nconst CONTROLS = \"aria-controls\";\nconst PRESSED = \"aria-pressed\";\nconst SHOW_ATTR = \"data-show-text\";\nconst HIDE_ATTR = \"data-hide-text\";\n\n/**\n * Replace the word \"Show\" (or \"show\") with \"Hide\" (or \"hide\") in a string.\n * @param {string} showText\n * @return {strong} hideText\n */\nconst getHideText = (showText) =>\n showText.replace(/\\bShow\\b/i, (show) => `${show[0] === \"S\" ? \"H\" : \"h\"}ide`);\n\n/**\n * Component that decorates an HTML element with the ability to toggle the\n * masked state of an input field (like a password) when clicked.\n * The ids of the fields to be masked will be pulled directly from the button's\n * `aria-controls` attribute.\n *\n * @param {HTMLElement} el Parent element containing the fields to be masked\n * @return {boolean}\n */\nmodule.exports = (el) => {\n // this is the *target* state:\n // * if the element has the attr and it's !== \"true\", pressed is true\n // * otherwise, pressed is false\n const pressed =\n el.hasAttribute(PRESSED) && el.getAttribute(PRESSED) !== \"true\";\n\n const fields = resolveIdRefs(el.getAttribute(CONTROLS));\n fields.forEach((field) => toggleFieldMask(field, pressed));\n\n if (!el.hasAttribute(SHOW_ATTR)) {\n el.setAttribute(SHOW_ATTR, el.textContent);\n }\n\n const showText = el.getAttribute(SHOW_ATTR);\n const hideText = el.getAttribute(HIDE_ATTR) || getHideText(showText);\n\n el.textContent = pressed ? showText : hideText; // eslint-disable-line no-param-reassign\n el.setAttribute(PRESSED, pressed);\n return pressed;\n};\n","const EXPANDED = \"aria-expanded\";\nconst CONTROLS = \"aria-controls\";\nconst HIDDEN = \"hidden\";\n\nmodule.exports = (button, expanded) => {\n let safeExpanded = expanded;\n\n if (typeof safeExpanded !== \"boolean\") {\n safeExpanded = button.getAttribute(EXPANDED) === \"false\";\n }\n\n button.setAttribute(EXPANDED, safeExpanded);\n\n const id = button.getAttribute(CONTROLS);\n const controls = document.getElementById(id);\n if (!controls) {\n throw new Error(`No toggle target found with id: \"${id}\"`);\n }\n\n if (safeExpanded) {\n controls.removeAttribute(HIDDEN);\n } else {\n controls.setAttribute(HIDDEN, \"\");\n }\n\n return safeExpanded;\n};\n","const debounce = require(\"./debounce\");\nconst { prefix: PREFIX } = require(\"../config\");\n\nconst CHECKED_CLASS = `${PREFIX}-checklist__item--checked`;\n\nmodule.exports = function validate(el) {\n const id = el.dataset.validationElement;\n const checkList =\n id.charAt(0) === \"#\"\n ? document.querySelector(id)\n : document.getElementById(id);\n\n if (!checkList) {\n throw new Error(`No validation element found with id: \"${id}\"`);\n }\n\n let statusSummary = \"\";\n Object.entries(el.dataset).forEach(([key, value]) => {\n if (key.startsWith(\"validate\")) {\n const validatorName = key.substr(\"validate\".length).toLowerCase();\n const validatorPattern = new RegExp(value);\n const validatorSelector = `[data-validator=\"${validatorName}\"]`;\n const validatorCheckbox = checkList.querySelector(validatorSelector);\n const validatorParent = el.parentNode;\n const statusSummaryContainer = validatorParent.querySelector(\n `[data-validation-status]`,\n );\n\n const checked = validatorPattern.test(el.value);\n validatorCheckbox.classList.toggle(CHECKED_CLASS, checked);\n\n if (!validatorCheckbox) {\n throw new Error(`No validator checkbox found for: \"${validatorName}\"`);\n }\n\n // Create status reports for checklist items\n const statusComplete = el.dataset.validationComplete || \"status complete\";\n const statusIncomplete =\n el.dataset.validationIncomplete || \"status incomplete\";\n let checkboxContent = `${validatorCheckbox.textContent} `;\n\n if (validatorCheckbox.classList.contains(CHECKED_CLASS)) {\n checkboxContent += statusComplete;\n } else {\n checkboxContent += statusIncomplete;\n }\n\n // move status updates to aria-label on checklist item\n validatorCheckbox.setAttribute(\"aria-label\", checkboxContent);\n\n // Create a summary of status for all checklist items\n statusSummary += `${checkboxContent}. `;\n\n // Add summary to screen reader summary container, after a delay\n const srUpdateStatus = debounce(() => {\n statusSummaryContainer.textContent = statusSummary;\n }, 1000);\n\n srUpdateStatus();\n }\n });\n};\n"]} \ No newline at end of file diff --git a/isis/src/docsys/assets/scripts/utility.js b/isis/src/docsys/assets/scripts/utility.js deleted file mode 100644 index 4b6635b07cce815adb88f6252f75c4c94ec223be..0000000000000000000000000000000000000000 --- a/isis/src/docsys/assets/scripts/utility.js +++ /dev/null @@ -1,68 +0,0 @@ - - // SCRIPT: Utility Functions - // Filename: utility.js - // Purpose: miscellaneous little handy JavaScript fuctions - // - // Author: Deborah Lee Soltesz, USGS, 11/2001 - - // History: added popUpNewWindow - dls 2/5/2003 - - - // browser checks - ns4 = (document.layers) ? true:false ; - ns6 = (document.getElementById) ? true:false ; - isNav = (navigator.appName.indexOf("Netscape") != -1) - isMSIE = (navigator.appName.indexOf("Microsoft") != -1) - - - // ***************************************************************** - - // POP UP WINDOW - // Open an image (or other file) in new window sized to width-height. - // If window exists, close and open with new size attributes. - // NO decor (toolbars, menus, scrollbars, etc.) and NOT resizable. - - function popUpWindow (url, width, height) { - if (window["POP"] && window["POP"].closed == false) { - POP = window["POP"] ; - if (ns4) { - POP.close() ; - } - else { - POP.resizeTo (width + 30, height + 50) ; - } - } - POP = open(url,"POP","toolbar=0,location=0,status=0,menubar=0,scrollbars=0,resizable=1,width=" + (width + 20) + ",height=" + (height + 20)); - POP.focus() ; - } - - function popUpWindowScrolling (url, width, height) { - if (window["POPs"] && window["POPs"].closed == false) { - POPs = window["POPs"] ; - if (ns4) { - POP.close() ; - } - else { - POPs.resizeTo (width + 30, height + 50) ; - } - } - POPs = open(url,"POPs","toolbar=0,location=0,status=0,menubar=0,scrollbars=1,resizable=1,width=" + (width + 20) + ",height=" + (height + 20)); - POPs.focus() ; - } - - function popUpNewWindow (url, width, height) { - //create random window name - now = new Date() ; - winname = "POP" + now.getHours() + now.getMinutes() + now.getSeconds() + (String)(Math.round(Math.random() * 1000)) ; - open(url,winname,"toolbar=0,location=0,status=0,menubar=0,scrollbars=0,resizable=1,width=" + (width + 20) + ",height=" + (height + 20)); - } - - // CLEAN UP POP UP WINDOW - function cleanUpPopUpWindow () { - if (window["POP"] && window["POP"].closed == false) { - POP = window["POP"] ; - POP.close() ; - } - } - - diff --git a/isis/src/docsys/assets/styles/IsisStyleAPI.css b/isis/src/docsys/assets/styles/IsisStyleAPI.css new file mode 100644 index 0000000000000000000000000000000000000000..afa4f79ff1a244ec8743426177a709ebafeb1ddc --- /dev/null +++ b/isis/src/docsys/assets/styles/IsisStyleAPI.css @@ -0,0 +1,3 @@ +#nav-tree a { + box-sizing: content-box; +} \ No newline at end of file diff --git a/isis/src/docsys/assets/styles/IsisStyleCommon.css b/isis/src/docsys/assets/styles/IsisStyleCommon.css index c25f04e2a632d18d9e0e28e8cb588a2f58cda7e6..6863dcd12bc61f306170ae0629b78cb452b26f45 100644 --- a/isis/src/docsys/assets/styles/IsisStyleCommon.css +++ b/isis/src/docsys/assets/styles/IsisStyleCommon.css @@ -97,7 +97,7 @@ rgba(0, 0, 0, 0.2), rgba(0, 0, 0, 0.3) ), - url(../banners/moon-cr.jpg); + url(../img/moon-cr.jpg); color: white; padding: 4rem; background-size: cover; @@ -171,12 +171,14 @@ list-style-type: none; width: 14rem; margin-bottom: 0.6rem; + display: inline-flex; } .card-list-sm > li > a { display: block; padding: 0.5rem 1rem; text-decoration: none; + width: calc(14rem - 4px); } .card-list-sm > li > a:hover { @@ -271,13 +273,6 @@ font-family: Arial, Helvetica, Geneva, sans-serif ; font-size: 80% ; } - - /* ---------------------------------------------------------------- - * IMAGE FORMATTING: special formatting for linked images */ - - .blackBorderedImage { - border: 2px solid black ; - } /* ---------------------------------------------------------------- * Page format/hiding. should be at bottom of css */ diff --git a/isis/src/docsys/build/IsisDocumentTOCbuild.xsl b/isis/src/docsys/build/IsisDocumentTOCbuild.xsl deleted file mode 100644 index 02bce7e8490f8a86ae9e2314ae052f5dcebfe4c3..0000000000000000000000000000000000000000 --- a/isis/src/docsys/build/IsisDocumentTOCbuild.xsl +++ /dev/null @@ -1,74 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<xsl:stylesheet version="1.0" - xmlns:xsl="http://www.w3.org/1999/XSL/Transform" - xmlns:fo="http://www.w3.org/1999/XSL/Format" - exclude-result-prefixes="xmlns fo"> - -<!-- - -This stylesheet will be used to strip information out of the XML files in the documents directory -and create a new XML file for generating tables of contents and upper level web pages - -Author -Deborah Lee Soltesz -12/04/2002 - ---> - -<xsl:param name="dirParam"/> - -<xsl:output indent="yes" omit-xml-declaration="yes"> - <xsl:template match="/"> - <xsl:if test="documentation[(@hidden != 'yes' and @hidden != 'true') or not(@hidden)]"> - <xsl:apply-templates select="documentation" /> - </xsl:if> - </xsl:template> -</xsl:output> - -<xsl:output indent="yes" omit-xml-declaration="yes"> - <xsl:template name="class" match="documentation"> - <document> - - <title><xsl:value-of select="bibliography/title"/></title> - - <brief><xsl:value-of select="bibliography/brief"/></brief> - - <description><xsl:value-of select="bibliography/description"/></description> - - <category><xsl:for-each select="category/categoryItem"><categoryItem><xsl:value-of select="normalize-space(.)" /></categoryItem></xsl:for-each></category> - <audience><xsl:for-each select="audience/target"><target><xsl:value-of select="normalize-space(.)" /></target></xsl:for-each></audience> - - - <files> - <xsl:for-each select="files/file"> - <file hidden="{@hidden}" primary="{@primary}"> - <type><xsl:value-of select="type"/></type> - - <xsl:if test="subtitle"> - <subtitle><xsl:value-of select="subtitle"/></subtitle> - </xsl:if> - - <xsl:if test="size"> - <size><xsl:value-of select="size"/></size> - </xsl:if> - - <xsl:choose> - <xsl:when test="source/URL"> - <source><xsl:value-of select="normalize-space(source/URL)"/></source> - </xsl:when> - <xsl:when test="source/filename"> - <source>../documents/<xsl:value-of select="$dirParam"/>/<xsl:value-of select="normalize-space(source/filename)"/></source> - </xsl:when> - </xsl:choose> - - </file> - - </xsl:for-each> - </files> - - </document> - </xsl:template> -</xsl:output> - -</xsl:stylesheet> - diff --git a/isis/src/docsys/build/IsisInlineDocumentBuild.xsl b/isis/src/docsys/build/IsisInlineDocumentBuild.xsl deleted file mode 100644 index 335e17c6279feec4527e087eed42240b90812711..0000000000000000000000000000000000000000 --- a/isis/src/docsys/build/IsisInlineDocumentBuild.xsl +++ /dev/null @@ -1,42 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format"> - -<!-- - -This stylesheet will be used to generate a Makefile for turning documentation inlined in the Documentation XML file -into an HTML page - -Author -Deborah Lee Soltesz -12/04/2002 - ---> - -<xsl:param name="dirParam"/> - -<xsl:output indent="no" omit-xml-declaration="yes"> - <xsl:template match="/"> - <xsl:apply-templates select="documentation" /> - </xsl:template> -</xsl:output> - -<!-- the following template contains very little whitespace to - avoid adding spaces at the beginnings of the Makefile macro - lines: trying to make this template more "readable" will - likely break the system --> - -<xsl:template name="document" match="documentation"> -include $(ISISROOT)/make/isismake.os -docs: -<xsl:text> </xsl:text>echo " Constructing [<xsl:value-of select="$dirParam"/>]" -<xsl:for-each select="files/file"><xsl:if test="body"><xsl:choose> -<xsl:when test="@primary = 'true'"><xsl:text> </xsl:text>$(XALAN) $(XALAN_PARAM_OPTION) menuPath "'../../'" $(XALAN_PARAM_OPTION) filenameParam "'<xsl:value-of select="normalize-space(source/filename)"/>'" $(XALAN_OUTFILE_OPTION) <xsl:value-of select="normalize-space(source/filename)"/><xsl:text> $(XALAN_INFILE_OPTION) </xsl:text><xsl:value-of select="$dirParam"/>.xml $(XALAN_XSL_OPTION) ../../build/IsisPrimaryPageBuild.xsl</xsl:when> -<xsl:otherwise><xsl:text> </xsl:text>$(XALAN) $(XALAN_PARAM_OPTION) menuPath "'../../'" $(XALAN_PARAM_OPTION) filenameParam "'<xsl:value-of select="normalize-space(source/filename)"/>'" $(XALAN_OUTFILE_OPTION) <xsl:value-of select="normalize-space(source/filename)"/><xsl:text> $(XALAN_INFILE_OPTION) </xsl:text><xsl:value-of select="$dirParam"/>.xml $(XALAN_XSL_OPTION) ../../build/IsisSubPageBuild.xsl</xsl:otherwise> -</xsl:choose> -<xsl:text>
</xsl:text> -</xsl:if> -</xsl:for-each> -</xsl:template> - -</xsl:stylesheet> - diff --git a/isis/src/docsys/build/IsisPrimaryPageBuild.xsl b/isis/src/docsys/build/IsisPrimaryPageBuild.xsl deleted file mode 100644 index 7847c427d81ea80ec4b56adc5c668754308af54d..0000000000000000000000000000000000000000 --- a/isis/src/docsys/build/IsisPrimaryPageBuild.xsl +++ /dev/null @@ -1,305 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<xsl:stylesheet version="1.0" - xmlns:xsl="http://www.w3.org/1999/XSL/Transform" - xmlns:fo="http://www.w3.org/1999/XSL/Format" - exclude-result-prefixes="xmlns fo"> - -<!-- - -This stylesheet will be used to transform a Documentation XML file into an HTML page. -If there are multiple pages in the document, this stylesheet is used to generate the first page -of the set, and IsisSubPageBuild.xsl is used to generate the sub-pages - -Author -Deborah Lee Soltesz -12/04/2002 - ---> - - <xsl:include href="menu.xsl"/> - - - <xsl:param name="filenameParam"/> - - - <xsl:output - media-type="text/html" - doctype-public="-//W3C//DTD HTML 4.01 Transitional//EN" - doctype-system="http://www.w3.org/TR/html4/loose.dtd" - indent="yes" - encoding="utf-8" - omit-xml-declaration="yes"/> - - - <xsl:template match="/"> - <xsl:apply-templates select="documentation" /> - </xsl:template> - - - <xsl:template name="document" match="documentation"> - <html> - - <head> - <title> - USGS Isis: <xsl:value-of select="bibliography/title"/> - <xsl:if test="files/file/subtitle and normalize-space(files/file) = normalize-space($filenameParam)"> - - <xsl:value-of select="files/file/subtitle"/> - </xsl:if> - </title> - - <meta name="author" content="{normalize-space(bibliography/author)}"/> - <meta name="description" content="{normalize-space(bibliography/description)}"/> - <xsl:choose> - <xsl:when test="bibliography/publisher"> - <meta name="publisher" content="{normalize-space(bibliography/publisher)}"/> - </xsl:when> - <xsl:otherwise> - <meta name="publisher" content="USGS-GD-Astrogeology"/> - </xsl:otherwise> - </xsl:choose> - - <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> - <meta name="country" content="USA"/> - <meta name="state" content="AZ"/> - <meta name="county" content="Coconino"/> - <meta name="city" content="Flagstaff"/> - <meta name="zip" content="86001"/> - - <link rel="stylesheet" href="../../assets/styles/IsisStyleCommon.css"/> - <link rel="stylesheet" href="../../assets/styles/main.css"/> - <link rel="stylesheet" media="print" href="../assets/styles/print.css"/> - <!-- Dynamic analytics insertion to prevent running on local URLs --> - <xsl:text>
</xsl:text> - <script type="text/javascript"> - //<xsl:comment><![CDATA[ - (function() { - var usgsAnalytics = document.createElement('script'); - usgsAnalytics.type = 'text/javascript'; - usgsAnalytics.async = true; - usgsAnalytics.src = 'http://www.usgs.gov/scripts/analytics/usgs-analytics.js'; - if('http:' == document.location.protocol) { - var s = document.getElementsByTagName('script')[0]; - s.parentNode.insertBefore(usgsAnalytics, s); - } - })(); - ]]></xsl:comment> - <xsl:text>
</xsl:text> - </script> - </head> - - <body> - <div class="isisMenu"> - <xsl:call-template name="writeMenu"/> - </div> - - <div class="isisContent"> - - <!-- HEADING --> - <a href="http://www.usgs.gov"><img src="../../assets/icons/littleVIS.gif" width="80" height="22" border="0" alt="USGS"/></a> - <p style="margin-top:10px; margin-bottom:0px;"> - <xsl:choose> - <xsl:when test="category[categoryItem = 'isis2']"> - ISIS 2 Documentation - </xsl:when> - <xsl:otherwise> - ISIS Documentation - </xsl:otherwise> - </xsl:choose> - </p> - <xsl:if test="files/file/subtitle and normalize-space(files/file) = normalize-space($filenameParam)"> - <h1 class="subtitle"><xsl:value-of select="files/file/subtitle"/></h1> - </xsl:if> - <hr/> - - <table width="100%" cellpadding="0" border="0" cellspacing="0"> - <tr valign="top"> - <td align="left"> - <h1><xsl:value-of select="bibliography/title"/></h1> - <h1 class="subtitle"> - <xsl:value-of select="bibliography/brief"/> - </h1> - </td> - - <td align="right" class="caption" nowrap="nowrap"> - - <script language="javascript" type="text/javascript"> - //<xsl:comment><![CDATA[ - // create back link if javascript is available - if (history.length > 1) { - document.write ("<a" + " href='javascript:history.back();'>Back</" + "a> | ") ; - } - //]]></xsl:comment> - </script> - - <a href="../../index.html">Home</a> - </td> - </tr> - </table> - - <!-- links to other chapters/sections --> - <xsl:if test="count(files/file) > 1"> - <p class="TOCanchors"> - <xsl:if test="count(files/file[type = 'HTML']) > 1"> - <xsl:for-each select="files/file[type = 'HTML']"> - <xsl:choose> - <xsl:when test="normalize-space(source/filename) != normalize-space($filenameParam)"> - <xsl:choose> - <xsl:when test="subtitle"> - <a href="{normalize-space(source/filename)}"><xsl:value-of select="normalize-space(subtitle)"/></a> - </xsl:when> - <xsl:otherwise> - <a href="{normalize-space(source/filename)}"><xsl:value-of select="position()"/></a> - </xsl:otherwise> - </xsl:choose> - </xsl:when> - - <xsl:otherwise> - <span style="font-style:italic; font-weight:bold;"> - <xsl:choose> - <xsl:when test="subtitle"> - <xsl:value-of select="normalize-space(subtitle)"/> - </xsl:when> - <xsl:otherwise> - <xsl:value-of select="position()"/> - </xsl:otherwise> - </xsl:choose> - </span> - </xsl:otherwise> - </xsl:choose> - <xsl:if test="position() != last()"> | </xsl:if> - </xsl:for-each> - </xsl:if> - - <xsl:for-each select="files/file[type != 'HTML']"> - <br/> - <xsl:choose> - <xsl:when test="normalize-space(source/filename) != normalize-space($filenameParam)"> - <xsl:choose> - <xsl:when test="subtitle"> - <a href="{normalize-space(source/filename)}"><xsl:value-of select="normalize-space(subtitle)"/> - (<xsl:value-of select="type"/><xsl:if test="size">, <xsl:value-of select="size"/></xsl:if>)</a> - </xsl:when> - <xsl:otherwise> - <a href="{normalize-space(source/filename)}"><xsl:value-of select="type"/><xsl:if test="size"> (<xsl:value-of select="size"/>)</xsl:if></a> - </xsl:otherwise> - </xsl:choose> - </xsl:when> - - <xsl:otherwise> - <span style="font-style:italic; font-weight:bold;"> - <xsl:choose> - <xsl:when test="subtitle"> - <xsl:value-of select="normalize-space(subtitle)"/> - </xsl:when> - <xsl:otherwise> - <xsl:value-of select="position()"/> - </xsl:otherwise> - </xsl:choose> - </span> - </xsl:otherwise> - </xsl:choose> - <xsl:if test="position() != last()"> | </xsl:if> - </xsl:for-each> - </p> - </xsl:if> - - - - - <hr/> - <!-- END HEADING --> - - - <!-- INLINE BODY CONTENT --> - <xsl:for-each select="files/file"> - <xsl:if test="normalize-space(source/filename) = normalize-space($filenameParam)"> - <xsl:if test="body"> - - <xsl:choose> - <xsl:when test="body/src"> - <!-- Output body content from source file --> - <!--xsl:copy-of select="document(body/src)"/--> - <xsl:apply-templates select="document(body/src)/* | document(body/src)/text()" mode="copyContents"/> - </xsl:when> - <xsl:otherwise> - <!--output body content inlined in this file --> - <xsl:apply-templates select="body/*" mode="copyContents"/> - </xsl:otherwise> - </xsl:choose> - - </xsl:if> - </xsl:if> - </xsl:for-each> - <!-- END INLINE BODY CONTENT --> - - -<!-- History --> -<xsl:if test="history"> - <a name="History"></a> - <hr/> - <h2> - Document History - </h2> - - <table> - <xsl:for-each select="history/change[(@hidden != 'yes' and @hidden != 'true') or not(@hidden)]"> - <tr> - <td class="tableCellHistory_name" nowrap="nowrap"> - <xsl:value-of select="@name"/> - </td> - - <td class="tableCellHistory_date" nowrap="nowrap"> - <xsl:value-of select="@date"/> - </td> - - <td class="tableCellHistory_description"> - <xsl:value-of select="."/> - </td> - </tr> - </xsl:for-each> - </table> -</xsl:if> - -<!-- FOOTER --> -<script type="text/javascript" language="JavaScript" src="../../assets/scripts/footer.js"></script> -</div> - - - </body> - </html> - - </xsl:template> - - <xsl:template match="definitions" mode="copyContents"> - <h3>Table of Contents</h3> - <ul> - <xsl:for-each select="definition"> - <xsl:sort order="ascending" select="@name" /> - <li><a href="#{translate(@name, ' ', '')}"><xsl:value-of select="@name"/></a></li> - </xsl:for-each> - </ul> - - <hr /> - - <xsl:for-each select="definition"> - <xsl:sort order="ascending" select="@name" /> - <h2><a name="{translate(@name, ' ', '')}"><xsl:value-of select="@name"/></a></h2> - <p> - <xsl:value-of select="."/> - </p> - </xsl:for-each> - </xsl:template> - - <xsl:template match="*" mode="copyContents"> - <xsl:element name="{name()}" namespace="{namespace-uri()}"> - <xsl:copy-of select="@*"/> - <xsl:apply-templates mode="copyContents"/> - </xsl:element> - </xsl:template> - - <xsl:template match="text()" mode="copyContents"> - <xsl:value-of select="."/> - <xsl:apply-templates mode="copyContents"/> - </xsl:template> - -</xsl:stylesheet> diff --git a/isis/src/docsys/build/IsisSubPageBuild.xsl b/isis/src/docsys/build/IsisSubPageBuild.xsl deleted file mode 100644 index 4f9e216d732f2054b02a0a554038d7ab56be7513..0000000000000000000000000000000000000000 --- a/isis/src/docsys/build/IsisSubPageBuild.xsl +++ /dev/null @@ -1,281 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<xsl:stylesheet version="1.0" - xmlns:xsl="http://www.w3.org/1999/XSL/Transform" - xmlns:fo="http://www.w3.org/1999/XSL/Format" - exclude-result-prefixes="xmlns fo"> - -<!-- -This stylesheet will be used to transform a Documentation XML file into an HTML page. -If there are multiple pages in the document, this stylesheet is used to generate the sub-page -of the set, and IsisPrimaryPageBuild.xsl is used to generate the main page - -Author -Deborah Lee Soltesz -12/04/2002 ---> - - - <xsl:output - media-type="text/html" - doctype-public="-//W3C//DTD HTML 4.01 Transitional//EN" - doctype-system="http://www.w3.org/TR/html4/loose.dtd" - indent="yes" - encoding="utf-8" - omit-xml-declaration="yes"/> - - <xsl:param name="menuPath"/> - - <xsl:include href="header.xsl"/> - <xsl:include href="menu.xsl"/> - <xsl:include href="footer.xsl"/> - - <xsl:param name="filenameParam"/> - - - <xsl:output - media-type="text/html" - doctype-public="-//W3C//DTD HTML 4.01 Transitional//EN" - doctype-system="http://www.w3.org/TR/html4/loose.dtd" - indent="yes" - encoding="utf-8" - omit-xml-declaration="yes"/> - - - <xsl:template match="/"> - <xsl:apply-templates select="documentation" /> - </xsl:template> - - <xsl:template name="document" match="documentation"> - <html> - - <head> - <title> - USGS Isis: <xsl:value-of select="bibliography/title"/> - <xsl:if test="files/file/subtitle and normalize-space(files/file) = normalize-space($filenameParam)"> - - <xsl:value-of select="files/file/subtitle"/> - </xsl:if> - </title> - - <meta name="author" content="{normalize-space(bibliography/author)}"/> - <meta name="description" content="{normalize-space(bibliography/description)}"/> - <xsl:choose> - <xsl:when test="bibliography/publisher"> - <meta name="publisher" content="{normalize-space(bibliography/publisher)}"/> - </xsl:when> - <xsl:otherwise> - <meta name="publisher" content="USGS-GD-Astrogeology"/> - </xsl:otherwise> - </xsl:choose> - - <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> - <meta name="country" content="USA"/> - <meta name="state" content="AZ"/> - <meta name="county" content="Coconino"/> - <meta name="city" content="Flagstaff"/> - <meta name="zip" content="86001"/> - - <!-- Govt --> - <link rel="stylesheet" href="../../assets/styles/uswds.css"/> - <script src="../../../../assets/scripts/uswds-init.min.js"></script> - - <!-- USGS --> - <link rel="stylesheet" href="../../assets/styles/usgs/common.css" /> - <link rel="stylesheet" href="../../assets/styles/usgs/custom.css" /> - - <!-- ISIS Docs --> - <link rel="stylesheet" href="../../assets/styles/IsisStyleCommon.css"></link> - <link rel="stylesheet" href="../styles/IsisApplicationDocStyle.css"></link> - <link rel="stylesheet" media="print" href="../../assets/styles/print.css"/> - - <noscript> <!-- Use Print stylesheet, unhide all sections if no script --> - <link rel="stylesheet" href="../../assets/styles/print.css"/> - </noscript> <!-- Note: currently hides header/menu --> - - </head> - - <body> - - <script src="../../assets/scripts/uswds.min.js"></script> - - <xsl:call-template name="writeHeader"/> - - <div id="page"> - - <div class="isisMenu"> - <xsl:call-template name="writeMenu"/> - </div> - - <main class="isisContent"> - - <xsl:if test="files/file/subtitle and normalize-space(files/file) = normalize-space($filenameParam)"> - <h1 class="subtitle"><xsl:value-of select="files/file/subtitle"/></h1> - </xsl:if> - <hr/> - - <h1><xsl:value-of select="bibliography/title"/></h1> - <h2 class="subtitle"> - <xsl:value-of select="bibliography/brief"/> - </h2> - - <!-- links to other chapters/sections --> - <xsl:if test="count(files/file) > 1"> - <p class="TOCanchors"> - <xsl:if test="count(files/file[type = 'HTML']) > 1"> - <xsl:for-each select="files/file[type = 'HTML']"> - <xsl:choose> - <xsl:when test="normalize-space(source/filename) != normalize-space($filenameParam)"> - <xsl:choose> - <xsl:when test="subtitle"> - <a href="{normalize-space(source/filename)}"><xsl:value-of select="normalize-space(subtitle)"/></a> - </xsl:when> - <xsl:otherwise> - <a href="{normalize-space(source/filename)}"><xsl:value-of select="position()"/></a> - </xsl:otherwise> - </xsl:choose> - </xsl:when> - - <xsl:otherwise> - <span style="font-style:italic; font-weight:bold;"> - <xsl:choose> - <xsl:when test="subtitle"> - <xsl:value-of select="normalize-space(subtitle)"/> - </xsl:when> - <xsl:otherwise> - <xsl:value-of select="position()"/> - </xsl:otherwise> - </xsl:choose> - </span> - </xsl:otherwise> - </xsl:choose> - <xsl:if test="position() != last()"> | </xsl:if> - </xsl:for-each> - </xsl:if> - - <xsl:for-each select="files/file[type != 'HTML']"> - <br/> - <xsl:choose> - <xsl:when test="normalize-space(source/filename) != normalize-space($filenameParam)"> - <xsl:choose> - <xsl:when test="subtitle"> - <a href="{normalize-space(source/filename)}"><xsl:value-of select="normalize-space(subtitle)"/> - (<xsl:value-of select="type"/><xsl:if test="size">, <xsl:value-of select="size"/></xsl:if>)</a> - </xsl:when> - <xsl:otherwise> - <a href="{normalize-space(source/filename)}"><xsl:value-of select="type"/><xsl:if test="size"> (<xsl:value-of select="size"/>)</xsl:if></a> - </xsl:otherwise> - </xsl:choose> - </xsl:when> - - <xsl:otherwise> - <span style="font-style:italic; font-weight:bold;"> - <xsl:choose> - <xsl:when test="subtitle"> - <xsl:value-of select="normalize-space(subtitle)"/> - </xsl:when> - <xsl:otherwise> - <xsl:value-of select="position()"/> - </xsl:otherwise> - </xsl:choose> - </span> - </xsl:otherwise> - </xsl:choose> - <xsl:if test="position() != last()"> | </xsl:if> - </xsl:for-each> - </p> - </xsl:if> - - <hr/> - <!-- END HEADING --> - - - <!-- INLINE BODY CONTENT --> - <xsl:for-each select="files/file[normalize-space(source/filename) = normalize-space($filenameParam)]"> - <xsl:if test="body"> - <xsl:choose> - <xsl:when test="body/src"> - <!-- Output body content from source file --> - <!--xsl:copy-of select="document(body/src)"/--> - <xsl:apply-templates select="document(body/src)/* | document(body/src)/text()" mode="copyContents"/> - </xsl:when> - <xsl:otherwise> - <!--output body content inlined in this file --> - <xsl:apply-templates select="body/*" mode="copyContents"/> - </xsl:otherwise> - </xsl:choose> - </xsl:if> - </xsl:for-each> - <!-- END INLINE BODY CONTENT --> - - - - <!-- History --> - <xsl:if test="history"> - <a name="History"></a> - <hr/> - <h2> - Document History - </h2> - - <table> - <xsl:for-each select="history/change[(@hidden != 'yes' and @hidden != 'true') or not(@hidden)]"> - <tr> - <td class="tableCellHistory_name" nowrap="nowrap"> - <xsl:value-of select="@name"/> - </td> - - <td class="tableCellHistory_date" nowrap="nowrap"> - <xsl:value-of select="@date"/> - </td> - - <td class="tableCellHistory_description"> - <xsl:value-of select="."/> - </td> - </tr> - </xsl:for-each> - </table> - </xsl:if> - - </main> - - </div> - - <xsl:call-template name="writeFooter"/> - - </body> - </html> - - </xsl:template> - - <xsl:template match="definitions" mode="copyContents"> - <h3>Table of Contents</h3> - <ul> - <xsl:for-each select="definition"> - <xsl:sort order="ascending" select="@name" /> - <li><a href="#{translate(normalize-space(@name), ' ', '')}"><xsl:value-of select="@name"/></a></li> - </xsl:for-each> - </ul> - - <hr /> - - <xsl:for-each select="definition"> - <xsl:sort order="ascending" select="@name" /> - <h2><a name="{translate(normalize-space(@name), ' ', '')}"><xsl:value-of select="@name"/></a></h2> - <p> - <xsl:apply-templates mode="copyContents"/> - </p> - </xsl:for-each> - </xsl:template> - - <xsl:template match="*" mode="copyContents"> - <xsl:element name="{name()}" namespace="{namespace-uri()}"> - <xsl:copy-of select="@*"/> - <xsl:apply-templates mode="copyContents"/> - </xsl:element> - </xsl:template> - - <xsl:template match="text()" mode="copyContents"> - <xsl:value-of select="."/> - <xsl:apply-templates mode="copyContents"/> - </xsl:template> - -</xsl:stylesheet> diff --git a/isis/src/docsys/build/doctoc_footer.xml b/isis/src/docsys/build/doctoc_footer.xml deleted file mode 100644 index 3d8c267325c509716393f71fef37d0a600bbf57d..0000000000000000000000000000000000000000 --- a/isis/src/docsys/build/doctoc_footer.xml +++ /dev/null @@ -1 +0,0 @@ -</tableofcontents> \ No newline at end of file diff --git a/isis/src/docsys/build/doctoc_header.xml b/isis/src/docsys/build/doctoc_header.xml deleted file mode 100644 index 355fbd1ec32aa1eb822dfa3c1ee7c9da28e08c39..0000000000000000000000000000000000000000 --- a/isis/src/docsys/build/doctoc_header.xml +++ /dev/null @@ -1 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="yes"?><tableofcontents> \ No newline at end of file diff --git a/isis/src/docsys/build/main.xsl b/isis/src/docsys/build/main.xsl index 7fb9a7bb63409c7169e3f0a901c9ad34e4f040b5..cea64afce7dacd383db1cbedb32fa530be7c6f96 100644 --- a/isis/src/docsys/build/main.xsl +++ b/isis/src/docsys/build/main.xsl @@ -51,7 +51,6 @@ Deborah Lee Soltesz <!-- ISIS Docs --> <link rel="stylesheet" href="assets/styles/IsisStyleCommon.css"/> <link rel="stylesheet" media="print" href="assets/styles/print.css"/> - <script type="text/javascript" src="assets/scripts/homepage.js"></script> <!-- USGS --> <link rel="stylesheet" href="assets/styles/usgs/common.css" /> diff --git a/isis/src/docsys/documents/IsisHistory/IsisHistory.xml b/isis/src/docsys/documents/IsisHistory/IsisHistory.xml deleted file mode 100644 index ed1477c90e0753225ad5af88187095787af13c8b..0000000000000000000000000000000000000000 --- a/isis/src/docsys/documents/IsisHistory/IsisHistory.xml +++ /dev/null @@ -1,513 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<documentation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://isis.astrogeology.usgs.gov/Schemas/Documentation/documentation.xsd"> - <files> - <file> - <body> - <h2><a name="Introduction">Introduction</a></h2> - <p> - Integrated Software for Imagers and Spectrometers (ISIS) has been a staple - for the cartographic and scientific analysis of planetary image data - since 1992 with a heritage reaching back to 1971. The key strength of - ISIS is its ability to rigorously "control" planetary image data, - calculating the proper location and orientation of the observer and the - target. It is developed and maintained by the U.S. Geological Survey - using funds from the NASA Planetary Geology and Geophysics Cartography - Program and various U.S. and international missions. ISIS forms the - backbone for some ground data systems that process raw spacecraft data - into products suitable for archiving in the NASA Planetary Data System - (PDS). For example, processing the Lunar Reconnaissance Orbiter Camera - (LROC) and Mars Reconnaissance Orbiter (MRO) HiRISE images rely on - ISIS. - </p> - <p> - The software has evolved numerous times to keep up with advances in - computing technology. The following outlines the progression of the - software since its inception: - </p> - <p> - <table class="tableFormattedInformation" align="center" border="1"> - <tr> - <th>Dates</th> - <th>Computer</th> - <th>Cartographic Software</th> - </tr> - <tr> - <td>1971-1980</td> - <td>PDP-11/DOS-BATCH</td> - <td>Unnamed</td> - </tr> - <tr> - <td>1978-1987</td> - <td>PDP-11/RSX-11M</td> - <td>Flagstaff Image Processing System (FIPS)</td> - </tr> - <tr> - <td>1985-1994</td> - <td>VAX/VMS</td> - <td>Planetary Image Cartography System (PICS)</td> - </tr> - <tr> - <td>1992-Present</td> - <td>UNIX</td> - <td>Integrated Software for Imagers and Spectrometers (ISIS)</td> - </tr> - </table> - </p> - - <h2><a name="TheEarlyYears">The Early Years</a></h2> - <p> - <table class="imageTable" align="left" style="width:130px;"> - <tr> - <td> - <a href="images/computer_room.jpg"> - <img src="images/thumbs/computer_room.jpg" width="100" height="62" alt="[Computer Room]"/></a> - <p> - Computer Room - </p> - <p class="caption"> - 600x370, 135 KB - </p> - </td> - </tr> - </table> - </p> - - <p> - In 1971, Astrogeology's involvement in the Apollo program ended, and - many personnel in computer/cartographic related positions - transferred to Earth Resources Observation and - Science (EROS) Center, to other federal agencies, or took jobs in the - private sector. James Crawforth (also known as Jim) and Alex Acosta - remained and established - a computer division to serve the Flagstaff Field Center. Development - of the unnamed image processing software package began on a Digital - Equipment Corporation (DEC) PDP-11/20 minicomputer with 8 K bytes of - memory, two 2.5 megabyte removable disks, an 800 bpi tape drive, a card - reader, and a teletype terminal. The PDP-11/20 ran a single user DOS/Batch - operating system that executed programs which were read from keypunch - cards. The images were printed on film transparencies with an - $80,000 Optronics International Inc. filmwriter, and then viewed by - the analyst. - </p> - <br clear="all"/> - - <h2><a name="FlagstaffImageProcessingSystem">The Flagstaff Image Processing System</a></h2> - - <p> - <table class="imageTable" align="left" style="width:130px;"> - <tr> - <td> - <a href="images/ella.jpg"> - <img src="images/thumbs/ella.jpg" width="91" height="100" alt="[Ella]"/></a> - <p> - Ella Lee using a DeAnza system to display her work - </p> - <p class="caption"> - 456x500, 115 KB - </p> - </td> - </tr> - </table> - </p> - <p> - In the late 1970s, the unnamed USGS image processing software was - migrated to a DEC PDP-11/45 minicomputer with 256 KB of memory and - larger 40 MB disks the size of washing machines, and ran the RSX-11M - operating system. This migration allowed a host of advances such as - (a) multiple users having access to the computer through VT52 black - and white video terminals, (b) programmers could develop applications - using as much as 32 KB of memory, and (c) a new method to view - images: on a screen using a DeAnza 512x512 Frame Buffer display - system! This configuration became known as the Flagstaff Image - Processing System (FIPS). - </p> - - <br clear="all"/> - - - <h2><a name="ThePlanetaryImageCartographySystem">The Planetary Image Cartography System</a></h2> - - <p> - In the early 1980s, DEC introduced their new VAX/VMS computers which - allowed for virtual addressing. Developers no longer had restrictions - on the size of the programs they developed. This major change in the - computing environment allowed the Astrogeology programming team, led - by Eric Eliason, to convert the software from FIPS to the Planetary - Image Cartography System (PICS). The Transportable Application Executive - (TAE) was chosen as the user interface, and the programs migrated to run - on the VAX/VMS computers. The PICS software package was a popular tool - in the planetary science community because of its ability to process - Viking Orbiter, Voyager, Magellan, Landsat, and various other spacecraft - imagery. - </p> - - <table class="imageTable" align="center" border="1" style="width:400px;"> - <tr> - <td> - <a href="images/grinnell_station.jpg"> - <img src="images/thumbs/grinnell_station.jpg" width="123" height="100" alt="[Grinnell Workstation]"/></a> - <p> - Grinnell Workstation - </p> - <p class="caption"> - 615x500, 190 KB - </p> - </td> - <td> - <a href="images/grinnell.jpg"> - <img src="images/thumbs/grinnell.jpg" width="65" height="100" alt="[Grinnell System]"/></a> - <p> - Grinnell System - </p> - <p class="caption"> - 333x500, 95 KB - </p> - </td> - <td> - <a href="images/vax4000.jpg"> - <img src="images/thumbs/vax4000.jpg" width="67" height="100" alt="[VAX 4000]"/></a> - <p> - VAX 4000 - </p> - <p class="caption"> - 325x500, 95 KB - </p> - </td> - </tr> - </table> - - <br clear="all"/> - - <h2><a name="IsisSoftware">Integrated Software for Imagers and Spectrometers</a></h2> - <p> - In the late 1980s, the requirement to handle large volumes of complex - data acquired by new instruments significantly changed the requirements - on Astrogeology's imaging processing software. PICS could only handle - images with 7 or fewer bands, and left the user to manage each band as - a separate file. The Galileo mission's Near-Infrared Mapping Spectrometer - (NIMS) instrument, a hyperspectral imager capable of collecting images - with up to 408 bands, was the first to show the limitation of the PICS - software. To efficiently handle many bands for - a single image, the PICS software package had to be fundamentally - redesigned. The new package, the Integrated System for Imaging - Spectrometers (ISIS) came into existence under the guidance of the - designer Jim Torson and developer Kris Becker. After passing through - an internal version 1.0 prototype, this software was released as - ISIS 2.0. - </p> - <p> - In the early 1990s, the Clementine mission collected hundreds of - thousands of images with the Ultraviolet/Visible (UVVIS) and Near-Infrared - (NIR) cameras. The hardware and software requirement to process the - large volume of data led to a transition to new hardware and the use of - the Oracle data base system to streamline the processing methods. Perl - scripts were used to run repetitive tasks and also introduced at this - time. These innovations were largely incompatible with PICS. - </p> - <table class="imageTable" align="left" style="width:130px;"> - <tr> - <td> - <a href="images/tae.jpg"> - <img src="images/thumbs/tae.jpg" width="125" height="100" alt="[Janet using TAE]"/></a> - <p> - Janet Richie uses TAE for her processing work - </p> - <p class="caption"> - 500x401, 150 KB - </p> - </td> - </tr> - </table> - <p> - Cost also drove the change from PICS to ISIS. PICS operated on the aging - and expensive VAX/VMS computer system. The planetary community often - lamented the $50,000 price tag for a single machine with a display - device. At this time, UNIX began to make a push in the computing - world. Astrogeology's computer group decided to merge the PICS and - ISIS software and move to the SunOS and DEC OSF1 platforms under - the UNIX operating system. The integration of PICS and ISIS was led - by Kay Edwards, leading to the creation of ISIS 2.1. - </p> - <p> - During the late 1990s, ISIS continued to grow in both number of - applications and the supported operating systems. Software to process - data from Galileo Solid State Imager, Imager for Mars Pathfinder, Mars - Global Surveyor Mars Orbiter Camera, Mars Odyssey THEMIS, and other - instruments were added. The software was ported to the Linux operating - system as the demand for cheaper computers with "Open-source software" - increased. The ISIS 2.1 display software allowed for visual image - analysis directly on the user's desktop instead of requiring - specialized monitors. ISIS made huge gains in usage by non-USGS - customers, especially with the increased focus on cartographic - processing. With the popularity of the ISIS software package, the - meaning of the acronym "ISIS" was changed to Integrated System for - Imagers and Spectrometers. - </p> - <p> - - By 2001, Astrogeology recognized that the cost and time to maintain - the ISIS software package was becoming more difficult as different - components of the software system became obsolete or became harder - to manage. Users constantly asked for TAE to be replaced by a - standard Graphical User Interface (GUI). The ISIS development staff - could not use some of the powerful debugging tools that were - available, because they did not function well on computer code - written in Fortran or C. Many of the Open-source Application - Program Interfaces (APIs) were only - available in C++ or Java, and thus not available for usage in ISIS. - The cube file formats did not efficiently support missions that - acquired data with line scan cameras. In order to take advantage - of new capabilities in the computer technology, the decision was - made to modernize ISIS. Jeff Anderson led the effort to convert - the ISIS programs written in Fortran/C to C++, creating ISIS 3. - </p> - - <table class="imageTable" border="1" align="center" style="width:600px;"> - <caption><strong>Screenshots of ISIS Application GUIs</strong>: <br/><br/> - The GUIs replaced the outdated TAE interface in ISIS. Programs - now have meaningful names and are task-specific so that ISIS - is easier and faster to use.</caption><br/><br/> - <tr> - <td> - <a href="images/screenshot_crop.jpg"> - <img src="images/thumbs/screenshot_crop.jpg" width="110" height="100" alt="[Crop screenshot]"/></a> - <p style="font-weight:bold;"> - Crop - </p> - <p> - All programs have dialog boxes for selecting files to process, - as shown in this screenshot. <tt>Crop</tt> was called <tt>dsk2dsk</tt> - in earlier versions of ISIS, one of many programs renamed to - more meaningful names in ISIS 3.0. - </p> - <p class="caption"> - 549x500, 65 KB - </p> - </td> - <td> - <a href="images/screenshot_lowpass.jpg"> - <img src="images/thumbs/screenshot_lowpass.jpg" width="89" height="100" alt="[Low Pass screenshot]"/></a> - <p style="font-weight:bold;"> - Lowpass - </p> - <p> - <tt>Lowpass</tt> is one of several task-specific programs that was - once part of the <tt>boxfilter</tt> program. - </p> - <p class="caption"> - 463x522, 75 KB - </p> - </td> - <td> - <a href="images/screenshot_sharpen.jpg"> - <img src="images/thumbs/screenshot_sharpen.jpg" width="112" height="100" alt="[Sharpen screenshot]"/></a> - <p style="font-weight:bold;"> - Sharpen - </p> - <p> - <tt>Sharpen</tt> is another task-specific program that was once - part of the <tt>boxfilter</tt> program. With the original boxfilter - program broken into several smaller programs, fewer - parameters are required. The program names are more meaningful - making ISIS easier to learn and use. - </p> - <p class="caption"> - 480x430, 65 KB - </p> - </td> - </tr> - </table> - <br /> - <p> - A second driver for the creation of ISIS 3 was a new wave of - instruments that produced gargantuan images. For example, the - Mars Reconnaissance Orbiter HiRISE camera routinely acquires 1000 - Megapixel images. Even more challenging was the need to produce - controlled mosaics consisting of thousands of large images from the Lunar - Reconnaissance Orbiter Camera Narrow Angle Camera (NAC). Solving - for the position and orientation of the spacecraft required handling - complex manipulations of extremely large matrices. Even the - efficient access of ancillary data, historically stored as text in - file headers, became an issue. ISIS 3 underwent a series of major - updates to improve the efficiency and accuracy of the map projected - output from the software. - </p> - - <br clear="all"/> - - <h2><a name="IsisVersions">Summary of Major Versions of ISIS</a></h2> - <p> - <table class="tableFormattedInformation" align="center" border="1" style="width:600px;"> - <tr> - <th> - Version - </th> - <th> - Date - </th> - <th> - Description - </th> - </tr> - <tr> - <td> - 1.0 - </td> - <td> - Late 1980s - </td> - <td> - Prototype software, converted from PICS - </td> - </tr> - <tr> - <td> - 2.0 - </td> - <td> - 1989 - </td> - <td> - First official release for VAX/VMS - </td> - </tr> - <tr> - <td> - 2.1 - </td> - <td> - 1993 - </td> - <td> - Ported to UNIX - </td> - </tr> - <tr> - <td> - 3.0.0 - </td> - <td> - 2/27/2004 - </td> - <td> - Rewritten in the C++ programming language for Linux - </td> - </tr> - <tr> - <td> - 3.0.03 - </td> - <td> - 3/9/2005 - </td> - <td> - Beta release, modernized the ISIS software package by - upgrading many of the programs - </td> - </tr> - <tr> - <td> - 3.1.0 - </td> - <td> - 10/1/2006 - </td> - <td> - Upgraded to process file sizes greater than 2 GB - </td> - </tr> - <tr> - <td> - 3.2.0 - </td> - <td> - 3/18/2010 - </td> - <td> - Overhauled how ancillary text data are handled - </td> - </tr> - <tr> - <td> - 3.3.0 - </td> - <td> - 10/11/2011 - </td> - <td> - Overhauled control network software to handle binary data - </td> - </tr> - <tr> - <td> - 3.4.0 - </td> - <td> - 5/21/2012 - </td> - <td> - Overhauled projection classes to improve speed - </td> - </tr> - <tr> - <td> - 3.4.5 - </td> - <td> - 1/14/2014 - </td> - <td> - Overhauling camera models for improved accuracy and increased - generality - </td> - </tr> - </table> - </p> - <p> - Today, ISIS 3 continues to evolve to meet the needs of users within and - outside the Astrogeology Science Center. It remains the premier software - package for putting pixels in the correct location in digital space. Releases - of new versions occur about 4 times a year, with major releases every year - or two. Experience suggests that this pace strikes the right balance - between stability and timely improvements to ISIS 3. It should be noted - that the data ISIS uses (e.g., SPICE) are frequently updated and small - patches are sometimes put out in between the scheduled releases. - </p> - - </body> - - <type>HTML</type> - - <source> - <filename>IsisHistory.html</filename> - </source> - </file> - </files> - - <category> - <categoryItem>about</categoryItem> - </category> - - <audience> - <target>all</target> - </audience> - - <bibliography> - <title>History</title> - <brief>History of USGS Astrogeology image processing software</brief> - <description> - This is a history of the evolution of the USGS Astrogeology image - processing software from 1971 to 2013. - </description> - <author>Jeff Anderson</author> - <date>2003-03-25</date> - </bibliography> - - <history> - <change date="2003-03-25" name="Jeff Anderson">Original document</change> - <change date="2003-04-02" name="Kimberly Sides">Photographs of computer systems, scans of historical photographs</change> - <change date="2003-04-07" name="Deborah Lee Soltesz">Dressed up formatting, embedded images</change> - <change date="2013-11-22" name="Ella Mae Lee">Removed Current Events and updated History sections</change> - <change date="2019-03-29" name="Adam Paquette">Removed link to Isis install page</change> - </history> -</documentation> diff --git a/isis/src/docsys/documents/IsisHistory/images/computer_room.jpg b/isis/src/docsys/documents/IsisHistory/images/computer_room.jpg deleted file mode 100644 index 9182ec93e2a14f2191bce4b3c53ebf4e26e7a901..0000000000000000000000000000000000000000 Binary files a/isis/src/docsys/documents/IsisHistory/images/computer_room.jpg and /dev/null differ diff --git a/isis/src/docsys/documents/IsisHistory/images/ella.jpg b/isis/src/docsys/documents/IsisHistory/images/ella.jpg deleted file mode 100644 index d7f54bf7fef89116473489d9dfa6e59f0029df92..0000000000000000000000000000000000000000 Binary files a/isis/src/docsys/documents/IsisHistory/images/ella.jpg and /dev/null differ diff --git a/isis/src/docsys/documents/IsisHistory/images/grinnell.jpg b/isis/src/docsys/documents/IsisHistory/images/grinnell.jpg deleted file mode 100644 index 65f0489c3099ad5af459750681016be80720c085..0000000000000000000000000000000000000000 Binary files a/isis/src/docsys/documents/IsisHistory/images/grinnell.jpg and /dev/null differ diff --git a/isis/src/docsys/documents/IsisHistory/images/grinnell_station.jpg b/isis/src/docsys/documents/IsisHistory/images/grinnell_station.jpg deleted file mode 100644 index 16da2257294a47b6130a21f4ee3ffc9d237a1f8e..0000000000000000000000000000000000000000 Binary files a/isis/src/docsys/documents/IsisHistory/images/grinnell_station.jpg and /dev/null differ diff --git a/isis/src/docsys/documents/IsisHistory/images/screenshot_crop.jpg b/isis/src/docsys/documents/IsisHistory/images/screenshot_crop.jpg deleted file mode 100644 index f7b22fa36c90ce626f45b6cb34a3addef46974e6..0000000000000000000000000000000000000000 Binary files a/isis/src/docsys/documents/IsisHistory/images/screenshot_crop.jpg and /dev/null differ diff --git a/isis/src/docsys/documents/IsisHistory/images/screenshot_lowpass.jpg b/isis/src/docsys/documents/IsisHistory/images/screenshot_lowpass.jpg deleted file mode 100644 index b553e433b902b88cdc5e16ad2673a7d59b3ea89c..0000000000000000000000000000000000000000 Binary files a/isis/src/docsys/documents/IsisHistory/images/screenshot_lowpass.jpg and /dev/null differ diff --git a/isis/src/docsys/documents/IsisHistory/images/screenshot_sharpen.jpg b/isis/src/docsys/documents/IsisHistory/images/screenshot_sharpen.jpg deleted file mode 100644 index d07cc42a5c88b01817467a1f51815546e897301e..0000000000000000000000000000000000000000 Binary files a/isis/src/docsys/documents/IsisHistory/images/screenshot_sharpen.jpg and /dev/null differ diff --git a/isis/src/docsys/documents/IsisHistory/images/tae.jpg b/isis/src/docsys/documents/IsisHistory/images/tae.jpg deleted file mode 100644 index e15de2ad5e8e8f34284647b765b6011b9f2f6096..0000000000000000000000000000000000000000 Binary files a/isis/src/docsys/documents/IsisHistory/images/tae.jpg and /dev/null differ diff --git a/isis/src/docsys/documents/IsisHistory/images/thumbs/computer_room.jpg b/isis/src/docsys/documents/IsisHistory/images/thumbs/computer_room.jpg deleted file mode 100644 index 543ae1774b9a7e20fb4667f562af0d50e968cdb9..0000000000000000000000000000000000000000 Binary files a/isis/src/docsys/documents/IsisHistory/images/thumbs/computer_room.jpg and /dev/null differ diff --git a/isis/src/docsys/documents/IsisHistory/images/thumbs/ella.jpg b/isis/src/docsys/documents/IsisHistory/images/thumbs/ella.jpg deleted file mode 100644 index 4a5b53f1851a27c03eb04225431a6b0ac8adc0e8..0000000000000000000000000000000000000000 Binary files a/isis/src/docsys/documents/IsisHistory/images/thumbs/ella.jpg and /dev/null differ diff --git a/isis/src/docsys/documents/IsisHistory/images/thumbs/grinnell.jpg b/isis/src/docsys/documents/IsisHistory/images/thumbs/grinnell.jpg deleted file mode 100644 index a014c5cd7caac33daae6c71664b5a5f9187a3bc7..0000000000000000000000000000000000000000 Binary files a/isis/src/docsys/documents/IsisHistory/images/thumbs/grinnell.jpg and /dev/null differ diff --git a/isis/src/docsys/documents/IsisHistory/images/thumbs/grinnell_station.jpg b/isis/src/docsys/documents/IsisHistory/images/thumbs/grinnell_station.jpg deleted file mode 100644 index 1379ec251b58caa5273bdbaf0da441c1018d74d3..0000000000000000000000000000000000000000 Binary files a/isis/src/docsys/documents/IsisHistory/images/thumbs/grinnell_station.jpg and /dev/null differ diff --git a/isis/src/docsys/documents/IsisHistory/images/thumbs/screenshot_crop.jpg b/isis/src/docsys/documents/IsisHistory/images/thumbs/screenshot_crop.jpg deleted file mode 100644 index d119dcff5fb559892bb1f2574575956cfe36fc5b..0000000000000000000000000000000000000000 Binary files a/isis/src/docsys/documents/IsisHistory/images/thumbs/screenshot_crop.jpg and /dev/null differ diff --git a/isis/src/docsys/documents/IsisHistory/images/thumbs/screenshot_lowpass.jpg b/isis/src/docsys/documents/IsisHistory/images/thumbs/screenshot_lowpass.jpg deleted file mode 100644 index 676d3dde20cd4979d721f035c64d348d9b4e08b6..0000000000000000000000000000000000000000 Binary files a/isis/src/docsys/documents/IsisHistory/images/thumbs/screenshot_lowpass.jpg and /dev/null differ diff --git a/isis/src/docsys/documents/IsisHistory/images/thumbs/screenshot_sharpen.jpg b/isis/src/docsys/documents/IsisHistory/images/thumbs/screenshot_sharpen.jpg deleted file mode 100644 index 583d5445bbdbbd419c1aa9345e00651675855f35..0000000000000000000000000000000000000000 Binary files a/isis/src/docsys/documents/IsisHistory/images/thumbs/screenshot_sharpen.jpg and /dev/null differ diff --git a/isis/src/docsys/documents/IsisHistory/images/thumbs/tae.jpg b/isis/src/docsys/documents/IsisHistory/images/thumbs/tae.jpg deleted file mode 100644 index eeadf8fa696dfbc64c639aeb7b8c2177e0e8b807..0000000000000000000000000000000000000000 Binary files a/isis/src/docsys/documents/IsisHistory/images/thumbs/tae.jpg and /dev/null differ diff --git a/isis/src/docsys/documents/IsisHistory/images/thumbs/vax4000.jpg b/isis/src/docsys/documents/IsisHistory/images/thumbs/vax4000.jpg deleted file mode 100644 index 971282016d5387aead24bf0d842ccbec380eb8e1..0000000000000000000000000000000000000000 Binary files a/isis/src/docsys/documents/IsisHistory/images/thumbs/vax4000.jpg and /dev/null differ diff --git a/isis/src/docsys/documents/IsisHistory/images/vax4000.jpg b/isis/src/docsys/documents/IsisHistory/images/vax4000.jpg deleted file mode 100644 index 54aed115011eb22b91af02c6b20492797203b0a6..0000000000000000000000000000000000000000 Binary files a/isis/src/docsys/documents/IsisHistory/images/vax4000.jpg and /dev/null differ diff --git a/isis/src/docsys/documents/Makefile b/isis/src/docsys/documents/Makefile deleted file mode 100644 index abf2f36d53b25d4ba69a4261677fe38b947bf274..0000000000000000000000000000000000000000 --- a/isis/src/docsys/documents/Makefile +++ /dev/null @@ -1,159 +0,0 @@ -include $(ISISROOT)/make/isismake.os - -.NOTPARALLEL: - -# ISIS DOCS MAKEFILE -# Create XML table of contents for the documents -# and generate upper level navigation pages -# dls - deborah lee soltesz - 12/04/2002 - - -DOCUMENTS = $(filter-out CVS $(wildcard Makefile*) $(wildcard *.*) , $(wildcard *)) - -RELEASENOTESPREREQ=$(wildcard ReleaseNotes/ReleaseNotesList.xml) - -ifneq ($(RELEASENOTESPREREQ), ReleaseNotes/ReleaseNotesList.xml) - DOCUMENTS = $(filter-out CVS $(wildcard Makefile*) ReleaseNotes ParameterChanges ApiChanges $(wildcard *.*) , $(wildcard *)) -endif - -DOCUMENTXMLS = $(foreach DOC,$(DOCUMENTS),$(DOC)/$(DOC).xml) - -DOCDIR = $(ISISROOT)/doc/documents - - -docs: tocXML - $(MAKE) documents aboutisis general guides installation technicalinfo userdocs - - -# DOCUMENT LIST -# build individual documents as needed - -documents: - echo " Building Individual Documents" - for dirname in $(DOCUMENTS); do \ - cd $$dirname ; \ - $(MAKE) -f ../Makefile-documents docbuild ; \ - cd .. ; \ - done - echo " Finished Building Individual Documents" - - - -# TABLE OF CONTENTS XML -# build tables of contents XML file for doc directories - -tocXML: ../build/doctoc.xml ../build/IsisDocumentTOCbuild.xsl $(DOCUMENTXMLS) -../build/doctoc.xml: $(DOCDIR) $(DOCUMENTXMLS) - - echo " Building Table of Contents XML"; \ - cat ../build/doctoc_header.xml > ../build/doctoc.xml; \ - for dirname in $(DOCUMENTS); do \ - echo " Adding [$$dirname]" ; \ - $(XALAN) $(XALAN_PARAM_OPTION) dirParam "'$$dirname'" \ - $(XALAN_INFILE_OPTION) $$dirname/$$dirname.xml $(XALAN_XSL_OPTION) \ - ../build/IsisDocumentTOCbuild.xsl >> ../build/doctoc.xml ; \ - done; \ - cat ../build/doctoc_footer.xml >> ../build/doctoc.xml; \ - echo " Finished Building Table of Contents XML" - - - -# TABLE OF CONTENTS PAGES -# build various upper level pages that link documents - -# ABOUT ISIS TOC -aboutisis: $(ISISROOT)/doc/AboutIsis/index.html -$(ISISROOT)/doc/AboutIsis/index.html: ../build/doctoc.xml ../build/AboutIsis.xsl - - echo " Constructing [About Isis]" - $(XALAN) $(XALAN_PARAM_OPTION) menuPath "'../'" $(XALAN_OUTFILE_OPTION) $(ISISROOT)/doc/AboutIsis/index.html $(XALAN_INFILE_OPTION) ../build/doctoc.xml $(XALAN_XSL_OPTION) ../build/AboutIsis.xsl - - -# GENERAL TOC -general: $(ISISROOT)/doc/General/index.html -$(ISISROOT)/doc/General/index.html: ../build/doctoc.xml ../build/General.xsl - - echo " Constructing [General]" - $(XALAN) $(XALAN_PARAM_OPTION) menuPath "'../'" $(XALAN_OUTFILE_OPTION) $(ISISROOT)/doc/General/index.html $(XALAN_INFILE_OPTION) ../build/doctoc.xml $(XALAN_XSL_OPTION) ../build/General.xsl - -# GUIDES TOC -guides: $(ISISROOT)/doc/Guides/index.html -$(ISISROOT)/doc/Guides/index.html: ../build/doctoc.xml ../build/Guides.xsl - - echo " Constructing [Guides]" - $(XALAN) $(XALAN_PARAM_OPTION) menuPath "'../'" $(XALAN_OUTFILE_OPTION) $(ISISROOT)/doc/Guides/index.html $(XALAN_INFILE_OPTION) ../build/doctoc.xml $(XALAN_XSL_OPTION) ../build/Guides.xsl - -# INSTALLATION TOC -installation: $(ISISROOT)/doc/Installation/index.html -$(ISISROOT)/doc/Installation/index.html: ../build/doctoc.xml ../build/Installation.xsl - - echo " Constructing [Installation]" - $(XALAN) $(XALAN_PARAM_OPTION) menuPath "'../'" $(XALAN_OUTFILE_OPTION) $(ISISROOT)/doc/Installation/index.html $(XALAN_INFILE_OPTION) ../build/doctoc.xml $(XALAN_XSL_OPTION) ../build/Installation.xsl - -# TECHNICAL INFO TOC -technicalinfo: $(ISISROOT)/doc/TechnicalInfo/index.html -$(ISISROOT)/doc/TechnicalInfo/index.html: ../build/doctoc.xml ../build/TechnicalInfo.xsl - - echo " Constructing [TechnicalInfo]" - $(XALAN) $(XALAN_PARAM_OPTION) menuPath "'../'" $(XALAN_OUTFILE_OPTION) $(ISISROOT)/doc/TechnicalInfo/index.html $(XALAN_INFILE_OPTION) ../build/doctoc.xml $(XALAN_XSL_OPTION) ../build/TechnicalInfo.xsl - -# USER DOCS TOC -userdocs: $(ISISROOT)/doc/UserDocs/index.html -$(ISISROOT)/doc/UserDocs/index.html: ../build/doctoc.xml ../build/UserDocs.xsl - - echo " Constructing [UserDocs]" - $(XALAN) $(XALAN_PARAM_OPTION) menuPath "'../'" $(XALAN_OUTFILE_OPTION) $(ISISROOT)/doc/UserDocs/index.html $(XALAN_INFILE_OPTION) ../build/doctoc.xml $(XALAN_XSL_OPTION) ../build/UserDocs.xsl - - -ReleaseNotes/ReleaseNotes.xml: ../build/ReleaseNotes.xsl ReleaseNotes/ReleaseNotesList.xml - if [ -f ReleaseNotes/ReleaseNotesList.xml ]; then \ - $(XALAN) $(XALAN_PARAM_OPTION) dirParam "'ReleaseNotes'" \ - $(XALAN_INFILE_OPTION) ReleaseNotes/ReleaseNotesList.xml \ - $(XALAN_XSL_OPTION) ../build/ReleaseNotes.xsl > \ - ReleaseNotes/ReleaseNotes.xml ; \ - fi; - - -ParameterChanges/ParameterChanges.xml: ../build/ParameterChanges.xsl ReleaseNotes/ReleaseNotesList.xml - if [ -f ReleaseNotes/ReleaseNotesList.xml ]; then \ - $(XALAN) $(XALAN_PARAM_OPTION) dirParam "'ParameterChanges'" \ - $(XALAN_INFILE_OPTION) ReleaseNotes/ReleaseNotesList.xml \ - $(XALAN_XSL_OPTION) ../build/ParameterChanges.xsl > \ - ParameterChanges/ParameterChanges.xml ; \ - fi; - - -ApiChanges/ApiChanges.xml: ../build/ApiChanges.xsl ReleaseNotes/ReleaseNotesList.xml - if [ -f ReleaseNotes/ReleaseNotesList.xml ]; then \ - $(XALAN) $(XALAN_PARAM_OPTION) dirParam "'ApiChanges'" \ - $(XALAN_INFILE_OPTION) ReleaseNotes/ReleaseNotesList.xml \ - $(XALAN_XSL_OPTION) ../build/ApiChanges.xsl > \ - ApiChanges/ApiChanges.xml ; \ - fi; - - -ReleaseNotes/ReleaseNotesList.xml: FORCE - -$(DOCUMENTXMLS): - - -# CLEAN -clean: - for dirname in $(DOCUMENTS); do \ - cd $$dirname ; \ - rm -f *.html ; \ - rm -f Makefile-temp ; \ - cd .. ; \ - done ; \ - if [ -f ReleaseNotes/ReleaseNotes.xml ]; then \ - rm ReleaseNotes/ReleaseNotes.xml; \ - fi; \ - if [ -f ApiChanges/ApiChanges.xml ]; then \ - rm ApiChanges/ApiChanges.xml; \ - fi; \ - if [ -f ParameterChanges/ParameterChanges.xml ]; then \ - rm ParameterChanges/ParameterChanges.xml; \ - fi; - -FORCE: - diff --git a/isis/src/docsys/documents/Makefile-documents b/isis/src/docsys/documents/Makefile-documents deleted file mode 100644 index 7622cfc64f8c07f2989568c8dc0a78049762e39f..0000000000000000000000000000000000000000 --- a/isis/src/docsys/documents/Makefile-documents +++ /dev/null @@ -1,66 +0,0 @@ -include $(ISISROOT)/make/isismake.os - -# ISIS DOCS MAKEFILE -# Create XML table of contents for the documents -# and generate upper level navigation pages -# dls - deborah lee soltesz - 12/04/2002 - - -DOCUMENTS = $(filter-out CVS $(wildcard Makefile*) $(wildcard *.*) , $(wildcard *)) -DOCDIR = $(ISISROOT)/doc/documents - - -DOC = $(shell basename `pwd`) - - -# DOCUMENT LIST -# build the TOC XML for all the documents and generate makefiles that -# build individual documents as needed - -docbuild: $(DOCDIR)/$(DOC) -$(DOCDIR)/$(DOC): $(DOC).xml ../../build/IsisInlineDocumentBuild.xsl ../../build/IsisSubPageBuild.xsl ../../build/IsisPrimaryPageBuild.xsl - - - mkdir -p $(DOCDIR)/$(DOC) - touch $(DOCDIR)/$(DOC) - touch $(DOCDIR) - $(XALAN) $(XALAN_PARAM_OPTION) menuPath "'../../'" $(XALAN_PARAM_OPTION) dirParam "'$(DOC)'" $(XALAN_OUTFILE_OPTION) Makefile-temp $(XALAN_INFILE_OPTION) $(DOC).xml $(XALAN_XSL_OPTION) ../../build/IsisInlineDocumentBuild.xsl - make -f Makefile-temp docs - rsync -lHptr --delete --rsh=ssh * $(DOCDIR)/$(DOC)/ - - - - - -#TODO -# the following are temprary macros for updating the websites with the latest document build. -# these need to be removed and replaced with a more reasonable update script - -# public docsrc upload -wwwdocsrc: - echo " " - echo "_______________________________________________________________________________" - echo "BEGIN SYNC: docsys to public server" - rsync -vlHptr --delete --progress --rsh=ssh $(ISISROOT)/src/docsys/* webmaster@wwwflag:/www/httpd/Astrogeology/Extranet/htdocs/Projects/IsisXML/docsrc/ - -# dev docsrc upload -devdocsrc: - echo " " - echo "_______________________________________________________________________________" - echo "BEGIN SYNC: docsys to dev server" - rsync -vlHptr --delete --progress --rsh=ssh $(ISISROOT)/src/docsys/* dsoltesz@wwwdev:/www/httpd/Astrogeology/Extranet/htdocs/Projects/IsisXML/docsrc/ - -# public doc upload -wwwdoc: - echo " " - echo "_______________________________________________________________________________" - echo "BEGIN SYNC: docs to public server" - rsync -vlHptr --delete --progress --rsh=ssh $(ISISROOT)/doc/* webmaster@wwwflag:/www/httpd/Astrogeology/Extranet/htdocs/Projects/IsisXML/doc/ - -# dev doc upload -devdoc: - echo " " - echo "_______________________________________________________________________________" - echo "BEGIN SYNC: docs to dev server" - rsync -vlHptr --delete --progress --rsh=ssh $(ISISROOT)/doc/* dsoltesz@wwwdev:/www/httpd/Astrogeology/Extranet/htdocs/Projects/IsisXML/doc/ - diff --git a/isis/src/docsys/favicon.ico b/isis/src/docsys/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..a940ceca5f95178333754c4c5fea993fadca42e2 Binary files /dev/null and b/isis/src/docsys/favicon.ico differ diff --git a/rtd_docs/Makefile b/rtd_docs/Makefile deleted file mode 100644 index d4bb2cbb9eddb1bb1b4f366623044af8e4830919..0000000000000000000000000000000000000000 --- a/rtd_docs/Makefile +++ /dev/null @@ -1,20 +0,0 @@ -# Minimal makefile for Sphinx documentation -# - -# You can set these variables from the command line, and also -# from the environment for the first two. -SPHINXOPTS ?= -SPHINXBUILD ?= sphinx-build -SOURCEDIR = . -BUILDDIR = _build - -# Put it first so that "make" without argument is like "make help". -help: - @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) - -.PHONY: help Makefile - -# Catch-all target: route all unknown targets to Sphinx using the new -# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). -%: Makefile - @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/rtd_docs/conf.py b/rtd_docs/conf.py deleted file mode 100644 index b4faaeccdd6d806236bd2434de173e5d3f11bb37..0000000000000000000000000000000000000000 --- a/rtd_docs/conf.py +++ /dev/null @@ -1,52 +0,0 @@ -# Configuration file for the Sphinx documentation builder. -# -# This file only contains a selection of the most common options. For a full -# list see the documentation: -# https://www.sphinx-doc.org/en/master/usage/configuration.html - -# -- Path setup -------------------------------------------------------------- - -# If extensions (or modules to document with autodoc) are in another directory, -# add these directories to sys.path here. If the directory is relative to the -# documentation root, use os.path.abspath to make it absolute, like shown here. -# -# import os -# import sys -# sys.path.insert(0, os.path.abspath('.')) - - -# -- Project information ----------------------------------------------------- - -project = 'ISIS' -copyright = '2021' -author = 'USGS Astrogeology Software Team' - - -# -- General configuration --------------------------------------------------- - -# Add any Sphinx extension module names here, as strings. They can be -# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom -# ones. -extensions = [ -] - -# Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] - -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. -# This pattern also affects html_static_path and html_extra_path. -exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] - - -# -- Options for HTML output ------------------------------------------------- - -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. -# -html_theme = 'alabaster' - -# Add any paths that contain custom static files (such as style sheets) here, -# relative to this directory. They are copied after the builtin static files, -# so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ['_static'] \ No newline at end of file diff --git a/rtd_docs/environment.yml b/rtd_docs/environment.yml deleted file mode 100644 index d26691495c2f54252cd3fdab0fb67e2c8c494561..0000000000000000000000000000000000000000 --- a/rtd_docs/environment.yml +++ /dev/null @@ -1,8 +0,0 @@ -channels: - - conda-forge -dependencies: - - python>=3 - - - - diff --git a/rtd_docs/index.rst b/rtd_docs/index.rst deleted file mode 100644 index 84969d196e8c77ae1417f1a20b4ef2ceafdd2612..0000000000000000000000000000000000000000 --- a/rtd_docs/index.rst +++ /dev/null @@ -1,10 +0,0 @@ -Welcome to ISIS's documentation! -================================ - -Placeholder for future documentation. - -For current documentation, please go to: https://isis.astrogeology.usgs.gov/ - -Or for Github: https://github.com/USGS-Astrogeology/ISIS3 - - diff --git a/rtd_docs/make.bat b/rtd_docs/make.bat deleted file mode 100644 index 2119f51099bf37e4fdb6071dce9f451ea44c62dd..0000000000000000000000000000000000000000 --- a/rtd_docs/make.bat +++ /dev/null @@ -1,35 +0,0 @@ -@ECHO OFF - -pushd %~dp0 - -REM Command file for Sphinx documentation - -if "%SPHINXBUILD%" == "" ( - set SPHINXBUILD=sphinx-build -) -set SOURCEDIR=. -set BUILDDIR=_build - -if "%1" == "" goto help - -%SPHINXBUILD% >NUL 2>NUL -if errorlevel 9009 ( - echo. - echo.The 'sphinx-build' command was not found. Make sure you have Sphinx - echo.installed, then set the SPHINXBUILD environment variable to point - echo.to the full path of the 'sphinx-build' executable. Alternatively you - echo.may add the Sphinx directory to PATH. - echo. - echo.If you don't have Sphinx installed, grab it from - echo.http://sphinx-doc.org/ - exit /b 1 -) - -%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% -goto end - -:help -%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% - -:end -popd