UNPKG

igniteui-angular

Version:

Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps

177 lines 48.1 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ /** * @hidden */ export class ExcelStrings { /** * @return {?} */ static getRels() { return ExcelStrings.XML_STRING + '<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"><Relationship Id="rId3" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties" Target="docProps/app.xml"/><Relationship Id="rId2" Type="http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties" Target="docProps/core.xml"/><Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument" Target="xl/workbook.xml"/></Relationships>'; } /** * @return {?} */ static getApp() { return ExcelStrings.XML_STRING + '<Properties xmlns="http://schemas.openxmlformats.org/officeDocument/2006/extended-properties" xmlns:vt="http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes"><Application>Microsoft Excel</Application><DocSecurity>0</DocSecurity><ScaleCrop>false</ScaleCrop><HeadingPairs><vt:vector size="2" baseType="variant"><vt:variant><vt:lpstr>Worksheets</vt:lpstr></vt:variant><vt:variant><vt:i4>1</vt:i4></vt:variant></vt:vector></HeadingPairs><TitlesOfParts><vt:vector size="1" baseType="lpstr"><vt:lpstr>Sheet1</vt:lpstr></vt:vector></TitlesOfParts><Company></Company><LinksUpToDate>false</LinksUpToDate><SharedDoc>false</SharedDoc><HyperlinksChanged>false</HyperlinksChanged><AppVersion>16.0300</AppVersion></Properties>'; } /** * @return {?} */ static getCore() { return ExcelStrings.XML_STRING + '<cp:coreProperties xmlns:cp="http://schemas.openxmlformats.org/package/2006/metadata/core-properties" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:dcmitype="http://purl.org/dc/dcmitype/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><dc:creator></dc:creator><cp:lastModifiedBy></cp:lastModifiedBy><dcterms:created xsi:type="dcterms:W3CDTF">2015-06-05T18:17:20Z</dcterms:created><dcterms:modified xsi:type="dcterms:W3CDTF">2015-06-05T18:17:26Z</dcterms:modified></cp:coreProperties>'; } /** * @return {?} */ static getTheme() { return ExcelStrings.XML_STRING + '<a:theme xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" name="Office Theme"><a:themeElements><a:clrScheme name="Office"><a:dk1><a:sysClr val="windowText" lastClr="000000"/></a:dk1><a:lt1><a:sysClr val="window" lastClr="FFFFFF"/></a:lt1><a:dk2><a:srgbClr val="44546A"/></a:dk2><a:lt2><a:srgbClr val="E7E6E6"/></a:lt2><a:accent1><a:srgbClr val="5B9BD5"/></a:accent1><a:accent2><a:srgbClr val="ED7D31"/></a:accent2><a:accent3><a:srgbClr val="A5A5A5"/></a:accent3><a:accent4><a:srgbClr val="FFC000"/></a:accent4><a:accent5><a:srgbClr val="4472C4"/></a:accent5><a:accent6><a:srgbClr val="70AD47"/></a:accent6><a:hlink><a:srgbClr val="0563C1"/></a:hlink><a:folHlink><a:srgbClr val="954F72"/></a:folHlink></a:clrScheme><a:fontScheme name="Office"><a:majorFont><a:latin typeface="Calibri Light" panose="020F0302020204030204"/><a:ea typeface=""/><a:cs typeface=""/><a:font script="Jpan" typeface="游ゴシック Light"/><a:font script="Hang" typeface="맑은 고딕"/><a:font script="Hans" typeface="等线 Light"/><a:font script="Hant" typeface="新細明體"/><a:font script="Arab" typeface="Times New Roman"/><a:font script="Hebr" typeface="Times New Roman"/><a:font script="Thai" typeface="Tahoma"/><a:font script="Ethi" typeface="Nyala"/><a:font script="Beng" typeface="Vrinda"/><a:font script="Gujr" typeface="Shruti"/><a:font script="Khmr" typeface="MoolBoran"/><a:font script="Knda" typeface="Tunga"/><a:font script="Guru" typeface="Raavi"/><a:font script="Cans" typeface="Euphemia"/><a:font script="Cher" typeface="Plantagenet Cherokee"/><a:font script="Yiii" typeface="Microsoft Yi Baiti"/><a:font script="Tibt" typeface="Microsoft Himalaya"/><a:font script="Thaa" typeface="MV Boli"/><a:font script="Deva" typeface="Mangal"/><a:font script="Telu" typeface="Gautami"/><a:font script="Taml" typeface="Latha"/><a:font script="Syrc" typeface="Estrangelo Edessa"/><a:font script="Orya" typeface="Kalinga"/><a:font script="Mlym" typeface="Kartika"/><a:font script="Laoo" typeface="DokChampa"/><a:font script="Sinh" typeface="Iskoola Pota"/><a:font script="Mong" typeface="Mongolian Baiti"/><a:font script="Viet" typeface="Times New Roman"/><a:font script="Uigh" typeface="Microsoft Uighur"/><a:font script="Geor" typeface="Sylfaen"/></a:majorFont><a:minorFont><a:latin typeface="Calibri" panose="020F0502020204030204"/><a:ea typeface=""/><a:cs typeface=""/><a:font script="Jpan" typeface="游ゴシック"/><a:font script="Hang" typeface="맑은 고딕"/><a:font script="Hans" typeface="等线"/><a:font script="Hant" typeface="新細明體"/><a:font script="Arab" typeface="Arial"/><a:font script="Hebr" typeface="Arial"/><a:font script="Thai" typeface="Tahoma"/><a:font script="Ethi" typeface="Nyala"/><a:font script="Beng" typeface="Vrinda"/><a:font script="Gujr" typeface="Shruti"/><a:font script="Khmr" typeface="DaunPenh"/><a:font script="Knda" typeface="Tunga"/><a:font script="Guru" typeface="Raavi"/><a:font script="Cans" typeface="Euphemia"/><a:font script="Cher" typeface="Plantagenet Cherokee"/><a:font script="Yiii" typeface="Microsoft Yi Baiti"/><a:font script="Tibt" typeface="Microsoft Himalaya"/><a:font script="Thaa" typeface="MV Boli"/><a:font script="Deva" typeface="Mangal"/><a:font script="Telu" typeface="Gautami"/><a:font script="Taml" typeface="Latha"/><a:font script="Syrc" typeface="Estrangelo Edessa"/><a:font script="Orya" typeface="Kalinga"/><a:font script="Mlym" typeface="Kartika"/><a:font script="Laoo" typeface="DokChampa"/><a:font script="Sinh" typeface="Iskoola Pota"/><a:font script="Mong" typeface="Mongolian Baiti"/><a:font script="Viet" typeface="Arial"/><a:font script="Uigh" typeface="Microsoft Uighur"/><a:font script="Geor" typeface="Sylfaen"/></a:minorFont></a:fontScheme><a:fmtScheme name="Office"><a:fillStyleLst><a:solidFill><a:schemeClr val="phClr"/></a:solidFill><a:gradFill rotWithShape="1"><a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:lumMod val="110000"/><a:satMod val="105000"/><a:tint val="67000"/></a:schemeClr></a:gs><a:gs pos="50000"><a:schemeClr val="phClr"><a:lumMod val="105000"/><a:satMod val="103000"/><a:tint val="73000"/></a:schemeClr></a:gs><a:gs pos="100000"><a:schemeClr val="phClr"><a:lumMod val="105000"/><a:satMod val="109000"/><a:tint val="81000"/></a:schemeClr></a:gs></a:gsLst><a:lin ang="5400000" scaled="0"/></a:gradFill><a:gradFill rotWithShape="1"><a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:satMod val="103000"/><a:lumMod val="102000"/><a:tint val="94000"/></a:schemeClr></a:gs><a:gs pos="50000"><a:schemeClr val="phClr"><a:satMod val="110000"/><a:lumMod val="100000"/><a:shade val="100000"/></a:schemeClr></a:gs><a:gs pos="100000"><a:schemeClr val="phClr"><a:lumMod val="99000"/><a:satMod val="120000"/><a:shade val="78000"/></a:schemeClr></a:gs></a:gsLst><a:lin ang="5400000" scaled="0"/></a:gradFill></a:fillStyleLst><a:lnStyleLst><a:ln w="6350" cap="flat" cmpd="sng" algn="ctr"><a:solidFill><a:schemeClr val="phClr"/></a:solidFill><a:prstDash val="solid"/><a:miter lim="800000"/></a:ln><a:ln w="12700" cap="flat" cmpd="sng" algn="ctr"><a:solidFill><a:schemeClr val="phClr"/></a:solidFill><a:prstDash val="solid"/><a:miter lim="800000"/></a:ln><a:ln w="19050" cap="flat" cmpd="sng" algn="ctr"><a:solidFill><a:schemeClr val="phClr"/></a:solidFill><a:prstDash val="solid"/><a:miter lim="800000"/></a:ln></a:lnStyleLst><a:effectStyleLst><a:effectStyle><a:effectLst/></a:effectStyle><a:effectStyle><a:effectLst/></a:effectStyle><a:effectStyle><a:effectLst><a:outerShdw blurRad="57150" dist="19050" dir="5400000" algn="ctr" rotWithShape="0"><a:srgbClr val="000000"><a:alpha val="63000"/></a:srgbClr></a:outerShdw></a:effectLst></a:effectStyle></a:effectStyleLst><a:bgFillStyleLst><a:solidFill><a:schemeClr val="phClr"/></a:solidFill><a:solidFill><a:schemeClr val="phClr"><a:tint val="95000"/><a:satMod val="170000"/></a:schemeClr></a:solidFill><a:gradFill rotWithShape="1"><a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="93000"/><a:satMod val="150000"/><a:shade val="98000"/><a:lumMod val="102000"/></a:schemeClr></a:gs><a:gs pos="50000"><a:schemeClr val="phClr"><a:tint val="98000"/><a:satMod val="130000"/><a:shade val="90000"/><a:lumMod val="103000"/></a:schemeClr></a:gs><a:gs pos="100000"><a:schemeClr val="phClr"><a:shade val="63000"/><a:satMod val="120000"/></a:schemeClr></a:gs></a:gsLst><a:lin ang="5400000" scaled="0"/></a:gradFill></a:bgFillStyleLst></a:fmtScheme></a:themeElements><a:objectDefaults/><a:extraClrSchemeLst/><a:extLst><a:ext uri="{05A4C25C-085E-4340-85A3-A5531E510DB2}"><thm15:themeFamily xmlns:thm15="http://schemas.microsoft.com/office/thememl/2012/main" name="Office Theme" id="{62F939B6-93AF-4DB8-9C6B-D6C7DFDC589F}" vid="{4A3C46E8-61CC-4603-A589-7422A47A8E4A}"/></a:ext></a:extLst></a:theme>'; } /** * @param {?} hasNonStringValues * @return {?} */ static getStyles(hasNonStringValues) { /** @type {?} */ const additionalCellXF = '<xf numFmtId="0" fontId="0" fillId="0" borderId="0" xfId="0" applyNumberFormat="1"/>'; /** @type {?} */ const cellXFCount = hasNonStringValues ? 2 : 1; return ExcelStrings.XML_STRING + '<styleSheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="x14ac x16r2" xmlns:x14ac="http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac" xmlns:x16r2="http://schemas.microsoft.com/office/spreadsheetml/2015/02/main"><fonts count="1" x14ac:knownFonts="1"><font><sz val="11"/><color theme="1"/><name val="Calibri"/><family val="2"/><scheme val="minor"/></font></fonts><fills count="2"><fill><patternFill patternType="none"/></fill><fill><patternFill patternType="gray125"/></fill></fills><borders count="1"><border><left/><right/><top/><bottom/><diagonal/></border></borders><cellStyleXfs count="1"><xf numFmtId="0" fontId="0" fillId="0" borderId="0"/></cellStyleXfs><cellXfs count="' + cellXFCount + '"><xf numFmtId="0" fontId="0" fillId="0" borderId="0" xfId="0"/>' + additionalCellXF + '</cellXfs><cellStyles count="1"><cellStyle name="Normal" xfId="0" builtinId="0"/></cellStyles><dxfs count="0"/><tableStyles count="0" defaultTableStyle="TableStyleMedium2" defaultPivotStyle="PivotStyleLight16"/><extLst><ext uri="{EB79DEF2-80B8-43e5-95BD-54CBDDF9020C}" xmlns:x14="http://schemas.microsoft.com/office/spreadsheetml/2009/9/main"><x14:slicerStyles defaultSlicerStyle="SlicerStyleLight1"/></ext><ext uri="{9260A510-F301-46a8-8635-F512D64BE5F5}" xmlns:x15="http://schemas.microsoft.com/office/spreadsheetml/2010/11/main"><x15:timelineStyles defaultTimelineStyle="TimeSlicerStyleLight1"/></ext></extLst></styleSheet>'; } /** * @return {?} */ static getWorkbook() { return ExcelStrings.XML_STRING + '<workbook xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="x15" xmlns:x15="http://schemas.microsoft.com/office/spreadsheetml/2010/11/main"><fileVersion appName="xl" lastEdited="6" lowestEdited="6" rupBuild="14420"/><workbookPr filterPrivacy="1" defaultThemeVersion="164011"/><bookViews><workbookView xWindow="0" yWindow="0" windowWidth="22260" windowHeight="12645"/></bookViews><sheets><sheet name="Sheet1" sheetId="1" r:id="rId1"/></sheets><calcPr calcId="162913"/><extLst><ext uri="{140A7094-0E35-4892-8432-C4D2E57EDEB5}" xmlns:x15="http://schemas.microsoft.com/office/spreadsheetml/2010/11/main"><x15:workbookPr chartTrackingRefBase="1"/></ext></extLst></workbook>'; } /** * @return {?} */ static getWorksheetRels() { return ExcelStrings.XML_STRING + `<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"><Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/table" Target="../tables/table1.xml"/></Relationships>`; } /** * @param {?} hasSharedStrings * @return {?} */ static getWorkbookRels(hasSharedStrings) { /** @type {?} */ let retVal = ExcelStrings.XML_STRING + '<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"><Relationship Id="rId3" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles" Target="styles.xml"/><Relationship Id="rId2" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme" Target="theme/theme1.xml"/><Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet" Target="worksheets/sheet1.xml"/>'; if (hasSharedStrings) { retVal += ExcelStrings.SHARED_STRING_RELATIONSHIP; } retVal += '</Relationships>'; return retVal; } /** * @param {?} dimension * @param {?} freezePane * @param {?} cols * @param {?} sheetData * @param {?} hasTable * @param {?=} hasGroupedRows * @param {?=} outlineLevel * @return {?} */ static getSheetXML(dimension, freezePane, cols, sheetData, hasTable, hasGroupedRows = false, outlineLevel = 0) { /** @type {?} */ const tableParts = hasTable ? '<tableParts count="1"><tablePart r:id="rId1"/></tableParts>' : ''; /** @type {?} */ const sheetOutlineProp = hasGroupedRows ? '<sheetPr><outlinePr summaryBelow="0"/></sheetPr>' : ''; /** @type {?} */ const sOutlineLevel = outlineLevel > 0 ? `outlineLevelRow="${outlineLevel}"` : ''; // return ExcelStrings.XML_STRING + // '<worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="x14ac" xmlns:x14ac="http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac"><dimension ref="' + dimension + '"/><sheetViews><sheetView tabSelected="1" workbookViewId="0">' + freezePane + '</sheetView></sheetViews><sheetFormatPr defaultRowHeight="15" x14ac:dyDescent="0.25"/>' + cols + sheetData + '<pageMargins left="0.7" right="0.7" top="0.75" bottom="0.75" header="0.3" footer="0.3"/>' + tableParts + '</worksheet>'; return `${ExcelStrings.XML_STRING} <worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="x14ac" xmlns:x14ac="http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac"> ${sheetOutlineProp} <dimension ref="${dimension}"/> <sheetViews><sheetView tabSelected="1" workbookViewId="0">${freezePane}</sheetView></sheetViews> <sheetFormatPr defaultRowHeight="15" ${sOutlineLevel} x14ac:dyDescent="0.25"/> ${cols} ${sheetData} <pageMargins left="0.7" right="0.7" top="0.75" bottom="0.75" header="0.3" footer="0.3"/> ${tableParts}</worksheet>`; } /** * @param {?} count * @param {?} uniqueCount * @param {?} table * @return {?} */ static getSharedStringXML(count, uniqueCount, table) { return ExcelStrings.XML_STRING + '<sst xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" count="' + count + '" uniqueCount="' + uniqueCount + '">' + table + '</sst>'; } /** * @param {?} hasSharedStrings * @param {?} hasTable * @return {?} */ static getContentTypesXML(hasSharedStrings, hasTable) { /** @type {?} */ let contentTypes = ExcelStrings.XML_STRING + `<Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types\"> <Default Extension="rels" ContentType="application/vnd.openxmlformats-package.relationships+xml"/> <Default Extension="xml" ContentType="application/xml"/> <Override PartName="/xl/workbook.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml"/> <Override PartName="/xl/worksheets/sheet1.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml"/> <Override PartName="/xl/theme/theme1.xml" ContentType="application/vnd.openxmlformats-officedocument.theme+xml"/> <Override PartName="/xl/styles.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml"/> <Override PartName="/docProps/core.xml" ContentType="application/vnd.openxmlformats-package.core-properties+xml"/> <Override PartName="/docProps/app.xml" ContentType="application/vnd.openxmlformats-officedocument.extended-properties+xml"/>`; contentTypes += hasSharedStrings ? ` <Override PartName="/xl/sharedStrings.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml"/>` : ''; contentTypes += hasTable ? `<Override PartName="/xl/tables/table1.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml"/>` : ''; contentTypes += `</Types>`; return contentTypes; } /** * @param {?} dimension * @param {?} tableColumns * @param {?} sort * @return {?} */ static getTablesXML(dimension, tableColumns, sort) { return `${ExcelStrings.XML_STRING}<table xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" id="1" name="Table1" displayName="Table1" ref="${dimension}" totalsRowShown="0"> <autoFilter ref="${dimension}"/>${sort}${tableColumns}<tableStyleInfo name="TableStyleMedium2" showFirstColumn="0" showLastColumn="0" showRowStripes="1" showColumnStripes="0"/> </table>`; } /* tslint:enable max-line-length */ /** * @param {?} index * @return {?} */ static getExcelColumn(index) { // Returns the excel column name for given 0-based index // For example 27 should return "AB" /** @type {?} */ let returnString = ''; while (index >= 0) { /** @type {?} */ const char = index % 26; returnString = String.fromCharCode(65 + char) + returnString; index = Math.floor(index / 26) - 1; } return returnString; } } /* tslint:disable max-line-length */ ExcelStrings.XML_STRING = '<?xml version="1.0" encoding="UTF-8"?>\r\n'; ExcelStrings.SHARED_STRING_RELATIONSHIP = '<Relationship Id="rId4" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings" Target="sharedStrings.xml" />'; if (false) { /** * @type {?} * @private */ ExcelStrings.XML_STRING; /** * @type {?} * @private */ ExcelStrings.SHARED_STRING_RELATIONSHIP; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhjZWwtc3RyaW5ncy5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2lnbml0ZXVpLWFuZ3VsYXIvIiwic291cmNlcyI6WyJsaWIvc2VydmljZXMvZXhjZWwvZXhjZWwtc3RyaW5ncy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQ0EsTUFBTSxPQUFPLFlBQVk7Ozs7SUFLZCxNQUFNLENBQUMsT0FBTztRQUNqQixPQUFPLFlBQVksQ0FBQyxVQUFVLEdBQUcscWhCQUFxaEIsQ0FBQztJQUMzakIsQ0FBQzs7OztJQUVNLE1BQU0sQ0FBQyxNQUFNO1FBQ2hCLE9BQU8sWUFBWSxDQUFDLFVBQVUsR0FBRywwdEJBQTB0QixDQUFDO0lBQ2h3QixDQUFDOzs7O0lBRU0sTUFBTSxDQUFDLE9BQU87UUFDakIsT0FBTyxZQUFZLENBQUMsVUFBVSxHQUFHLDBoQkFBMGhCLENBQUM7SUFDaGtCLENBQUM7Ozs7SUFFTSxNQUFNLENBQUMsUUFBUTtRQUNsQixPQUFPLFlBQVksQ0FBQyxVQUFVLEdBQUcseWhOQUF5aE4sQ0FBQztJQUMvak4sQ0FBQzs7Ozs7SUFFTSxNQUFNLENBQUMsU0FBUyxDQUFDLGtCQUEyQjs7Y0FDekMsZ0JBQWdCLEdBQUcsc0ZBQXNGOztjQUN6RyxXQUFXLEdBQUcsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5QyxPQUFPLFlBQVksQ0FBQyxVQUFVLEdBQUcsMHhCQUEweEIsR0FBRyxXQUFXLEdBQUcsa0VBQWtFLEdBQUcsZ0JBQWdCLEdBQUcsb25CQUFvbkIsQ0FBQztJQUM3aEQsQ0FBQzs7OztJQUVNLE1BQU0sQ0FBQyxXQUFXO1FBQ3JCLE9BQU8sWUFBWSxDQUFDLFVBQVUsR0FBRyxpMUJBQWkxQixDQUFDO0lBQ3YzQixDQUFDOzs7O0lBRU0sTUFBTSxDQUFDLGdCQUFnQjtRQUMxQixPQUFPLFlBQVksQ0FBQyxVQUFVLEdBQUcsOE9BQThPLENBQUM7SUFDcFIsQ0FBQzs7Ozs7SUFFTSxNQUFNLENBQUMsZUFBZSxDQUFDLGdCQUFnQjs7WUFDdEMsTUFBTSxHQUFHLFlBQVksQ0FBQyxVQUFVLEdBQUcsc2VBQXNlO1FBRTdnQixJQUFJLGdCQUFnQixFQUFFO1lBQ2xCLE1BQU0sSUFBSSxZQUFZLENBQUMsMEJBQTBCLENBQUM7U0FDckQ7UUFFRCxNQUFNLElBQUksa0JBQWtCLENBQUM7UUFFN0IsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQzs7Ozs7Ozs7Ozs7SUFFTSxNQUFNLENBQUMsV0FBVyxDQUFDLFNBQWlCLEVBQUUsVUFBa0IsRUFBRSxJQUFZLEVBQUUsU0FBaUIsRUFBRSxRQUFpQixFQUFFLGNBQWMsR0FBRyxLQUFLLEVBQUUsWUFBWSxHQUFHLENBQUM7O2NBQ25KLFVBQVUsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLDZEQUE2RCxDQUFDLENBQUMsQ0FBQyxFQUFFOztjQUMxRixnQkFBZ0IsR0FBRyxjQUFjLENBQUMsQ0FBQyxDQUFDLGtEQUFrRCxDQUFDLENBQUMsQ0FBQyxFQUFFOztjQUMzRixhQUFhLEdBQUcsWUFBWSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsb0JBQW9CLFlBQVksR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFO1FBQ2pGLG1DQUFtQztRQUNuQywrcEJBQStwQjtRQUUvcEIsT0FBTyxHQUFHLFlBQVksQ0FBQyxVQUFVOztFQUV2QyxnQkFBZ0I7a0JBQ0EsU0FBUzs0REFDaUMsVUFBVTt1Q0FDL0IsYUFBYTtFQUNsRCxJQUFJO0VBQ0osU0FBUzs7RUFFVCxVQUFVLGNBQWMsQ0FBQztJQUV2QixDQUFDOzs7Ozs7O0lBRU0sTUFBTSxDQUFDLGtCQUFrQixDQUFDLEtBQWEsRUFBRSxXQUFtQixFQUFFLEtBQWE7UUFDOUUsT0FBTyxZQUFZLENBQUMsVUFBVSxHQUFHLGdGQUFnRixHQUFHLEtBQUssR0FBRyxpQkFBaUIsR0FBRyxXQUFXLEdBQUcsSUFBSSxHQUFHLEtBQUssR0FBRyxRQUFRLENBQUM7SUFDMUwsQ0FBQzs7Ozs7O0lBRU0sTUFBTSxDQUFDLGtCQUFrQixDQUFDLGdCQUF5QixFQUFFLFFBQWlCOztZQUNyRSxZQUFZLEdBQUcsWUFBWSxDQUFDLFVBQVU7WUFDMUM7Ozs7Ozs7O3lJQVFpSTtRQUVqSSxZQUFZLElBQUksZ0JBQWdCLENBQUMsQ0FBQztZQUNsQywySUFBMkksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBRWpKLFlBQVksSUFBSSxRQUFRLENBQUMsQ0FBQztZQUN0QixrSUFBa0ksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzVJLFlBQVksSUFBSSxVQUFVLENBQUM7UUFFM0IsT0FBTyxZQUFZLENBQUM7SUFDeEIsQ0FBQzs7Ozs7OztJQUVNLE1BQU0sQ0FBQyxZQUFZLENBQUMsU0FBaUIsRUFBRSxZQUFvQixFQUFFLElBQVk7UUFDNUUsT0FBTyxHQUFHLFlBQVksQ0FBQyxVQUFVLDJIQUEySCxTQUFTO3VCQUN0SixTQUFTLE1BQU0sSUFBSSxHQUFHLFlBQVk7U0FDaEQsQ0FBQztJQUNOLENBQUM7Ozs7OztJQUdNLE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBYTs7OztZQUdsQyxZQUFZLEdBQUcsRUFBRTtRQUNyQixPQUFPLEtBQUssSUFBSSxDQUFDLEVBQUU7O2tCQUNULElBQUksR0FBRyxLQUFLLEdBQUcsRUFBRTtZQUN2QixZQUFZLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsWUFBWSxDQUFDO1lBQzdELEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDdEM7UUFDRCxPQUFPLFlBQVksQ0FBQztJQUN4QixDQUFDOzs7QUE1R2MsdUJBQVUsR0FBRyw0Q0FBNEMsQ0FBQztBQUMxRCx1Q0FBMEIsR0FBRyxnSkFBZ0osQ0FBQzs7Ozs7O0lBRDdMLHdCQUF5RTs7Ozs7SUFDekUsd0NBQTZMIiwic291cmNlc0NvbnRlbnQiOlsiLyoqIEBoaWRkZW4gKi9cbmV4cG9ydCBjbGFzcyBFeGNlbFN0cmluZ3Mge1xuICAgIC8qIHRzbGludDpkaXNhYmxlIG1heC1saW5lLWxlbmd0aCAqL1xuICAgIHByaXZhdGUgc3RhdGljIFhNTF9TVFJJTkcgPSAnPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XFxyXFxuJztcbiAgICBwcml2YXRlIHN0YXRpYyBTSEFSRURfU1RSSU5HX1JFTEFUSU9OU0hJUCA9ICc8UmVsYXRpb25zaGlwIElkPVwicklkNFwiIFR5cGU9XCJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzL3NoYXJlZFN0cmluZ3NcIiBUYXJnZXQ9XCJzaGFyZWRTdHJpbmdzLnhtbFwiIC8+JztcblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0UmVscygpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gRXhjZWxTdHJpbmdzLlhNTF9TVFJJTkcgKyAnPFJlbGF0aW9uc2hpcHMgeG1sbnM9XCJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvcGFja2FnZS8yMDA2L3JlbGF0aW9uc2hpcHNcIj48UmVsYXRpb25zaGlwIElkPVwicklkM1wiIFR5cGU9XCJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzL2V4dGVuZGVkLXByb3BlcnRpZXNcIiBUYXJnZXQ9XCJkb2NQcm9wcy9hcHAueG1sXCIvPjxSZWxhdGlvbnNoaXAgSWQ9XCJySWQyXCIgVHlwZT1cImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9wYWNrYWdlLzIwMDYvcmVsYXRpb25zaGlwcy9tZXRhZGF0YS9jb3JlLXByb3BlcnRpZXNcIiBUYXJnZXQ9XCJkb2NQcm9wcy9jb3JlLnhtbFwiLz48UmVsYXRpb25zaGlwIElkPVwicklkMVwiIFR5cGU9XCJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzL29mZmljZURvY3VtZW50XCIgVGFyZ2V0PVwieGwvd29ya2Jvb2sueG1sXCIvPjwvUmVsYXRpb25zaGlwcz4nO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0QXBwKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBFeGNlbFN0cmluZ3MuWE1MX1NUUklORyArICc8UHJvcGVydGllcyB4bWxucz1cImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9vZmZpY2VEb2N1bWVudC8yMDA2L2V4dGVuZGVkLXByb3BlcnRpZXNcIiB4bWxuczp2dD1cImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9vZmZpY2VEb2N1bWVudC8yMDA2L2RvY1Byb3BzVlR5cGVzXCI+PEFwcGxpY2F0aW9uPk1pY3Jvc29mdCBFeGNlbDwvQXBwbGljYXRpb24+PERvY1NlY3VyaXR5PjA8L0RvY1NlY3VyaXR5PjxTY2FsZUNyb3A+ZmFsc2U8L1NjYWxlQ3JvcD48SGVhZGluZ1BhaXJzPjx2dDp2ZWN0b3Igc2l6ZT1cIjJcIiBiYXNlVHlwZT1cInZhcmlhbnRcIj48dnQ6dmFyaWFudD48dnQ6bHBzdHI+V29ya3NoZWV0czwvdnQ6bHBzdHI+PC92dDp2YXJpYW50Pjx2dDp2YXJpYW50Pjx2dDppND4xPC92dDppND48L3Z0OnZhcmlhbnQ+PC92dDp2ZWN0b3I+PC9IZWFkaW5nUGFpcnM+PFRpdGxlc09mUGFydHM+PHZ0OnZlY3RvciBzaXplPVwiMVwiIGJhc2VUeXBlPVwibHBzdHJcIj48dnQ6bHBzdHI+U2hlZXQxPC92dDpscHN0cj48L3Z0OnZlY3Rvcj48L1RpdGxlc09mUGFydHM+PENvbXBhbnk+PC9Db21wYW55PjxMaW5rc1VwVG9EYXRlPmZhbHNlPC9MaW5rc1VwVG9EYXRlPjxTaGFyZWREb2M+ZmFsc2U8L1NoYXJlZERvYz48SHlwZXJsaW5rc0NoYW5nZWQ+ZmFsc2U8L0h5cGVybGlua3NDaGFuZ2VkPjxBcHBWZXJzaW9uPjE2LjAzMDA8L0FwcFZlcnNpb24+PC9Qcm9wZXJ0aWVzPic7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXRDb3JlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBFeGNlbFN0cmluZ3MuWE1MX1NUUklORyArICc8Y3A6Y29yZVByb3BlcnRpZXMgeG1sbnM6Y3A9XCJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvcGFja2FnZS8yMDA2L21ldGFkYXRhL2NvcmUtcHJvcGVydGllc1wiIHhtbG5zOmRjPVwiaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS9cIiB4bWxuczpkY3Rlcm1zPVwiaHR0cDovL3B1cmwub3JnL2RjL3Rlcm1zL1wiIHhtbG5zOmRjbWl0eXBlPVwiaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1wiIHhtbG5zOnhzaT1cImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlXCI+PGRjOmNyZWF0b3I+PC9kYzpjcmVhdG9yPjxjcDpsYXN0TW9kaWZpZWRCeT48L2NwOmxhc3RNb2RpZmllZEJ5PjxkY3Rlcm1zOmNyZWF0ZWQgeHNpOnR5cGU9XCJkY3Rlcm1zOlczQ0RURlwiPjIwMTUtMDYtMDVUMTg6MTc6MjBaPC9kY3Rlcm1zOmNyZWF0ZWQ+PGRjdGVybXM6bW9kaWZpZWQgeHNpOnR5cGU9XCJkY3Rlcm1zOlczQ0RURlwiPjIwMTUtMDYtMDVUMTg6MTc6MjZaPC9kY3Rlcm1zOm1vZGlmaWVkPjwvY3A6Y29yZVByb3BlcnRpZXM+JztcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldFRoZW1lKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBFeGNlbFN0cmluZ3MuWE1MX1NUUklORyArICc8YTp0aGVtZSB4bWxuczphPVwiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL2RyYXdpbmdtbC8yMDA2L21haW5cIiBuYW1lPVwiT2ZmaWNlIFRoZW1lXCI+PGE6dGhlbWVFbGVtZW50cz48YTpjbHJTY2hlbWUgbmFtZT1cIk9mZmljZVwiPjxhOmRrMT48YTpzeXNDbHIgdmFsPVwid2luZG93VGV4dFwiIGxhc3RDbHI9XCIwMDAwMDBcIi8+PC9hOmRrMT48YTpsdDE+PGE6c3lzQ2xyIHZhbD1cIndpbmRvd1wiIGxhc3RDbHI9XCJGRkZGRkZcIi8+PC9hOmx0MT48YTpkazI+PGE6c3JnYkNsciB2YWw9XCI0NDU0NkFcIi8+PC9hOmRrMj48YTpsdDI+PGE6c3JnYkNsciB2YWw9XCJFN0U2RTZcIi8+PC9hOmx0Mj48YTphY2NlbnQxPjxhOnNyZ2JDbHIgdmFsPVwiNUI5QkQ1XCIvPjwvYTphY2NlbnQxPjxhOmFjY2VudDI+PGE6c3JnYkNsciB2YWw9XCJFRDdEMzFcIi8+PC9hOmFjY2VudDI+PGE6YWNjZW50Mz48YTpzcmdiQ2xyIHZhbD1cIkE1QTVBNVwiLz48L2E6YWNjZW50Mz48YTphY2NlbnQ0PjxhOnNyZ2JDbHIgdmFsPVwiRkZDMDAwXCIvPjwvYTphY2NlbnQ0PjxhOmFjY2VudDU+PGE6c3JnYkNsciB2YWw9XCI0NDcyQzRcIi8+PC9hOmFjY2VudDU+PGE6YWNjZW50Nj48YTpzcmdiQ2xyIHZhbD1cIjcwQUQ0N1wiLz48L2E6YWNjZW50Nj48YTpobGluaz48YTpzcmdiQ2xyIHZhbD1cIjA1NjNDMVwiLz48L2E6aGxpbms+PGE6Zm9sSGxpbms+PGE6c3JnYkNsciB2YWw9XCI5NTRGNzJcIi8+PC9hOmZvbEhsaW5rPjwvYTpjbHJTY2hlbWU+PGE6Zm9udFNjaGVtZSBuYW1lPVwiT2ZmaWNlXCI+PGE6bWFqb3JGb250PjxhOmxhdGluIHR5cGVmYWNlPVwiQ2FsaWJyaSBMaWdodFwiIHBhbm9zZT1cIjAyMEYwMzAyMDIwMjA0MDMwMjA0XCIvPjxhOmVhIHR5cGVmYWNlPVwiXCIvPjxhOmNzIHR5cGVmYWNlPVwiXCIvPjxhOmZvbnQgc2NyaXB0PVwiSnBhblwiIHR5cGVmYWNlPVwi5ri444K044K344OD44KvIExpZ2h0XCIvPjxhOmZvbnQgc2NyaXB0PVwiSGFuZ1wiIHR5cGVmYWNlPVwi66eR7J2AIOqzoOuUlVwiLz48YTpmb250IHNjcmlwdD1cIkhhbnNcIiB0eXBlZmFjZT1cIuetiee6vyBMaWdodFwiLz48YTpmb250IHNjcmlwdD1cIkhhbnRcIiB0eXBlZmFjZT1cIuaWsOe0sOaYjumrlFwiLz48YTpmb250IHNjcmlwdD1cIkFyYWJcIiB0eXBlZmFjZT1cIlRpbWVzIE5ldyBSb21hblwiLz48YTpmb250IHNjcmlwdD1cIkhlYnJcIiB0eXBlZmFjZT1cIlRpbWVzIE5ldyBSb21hblwiLz48YTpmb250IHNjcmlwdD1cIlRoYWlcIiB0eXBlZmFjZT1cIlRhaG9tYVwiLz48YTpmb250IHNjcmlwdD1cIkV0aGlcIiB0eXBlZmFjZT1cIk55YWxhXCIvPjxhOmZvbnQgc2NyaXB0PVwiQmVuZ1wiIHR5cGVmYWNlPVwiVnJpbmRhXCIvPjxhOmZvbnQgc2NyaXB0PVwiR3VqclwiIHR5cGVmYWNlPVwiU2hydXRpXCIvPjxhOmZvbnQgc2NyaXB0PVwiS2htclwiIHR5cGVmYWNlPVwiTW9vbEJvcmFuXCIvPjxhOmZvbnQgc2NyaXB0PVwiS25kYVwiIHR5cGVmYWNlPVwiVHVuZ2FcIi8+PGE6Zm9udCBzY3JpcHQ9XCJHdXJ1XCIgdHlwZWZhY2U9XCJSYWF2aVwiLz48YTpmb250IHNjcmlwdD1cIkNhbnNcIiB0eXBlZmFjZT1cIkV1cGhlbWlhXCIvPjxhOmZvbnQgc2NyaXB0PVwiQ2hlclwiIHR5cGVmYWNlPVwiUGxhbnRhZ2VuZXQgQ2hlcm9rZWVcIi8+PGE6Zm9udCBzY3JpcHQ9XCJZaWlpXCIgdHlwZWZhY2U9XCJNaWNyb3NvZnQgWWkgQmFpdGlcIi8+PGE6Zm9udCBzY3JpcHQ9XCJUaWJ0XCIgdHlwZWZhY2U9XCJNaWNyb3NvZnQgSGltYWxheWFcIi8+PGE6Zm9udCBzY3JpcHQ9XCJUaGFhXCIgdHlwZWZhY2U9XCJNViBCb2xpXCIvPjxhOmZvbnQgc2NyaXB0PVwiRGV2YVwiIHR5cGVmYWNlPVwiTWFuZ2FsXCIvPjxhOmZvbnQgc2NyaXB0PVwiVGVsdVwiIHR5cGVmYWNlPVwiR2F1dGFtaVwiLz48YTpmb250IHNjcmlwdD1cIlRhbWxcIiB0eXBlZmFjZT1cIkxhdGhhXCIvPjxhOmZvbnQgc2NyaXB0PVwiU3lyY1wiIHR5cGVmYWNlPVwiRXN0cmFuZ2VsbyBFZGVzc2FcIi8+PGE6Zm9udCBzY3JpcHQ9XCJPcnlhXCIgdHlwZWZhY2U9XCJLYWxpbmdhXCIvPjxhOmZvbnQgc2NyaXB0PVwiTWx5bVwiIHR5cGVmYWNlPVwiS2FydGlrYVwiLz48YTpmb250IHNjcmlwdD1cIkxhb29cIiB0eXBlZmFjZT1cIkRva0NoYW1wYVwiLz48YTpmb250IHNjcmlwdD1cIlNpbmhcIiB0eXBlZmFjZT1cIklza29vbGEgUG90YVwiLz48YTpmb250IHNjcmlwdD1cIk1vbmdcIiB0eXBlZmFjZT1cIk1vbmdvbGlhbiBCYWl0aVwiLz48YTpmb250IHNjcmlwdD1cIlZpZXRcIiB0eXBlZmFjZT1cIlRpbWVzIE5ldyBSb21hblwiLz48YTpmb250IHNjcmlwdD1cIlVpZ2hcIiB0eXBlZmFjZT1cIk1pY3Jvc29mdCBVaWdodXJcIi8+PGE6Zm9udCBzY3JpcHQ9XCJHZW9yXCIgdHlwZWZhY2U9XCJTeWxmYWVuXCIvPjwvYTptYWpvckZvbnQ+PGE6bWlub3JGb250PjxhOmxhdGluIHR5cGVmYWNlPVwiQ2FsaWJyaVwiIHBhbm9zZT1cIjAyMEYwNTAyMDIwMjA0MDMwMjA0XCIvPjxhOmVhIHR5cGVmYWNlPVwiXCIvPjxhOmNzIHR5cGVmYWNlPVwiXCIvPjxhOmZvbnQgc2NyaXB0PVwiSnBhblwiIHR5cGVmYWNlPVwi5ri444K044K344OD44KvXCIvPjxhOmZvbnQgc2NyaXB0PVwiSGFuZ1wiIHR5cGVmYWNlPVwi66eR7J2AIOqzoOuUlVwiLz48YTpmb250IHNjcmlwdD1cIkhhbnNcIiB0eXBlZmFjZT1cIuetiee6v1wiLz48YTpmb250IHNjcmlwdD1cIkhhbnRcIiB0eXBlZmFjZT1cIuaWsOe0sOaYjumrlFwiLz48YTpmb250IHNjcmlwdD1cIkFyYWJcIiB0eXBlZmFjZT1cIkFyaWFsXCIvPjxhOmZvbnQgc2NyaXB0PVwiSGViclwiIHR5cGVmYWNlPVwiQXJpYWxcIi8+PGE6Zm9udCBzY3JpcHQ9XCJUaGFpXCIgdHlwZWZhY2U9XCJUYWhvbWFcIi8+PGE6Zm9udCBzY3JpcHQ9XCJFdGhpXCIgdHlwZWZhY2U9XCJOeWFsYVwiLz48YTpmb250IHNjcmlwdD1cIkJlbmdcIiB0eXBlZmFjZT1cIlZyaW5kYVwiLz48YTpmb250IHNjcmlwdD1cIkd1anJcIiB0eXBlZmFjZT1cIlNocnV0aVwiLz48YTpmb250IHNjcmlwdD1cIktobXJcIiB0eXBlZmFjZT1cIkRhdW5QZW5oXCIvPjxhOmZvbnQgc2NyaXB0PVwiS25kYVwiIHR5cGVmYWNlPVwiVHVuZ2FcIi8+PGE6Zm9udCBzY3JpcHQ9XCJHdXJ1XCIgdHlwZWZhY2U9XCJSYWF2aVwiLz48YTpmb250IHNjcmlwdD1cIkNhbnNcIiB0eXBlZmFjZT1cIkV1cGhlbWlhXCIvPjxhOmZvbnQgc2NyaXB0PVwiQ2hlclwiIHR5cGVmYWNlPVwiUGxhbnRhZ2VuZXQgQ2hlcm9rZWVcIi8+PGE6Zm9udCBzY3JpcHQ9XCJZaWlpXCIgdHlwZWZhY2U9XCJNaWNyb3NvZnQgWWkgQmFpdGlcIi8+PGE6Zm9udCBzY3JpcHQ9XCJUaWJ0XCIgdHlwZWZhY2U9XCJNaWNyb3NvZnQgSGltYWxheWFcIi8+PGE6Zm9udCBzY3JpcHQ9XCJUaGFhXCIgdHlwZWZhY2U9XCJNViBCb2xpXCIvPjxhOmZvbnQgc2NyaXB0PVwiRGV2YVwiIHR5cGVmYWNlPVwiTWFuZ2FsXCIvPjxhOmZvbnQgc2NyaXB0PVwiVGVsdVwiIHR5cGVmYWNlPVwiR2F1dGFtaVwiLz48YTpmb250IHNjcmlwdD1cIlRhbWxcIiB0eXBlZmFjZT1cIkxhdGhhXCIvPjxhOmZvbnQgc2NyaXB0PVwiU3lyY1wiIHR5cGVmYWNlPVwiRXN0cmFuZ2VsbyBFZGVzc2FcIi8+PGE6Zm9udCBzY3JpcHQ9XCJPcnlhXCIgdHlwZWZhY2U9XCJLYWxpbmdhXCIvPjxhOmZvbnQgc2NyaXB0PVwiTWx5bVwiIHR5cGVmYWNlPVwiS2FydGlrYVwiLz48YTpmb250IHNjcmlwdD1cIkxhb29cIiB0eXBlZmFjZT1cIkRva0NoYW1wYVwiLz48YTpmb250IHNjcmlwdD1cIlNpbmhcIiB0eXBlZmFjZT1cIklza29vbGEgUG90YVwiLz48YTpmb250IHNjcmlwdD1cIk1vbmdcIiB0eXBlZmFjZT1cIk1vbmdvbGlhbiBCYWl0aVwiLz48YTpmb250IHNjcmlwdD1cIlZpZXRcIiB0eXBlZmFjZT1cIkFyaWFsXCIvPjxhOmZvbnQgc2NyaXB0PVwiVWlnaFwiIHR5cGVmYWNlPVwiTWljcm9zb2Z0IFVpZ2h1clwiLz48YTpmb250IHNjcmlwdD1cIkdlb3JcIiB0eXBlZmFjZT1cIlN5bGZhZW5cIi8+PC9hOm1pbm9yRm9udD48L2E6Zm9udFNjaGVtZT48YTpmbXRTY2hlbWUgbmFtZT1cIk9mZmljZVwiPjxhOmZpbGxTdHlsZUxzdD48YTpzb2xpZEZpbGw+PGE6c2NoZW1lQ2xyIHZhbD1cInBoQ2xyXCIvPjwvYTpzb2xpZEZpbGw+PGE6Z3JhZEZpbGwgcm90V2l0aFNoYXBlPVwiMVwiPjxhOmdzTHN0PjxhOmdzIHBvcz1cIjBcIj48YTpzY2hlbWVDbHIgdmFsPVwicGhDbHJcIj48YTpsdW1Nb2QgdmFsPVwiMTEwMDAwXCIvPjxhOnNhdE1vZCB2YWw9XCIxMDUwMDBcIi8+PGE6dGludCB2YWw9XCI2NzAwMFwiLz48L2E6c2NoZW1lQ2xyPjwvYTpncz48YTpncyBwb3M9XCI1MDAwMFwiPjxhOnNjaGVtZUNsciB2YWw9XCJwaENsclwiPjxhOmx1bU1vZCB2YWw9XCIxMDUwMDBcIi8+PGE6c2F0TW9kIHZhbD1cIjEwMzAwMFwiLz48YTp0aW50IHZhbD1cIjczMDAwXCIvPjwvYTpzY2hlbWVDbHI+PC9hOmdzPjxhOmdzIHBvcz1cIjEwMDAwMFwiPjxhOnNjaGVtZUNsciB2YWw9XCJwaENsclwiPjxhOmx1bU1vZCB2YWw9XCIxMDUwMDBcIi8+PGE6c2F0TW9kIHZhbD1cIjEwOTAwMFwiLz48YTp0aW50IHZhbD1cIjgxMDAwXCIvPjwvYTpzY2hlbWVDbHI+PC9hOmdzPjwvYTpnc0xzdD48YTpsaW4gYW5nPVwiNTQwMDAwMFwiIHNjYWxlZD1cIjBcIi8+PC9hOmdyYWRGaWxsPjxhOmdyYWRGaWxsIHJvdFdpdGhTaGFwZT1cIjFcIj48YTpnc0xzdD48YTpncyBwb3M9XCIwXCI+PGE6c2NoZW1lQ2xyIHZhbD1cInBoQ2xyXCI+PGE6c2F0TW9kIHZhbD1cIjEwMzAwMFwiLz48YTpsdW1Nb2QgdmFsPVwiMTAyMDAwXCIvPjxhOnRpbnQgdmFsPVwiOTQwMDBcIi8+PC9hOnNjaGVtZUNscj48L2E6Z3M+PGE6Z3MgcG9zPVwiNTAwMDBcIj48YTpzY2hlbWVDbHIgdmFsPVwicGhDbHJcIj48YTpzYXRNb2QgdmFsPVwiMTEwMDAwXCIvPjxhOmx1bU1vZCB2YWw9XCIxMDAwMDBcIi8+PGE6c2hhZGUgdmFsPVwiMTAwMDAwXCIvPjwvYTpzY2hlbWVDbHI+PC9hOmdzPjxhOmdzIHBvcz1cIjEwMDAwMFwiPjxhOnNjaGVtZUNsciB2YWw9XCJwaENsclwiPjxhOmx1bU1vZCB2YWw9XCI5OTAwMFwiLz48YTpzYXRNb2QgdmFsPVwiMTIwMDAwXCIvPjxhOnNoYWRlIHZhbD1cIjc4MDAwXCIvPjwvYTpzY2hlbWVDbHI+PC9hOmdzPjwvYTpnc0xzdD48YTpsaW4gYW5nPVwiNTQwMDAwMFwiIHNjYWxlZD1cIjBcIi8+PC9hOmdyYWRGaWxsPjwvYTpmaWxsU3R5bGVMc3Q+PGE6bG5TdHlsZUxzdD48YTpsbiB3PVwiNjM1MFwiIGNhcD1cImZsYXRcIiBjbXBkPVwic25nXCIgYWxnbj1cImN0clwiPjxhOnNvbGlkRmlsbD48YTpzY2hlbWVDbHIgdmFsPVwicGhDbHJcIi8+PC9hOnNvbGlkRmlsbD48YTpwcnN0RGFzaCB2YWw9XCJzb2xpZFwiLz48YTptaXRlciBsaW09XCI4MDAwMDBcIi8+PC9hOmxuPjxhOmxuIHc9XCIxMjcwMFwiIGNhcD1cImZsYXRcIiBjbXBkPVwic25nXCIgYWxnbj1cImN0clwiPjxhOnNvbGlkRmlsbD48YTpzY2hlbWVDbHIgdmFsPVwicGhDbHJcIi8+PC9hOnNvbGlkRmlsbD48YTpwcnN0RGFzaCB2YWw9XCJzb2xpZFwiLz48YTptaXRlciBsaW09XCI4MDAwMDBcIi8+PC9hOmxuPjxhOmxuIHc9XCIxOTA1MFwiIGNhcD1cImZsYXRcIiBjbXBkPVwic25nXCIgYWxnbj1cImN0clwiPjxhOnNvbGlkRmlsbD48YTpzY2hlbWVDbHIgdmFsPVwicGhDbHJcIi8+PC9hOnNvbGlkRmlsbD48YTpwcnN0RGFzaCB2YWw9XCJzb2xpZFwiLz48YTptaXRlciBsaW09XCI4MDAwMDBcIi8+PC9hOmxuPjwvYTpsblN0eWxlTHN0PjxhOmVmZmVjdFN0eWxlTHN0PjxhOmVmZmVjdFN0eWxlPjxhOmVmZmVjdExzdC8+PC9hOmVmZmVjdFN0eWxlPjxhOmVmZmVjdFN0eWxlPjxhOmVmZmVjdExzdC8+PC9hOmVmZmVjdFN0eWxlPjxhOmVmZmVjdFN0eWxlPjxhOmVmZmVjdExzdD48YTpvdXRlclNoZHcgYmx1clJhZD1cIjU3MTUwXCIgZGlzdD1cIjE5MDUwXCIgZGlyPVwiNTQwMDAwMFwiIGFsZ249XCJjdHJcIiByb3RXaXRoU2hhcGU9XCIwXCI+PGE6c3JnYkNsciB2YWw9XCIwMDAwMDBcIj48YTphbHBoYSB2YWw9XCI2MzAwMFwiLz48L2E6c3JnYkNscj48L2E6b3V0ZXJTaGR3PjwvYTplZmZlY3RMc3Q+PC9hOmVmZmVjdFN0eWxlPjwvYTplZmZlY3RTdHlsZUxzdD48YTpiZ0ZpbGxTdHlsZUxzdD48YTpzb2xpZEZpbGw+PGE6c2NoZW1lQ2xyIHZhbD1cInBoQ2xyXCIvPjwvYTpzb2xpZEZpbGw+PGE6c29saWRGaWxsPjxhOnNjaGVtZUNsciB2YWw9XCJwaENsclwiPjxhOnRpbnQgdmFsPVwiOTUwMDBcIi8+PGE6c2F0TW9kIHZhbD1cIjE3MDAwMFwiLz48L2E6c2NoZW1lQ2xyPjwvYTpzb2xpZEZpbGw+PGE6Z3JhZEZpbGwgcm90V2l0aFNoYXBlPVwiMVwiPjxhOmdzTHN0PjxhOmdzIHBvcz1cIjBcIj48YTpzY2hlbWVDbHIgdmFsPVwicGhDbHJcIj48YTp0aW50IHZhbD1cIjkzMDAwXCIvPjxhOnNhdE1vZCB2YWw9XCIxNTAwMDBcIi8+PGE6c2hhZGUgdmFsPVwiOTgwMDBcIi8+PGE6bHVtTW9kIHZhbD1cIjEwMjAwMFwiLz48L2E6c2NoZW1lQ2xyPjwvYTpncz48YTpncyBwb3M9XCI1MDAwMFwiPjxhOnNjaGVtZUNsciB2YWw9XCJwaENsclwiPjxhOnRpbnQgdmFsPVwiOTgwMDBcIi8+PGE6c2F0TW9kIHZhbD1cIjEzMDAwMFwiLz48YTpzaGFkZSB2YWw9XCI5MDAwMFwiLz48YTpsdW1Nb2QgdmFsPVwiMTAzMDAwXCIvPjwvYTpzY2hlbWVDbHI+PC9hOmdzPjxhOmdzIHBvcz1cIjEwMDAwMFwiPjxhOnNjaGVtZUNsciB2YWw9XCJwaENsclwiPjxhOnNoYWRlIHZhbD1cIjYzMDAwXCIvPjxhOnNhdE1vZCB2YWw9XCIxMjAwMDBcIi8+PC9hOnNjaGVtZUNscj48L2E6Z3M+PC9hOmdzTHN0PjxhOmxpbiBhbmc9XCI1NDAwMDAwXCIgc2NhbGVkPVwiMFwiLz48L2E6Z3JhZEZpbGw+PC9hOmJnRmlsbFN0eWxlTHN0PjwvYTpmbXRTY2hlbWU+PC9hOnRoZW1lRWxlbWVudHM+PGE6b2JqZWN0RGVmYXVsdHMvPjxhOmV4dHJhQ2xyU2NoZW1lTHN0Lz48YTpleHRMc3Q+PGE6ZXh0IHVyaT1cInswNUE0QzI1Qy0wODVFLTQzNDAtODVBMy1BNTUzMUU1MTBEQjJ9XCI+PHRobTE1OnRoZW1lRmFtaWx5IHhtbG5zOnRobTE1PVwiaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9vZmZpY2UvdGhlbWVtbC8yMDEyL21haW5cIiBuYW1lPVwiT2ZmaWNlIFRoZW1lXCIgaWQ9XCJ7NjJGOTM5QjYtOTNBRi00REI4LTlDNkItRDZDN0RGREM1ODlGfVwiIHZpZD1cIns0QTNDNDZFOC02MUNDLTQ2MDMtQTU4OS03NDIyQTQ3QThFNEF9XCIvPjwvYTpleHQ+PC9hOmV4dExzdD48L2E6dGhlbWU+JztcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldFN0eWxlcyhoYXNOb25TdHJpbmdWYWx1ZXM6IGJvb2xlYW4pOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBhZGRpdGlvbmFsQ2VsbFhGID0gJzx4ZiBudW1GbXRJZD1cIjBcIiBmb250SWQ9XCIwXCIgZmlsbElkPVwiMFwiIGJvcmRlcklkPVwiMFwiIHhmSWQ9XCIwXCIgYXBwbHlOdW1iZXJGb3JtYXQ9XCIxXCIvPic7XG4gICAgICAgIGNvbnN0IGNlbGxYRkNvdW50ID0gaGFzTm9uU3RyaW5nVmFsdWVzID8gMiA6IDE7XG4gICAgICAgIHJldHVybiBFeGNlbFN0cmluZ3MuWE1MX1NUUklORyArICc8c3R5bGVTaGVldCB4bWxucz1cImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9zcHJlYWRzaGVldG1sLzIwMDYvbWFpblwiIHhtbG5zOm1jPVwiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL21hcmt1cC1jb21wYXRpYmlsaXR5LzIwMDZcIiBtYzpJZ25vcmFibGU9XCJ4MTRhYyB4MTZyMlwiIHhtbG5zOngxNGFjPVwiaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9vZmZpY2Uvc3ByZWFkc2hlZXRtbC8yMDA5LzkvYWNcIiB4bWxuczp4MTZyMj1cImh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vb2ZmaWNlL3NwcmVhZHNoZWV0bWwvMjAxNS8wMi9tYWluXCI+PGZvbnRzIGNvdW50PVwiMVwiIHgxNGFjOmtub3duRm9udHM9XCIxXCI+PGZvbnQ+PHN6IHZhbD1cIjExXCIvPjxjb2xvciB0aGVtZT1cIjFcIi8+PG5hbWUgdmFsPVwiQ2FsaWJyaVwiLz48ZmFtaWx5IHZhbD1cIjJcIi8+PHNjaGVtZSB2YWw9XCJtaW5vclwiLz48L2ZvbnQ+PC9mb250cz48ZmlsbHMgY291bnQ9XCIyXCI+PGZpbGw+PHBhdHRlcm5GaWxsIHBhdHRlcm5UeXBlPVwibm9uZVwiLz48L2ZpbGw+PGZpbGw+PHBhdHRlcm5GaWxsIHBhdHRlcm5UeXBlPVwiZ3JheTEyNVwiLz48L2ZpbGw+PC9maWxscz48Ym9yZGVycyBjb3VudD1cIjFcIj48Ym9yZGVyPjxsZWZ0Lz48cmlnaHQvPjx0b3AvPjxib3R0b20vPjxkaWFnb25hbC8+PC9ib3JkZXI+PC9ib3JkZXJzPjxjZWxsU3R5bGVYZnMgY291bnQ9XCIxXCI+PHhmIG51bUZtdElkPVwiMFwiIGZvbnRJZD1cIjBcIiBmaWxsSWQ9XCIwXCIgYm9yZGVySWQ9XCIwXCIvPjwvY2VsbFN0eWxlWGZzPjxjZWxsWGZzIGNvdW50PVwiJyArIGNlbGxYRkNvdW50ICsgJ1wiPjx4ZiBudW1GbXRJZD1cIjBcIiBmb250SWQ9XCIwXCIgZmlsbElkPVwiMFwiIGJvcmRlcklkPVwiMFwiIHhmSWQ9XCIwXCIvPicgKyBhZGRpdGlvbmFsQ2VsbFhGICsgJzwvY2VsbFhmcz48Y2VsbFN0eWxlcyBjb3VudD1cIjFcIj48Y2VsbFN0eWxlIG5hbWU9XCJOb3JtYWxcIiB4ZklkPVwiMFwiIGJ1aWx0aW5JZD1cIjBcIi8+PC9jZWxsU3R5bGVzPjxkeGZzIGNvdW50PVwiMFwiLz48dGFibGVTdHlsZXMgY291bnQ9XCIwXCIgZGVmYXVsdFRhYmxlU3R5bGU9XCJUYWJsZVN0eWxlTWVkaXVtMlwiIGRlZmF1bHRQaXZvdFN0eWxlPVwiUGl2b3RTdHlsZUxpZ2h0MTZcIi8+PGV4dExzdD48ZXh0IHVyaT1cIntFQjc5REVGMi04MEI4LTQzZTUtOTVCRC01NENCRERGOTAyMEN9XCIgeG1sbnM6eDE0PVwiaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9vZmZpY2Uvc3ByZWFkc2hlZXRtbC8yMDA5LzkvbWFpblwiPjx4MTQ6c2xpY2VyU3R5bGVzIGRlZmF1bHRTbGljZXJTdHlsZT1cIlNsaWNlclN0eWxlTGlnaHQxXCIvPjwvZXh0PjxleHQgdXJpPVwiezkyNjBBNTEwLUYzMDEtNDZhOC04NjM1LUY1MTJENjRCRTVGNX1cIiB4bWxuczp4MTU9XCJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL29mZmljZS9zcHJlYWRzaGVldG1sLzIwMTAvMTEvbWFpblwiPjx4MTU6dGltZWxpbmVTdHlsZXMgZGVmYXVsdFRpbWVsaW5lU3R5bGU9XCJUaW1lU2xpY2VyU3R5bGVMaWdodDFcIi8+PC9leHQ+PC9leHRMc3Q+PC9zdHlsZVNoZWV0Pic7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXRXb3JrYm9vaygpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gRXhjZWxTdHJpbmdzLlhNTF9TVFJJTkcgKyAnPHdvcmtib29rIHhtbG5zPVwiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3NwcmVhZHNoZWV0bWwvMjAwNi9tYWluXCIgeG1sbnM6cj1cImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9vZmZpY2VEb2N1bWVudC8yMDA2L3JlbGF0aW9uc2hpcHNcIiB4bWxuczptYz1cImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9tYXJrdXAtY29tcGF0aWJpbGl0eS8yMDA2XCIgbWM6SWdub3JhYmxlPVwieDE1XCIgeG1sbnM6eDE1PVwiaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9vZmZpY2Uvc3ByZWFkc2hlZXRtbC8yMDEwLzExL21haW5cIj48ZmlsZVZlcnNpb24gYXBwTmFtZT1cInhsXCIgbGFzdEVkaXRlZD1cIjZcIiBsb3dlc3RFZGl0ZWQ9XCI2XCIgcnVwQnVpbGQ9XCIxNDQyMFwiLz48d29ya2Jvb2tQciBmaWx0ZXJQcml2YWN5PVwiMVwiIGRlZmF1bHRUaGVtZVZlcnNpb249XCIxNjQwMTFcIi8+PGJvb2tWaWV3cz48d29ya2Jvb2tWaWV3IHhXaW5kb3c9XCIwXCIgeVdpbmRvdz1cIjBcIiB3aW5kb3dXaWR0aD1cIjIyMjYwXCIgd2luZG93SGVpZ2h0PVwiMTI2NDVcIi8+PC9ib29rVmlld3M+PHNoZWV0cz48c2hlZXQgbmFtZT1cIlNoZWV0MVwiIHNoZWV0SWQ9XCIxXCIgcjppZD1cInJJZDFcIi8+PC9zaGVldHM+PGNhbGNQciBjYWxjSWQ9XCIxNjI5MTNcIi8+PGV4dExzdD48ZXh0IHVyaT1cInsxNDBBNzA5NC0wRTM1LTQ4OTItODQzMi1DNEQyRTU3RURFQjV9XCIgeG1sbnM6eDE1PVwiaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9vZmZpY2Uvc3ByZWFkc2hlZXRtbC8yMDEwLzExL21haW5cIj48eDE1Ondvcmtib29rUHIgY2hhcnRUcmFja2luZ1JlZkJhc2U9XCIxXCIvPjwvZXh0PjwvZXh0THN0Pjwvd29ya2Jvb2s+JztcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldFdvcmtzaGVldFJlbHMoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIEV4Y2VsU3RyaW5ncy5YTUxfU1RSSU5HICsgYDxSZWxhdGlvbnNoaXBzIHhtbG5zPVwiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3BhY2thZ2UvMjAwNi9yZWxhdGlvbnNoaXBzXCI+PFJlbGF0aW9uc2hpcCBJZD1cInJJZDFcIiBUeXBlPVwiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL29mZmljZURvY3VtZW50LzIwMDYvcmVsYXRpb25zaGlwcy90YWJsZVwiIFRhcmdldD1cIi4uL3RhYmxlcy90YWJsZTEueG1sXCIvPjwvUmVsYXRpb25zaGlwcz5gO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0V29ya2Jvb2tSZWxzKGhhc1NoYXJlZFN0cmluZ3MpOiBzdHJpbmcge1xuICAgICAgICBsZXQgcmV0VmFsID0gRXhjZWxTdHJpbmdzLlhNTF9TVFJJTkcgKyAnPFJlbGF0aW9uc2hpcHMgeG1sbnM9XCJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvcGFja2FnZS8yMDA2L3JlbGF0aW9uc2hpcHNcIj48UmVsYXRpb25zaGlwIElkPVwicklkM1wiIFR5cGU9XCJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzL3N0eWxlc1wiIFRhcmdldD1cInN0eWxlcy54bWxcIi8+PFJlbGF0aW9uc2hpcCBJZD1cInJJZDJcIiBUeXBlPVwiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL29mZmljZURvY3VtZW50LzIwMDYvcmVsYXRpb25zaGlwcy90aGVtZVwiIFRhcmdldD1cInRoZW1lL3RoZW1lMS54bWxcIi8+PFJlbGF0aW9uc2hpcCBJZD1cInJJZDFcIiBUeXBlPVwiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL29mZmljZURvY3VtZW50LzIwMDYvcmVsYXRpb25zaGlwcy93b3Jrc2hlZXRcIiBUYXJnZXQ9XCJ3b3Jrc2hlZXRzL3NoZWV0MS54bWxcIi8+JztcblxuICAgICAgICBpZiAoaGFzU2hhcmVkU3RyaW5ncykge1xuICAgICAgICAgICAgcmV0VmFsICs9IEV4Y2VsU3RyaW5ncy5TSEFSRURfU1RSSU5HX1JFTEFUSU9OU0hJUDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldFZhbCArPSAnPC9SZWxhdGlvbnNoaXBzPic7XG5cbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldFNoZWV0WE1MKGRpbWVuc2lvbjogc3RyaW5nLCBmcmVlemVQYW5lOiBzdHJpbmcsIGNvbHM6IHN0cmluZywgc2hlZXREYXRhOiBzdHJpbmcsIGhhc1RhYmxlOiBib29sZWFuLCBoYXNHcm91cGVkUm93cyA9IGZhbHNlLCBvdXRsaW5lTGV2ZWwgPSAwKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgdGFibGVQYXJ0cyA9IGhhc1RhYmxlID8gJzx0YWJsZVBhcnRzIGNvdW50PVwiMVwiPjx0YWJsZVBhcnQgcjppZD1cInJJZDFcIi8+PC90YWJsZVBhcnRzPicgOiAnJztcbiAgICAgICAgY29uc3Qgc2hlZXRPdXRsaW5lUHJvcCA9IGhhc0dyb3VwZWRSb3dzID8gJzxzaGVldFByPjxvdXRsaW5lUHIgc3VtbWFyeUJlbG93PVwiMFwiLz48L3NoZWV0UHI+JyA6ICcnO1xuICAgICAgICBjb25zdCBzT3V0bGluZUxldmVsID0gb3V0bGluZUxldmVsID4gMCA/IGBvdXRsaW5lTGV2ZWxSb3c9XCIke291dGxpbmVMZXZlbH1cImAgOiAnJztcbiAgICAgICAgLy8gcmV0dXJuIEV4Y2VsU3RyaW5ncy5YTUxfU1RSSU5HICtcbiAgICAgICAgLy8gICAgICc8d29ya3NoZWV0IHhtbG5zPVwiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3NwcmVhZHNoZWV0bWwvMjAwNi9tYWluXCIgeG1sbnM6cj1cImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9vZmZpY2VEb2N1bWVudC8yMDA2L3JlbGF0aW9uc2hpcHNcIiB4bWxuczptYz1cImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9tYXJrdXAtY29tcGF0aWJpbGl0eS8yMDA2XCIgbWM6SWdub3JhYmxlPVwieDE0YWNcIiB4bWxuczp4MTRhYz1cImh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vb2ZmaWNlL3NwcmVhZHNoZWV0bWwvMjAwOS85L2FjXCI+PGRpbWVuc2lvbiByZWY9XCInICsgZGltZW5zaW9uICsgJ1wiLz48c2hlZXRWaWV3cz48c2hlZXRWaWV3IHRhYlNlbGVjdGVkPVwiMVwiIHdvcmtib29rVmlld0lkPVwiMFwiPicgKyBmcmVlemVQYW5lICsgJzwvc2hlZXRWaWV3Pjwvc2hlZXRWaWV3cz48c2hlZXRGb3JtYXRQciBkZWZhdWx0Um93SGVpZ2h0PVwiMTVcIiB4MTRhYzpkeURlc2NlbnQ9XCIwLjI1XCIvPicgKyBjb2xzICsgc2hlZXREYXRhICsgJzxwYWdlTWFyZ2lucyBsZWZ0PVwiMC43XCIgcmlnaHQ9XCIwLjdcIiB0b3A9XCIwLjc1XCIgYm90dG9tPVwiMC43NVwiIGhlYWRlcj1cIjAuM1wiIGZvb3Rlcj1cIjAuM1wiLz4nICsgdGFibGVQYXJ0cyArICc8L3dvcmtzaGVldD4nO1xuXG4gICAgICAgIHJldHVybiBgJHtFeGNlbFN0cmluZ3MuWE1MX1NUUklOR31cbjx3b3Jrc2hlZXQgeG1sbnM9XCJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvc3ByZWFkc2hlZXRtbC8yMDA2L21haW5cIiB4bWxuczpyPVwiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL29mZmljZURvY3VtZW50LzIwMDYvcmVsYXRpb25zaGlwc1wiIHhtbG5zOm1jPVwiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL21hcmt1cC1jb21wYXRpYmlsaXR5LzIwMDZcIiBtYzpJZ25vcmFibGU9XCJ4MTRhY1wiIHhtbG5zOngxNGFjPVwiaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9vZmZpY2Uvc3ByZWFkc2hlZXRtbC8yMDA5LzkvYWNcIj5cbiR7c2hlZXRPdXRsaW5lUHJvcH1cbjxkaW1lbnNpb24gcmVmPVwiJHtkaW1lbnNpb259XCIvPlxuPHNoZWV0Vmlld3M+PHNoZWV0VmlldyB0YWJTZWxlY3RlZD1cIjFcIiB3b3JrYm9va1ZpZXdJZD1cIjBcIj4ke2ZyZWV6ZVBhbmV9PC9zaGVldFZpZXc+PC9zaGVldFZpZXdzPlxuPHNoZWV0Rm9ybWF0UHIgZGVmYXVsdFJvd0hlaWdodD1cIjE1XCIgJHtzT3V0bGluZUxldmVsfSB4MTRhYzpkeURlc2NlbnQ9XCIwLjI1XCIvPlxuJHtjb2xzfVxuJHtzaGVldERhdGF9XG48cGFnZU1hcmdpbnMgbGVmdD1cIjAuN1wiIHJpZ2h0PVwiMC43XCIgdG9wPVwiMC43NVwiIGJvdHRvbT1cIjAuNzVcIiBoZWFkZXI9XCIwLjNcIiBmb290ZXI9XCIwLjNcIi8+XG4ke3RhYmxlUGFydHN9PC93b3Jrc2hlZXQ+YDtcblxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0U2hhcmVkU3RyaW5nWE1MKGNvdW50OiBudW1iZXIsIHVuaXF1ZUNvdW50OiBudW1iZXIsIHRhYmxlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gRXhjZWxTdHJpbmdzLlhNTF9TVFJJTkcgKyAnPHNzdCB4bWxucz1cImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9zcHJlYWRzaGVldG1sLzIwMDYvbWFpblwiIGNvdW50PVwiJyArIGNvdW50ICsgJ1wiIHVuaXF1ZUNvdW50PVwiJyArIHVuaXF1ZUNvdW50ICsgJ1wiPicgKyB0YWJsZSArICc8L3NzdD4nO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Q29udGVudFR5cGVzWE1MKGhhc1NoYXJlZFN0cmluZ3M6IGJvb2xlYW4sIGhhc1RhYmxlOiBib29sZWFuKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IGNvbnRlbnRUeXBlcyA9IEV4Y2VsU3RyaW5ncy5YTUxfU1RSSU5HICtcbiAgICAgICAgYDxUeXBlcyB4bWxucz1cImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9wYWNrYWdlLzIwMDYvY29udGVudC10eXBlc1xcXCI+XG4gICAgICAgICAgICA8RGVmYXVsdCBFeHRlbnNpb249XCJyZWxzXCIgQ29udGVudFR5cGU9XCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtcGFja2FnZS5yZWxhdGlvbnNoaXBzK3htbFwiLz5cbiAgICAgICAgICAgIDxEZWZhdWx0IEV4dGVuc2lvbj1cInhtbFwiIENvbnRlbnRUeXBlPVwiYXBwbGljYXRpb24veG1sXCIvPlxuICAgICAgICAgICAgPE92ZXJyaWRlIFBhcnROYW1lPVwiL3hsL3dvcmtib29rLnhtbFwiIENvbnRlbnRUeXBlPVwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwuc2hlZXQubWFpbit4bWxcIi8+XG4gICAgICAgICAgICA8T3ZlcnJpZGUgUGFydE5hbWU9XCIveGwvd29ya3NoZWV0cy9zaGVldDEueG1sXCIgQ29udGVudFR5cGU9XCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC53b3Jrc2hlZXQreG1sXCIvPlxuICAgICAgICAgICAgPE92ZXJyaWRlIFBhcnROYW1lPVwiL3hsL3RoZW1lL3RoZW1lMS54bWxcIiBDb250ZW50VHlwZT1cImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC50aGVtZSt4bWxcIi8+XG4gICAgICAgICAgICA8T3ZlcnJpZGUgUGFydE5hbWU9XCIveGwvc3R5bGVzLnhtbFwiIENvbnRlbnRUeXBlPVwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwuc3R5bGVzK3htbFwiLz5cbiAgICAgICAgICAgIDxPdmVycmlkZSBQYXJ0TmFtZT1cIi9kb2NQcm9wcy9jb3JlLnhtbFwiIENvbnRlbnRUeXBlPVwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLXBhY2thZ2UuY29yZS1wcm9wZXJ0aWVzK3htbFwiLz5cbiAgICAgICAgICAgIDxPdmVycmlkZSBQYXJ0TmFtZT1cIi9kb2NQcm9wcy9hcHAueG1sXCIgQ29udGVudFR5cGU9XCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuZXh0ZW5kZWQtcHJvcGVydGllcyt4bWxcIi8+YDtcblxuICAgICAgICBjb250ZW50VHlwZXMgKz0gaGFzU2hhcmVkU3RyaW5ncyA/XG4gICAgICAgIGBcdDxPdmVycmlkZSBQYXJ0TmFtZT1cIi94bC9zaGFyZWRTdHJpbmdzLnhtbFwiIENvbnRlbnRUeXBlPVwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwuc2hhcmVkU3RyaW5ncyt4bWxcIi8+YCA6ICcnO1xuXG4gICAgICAgIGNvbnRlbnRUeXBlcyArPSBoYXNUYWJsZSA/XG4gICAgICAgICAgICBgPE92ZXJyaWRlIFBhcnROYW1lPVwiL3hsL3RhYmxlcy90YWJsZTEueG1sXCIgQ29udGVudFR5cGU9XCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC50YWJsZSt4bWxcIi8+YCA6ICcnO1xuICAgICAgICBjb250ZW50VHlwZXMgKz0gYDwvVHlwZXM+YDtcblxuICAgICAgICByZXR1cm4gY29udGVudFR5cGVzO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0VGFibGVzWE1MKGRpbWVuc2lvbjogc3RyaW5nLCB0YWJsZUNvbHVtbnM6IHN0cmluZywgc29ydDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGAke0V4Y2VsU3RyaW5ncy5YTUxfU1RSSU5HfTx0YWJsZSB4bWxucz1cImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9zcHJlYWRzaGVldG1sLzIwMDYvbWFpblwiIGlkPVwiMVwiIG5hbWU9XCJUYWJsZTFcIiBkaXNwbGF5TmFtZT1cIlRhYmxlMVwiIHJlZj1cIiR7ZGltZW5zaW9ufVwiIHRvdGFsc1Jvd1Nob3duPVwiMFwiPlxuICAgIDxhdXRvRmlsdGVyIHJlZj1cIiR7ZGltZW5zaW9ufVwiLz4ke3NvcnR9JHt0YWJsZUNvbHVtbnN9PHRhYmxlU3R5bGVJbmZvIG5hbWU9XCJUYWJsZVN0eWxlTWVkaXVtMlwiIHNob3dGaXJzdENvbHVtbj1cIjBcIiBzaG93TGFzdENvbHVtbj1cIjBcIiBzaG93Um93U3RyaXBlcz1cIjFcIiBzaG93Q29sdW1uU3RyaXBlcz1cIjBcIi8+XG48L3RhYmxlPmA7XG4gICAgfVxuICAgIC8qIHRzbGludDplbmFibGUgbWF4LWxpbmUtbGVuZ3RoICovXG5cbiAgICBwdWJsaWMgc3RhdGljIGdldEV4Y2VsQ29sdW1uKGluZGV4OiBudW1iZXIpOiBzdHJpbmcge1xuICAgICAgICAvLyBSZXR1cm5zIHRoZSBleGNlbCBjb2x1bW4gbmFtZSBmb3IgZ2l2ZW4gMC1iYXNlZCBpbmRleFxuICAgICAgICAvLyBGb3IgZXhhbXBsZSAyNyBzaG91bGQgcmV0dXJuIFwiQUJcIlxuICAgICAgICBsZXQgcmV0dXJuU3RyaW5nID0gJyc7XG4gICAgICAgIHdoaWxlIChpbmRleCA+PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBjaGFyID0gaW5kZXggJSAyNjtcbiAgICAgICAgICAgIHJldHVyblN0cmluZyA9IFN0cmluZy5mcm9tQ2hhckNvZGUoNjUgKyBjaGFyKSArIHJldHVyblN0cmluZztcbiAgICAgICAgICAgIGluZGV4ID0gTWF0aC5mbG9vcihpbmRleCAvIDI2KSAtIDE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldHVyblN0cmluZztcbiAgICB9XG59XG4iXX0=