Bin/ADSyncDiagnostics/PSScripts/ADSyncDiagnosticsHtmlGenerator.ps1

#-------------------------------------------------------------------------
# Copyright (c) Microsoft Corporation. All rights reserved.
#-------------------------------------------------------------------------

Function WriteHtml
{
    param
    (
        [string]
        [parameter(mandatory=$true)]
        $body
    )

    $htmlDoc = [string]::Empty

    #
    # CSS
    #
    $htmlStyle = WriteHtmlStyle

    $htmlHead = WriteHtmlElement -elementName "head" -innerHtml $htmlStyle

    $attributePopupWindow = WriteAttributePopupWindow
    
    $htmlDoc += $attributePopupWindow
    $htmlDoc += "`n"
    $htmlDoc += $htmlHead
    $htmlDoc += "`n"
    $htmlDoc += $body

    $html = WriteHtmlElement -elementName "html" -innerHtml $htmlDoc

    Write-Output $html
}

Function WriteHtmlBody
{
    param
    (
        [string]
        [parameter(mandatory=$true)]
        $accordion
    )

    $banner = WriteHtmlMessage -message "Microsoft Azure" -color "#00ABEC" -fontSize "36px" -numberOfLineBreaks 0

    $bannerDiv = WriteHtmlElement -elementName "div" -class "banner" -innerHtml $banner

    $heading = WriteHtmlMessage -message $global:HtmlTitle -color "#FFFFFF" -fontSize "30px" -numberOfLineBreaks 0

    $headingDiv = WriteHtmlElement -elementName "div" -class "header" -innerHtml $heading

    $jqueryScript = WriteHtmlElement -elementName "script" -src "https://code.jquery.com/jquery-2.2.4.min.js"

    $jsScript = WriteHtmlScript

    $bodyInnerHtml = [string]::Empty

    $bodyInnerHtml += $bannerDiv
    $bodyInnerHtml += "`n"
    $bodyInnerHtml += $headingDiv
    $bodyInnerHtml += "`n"
    $bodyInnerHtml += $accordion
    $bodyInnerHtml += "`n"
    $bodyInnerHtml += $jqueryScript
    $bodyInnerHtml += "`n"
    $bodyInnerHtml += $jsScript

    $body = WriteHtmlElement -elementName "body" -onload "addRowHandlers()" -innerHtml $bodyInnerHtml

    Write-Output $body
}

Function WriteHtmlAccordion
{
    param
    (
        [string[]]
        [parameter(mandatory=$true)]
        $accordionGroupList,

        [string]
        [parameter(mandatory=$true)]
        $ObjectDn
    )

    $objectDnInnerHtml = [string]::Empty

    $objectDnHeading = WriteHtmlElement -elementName "h2" -innerHtml $global:HtmlObjectDistinguishedNameSectionTitle
    $objectDnValue = WriteHtmlElement -elementName "p" -id "ObjectDnId" -innerHtml $ObjectDn

    $objectDnInnerHtml += $objectDnHeading
    $objectDnInnerHtml += "`n"
    $objectDnInnerHtml += $objectDnValue

    $objectDnDiv = WriteHtmlElement -elementName "div" -innerHtml $objectDnInnerHtml

    $accordionInnerHtml += $objectDnDiv
    $accordionInnerHtml += "`n"
    $accordionInnerHtml += "</br>"
    $accordionInnerHtml += "`n"

    foreach ($group in $accordionGroupList)
    {
        $accordionInnerHtml += $group
        $accordionInnerHtml += "`n"
        $accordionInnerHtml += "</br>"
        $accordionInnerHtml += "`n"
    }
    
    $accordionInnerHtml = $accordionInnerHtml.Substring(0, $accordionInnerHtml.Length)

    $accordionInnerHtml += "</br>"
    $accordionInnerHtml += "`n"
    
    $accordionInnerHtml += "</br>"
    $accordionInnerHtml += "`n"

    $accordionInnerHtml += "</br>"
    $accordionInnerHtml += "`n"

    $accordionDiv = WriteHtmlElement -elementName "div" -class "accordion" -innerHtml $accordionInnerHtml

    Write-Output $accordionDiv
}

Function WriteHtmlAccordionGroup
{
    param
    (
        [string[]]
        [parameter(mandatory=$true)]
        $accordionItemList,

        [string]
        [parameter(mandatory=$true)]
        $title
    )

    $accordionGroupInnerHtml = [string]::Empty

    $heading = WriteHtmlElement -elementName "h2" -innerHtml $title

    $accordionGroupInnerHtml += $heading
    $accordionGroupInnerHtml += "`n"

    foreach ($item in $accordionItemList)
    {
        $accordionGroupInnerHtml += $item
        $accordionGroupInnerHtml += "`n"
    }

    $accordionGroupInnerHtml = $accordionGroupInnerHtml.Substring(0, $accordionGroupInnerHtml.Length-1)

    $accordionGroup = WriteHtmlElement -elementName "div" -class "accordion-group" -innerHtml $accordionGroupInnerHtml

    Write-Output $accordionGroup
}

 Function WriteHtmlAccordionItemForTable
{
    param
    (
        [string]
        [parameter(mandatory=$true)]
        $title,

        [string]
        [parameter(mandatory=$true)]
        $tableId,

        [string[]]
        [parameter(mandatory=$true)]
        $tableHeaderColumns,

        [hashtable]
        [parameter(mandatory=$true)]
        $object,

        [string]
        [parameter(mandatory=$true)]
        $objectType,

        [hashtable]
        [parameter(mandatory=$false)]
        $objectToCompare
    )

    $headingInnerHtml = [string]::Empty

    $titleDiv = WriteHtmlElement -elementName "div" -class "title" -innerHtml $title

    $headingInnerHtml += $iconDiv
    $headingInnerHtml += "`n"
    $headingInnerHtml += $titleDiv

    $heading = WriteHtmlElement -elementName "a" -href "#" -class "heading" -innerHtml $headingInnerHtml

    $table = $null

    if($objectToCompare)
    {
        $table = WriteHtmlTable -tableId $tableId -tableHeaderColumns $tableHeaderColumns -object $object -objectToCompare $objectToCompare -objectType $objectType
    }
    else
    {
        $table = WriteHtmlTable -tableId $tableId -tableHeaderColumns $tableHeaderColumns -object $object -objectType $objectType
    }

    $tableContentDiv = WriteHtmlElement -elementName "div" -class "tableContent" -innerHtml $table

    $contentDiv = WriteHtmlElement -elementName "div" -class "content" -innerHtml $tableContentDiv

    $accordionItemInnerHtml = $heading
    $accordionItemInnerHtml += "`n"
    $accordionItemInnerHtml += $contentDiv

    $accordionItem = WriteHtmlElement -elementName "div" -class "accordion-item" -innerHtml $accordionItemInnerHtml

    Write-Output $accordionItem
 }

Function WriteHtmlAccordionItemForParagraph
{
    param
    (
        [System.Collections.Generic.List[string]]
        [parameter(mandatory=$true)]
        $messageList,

        [string]
        [parameter(mandatory=$true)]
        $title
    )

    $headingInnerHtml = [string]::Empty

    $titleDiv = WriteHtmlElement -elementName "div" -class "title" -innerHtml $title

    $headingInnerHtml += $iconDiv
    $headingInnerHtml += "`n"
    $headingInnerHtml += $titleDiv

    $heading = WriteHtmlElement -elementName "a" -href "#" -class "heading" -innerHtml $headingInnerHtml

    $paragraphInnerHtml = [string]::Empty

    foreach ($message in $messageList)
    {
        $paragraphInnerHtml += $message
        $paragraphInnerHtml += "`n"
    }

    $paragraphInnerHtml = $paragraphInnerHtml.Substring(0, $paragraphInnerHtml.Length-1)

    $paragraph = WriteHtmlElement -elementName "p" -class "issueText" -innerHtml $paragraphInnerHtml

    $contentDiv = WriteHtmlElement -elementName "div" -class "content" -innerHtml $paragraph

    $accordionItemInnerHtml = $heading
    $accordionItemInnerHtml += "`n"
    $accordionItemInnerHtml += $contentDiv

    $accordionItem = WriteHtmlElement -elementName "div" -class "accordion-item" -innerHtml $accordionItemInnerHtml

    Write-Output $accordionItem
}

Function WriteHtmlTable
{
    param
    (
        [string]
        [parameter(mandatory=$true)]
        $tableId,

        [string[]]
        [parameter(mandatory=$true)]
        $tableHeaderColumns,

        [hashtable]
        [parameter(mandatory=$true)]
        $object,

        [hashtable]
        [parameter(mandatory=$false)]
        $objectToCompare,

        [string]
        [parameter(mandatory=$true)]
        $objectType
    )

    $tableHeader = WriteHtmlTableHeader -tableHeaderColumns $tableHeaderColumns

    $tableBody = $null

    if($objectToCompare)
    {
        $tableBody = WriteHtmlTableBody -object $object -objectToCompare $objectToCompare -objectType $objectType
    }
    else
    {
        $tableBody = WriteHtmlTableBody -object $object -objectType $objectType
    }

    $tableInnerHtml = $tableHeader
    $tableInnerHtml += "`n"
    $tableInnerHtml += $tableBody

    $table = WriteHtmlElement -elementName "table" -id $tableId -innerHtml $tableInnerHtml

    Write-Output $table
}

Function WriteHtmlTableHeader
{
    param
    (
        [string[]]
        [parameter(mandatory=$true)]
        $tableHeaderColumns
    )

    $rowInnerHtml = [string]::Empty

    foreach ($column in $tableHeaderColumns)
    {
        $rowInnerHtml += WriteHtmlElement -elementName "th" -scope "col" -innerHtml $column
        $rowInnerHtml += "`n"
    }

    $rowInnerHtml = $rowInnerHtml.Substring(0, $rowInnerHtml.Length-1)

    $row = WriteHtmlElement -elementName "tr" -innerHtml $rowInnerHtml

    $tableHeader = WriteHtmlElement -elementName "thead" -innerHtml $row
    
    Write-Output $tableHeader
}

Function WriteHtmlTableBody
{
    param
    (
        [hashtable]
        [parameter(mandatory=$true)]
        $object,

        [hashtable]
        [parameter(mandatory=$false)]
        $objectToCompare,

        [string]
        [parameter(mandatory=$true)]
        $objectType
    )

    $warningStyle = WriteStyleElement("background")("#ffff00")

    $bodyInnerHtml = [string]::Empty

    $object.GetEnumerator() | Foreach-Object {
        $attributeName = $_.Key
        $attributeValues = $_.Value

        $attributeValues2 = $null

        $rowInnerHtml = [string]::Empty

        $rowInnerHtml += WriteHtmlElement -elementName "td" -innerHtml $attributeName
        $rowInnerHtml += "`n"

        if ($attributeValues.Count -eq 1)
        {
            $rowInnerHtml += WriteHtmlElement -elementName "td" -innerHtml $attributeValues
            $rowInnerHtml += "`n"

            $rowInnerHtml += WriteHtmlElement -elementName "input" -type "hidden" -value $objectType
            $rowInnerHtml += "`n"

            $rowInnerHtml += WriteHtmlElement -elementName "input" -type "hidden" -value $attributeValues -class "eaAttributeValue"
            $rowInnerHtml += "`n"
        }
        else
        {
            $rowInnerHtml += WriteHtmlElement -elementName "td" -innerHtml "-- Multi-Valued --"
            $rowInnerHtml += "`n"

            $rowInnerHtml += WriteHtmlElement -elementName "input" -type "hidden" -value $objectType
            $rowInnerHtml += "`n"

            foreach ($attributeValue in $attributeValues)
            {
                $rowInnerHtml += WriteHtmlElement -elementName "input" -type "hidden" -value $attributeValue -class "eaAttributeValue"
                $rowInnerHtml += "`n"
            }
        }

        if($objectToCompare)
        {
            $attributeValues2 = $objectToCompare[$attributeName]

            if ($attributeValues2.Count -eq 0)
            {
                $rowInnerHtml += WriteHtmlElement -elementName "td" -innerHtml "-- No Value Retrieved --"
                $rowInnerHtml += "`n"

                $rowInnerHtml += WriteHtmlElement -elementName "input" -type "hidden" -value $objectType
                $rowInnerHtml += "`n"

                $rowInnerHtml += WriteHtmlElement -elementName "input" -type "hidden" -value "-- No Value Retrieved --" -class "caAttributeValue"
                $rowInnerHtml += "`n"
            }
            elseif ($attributeValues2.Count -eq 1)
            {
                $rowInnerHtml += WriteHtmlElement -elementName "td" -innerHtml $attributeValues2
                $rowInnerHtml += "`n"

                $rowInnerHtml += WriteHtmlElement -elementName "input" -type "hidden" -value $objectType
                $rowInnerHtml += "`n"

                $rowInnerHtml += WriteHtmlElement -elementName "input" -type "hidden" -value $attributeValues2 -class "caAttributeValue"
                $rowInnerHtml += "`n"
            }
            else
            {
                $rowInnerHtml += WriteHtmlElement -elementName "td" -innerHtml "-- Multi-Valued --"
                $rowInnerHtml += "`n"

                $rowInnerHtml += WriteHtmlElement -elementName "input" -type "hidden" -value $objectType
                $rowInnerHtml += "`n"

                foreach ($attributeValue in $attributeValues2)
                {
                    $rowInnerHtml += WriteHtmlElement -elementName "input" -type "hidden" -value $attributeValue -class "caAttributeValue"
                    $rowInnerHtml += "`n"
                }
            }
        }

        $rowInnerHtml = $rowInnerHtml.Substring(0, $rowInnerHtml.Length-1)

        if(($objectToCompare) -and (($attributeValues2.Count -eq 0) -or (Compare-Object $attributeValues $attributeValues2)))
        {
            $bodyInnerHtml += WriteHtmlElement -elementName "tr" -innerHtml $rowInnerHtml -style $warningStyle
        }
        else
        {
            $bodyInnerHtml += WriteHtmlElement -elementName "tr" -innerHtml $rowInnerHtml
        }

        $bodyInnerHtml += "`n"
    }

    $bodyInnerHtml = $bodyInnerHtml.Substring(0, $bodyInnerHtml.Length-1);

    $tableBody = WriteHtmlElement -elementName "tbody" -innerHtml $bodyInnerHtml

    Write-Output $tableBody
}

Function WriteHtmlMessage
{
    param
    (
        [string]
        [parameter(mandatory=$true)]
        $message,

        [string]
        [parameter(mandatory=$false)]
        $color,

        [string]
        [parameter(mandatory=$false)]
        $fontSize,

        [string]
        [parameter(mandatory=$false)]
        $fontWeight,

        [string]
        [parameter(mandatory=$false)]
        $paddingLeft,

        [int]
        [parameter(mandatory=$true)]
        $numberOfLineBreaks
    )

    $style = [string]::Empty

    if (![string]::IsNullOrEmpty($color))
    {
        $style += WriteStyleElement("color")($color)
    }

    if (![string]::IsNullOrEmpty($fontSize))
    {
        $style += WriteStyleElement("font-size")($fontSize)
    }

    if (![string]::IsNullOrEmpty($fontWeight))
    {
        $style += WriteStyleElement("font-weight")($fontWeight)
    }

    if (![string]::IsNullOrEmpty($paddingLeft))
    {
        $style += WriteStyleElement("padding-left")($paddingLeft)
    }

    if (![string]::IsNullOrEmpty($style))
    {
        $style = $style.Substring(0, $style.Length-1)
    }
    
    $htmlMessage = WriteHtmlElement -elementName "span" -style $style -innerHtml $message

    for ($i = 0; $i -lt $numberOfLineBreaks; $i++)
    {
        $htmlMessage += "`n"
        $htmlMessage += "<br/>"
    }

    Write-Output $htmlMessage
}

Function WriteHtmlElement
{
    param
    (
        [string]
        [parameter(mandatory=$true)]
        $elementName,

        [string]
        [parameter (mandatory=$false)]
        $id,

        [string]
        [parameter (mandatory=$false)]
        $class,

        [string]
        [parameter(mandatory=$false)]
        $scope,

        [string]
        [parameter(mandatory=$false)]
        $type,

        [string]
        [parameter(mandatory=$false)]
        $value,

        [string]
        [parameter(mandatory=$false)]
        $href,

        [string]
        [parameter(mandatory=$false)]
        $src,

        [string]
        [parameter(mandatory=$false)]
        $rel,

        [string]
        [parameter(mandatory=$false)]
        $style,

        [string]
        [parameter(mandatory=$false)]
        $onload,

        [string]
        [parameter(mandatory=$false)]
        $onclick,

        [string]
        [parameter(mandatory=$false)]
        $innerHtml
    )

    if ([string]::IsNullOrEmpty($elementName))
    {
    
    }

    $htmlElement = "<"
    $htmlElement += $elementName
    $htmlElement += " "
    
    if (![string]::IsNullOrEmpty($id))
    {
        $htmlElement += WriteHtmlAttribute("id")($id)
    }
    
    if (![string]::IsNullOrEmpty($class))
    {
        $htmlElement += WriteHtmlAttribute("class")($class)
    }
    
    if (![string]::IsNullOrEmpty($scope))
    {
        $htmlElement += WriteHtmlAttribute("scope")($scope)
    }

    if (![string]::IsNullOrEmpty($type))
    {
        $htmlElement += WriteHtmlAttribute("type")($type)
    }

    if (![string]::IsNullOrEmpty($value))
    {
        $htmlElement += WriteHtmlAttribute("value")($value)
    }

    if (![string]::IsNullOrEmpty($href))
    {
        $htmlElement += WriteHtmlAttribute("href")($href)
    }
    
    if (![string]::IsNullOrEmpty($src))
    {
        $htmlElement += WriteHtmlAttribute("src")($src)
    }

    if (![string]::IsNullOrEmpty($rel))
    {
         $htmlElement += WriteHtmlAttribute("rel")($rel)
    }

    if (![string]::IsNullOrEmpty($style))
    {
        $htmlElement += WriteHtmlAttribute("style")($style)
    }

    if (![string]::IsNullOrEmpty($onload))
    {
        $htmlElement += WriteHtmlAttribute("onload")($onload)
    }
    
    if (![string]::IsNullOrEmpty($onclick))
    {
        $htmlElement += WriteHtmlAttribute("onclick")($onclick)
    }
    
    # Remove last space character
    $htmlElement = $htmlElement.Substring(0, $htmlElement.Length-1)

    $htmlElement += ">"
    
    if (![string]::IsNullOrEmpty($innerHtml))
    {
        $htmlElement += "`r`n"
        
        $innerHtmlLines = $innerHtml.Split("`n")

        foreach ($line in $innerHtmlLines)
        {
            $htmlElement += " "
            $htmlElement += $line
            $htmlElement += "`n"
        }
    }

    $htmlElement += "</"
    $htmlElement += $elementName
    $htmlElement += ">"

    Write-Output $htmlElement
}

Function WriteHtmlAttribute
{
    param
    (
        [string]
        [parameter(mandatory=$true)]
        $attributeName,

        [string]
        [parameter(mandatory=$true)]
        $attributeValue
    )

    $htmlAttribute = $attributeName
    $htmlAttribute += "="
    $htmlAttribute += """"
    $htmlAttribute += $attributeValue
    $htmlAttribute += """"
    $htmlAttribute += " "

    Write-Output $htmlAttribute
}

Function WriteStyleElement
{
    param
    (
        [string]
        [parameter(mandatory=$true)]
        $styleElementName,

        [string]
        [parameter(mandatory=$true)]
        $styleElementValue
    )

    $styleElement = [string]::Empty

    $styleElement += $styleElementName
    $styleElement += ": "
    $styleElement += $styleElementValue
    $styleElement += "; "

    Write-Output $styleElement
}

Function WriteHyperlink
{
    param
    (
        [string]
        [parameter(mandatory=$true)]
        $url,

        [string]
        [parameter(mandatory=$true)]
        $text
    )

    $hyperlink = WriteHtmlElement -elementName "a" -href $url -style "color:#0078d7" -innerHtml $text

    Write-Output $hyperlink
}

Function WriteAttributePopupWindow
{
    $attributePopupWindow = @"
<div class="popupContainer" id="singleValuePopupContainerId">
    <div class="attributeWindow">
        <div class="ObjectTypeHeading">
            <span class="close" onclick="closePopUpWindow()">&times;</span>
            <p class="ObjectTypeText" id="singleValueObjectTypeTextId"></p>
        </div>
        <div class="AttributeNameField">
            <p class="AttributeNameFieldText">Attribute Name:</p>
        </div>
        <div class="AttributeName">
            <p class="AttributeNameText" id="singleValueAttributeNameTextId"></p>
        </div>
        <div class="AttributeValueField">
            <p class="AttributeValueFieldText">Attribute Value:</p>
        </div>
        <div id="SingleValueAttributeValue">
            <p class="AttributeValueText" id="singleValueAttributeValueTextId"></p>
        </div>
    </div>
</div>
 
<div class="popupContainer" id="multiValuePopupContainerId">
    <div class="attributeWindow">
        <div class="ObjectTypeHeading">
            <span class="close" onclick="closePopUpWindow()">&times;</span>
            <p class="ObjectTypeText" id="multiValueObjectTypeTextId"></p>
        </div>
        <div class="AttributeNameField">
            <p class="AttributeNameFieldText">Attribute Name:</p>
        </div>
        <div class="AttributeName">
            <p class="AttributeNameText" id="multiValueAttributeNameTextId"></p>
        </div>
        <div class="AttributeValueField">
            <p class="AttributeValueFieldText">Attribute Values:</p>
        </div>
        <div id="MultiValueAttributeValue">
            <table id="multiValueAttributeValueTableId">
            </table>
        </div>
    </div>
</div>
 
<div class="popupContainer" id="comparisonPopupContainerId">
    <div class="attributeWindow">
        <div class="ObjectTypeHeading">
            <span class="close" onclick="closePopUpWindow()">&times;</span>
            <p class="ObjectTypeText" id="comparisonObjectTypeTextId"></p>
        </div>
        <div class="AttributeNameField">
            <p class="AttributeNameFieldText">Attribute Name:</p>
        </div>
        <div class="AttributeName">
            <p class="AttributeNameText" id="comparisonAttributeNameTextId"></p>
        </div>
        <div class="AttributeValueField">
            <p class="AttributeValueFieldText">Attribute Value(s) retrieved by provided account:</p>
        </div>
        <div id="MultiValueAttributeValue">
            <table id="comparisonAttributeValueTableOneId">
            </table>
        </div>
        <div class="AttributeValueField">
            <p class="AttributeValueFieldText">Attribute Value(s) retrieved by Connector:</p>
        </div>
        <div id="MultiValueAttributeValue">
            <table id="comparisonAttributeValueTableTwoId">
            </table>
        </div>
    </div>
</div>
 
"@


    Write-Output $attributePopupWindow
}

Function WriteHtmlStyle
{
    $htmlStyle = @"
html
{
    font-family: "Segoe UI", Frutiger, "Frutiger Linotype", "Dejavu Sans", "Helvetica Neue", Arial, sans-serif;
}
 
body
{
    background: #FFFFFF;
    margin: 0;
}
 
.banner
{
    padding-top: 10px;
    padding-bottom: 10px;
    padding-left: 30px;
    background: #000000;
}
 
.header
{
    text-align: center;
    background: #252525;
    padding-bottom: 5px;
}
 
h1
{
    color: #000000;
}
 
h2
{
    border-bottom: solid 2px #CCCCCC;
    padding-bottom: 3px;
    color: #252525;
    font-weight: 500;
}
 
.accordion
{
    width: 100%;
    max-width: 95rem;
    margin: 0 auto;
    padding: 2rem;
}
 
.accordion-group
{
    position: relative;
}
 
.accordion-item
{
    position: relative;
}
.accordion-item.active .heading
{
    color: #0078d7;
}
 
.accordion-item.active .icon
{
    background: #fefcff;
}
 
.accordion-item.active .icon:before
{
    background: #0078d7;
}
 
.accordion-item.active .icon:after
{
    width: 0;
}
 
.accordion-item .heading
{
    display: block;
    text-decoration: none;
    color: #0078d7;
    font-weight: 500;
    font-size: 1rem;
    position: relative;
    padding: 1.5rem 0 1.5rem;
    -webkit-transition: 0.3s ease-in-out;
    transition: 0.3s ease-in-out;
}
 
@media (min-width: 40rem)
{
    .accordion-item .heading
    {
        font-size: 1.2rem;
    }
}
 
.accordion-item .heading:hover
{
    text-decoration: underline;
}
 
.accordion-item .heading:hover .icon
{
    background: #fefcff;
}
 
.accordion-item .heading:hover .icon:before, .accordion-item .heading:hover .icon:after
{
    background: #1F45FC;
}
 
.accordion-item .icon
{
    display: block;
    position: absolute;
    top: 50%;
    left: 0;
    width: 3rem;
    height: 3rem;
    border: 2px solid #000080;
    border-radius: 3px;
    -webkit-transform: translateY(-50%);
            transform: translateY(-50%);
}
 
.accordion-item .icon:before, .accordion-item .icon:after
{
    content: '';
    width: 1.25rem;
    height: 0.25rem;
    background: #000080;
    position: absolute;
    border-radius: 3px;
    left: 50%;
    top: 50%;
    -webkit-transition: 0.3s ease-in-out;
    transition: 0.3s ease-in-out;
    -webkit-transform: translate(-50%, -50%);
            transform: translate(-50%, -50%);
}
 
.accordion-item .icon:after
{
    -webkit-transform: translate(-50%, -50%) rotate(90deg);
            transform: translate(-50%, -50%) rotate(90deg);
    z-index: -1;
}
 
.accordion-item .content
{
    width: 100%;
    display: none;
    background: #ffffff;
}
 
.accordion-item .content
{
    margin-top: 0;
}
 
 
@media (min-width: 40rem)
{
    .accordion-item .content
    {
        line-height: 1.75;
    }
}
 
.accordion-item .content .tableContent
{
    max-height: 600px;
    overflow-y: auto;
}
 
table
{
    width: 90%;
    border-collapse: collapse;
    margin-left: auto;
    margin-right: auto;
}
 
th
{
    background: #ffffff;
    color: #252525;
    font-weight: bold;
    text-align: left;
    padding-left: 50px;
    padding-top: 15px;
    padding-bottom: 15px;
    border-bottom: 1px solid #A9A9A9;
}
 
tr
{
    background: #ffffff;
}
 
tr:hover
{
    background: #b4d2e5;
}
 
td
{
    width: 50%;
    color: #252525;
    text-align: left;
    padding-left: 50px;
    padding-top: 15px;
    padding-bottom: 15px;
    border-bottom: 1px solid #A9A9A9;
}
 
.popupContainer
{
    display: none;
    position: fixed;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    z-index: 1;
    background-color: rgba(0, 0, 0, 0.6);
}
 
.attributeWindow
{
    width: 40%;
    background: #d9d9d9;
    margin-left: auto;
    margin-right: auto;
    padding-bottom: 20px;
    opacity: 1.0;
    vertical-align: middle;
    margin-top: 100px;
}
 
.ObjectTypeHeading
{
    width: 100%;
    background: #003c6c;
}
 
.ObjectTypeText
{
    padding-left: 5%;
    padding-bottom: 10px;
    padding-top: 10px;
    color: #fff;
    font-weight: bold;
    font-size: 18px;
}
 
.AttributeNameField
{
    width: 100%;
}
 
.AttributeNameFieldText
{
    padding-left: 5%;
    color: #000;
    font-weight: bold;
    font-size: 16x;
}
 
.AttributeName
{
    width: 90%;
    background: #fff;
    margin-left: auto;
    margin-right: auto;
}
 
.AttributeNameText
{
    padding-left: 4px;
    padding-top: 5px;
    padding-bottom: 5px;
    font-size: 16x;
    color: #000;
}
 
.AttributeValueField
{
    width: 100%;
    padding-top: 5px;
}
 
.AttributeValueFieldText
{
    padding-left: 5%;
    color: #000;
    font-weight: bold;
    font-size: 16x;
}
 
#SingleValueAttributeValue
{
    width: 90%;
    background: #fff;
    margin-left: auto;
    margin-right: auto;
}
 
#MultiValueAttributeValue
{
    width: 90%;
    background: #fff;
    margin-left: auto;
    margin-right: auto;
    max-height: 200px;
    overflow-y: auto;
}
 
.AttributeValueText
{
    padding-left: 4px;
    padding-top: 5px;
    padding-bottom: 5px;
    font-size: 16x;
    color: #000;
}
 
.close
{
    color: #000000;
    float: right;
    font-size: 32px;
    font-weight: bold;
    padding-right: 10px;
}
 
.close:hover
{
    color: #ff0000;
}
 
#ObjectDnId
{
    font-size: 20px;
}
 
.issueText
{
    font-size: 14px;
}
"@


    $htmlStyleElement = WriteHtmlElement -elementName "style" -innerHtml $htmlStyle

    Write-Output $htmlStyleElement
}

Function WriteHtmlScript
{
    $htmlScript = @"
`$('.accordion-item .heading').on('click', function(e) {
    e.preventDefault();
 
    // Add the correct active class
    if(`$(this).closest('.accordion-item').hasClass('active')) {
        // Remove active classes
        `$('.accordion-item').removeClass('active');
    } else {
        // Remove active classes
        `$('.accordion-item').removeClass('active');
 
        // Add the active class
        `$(this).closest('.accordion-item').addClass('active');
    }
 
    // Show the content
    var `$content = `$(this).next();
    `$content.slideToggle(200);
    `$('.accordion-item .content').not(`$content).slideUp('fast');
     
    `$('html, body').animate({scrollTop: `$content.offset().top-100}, 600);
});
 
function addRowHandlers()
{
    addObjectTableRowHandler("ADObjectTable");
    addObjectTableRowHandler("AADConnectObjectTable");
    addObjectTableRowHandler("AADObjectTable");
    addObjectComparisonTableRowHandler("ADObjectAttributeComparisonTable");
};
 
function addObjectTableRowHandler(tableId)
{
    var objectTable = document.getElementById(tableId);
 
    if(objectTable != null)
    {
        var rows = objectTable.getElementsByTagName("tr");
     
        for (i = 1; i < rows.length; i++)
        {
            var currentRow = rows[i];
         
            var createRowClickHandler =
                function(row)
                {
                    return function(){
                        var cols = row.getElementsByTagName("td");
                        var values = row.getElementsByTagName("input");
                     
                        if (values.length == 2)
                        {
                            document.getElementById("singleValueObjectTypeTextId").innerHTML = values[0].value + " Details";
                            document.getElementById("singleValueAttributeNameTextId").innerHTML = cols[0].innerHTML;
                            document.getElementById("singleValueAttributeValueTextId").innerHTML = values[1].value;
                            document.getElementById("singleValuePopupContainerId").style.display = "block";
                        }
                        else
                        {
                            document.getElementById("multiValueObjectTypeTextId").innerHTML = values[0].value + " Details";
                            document.getElementById("multiValueAttributeNameTextId").innerHTML = cols[0].innerHTML;
                         
                            var multiValueTable = document.getElementById("multiValueAttributeValueTableId");
                         
                            for (k = 1; k < values.length; k++)
                            {
                                var multiValueRow = multiValueTable.insertRow(k-1);
                                var multiValueCell = multiValueRow.insertCell(0);
                             
                                multiValueCell.innerHTML = values[k].value;
                            }
                         
                            document.getElementById("multiValuePopupContainerId").style.display = "block";
                        }
                    };
                };
         
            currentRow.onclick = createRowClickHandler(currentRow);
        }
    }
}
 
function addObjectComparisonTableRowHandler(tableId)
{
    var objectTable = document.getElementById(tableId);
 
    if(objectTable != null)
    {
        var rows = objectTable.getElementsByTagName("tr");
     
        for (i = 1; i < rows.length; i++)
        {
            var currentRow = rows[i];
         
            var createRowClickHandler =
                function(row)
                {
                    return function(){
                        var cols = row.getElementsByTagName("td");
                        var values = row.getElementsByTagName("input");
 
                        var values1 = row.getElementsByClassName("eaAttributeValue");
                        var values2 = row.getElementsByClassName("caAttributeValue");
                     
                        document.getElementById("comparisonObjectTypeTextId").innerHTML = values[0].value + " Details";
                        document.getElementById("comparisonAttributeNameTextId").innerHTML = cols[0].innerHTML;
                         
                        var multiValueTable = document.getElementById("comparisonAttributeValueTableOneId");
                         
                        for (k = 0; k < values1.length; k++)
                        {
                            var multiValueRow = multiValueTable.insertRow(k-1);
                            var multiValueCell = multiValueRow.insertCell(0);
                             
                            multiValueCell.innerHTML = values1[k].value;
                        }
 
                        var multiValueTable2 = document.getElementById("comparisonAttributeValueTableTwoId");
                         
                        for (k = 0; k < values2.length; k++)
                        {
                            var multiValueRow = multiValueTable2.insertRow(k-1);
                            var multiValueCell = multiValueRow.insertCell(0);
                             
                            multiValueCell.innerHTML = values2[k].value;
                        }
                         
                        document.getElementById("comparisonPopupContainerId").style.display = "block";
                    };
                };
         
            currentRow.onclick = createRowClickHandler(currentRow);
        }
    }
}
 
function closePopUpWindow()
{
    document.getElementById("multiValueAttributeValueTableId").innerHTML = "";
    document.getElementById("comparisonAttributeValueTableOneId").innerHTML = "";
    document.getElementById("comparisonAttributeValueTableTwoId").innerHTML = "";
    document.getElementById("singleValuePopupContainerId").style.display = "none";
    document.getElementById("multiValuePopupContainerId").style.display = "none";
    document.getElementById("comparisonPopupContainerId").style.display = "none";
}
"@


    $htmlScriptElement = WriteHtmlElement -elementName "script" -innerHtml $htmlScript

    Write-Output $htmlScriptElement
}
# SIG # Begin signature block
# MIInnwYJKoZIhvcNAQcCoIInkDCCJ4wCAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCCTjNecArQtekvp
# fg+jfXT8byEgXBLTIplue5l4J1DP4qCCDYIwggYAMIID6KADAgECAhMzAAADXJXz
# SFtKBGrPAAAAAANcMA0GCSqGSIb3DQEBCwUAMH4xCzAJBgNVBAYTAlVTMRMwEQYD
# VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy
# b3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNpZ25p
# bmcgUENBIDIwMTEwHhcNMjMwNDA2MTgyOTIyWhcNMjQwNDAyMTgyOTIyWjB0MQsw
# CQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9u
# ZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMR4wHAYDVQQDExVNaWNy
# b3NvZnQgQ29ycG9yYXRpb24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
# AQDijA1UCC84R0x+9Vr/vQhPNbfvIOBFfymE+kuP+nho3ixnjyv6vdnUpgmm6RT/
# pL9cXL27zmgVMw7ivmLjR5dIm6qlovdrc5QRrkewnuQHnvhVnLm+pLyIiWp6Tow3
# ZrkoiVdip47m+pOBYlw/vrkb8Pju4XdA48U8okWmqTId2CbZTd8yZbwdHb8lPviE
# NMKzQ2bAjytWVEp3y74xc8E4P6hdBRynKGF6vvS6sGB9tBrvu4n9mn7M99rp//7k
# ku5t/q3bbMjg/6L6mDePok6Ipb22+9Fzpq5sy+CkJmvCNGPo9U8fA152JPrt14uJ
# ffVvbY5i9jrGQTfV+UAQ8ncPAgMBAAGjggF/MIIBezArBgNVHSUEJDAiBgorBgEE
# AYI3TBMBBgorBgEEAYI3TAgBBggrBgEFBQcDAzAdBgNVHQ4EFgQUXgIsrR+tkOQ8
# 10ekOnvvfQDgTHAwRQYDVR0RBD4wPKQ6MDgxHjAcBgNVBAsTFU1pY3Jvc29mdCBD
# b3Jwb3JhdGlvbjEWMBQGA1UEBRMNMjMzMTEwKzUwMDg2ODAfBgNVHSMEGDAWgBRI
# bmTlUAXTgqoXNzcitW2oynUClTBUBgNVHR8ETTBLMEmgR6BFhkNodHRwOi8vd3d3
# Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NybC9NaWNDb2RTaWdQQ0EyMDExXzIwMTEt
# MDctMDguY3JsMGEGCCsGAQUFBwEBBFUwUzBRBggrBgEFBQcwAoZFaHR0cDovL3d3
# dy5taWNyb3NvZnQuY29tL3BraW9wcy9jZXJ0cy9NaWNDb2RTaWdQQ0EyMDExXzIw
# MTEtMDctMDguY3J0MAwGA1UdEwEB/wQCMAAwDQYJKoZIhvcNAQELBQADggIBABIm
# T2UTYlls5t6i5kWaqI7sEfIKgNquF8Ex9yMEz+QMmc2FjaIF/HQQdpJZaEtDM1Xm
# 07VD4JvNJEplZ91A4SIxjHzqgLegfkyc384P7Nn+SJL3XK2FK+VAFxdvZNXcrkt2
# WoAtKo0PclJOmHheHImWSqfCxRispYkKT9w7J/84fidQxSj83NPqoCfUmcy3bWKY
# jRZ6PPDXlXERRvl825dXOfmCKGYJXHKyOEcU8/6djs7TDyK0eH9ss4G9mjPnVZzq
# Gi/qxxtbddZtkREDd0Acdj947/BTwsYLuQPz7SNNUAmlZOvWALPU7OOVQlEZzO8u
# Ec+QH24nep/yhKvFYp4sHtxUKm1ZPV4xdArhzxJGo48Be74kxL7q2AlTyValLV98
# u3FY07rNo4Xg9PMHC6sEAb0tSplojOHFtGtNb0r+sioSttvd8IyaMSfCPwhUxp+B
# Td0exzQ1KnRSBOZpxZ8h0HmOlMJOInwFqrCvn5IjrSdjxKa/PzOTFPIYAfMZ4hJn
# uKu15EUuv/f0Tmgrlfw+cC0HCz/5WnpWiFso2IPHZyfdbbOXO2EZ9gzB1wmNkbBz
# hj8hFyImnycY+94Eo2GLavVTtgBiCcG1ILyQabKDbL7Vh/OearAxcRAmcuVAha07
# WiQx2aLghOSaZzKFOx44LmwUxRuaJ4vO/PRZ7EzAMIIHejCCBWKgAwIBAgIKYQ6Q
# 0gAAAAAAAzANBgkqhkiG9w0BAQsFADCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgT
# Cldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29m
# dCBDb3Jwb3JhdGlvbjEyMDAGA1UEAxMpTWljcm9zb2Z0IFJvb3QgQ2VydGlmaWNh
# dGUgQXV0aG9yaXR5IDIwMTEwHhcNMTEwNzA4MjA1OTA5WhcNMjYwNzA4MjEwOTA5
# WjB+MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMH
# UmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSgwJgYDVQQD
# Ex9NaWNyb3NvZnQgQ29kZSBTaWduaW5nIFBDQSAyMDExMIICIjANBgkqhkiG9w0B
# AQEFAAOCAg8AMIICCgKCAgEAq/D6chAcLq3YbqqCEE00uvK2WCGfQhsqa+laUKq4
# BjgaBEm6f8MMHt03a8YS2AvwOMKZBrDIOdUBFDFC04kNeWSHfpRgJGyvnkmc6Whe
# 0t+bU7IKLMOv2akrrnoJr9eWWcpgGgXpZnboMlImEi/nqwhQz7NEt13YxC4Ddato
# 88tt8zpcoRb0RrrgOGSsbmQ1eKagYw8t00CT+OPeBw3VXHmlSSnnDb6gE3e+lD3v
# ++MrWhAfTVYoonpy4BI6t0le2O3tQ5GD2Xuye4Yb2T6xjF3oiU+EGvKhL1nkkDst
# rjNYxbc+/jLTswM9sbKvkjh+0p2ALPVOVpEhNSXDOW5kf1O6nA+tGSOEy/S6A4aN
# 91/w0FK/jJSHvMAhdCVfGCi2zCcoOCWYOUo2z3yxkq4cI6epZuxhH2rhKEmdX4ji
# JV3TIUs+UsS1Vz8kA/DRelsv1SPjcF0PUUZ3s/gA4bysAoJf28AVs70b1FVL5zmh
# D+kjSbwYuER8ReTBw3J64HLnJN+/RpnF78IcV9uDjexNSTCnq47f7Fufr/zdsGbi
# wZeBe+3W7UvnSSmnEyimp31ngOaKYnhfsi+E11ecXL93KCjx7W3DKI8sj0A3T8Hh
# hUSJxAlMxdSlQy90lfdu+HggWCwTXWCVmj5PM4TasIgX3p5O9JawvEagbJjS4NaI
# jAsCAwEAAaOCAe0wggHpMBAGCSsGAQQBgjcVAQQDAgEAMB0GA1UdDgQWBBRIbmTl
# UAXTgqoXNzcitW2oynUClTAZBgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMAQTALBgNV
# HQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBRyLToCMZBDuRQF
# TuHqp8cx0SOJNDBaBgNVHR8EUzBRME+gTaBLhklodHRwOi8vY3JsLm1pY3Jvc29m
# dC5jb20vcGtpL2NybC9wcm9kdWN0cy9NaWNSb29DZXJBdXQyMDExXzIwMTFfMDNf
# MjIuY3JsMF4GCCsGAQUFBwEBBFIwUDBOBggrBgEFBQcwAoZCaHR0cDovL3d3dy5t
# aWNyb3NvZnQuY29tL3BraS9jZXJ0cy9NaWNSb29DZXJBdXQyMDExXzIwMTFfMDNf
# MjIuY3J0MIGfBgNVHSAEgZcwgZQwgZEGCSsGAQQBgjcuAzCBgzA/BggrBgEFBQcC
# ARYzaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9kb2NzL3ByaW1hcnlj
# cHMuaHRtMEAGCCsGAQUFBwICMDQeMiAdAEwAZQBnAGEAbABfAHAAbwBsAGkAYwB5
# AF8AcwB0AGEAdABlAG0AZQBuAHQALiAdMA0GCSqGSIb3DQEBCwUAA4ICAQBn8oal
# mOBUeRou09h0ZyKbC5YR4WOSmUKWfdJ5DJDBZV8uLD74w3LRbYP+vj/oCso7v0ep
# o/Np22O/IjWll11lhJB9i0ZQVdgMknzSGksc8zxCi1LQsP1r4z4HLimb5j0bpdS1
# HXeUOeLpZMlEPXh6I/MTfaaQdION9MsmAkYqwooQu6SpBQyb7Wj6aC6VoCo/KmtY
# SWMfCWluWpiW5IP0wI/zRive/DvQvTXvbiWu5a8n7dDd8w6vmSiXmE0OPQvyCInW
# H8MyGOLwxS3OW560STkKxgrCxq2u5bLZ2xWIUUVYODJxJxp/sfQn+N4sOiBpmLJZ
# iWhub6e3dMNABQamASooPoI/E01mC8CzTfXhj38cbxV9Rad25UAqZaPDXVJihsMd
# YzaXht/a8/jyFqGaJ+HNpZfQ7l1jQeNbB5yHPgZ3BtEGsXUfFL5hYbXw3MYbBL7f
# QccOKO7eZS/sl/ahXJbYANahRr1Z85elCUtIEJmAH9AAKcWxm6U/RXceNcbSoqKf
# enoi+kiVH6v7RyOA9Z74v2u3S5fi63V4GuzqN5l5GEv/1rMjaHXmr/r8i+sLgOpp
# O6/8MO0ETI7f33VtY5E90Z1WTk+/gFcioXgRMiF670EKsT/7qMykXcGhiJtXcVZO
# SEXAQsmbdlsKgEhr/Xmfwb1tbWrJUnMTDXpQzTGCGXMwghlvAgEBMIGVMH4xCzAJ
# BgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25k
# MR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jv
# c29mdCBDb2RlIFNpZ25pbmcgUENBIDIwMTECEzMAAANclfNIW0oEas8AAAAAA1ww
# DQYJYIZIAWUDBAIBBQCgga4wGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYK
# KwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUwLwYJKoZIhvcNAQkEMSIEINjsqvfH
# Jd55trC0CgwXBxyPYGeIMiGmbQ2KaPjg9qDRMEIGCisGAQQBgjcCAQwxNDAyoBSA
# EgBNAGkAYwByAG8AcwBvAGYAdKEagBhodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20w
# DQYJKoZIhvcNAQEBBQAEggEAhZxL6lAhbVfh9S0OkncFG8j4TCFlcG7nqoKnNFBR
# vSlwgtPeBgKi8Gm+W7AtGWaYV1Djnuno/c2Ca0O5Y4HorJi9QIJzMt69MYR5OoLu
# X3nUvYG8ewJrC4J5KqIceRjdr0WVYgJmBO155JQoWfvyZoDB5Isnt+bvHDwy3HfU
# kyVO3O/aj2MAoloZVW+wT+hYvhK3MI0YRkO/xrOpeoOiy1MOi/ydLLZ6QOBRi1su
# th26n8GcJ+FdyKImDUaaG0ZiF6lhORPlouRyF0EjALWJCh2oglHow7BYqu00Hjx4
# o+8hElYbiSvbl6j09y2qlIEz8vPv8BasCQSGdV4ZXmHBRqGCFv0wghb5BgorBgEE
# AYI3AwMBMYIW6TCCFuUGCSqGSIb3DQEHAqCCFtYwghbSAgEDMQ8wDQYJYIZIAWUD
# BAIBBQAwggFRBgsqhkiG9w0BCRABBKCCAUAEggE8MIIBOAIBAQYKKwYBBAGEWQoD
# ATAxMA0GCWCGSAFlAwQCAQUABCA02SpYFNcCWOQQ71xGiuX7I3GheykJemOnH/eV
# AxAmIQIGZF0Uyt7MGBMyMDIzMDUxNzIyNTUzMS40OTdaMASAAgH0oIHQpIHNMIHK
# MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVk
# bW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSUwIwYDVQQLExxN
# aWNyb3NvZnQgQW1lcmljYSBPcGVyYXRpb25zMSYwJAYDVQQLEx1UaGFsZXMgVFNT
# IEVTTjpFNUE2LUUyN0MtNTkyRTElMCMGA1UEAxMcTWljcm9zb2Z0IFRpbWUtU3Rh
# bXAgU2VydmljZaCCEVQwggcMMIIE9KADAgECAhMzAAABvvQgou6W1iDWAAEAAAG+
# MA0GCSqGSIb3DQEBCwUAMHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5n
# dG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9y
# YXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwMB4X
# DTIyMTEwNDE5MDEyMloXDTI0MDIwMjE5MDEyMlowgcoxCzAJBgNVBAYTAlVTMRMw
# EQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVN
# aWNyb3NvZnQgQ29ycG9yYXRpb24xJTAjBgNVBAsTHE1pY3Jvc29mdCBBbWVyaWNh
# IE9wZXJhdGlvbnMxJjAkBgNVBAsTHVRoYWxlcyBUU1MgRVNOOkU1QTYtRTI3Qy01
# OTJFMSUwIwYDVQQDExxNaWNyb3NvZnQgVGltZS1TdGFtcCBTZXJ2aWNlMIICIjAN
# BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEApV/y2z7Da7nMu0tykLY8olh7Z03E
# qFNz3iFlMp9gOfVmZABmheCc87RuPdQ2P+OHUJiqCQAWNuNSoI/Q1ixEw9AA657l
# dD8Z3/EktpmxKHHavOhwQSFPcpTGFVXIxKCwoO824giyHPG84dfhdi6WU7f7D+85
# LaPB0dOsPHKKMGlC9p66Lv9yQzvAhZGFmFhlusCy/egrz6JX/OHOT9qCwughrL0I
# Pf47ULe1pQSEEihy438JwS+rZU4AVyvQczlMC26XsTuDPgEQKlzx9ru7EvNV99l/
# KCU9bbFf5SnkN1moUgKUq09NWlKxzLGEvhke2QNMopn86Jh1fl/PVevN/xrZSpV2
# 3rM4lB7lh7XSsCPeFslTYojKN2ioOC6p3By7kEmvZCh6rAsPKsARJISdzKQCMq+m
# qDuiP6mr/LvuWKinP+2ZGmK/C1/skvlTjtIehu50yoXNDlh1CN9B3QLglQY+UCBE
# qJog/BxAn3pWdR01o/66XIacgXI/d0wG2/x0OtbjEGAkacfQlmw0bDc02dhQFki/
# 1Q9Vbwh4kC7VgAiJA8bC5zEIYWHNU7C+He69B4/2dZpRjgd5pEpHbF9OYiAf7s5M
# nYEnHN/5o/bGO0ajAb7VI4f9av62sC6xvhKTB5R4lhxEMWF0z4v7BQ5CHyMNkL+o
# TnzJLqnLVdXnuM0CAwEAAaOCATYwggEyMB0GA1UdDgQWBBTrKiAWoYRBoPGtbwvb
# hhX6a2+iqjAfBgNVHSMEGDAWgBSfpxVdAF5iXYP05dJlpxtTNRnpcjBfBgNVHR8E
# WDBWMFSgUqBQhk5odHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NybC9N
# aWNyb3NvZnQlMjBUaW1lLVN0YW1wJTIwUENBJTIwMjAxMCgxKS5jcmwwbAYIKwYB
# BQUHAQEEYDBeMFwGCCsGAQUFBzAChlBodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20v
# cGtpb3BzL2NlcnRzL01pY3Jvc29mdCUyMFRpbWUtU3RhbXAlMjBQQ0ElMjAyMDEw
# KDEpLmNydDAMBgNVHRMBAf8EAjAAMBMGA1UdJQQMMAoGCCsGAQUFBwMIMA0GCSqG
# SIb3DQEBCwUAA4ICAQDHlfu9c0ImhdBis1yj56bBvOSyGpC/rSSty+1F49Tf6fmF
# EeqxhwTTHVHOeIRNd8gcDLSz0d79mXCqq8ynq6gJgy2u4LyyAr2LmwzFVuuxoGVR
# 8YuUnRtvsDH5J+unye/nMkwHiC+G82h3uQ8fcGj+2H0nKPmUpUtfQruMUXvzLjV5
# NyRjDiCL5c/f5ecmz01dnpnCvE6kIz/FTpkvOeVJk22I2akFZhPz24D6OT6KkTtw
# BRpSEHDYqCQ4cZ+7SXx7jzzd7b+0p9vDboqCy7SwWgKpGQG+wVbKrTm4hKkZDzcd
# AEgYqehXz78G00mYILiDTyUikwQpoZ7am9pA6BdTPY+o1v6CRzcneIOnJYanHWz0
# R+KER/ZRFtLCyBMvLzSHEn0sR0+0kLklncKjGdA1YA42zOb611UeIGytZ9VhNwn4
# ws5GJ6n6PJmMPO+yPEkOy2f8OBiuhaqlipiWhzGtt5UsC0geG0sW9qwa4QAW1sQW
# IrhSl24MOOVwNl/Am9/ZqvLRWr1x4nupeR8G7+DNyn4MTg28yFZRU1ktSvyBMUSv
# N2K99BO6p1gSx/wvSsR45dG33PDG5fKqHOgDxctjBU5bX49eJqjNL7S/UndLF7S0
# OWL9mdk/jPVHP2I6XtN0K4VjdRwvIgr3jNib3GZyGJnORp/ZMbY2Dv1mKcx7dTCC
# B3EwggVZoAMCAQICEzMAAAAVxedrngKbSZkAAAAAABUwDQYJKoZIhvcNAQELBQAw
# gYgxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdS
# ZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xMjAwBgNVBAMT
# KU1pY3Jvc29mdCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAyMDEwMB4XDTIx
# MDkzMDE4MjIyNVoXDTMwMDkzMDE4MzIyNVowfDELMAkGA1UEBhMCVVMxEzARBgNV
# BAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jv
# c29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAg
# UENBIDIwMTAwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDk4aZM57Ry
# IQt5osvXJHm9DtWC0/3unAcH0qlsTnXIyjVX9gF/bErg4r25PhdgM/9cT8dm95VT
# cVrifkpa/rg2Z4VGIwy1jRPPdzLAEBjoYH1qUoNEt6aORmsHFPPFdvWGUNzBRMhx
# XFExN6AKOG6N7dcP2CZTfDlhAnrEqv1yaa8dq6z2Nr41JmTamDu6GnszrYBbfowQ
# HJ1S/rboYiXcag/PXfT+jlPP1uyFVk3v3byNpOORj7I5LFGc6XBpDco2LXCOMcg1
# KL3jtIckw+DJj361VI/c+gVVmG1oO5pGve2krnopN6zL64NF50ZuyjLVwIYwXE8s
# 4mKyzbnijYjklqwBSru+cakXW2dg3viSkR4dPf0gz3N9QZpGdc3EXzTdEonW/aUg
# fX782Z5F37ZyL9t9X4C626p+Nuw2TPYrbqgSUei/BQOj0XOmTTd0lBw0gg/wEPK3
# Rxjtp+iZfD9M269ewvPV2HM9Q07BMzlMjgK8QmguEOqEUUbi0b1qGFphAXPKZ6Je
# 1yh2AuIzGHLXpyDwwvoSCtdjbwzJNmSLW6CmgyFdXzB0kZSU2LlQ+QuJYfM2BjUY
# hEfb3BvR/bLUHMVr9lxSUV0S2yW6r1AFemzFER1y7435UsSFF5PAPBXbGjfHCBUY
# P3irRbb1Hode2o+eFnJpxq57t7c+auIurQIDAQABo4IB3TCCAdkwEgYJKwYBBAGC
# NxUBBAUCAwEAATAjBgkrBgEEAYI3FQIEFgQUKqdS/mTEmr6CkTxGNSnPEP8vBO4w
# HQYDVR0OBBYEFJ+nFV0AXmJdg/Tl0mWnG1M1GelyMFwGA1UdIARVMFMwUQYMKwYB
# BAGCN0yDfQEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly93d3cubWljcm9zb2Z0LmNv
# bS9wa2lvcHMvRG9jcy9SZXBvc2l0b3J5Lmh0bTATBgNVHSUEDDAKBggrBgEFBQcD
# CDAZBgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0T
# AQH/BAUwAwEB/zAfBgNVHSMEGDAWgBTV9lbLj+iiXGJo0T2UkFvXzpoYxDBWBgNV
# HR8ETzBNMEugSaBHhkVodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpL2NybC9w
# cm9kdWN0cy9NaWNSb29DZXJBdXRfMjAxMC0wNi0yMy5jcmwwWgYIKwYBBQUHAQEE
# TjBMMEoGCCsGAQUFBzAChj5odHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpL2Nl
# cnRzL01pY1Jvb0NlckF1dF8yMDEwLTA2LTIzLmNydDANBgkqhkiG9w0BAQsFAAOC
# AgEAnVV9/Cqt4SwfZwExJFvhnnJL/Klv6lwUtj5OR2R4sQaTlz0xM7U518JxNj/a
# ZGx80HU5bbsPMeTCj/ts0aGUGCLu6WZnOlNN3Zi6th542DYunKmCVgADsAW+iehp
# 4LoJ7nvfam++Kctu2D9IdQHZGN5tggz1bSNU5HhTdSRXud2f8449xvNo32X2pFaq
# 95W2KFUn0CS9QKC/GbYSEhFdPSfgQJY4rPf5KYnDvBewVIVCs/wMnosZiefwC2qB
# woEZQhlSdYo2wh3DYXMuLGt7bj8sCXgU6ZGyqVvfSaN0DLzskYDSPeZKPmY7T7uG
# +jIa2Zb0j/aRAfbOxnT99kxybxCrdTDFNLB62FD+CljdQDzHVG2dY3RILLFORy3B
# FARxv2T5JL5zbcqOCb2zAVdJVGTZc9d/HltEAY5aGZFrDZ+kKNxnGSgkujhLmm77
# IVRrakURR6nxt67I6IleT53S0Ex2tVdUCbFpAUR+fKFhbHP+CrvsQWY9af3LwUFJ
# fn6Tvsv4O+S3Fb+0zj6lMVGEvL8CwYKiexcdFYmNcP7ntdAoGokLjzbaukz5m/8K
# 6TT4JDVnK+ANuOaMmdbhIurwJ0I9JZTmdHRbatGePu1+oDEzfbzL6Xu/OHBE0ZDx
# yKs6ijoIYn/ZcGNTTY3ugm2lBRDBcQZqELQdVTNYs6FwZvKhggLLMIICNAIBATCB
# +KGB0KSBzTCByjELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAO
# BgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEl
# MCMGA1UECxMcTWljcm9zb2Z0IEFtZXJpY2EgT3BlcmF0aW9uczEmMCQGA1UECxMd
# VGhhbGVzIFRTUyBFU046RTVBNi1FMjdDLTU5MkUxJTAjBgNVBAMTHE1pY3Jvc29m
# dCBUaW1lLVN0YW1wIFNlcnZpY2WiIwoBATAHBgUrDgMCGgMVAGitWlL3vPu8ENOA
# e+i2+4wfTMB7oIGDMIGApH4wfDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hp
# bmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jw
# b3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIwMTAw
# DQYJKoZIhvcNAQEFBQACBQDoD3wpMCIYDzIwMjMwNTE4MDAxNTM3WhgPMjAyMzA1
# MTkwMDE1MzdaMHQwOgYKKwYBBAGEWQoEATEsMCowCgIFAOgPfCkCAQAwBwIBAAIC
# ILIwBwIBAAICEegwCgIFAOgQzakCAQAwNgYKKwYBBAGEWQoEAjEoMCYwDAYKKwYB
# BAGEWQoDAqAKMAgCAQACAwehIKEKMAgCAQACAwGGoDANBgkqhkiG9w0BAQUFAAOB
# gQBQvkyDFR0Ohhluf1UPLV7QLsIc4cAN5tjyr3ZZYCz3PKjLDgyX3zHVNjquAyV2
# pfMDYXEgRAOGkz1jW1C4csE1LVJYEYOVLXrphKQ3rnDeOGfmDUfGOFz6RWD9f7rO
# ZHBKudVjiw72uGcBx8AcZC8uD8dr951H8CnHk14EONVt+DGCBA0wggQJAgEBMIGT
# MHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdS
# ZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMT
# HU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwAhMzAAABvvQgou6W1iDWAAEA
# AAG+MA0GCWCGSAFlAwQCAQUAoIIBSjAaBgkqhkiG9w0BCQMxDQYLKoZIhvcNAQkQ
# AQQwLwYJKoZIhvcNAQkEMSIEIFgyzNlQ+roAG6ie/mfjw7r+3lQkIhbXmzJwscY4
# GI+ZMIH6BgsqhkiG9w0BCRACLzGB6jCB5zCB5DCBvQQglO6Kr632/Oy9ZbXPrhEP
# idNAg/Fef7K3SZg+DxjhDC8wgZgwgYCkfjB8MQswCQYDVQQGEwJVUzETMBEGA1UE
# CBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9z
# b2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQgVGltZS1TdGFtcCBQ
# Q0EgMjAxMAITMwAAAb70IKLultYg1gABAAABvjAiBCBEkayK6rGX0QffaBCUn0BC
# ilBhe4XIJFELQcSeGJFrcTANBgkqhkiG9w0BAQsFAASCAgBphkuwXcF5HJFTMn0i
# sZPcJI3hTxZjPxTzl19kayMM1fpaUkyYkVpArjxfdqxdJlyZlB4Tt87EhceFgu++
# QABrNZbzVV/NwhmkF4CuR7zvr0+sT27hBmUyBBzyAhSoQzZEJ4MIzgbJtmU+HDam
# n+Yw6Io4rCJKeTHcYMju6Qah+7M5Me/5w0q6VtboXrZhIdKKnuoZF/DkcmjuTjO8
# e3OcRP0Yi/b8HuXQl2AqD8gXYoSo4Fg10i0HcLgbcoRnXWlHcBSTyI9UZmA17Rgr
# 0OR7kiNTAtKS/utr+ilqNhJdz0USYWxPhs6xftWEQ529iqH9iftKqic/Wmd4Huza
# hZZkjicsvPif+NsqQVPanPyaoV12RbZToInVT7RZInXK7K6lvbr2wOEi35cNx9fh
# N2xUo7lLdIIgj/5koqv4eK1Uzkpn9bvhb3y0x1cbgK5EKUPWVrsnEBCBvwkuCBtG
# lFOBosWRntt/HlFKcP+fdYPI0F3gH+KevnH9y1oW+wrM0jmEGxZwLeso+QBmVzKx
# oBJB2i4MDqyd0QPLOSbF3QcjfGlkLiUvMrWpmk/mADfkaLVeBBmhJG41WznzZDl/
# cL60f8qpFDXKlfOtVI6RPAJMKx/3yGYbZOZhlvr8BxxiCj5NFnZbUFCOXTWMFLg3
# F7zsHj4KIh8XGITv7T0LJJPaxw==
# SIG # End signature block