fantasy-ngzorro 2.2.19 → 2.2.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -3024,8 +3024,8 @@ var HdFormLinesComponent = /** @class */ (function () {
3024
3024
  HdFormLinesComponent.decorators = [
3025
3025
  { type: Component, args: [{
3026
3026
  selector: "hd-form-lines",
3027
- template: "<ng-container *ngIf=\"showForm && showToolbar\">\n <hd-button-group class=\"hd-formLines-toolbar\">\n <ng-template #buttonGroupLeft>\n <!-- \u6709\u5168\u5C40\u641C\u7D22\uFF1A\u5DE6\u4FA7\u653E\u641C\u7D22\u6846 -->\n <ng-container *ngIf=\"showSearch\">\n <nz-input-group [nzSuffix]=\"suffixIconSearch\">\n <input type=\"text\" nz-input (keyup.enter)=\"searchLines()\" placeholder=\"\u8BF7\u8F93\u5165\u5185\u5BB9\u641C\u7D22\" style=\"width: 300px;\"\n [(ngModel)]=\"filterStr\" />\n </nz-input-group>\n <ng-template #suffixIconSearch>\n <i nz-icon nzType=\"search\" (click)=\"searchLines()\"></i>\n </ng-template>\n </ng-container>\n <!-- \u65E0\u5168\u5C40\u641C\u7D22\uFF1A\u5DE6\u4FA7\u653E\u81EA\u5B9A\u4E49\u6309\u94AE -->\n <ng-container *ngIf=\"!showSearch\">\n <ng-container *ngTemplateOutlet=\"formLinesLeftButton\"></ng-container>\n </ng-container>\n </ng-template>\n <ng-template #buttonGroupRight>\n <!-- \u6709\u5168\u5C40\u641C\u7D22\uFF1A\u53F3\u4FA7\u8303\u56F4\u518D\u5DE6\u53F3\u5206\u5F00 -->\n <div class=\"hd-formLines-toolbar-right\" *ngIf=\"showSearch\">\n <div class=\"hd-formLines-toolbar-right-left\">\n <ng-container *ngTemplateOutlet=\"formLinesLeftButton\"></ng-container>\n </div>\n <div class=\"hd-formLines-toolbar-right-right\">\n <ng-container *ngTemplateOutlet=\"formLinesRightButton\"></ng-container>\n <ng-container *ngTemplateOutlet=\"colSettingsTpl\"></ng-container>\n </div>\n </div>\n <!-- \u65E0\u5168\u5C40\u641C\u7D22\uFF1A\u53F3\u4FA7\u53EA\u653E\u81EA\u5B9A\u4E49\u53F3\u4FA7\u6309\u94AE + \u5217\u8BBE\u7F6E -->\n <ng-container *ngIf=\"!showSearch\">\n <ng-container *ngTemplateOutlet=\"formLinesRightButton\"></ng-container>\n <ng-container *ngTemplateOutlet=\"colSettingsTpl\"></ng-container>\n </ng-container>\n </ng-template>\n </hd-button-group>\n <hd-space background=\"transparent\" type=\"row\" size=\"12\"></hd-space>\n</ng-container>\n\n<ng-template #colSettingsTpl>\n <ng-container *ngIf=\"showColSettingsButton\">\n <span class=\"hd-formLines-col-settings\" nz-dropdown nzTrigger=\"click\" [nzDropdownMenu]=\"colSettingsMenu\"\n [nzVisible]=\"isDropdownVisible\" (click)=\"confirmDropdown()\" title=\"\u5217\u8BBE\u7F6E\">\n <svg class=\"hd-formLines-col-settings-icon\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n d=\"M4.92031 1.80756C5.02551 1.42884 5.37033 1.16675 5.76339 1.16675H8.23667C8.62973 1.16675 8.97455 1.42884 9.07975 1.80756L9.37802 2.88133L10.4571 2.60273C10.8377 2.50448 11.2371 2.67206 11.4336 3.01245L12.6703 5.15438C12.8668 5.49478 12.8122 5.92445 12.5369 6.20491L11.7561 7.00008L12.5369 7.79525C12.8122 8.07572 12.8668 8.50539 12.6703 8.84579L11.4336 10.9877C11.2371 11.3281 10.8377 11.4957 10.4571 11.3974L9.37802 11.1188L9.07975 12.1926C8.97455 12.5713 8.62973 12.8334 8.23667 12.8334H5.76339C5.37033 12.8334 5.02551 12.5713 4.92031 12.1926L4.62206 11.1189L3.54315 11.3974C3.16258 11.4957 2.76318 11.3281 2.56666 10.9877L1.33001 8.84579C1.13349 8.50539 1.18806 8.07572 1.46343 7.79525L2.24419 7.00008L1.46344 6.20491C1.18806 5.92445 1.13349 5.49478 1.33002 5.15438L2.56666 3.01245C2.76319 2.67206 3.16258 2.50448 3.54316 2.60273L4.62206 2.88127L4.92031 1.80756ZM4.54541 10.843L4.54552 10.8433L4.54541 10.843ZM5.98508 2.33341L5.66952 3.46945C5.54185 3.92906 5.06958 4.20173 4.60771 4.08249L3.46618 3.78778L2.45122 5.54572L3.2773 6.38705C3.6115 6.72742 3.6115 7.27275 3.2773 7.61312L2.45122 8.45444L3.46617 10.2124L4.60771 9.91768C5.06958 9.79844 5.54185 10.0711 5.66952 10.5307L5.98508 11.6667H8.01498L8.33056 10.5307C8.45823 10.071 8.9305 9.79838 9.39237 9.91762L10.5341 10.2124L11.5491 8.45444L10.723 7.61312C10.3888 7.27275 10.3888 6.72742 10.723 6.38705L11.5491 5.54572L10.5341 3.78778L9.39237 4.08254C8.9305 4.20178 8.45823 3.92912 8.33056 3.46951L8.01498 2.33341H5.98508ZM7.00003 5.83342C6.3557 5.83342 5.83337 6.35575 5.83337 7.00008C5.83337 7.64441 6.3557 8.16675 7.00003 8.16675C7.64436 8.16675 8.1667 7.64441 8.1667 7.00008C8.1667 6.35575 7.64436 5.83342 7.00003 5.83342ZM4.6667 7.00008C4.6667 5.71142 5.71137 4.66675 7.00003 4.66675C8.2887 4.66675 9.33337 5.71142 9.33337 7.00008C9.33337 8.28875 8.2887 9.33342 7.00003 9.33342C5.71137 9.33342 4.6667 8.28875 4.6667 7.00008Z\"\n fill=\"currentColor\" />\n </svg>\n </span>\n <nz-dropdown-menu #colSettingsMenu=\"nzDropdownMenu\">\n <div class=\"hd-formLines-col-settings-dropdown\">\n <div class=\"hd-formLines-col-settings-list\">\n <div *ngIf=\"showListNodes && nowListNodes.length > 0\" nz-menu style=\"padding: 5px 10px;\">\n <nz-tree *ngIf=\"showListNodes\" [nzData]=\"nowListNodes\" nzCheckable nzBlockNode nzShowExpand=\"false\"\n (nzCheckBoxChange)=\"checkAction($event)\">\n </nz-tree>\n </div>\n <div *ngIf=\"showListNodes && hideListNodes.length > 0\" nz-menu style=\"padding: 5px 10px;\">\n <nz-tree *ngIf=\"showListNodes\" [nzData]=\"hideListNodes\" nzCheckable nzShowExpand=\"false\"\n (nzCheckBoxChange)=\"checkAction($event)\">\n </nz-tree>\n </div>\n </div>\n <div class=\"hd-formLines-col-settings-footer\">\n <hd-button style=\"margin-right: 4px;\" type=\"default\" size=\"small\" (clickAction)=\"cancelDropdown()\">\u53D6\u6D88\n </hd-button>\n <hd-button type=\"primary\" size=\"small\" (clickAction)=\"submitGrids()\">\u5B8C\u6210</hd-button>\n </div>\n </div>\n </nz-dropdown-menu>\n </ng-container>\n</ng-template>\n\n<!-- <hd-button type=\"primary\" (clickAction)=\"focusDom(0, 0)\">\u805A\u7126\u7B2C\u4E00\u4E2A</hd-button> -->\n\n<ng-container *ngIf=\"showForm\">\n <ng-container *ngTemplateOutlet=\"tableTotal\"></ng-container>\n <hd-space *ngIf=\"tableTotal\" background=\"transparent\" type=\"row\" size=\"12\"></hd-space>\n</ng-container>\n\n<form *ngIf=\"showForm\" nz-form [formGroup]=\"validateHdFormLines\" class=\"ant-advanced-search-form hd-formLines-container\"\n (keydown)=\"onKeyDown($event)\">\n <nz-table nzTemplateMode [nzFrontPagination]=\"false\" [nzLoading]=\"tableLoading\" [nzScroll]=\"scroll\">\n <thead>\n <tr>\n <th nzWidth=\"40px\" nzLeft=\"0px\" *ngIf=\"showCheckbox\">\n <label nz-checkbox\n [ngModel]=\"isAllChecked()\"\n [nzIndeterminate]=\"isIndeterminate()\"\n [ngModelOptions]=\"{standalone: true}\"\n (ngModelChange)=\"onAllChecked($event)\"></label>\n </th>\n <th nzWidth=\"58px\" [nzLeft]=\"lineNumberLeft\" *ngIf=\"showLineNumber\">\u5E8F\u53F7</th>\n <ng-container *ngFor=\"let item of formLines\">\n <th *ngIf=\"isColumnVisible(item)\" [nzAlign]=\"item.align ? item.align : 'left'\">\n <span *ngIf=\"item.require\" style=\"color: red;\">*</span>{{ item.label }}\n </th>\n </ng-container>\n <th [style.width.px]=\"operateColWidth\" nzRight=\"0\">\u64CD\u4F5C</th>\n </tr>\n </thead>\n <tbody>\n <ng-container\n *ngFor=\"let line of linesFormArray.controls.slice((paginationPageIndex - 1) * paginationPageSize, (paginationPageIndex - 1) * paginationPageSize + paginationPageSize);index as dataIndex\"\n formArrayName=\"lines\">\n <tr [formGroup]=\"line\">\n <td nzWidth=\"40px\" nzLeft=\"0px\" *ngIf=\"showCheckbox\">\n <label nz-checkbox\n [ngModel]=\"isLineChecked(line)\"\n [ngModelOptions]=\"{standalone: true}\"\n (ngModelChange)=\"onLineCheckedChange(line, $event)\"></label>\n </td>\n <td nzWidth=\"58px\" [nzLeft]=\"lineNumberLeft\" *ngIf=\"showLineNumber\">\n {{ line.get('lineIndex').value }}\n </td>\n <ng-container *ngFor=\"let formItem of formLines; index as innerIndex\">\n <td *ngIf=\"isColumnVisible(formItem)\" [nzAlign]=\"formItem.align ? formItem.align : 'left'\">\n <nz-form-item>\n <nz-form-control\n [nzValidateStatus]=\"getControlValidateStatus(line, formItem)\"\n [nzErrorTip]=\"formItem.label + '\u4E0D\u80FD\u4E3A\u7A7A'\">\n <ng-container [ngSwitch]=\"formItem.type\">\n <ng-container *ngSwitchCase=\"'Input'\">\n <nz-input-group [nzSuffix]=\"inputCleanTemplate\"\n (focusin)=\"setActiveDomInFormLines(dataIndex , innerIndex)\">\n <input #formInputDom (click)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n [ngStyle]=\"getStyle(line, formItem, '100px')\" nz-input\n [ngStyle]=\"{'color': formItem?.colorOption?.name ? line.get(formItem.colorOption.name ).value : null}\"\n [id]=\"'input-' + formItem.name + line.get('lineIndex').value\"\n (click)=\"formItem.isSelect ? selectValue('#input-' + formItem.name + line.get('lineIndex').value, dataIndex , innerIndex) : null\"\n (input)=\"limitInputLength($event, line, formItem)\"\n [placeholder]=\"formItem.placeholder ? formItem.placeholder : '\u8BF7\u8F93\u5165' + formItem.label\"\n [formControlName]=\"formItem.name\" />\n </nz-input-group>\n <ng-template #inputCleanTemplate>\n <i nz-icon nz-tooltip class=\"ant-input-clear-icon\" nzTheme=\"fill\" nzType=\"close-circle\"\n *ngIf=\"line.get(formItem.name).value && !line.get(formItem.name).disabled\"\n (click)=\"inputClean(formItem ,line)\"></i>\n </ng-template>\n </ng-container>\n <ng-container *ngSwitchCase=\"'Select'\">\n <nz-select #formInputDom (focusin)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n nzDropdownClassName=\"hd-select-table\"\n *ngIf=\"formItem.selectOption.tableColumns;else nomarlSelectTemplate\"\n [nzShowSearch]=\"formItem.selectOption.hdShowSearch != null ? formItem.selectOption.hdShowSearch : true\"\n [nzAllowClear]=\"formItem.selectOption.hdAllowClear != null ? formItem.selectOption.hdAllowClear : true\"\n [nzServerSearch]=\"formItem.selectOption.hdServerSearch || false\"\n [nzDropdownMatchSelectWidth]=\"formItem.selectOption.hdDropdownMatchSelectWidth ? formItem.selectOption.hdDropdownMatchSelectWidth : false\"\n [nzPlaceHolder]=\"formItem.placeholder ? formItem.placeholder : '\u8BF7\u9009\u62E9' + formItem.label\"\n [formControlName]=\"formItem.name\"\n (nzOpenChange)=\"onOpenChangeEvent(formItem.onOpenChangeEvent || null, $event, line, formItem.onOpenChangeEventDebounceTime, formItem)\"\n (nzOnSearch)=\"onSearchEvent(formItem.onSearchEvent || null, $event, line, formItem.onSearchEventEventDebounceTime)\"\n [ngStyle]=\"getStyle(line, formItem, '200px')\">\n <div class=\"hd-select-empty\"\n *ngIf=\"!(formItem.selectOption?.selectList?.length > 0 || line.get(formItem.selectOption.selectListName)?.value?.length > 0)\">\n <img\n src=\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNjRweCIgaGVpZ2h0PSI0MXB4IiB2aWV3Qm94PSIwIDAgNjQgNDEiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDUyLjUgKDY3NDY5KSAtIGh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaCAtLT4KICAgIDxnIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC00NzIuMDAwMDAwLCAtMTMzNS4wMDAwMDApIj4KICAgICAgICAgICAgPGcgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDY0LjAwMDAwMCwgMTExNC4wMDAwMDApIj4KICAgICAgICAgICAgICAgIDxnICB0cmFuc2Zvcm09InRyYW5zbGF0ZSg0MC4wMDAwMDAsIDc4LjAwMDAwMCkiPgogICAgICAgICAgICAgICAgICAgIDxnICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgzNjguMDAwMDAwLCAxNDQuMDAwMDAwKSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxnID4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbGxpcHNlICBmaWxsPSIjRjVGNUY1IiBjeD0iMzIiIGN5PSIzMyIgcng9IjMyIiByeT0iNyI+PC9lbGxpcHNlPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGcgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSg5LjAwMDAwMCwgMC4wMDAwMDApIiBmaWxsLXJ1bGU9Im5vbnplcm8iIHN0cm9rZT0iI0Q5RDlEOSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTQ2LDEyLjc2MDU2MDQgTDM1Ljg1NDMwNDcsMS4yNTczOTYzMyBDMzUuMzY3NDQxNCwwLjQ3MzgyNjYwNSAzNC42NTU4Nzg5LDAgMzMuOTA2NzYxNywwIEwxMi4wOTMyMzgzLDAgQzExLjM0NDEyMTEsMCAxMC42MzI1NTg2LDAuNDczOTUwMjU1IDEwLjE0NTY5NTMsMS4yNTczOTYzMyBMMi42MTQ3OTcyN2UtMTIsMTIuNzYwNTYwNCBMMCwyMiBMNDYsMjIgTDQ2LDEyLjc2MDU2MDQgWiIgID48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTMyLjYxMzI4MTMsMTUuOTMxNSBDMzIuNjEzMjgxMywxNC4zMjU4NTExIDMzLjYwNjk1MzEsMTMuMDAwMjM0IDM0LjgzOTY5OTIsMTMgTDQ2LDEzIEw0NiwzMS4xMzcxMjc3IEM0NiwzMy4yNTg5NTc0IDQ0LjY3OTM4NjcsMzUgNDMuMDUwNDI5NywzNSBMMi45NDk1NzAzMSwzNSBDMS4zMjA1MjM0NCwzNSAwLDMzLjI1ODg0MDQgMCwzMS4xMzcxMjc3IEwwLDEzIEwxMS4xNjAzMDA4LDEzIEMxMi4zOTMwNDY5LDEzIDEzLjM4NjcxODgsMTQuMzIyODA4NSAxMy4zODY3MTg4LDE1LjkyODQ1NzQgTDEzLjM4NjcxODgsMTUuOTQ5NjM4MyBDMTMuMzg2NzE4OCwxNy41NTUyODcyIDE0LjM5MTcxMDksMTguODUxMTgwOSAxNS42MjQ0NTcsMTguODUxMTgwOSBMMzAuMzc1NTQzLDE4Ljg1MTE4MDkgQzMxLjYwODI4OTEsMTguODUxMTgwOSAzMi42MTMyODEzLDE3LjU0MzM1MTEgMzIuNjEzMjgxMywxNS45Mzc3MDIxIEwzMi42MTMyODEzLDE1LjkzMTUgWiIgIGZpbGw9IiNGQUZBRkEiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZz4KICAgICAgICAgICAgICAgICAgICAgICAgPC9nPgogICAgICAgICAgICAgICAgICAgIDwvZz4KICAgICAgICAgICAgICAgIDwvZz4KICAgICAgICAgICAgPC9nPgogICAgICAgIDwvZz4KICAgIDwvZz4KPC9zdmc+\"\n alt=\"empty\">\n <p class=\"ant-empty-description\">\u6682\u65E0\u6570\u636E</p>\n </div>\n\n <nz-option nzCustomContent\n *ngFor=\"let selectItem of (formItem.selectOption.selectList || line.get(formItem.selectOption.selectListName).value)\"\n [nzValue]=\"selectItem[formItem.selectOption.value]\" [nzLabel]=\"formItem.selectOption.showLabelAndValue ? '['+ selectItem[formItem.selectOption.value] +']' +\n selectItem[formItem.selectOption.label] : selectItem[formItem.selectOption.label]\">\n <div class=\"hd-option-line\">\n <div *ngFor=\"let selectOptionTableColumn of formItem.selectOption.tableColumns\"\n [ngStyle]=\"getSelectTableColumnStyle(selectOptionTableColumn)\">\n <ng-container *ngIf=\"selectOptionTableColumn.icons;else notPictureTemplate\">\n <div class=\"hd-option-icons\">\n <ng-container *ngFor=\"let icon of selectOptionTableColumn.icons\">\n <img *ngIf=\"icon.iconName === 'hd-recommend-star' && selectItem[icon.fieldName]\"\n src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAVpJREFUOE+l07FLQkEcB/Dv7713Zg1GQ0SgW9AmTYVp1BRUokZBEI1u/QVBUBD1D0Rt0dQaPYmotXza1tKQzQ1Fk0iDHr5vPEOTUpO88e77+9zvjjtBh8HTOb8e0hu0eN8Xzz22ikonoGzHdgXcAVB16S75U/mbn/m2AK+mglqbBUAGvCIRuVCJ7HLXQCUTPQOxXi8Q4FolnYWuAH0+HaEpjrdxAyC3VSq33xKgPTWiYYUai8IjUCabw4Zw1XWNF2+OZrXoi+cLImBth4odfQAw0elCW6zdKvU2/wVkYs8ggzBlRqrcI/DrrK1wQ7DWAIToV8lsqGxHDwTY6qYbA1jpCVAux3oBSirhDPYCOL6kE/s/QB77UrnNJoDDVkCN6pI+BJH+6xINQdpKOCf1d/AEYBxgUUQC5PcLbPMDXy1lhGXx7r0G6ExklpBwI0xh2w7ID+UzL71iL/MJdzuZdDL/kXcAAAAASUVORK5CYII=\"\n style=\"width: 16px;height: 16px;\">\n <img *ngIf=\"icon.iconName === 'hd-img-star' && selectItem[icon.fieldName]\"\n src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAyhJREFUWEe1ll1o1XYYxp8nPUmUihdCV3bAirvYzUC80Xpy3KwTZNR2CdOhDkTBwe6G32XzwqpjE3Qt4pUKZQqDyQZNTp1uY8yCJG0F2d2+LlWOOkShovQkaV45lcJpTdOTHJubBPI+z/Pj//H+/0TGR66uf8sPoz8A/Kstkp38YORxFitmEVU1vm1cBPlp9ZuQXtX0jmfxygQgvxSWBRWlDECvhgrwQFuqLufG4TAtRCaAwCl+IcDXtWEi2KFb7pUFBxCBEpSMMsDWGWEiNzXLe2/BASp2cTuJH+KCRMJ3dGvsrzQQqafAtw0XpBEfIhc00/tswQD8QWM1FP45d4A8V9XJN9k5Nl4vRKoR8G3jMshdyebRPs0cOftaAaRUbAsRrRRRhuczFsF/lPATNQrL3Hr7/nz1lGvvtkwGUSEC8gLkWfMGkAfQMp9J0n8ByhS5J+QDVr+BshBlUu6q3d5v9G3jIcg3GgnJqp2C853iCIB1WU0a1F2iOO2tPnK3CLQ1aJZKLpCfddPrmtoF8uuqZn9iyfcEzVQumYtlQDO9vS8PsprHd4xvAR7I7FuHUIBvdNP9crr0lT7g24U+UNlfh1f6Esrn2ofeuVphbCPyneJuAN+lT0jokZCduum9cobM2Qn9krEGEa6+hi36jEC3aro34vASW3FoG9si8sdGRoKCY6rlnpjLIxGgYhunSPY0AiAiP+mW93EmAN8ujoJobwgAuKOb7orUAHKjY1EwHjwFkGsEoKpVJ6WVH3n/p1oDwVBhk0TK742GV/UKYOZMt5QKoGIbX5E8mgwg4wCbADQn1c1uPvP2gWqB7xjDADck7OwBVan0QFFyQaj2A9wxV60A13XT7Uw1Ar5TlDiBQP6hRHs0a3Ss9n8wuK4jYtN5Em/H6B5ppht7r4jvhEOFtYiUGQEAnhDoV033ZNJwB45xRAS9IBfX1qnhRD7uhhQLENiFQ0Ll9LSBCM7olnu43gUpTjEfiPSB3D6tUQRbcpZ7bbZHLEBYKnRFogxV505rmjzIrtG/6w2fMS0l430RHAVoULBZtdybdQFkCcuqSXUtzxqSpHsBfmUdgJhaiDQAAAAASUVORK5CYII=\"\n style=\"width: 16px;height: 16px;\">\n <span *ngIf=\"icon.iconName === 'hd-select-close' && selectItem[icon.fieldName]\"\n class=\"hd-select-close\">\n \u7981\u7528\n </span>\n <span *ngIf=\"icon.iconName === 'hd-select-purchase' && selectItem[icon.fieldName]\"\n class=\"hd-select-purchase\">\n \u534F\n </span>\n </ng-container>\n </div>\n </ng-container>\n <ng-template #notPictureTemplate>\n <ng-container\n *ngIf=\"!isTextOverflow(selectOptionTableColumn.render ? selectOptionTableColumn.render(selectItem) : selectItem[selectOptionTableColumn.name], selectOptionTableColumn.width);else overflowTemplate\">\n <div>{{\n judgeColEmpty(selectOptionTableColumn.render ?\n selectOptionTableColumn.render(selectItem) :\n selectItem[selectOptionTableColumn.name])\n }}\n </div>\n </ng-container>\n <ng-template #overflowTemplate>\n <div class=\"hd-option-overflow\" nz-tooltip\n [nzTooltipTitle]=\"selectOptionTableColumn.render ? selectOptionTableColumn.render(selectItem) : selectItem[selectOptionTableColumn.name]\">\n {{\n judgeColEmpty(selectOptionTableColumn.render ?\n selectOptionTableColumn.render(selectItem) :\n selectItem[selectOptionTableColumn.name])\n }}\n </div>\n </ng-template>\n </ng-template>\n </div>\n </div>\n </nz-option>\n <nz-option\n *ngIf=\"formItem.selectOption.label && line.get(formItem.name) && line.get(formItem.selectOption.label)?.value && line.get(formItem.selectOption.value)?.value\"\n [nzLabel]=\"(formItem.selectOption.showLabelAndValue || formItem.selectOption.value === 'code' || formItem.selectOption.value === 'productCode' || formItem.selectOption.hdShowItemCode) ? ('['+ line.get(formItem.selectOption.value).value + ']' + line.get(formItem.selectOption.label).value) : line.get(formItem.selectOption.label).value\"\n [nzValue]=\"line.get(formItem.selectOption.value).value\" nzHide></nz-option>\n </nz-select>\n <ng-template #nomarlSelectTemplate>\n <nz-select #formInputDom (focusin)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n [nzShowSearch]=\"formItem.selectOption.hdShowSearch != null ? formItem.selectOption.hdShowSearch : true\"\n [nzAllowClear]=\"formItem.selectOption.hdAllowClear != null ? formItem.selectOption.hdAllowClear : true\"\n [nzServerSearch]=\"formItem.selectOption.hdServerSearch || false\"\n [nzDropdownMatchSelectWidth]=\"formItem.selectOption.hdDropdownMatchSelectWidth ? formItem.selectOption.hdDropdownMatchSelectWidth : false\"\n [nzPlaceHolder]=\"formItem.placeholder ? formItem.placeholder : '\u8BF7\u9009\u62E9' + formItem.label\"\n [formControlName]=\"formItem.name\"\n (nzOpenChange)=\"onOpenChangeEvent(formItem.onOpenChangeEvent || null, $event, line, formItem.onOpenChangeEventDebounceTime, formItem)\"\n (nzOnSearch)=\"onSearchEvent(formItem.onSearchEvent || null, $event, line, formItem.onSearchEventEventDebounceTime)\"\n [ngStyle]=\"getStyle(line, formItem, '200px')\">\n <nz-option\n *ngFor=\"let selectItem of (formItem.selectOption.selectList || line.get(formItem.selectOption.selectListName).value)\"\n [nzValue]=\"selectItem[formItem.selectOption.value]\" [nzLabel]=\"formItem.selectOption.showLabelAndValue ? '['+ selectItem[formItem.selectOption.value] +']' +\n selectItem[formItem.selectOption.label] : selectItem[formItem.selectOption.label]\">\n </nz-option>\n <nz-option\n *ngIf=\"formItem.selectOption.label && line.get(formItem.name) && line.get(formItem.selectOption.label)?.value && line.get(formItem.selectOption.value)?.value\"\n [nzLabel]=\"(formItem.selectOption.showLabelAndValue || formItem.selectOption.value === 'code' || formItem.selectOption.value === 'productCode' || formItem.selectOption.hdShowItemCode) ? ('['+ line.get(formItem.selectOption.value).value + ']' + line.get(formItem.selectOption.label).value) : line.get(formItem.selectOption.label).value\"\n [nzValue]=\"line.get(formItem.selectOption.value).value\" nzHide></nz-option>\n </nz-select>\n </ng-template>\n\n </ng-container>\n <ng-container *ngSwitchCase=\"'Date'\">\n <nz-date-picker #formInputDom (click)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n (focusin)=\"setActiveDomInFormLines(dataIndex , innerIndex)\" *ngIf=\"formItem.showTime\"\n [ngStyle]=\"getStyle(line, formItem, '150px')\"\n [nzPlaceHolder]=\"formItem.placeholder ? formItem.placeholder : '\u8BF7\u9009\u62E9' + formItem.label\"\n [formControlName]=\"formItem.name\" [nzDisabledDate]=\"formItem.hdDisabledDate\"\n [nzShowToday]=\"formItem.hdShowToday !== false\" nzShowTime\n nzFormat=\"yyyy-MM-dd HH:mm:ss\">\n </nz-date-picker>\n <nz-date-picker #formInputDom *ngIf=\"!formItem.showTime\"\n [ngStyle]=\"getStyle(line, formItem, '150px')\"\n (click)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n (focusin)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n [nzPlaceHolder]=\"formItem.placeholder ? formItem.placeholder : '\u8BF7\u9009\u62E9' + formItem.label\"\n [formControlName]=\"formItem.name\" [nzDisabledDate]=\"formItem.hdDisabledDate\"\n [nzShowToday]=\"formItem.hdShowToday !== false\">\n </nz-date-picker>\n <div *ngIf=\"formItem?.explainOptionRight?.show\"\n [style.color]=\"formItem?.explainOptionRight?.color ? formItem.explainOptionRight.color : null\">\n &nbsp;&nbsp;{{ line.get(formItem.explainOptionRight.name).value }}\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'DateRange'\">\n <nz-range-picker #formInputDom [ngStyle]=\"getStyle(line, formItem, '200px')\"\n (click)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n (focusin)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n [nzDisabledDate]=\"formItem.hdDisabledDate\" [nzPlaceHolder]=\"['\u5F00\u59CB\u65E5\u671F','\u7ED3\u675F\u65E5\u671F']\"\n [formControlName]=\"formItem.name\">\n </nz-range-picker>\n </ng-container>\n <ng-container *ngSwitchCase=\"'TextArea'\">\n <textarea #formInputDom (click)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n (focusin)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n [ngStyle]=\"{'color': formItem?.colorOption?.name ? line.get(formItem.colorOption.name).value : null}\"\n [placeholder]=\"formItem.placeholder ? formItem.placeholder : '\u8BF7\u8F93\u5165' + formItem.label\"\n [maxlength]=\"formItem.maxLength || null\" rows=\"4\" nz-input\n [maxlength]=\"formItem.maxLength || null\" [formControlName]=\"formItem.name\"></textarea>\n </ng-container>\n <ng-container *ngSwitchCase=\"'InputNumber'\">\n <div style=\"display: flex;align-items: center;\"\n (focusin)=\"setActiveDomInFormLines(dataIndex , innerIndex)\">\n <nz-input-number #formInputDom [ngStyle]=\"getStyle(line, formItem, '100px')\"\n [maxlength]=\"formItem.maxLength || null\" [formControlName]=\"formItem.name\"\n [nzMin]=\"formItem?.inputNumber?.min || 0\" [nzMax]=\"formItem?.inputNumber?.max || 99999999\"\n [nzStep]=\"formItem?.inputNumber?.step || 1\"\n [nzPrecision]=\"formItem?.inputNumber?.precision != null ? formItem.inputNumber.precision : 2\"\n [nzPlaceHolder]=\"formItem.placeholder ? formItem.placeholder : '\u8BF7\u8F93\u5165' + formItem.label\"\n [nzId]=\"'inputNumber-' + formItem.name + line.get('lineIndex').value\"\n (click)=\"formItem.isSelect ? selectValue('#inputNumber-' + formItem.name + line.get('lineIndex').value, dataIndex , innerIndex) : setActiveDomInFormLines(dataIndex , innerIndex)\">\n </nz-input-number>\n <div *ngIf=\"formItem?.explainOptionRight?.show\"\n [style.color]=\"formItem?.explainOptionRight?.color ? formItem.explainOptionRight.color : null\">\n &nbsp;&nbsp;{{ line.get(formItem.explainOptionRight.name).value }}\n </div>\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'MultipleSelect'\">\n <nz-select #formInputDom (click)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n (focusin)=\"setActiveDomInFormLines(dataIndex , innerIndex)\" nzMode=\"multiple\"\n [nzServerSearch]=\"formItem.selectOption.hdServerSearch || false\"\n [nzDropdownMatchSelectWidth]=\"formItem.selectOption.hdDropdownMatchSelectWidth ? formItem.selectOption.hdDropdownMatchSelectWidth : false\"\n [nzShowSearch]=\"formItem.selectOption.hdShowSearch != null ? formItem.selectOption.hdShowSearch : true\"\n [nzAllowClear]=\"formItem.selectOption.hdAllowClear != null ? formItem.selectOption.hdAllowClear : true\"\n [nzPlaceHolder]=\"formItem.placeholder ? formItem.placeholder : '\u8BF7\u9009\u62E9' + formItem.label\"\n [formControlName]=\"formItem.name\" [ngStyle]=\"getStyle(line, formItem, '200px')\"\n (nzOpenChange)=\"onOpenChangeEvent(formItem.onOpenChangeEvent || null, $event, line, formItem.onOpenChangeEventDebounceTime, formItem)\"\n (nzOnSearch)=\"onSearchEvent(formItem.onSearchEvent || null, $event, line, formItem.onSearchEventEventDebounceTime)\">\n <nz-option *ngFor=\"let selectItem of formItem.selectOption.selectList\"\n [nzValue]=\"selectItem[formItem.selectOption.value]\" [nzLabel]=\"formItem.selectOption.showLabelAndValue ? '['+ selectItem[formItem.selectOption.value] +']' +\n selectItem[formItem.selectOption.label] : selectItem[formItem.selectOption.label]\"></nz-option>\n <ng-container\n *ngIf=\"formItem.selectOption.label && line.get(formItem.name) && line.get(formItem.selectOption.label)?.value && line.get(formItem.selectOption.value)?.value\">\n <nz-option *ngFor=\"let option of line.get(formItem.selectOption.value).value;index as i\"\n [nzLabel]=\"line.get(formItem.selectOption.label).value[i]\" [nzValue]=\"option\" nzHide>\n </nz-option>\n </ng-container>\n </nz-select>\n </ng-container>\n <ng-container *ngSwitchCase=\"'ViewDom'\">\n <span class=\"hd-formLines-viewDom\" *ngIf=\"!formItem?.hideViewDomValue\">\n {{\n (formItem.preserveNumber && line.get(formItem.name).value) ?\n LodashRound(line.get(formItem.name).value,\n formItem.preserveNumber).toFixed(formItem.preserveNumber)\n : line.get(formItem.name).value\n }}\n </span>\n <ng-container\n *ngTemplateOutlet=\"ViewDomRightTemplate;context:{formItem: formItem, formLine: line}\"></ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'Switch'\">\n <nz-switch (click)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n [formControlName]=\"formItem.name\"></nz-switch>\n </ng-container>\n <ng-container *ngSwitchCase=\"'Time'\">\n <nz-time-picker #formInputDom [ngStyle]=\"getStyle(line, formItem, '200px')\"\n (click)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n (focusin)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n [formControlName]=\"formItem.name\"></nz-time-picker>\n </ng-container>\n </ng-container>\n </nz-form-control>\n </nz-form-item>\n <div *ngIf=\"formItem?.explainOption?.show\"\n [style.color]=\"formItem?.explainOption?.color ? formItem.explainOption.color : null\">\n {{ line.get(formItem.explainOption.name).value }}\n </div>\n </td>\n </ng-container>\n <td [style.width.px]=\"operateColWidth\" nzRight=\"0\">\n <span class=\"common-btn-group\">\n <a *ngIf=\"operateButtons.includes('add')\" (click)=\"addFormLine(line)\">\u6DFB\u52A0</a>\n <a *ngIf=\"operateButtons.includes('copy')\" (click)=\"copyFormLine(line)\">\u590D\u5236</a>\n <a class=\"common-danger-btn\" *ngIf=\"operateButtons.includes('delete') && !showDeleteConfirm\"\n (click)=\"deleteFormLine(line)\">\u5220\u9664</a>\n <a class=\"common-danger-btn\" *ngIf=\"operateButtons.includes('delete') && showDeleteConfirm\" nz-popconfirm\n nzPopconfirmTitle=\"\u786E\u8BA4\u8981\u5220\u9664\u8BE5\u884C\u5417?\" nzPopconfirmPlacement=\"bottom\"\n (nzOnConfirm)=\"deleteFormLine(line)\">\u5220\u9664</a>\n </span>\n </td>\n </tr>\n </ng-container>\n <!-- \u5408\u8BA1\u533A\u57DF -->\n <tr *ngIf=\"showTotal\" class=\"hd-table-total\">\n <td *ngIf=\"showCheckbox\"></td>\n <td>\u5408\u8BA1</td>\n <ng-container *ngFor=\"let totalOption of totalOptionList\">\n <td [nzAlign]=\"totalOption.align ? totalOption.align : 'left'\">{{\n (totalOption.value || totalOption.value ===\n 0) ? (((totalOption.value % 1 === 0) && !totalOption.showDecimal) ? totalOption.value :\n LodashRound(totalOption.value, totalOption.preserveNumber).toFixed(totalOption.preserveNumber)) : ''\n }}\n </td>\n </ng-container>\n </tr>\n </tbody>\n </nz-table>\n <nz-list\n *ngIf=\"linesFormArray.controls.slice((paginationPageIndex - 1) * paginationPageSize, (paginationPageIndex - 1) * paginationPageSize + paginationPageSize).length === 0\"\n [nzDataSource]=\"[]\"></nz-list>\n <ng-container>\n <hd-space background=\"transparent\" type=\"row\" size=\"16\"></hd-space>\n <div class=\"hd-formLines-pagination\">\n <div class=\"hd-formLines-pagination-left\">\n <div *ngIf=\"showKeyboardOperateTip\">\u652F\u6301\u952E\u76D8\u64CD\u4F5C\uFF0C\u4F7F\u7528\n <i nz-icon nzType=\"up-circle\" nzTheme=\"outline\" style=\"font-size: 16px;margin-left: 4px;\"></i>\n <i nz-icon nzType=\"down-circle\" nzTheme=\"outline\" style=\"font-size: 16px;margin-left: 4px;\"></i>\n <i nz-icon nzType=\"left-circle\" nzTheme=\"outline\" style=\"font-size: 16px;margin-left: 4px;\"></i>\n <i nz-icon nzType=\"right-circle\" nzTheme=\"outline\" style=\"font-size: 16px;margin-left: 4px;\"></i>\n <span style=\"font-size: 14px;margin-left: 4px;font-weight: bolder;\">Enter</span>\n \u952E\u5207\u6362\u8868\u5355\u9879\n </div>\n </div>\n <nz-pagination [nzSize]=\"'small'\" style=\"text-align: right;\" [nzPageIndex]=\"paginationPageIndex\"\n [nzPageSize]=\"paginationPageSize\" [nzPageSizeOptions]=\"[10, 20, 30, 40, 50]\"\n [nzTotal]=\"linesFormArray.controls.length\" nzShowSizeChanger (nzPageIndexChange)=\"pageIndexChange($event)\"\n (nzPageSizeChange)=\"pageSizeChange($event)\" [nzShowTotal]=\"totalTemplate\"></nz-pagination>\n <ng-template #totalTemplate let-total>\u5171 {{ linesFormArray.controls.length }} \u6761\u6570\u636E</ng-template>\n </div>\n\n </ng-container>\n</form>\n",
3028
- styles: ["::ng-deep .common-btn-group>a{font-size:14px;font-weight:400;color:#20b95d!important;white-space:nowrap}::ng-deep .common-btn-group .common-danger-btn:hover{color:#f05b24!important}::ng-deep .common-btn-group>a:hover{color:#20bd62!important}::ng-deep .common-btn-group>a:not(:last-child)::after{content:'';margin:0 2px}::ng-deep .common-billNumber>a{color:#3b77e3}button{box-shadow:unset;text-shadow:unset}::ng-deep .ant-form-item-label>label{color:#4b504e;font-size:14px}::ng-deep .ant-input-number-input{height:32px}::ng-deep .ant-input-number{height:32px}textarea.ant-input{height:auto;min-height:32px}::ng-deep .ant-select-selection--multiple{min-height:32px}::ng-deep .ant-select-selection--multiple .ant-select-selection__rendered>ul>li.ant-select-search--inline:only-child{margin-left:4px}::ng-deep .ant-select-selection__rendered>ul>li{height:26px!important;margin-top:3px!important;line-height:26px!important}::ng-deep .ant-advanced-search-form .ant-form-item{margin-bottom:0!important}::ng-deep .ant-select-selection--single{height:32px!important}::ng-deep .ant-input{height:32px}::ng-deep .ant-input[disabled]:hover{border-color:#d9d9d9!important}::ng-deep .ant-select-selection__rendered{line-height:32px!important}::ng-deep .ant-calendar-range-picker-input{text-align:left!important}::ng-deep .ant-calendar-picker{width:100%!important}::ng-deep .ant-row{margin-right:0!important;margin-left:0!important}::ng-deep .ant-col-6{padding-left:12px;padding-right:12px}::ng-deep .ant-col-12{padding-left:12px;padding-right:12px}::ng-deep .ant-col-18{padding-left:12px;padding-right:12px}::ng-deep .ant-col-24{padding-left:12px;padding-right:12px}::ng-deep .ant-alert-info{background-color:#f5f8f6;border:1px solid #cfe3d4}::ng-deep .hd-table-container .ant-table-td-left-sticky,::ng-deep .hd-table-container .ant-table-td-right-sticky,::ng-deep .hd-table-container .ant-table-th-left-sticky,::ng-deep .hd-table-container .ant-table-th-right-sticky{z-index:2;transform:translateZ(0)}::ng-deep .hd-table-container .ant-table-thead>tr>th.ant-table-th-left-sticky,::ng-deep .hd-table-container .ant-table-thead>tr>th.ant-table-th-right-sticky{background:#f5f8f6!important}::ng-deep .hd-table-container .ant-table-tbody>tr>td.ant-table-td-left-sticky,::ng-deep .hd-table-container .ant-table-tbody>tr>td.ant-table-td-right-sticky{background:#fff}::ng-deep .hd-table-container .ant-table-tbody>tr.ant-table-row-hover>td.ant-table-td-left-sticky,::ng-deep .hd-table-container .ant-table-tbody>tr.ant-table-row-hover>td.ant-table-td-right-sticky,::ng-deep .hd-table-container .ant-table-tbody>tr:hover>td.ant-table-td-left-sticky,::ng-deep .hd-table-container .ant-table-tbody>tr:hover>td.ant-table-td-right-sticky{background:#ecf8f1!important}::ng-deep .hd-table-container .ant-table-scroll-position-left .ant-table-td-right-sticky,::ng-deep .hd-table-container .ant-table-scroll-position-left .ant-table-th-right-sticky,::ng-deep .hd-table-container .ant-table-scroll-position-middle .ant-table-td-right-sticky,::ng-deep .hd-table-container .ant-table-scroll-position-middle .ant-table-th-right-sticky,::ng-deep .hd-table-container .ant-table-scroll-position-right .ant-table-td-right-sticky,::ng-deep .hd-table-container .ant-table-scroll-position-right .ant-table-th-right-sticky{box-shadow:none!important}::ng-deep .hd-table-container .ant-table-fixed-right{right:0!important}:host ::ng-deep th{background:#f5f8f6!important;font-weight:700!important;white-space:nowrap;font-size:14px;font-family:PingFangSC-Medium,PingFang SC;color:#2a3634;padding:8px!important;box-sizing:border-box}:host ::ng-deep td{font-weight:400;font-style:normal;font-size:14px;color:#2a3634;text-align:left;white-space:nowrap;padding:8px!important;box-sizing:border-box}::ng-deep .ant-pagination-options{display:inline-flex;align-items:center}::ng-deep .ant-pagination-options .ant-select,::ng-deep .ant-pagination-options .ant-select-selection--single{min-width:100px}::ng-deep .ant-pagination-options-size-changer.ant-select{min-width:100px}::ng-deep .ant-time-picker{width:100%}::ng-deep .cdk-overlay-pane .hd-cascader-menus.ant-cascader-menus>.ant-cascader-menu:only-child{width:-webkit-max-content!important;width:-moz-max-content!important;width:max-content!important;min-width:var(--hd-cascader-menu-min-width,auto);max-width:560px}::ng-deep .cdk-overlay-pane .hd-cascader-menus.ant-cascader-menus>.ant-cascader-menu:only-child .ant-cascader-menu-item{white-space:nowrap}.ant-input-number-disabled,.ant-input[disabled],.ant-select-disabled{color:#4b504e}.hd-formLines-toolbar{display:block}.hd-formLines-toolbar ::ng-deep .hd-button-group-right{flex:1;min-width:0;display:flex;justify-content:flex-end}.hd-formLines-toolbar-right{display:flex;align-items:center;justify-content:space-between;width:100%;margin-left:16px}.hd-formLines-toolbar-right-left,.hd-formLines-toolbar-right-right{display:flex;align-items:center}.hd-formLines-col-settings{display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;width:32px;height:32px;padding:0;margin-left:12px;cursor:pointer;color:#2a3634;background:0 0;border:1px solid #e5e6eb;border-radius:4px;vertical-align:middle;flex-shrink:0}.hd-formLines-col-settings:hover{color:#20b95d;background:#f5f8f6;border-color:#20b95d}.hd-formLines-col-settings .hd-formLines-col-settings-icon{display:block;width:14px;height:14px;flex-shrink:0}.hd-formLines-col-settings-dropdown{background:#fff;border:1px solid #e5e6eb;border-radius:4px;box-shadow:0 6px 16px rgba(0,0,0,.08),0 3px 6px rgba(0,0,0,.06);overflow:hidden}.hd-formLines-col-settings-list{max-height:400px;overflow-y:auto}.hd-formLines-col-settings-footer{text-align:right;background:#fff;padding:4px;border-top:1px solid #f0f0f0}.hd-formLines-container ::ng-deep td{padding:4px 8px!important}.hd-formLines-container .ant-table-tbody>tr>td,.hd-formLines-container ::ng-deep .ant-table-thead>tr>th{padding:16px 8px}.hd-formLines-container ::ng-deep .hd-table-total>td{border:0!important}.hd-formLines-container ::ng-deep .ant-form-item{margin-bottom:0}.hd-formLines-container .ant-input-number{width:100%}.hd-formLines-container .hd-formLines-viewDom{font-size:14px}::ng-deep .hd-select-table .ant-select-dropdown-menu-item-disabled{background:#f5f8f6!important;border-bottom:1px solid #e8e8e8;position:-webkit-sticky;position:sticky;top:0;z-index:10;padding:0}::ng-deep .hd-select-table .ant-select-dropdown-menu-item-disabled:hover{background:#f5f8f6!important}::ng-deep .hd-option-header{display:flex;align-items:center;color:rgba(0,0,0,.85);background:#f5f8f6}::ng-deep .hd-option-header-column{padding:5px 0}.hd-option-line{display:flex;align-items:center}.hd-option-overflow{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.hd-select-empty{display:flex;align-items:center;flex-direction:column;padding:20px 0;background:#fff}::ng-deep .ant-empty-small{background:#fff!important;padding:8px 0;margin:0}.hd-formLines-pagination{display:flex;align-items:center;justify-content:space-between}.hd-formLines-pagination .hd-formLines-pagination-left{margin-left:10px;display:flex;align-items:center}.hd-option-icons{display:flex;align-items:center}.hd-select-close{display:block;height:16px;line-height:14px;text-align:center;padding:0 4px;border:1px solid #f5222d;color:#f5222d;font-size:14px}.hd-select-purchase{display:block;height:16px;line-height:14px;text-align:center;padding:0 4px;border:1px solid #20bd62;color:#20bd62;font-size:14px}"]
3027
+ template: "<ng-container *ngIf=\"showForm && showToolbar\">\n <hd-button-group class=\"hd-formLines-toolbar\">\n <ng-template #buttonGroupLeft>\n <!-- \u641C\u7D22\u6846 + \u5DE6\u4FA7\u81EA\u5B9A\u4E49\u6309\u94AE\uFF08\u7D27\u6328\u641C\u7D22\u6846\u540E\uFF09 -->\n <ng-container *ngIf=\"showSearch\">\n <nz-input-group class=\"hd-lines-search\" [nzSuffix]=\"suffixIconSearch\">\n <input type=\"text\" nz-input (keyup.enter)=\"searchLines()\" placeholder=\"\u8BF7\u8F93\u5165\u5185\u5BB9\u641C\u7D22\"\n [(ngModel)]=\"filterStr\" />\n </nz-input-group>\n <ng-template #suffixIconSearch>\n <i nz-icon nzType=\"search\" (click)=\"searchLines()\"></i>\n </ng-template>\n </ng-container>\n <ng-container *ngTemplateOutlet=\"formLinesLeftButton\"></ng-container>\n </ng-template>\n <ng-template #buttonGroupRight>\n <ng-container *ngTemplateOutlet=\"formLinesRightButton\"></ng-container>\n <ng-container *ngTemplateOutlet=\"colSettingsTpl\"></ng-container>\n </ng-template>\n </hd-button-group>\n <hd-space background=\"transparent\" type=\"row\" size=\"12\"></hd-space>\n</ng-container>\n\n<ng-template #colSettingsTpl>\n <ng-container *ngIf=\"showColSettingsButton\">\n <span class=\"hd-formLines-col-settings\" nz-dropdown nzTrigger=\"click\" [nzDropdownMenu]=\"colSettingsMenu\"\n [nzVisible]=\"isDropdownVisible\" (click)=\"confirmDropdown()\" title=\"\u5217\u8BBE\u7F6E\">\n <svg class=\"hd-formLines-col-settings-icon\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n d=\"M4.92031 1.80756C5.02551 1.42884 5.37033 1.16675 5.76339 1.16675H8.23667C8.62973 1.16675 8.97455 1.42884 9.07975 1.80756L9.37802 2.88133L10.4571 2.60273C10.8377 2.50448 11.2371 2.67206 11.4336 3.01245L12.6703 5.15438C12.8668 5.49478 12.8122 5.92445 12.5369 6.20491L11.7561 7.00008L12.5369 7.79525C12.8122 8.07572 12.8668 8.50539 12.6703 8.84579L11.4336 10.9877C11.2371 11.3281 10.8377 11.4957 10.4571 11.3974L9.37802 11.1188L9.07975 12.1926C8.97455 12.5713 8.62973 12.8334 8.23667 12.8334H5.76339C5.37033 12.8334 5.02551 12.5713 4.92031 12.1926L4.62206 11.1189L3.54315 11.3974C3.16258 11.4957 2.76318 11.3281 2.56666 10.9877L1.33001 8.84579C1.13349 8.50539 1.18806 8.07572 1.46343 7.79525L2.24419 7.00008L1.46344 6.20491C1.18806 5.92445 1.13349 5.49478 1.33002 5.15438L2.56666 3.01245C2.76319 2.67206 3.16258 2.50448 3.54316 2.60273L4.62206 2.88127L4.92031 1.80756ZM4.54541 10.843L4.54552 10.8433L4.54541 10.843ZM5.98508 2.33341L5.66952 3.46945C5.54185 3.92906 5.06958 4.20173 4.60771 4.08249L3.46618 3.78778L2.45122 5.54572L3.2773 6.38705C3.6115 6.72742 3.6115 7.27275 3.2773 7.61312L2.45122 8.45444L3.46617 10.2124L4.60771 9.91768C5.06958 9.79844 5.54185 10.0711 5.66952 10.5307L5.98508 11.6667H8.01498L8.33056 10.5307C8.45823 10.071 8.9305 9.79838 9.39237 9.91762L10.5341 10.2124L11.5491 8.45444L10.723 7.61312C10.3888 7.27275 10.3888 6.72742 10.723 6.38705L11.5491 5.54572L10.5341 3.78778L9.39237 4.08254C8.9305 4.20178 8.45823 3.92912 8.33056 3.46951L8.01498 2.33341H5.98508ZM7.00003 5.83342C6.3557 5.83342 5.83337 6.35575 5.83337 7.00008C5.83337 7.64441 6.3557 8.16675 7.00003 8.16675C7.64436 8.16675 8.1667 7.64441 8.1667 7.00008C8.1667 6.35575 7.64436 5.83342 7.00003 5.83342ZM4.6667 7.00008C4.6667 5.71142 5.71137 4.66675 7.00003 4.66675C8.2887 4.66675 9.33337 5.71142 9.33337 7.00008C9.33337 8.28875 8.2887 9.33342 7.00003 9.33342C5.71137 9.33342 4.6667 8.28875 4.6667 7.00008Z\"\n fill=\"currentColor\" />\n </svg>\n </span>\n <nz-dropdown-menu #colSettingsMenu=\"nzDropdownMenu\">\n <div class=\"hd-formLines-col-settings-dropdown\">\n <div class=\"hd-formLines-col-settings-list\">\n <div *ngIf=\"showListNodes && nowListNodes.length > 0\" nz-menu style=\"padding: 5px 10px;\">\n <nz-tree *ngIf=\"showListNodes\" [nzData]=\"nowListNodes\" nzCheckable nzBlockNode nzShowExpand=\"false\"\n (nzCheckBoxChange)=\"checkAction($event)\">\n </nz-tree>\n </div>\n <div *ngIf=\"showListNodes && hideListNodes.length > 0\" nz-menu style=\"padding: 5px 10px;\">\n <nz-tree *ngIf=\"showListNodes\" [nzData]=\"hideListNodes\" nzCheckable nzShowExpand=\"false\"\n (nzCheckBoxChange)=\"checkAction($event)\">\n </nz-tree>\n </div>\n </div>\n <div class=\"hd-formLines-col-settings-footer\">\n <hd-button style=\"margin-right: 4px;\" type=\"default\" size=\"small\" (clickAction)=\"cancelDropdown()\">\u53D6\u6D88\n </hd-button>\n <hd-button type=\"primary\" size=\"small\" (clickAction)=\"submitGrids()\">\u5B8C\u6210</hd-button>\n </div>\n </div>\n </nz-dropdown-menu>\n </ng-container>\n</ng-template>\n\n<!-- <hd-button type=\"primary\" (clickAction)=\"focusDom(0, 0)\">\u805A\u7126\u7B2C\u4E00\u4E2A</hd-button> -->\n\n<ng-container *ngIf=\"showForm\">\n <ng-container *ngTemplateOutlet=\"tableTotal\"></ng-container>\n <hd-space *ngIf=\"tableTotal\" background=\"transparent\" type=\"row\" size=\"12\"></hd-space>\n</ng-container>\n\n<form *ngIf=\"showForm\" nz-form [formGroup]=\"validateHdFormLines\" class=\"ant-advanced-search-form hd-formLines-container\"\n (keydown)=\"onKeyDown($event)\">\n <nz-table nzTemplateMode [nzFrontPagination]=\"false\" [nzLoading]=\"tableLoading\" [nzScroll]=\"scroll\">\n <thead>\n <tr>\n <th nzWidth=\"40px\" nzLeft=\"0px\" *ngIf=\"showCheckbox\">\n <label nz-checkbox\n [ngModel]=\"isAllChecked()\"\n [nzIndeterminate]=\"isIndeterminate()\"\n [ngModelOptions]=\"{standalone: true}\"\n (ngModelChange)=\"onAllChecked($event)\"></label>\n </th>\n <th nzWidth=\"58px\" [nzLeft]=\"lineNumberLeft\" *ngIf=\"showLineNumber\">\u5E8F\u53F7</th>\n <ng-container *ngFor=\"let item of formLines\">\n <th *ngIf=\"isColumnVisible(item)\" [nzAlign]=\"item.align ? item.align : 'left'\">\n <span *ngIf=\"item.require\" style=\"color: red;\">*</span>{{ item.label }}\n </th>\n </ng-container>\n <th [style.width.px]=\"operateColWidth\" nzRight=\"0\">\u64CD\u4F5C</th>\n </tr>\n </thead>\n <tbody>\n <ng-container\n *ngFor=\"let line of linesFormArray.controls.slice((paginationPageIndex - 1) * paginationPageSize, (paginationPageIndex - 1) * paginationPageSize + paginationPageSize);index as dataIndex\"\n formArrayName=\"lines\">\n <tr [formGroup]=\"line\">\n <td nzWidth=\"40px\" nzLeft=\"0px\" *ngIf=\"showCheckbox\">\n <label nz-checkbox\n [ngModel]=\"isLineChecked(line)\"\n [ngModelOptions]=\"{standalone: true}\"\n (ngModelChange)=\"onLineCheckedChange(line, $event)\"></label>\n </td>\n <td nzWidth=\"58px\" [nzLeft]=\"lineNumberLeft\" *ngIf=\"showLineNumber\">\n {{ line.get('lineIndex').value }}\n </td>\n <ng-container *ngFor=\"let formItem of formLines; index as innerIndex\">\n <td *ngIf=\"isColumnVisible(formItem)\" [nzAlign]=\"formItem.align ? formItem.align : 'left'\">\n <nz-form-item>\n <nz-form-control\n [nzValidateStatus]=\"getControlValidateStatus(line, formItem)\"\n [nzErrorTip]=\"formItem.label + '\u4E0D\u80FD\u4E3A\u7A7A'\">\n <ng-container [ngSwitch]=\"formItem.type\">\n <ng-container *ngSwitchCase=\"'Input'\">\n <nz-input-group [nzSuffix]=\"inputCleanTemplate\"\n (focusin)=\"setActiveDomInFormLines(dataIndex , innerIndex)\">\n <input #formInputDom (click)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n [ngStyle]=\"getStyle(line, formItem, '100px')\" nz-input\n [ngStyle]=\"{'color': formItem?.colorOption?.name ? line.get(formItem.colorOption.name ).value : null}\"\n [id]=\"'input-' + formItem.name + line.get('lineIndex').value\"\n (click)=\"formItem.isSelect ? selectValue('#input-' + formItem.name + line.get('lineIndex').value, dataIndex , innerIndex) : null\"\n (input)=\"limitInputLength($event, line, formItem)\"\n [placeholder]=\"formItem.placeholder ? formItem.placeholder : '\u8BF7\u8F93\u5165' + formItem.label\"\n [formControlName]=\"formItem.name\" />\n </nz-input-group>\n <ng-template #inputCleanTemplate>\n <i nz-icon nz-tooltip class=\"ant-input-clear-icon\" nzTheme=\"fill\" nzType=\"close-circle\"\n *ngIf=\"line.get(formItem.name).value && !line.get(formItem.name).disabled\"\n (click)=\"inputClean(formItem ,line)\"></i>\n </ng-template>\n </ng-container>\n <ng-container *ngSwitchCase=\"'Select'\">\n <nz-select #formInputDom (focusin)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n nzDropdownClassName=\"hd-select-table\"\n *ngIf=\"formItem.selectOption.tableColumns;else nomarlSelectTemplate\"\n [nzShowSearch]=\"formItem.selectOption.hdShowSearch != null ? formItem.selectOption.hdShowSearch : true\"\n [nzAllowClear]=\"formItem.selectOption.hdAllowClear != null ? formItem.selectOption.hdAllowClear : true\"\n [nzServerSearch]=\"formItem.selectOption.hdServerSearch || false\"\n [nzDropdownMatchSelectWidth]=\"formItem.selectOption.hdDropdownMatchSelectWidth ? formItem.selectOption.hdDropdownMatchSelectWidth : false\"\n [nzPlaceHolder]=\"formItem.placeholder ? formItem.placeholder : '\u8BF7\u9009\u62E9' + formItem.label\"\n [formControlName]=\"formItem.name\"\n (nzOpenChange)=\"onOpenChangeEvent(formItem.onOpenChangeEvent || null, $event, line, formItem.onOpenChangeEventDebounceTime, formItem)\"\n (nzOnSearch)=\"onSearchEvent(formItem.onSearchEvent || null, $event, line, formItem.onSearchEventEventDebounceTime)\"\n [ngStyle]=\"getStyle(line, formItem, '200px')\">\n <div class=\"hd-select-empty\"\n *ngIf=\"!(formItem.selectOption?.selectList?.length > 0 || line.get(formItem.selectOption.selectListName)?.value?.length > 0)\">\n <img\n src=\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNjRweCIgaGVpZ2h0PSI0MXB4IiB2aWV3Qm94PSIwIDAgNjQgNDEiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDUyLjUgKDY3NDY5KSAtIGh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaCAtLT4KICAgIDxnIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC00NzIuMDAwMDAwLCAtMTMzNS4wMDAwMDApIj4KICAgICAgICAgICAgPGcgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDY0LjAwMDAwMCwgMTExNC4wMDAwMDApIj4KICAgICAgICAgICAgICAgIDxnICB0cmFuc2Zvcm09InRyYW5zbGF0ZSg0MC4wMDAwMDAsIDc4LjAwMDAwMCkiPgogICAgICAgICAgICAgICAgICAgIDxnICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgzNjguMDAwMDAwLCAxNDQuMDAwMDAwKSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxnID4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbGxpcHNlICBmaWxsPSIjRjVGNUY1IiBjeD0iMzIiIGN5PSIzMyIgcng9IjMyIiByeT0iNyI+PC9lbGxpcHNlPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGcgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSg5LjAwMDAwMCwgMC4wMDAwMDApIiBmaWxsLXJ1bGU9Im5vbnplcm8iIHN0cm9rZT0iI0Q5RDlEOSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTQ2LDEyLjc2MDU2MDQgTDM1Ljg1NDMwNDcsMS4yNTczOTYzMyBDMzUuMzY3NDQxNCwwLjQ3MzgyNjYwNSAzNC42NTU4Nzg5LDAgMzMuOTA2NzYxNywwIEwxMi4wOTMyMzgzLDAgQzExLjM0NDEyMTEsMCAxMC42MzI1NTg2LDAuNDczOTUwMjU1IDEwLjE0NTY5NTMsMS4yNTczOTYzMyBMMi42MTQ3OTcyN2UtMTIsMTIuNzYwNTYwNCBMMCwyMiBMNDYsMjIgTDQ2LDEyLjc2MDU2MDQgWiIgID48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTMyLjYxMzI4MTMsMTUuOTMxNSBDMzIuNjEzMjgxMywxNC4zMjU4NTExIDMzLjYwNjk1MzEsMTMuMDAwMjM0IDM0LjgzOTY5OTIsMTMgTDQ2LDEzIEw0NiwzMS4xMzcxMjc3IEM0NiwzMy4yNTg5NTc0IDQ0LjY3OTM4NjcsMzUgNDMuMDUwNDI5NywzNSBMMi45NDk1NzAzMSwzNSBDMS4zMjA1MjM0NCwzNSAwLDMzLjI1ODg0MDQgMCwzMS4xMzcxMjc3IEwwLDEzIEwxMS4xNjAzMDA4LDEzIEMxMi4zOTMwNDY5LDEzIDEzLjM4NjcxODgsMTQuMzIyODA4NSAxMy4zODY3MTg4LDE1LjkyODQ1NzQgTDEzLjM4NjcxODgsMTUuOTQ5NjM4MyBDMTMuMzg2NzE4OCwxNy41NTUyODcyIDE0LjM5MTcxMDksMTguODUxMTgwOSAxNS42MjQ0NTcsMTguODUxMTgwOSBMMzAuMzc1NTQzLDE4Ljg1MTE4MDkgQzMxLjYwODI4OTEsMTguODUxMTgwOSAzMi42MTMyODEzLDE3LjU0MzM1MTEgMzIuNjEzMjgxMywxNS45Mzc3MDIxIEwzMi42MTMyODEzLDE1LjkzMTUgWiIgIGZpbGw9IiNGQUZBRkEiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZz4KICAgICAgICAgICAgICAgICAgICAgICAgPC9nPgogICAgICAgICAgICAgICAgICAgIDwvZz4KICAgICAgICAgICAgICAgIDwvZz4KICAgICAgICAgICAgPC9nPgogICAgICAgIDwvZz4KICAgIDwvZz4KPC9zdmc+\"\n alt=\"empty\">\n <p class=\"ant-empty-description\">\u6682\u65E0\u6570\u636E</p>\n </div>\n\n <nz-option nzCustomContent\n *ngFor=\"let selectItem of (formItem.selectOption.selectList || line.get(formItem.selectOption.selectListName).value)\"\n [nzValue]=\"selectItem[formItem.selectOption.value]\" [nzLabel]=\"formItem.selectOption.showLabelAndValue ? '['+ selectItem[formItem.selectOption.value] +']' +\n selectItem[formItem.selectOption.label] : selectItem[formItem.selectOption.label]\">\n <div class=\"hd-option-line\">\n <div *ngFor=\"let selectOptionTableColumn of formItem.selectOption.tableColumns\"\n [ngStyle]=\"getSelectTableColumnStyle(selectOptionTableColumn)\">\n <ng-container *ngIf=\"selectOptionTableColumn.icons;else notPictureTemplate\">\n <div class=\"hd-option-icons\">\n <ng-container *ngFor=\"let icon of selectOptionTableColumn.icons\">\n <img *ngIf=\"icon.iconName === 'hd-recommend-star' && selectItem[icon.fieldName]\"\n src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAVpJREFUOE+l07FLQkEcB/Dv7713Zg1GQ0SgW9AmTYVp1BRUokZBEI1u/QVBUBD1D0Rt0dQaPYmotXza1tKQzQ1Fk0iDHr5vPEOTUpO88e77+9zvjjtBh8HTOb8e0hu0eN8Xzz22ikonoGzHdgXcAVB16S75U/mbn/m2AK+mglqbBUAGvCIRuVCJ7HLXQCUTPQOxXi8Q4FolnYWuAH0+HaEpjrdxAyC3VSq33xKgPTWiYYUai8IjUCabw4Zw1XWNF2+OZrXoi+cLImBth4odfQAw0elCW6zdKvU2/wVkYs8ggzBlRqrcI/DrrK1wQ7DWAIToV8lsqGxHDwTY6qYbA1jpCVAux3oBSirhDPYCOL6kE/s/QB77UrnNJoDDVkCN6pI+BJH+6xINQdpKOCf1d/AEYBxgUUQC5PcLbPMDXy1lhGXx7r0G6ExklpBwI0xh2w7ID+UzL71iL/MJdzuZdDL/kXcAAAAASUVORK5CYII=\"\n style=\"width: 16px;height: 16px;\">\n <img *ngIf=\"icon.iconName === 'hd-img-star' && selectItem[icon.fieldName]\"\n src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAyhJREFUWEe1ll1o1XYYxp8nPUmUihdCV3bAirvYzUC80Xpy3KwTZNR2CdOhDkTBwe6G32XzwqpjE3Qt4pUKZQqDyQZNTp1uY8yCJG0F2d2+LlWOOkShovQkaV45lcJpTdOTHJubBPI+z/Pj//H+/0TGR66uf8sPoz8A/Kstkp38YORxFitmEVU1vm1cBPlp9ZuQXtX0jmfxygQgvxSWBRWlDECvhgrwQFuqLufG4TAtRCaAwCl+IcDXtWEi2KFb7pUFBxCBEpSMMsDWGWEiNzXLe2/BASp2cTuJH+KCRMJ3dGvsrzQQqafAtw0XpBEfIhc00/tswQD8QWM1FP45d4A8V9XJN9k5Nl4vRKoR8G3jMshdyebRPs0cOftaAaRUbAsRrRRRhuczFsF/lPATNQrL3Hr7/nz1lGvvtkwGUSEC8gLkWfMGkAfQMp9J0n8ByhS5J+QDVr+BshBlUu6q3d5v9G3jIcg3GgnJqp2C853iCIB1WU0a1F2iOO2tPnK3CLQ1aJZKLpCfddPrmtoF8uuqZn9iyfcEzVQumYtlQDO9vS8PsprHd4xvAR7I7FuHUIBvdNP9crr0lT7g24U+UNlfh1f6Esrn2ofeuVphbCPyneJuAN+lT0jokZCduum9cobM2Qn9krEGEa6+hi36jEC3aro34vASW3FoG9si8sdGRoKCY6rlnpjLIxGgYhunSPY0AiAiP+mW93EmAN8ujoJobwgAuKOb7orUAHKjY1EwHjwFkGsEoKpVJ6WVH3n/p1oDwVBhk0TK742GV/UKYOZMt5QKoGIbX5E8mgwg4wCbADQn1c1uPvP2gWqB7xjDADck7OwBVan0QFFyQaj2A9wxV60A13XT7Uw1Ar5TlDiBQP6hRHs0a3Ss9n8wuK4jYtN5Em/H6B5ppht7r4jvhEOFtYiUGQEAnhDoV033ZNJwB45xRAS9IBfX1qnhRD7uhhQLENiFQ0Ll9LSBCM7olnu43gUpTjEfiPSB3D6tUQRbcpZ7bbZHLEBYKnRFogxV505rmjzIrtG/6w2fMS0l430RHAVoULBZtdybdQFkCcuqSXUtzxqSpHsBfmUdgJhaiDQAAAAASUVORK5CYII=\"\n style=\"width: 16px;height: 16px;\">\n <span *ngIf=\"icon.iconName === 'hd-select-close' && selectItem[icon.fieldName]\"\n class=\"hd-select-close\">\n \u7981\u7528\n </span>\n <span *ngIf=\"icon.iconName === 'hd-select-purchase' && selectItem[icon.fieldName]\"\n class=\"hd-select-purchase\">\n \u534F\n </span>\n </ng-container>\n </div>\n </ng-container>\n <ng-template #notPictureTemplate>\n <ng-container\n *ngIf=\"!isTextOverflow(selectOptionTableColumn.render ? selectOptionTableColumn.render(selectItem) : selectItem[selectOptionTableColumn.name], selectOptionTableColumn.width);else overflowTemplate\">\n <div>{{\n judgeColEmpty(selectOptionTableColumn.render ?\n selectOptionTableColumn.render(selectItem) :\n selectItem[selectOptionTableColumn.name])\n }}\n </div>\n </ng-container>\n <ng-template #overflowTemplate>\n <div class=\"hd-option-overflow\" nz-tooltip\n [nzTooltipTitle]=\"selectOptionTableColumn.render ? selectOptionTableColumn.render(selectItem) : selectItem[selectOptionTableColumn.name]\">\n {{\n judgeColEmpty(selectOptionTableColumn.render ?\n selectOptionTableColumn.render(selectItem) :\n selectItem[selectOptionTableColumn.name])\n }}\n </div>\n </ng-template>\n </ng-template>\n </div>\n </div>\n </nz-option>\n <nz-option\n *ngIf=\"formItem.selectOption.label && line.get(formItem.name) && line.get(formItem.selectOption.label)?.value && line.get(formItem.selectOption.value)?.value\"\n [nzLabel]=\"(formItem.selectOption.showLabelAndValue || formItem.selectOption.value === 'code' || formItem.selectOption.value === 'productCode' || formItem.selectOption.hdShowItemCode) ? ('['+ line.get(formItem.selectOption.value).value + ']' + line.get(formItem.selectOption.label).value) : line.get(formItem.selectOption.label).value\"\n [nzValue]=\"line.get(formItem.selectOption.value).value\" nzHide></nz-option>\n </nz-select>\n <ng-template #nomarlSelectTemplate>\n <nz-select #formInputDom (focusin)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n [nzShowSearch]=\"formItem.selectOption.hdShowSearch != null ? formItem.selectOption.hdShowSearch : true\"\n [nzAllowClear]=\"formItem.selectOption.hdAllowClear != null ? formItem.selectOption.hdAllowClear : true\"\n [nzServerSearch]=\"formItem.selectOption.hdServerSearch || false\"\n [nzDropdownMatchSelectWidth]=\"formItem.selectOption.hdDropdownMatchSelectWidth ? formItem.selectOption.hdDropdownMatchSelectWidth : false\"\n [nzPlaceHolder]=\"formItem.placeholder ? formItem.placeholder : '\u8BF7\u9009\u62E9' + formItem.label\"\n [formControlName]=\"formItem.name\"\n (nzOpenChange)=\"onOpenChangeEvent(formItem.onOpenChangeEvent || null, $event, line, formItem.onOpenChangeEventDebounceTime, formItem)\"\n (nzOnSearch)=\"onSearchEvent(formItem.onSearchEvent || null, $event, line, formItem.onSearchEventEventDebounceTime)\"\n [ngStyle]=\"getStyle(line, formItem, '200px')\">\n <nz-option\n *ngFor=\"let selectItem of (formItem.selectOption.selectList || line.get(formItem.selectOption.selectListName).value)\"\n [nzValue]=\"selectItem[formItem.selectOption.value]\" [nzLabel]=\"formItem.selectOption.showLabelAndValue ? '['+ selectItem[formItem.selectOption.value] +']' +\n selectItem[formItem.selectOption.label] : selectItem[formItem.selectOption.label]\">\n </nz-option>\n <nz-option\n *ngIf=\"formItem.selectOption.label && line.get(formItem.name) && line.get(formItem.selectOption.label)?.value && line.get(formItem.selectOption.value)?.value\"\n [nzLabel]=\"(formItem.selectOption.showLabelAndValue || formItem.selectOption.value === 'code' || formItem.selectOption.value === 'productCode' || formItem.selectOption.hdShowItemCode) ? ('['+ line.get(formItem.selectOption.value).value + ']' + line.get(formItem.selectOption.label).value) : line.get(formItem.selectOption.label).value\"\n [nzValue]=\"line.get(formItem.selectOption.value).value\" nzHide></nz-option>\n </nz-select>\n </ng-template>\n\n </ng-container>\n <ng-container *ngSwitchCase=\"'Date'\">\n <nz-date-picker #formInputDom (click)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n (focusin)=\"setActiveDomInFormLines(dataIndex , innerIndex)\" *ngIf=\"formItem.showTime\"\n [ngStyle]=\"getStyle(line, formItem, '150px')\"\n [nzPlaceHolder]=\"formItem.placeholder ? formItem.placeholder : '\u8BF7\u9009\u62E9' + formItem.label\"\n [formControlName]=\"formItem.name\" [nzDisabledDate]=\"formItem.hdDisabledDate\"\n [nzShowToday]=\"formItem.hdShowToday !== false\" nzShowTime\n nzFormat=\"yyyy-MM-dd HH:mm:ss\">\n </nz-date-picker>\n <nz-date-picker #formInputDom *ngIf=\"!formItem.showTime\"\n [ngStyle]=\"getStyle(line, formItem, '150px')\"\n (click)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n (focusin)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n [nzPlaceHolder]=\"formItem.placeholder ? formItem.placeholder : '\u8BF7\u9009\u62E9' + formItem.label\"\n [formControlName]=\"formItem.name\" [nzDisabledDate]=\"formItem.hdDisabledDate\"\n [nzShowToday]=\"formItem.hdShowToday !== false\">\n </nz-date-picker>\n <div *ngIf=\"formItem?.explainOptionRight?.show\"\n [style.color]=\"formItem?.explainOptionRight?.color ? formItem.explainOptionRight.color : null\">\n &nbsp;&nbsp;{{ line.get(formItem.explainOptionRight.name).value }}\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'DateRange'\">\n <nz-range-picker #formInputDom [ngStyle]=\"getStyle(line, formItem, '200px')\"\n (click)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n (focusin)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n [nzDisabledDate]=\"formItem.hdDisabledDate\" [nzPlaceHolder]=\"['\u5F00\u59CB\u65E5\u671F','\u7ED3\u675F\u65E5\u671F']\"\n [formControlName]=\"formItem.name\">\n </nz-range-picker>\n </ng-container>\n <ng-container *ngSwitchCase=\"'TextArea'\">\n <textarea #formInputDom (click)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n (focusin)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n [ngStyle]=\"{'color': formItem?.colorOption?.name ? line.get(formItem.colorOption.name).value : null}\"\n [placeholder]=\"formItem.placeholder ? formItem.placeholder : '\u8BF7\u8F93\u5165' + formItem.label\"\n [maxlength]=\"formItem.maxLength || null\" rows=\"4\" nz-input\n [maxlength]=\"formItem.maxLength || null\" [formControlName]=\"formItem.name\"></textarea>\n </ng-container>\n <ng-container *ngSwitchCase=\"'InputNumber'\">\n <div style=\"display: flex;align-items: center;\"\n (focusin)=\"setActiveDomInFormLines(dataIndex , innerIndex)\">\n <nz-input-number #formInputDom [ngStyle]=\"getStyle(line, formItem, '100px')\"\n [maxlength]=\"formItem.maxLength || null\" [formControlName]=\"formItem.name\"\n [nzMin]=\"formItem?.inputNumber?.min || 0\" [nzMax]=\"formItem?.inputNumber?.max || 99999999\"\n [nzStep]=\"formItem?.inputNumber?.step || 1\"\n [nzPrecision]=\"formItem?.inputNumber?.precision != null ? formItem.inputNumber.precision : 2\"\n [nzPlaceHolder]=\"formItem.placeholder ? formItem.placeholder : '\u8BF7\u8F93\u5165' + formItem.label\"\n [nzId]=\"'inputNumber-' + formItem.name + line.get('lineIndex').value\"\n (click)=\"formItem.isSelect ? selectValue('#inputNumber-' + formItem.name + line.get('lineIndex').value, dataIndex , innerIndex) : setActiveDomInFormLines(dataIndex , innerIndex)\">\n </nz-input-number>\n <div *ngIf=\"formItem?.explainOptionRight?.show\"\n [style.color]=\"formItem?.explainOptionRight?.color ? formItem.explainOptionRight.color : null\">\n &nbsp;&nbsp;{{ line.get(formItem.explainOptionRight.name).value }}\n </div>\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'MultipleSelect'\">\n <nz-select #formInputDom (click)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n (focusin)=\"setActiveDomInFormLines(dataIndex , innerIndex)\" nzMode=\"multiple\"\n [nzServerSearch]=\"formItem.selectOption.hdServerSearch || false\"\n [nzDropdownMatchSelectWidth]=\"formItem.selectOption.hdDropdownMatchSelectWidth ? formItem.selectOption.hdDropdownMatchSelectWidth : false\"\n [nzShowSearch]=\"formItem.selectOption.hdShowSearch != null ? formItem.selectOption.hdShowSearch : true\"\n [nzAllowClear]=\"formItem.selectOption.hdAllowClear != null ? formItem.selectOption.hdAllowClear : true\"\n [nzPlaceHolder]=\"formItem.placeholder ? formItem.placeholder : '\u8BF7\u9009\u62E9' + formItem.label\"\n [formControlName]=\"formItem.name\" [ngStyle]=\"getStyle(line, formItem, '200px')\"\n (nzOpenChange)=\"onOpenChangeEvent(formItem.onOpenChangeEvent || null, $event, line, formItem.onOpenChangeEventDebounceTime, formItem)\"\n (nzOnSearch)=\"onSearchEvent(formItem.onSearchEvent || null, $event, line, formItem.onSearchEventEventDebounceTime)\">\n <nz-option *ngFor=\"let selectItem of formItem.selectOption.selectList\"\n [nzValue]=\"selectItem[formItem.selectOption.value]\" [nzLabel]=\"formItem.selectOption.showLabelAndValue ? '['+ selectItem[formItem.selectOption.value] +']' +\n selectItem[formItem.selectOption.label] : selectItem[formItem.selectOption.label]\"></nz-option>\n <ng-container\n *ngIf=\"formItem.selectOption.label && line.get(formItem.name) && line.get(formItem.selectOption.label)?.value && line.get(formItem.selectOption.value)?.value\">\n <nz-option *ngFor=\"let option of line.get(formItem.selectOption.value).value;index as i\"\n [nzLabel]=\"line.get(formItem.selectOption.label).value[i]\" [nzValue]=\"option\" nzHide>\n </nz-option>\n </ng-container>\n </nz-select>\n </ng-container>\n <ng-container *ngSwitchCase=\"'ViewDom'\">\n <span class=\"hd-formLines-viewDom\" *ngIf=\"!formItem?.hideViewDomValue\">\n {{\n (formItem.preserveNumber && line.get(formItem.name).value) ?\n LodashRound(line.get(formItem.name).value,\n formItem.preserveNumber).toFixed(formItem.preserveNumber)\n : line.get(formItem.name).value\n }}\n </span>\n <ng-container\n *ngTemplateOutlet=\"ViewDomRightTemplate;context:{formItem: formItem, formLine: line}\"></ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'Switch'\">\n <nz-switch (click)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n [formControlName]=\"formItem.name\"></nz-switch>\n </ng-container>\n <ng-container *ngSwitchCase=\"'Time'\">\n <nz-time-picker #formInputDom [ngStyle]=\"getStyle(line, formItem, '200px')\"\n (click)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n (focusin)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n [formControlName]=\"formItem.name\"></nz-time-picker>\n </ng-container>\n </ng-container>\n </nz-form-control>\n </nz-form-item>\n <div *ngIf=\"formItem?.explainOption?.show\"\n [style.color]=\"formItem?.explainOption?.color ? formItem.explainOption.color : null\">\n {{ line.get(formItem.explainOption.name).value }}\n </div>\n </td>\n </ng-container>\n <td [style.width.px]=\"operateColWidth\" nzRight=\"0\">\n <span class=\"common-btn-group\">\n <a *ngIf=\"operateButtons.includes('add')\" (click)=\"addFormLine(line)\">\u6DFB\u52A0</a>\n <a *ngIf=\"operateButtons.includes('copy')\" (click)=\"copyFormLine(line)\">\u590D\u5236</a>\n <a class=\"common-danger-btn\" *ngIf=\"operateButtons.includes('delete') && !showDeleteConfirm\"\n (click)=\"deleteFormLine(line)\">\u5220\u9664</a>\n <a class=\"common-danger-btn\" *ngIf=\"operateButtons.includes('delete') && showDeleteConfirm\" nz-popconfirm\n nzPopconfirmTitle=\"\u786E\u8BA4\u8981\u5220\u9664\u8BE5\u884C\u5417?\" nzPopconfirmPlacement=\"bottom\"\n (nzOnConfirm)=\"deleteFormLine(line)\">\u5220\u9664</a>\n </span>\n </td>\n </tr>\n </ng-container>\n <!-- \u5408\u8BA1\u533A\u57DF -->\n <tr *ngIf=\"showTotal\" class=\"hd-table-total\">\n <td *ngIf=\"showCheckbox\"></td>\n <td>\u5408\u8BA1</td>\n <ng-container *ngFor=\"let totalOption of totalOptionList\">\n <td [nzAlign]=\"totalOption.align ? totalOption.align : 'left'\">{{\n (totalOption.value || totalOption.value ===\n 0) ? (((totalOption.value % 1 === 0) && !totalOption.showDecimal) ? totalOption.value :\n LodashRound(totalOption.value, totalOption.preserveNumber).toFixed(totalOption.preserveNumber)) : ''\n }}\n </td>\n </ng-container>\n </tr>\n </tbody>\n </nz-table>\n <nz-list\n *ngIf=\"linesFormArray.controls.slice((paginationPageIndex - 1) * paginationPageSize, (paginationPageIndex - 1) * paginationPageSize + paginationPageSize).length === 0\"\n [nzDataSource]=\"[]\"></nz-list>\n <ng-container>\n <hd-space background=\"transparent\" type=\"row\" size=\"16\"></hd-space>\n <div class=\"hd-formLines-pagination\">\n <div class=\"hd-formLines-pagination-left\">\n <div *ngIf=\"showKeyboardOperateTip\">\u652F\u6301\u952E\u76D8\u64CD\u4F5C\uFF0C\u4F7F\u7528\n <i nz-icon nzType=\"up-circle\" nzTheme=\"outline\" style=\"font-size: 16px;margin-left: 4px;\"></i>\n <i nz-icon nzType=\"down-circle\" nzTheme=\"outline\" style=\"font-size: 16px;margin-left: 4px;\"></i>\n <i nz-icon nzType=\"left-circle\" nzTheme=\"outline\" style=\"font-size: 16px;margin-left: 4px;\"></i>\n <i nz-icon nzType=\"right-circle\" nzTheme=\"outline\" style=\"font-size: 16px;margin-left: 4px;\"></i>\n <span style=\"font-size: 14px;margin-left: 4px;font-weight: bolder;\">Enter</span>\n \u952E\u5207\u6362\u8868\u5355\u9879\n </div>\n </div>\n <nz-pagination [nzSize]=\"'small'\" style=\"text-align: right;\" [nzPageIndex]=\"paginationPageIndex\"\n [nzPageSize]=\"paginationPageSize\" [nzPageSizeOptions]=\"[10, 20, 30, 40, 50]\"\n [nzTotal]=\"linesFormArray.controls.length\" nzShowSizeChanger (nzPageIndexChange)=\"pageIndexChange($event)\"\n (nzPageSizeChange)=\"pageSizeChange($event)\" [nzShowTotal]=\"totalTemplate\"></nz-pagination>\n <ng-template #totalTemplate let-total>\u5171 {{ linesFormArray.controls.length }} \u6761\u6570\u636E</ng-template>\n </div>\n\n </ng-container>\n</form>\n",
3028
+ styles: ["::ng-deep .common-btn-group>a{font-size:14px;font-weight:400;color:#20b95d!important;white-space:nowrap}::ng-deep .common-btn-group .common-danger-btn:hover{color:#f05b24!important}::ng-deep .common-btn-group>a:hover{color:#20bd62!important}::ng-deep .common-btn-group>a:not(:last-child)::after{content:'';margin:0 2px}::ng-deep .common-billNumber>a{color:#3b77e3}button{box-shadow:unset;text-shadow:unset}::ng-deep .ant-form-item-label>label{color:#4b504e;font-size:14px}::ng-deep .ant-input-number-input{height:32px}::ng-deep .ant-input-number{height:32px}textarea.ant-input{height:auto;min-height:32px}::ng-deep .ant-select-selection--multiple{min-height:32px}::ng-deep .ant-select-selection--multiple .ant-select-selection__rendered>ul>li.ant-select-search--inline:only-child{margin-left:4px}::ng-deep .ant-select-selection__rendered>ul>li{height:26px!important;margin-top:3px!important;line-height:26px!important}::ng-deep .ant-advanced-search-form .ant-form-item{margin-bottom:0!important}::ng-deep .ant-select-selection--single{height:32px!important}::ng-deep .ant-input{height:32px}::ng-deep .ant-input[disabled]:hover{border-color:#d9d9d9!important}::ng-deep .ant-select-selection__rendered{line-height:32px!important}::ng-deep .ant-calendar-range-picker-input{text-align:left!important}::ng-deep .ant-calendar-picker{width:100%!important}::ng-deep .ant-row{margin-right:0!important;margin-left:0!important}::ng-deep .ant-col-6{padding-left:12px;padding-right:12px}::ng-deep .ant-col-12{padding-left:12px;padding-right:12px}::ng-deep .ant-col-18{padding-left:12px;padding-right:12px}::ng-deep .ant-col-24{padding-left:12px;padding-right:12px}::ng-deep .ant-alert-info{background-color:#f5f8f6;border:1px solid #cfe3d4}::ng-deep .hd-table-container .ant-table-td-left-sticky,::ng-deep .hd-table-container .ant-table-td-right-sticky,::ng-deep .hd-table-container .ant-table-th-left-sticky,::ng-deep .hd-table-container .ant-table-th-right-sticky{z-index:2;transform:translateZ(0)}::ng-deep .hd-table-container .ant-table-thead>tr>th.ant-table-th-left-sticky,::ng-deep .hd-table-container .ant-table-thead>tr>th.ant-table-th-right-sticky{background:#f5f8f6!important}::ng-deep .hd-table-container .ant-table-tbody>tr>td.ant-table-td-left-sticky,::ng-deep .hd-table-container .ant-table-tbody>tr>td.ant-table-td-right-sticky{background:#fff}::ng-deep .hd-table-container .ant-table-tbody>tr.ant-table-row-hover>td.ant-table-td-left-sticky,::ng-deep .hd-table-container .ant-table-tbody>tr.ant-table-row-hover>td.ant-table-td-right-sticky,::ng-deep .hd-table-container .ant-table-tbody>tr:hover>td.ant-table-td-left-sticky,::ng-deep .hd-table-container .ant-table-tbody>tr:hover>td.ant-table-td-right-sticky{background:#ecf8f1!important}::ng-deep .hd-table-container .ant-table-scroll-position-left .ant-table-td-right-sticky,::ng-deep .hd-table-container .ant-table-scroll-position-left .ant-table-th-right-sticky,::ng-deep .hd-table-container .ant-table-scroll-position-middle .ant-table-td-right-sticky,::ng-deep .hd-table-container .ant-table-scroll-position-middle .ant-table-th-right-sticky,::ng-deep .hd-table-container .ant-table-scroll-position-right .ant-table-td-right-sticky,::ng-deep .hd-table-container .ant-table-scroll-position-right .ant-table-th-right-sticky{box-shadow:none!important}::ng-deep .hd-table-container .ant-table-fixed-right{right:0!important}:host ::ng-deep th{background:#f5f8f6!important;font-weight:700!important;white-space:nowrap;font-size:14px;font-family:PingFangSC-Medium,PingFang SC;color:#2a3634;padding:8px!important;box-sizing:border-box}:host ::ng-deep td{font-weight:400;font-style:normal;font-size:14px;color:#2a3634;text-align:left;white-space:nowrap;padding:8px!important;box-sizing:border-box}::ng-deep .ant-pagination-options{display:inline-flex;align-items:center}::ng-deep .ant-pagination-options .ant-select,::ng-deep .ant-pagination-options .ant-select-selection--single{min-width:100px}::ng-deep .ant-pagination-options-size-changer.ant-select{min-width:100px}::ng-deep .ant-time-picker{width:100%}::ng-deep .cdk-overlay-pane .hd-cascader-menus.ant-cascader-menus>.ant-cascader-menu:only-child{width:-webkit-max-content!important;width:-moz-max-content!important;width:max-content!important;min-width:var(--hd-cascader-menu-min-width,auto);max-width:560px}::ng-deep .cdk-overlay-pane .hd-cascader-menus.ant-cascader-menus>.ant-cascader-menu:only-child .ant-cascader-menu-item{white-space:nowrap}.ant-input-number-disabled,.ant-input[disabled],.ant-select-disabled{color:#4b504e}.hd-formLines-toolbar{display:block}.hd-formLines-toolbar ::ng-deep .hd-button-group-left{gap:12px}.hd-formLines-toolbar ::ng-deep .hd-button-group-left hd-button{margin-right:0}.hd-formLines-toolbar ::ng-deep .hd-lines-search{width:300px;flex-shrink:0}.hd-formLines-col-settings{display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;width:32px;height:32px;padding:0;margin-left:12px;cursor:pointer;color:#2a3634;background:0 0;border:1px solid #e5e6eb;border-radius:4px;vertical-align:middle;flex-shrink:0}.hd-formLines-col-settings:hover{color:#20b95d;background:#f5f8f6;border-color:#20b95d}.hd-formLines-col-settings .hd-formLines-col-settings-icon{display:block;width:14px;height:14px;flex-shrink:0}.hd-formLines-col-settings-dropdown{background:#fff;border:1px solid #e5e6eb;border-radius:4px;box-shadow:0 6px 16px rgba(0,0,0,.08),0 3px 6px rgba(0,0,0,.06);overflow:hidden}.hd-formLines-col-settings-list{max-height:400px;overflow-y:auto}.hd-formLines-col-settings-footer{text-align:right;background:#fff;padding:4px;border-top:1px solid #f0f0f0}.hd-formLines-container ::ng-deep td{padding:4px 8px!important}.hd-formLines-container .ant-table-tbody>tr>td,.hd-formLines-container ::ng-deep .ant-table-thead>tr>th{padding:16px 8px}.hd-formLines-container ::ng-deep .hd-table-total>td{border:0!important}.hd-formLines-container ::ng-deep .ant-form-item{margin-bottom:0}.hd-formLines-container .ant-input-number{width:100%}.hd-formLines-container .hd-formLines-viewDom{font-size:14px}::ng-deep .hd-select-table .ant-select-dropdown-menu-item-disabled{background:#f5f8f6!important;border-bottom:1px solid #e8e8e8;position:-webkit-sticky;position:sticky;top:0;z-index:10;padding:0}::ng-deep .hd-select-table .ant-select-dropdown-menu-item-disabled:hover{background:#f5f8f6!important}::ng-deep .hd-option-header{display:flex;align-items:center;color:rgba(0,0,0,.85);background:#f5f8f6}::ng-deep .hd-option-header-column{padding:5px 0}.hd-option-line{display:flex;align-items:center}.hd-option-overflow{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.hd-select-empty{display:flex;align-items:center;flex-direction:column;padding:20px 0;background:#fff}::ng-deep .ant-empty-small{background:#fff!important;padding:8px 0;margin:0}.hd-formLines-pagination{display:flex;align-items:center;justify-content:space-between}.hd-formLines-pagination .hd-formLines-pagination-left{margin-left:10px;display:flex;align-items:center}.hd-option-icons{display:flex;align-items:center}.hd-select-close{display:block;height:16px;line-height:14px;text-align:center;padding:0 4px;border:1px solid #f5222d;color:#f5222d;font-size:14px}.hd-select-purchase{display:block;height:16px;line-height:14px;text-align:center;padding:0 4px;border:1px solid #20bd62;color:#20bd62;font-size:14px}"]
3029
3029
  }] }
3030
3030
  ];
3031
3031
  /** @nocollapse */
@@ -3321,4 +3321,4 @@ if (false) {
3321
3321
  */
3322
3322
  HdFormLinesComponent.prototype.commonSessionService;
3323
3323
  }
3324
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGQtZm9ybS1saW5lcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9mYW50YXN5LW5nem9ycm8vIiwic291cmNlcyI6WyJoZC1mb3JtLWxpbmVzL2hkLWZvcm0tbGluZXMuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUVMLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsWUFBWSxFQUNaLFVBQVUsRUFDVixZQUFZLEVBQ1osS0FBSyxFQUdMLE1BQU0sRUFDTixTQUFTLEVBRVQsV0FBVyxFQUNYLFlBQVksR0FDYixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQWEsV0FBVyxFQUFhLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQy9FLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDL0IsT0FBTyxLQUFLLFdBQVcsTUFBTSxhQUFhLENBQUM7QUFDM0MsT0FBTyxFQUNMLFlBQVksRUFDWixxQkFBcUIsRUFDckIsc0JBQXNCLEVBQ3RCLHNCQUFzQixFQUN0QixpQkFBaUIsRUFDakIscUJBQXFCLEdBQ3RCLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxPQUFPLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQzdDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUk5QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUN6RSxPQUFPLEVBQVksWUFBWSxFQUFFLG9CQUFvQixFQUFFLE1BQU0seUJBQXlCLENBQUM7Ozs7O0lBR2pGLHNDQUFzQyxHQUFHLEVBQUU7QUFFakQ7SUFnSEUsOEJBQ1UsRUFBZSxFQUNmLEdBQXNCLEVBQ3RCLG9CQUEwQztRQUhwRCxpQkFxQkM7UUFwQlMsT0FBRSxHQUFGLEVBQUUsQ0FBYTtRQUNmLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBQ3RCLHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBc0I7UUEzRzNC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QXVCOzs7OztJQUN2QixtQ0FBOEI7Ozs7O0lBQzlCLG9EQUFrRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIENvbnRlbnRDaGlsZCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgUXVlcnlMaXN0LFxuICBTaW1wbGVDaGFuZ2VzLFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0NoaWxkcmVuLFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgRm9ybUFycmF5LCBGb3JtQnVpbGRlciwgRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XG5pbXBvcnQgeyByb3VuZCB9IGZyb20gXCJsb2Rhc2hcIjtcbmltcG9ydCAqIGFzIGxvY2FsZm9yYWdlIGZyb20gXCJsb2NhbGZvcmFnZVwiO1xuaW1wb3J0IHtcbiAgSW5wdXRCb29sZWFuLFxuICBOekRhdGVQaWNrZXJDb21wb25lbnQsXG4gIE56SW5wdXROdW1iZXJDb21wb25lbnQsXG4gIE56UmFuZ2VQaWNrZXJDb21wb25lbnQsXG4gIE56U2VsZWN0Q29tcG9uZW50LFxuICBOelRpbWVQaWNrZXJDb21wb25lbnQsXG59IGZyb20gXCJuZy16b3Jyby1hbnRkXCI7XG5pbXBvcnQgeyBOekZvcm1hdEVtaXRFdmVudCB9IGZyb20gXCJuZy16b3Jyby1hbnRkL2NvcmVcIjtcbmltcG9ydCB7IFN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUgfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcbmltcG9ydCB7IFRvdGFsT3B0aW9uIH0gZnJvbSBcIi4uL2hkLWRldGFpbC1saW5lcy9oZC1kZXRhaWwtbGluZXMuc2VydmljZVwiO1xuaW1wb3J0IHsgVHJlZUdyaWQgfSBmcm9tIFwiLi4vaGQtdGFibGUvaGQtdGFibGUuc2VydmljZVwiO1xuaW1wb3J0IHsgU2VsZWN0T3B0aW9uVGFibGVDb2x1bW4gfSBmcm9tIFwiLi4vbW9kZWwvY29tbW9uLXR5cGVcIjtcbmltcG9ydCB7IENvbW1vblNlc3Npb25TZXJ2aWNlIH0gZnJvbSBcIi4uL3NlcnZpY2UvY29tbW9uLXNlc3Npb24uc2VydmljZVwiO1xuaW1wb3J0IHsgRm9ybUxpbmUsIEZvcm1MaW5lVHlwZSwgRm9ybUxpbmVzQ2FjaGVPcHRpb24gfSBmcm9tIFwiLi9oZC1mb3JtLWxpbmVzLnNlcnZpY2VcIjtcblxuLyoqIOS4jiBhbnQtc2VsZWN0IOmAiemhuemhueawtOW5s+WGhei+uei3neS4gOiHtO+8jOeUqOS6juihqOWktOS4jumAiemhueihjOWvuem9kCAqL1xuY29uc3QgU0VMRUNUX1RBQkxFX09QVElPTl9IT1JJWk9OVEFMX1BBRERJTkcgPSAxMjtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcImhkLWZvcm0tbGluZXNcIixcbiAgdGVtcGxhdGVVcmw6IFwiLi9oZC1mb3JtLWxpbmVzLmNvbXBvbmVudC5odG1sXCIsXG4gIHN0eWxlVXJsczogW1wiLi9oZC1mb3JtLWxpbmVzLmNvbXBvbmVudC5sZXNzXCJdLFxufSlcbmV4cG9ydCBjbGFzcyBIZEZvcm1MaW5lc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgQFZpZXdDaGlsZHJlbihcImZvcm1JbnB1dERvbVwiKSBmb3JtSW5wdXREb21MaXN0ITogUXVlcnlMaXN0PEVsZW1lbnRSZWY+O1xuXG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBzaG93TGluZU51bWJlcjogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBhbGxvd0VtcHR5OiBib29sZWFuID0gdHJ1ZTtcbiAgQE91dHB1dCgpIGRlbGV0ZUxhc3RMaW5lRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBzaG93S2V5Ym9hcmRPcGVyYXRlVGlwOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiDmmK/lkKblkK/nlKjplK7nm5jmlrnlkJHplK4vRW50ZXIg5Zyo5Y2V5YWD5qC86Ze06Lez6L2s77yM6buY6K6k5byA5ZCvICovXG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBlbmFibGVLZXlib2FyZE9wZXJhdGU6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgdGFibGVMb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBzaG93U2VhcmNoOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiDmmK/lkKblsZXnpLrooYzli77pgInliJfvvIznlKjkuo7lpJbpg6jmibnph4/mk43kvZzli77pgInooYwgKi9cbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIHNob3dDaGVja2JveDogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiog5piv5ZCm5bGV56S65YiX6K6+572u77yI6b2/6L2u77yJ77yM6buY6K6k5YWz6Zet77yb6ZyA6KaB5pe26aG16Z2i5omL5belIGBbc2hvd0NvbFNldHRpbmdzXT1cInRydWVcImDvvJvku4XpnZ4gaGlkZSDnmoQgVmlld0RvbSDlj6/phY3nva7vvIznpoHmraLmi5bmi73osIPluo8gKi9cbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIHNob3dDb2xTZXR0aW5nczogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiog5YiX6K6+572u57yT5a2YIGtleSDniYfmrrXvvJvmnInlgLzml7bmjIHkuYXljJbliLAgSW5kZXhlZERC77yM5peg5YiZ5LuF5b2T5YmN5Lya6K+d55Sf5pWIICovXG4gIEBJbnB1dCgpIHV1aWQ6IHN0cmluZztcbiAgQElucHV0KCkgZm9ybUxpbmVzOiBBcnJheTxGb3JtTGluZT47XG4gIC8vIOmSiOWvuWZvcm1MaW5lc+mHjOmdouaJgOacieeahG5hbWXvvIxcbiAgQElucHV0KCkgZm9ybUxpbmVzRGF0YTogYW55O1xuICBASW5wdXQoKSBvcGVyYXRlQnV0dG9uczogQXJyYXk8c3RyaW5nPiA9IFtcImFkZFwiLCBcImRlbGV0ZVwiXTsgLy8g5pON5L2c5YiX5oyJ6ZKu77yaYWRkIC8gZGVsZXRlIC8gY29weVxuICBASW5wdXQoKSBzY3JvbGw6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7IHg6IFwiMXB4XCIgfTtcbiAgQE91dHB1dCgpIGNoYW5nZUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAvKiog5paw5aKe56m66KGM5ZCO5oqb5Ye66K+l6KGMIEZvcm1Hcm91cO+8iOaJi+WKqOa3u+WKoOOAgemUruebmOi3s+ihjOiHquWKqOihpeihjOetie+8iSAqL1xuICBAT3V0cHV0KCkgYWRkTGluZUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxGb3JtR3JvdXA+KCk7XG4gIC8qKiDli77pgInlj5jljJbml7bmipvlh7rlvZPliY3li77pgInooYwgRm9ybUdyb3VwIOWIl+ihqCAqL1xuICBAT3V0cHV0KCkgc2VsZWN0aW9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxGb3JtR3JvdXBbXT4oKTtcbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIHNob3dEZWxldGVDb25maXJtOiBib29sZWFuID0gZmFsc2U7XG4gIHBhZ2luYXRpb25QYWdlSW5kZXg6IG51bWJlciA9IDE7XG4gIHBhZ2luYXRpb25QYWdlU2l6ZTogbnVtYmVyID0gMTA7XG4gIHZhbGlkYXRlSGRGb3JtTGluZXM6IEZvcm1Hcm91cDtcbiAgbmV3TGluZTogYW55O1xuICBpbnB1dFZhbHVlOiBzdHJpbmc7XG5cbiAgLy8g5ZCI6K6h5Yy65Z+fXG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBzaG93VG90YWw6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgdG90YWxPcHRpb246IEFycmF5PFRvdGFsT3B0aW9uPiA9IFtdO1xuICBASW5wdXQoKSBjb2x1bW5zTnVtYmVyOiBudW1iZXIgfCBzdHJpbmcgPSAwO1xuICB0b3RhbE9wdGlvbkxpc3QgPSBbXTtcblxuICBzaG93Rm9ybTogYm9vbGVhbiA9IGZhbHNlO1xuICBmaWx0ZXJTdHI6IHN0cmluZztcbiAgc3RvcmVGb3JtTGluZXNEYXRhOiBhbnkgPSBbXTsgLy8g57yT5a2Y55qE5oC755qE6KGo5Y2V5pWw5o2uXG4gIGZpbHRlclN0b3JlRm9ybUxpbmVzRGF0YTogYW55ID0gW107IC8vIOetm+mAieWHuuadpeeahOaVsOaNruWIl+ihqFxuICBmaWx0ZXJJbmRleFN0b3JlOiBBcnJheTxudW1iZXI+ID0gW107IC8vIOetm+mAieWHuuadpeeahOaVsOaNruWcqOWOn+Wni+WIl+ihqOS4reeahOS4i+agh1xuICBpc0ZpbHRlckRhdGE6IGJvb2xlYW4gPSBmYWxzZTsgLy8g5piv5ZCm5piv5bey57uP562b6YCJ6L+H55qE5pWw5o2uXG4gIGZvcm1WYWxpZDogYm9vbGVhbiA9IGZhbHNlOyAvLyDooajljZXlvZPliY3nmoTnirbmgIFcbiAgLyoqIOWLvumAieeahOihjCBpZO+8iOi3qOmhteOAgeaQnOe0oumHjeW7uuWQjuS7jeS/neeVme+8iSAqL1xuICBwcml2YXRlIHNlbGVjdGVkUm93SWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIHByaXZhdGUgc2VhcmNoU3ViamVjdCA9IG5ldyBTdWJqZWN0PHsgZm46IGFueTsgZXZlbnQ6IGFueTsgbGluZTogYW55IH0+KCk7XG4gIHByaXZhdGUgZGVib3VuY2VUaW1lb3V0OiBudW1iZXIgPSAwOyAvLyDpu5jorqTpmLLmipbml7bpl7RcblxuICBwcml2YXRlIHNlYXJjaFN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIGZvcm1JbnB1dERvbUxpc3RTdWI6IFN1YnNjcmlwdGlvbiB8IHVuZGVmaW5lZDtcblxuICBwcml2YXRlIG9wZW5DaGFuZ2VTdWJqZWN0ID0gbmV3IFN1YmplY3Q8eyBmbjogYW55OyBldmVudDogYW55OyBsaW5lOiBhbnkgfT4oKTtcbiAgcHJpdmF0ZSBvcGVuQ2hhbmdlRGVib3VuY2VUaW1lb3V0OiBudW1iZXIgPSAwO1xuICBwcml2YXRlIG9wZW5DaGFuZ2VTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiB8IHVuZGVmaW5lZDtcblxuICAvLyDlvZPliY3pobXnmoRkb23kuoznu7TmlbDnu4RcbiAgY29sbGVjdERvbUxpc3Q6IEFycmF5PFxuICAgIEFycmF5PFxuICAgICAgfCBFbGVtZW50UmVmXG4gICAgICB8IE56U2VsZWN0Q29tcG9uZW50XG4gICAgICB8IE56SW5wdXROdW1iZXJDb21wb25lbnRcbiAgICAgIHwgTnpEYXRlUGlja2VyQ29tcG9uZW50XG4gICAgICB8IE56UmFuZ2VQaWNrZXJDb21wb25lbnRcbiAgICAgIHwgTnpUaW1lUGlja2VyQ29tcG9uZW50XG4gICAgPlxuICA+ID0gW107XG4gIC8vIOW9k+WJjeiBmueEpueahGRvbeWFg+e0oOWdkOagh1xuICBhY3RpdmVEb21YOiBudW1iZXIgPSBudWxsO1xuICBhY3RpdmVEb21ZOiBudW1iZXIgPSBudWxsO1xuICBhY3RpdmVEb206XG4gICAgfCBFbGVtZW50UmVmXG4gICAgfCBOelNlbGVjdENvbXBvbmVudFxuICAgIHwgTnpJbnB1dE51bWJlckNvbXBvbmVudFxuICAgIHwgTnpEYXRlUGlja2VyQ29tcG9uZW50XG4gICAgfCBOelJhbmdlUGlja2VyQ29tcG9uZW50XG4gICAgfCBOelRpbWVQaWNrZXJDb21wb25lbnQgPSBudWxsO1xuICBhY3RpdmVTZWxlY3RlZENvbXBvbmVudE9wZW46IGJvb2xlYW4gPSBmYWxzZTtcbiAgQENvbnRlbnRDaGlsZChcIlZpZXdEb21SaWdodFRlbXBsYXRlXCIsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBWaWV3RG9tUmlnaHRUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcbiAgLyoqIOW3peWFt+agj+W3puS+p+iHquWumuS5ieaMiemSru+8jOeUqOazleWQjCBoZC10YWJsZSDnmoQgdGFibGVMZWZ0QnV0dG9uICovXG4gIEBDb250ZW50Q2hpbGQoXCJmb3JtTGluZXNMZWZ0QnV0dG9uXCIsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBmb3JtTGluZXNMZWZ0QnV0dG9uOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICAvKiog5bel5YW35qCP5Y+z5L6n6Ieq5a6a5LmJ5oyJ6ZKu77yM55So5rOV5ZCMIGhkLXRhYmxlIOeahCB0YWJsZVJpZ2h0QnV0dG9uICovXG4gIEBDb250ZW50Q2hpbGQoXCJmb3JtTGluZXNSaWdodEJ1dHRvblwiLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgZm9ybUxpbmVzUmlnaHRCdXR0b246IFRlbXBsYXRlUmVmPGFueT47XG4gIC8qKiDooajmoLzkuIrmlrnoh6rlrprkuYnljLrln5/vvIjlpoLli77pgInmj5DnpLrvvInvvIznlKjms5XlkIwgaGQtdGFibGUg55qEIHRhYmxlVG90YWwgKi9cbiAgQENvbnRlbnRDaGlsZChcInRhYmxlVG90YWxcIiwgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIHRhYmxlVG90YWw6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgLy8g5YiX6K6+572uXG4gIGlzRHJvcGRvd25WaXNpYmxlOiBib29sZWFuID0gZmFsc2U7XG4gIHNob3dMaXN0Tm9kZXM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgbm93TGlzdE5vZGVzOiBBcnJheTxUcmVlR3JpZD4gPSBbXTtcbiAgaGlkZUxpc3ROb2RlczogQXJyYXk8VHJlZUdyaWQ+ID0gW107XG4gIGNhbmNlbE5vd0xpc3ROb2RlczogQXJyYXk8VHJlZUdyaWQ+ID0gW107XG4gIGNhbmNlbEhpZGVMaXN0Tm9kZXM6IEFycmF5PFRyZWVHcmlkPiA9IFtdO1xuICBmb3JtTGluZXNDYWNoZU9wdGlvbjogRm9ybUxpbmVzQ2FjaGVPcHRpb24gPSBuZXcgRm9ybUxpbmVzQ2FjaGVPcHRpb24oKTtcbiAgcHJpdmF0ZSBsb2NhbGZvcmFnZTogYW55ID0gbnVsbDtcbiAgcHJpdmF0ZSBsb2NhbHRpb25UbXA6IHN0cmluZyA9IFwiXCI7XG4gIHByaXZhdGUgdXNlclNlc3Npb246IGFueTtcbiAgLyoqIOaYr+WQpuW3suS7jiBJbmRleGVkREIg6K+75Yiw6L+H5YiX6K6+572u57yT5a2Y77yI5ZCrIGNvbHMg5Li656m677yJICovXG4gIHByaXZhdGUgY29sc0NhY2hlTG9hZGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIsXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgY29tbW9uU2Vzc2lvblNlcnZpY2U6IENvbW1vblNlc3Npb25TZXJ2aWNlLFxuICApIHtcbiAgICB0aGlzLmxvY2FsZm9yYWdlID0gbG9jYWxmb3JhZ2UuY3JlYXRlSW5zdGFuY2Uoe1xuICAgICAgZHJpdmVyOiBsb2NhbGZvcmFnZS5JTkRFWEVEREIsXG4gICAgICBuYW1lOiBcImhkLWZzY21cIixcbiAgICAgIHZlcnNpb246IDEuMCxcbiAgICAgIHN0b3JlTmFtZTogXCJoZC1mc2NtLXN0b3JlXCIsXG4gICAgfSk7XG4gICAgdGhpcy5zZWFyY2hTdWJzY3JpcHRpb24gPSB0aGlzLnNlYXJjaFN1YmplY3RcbiAgICAgIC5waXBlKGRlYm91bmNlVGltZSh0aGlzLmRlYm91bmNlVGltZW91dCkpXG4gICAgICAuc3Vic2NyaWJlKCh7IGZuLCBldmVudCwgbGluZSB9KSA9PiB0aGlzLnRyaWdnZXJFdmVudChmbiwgZXZlbnQsIGxpbmUpKTtcbiAgICB0aGlzLm9wZW5DaGFuZ2VTdWJzY3JpcHRpb24gPSB0aGlzLm9wZW5DaGFuZ2VTdWJqZWN0XG4gICAgICAucGlwZShkZWJvdW5jZVRpbWUodGhpcy5vcGVuQ2hhbmdlRGVib3VuY2VUaW1lb3V0KSlcbiAgICAgIC5zdWJzY3JpYmUoKHsgZm4sIGV2ZW50LCBsaW5lIH0pID0+IHtcbiAgICAgICAgaWYgKGV2ZW50KSB7XG4gICAgICAgICAgdGhpcy50cmlnZ2VyRXZlbnQoZm4sIGV2ZW50LCBsaW5lKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmxvY2FsdGlvblRtcCA9IGxvY2F0aW9uLnBhdGhuYW1lO1xuICAgIGlmICh0aGlzLmxvY2FsdGlvblRtcCkge1xuICAgICAgdGhpcy5sb2NhbHRpb25UbXAgPSB0aGlzLmxvY2FsdGlvblRtcC5yZXBsYWNlKC9cXC8vZywgXCJfXCIpO1xuICAgIH1cbiAgICB0aGlzLnVzZXJTZXNzaW9uID0gdGhpcy5jb21tb25TZXNzaW9uU2VydmljZS5nZXRTZXNzaW9uKFxuICAgICAgXCJfX2p5X2F1dGhvcml6YXRpb25fc2Vzc2lvbl9fXCIsXG4gICAgKTtcbiAgICBpZiAoIXRoaXMudXNlclNlc3Npb24pIHtcbiAgICAgIHRoaXMudXNlclNlc3Npb24gPSB7IHVzZXJDb2RlOiBcImRldlwiIH07XG4gICAgfVxuICAgIC8vIOe8k+WtmOS4gOS4i+aAu+eahOihqOWNleaVsOaNrlxuICAgIHRoaXMuc3RvcmVGb3JtTGluZXNEYXRhID0gdGhpcy5mb3JtTGluZXNEYXRhO1xuICAgIHRoaXMuaW5pdENvbFNldHRpbmdzKCk7XG4gICAgdGhpcy5pbml0KCk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgdGhpcy5jb2xsZWN0RG9tRGF0YSgpO1xuICAgIHRoaXMuZm9ybUlucHV0RG9tTGlzdFN1YiA9IHRoaXMuZm9ybUlucHV0RG9tTGlzdC5jaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLmNvbGxlY3REb21EYXRhKCk7XG4gICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5zZWFyY2hTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuc2VhcmNoU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLm9wZW5DaGFuZ2VTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMub3BlbkNoYW5nZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5mb3JtSW5wdXREb21MaXN0U3ViKSB7XG4gICAgICB0aGlzLmZvcm1JbnB1dERvbUxpc3RTdWIudW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cblxuICBnZXQgZm9ybUxpbmVzTGVuZ3RoKCkge1xuICAgIHJldHVybiB0aGlzLmxpbmVzRm9ybUFycmF5LmNvbnRyb2xzLmxlbmd0aDtcbiAgfVxuXG4gIGdldCBvcGVyYXRlQ29sV2lkdGgoKSB7XG4gICAgY29uc3QgY291bnQgPSAodGhpcy5vcGVyYXRlQnV0dG9ucyB8fCBbXSkuZmlsdGVyKChidG4pID0+XG4gICAgICBbXCJhZGRcIiwgXCJjb3B5XCIsIFwiZGVsZXRlXCJdLmluY2x1ZGVzKGJ0biksXG4gICAgKS5sZW5ndGg7XG4gICAgcmV0dXJuIE1hdGgubWF4KGNvdW50ICogNDAsIDgwKTtcbiAgfVxuXG4gIC8qKiBhbGxvd0VtcHR5IOS4lOaTjeS9nOWIl+S7heacieWIoOmZpOaXtu+8muWFgeiuuCAwIOihjO+8jOWIneWni+WMluS4juWIoOiHs+epuumDveS4jeiHquWKqOihpeepuuihjCAqL1xuICBnZXQgaXNUcnVseUVtcHR5QWxsb3dlZCgpOiBib29sZWFuIHtcbiAgICBjb25zdCBidXR0b25zID0gKHRoaXMub3BlcmF0ZUJ1dHRvbnMgfHwgW10pLmZpbHRlcigoYnRuKSA9PlxuICAgICAgW1wiYWRkXCIsIFwiY29weVwiLCBcImRlbGV0ZVwiXS5pbmNsdWRlcyhidG4pLFxuICAgICk7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuYWxsb3dFbXB0eSAmJlxuICAgICAgYnV0dG9ucy5sZW5ndGggPT09IDEgJiZcbiAgICAgIGJ1dHRvbnNbMF0gPT09IFwiZGVsZXRlXCJcbiAgICApO1xuICB9XG5cbiAgLyoqIOWLvumAieWIl+WbuuWumuaXtu+8jOW6j+WPt+WIl+eahCBsZWZ0IOWBj+enuyAqL1xuICBnZXQgbGluZU51bWJlckxlZnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2hvd0NoZWNrYm94ID8gXCI0MHB4XCIgOiBcIjBweFwiO1xuICB9XG5cbiAgcHJpdmF0ZSBnZW5lcmF0ZVJvd0lkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBoZF9yb3dfJHtEYXRlLm5vdygpfV8ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIsIDkpfWA7XG4gIH1cblxuICBwcml2YXRlIGdldFJvd0lkKGxpbmU6IEZvcm1Hcm91cCk6IHN0cmluZyB7XG4gICAgaWYgKCFsaW5lIHx8ICFsaW5lLmdldChcIl9oZFJvd0lkXCIpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGxpbmUuZ2V0KFwiX2hkUm93SWRcIikudmFsdWU7XG4gIH1cblxuICAvKiog5b2T5YmN6aG155qE6KGM77yI55So5LqO6KGo5aS05YWo6YCJ77yM5LuF5L2c55So5LqO5b2T5YmN6aG177yM6Leo6aG15Yu+6YCJ5LuN5L+d55WZ77yJICovXG4gIHByaXZhdGUgZ2V0Q3VycmVudFBhZ2VMaW5lcygpOiBGb3JtR3JvdXBbXSB7XG4gICAgY29uc3Qgc3RhcnQgPSAodGhpcy5wYWdpbmF0aW9uUGFnZUluZGV4IC0gMSkgKiB0aGlzLnBhZ2luYXRpb25QYWdlU2l6ZTtcbiAgICBjb25zdCBlbmQgPSBzdGFydCArIHRoaXMucGFnaW5hdGlvblBhZ2VTaXplO1xuICAgIHJldHVybiAodGhpcy5saW5lc0Zvcm1BcnJheS5jb250cm9scyBhcyBGb3JtR3JvdXBbXSkuc2xpY2Uoc3RhcnQsIGVuZCk7XG4gIH1cblxuICBpc0xpbmVDaGVja2VkKGxpbmU6IEZvcm1Hcm91cCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGlkID0gdGhpcy5nZXRSb3dJZChsaW5lKTtcbiAgICByZXR1cm4gISFpZCAmJiB0aGlzLnNlbGVjdGVkUm93SWRzLmhhcyhpZCk7XG4gIH1cblxuICBpc0FsbENoZWNrZWQoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcGFnZUxpbmVzID0gdGhpcy5nZXRDdXJyZW50UGFnZUxpbmVzKCk7XG4gICAgcmV0dXJuIChcbiAgICAgIHBhZ2VMaW5lcy5sZW5ndGggPiAwICYmXG4gICAgICBwYWdlTGluZXMuZXZlcnkoKGxpbmUpID0+IHRoaXMuaXNMaW5lQ2hlY2tlZChsaW5lKSlcbiAgICApO1xuICB9XG5cbiAgaXNJbmRldGVybWluYXRlKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHBhZ2VMaW5lcyA9IHRoaXMuZ2V0Q3VycmVudFBhZ2VMaW5lcygpO1xuICAgIGNvbnN0IGNoZWNrZWRDb3VudCA9IHBhZ2VMaW5lcy5maWx0ZXIoKGxpbmUpID0+XG4gICAgICB0aGlzLmlzTGluZUNoZWNrZWQobGluZSksXG4gICAgKS5sZW5ndGg7XG4gICAgcmV0dXJuIGNoZWNrZWRDb3VudCA+IDAgJiYgY2hlY2tlZENvdW50IDwgcGFnZUxpbmVzLmxlbmd0aDtcbiAgfVxuXG4gIG9uQWxsQ2hlY2tlZChjaGVja2VkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5nZXRDdXJyZW50UGFnZUxpbmVzKCkuZm9yRWFjaCgobGluZSkgPT4ge1xuICAgICAgY29uc3QgaWQgPSB0aGlzLmdldFJvd0lkKGxpbmUpO1xuICAgICAgaWYgKCFpZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoY2hlY2tlZCkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkUm93SWRzLmFkZChpZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNlbGVjdGVkUm93SWRzLmRlbGV0ZShpZCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5lbWl0U2VsZWN0aW9uQ2hhbmdlKCk7XG4gIH1cblxuICBvbkxpbmVDaGVja2VkQ2hhbmdlKGxpbmU6IEZvcm1Hcm91cCwgY2hlY2tlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIGNvbnN0IGlkID0gdGhpcy5nZXRSb3dJZChsaW5lKTtcbiAgICBpZiAoIWlkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChjaGVja2VkKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkUm93SWRzLmFkZChpZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRSb3dJZHMuZGVsZXRlKGlkKTtcbiAgICB9XG4gICAgdGhpcy5lbWl0U2VsZWN0aW9uQ2hhbmdlKCk7XG4gIH1cblxuICBwcml2YXRlIGVtaXRTZWxlY3Rpb25DaGFuZ2UoKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2UuZW1pdCh0aGlzLmdldFNlbGVjdGVkTGluZXMoKSk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZUxpbmVGcm9tU2VsZWN0aW9uKGxpbmU6IEZvcm1Hcm91cCk6IHZvaWQge1xuICAgIGNvbnN0IGlkID0gdGhpcy5nZXRSb3dJZChsaW5lKTtcbiAgICBpZiAoaWQgJiYgdGhpcy5zZWxlY3RlZFJvd0lkcy5oYXMoaWQpKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkUm93SWRzLmRlbGV0ZShpZCk7XG4gICAgICB0aGlzLmVtaXRTZWxlY3Rpb25DaGFuZ2UoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFwcGx5VmFsdWVzVG9MaW5lKFxuICAgIGxpbmU6IEZvcm1Hcm91cCxcbiAgICB2YWx1ZXM6IHsgW2ZpZWxkOiBzdHJpbmddOiBhbnkgfSxcbiAgICBlbWl0RXZlbnQ6IGJvb2xlYW4sXG4gICk6IHZvaWQge1xuICAgIE9iamVjdC5rZXlzKHZhbHVlcykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICBsZXQgY29udHJvbCA9IGxpbmUuZ2V0KGtleSk7XG4gICAgICBpZiAoIWNvbnRyb2wpIHtcbiAgICAgICAgbGluZS5hZGRDb250cm9sKGtleSwgdGhpcy5mYi5jb250cm9sKHZhbHVlc1trZXldKSk7XG4gICAgICAgIGNvbnRyb2wgPSBsaW5lLmdldChrZXkpO1xuICAgICAgfVxuICAgICAgLy8g6Z2Z6buY6LWL5YC877yM6YG/5YWNIHZhbHVlQ2hhbmdlcyAvIERPTSBtYXhsZW5ndGgg5Zue5YaZ5oqK5qCh6aqM5oCB5omT5LmxXG4gICAgICBjb250cm9sLnNldFZhbHVlKHZhbHVlc1trZXldLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICBjb250cm9sLm1hcmtBc1ByaXN0aW5lKHsgb25seVNlbGY6IHRydWUgfSk7XG4gICAgICBjb250cm9sLm1hcmtBc1VudG91Y2hlZCh7IG9ubHlTZWxmOiB0cnVlIH0pO1xuICAgICAgY29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgIGlmIChlbWl0RXZlbnQpIHtcbiAgICAgICAgY29uc3QgZm9ybUl0ZW0gPSB0aGlzLmZvcm1MaW5lcy5maW5kKChpdGVtKSA9PiBpdGVtLm5hbWUgPT09IGtleSk7XG4gICAgICAgIGlmIChmb3JtSXRlbSAmJiBmb3JtSXRlbS5vbkNoYW5nZUV2ZW50KSB7XG4gICAgICAgICAgdGhpcy50cmlnZ2VyRXZlbnQoZm9ybUl0ZW0ub25DaGFuZ2VFdmVudCwgdmFsdWVzW2tleV0sIGxpbmUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIOS7heWcqOeUqOaIt+S6pOS6kuWQjuOAgeS4lOW9k+WJjeWAvOehruWunuS4uuepuueahCByZXF1aXJlZCDplJnor6/ml7blsZXnpLrnuqLmoYbvvIxcbiAgICog6YG/5YWN5om56YeP6LWL5YC85pe2IG5nLXpvcnJvIOaui+eVmeOAjOS4jeiDveS4uuepuuOAjeaPkOekulxuICAgKi9cbiAgZ2V0Q29udHJvbFZhbGlkYXRlU3RhdHVzKGxpbmU6IEZvcm1Hcm91cCwgZm9ybUl0ZW06IEZvcm1MaW5lKTogc3RyaW5nIHtcbiAgICBjb25zdCBjb250cm9sID0gbGluZS5nZXQoZm9ybUl0ZW0ubmFtZSk7XG4gICAgaWYgKCFjb250cm9sIHx8IGNvbnRyb2wuZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cbiAgICBjb25zdCBlbXB0eSA9XG4gICAgICBjb250cm9sLnZhbHVlID09PSBudWxsIHx8XG4gICAgICBjb250cm9sLnZhbHVlID09PSB1bmRlZmluZWQgfHxcbiAgICAgIGNvbnRyb2wudmFsdWUgPT09IFwiXCI7XG4gICAgaWYgKFxuICAgICAgKGNvbnRyb2wuZGlydHkgfHwgY29udHJvbC50b3VjaGVkKSAmJlxuICAgICAgZW1wdHkgJiZcbiAgICAgIGNvbnRyb2wuaGFzRXJyb3IoXCJyZXF1aXJlZFwiKVxuICAgICkge1xuICAgICAgcmV0dXJuIFwiZXJyb3JcIjtcbiAgICB9XG4gICAgcmV0dXJuIFwiXCI7XG4gIH1cblxuICAvKiog55So5oi36L6T5YWl5pe25oyJIG1heExlbmd0aCDmiKrmlq3vvIjkuI3kvb/nlKjljp/nlJ8gbWF4bGVuZ3Ro77yM6YG/5YWN5bmy5omw56iL5bqP5YyW6LWL5YC877yJICovXG4gIGxpbWl0SW5wdXRMZW5ndGgoZXZlbnQ6IEV2ZW50LCBsaW5lOiBGb3JtR3JvdXAsIGZvcm1JdGVtOiBGb3JtTGluZSk6IHZvaWQge1xuICAgIGlmICghZm9ybUl0ZW0gfHwgIWZvcm1JdGVtLm1heExlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpbnB1dCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgIGlmIChpbnB1dCAmJiBpbnB1dC52YWx1ZSAmJiBpbnB1dC52YWx1ZS5sZW5ndGggPiBmb3JtSXRlbS5tYXhMZW5ndGgpIHtcbiAgICAgIGNvbnN0IG5leHQgPSBpbnB1dC52YWx1ZS5zbGljZSgwLCBmb3JtSXRlbS5tYXhMZW5ndGgpO1xuICAgICAgaW5wdXQudmFsdWUgPSBuZXh0O1xuICAgICAgY29uc3QgY29udHJvbCA9IGxpbmUuZ2V0KGZvcm1JdGVtLm5hbWUpO1xuICAgICAgaWYgKGNvbnRyb2wpIHtcbiAgICAgICAgY29udHJvbC5zZXRWYWx1ZShuZXh0KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiog6I635Y+W5b2T5YmN5Yu+6YCJ5LiU5bey5oyC6L2955qE6KGMIEZvcm1Hcm91cO+8iOW9k+WJjeetm+mAiee7k+aenOWGhe+8iSAqL1xuICBwdWJsaWMgZ2V0U2VsZWN0ZWRMaW5lcygpOiBGb3JtR3JvdXBbXSB7XG4gICAgcmV0dXJuICh0aGlzLmxpbmVzRm9ybUFycmF5LmNvbnRyb2xzIGFzIEZvcm1Hcm91cFtdKS5maWx0ZXIoKGxpbmUpID0+XG4gICAgICB0aGlzLmlzTGluZUNoZWNrZWQobGluZSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5blhajpg6jli77pgInooYzmlbDmja7vvIjlkKvot6jpobXjgIHmkJzntKLlkI7mnKrlsZXnpLrkvYbku43li77pgInnmoTooYzvvIlcbiAgICovXG4gIHB1YmxpYyBnZXRTZWxlY3RlZExpbmVzRGF0YSgpOiBhbnlbXSB7XG4gICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgY29uc3QgbW91bnRlZEJ5SWQgPSBuZXcgTWFwPHN0cmluZywgYW55PigpO1xuICAgICh0aGlzLmxpbmVzRm9ybUFycmF5LmNvbnRyb2xzIGFzIEZvcm1Hcm91cFtdKS5mb3JFYWNoKChsaW5lKSA9PiB7XG4gICAgICBjb25zdCBpZCA9IHRoaXMuZ2V0Um93SWQobGluZSk7XG4gICAgICBpZiAoaWQgJiYgdGhpcy5zZWxlY3RlZFJvd0lkcy5oYXMoaWQpKSB7XG4gICAgICAgIG1vdW50ZWRCeUlkLnNldChpZCwgbGluZS5nZXRSYXdWYWx1ZSgpKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgICh0aGlzLnN0b3JlRm9ybUxpbmVzRGF0YSB8fCBbXSkuZm9yRWFjaCgoZGF0YSkgPT4ge1xuICAgICAgY29uc3QgaWQgPSBkYXRhICYmIGRhdGEuX2hkUm93SWQ7XG4gICAgICBpZiAoaWQgJiYgdGhpcy5zZWxlY3RlZFJvd0lkcy5oYXMoaWQpKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKG1vdW50ZWRCeUlkLmhhcyhpZCkgPyBtb3VudGVkQnlJZC5nZXQoaWQpIDogeyAuLi5kYXRhIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8g5YWc5bqV77ya5Yia5paw5aKe44CB5bCa5pyq6L+bIHN0b3JlIOeahOWLvumAieihjFxuICAgIHRoaXMuc2VsZWN0ZWRSb3dJZHMuZm9yRWFjaCgoaWQpID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgIXJlc3VsdC5zb21lKChpdGVtKSA9PiBpdGVtICYmIGl0ZW0uX2hkUm93SWQgPT09IGlkKSAmJlxuICAgICAgICBtb3VudGVkQnlJZC5oYXMoaWQpXG4gICAgICApIHtcbiAgICAgICAgcmVzdWx0LnB1c2gobW91bnRlZEJ5SWQuZ2V0KGlkKSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiDmibnph4/loavlhYXli77pgInooYzlrZfmrrXvvIjmlK/mjIHot6jpobXjgIHmkJzntKLlkI7mnKrlsZXnpLrkvYbku43li77pgInnmoTooYzvvIlcbiAgICogQHBhcmFtIHZhbHVlcyDopoHlhpnlhaXnmoTlrZfmrrXvvIzlpoIgeyByZW1hcms6ICfmibnph4/lpIfms6gnLCBwcmljZTogMTAgfVxuICAgKiBAcGFyYW0gZW1pdEV2ZW50IOaYr+WQpuinpuWPkSB2YWx1ZUNoYW5nZXMgLyBvbkNoYW5nZUV2ZW5077yM6buY6K6kIHRydWVcbiAgICogQHJldHVybnMg5a6e6ZmF5aGr5YWF55qE6KGM5pWwXG4gICAqL1xuICBwdWJsaWMgYmF0Y2hGaWxsU2VsZWN0ZWQoXG4gICAgdmFsdWVzOiB7IFtmaWVsZDogc3RyaW5nXTogYW55IH0sXG4gICAgZW1pdEV2ZW50OiBib29sZWFuID0gdHJ1ZSxcbiAgKTogbnVtYmVyIHtcbiAgICBpZiAoIXZhbHVlcyB8fCB0aGlzLnNlbGVjdGVkUm93SWRzLnNpemUgPT09IDApIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICBjb25zdCBtb3VudGVkQnlJZCA9IG5ldyBNYXA8c3RyaW5nLCBGb3JtR3JvdXA+KCk7XG4gICAgKHRoaXMubGluZXNGb3JtQXJyYXkuY29udHJvbHMgYXMgRm9ybUdyb3VwW10pLmZvckVhY2goKGxpbmUpID0+IHtcbiAgICAgIGNvbnN0IGlkID0gdGhpcy5nZXRSb3dJZChsaW5lKTtcbiAgICAgIGlmIChpZCkge1xuICAgICAgICBtb3VudGVkQnlJZC5zZXQoaWQsIGxpbmUpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgbGV0IGNvdW50ID0gMDtcbiAgICB0aGlzLnNlbGVjdGVkUm93SWRzLmZvckVhY2goKGlkKSA9PiB7XG4gICAgICBjb25zdCBsaW5lID0gbW91bnRlZEJ5SWQuZ2V0KGlkKTtcbiAgICAgIGlmIChsaW5lKSB7XG4gICAgICAgIHRoaXMuYXBwbHlWYWx1ZXNUb0xpbmUobGluZSwgdmFsdWVzLCBlbWl0RXZlbnQpO1xuICAgICAgICBjb3VudCsrO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyDlvZPliY3nrZvpgIkv6aG16Z2i5pyq5oyC6L2977ya55u05o6l5pS55oC75pWw5o2u77yM6YCA5Ye65pCc57Si5ZCO5Y+v6KeBXG4gICAgICBjb25zdCBzdG9yZUl0ZW0gPSAodGhpcy5zdG9yZUZvcm1MaW5lc0RhdGEgfHwgW10pLmZpbmQoXG4gICAgICAgIChkYXRhKSA9PiBkYXRhICYmIGRhdGEuX2hkUm93SWQgPT09IGlkLFxuICAgICAgKTtcbiAgICAgIGlmIChzdG9yZUl0ZW0pIHtcbiAgICAgICAgT2JqZWN0LmtleXModmFsdWVzKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICBzdG9yZUl0ZW1ba2V5XSA9IHZhbHVlc1trZXldO1xuICAgICAgICB9KTtcbiAgICAgICAgY291bnQrKztcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gY291bnQ7XG4gIH1cblxuICAvKiog5riF56m65Yu+6YCJICovXG4gIHB1YmxpYyBjbGVhclNlbGVjdGlvbigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZFJvd0lkcy5zaXplID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc2VsZWN0ZWRSb3dJZHMuY2xlYXIoKTtcbiAgICB0aGlzLmVtaXRTZWxlY3Rpb25DaGFuZ2UoKTtcbiAgfVxuXG4gIC8qKiDlvZPliY3li77pgInmlbDph4/vvIjlkKvot6jpobXjgIHmkJzntKLkv53nlZnvvIkgKi9cbiAgcHVibGljIGdldFNlbGVjdGVkQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZFJvd0lkcy5zaXplO1xuICB9XG5cbiAgLyoqIOaYr+WQpuWxleekuumhtumDqOW3peWFt+agjyAqL1xuICBnZXQgc2hvd1Rvb2xiYXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgICEhdGhpcy5zaG93U2VhcmNoIHx8XG4gICAgICAhIXRoaXMuc2hvd0NoZWNrYm94IHx8XG4gICAgICAhIXRoaXMuZm9ybUxpbmVzTGVmdEJ1dHRvbiB8fFxuICAgICAgISF0aGlzLmZvcm1MaW5lc1JpZ2h0QnV0dG9uIHx8XG4gICAgICB0aGlzLnNob3dDb2xTZXR0aW5nc0J1dHRvblxuICAgICk7XG4gIH1cblxuICAvKiog5piv5ZCm5bGV56S65YiX6K6+572u6b2/6L2u77yI5pyJ5Y+v6YWN572uIFZpZXdEb20g5pe277yJICovXG4gIGdldCBzaG93Q29sU2V0dGluZ3NCdXR0b24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgICEhdGhpcy5zaG93Q29sU2V0dGluZ3MgJiYgdGhpcy5nZXRDb25maWd1cmFibGVGb3JtTGluZXMoKS5sZW5ndGggPiAwXG4gICAgKTtcbiAgfVxuXG4gIC8qKiDliJfmmK/lkKbmuLLmn5PvvJpoaWRlIOawuOS4jeWxleekuu+8m1ZpZXdEb20g5Y+XIGlzU2hvdyDmjqfliLYgKi9cbiAgaXNDb2x1bW5WaXNpYmxlKGl0ZW06IEZvcm1MaW5lKTogYm9vbGVhbiB7XG4gICAgaWYgKCFpdGVtIHx8IGl0ZW0uaGlkZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoaXRlbS50eXBlID09PSBGb3JtTGluZVR5cGUuVmlld0RvbSkge1xuICAgICAgcmV0dXJuIGl0ZW0uaXNTaG93ICE9PSBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKiog5Y+v6L+b5YWl5YiX6K6+572u55qE5a2X5q6177ya6Z2eIGhpZGUg55qEIFZpZXdEb20gKi9cbiAgZ2V0Q29uZmlndXJhYmxlRm9ybUxpbmVzKCk6IEZvcm1MaW5lW10ge1xuICAgIGlmICghdGhpcy5mb3JtTGluZXMgfHwgIXRoaXMuZm9ybUxpbmVzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5mb3JtTGluZXMuZmlsdGVyKFxuICAgICAgKGl0ZW0pID0+IGl0ZW0udHlwZSA9PT0gRm9ybUxpbmVUeXBlLlZpZXdEb20gJiYgIWl0ZW0uaGlkZSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDYWNoZUtleSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHVzZXJDb2RlID1cbiAgICAgICh0aGlzLnVzZXJTZXNzaW9uICYmIHRoaXMudXNlclNlc3Npb24udXNlckNvZGUpIHx8IFwiZGV2XCI7XG4gICAgcmV0dXJuIChcbiAgICAgIFwiaGQtZm9ybS1saW5lc19cIiArXG4gICAgICB1c2VyQ29kZSArXG4gICAgICBcIl9cIiArXG4gICAgICB0aGlzLmxvY2FsdGlvblRtcCArXG4gICAgICBcIl9cIiArXG4gICAgICB0aGlzLnV1aWRcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0Q29sU2V0dGluZ3MoKTogdm9pZCB7XG4gICAgdGhpcy5jb2xzQ2FjaGVMb2FkZWQgPSBmYWxzZTtcbiAgICBpZiAoIXRoaXMuc2hvd0NvbFNldHRpbmdzIHx8ICF0aGlzLmZvcm1MaW5lcyB8fCAhdGhpcy5mb3JtTGluZXMubGVuZ3RoKSB7XG4gICAgICB0aGlzLnNldENvbHMoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnV1aWQpIHtcbiAgICAgIHRoaXMuc2V0Q29scygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmxvY2FsZm9yYWdlXG4gICAgICAucmVhZHkoKVxuICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICB0aGlzLmxvY2FsZm9yYWdlXG4gICAgICAgICAgLmdldEl0ZW0odGhpcy5nZXRDYWNoZUtleSgpKVxuICAgICAgICAgIC50aGVuKCh2YWx1ZTogRm9ybUxpbmVzQ2FjaGVPcHRpb24pID0+IHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSAmJiBBcnJheS5pc0FycmF5KHZhbHVlLmNvbHMpKSB7XG4gICAgICAgICAgICAgIHRoaXMuZm9ybUxpbmVzQ2FjaGVPcHRpb24gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgdGhpcy5jb2xzQ2FjaGVMb2FkZWQgPSB0cnVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5mb3JtTGluZXNDYWNoZU9wdGlvbiA9IG5ldyBGb3JtTGluZXNDYWNoZU9wdGlvbigpO1xuICAgICAgICAgICAgICB0aGlzLmNvbHNDYWNoZUxvYWRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zZXRDb2xzKCk7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5mb3JtTGluZXNDYWNoZU9wdGlvbiA9IG5ldyBGb3JtTGluZXNDYWNoZU9wdGlvbigpO1xuICAgICAgICAgICAgdGhpcy5jb2xzQ2FjaGVMb2FkZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuc2V0Q29scygpO1xuICAgICAgICAgIH0pO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoZSkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZyhcImxvY2FsZm9yYWdl5Yqg6L295byC5bi4XCIsIGUpO1xuICAgICAgICB0aGlzLmZvcm1MaW5lc0NhY2hlT3B0aW9uID0gbmV3IEZvcm1MaW5lc0NhY2hlT3B0aW9uKCk7XG4gICAgICAgIHRoaXMuY29sc0NhY2hlTG9hZGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc2V0Q29scygpO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGhhc0NvbHNDYWNoZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jb2xzQ2FjaGVMb2FkZWQgJiYgQXJyYXkuaXNBcnJheSh0aGlzLmZvcm1MaW5lc0NhY2hlT3B0aW9uLmNvbHMpO1xuICB9XG5cbiAgcHJpdmF0ZSBzYXZlRm9ybUxpbmVzQ2FjaGVPcHRpb24oKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnV1aWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5sb2NhbGZvcmFnZS5zZXRJdGVtKHRoaXMuZ2V0Q2FjaGVLZXkoKSwgdGhpcy5mb3JtTGluZXNDYWNoZU9wdGlvbik7XG4gIH1cblxuICAvKiog5oyJIGZvcm1MaW5lcyDljp/lp4vpobrluo/mjpLliJfoioLngrnvvIjnpoHmraLosIPluo/ml7bkv53mjIHmupDpobrluo/vvIkgKi9cbiAgcHJpdmF0ZSBzb3J0Tm9kZXNCeUZvcm1MaW5lc09yZGVyKG5vZGVzOiBUcmVlR3JpZFtdKTogVHJlZUdyaWRbXSB7XG4gICAgY29uc3Qgb3JkZXIgPSB0aGlzLmdldENvbmZpZ3VyYWJsZUZvcm1MaW5lcygpLm1hcCgoZikgPT4gZi5uYW1lKTtcbiAgICByZXR1cm4gbm9kZXMuc2xpY2UoKS5zb3J0KChhLCBiKSA9PiB7XG4gICAgICByZXR1cm4gb3JkZXIuaW5kZXhPZihhLmtleSkgLSBvcmRlci5pbmRleE9mKGIua2V5KTtcbiAgICB9KTtcbiAgfVxuXG4gIHNldENvbHMoKTogdm9pZCB7XG4gICAgdGhpcy5zaG93TGlzdE5vZGVzID0gZmFsc2U7XG4gICAgdGhpcy5ub3dMaXN0Tm9kZXMgPSBbXTtcbiAgICB0aGlzLmhpZGVMaXN0Tm9kZXMgPSBbXTtcbiAgICBjb25zdCBjb25maWd1cmFibGUgPSB0aGlzLmdldENvbmZpZ3VyYWJsZUZvcm1MaW5lcygpO1xuICAgIGNvbnN0IGhhc0NhY2hlID0gdGhpcy5oYXNDb2xzQ2FjaGUoKTtcbiAgICBjb25maWd1cmFibGUuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgaWYgKGhhc0NhY2hlKSB7XG4gICAgICAgIGVsZW1lbnQuaXNTaG93ID0gdGhpcy5mb3JtTGluZXNDYWNoZU9wdGlvbi5jb2xzLmluY2x1ZGVzKGVsZW1lbnQubmFtZSk7XG4gICAgICB9IGVsc2UgaWYgKGVsZW1lbnQuaXNTaG93ID09PSB1bmRlZmluZWQgfHwgZWxlbWVudC5pc1Nob3cgPT09IG51bGwpIHtcbiAgICAgICAgZWxlbWVudC5pc1Nob3cgPSB0cnVlO1xuICAgICAgfVxuICAgICAgY29uc3Qgbm9kZTogVHJlZUdyaWQgPSB7XG4gICAgICAgIHRpdGxlOiBlbGVtZW50LmxhYmVsLFxuICAgICAgICBrZXk6IGVsZW1lbnQubmFtZSxcbiAgICAgICAgY2hlY2tlZDogZWxlbWVudC5pc1Nob3cgIT09IGZhbHNlLFxuICAgICAgICBkaXNhYmxlZDogZmFsc2UsXG4gICAgICB9O1xuICAgICAgaWYgKGVsZW1lbnQuaXNTaG93ICE9PSBmYWxzZSkge1xuICAgICAgICB0aGlzLm5vd0xpc3ROb2Rlcy5wdXNoKG5vZGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5oaWRlTGlzdE5vZGVzLnB1c2gobm9kZSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5ub3dMaXN0Tm9kZXMgPSB0aGlzLnNvcnROb2Rlc0J5Rm9ybUxpbmVzT3JkZXIodGhpcy5ub3dMaXN0Tm9kZXMpO1xuICAgIHRoaXMuaGlkZUxpc3ROb2RlcyA9IHRoaXMuc29ydE5vZGVzQnlGb3JtTGluZXNPcmRlcih0aGlzLmhpZGVMaXN0Tm9kZXMpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5zaG93TGlzdE5vZGVzID0gdHJ1ZTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH0sIDApO1xuICB9XG5cbiAgY2FuY2VsRHJvcGRvd24oKTogdm9pZCB7XG4gICAgdGhpcy5pc0Ryb3Bkb3duVmlzaWJsZSA9IGZhbHNlO1xuICAgIHRoaXMuaGlkZUxpc3ROb2RlcyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5jYW5jZWxIaWRlTGlzdE5vZGVzKSk7XG4gICAgdGhpcy5ub3dMaXN0Tm9kZXMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuY2FuY2VsTm93TGlzdE5vZGVzKSk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBjb25maXJtRHJvcGRvd24oKTogdm9pZCB7XG4gICAgdGhpcy5jYW5jZWxIaWRlTGlzdE5vZGVzID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLmhpZGVMaXN0Tm9kZXMpKTtcbiAgICB0aGlzLmNhbmNlbE5vd0xpc3ROb2RlcyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5ub3dMaXN0Tm9kZXMpKTtcbiAgICB0aGlzLmlzRHJvcGRvd25WaXNpYmxlID0gdHJ1ZTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHN1Ym1pdEdyaWRzKCk6IHZvaWQge1xuICAgIGNvbnN0IHZpc2libGVOYW1lcyA9IHRoaXMubm93TGlzdE5vZGVzLm1hcCgoaXRlbSkgPT4gaXRlbS5rZXkpO1xuICAgIHRoaXMuZ2V0Q29uZmlndXJhYmxlRm9ybUxpbmVzKCkuZm9yRWFjaCgobGluZSkgPT4ge1xuICAgICAgbGluZS5pc1Nob3cgPSB2aXNpYmxlTmFtZXMuaW5jbHVkZXMobGluZS5uYW1lKTtcbiAgICB9KTtcbiAgICB0aGlzLmZvcm1MaW5lc0NhY2hlT3B0aW9uLmNvbHMgPSB2aXNpYmxlTmFtZXM7XG4gICAgdGhpcy5jb2xzQ2FjaGVMb2FkZWQgPSB0cnVlO1xuICAgIHRoaXMuc2F2ZUZvcm1MaW5lc0NhY2hlT3B0aW9uKCk7XG4gICAgdGhpcy5pc0Ryb3Bkb3duVmlzaWJsZSA9IGZhbHNlO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLyoqIOWLvumAiS/lj5bmtojvvJrku4XlnKjmmL7npLov6ZqQ6JeP5Lik57uE6Ze056e75Yqo77yM5LiN5pS55Y+YIGZvcm1MaW5lcyDpobrluo8gKi9cbiAgY2hlY2tBY3Rpb24oZXZlbnQ6IE56Rm9ybWF0RW1pdEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKGV2ZW50Lm5vZGUub3JpZ2luLmNoZWNrZWQpIHtcbiAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLmhpZGVMaXN0Tm9kZXMuZmluZCgoaXRlbSkgPT4ge1xuICAgICAgICByZXR1cm4gaXRlbS5rZXkgPT09IGV2ZW50Lm5vZGUub3JpZ2luLmtleTtcbiAgICAgIH0pO1xuICAgICAgaWYgKCFub2RlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIG5vZGUuY2hlY2tlZCA9IHRydWU7XG4gICAgICB0aGlzLmhpZGVMaXN0Tm9kZXMgPSB0aGlzLmhpZGVMaXN0Tm9kZXMuZmlsdGVyKChpdGVtKSA9PiB7XG4gICAgICAgIHJldHVybiBpdGVtLmtleSAhPT0gZXZlbnQubm9kZS5vcmlnaW4ua2V5O1xuICAgICAgfSk7XG4gICAgICB0aGlzLm5vd0xpc3ROb2RlcyA9IHRoaXMuc29ydE5vZGVzQnlGb3JtTGluZXNPcmRlcihcbiAgICAgICAgdGhpcy5ub3dMaXN0Tm9kZXMuY29uY2F0KFtub2RlXSksXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB0ZW1wb3JhcnlOb2RlTGlzdCA9IHRoaXMuaGlkZUxpc3ROb2Rlcy5zbGljZSgwKTtcbiAgICAgIHRoaXMubm93TGlzdE5vZGVzLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgaWYgKGl0ZW0ua2V5ID09PSBldmVudC5ub2RlLm9yaWdpbi5rZXkpIHtcbiAgICAgICAgICBjb25zdCBpbm5lckl0ZW0gPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGl0ZW0pKTtcbiAgICAgICAgICBpbm5lckl0ZW0uY2hlY2tlZCA9IGZhbHNlO1xuICAgICAgICAgIHRlbXBvcmFyeU5vZGVMaXN0LnB1c2goaW5uZXJJdGVtKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLmhpZGVMaXN0Tm9kZXMgPSB0aGlzLnNvcnROb2Rlc0J5Rm9ybUxpbmVzT3JkZXIodGVtcG9yYXJ5Tm9kZUxpc3QpO1xuICAgICAgdGhpcy5ub3dMaXN0Tm9kZXMgPSB0aGlzLm5vd0xpc3ROb2Rlcy5maWx0ZXIoKGl0ZW0pID0+IHtcbiAgICAgICAgcmV0dXJuIGl0ZW0ua2V5ICE9PSBldmVudC5ub2RlLm9yaWdpbi5rZXk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBzZXRBY3RpdmVTZWxlY3RlZENvbXBvbmVudE9wZW4odmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmFjdGl2ZVNlbGVjdGVkQ29tcG9uZW50T3BlbiA9IHZhbHVlO1xuICAgIGlmICh2YWx1ZSA9PT0gdHJ1ZSkge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGRvbUxpc3QgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFxuICAgICAgICAgIFwiLmFudC1zZWxlY3QtZHJvcGRvd24uaGQtc2VsZWN0LXRhYmxlXCIsXG4gICAgICAgICk7XG4gICAgICAgIGlmIChkb21MaXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCBkb20gPSBkb21MaXN0WzBdO1xuICAgICAgICAgIGRvbVxuICAgICAgICAgICAgLnF1ZXJ5U2VsZWN0b3JBbGwoXCIuaGQtb3B0aW9uLWhlYWRlclwiKVxuICAgICAgICAgICAgLmZvckVhY2goKGhlYWRlcikgPT4gaGVhZGVyLnJlbW92ZSgpKTtcbiAgICAgICAgICBjb25zdCBvbGRJbmRleCA9IHRoaXMuZ2V0T2xkRG9tSW5kZXgodGhpcy5hY3RpdmVEb21ZLCB0aGlzLmZvcm1MaW5lcyk7XG4gICAgICAgICAgZG9tLmluc2VydEJlZm9yZShcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlRE9NU3RydWN0dXJlKFxuICAgICAgICAgICAgICB0aGlzLmZvcm1MaW5lc1tvbGRJbmRleF0sXG4gICAgICAgICAgICAgIHRoaXMubGluZXNGb3JtQXJyYXkuY29udHJvbHMuc2xpY2UoXG4gICAgICAgICAgICAgICAgKHRoaXMucGFnaW5hdGlvblBhZ2VJbmRleCAtIDEpICogdGhpcy5wYWdpbmF0aW9uUGFnZVNpemUsXG4gICAgICAgICAgICAgICAgKHRoaXMucGFnaW5hdGlvblBhZ2VJbmRleCAtIDEpICogdGhpcy5wYWdpbmF0aW9uUGFnZVNpemUgK1xuICAgICAgICAgICAgICAgICAgdGhpcy5wYWdpbmF0aW9uUGFnZVNpemUsXG4gICAgICAgICAgICAgIClbdGhpcy5hY3RpdmVEb21YXSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBkb20uZmlyc3RDaGlsZCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9LCAwKTtcbiAgICB9XG4gIH1cblxuICBnZXRTZWxlY3RUYWJsZUNvbHVtblN0eWxlKGNvbHVtbjogU2VsZWN0T3B0aW9uVGFibGVDb2x1bW4pOiB7XG4gICAgW2tleTogc3RyaW5nXTogc3RyaW5nO1xuICB9IHtcbiAgICBpZiAoIWNvbHVtbiB8fCAhY29sdW1uLndpZHRoKSB7XG4gICAgICByZXR1cm4geyB3aWR0aDogXCJ1bnNldFwiIH07XG4gICAgfVxuICAgIHJldHVybiB7IHdpZHRoOiBgJHtjb2x1bW4ud2lkdGh9cHhgIH07XG4gIH1cblxuICBjcmVhdGVET01TdHJ1Y3R1cmUoZm9ybUl0ZW0sIGxpbmUpIHtcbiAgICAvLyDliJvlu7rlpJbpg6ggZGl2XG4gICAgY29uc3QgaGRPcHRpb25IZWFkZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIGhkT3B0aW9uSGVhZGVyLmNsYXNzTmFtZSA9IFwiaGQtb3B0aW9uLWhlYWRlclwiO1xuICAgIGhkT3B0aW9uSGVhZGVyLnN0eWxlLnBhZGRpbmdMZWZ0ID0gYCR7U0VMRUNUX1RBQkxFX09QVElPTl9IT1JJWk9OVEFMX1BBRERJTkd9cHhgO1xuICAgIGhkT3B0aW9uSGVhZGVyLnN0eWxlLnBhZGRpbmdSaWdodCA9IGAke1NFTEVDVF9UQUJMRV9PUFRJT05fSE9SSVpPTlRBTF9QQURESU5HfXB4YDtcblxuICAgIC8vIOajgOafpeadoeS7tu+8jOehruWumuaYr+WQpuimgeWIm+W7uuWtkOWFg+e0oFxuICAgIC8vIGNvbnN0IHNlbGVjdExpc3RMZW5ndGggPSAoZm9ybUl0ZW0gJiYgZm9ybUl0ZW0uc2VsZWN0T3B0aW9uICYmIGZvcm1JdGVtLnNlbGVjdE9wdGlvbi5zZWxlY3RMaXN0ICYmIGZvcm1JdGVtLnNlbGVjdE9wdGlvbi5zZWxlY3RMaXN0Lmxlbmd0aCkgfHwgMDtcbiAgICAvLyBpZlxuICAgIC8vIGNvbnN0IGxpbmVWYWx1ZUxlbmd0aCA9IChsaW5lLmdldChmb3JtSXRlbS5zZWxlY3RPcHRpb24uc2VsZWN0TGlzdE5hbWUpICYmIGxpbmUuZ2V0KGZvcm1JdGVtLnNlbGVjdE9wdGlvbi5zZWxlY3RMaXN0TmFtZSkudmFsdWUgJiYgbGluZS5nZXQoZm9ybUl0ZW0uc2VsZWN0T3B0aW9uLnNlbGVjdExpc3ROYW1lKS52YWx1ZS5sZW5ndGgpIHx8IDA7XG5cbiAgICAvLyBpZiAoc2VsZWN0TGlzdExlbmd0aCA+IDAgfHwgbGluZVZhbHVlTGVuZ3RoID4gMCkge1xuICAgIC8vIOmBjeWOhiB0YWJsZUNvbHVtbnMg5Yib5bu65YaF6YOo5YiXIGRpdlxuICAgIGZvcm1JdGVtLnNlbGVjdE9wdGlvbi50YWJsZUNvbHVtbnMuZm9yRWFjaCgoc2VsZWN0T3B0aW9uVGFibGVDb2x1bW4pID0+IHtcbiAgICAgIGNvbnN0IGNvbHVtbkRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICBjb2x1bW5EaXYuY2xhc3NOYW1lID0gXCJoZC1vcHRpb24taGVhZGVyLWNvbHVtblwiO1xuXG4gICAgICBjb25zdCB3aWR0aFN0eWxlID0gdGhpcy5nZXRTZWxlY3RUYWJsZUNvbHVtblN0eWxlKFxuICAgICAgICBzZWxlY3RPcHRpb25UYWJsZUNvbHVtbixcbiAgICAgICk7XG4gICAgICBjb2x1bW5EaXYuc3R5bGUud2lkdGggPSB3aWR0aFN0eWxlLndpZHRoO1xuXG4gICAgICAvLyDmt7vliqDliJfmoIfnrb7lhoXlrrlcbiAgICAgIGlmIChzZWxlY3RPcHRpb25UYWJsZUNvbHVtbi5sYWJlbCkge1xuICAgICAgICBjb25zdCBsYWJlbFRleHQgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShcbiAgICAgICAgICBzZWxlY3RPcHRpb25UYWJsZUNvbHVtbi5sYWJlbCxcbiAgICAgICAgKTtcbiAgICAgICAgY29sdW1uRGl2LmFwcGVuZENoaWxkKGxhYmVsVGV4dCk7XG4gICAgICB9XG5cbiAgICAgIC8vIOa3u+WKoOWIlyBkaXYg5Yiw5aSW6YOoIGRpdlxuICAgICAgaGRPcHRpb25IZWFkZXIuYXBwZW5kQ2hpbGQoY29sdW1uRGl2KTtcbiAgICB9KTtcbiAgICAvLyB9XG5cbiAgICByZXR1cm4gaGRPcHRpb25IZWFkZXI7XG4gIH1cblxuICBjb2xsZWN0RG9tRGF0YSgpIHtcbiAgICB0aGlzLmNvbGxlY3REb21MaXN0ID0gW107XG4gICAgY29uc3QgcGFnZURvbUxpc3QgPSB0aGlzLmZvcm1JbnB1dERvbUxpc3QudG9BcnJheSgpO1xuICAgIC8vIFN0ZXAgMTog6I635Y+W5b2T5YmN6aG155qE5pWw5o2u6YePXG4gICAgY29uc3Qgc3RhcnRJbmRleCA9ICh0aGlzLnBhZ2luYXRpb25QYWdlSW5kZXggLSAxKSAqIHRoaXMucGFnaW5hdGlvblBhZ2VTaXplO1xuICAgIGNvbnN0IGVuZEluZGV4ID0gdGhpcy5wYWdpbmF0aW9uUGFnZUluZGV4ICogdGhpcy5wYWdpbmF0aW9uUGFnZVNpemU7XG4gICAgY29uc3QgYWRqdXN0ZWRFbmRJbmRleCA9XG4gICAgICBlbmRJbmRleCA+IHRoaXMuZm9ybUxpbmVzTGVuZ3RoID8gdGhpcy5mb3JtTGluZXNMZW5ndGggOiBlbmRJbmRleDtcbiAgICBjb25zdCBwYWdlTGluZXNMZW5ndGggPSBhZGp1c3RlZEVuZEluZGV4IC0gc3RhcnRJbmRleDtcblxuICAgIGNvbnN0IGludGVydmFsID0gcGFnZURvbUxpc3QubGVuZ3RoIC8gcGFnZUxpbmVzTGVuZ3RoO1xuICAgIC8vIFN0ZXAgMjog5ouG5YiGZm9ybUlucHV0RG9tTGlzdFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFnZUxpbmVzTGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuY29sbGVjdERvbUxpc3QucHVzaChwYWdlRG9tTGlzdC5zcGxpY2UoMCwgaW50ZXJ2YWwpKTtcbiAgICB9XG4gICAgdGhpcy5kaXNhYmxlSW5wdXROdW1iZXJLZXlib2FyZFN0ZXAoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBuZy16b3JybyA4IOWcqCBpbnB1dCDnmoQgb25LZXlEb3duIOmHjOeUqOS4iuS4i+mUruiwgyB1cCgpL2Rvd24oKSDmlLkgc3RlcOOAglxuICAgKiDlj6ropobnm5Ygb25LZXlEb3du77yI5LiN5YqoIHVwL2Rvd27vvInvvIzplK7nm5jmlrnlkJHplK7kuqTnu5nooajljZXot7PovazvvIwrLy0g5oyJ6ZKu5LuN5Y+v55So44CCXG4gICAqL1xuICBwcml2YXRlIGRpc2FibGVJbnB1dE51bWJlcktleWJvYXJkU3RlcCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZW5hYmxlS2V5Ym9hcmRPcGVyYXRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jb2xsZWN0RG9tTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB0aGlzLmNvbGxlY3REb21MaXN0W2ldLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIGNvbnN0IGRvbSA9IHRoaXMuY29sbGVjdERvbUxpc3RbaV1bal07XG4gICAgICAgIGlmIChkb20gaW5zdGFuY2VvZiBOeklucHV0TnVtYmVyQ29tcG9uZW50KSB7XG4gICAgICAgICAgZG9tLm9uS2V5RG93biA9IChlOiBLZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAoZS5rZXlDb2RlID09PSAzOCB8fCBlLmtleUNvZGUgPT09IDQwKSB7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlLmtleUNvZGUgPT09IDEzKSB7XG4gICAgICAgICAgICAgIGRvbS5zZXRWYWxpZGF0ZVZhbHVlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIOiBmueEpuS4i+S4gOS4qmRvbVxuICBqdW1wVG9OZXh0SW5wdXQoeDogbnVtYmVyLCB5OiBudW1iZXIpIHtcbiAgICBpZiAoXG4gICAgICB4ID09PSBudWxsIHx8XG4gICAgICB5ID09PSBudWxsIHx8XG4gICAgICAhdGhpcy5jb2xsZWN0RG9tTGlzdCB8fFxuICAgICAgdGhpcy5jb2xsZWN0RG9tTGlzdC5sZW5ndGggPT09IDBcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8g5aaC5p6c5piv5pyA5ZCO5LiA5Liq5Y+v6L6T5YWl5YWD57Sg77yM5paw5aKe6KGMXG4gICAgaWYgKFxuICAgICAgISh0aGlzLmFjdGl2ZURvbSBpbnN0YW5jZW9mIE56U2VsZWN0Q29tcG9uZW50KSAmJlxuICAgICAgeCA9PT0gdGhpcy5jb2xsZWN0RG9tTGlzdC5sZW5ndGggLSAxICYmXG4gICAgICB5ID09PSB0aGlzLmNvbGxlY3REb21MaXN0WzBdLmxlbmd0aCAtIDFcbiAgICApIHtcbiAgICAgIHRoaXMuYWRkTmV3TGluZUFuZEZvY3VzKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh5ID09PSB0aGlzLmNvbGxlY3REb21MaXN0WzBdLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgY29uc29sZS5sb2coXCLmiafooYzov4fnqIsxXCIpO1xuICAgICAgICAvLyDlpoLmnpzmmK/mnIDlkI7kuIDliJfvvIzliJnot7PovazliLDkuIvkuIDooYznrKzkuIDkuKrovpPlhaXmoYZcbiAgICAgICAgdGhpcy5mb2N1c0RvbSh4ICsgMSwgMCwgXCJyaWdodFwiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwi5omn6KGM6L+H56iLMlwiKTtcbiAgICAgICAgLy8g5aaC5p6c5LiN5piv5pyA5ZCO5LiA5YiX77yM5YiZ6Lez6L2s5Yiw5b2T5YmN6KGM5LiL5LiA5Liq6L6T5YWl5qGGXG4gICAgICAgIHRoaXMuZm9jdXNEb20oeCwgeSArIDEsIFwicmlnaHRcIik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOWinuWKoOaWsOihjOW5tuS4lOiBmueEpuWIsOesrOS4gOS4quWFg+e0oO+8jFxuICAgKiDov5nph4zopoHms6jmhI/vvIzlpoLmnpzlrZjlnKjnv7vpobXmg4XlhrXvvIzpnIDopoHlpITnkIZcbiAgICovXG4gIGFkZE5ld0xpbmVBbmRGb2N1cygpIHtcbiAgICAvLyDlvZPliY3ooYzkuLrlvZPliY3pobXmnIDlkI7kuIDooYznmoTml7blgJnvvIzliKTmlq3kuIvkuIDpobXmmK/lkKbmnInmlbDmja5cbiAgICAvLyAx44CB5aaC5p6c5pyJ77ya57+76aG1K+iBmueEpuesrOS4gOihjOesrOS4gOS4quWFg+e0oFxuICAgIC8vIDLjgIHlpoLmnpzmsqHmnInvvJrmlrDlop7ooYwr57+76aG1K+iBmueEpuesrOS4gOihjOesrOS4gOS4quWFg+e0oFxuICAgIGlmICh0aGlzLmFjdGl2ZURvbVggPT09IHRoaXMucGFnaW5hdGlvblBhZ2VTaXplIC0gMSkge1xuICAgICAgLy8g5Yik5pat5LiL5LiA6aG15piv5ZCm5pyJ5pWw5o2uXG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMucGFnaW5hdGlvblBhZ2VJbmRleCA8XG4gICAgICAgIE1hdGguY2VpbCh0aGlzLmZvcm1MaW5lc0xlbmd0aCAvIHRoaXMucGFnaW5hdGlvblBhZ2VTaXplKVxuICAgICAgKSB7XG4gICAgICAgIC8vIOe/u+mhtSvogZrnhKbnrKzkuIDooYznrKzkuIDkuKrlhYPntKBcbiAgICAgICAgdGhpcy5wYWdpbmF0aW9uUGFnZUluZGV4Kys7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuY29sbGVjdERvbURhdGEoKTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIuaJp+ihjOi/h+eoizNcIik7XG4gICAgICAgICAgdGhpcy5mb2N1c0RvbSgwLCAwLCBcInJpZ2h0XCIpO1xuICAgICAgICB9LCAwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIOaWsOWinuihjCvnv7vpobUr6IGa54Sm56ys5LiA6KGM56ys5LiA5Liq5YWD57SgXG4gICAgICAgIHRoaXMuYWRkRm9ybUxpbmUoKTtcbiAgICAgICAgdGhpcy5wYWdpbmF0aW9uUGFnZUluZGV4Kys7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuY29sbGVjdERvbURhdGEoKTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIuaJp+ihjOi/h+eoizRcIik7XG4gICAgICAgICAgdGhpcy5mb2N1c0RvbSgwLCAwKTtcbiAgICAgICAgfSwgMCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYWRkRm9ybUxpbmUoKTtcbiAgICB9XG4gIH1cblxuICAvLyDogZrnhKbliLDkuIrkuIDkuKpkb21cbiAganVtcFRvUHJldklucHV0KHg6IG51bWJlciwgeTogbnVtYmVyKSB7XG4gICAgaWYgKFxuICAgICAgeCA9PT0gbnVsbCB8fFxuICAgICAgeSA9PT0gbnVsbCB8fFxuICAgICAgIXRoaXMuY29sbGVjdERvbUxpc3QgfHxcbiAgICAgIHRoaXMuY29sbGVjdERvbUxpc3QubGVuZ3RoID09PSAwXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh4ID09PSAwICYmIHkgPT09IDApIHtcbiAgICAgIC8vIOWmguaenOaYr+esrOS4gOS4quWPr+i+k+WFpeWFg+e0oO+8jCDliKTmlq3mmK/lkKbmnInkuIrkuIDpobXvvIwg5aaC5p6c5pyJ77yM5YiZ57+76aG1K+iBmueEpuWIsOS4iuS4gOmhteacgOWQjuS4gOS4quWFg+e0oFxuICAgICAgaWYgKHRoaXMucGFnaW5hdGlvblBhZ2VJbmRleCA+IDEpIHtcbiAgICAgICAgLy8g57+76aG1K+iBmueEpuWIsOS4iuS4gOmhteacgOWQjuS4gOS4quWFg+e0oFxuICAgICAgICB0aGlzLnBhZ2luYXRpb25QYWdlSW5kZXgtLTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5jb2xsZWN0RG9tRGF0YSgpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKFwi5omn6KGM6L+H56iLNVwiKTtcbiAgICAgICAgICB0aGlzLmZvY3VzRG9tKFxuICAgICAgICAgICAgdGhpcy5jb2xsZWN0RG9tTGlzdC5sZW5ndGggLSAxLFxuICAgICAgICAgICAgdGhpcy5jb2xsZWN0RG9tTGlzdFswXS5sZW5ndGggLSAxLFxuICAgICAgICAgICk7XG4gICAgICAgIH0sIDApO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoeSA9PT0gMCkge1xuICAgICAgICBjb25zb2xlLmxvZyhcIuaJp+ihjOi/h+eoizZcIik7XG4gICAgICAgIC8vIOWmguaenOaYr+esrOS4gOWIl++8jOWImei3s+i9rOWIsOS4iuS4gOihjOacgOWQjuS4gOS4qui+k+WFpeahhlxuICAgICAgICB0aGlzLmZvY3VzRG9tKHggLSAxLCB0aGlzLmNvbGxlY3REb21MaXN0WzBdLmxlbmd0aCAtIDEsIFwibGVmdFwiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwi5omn6KGM6L+H56iLN1wiKTtcbiAgICAgICAgLy8g5aaC5p6c5LiN5piv56ys5LiA5YiX77yM5YiZ6Lez6L2s5Yiw5b2T5YmN6KGM5LiK5LiA5Liq6L6T5YWl5qGGXG4gICAgICAgIHRoaXMuZm9jdXNEb20oeCwgeSAtIDEsIFwibGVmdFwiKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog6IGa54Sm5Yiw5p+Q5LiqZG9tXG4gICAqIEBwYXJhbSB4IOWdkOagh3hcbiAgICogQHBhcmFtIHkg5Z2Q5qCHeVxuICAgKiBAcGFyYW0ganVtcERpcmVjdGlvbiDot7PovazmlrnlkJFcbiAgICovXG4gIGZvY3VzRG9tKHg6IG51bWJlciwgeTogbnVtYmVyLCBqdW1wRGlyZWN0aW9uOiBzdHJpbmcgPSBcInJpZ2h0XCIpIHtcbiAgICBpZiAoXG4gICAgICB4ID09PSBudWxsIHx8XG4gICAgICB5ID09PSBudWxsIHx8XG4gICAgICAhdGhpcy5jb2xsZWN0RG9tTGlzdCB8fFxuICAgICAgdGhpcy5jb2xsZWN0RG9tTGlzdC5sZW5ndGggPT09IDBcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8g5YWI5riF6Zmk5LiA5LiL5b2T5YmN55qE54Sm54K5XG4gICAgdGhpcy5jbGVhbkZvY3VzRG9tKHRoaXMuYWN0aXZlRG9tWCwgdGhpcy5hY3RpdmVEb21ZKTtcbiAgICBpZiAodGhpcy5jb2xsZWN0RG9tTGlzdFt4XSAmJiB0aGlzLmNvbGxlY3REb21MaXN0W3hdW3ldKSB7XG4gICAgICBjb25zdCBkb20gPSB0aGlzLmNvbGxlY3REb21MaXN0W3hdW3ldO1xuICAgICAgLy8g6ZyA6KaB5Yik5pat5LiL5LiA5LiqZm9jdXPnmoRkb23mmK/lkKbmmK/npoHnlKjnirbmgIHvvIzlpoLmnpzmmK/npoHnlKjnirbmgIHpnIDopoHot7Pov4dcbiAgICAgIGlmIChkb20gaW5zdGFuY2VvZiBOelNlbGVjdENvbXBvbmVudCkge1xuICAgICAgICBpZiAoZG9tLm56RGlzYWJsZWQpIHtcbiAgICAgICAgICBpZiAoanVtcERpcmVjdGlvbiA9PT0gXCJyaWdodFwiKSB7XG4gICAgICAgICAgICB0aGlzLmp1bXBUb05leHRJbnB1dCh4LCB5KTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGp1bXBEaXJlY3Rpb24gPT09IFwibGVmdFwiKSB7XG4gICAgICAgICAgICB0aGlzLmp1bXBUb1ByZXZJbnB1dCh4LCB5KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGRvbS5uelNlbGVjdFRvcENvbnRyb2xDb21wb25lbnQuaW5wdXRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuc2Nyb2xsSW50b1ZpZXcoXG4gICAgICAgICAgeyBiZWhhdmlvcjogXCJzbW9vdGhcIiwgYmxvY2s6IFwiY2VudGVyXCIsIGlubGluZTogXCJjZW50ZXJcIiB9LFxuICAgICAgICApO1xuICAgICAgICAvLyDov5nph4zlpJrpgInmoYbpnIDopoHpop3lpJblpITnkIbkuIvvvIzlm6DkuLrlkJHkuIvnmoTml7blgJnkvJrop6blj5HlhoXpg6hJbnB1dOeahOiBmueEpu+8jOaKiuS4i+S4gOS4qmRvbeeahGZvY3Vz5pS+5Yiw5a6P5Lu75Yqh5Lit77yM5bu26L+f5aSE55CG44CCXG4gICAgICAgIGlmIChkb20ubnpTZWxlY3RTZXJ2aWNlLm1vZGUgPT09IFwibXVsdGlwbGVcIikge1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgZG9tLmZvY3VzKCk7XG4gICAgICAgICAgfSwgMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZG9tLmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZG9tIGluc3RhbmNlb2YgTnpJbnB1dE51bWJlckNvbXBvbmVudCkge1xuICAgICAgICBpZiAoZG9tLm56RGlzYWJsZWQpIHtcbiAgICAgICAgICBpZiAoanVtcERpcmVjdGlvbiA9PT0gXCJyaWdodFwiKSB7XG4gICAgICAgICAgICB0aGlzLmp1bXBUb05leHRJbnB1dCh4LCB5KTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGp1bXBEaXJlY3Rpb24gPT09IFwibGVmdFwiKSB7XG4gICAgICAgICAgICB0aGlzLmp1bXBUb1ByZXZJbnB1dCh4LCB5KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGlucHV0RG9tOiBhbnkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChkb20ubnpJZCk7XG4gICAgICAgIGlucHV0RG9tLmZvY3VzKCk7XG4gICAgICAgIGlucHV0RG9tLnNjcm9sbEludG9WaWV3KHtcbiAgICAgICAgICBiZWhhdmlvcjogXCJzbW9vdGhcIixcbiAgICAgICAgICBibG9jazogXCJjZW50ZXJcIixcbiAgICAgICAgICBpbmxpbmU6IFwiY2VudGVyXCIsXG4gICAgICAgIH0pO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBpbnB1dERvbS5zZWxlY3QoKTtcbiAgICAgICAgfSwgMCk7XG4gICAgICB9IGVsc2UgaWYgKGRvbSBpbnN0YW5jZW9mIEVsZW1lbnRSZWYpIHtcbiAgICAgICAgaWYgKGRvbS5uYXRpdmVFbGVtZW50LmRpc2FibGVkKSB7XG4gICAgICAgICAgaWYgKGp1bXBEaXJlY3Rpb24gPT09IFwicmlnaHRcIikge1xuICAgICAgICAgICAgdGhpcy5qdW1wVG9OZXh0SW5wdXQoeCwgeSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChqdW1wRGlyZWN0aW9uID09PSBcImxlZnRcIikge1xuICAgICAgICAgICAgdGhpcy5qdW1wVG9QcmV2SW5wdXQoeCwgeSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBkb20ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICBkb20ubmF0aXZlRWxlbWVudC5zY3JvbGxJbnRvVmlldyh7XG4gICAgICAgICAgYmVoYXZpb3I6IFwic21vb3RoXCIsXG4gICAgICAgICAgYmxvY2s6IFwiY2VudGVyXCIsXG4gICAgICAgICAgaW5saW5lOiBcImNlbnRlclwiLFxuICAgICAgICB9KTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgZG9tLm5hdGl2ZUVsZW1lbnQuc2VsZWN0KCk7XG4gICAgICAgIH0sIDApO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgZG9tIGluc3RhbmNlb2YgTnpEYXRlUGlja2VyQ29tcG9uZW50IHx8XG4gICAgICAgIGRvbSBpbnN0YW5jZW9mIE56UmFuZ2VQaWNrZXJDb21wb25lbnQgfHxcbiAgICAgICAgZG9tIGluc3RhbmNlb2YgTnpUaW1lUGlja2VyQ29tcG9uZW50XG4gICAgICApIHtcbiAgICAgICAgLy8gVE9ETzrlnKhuZ3pvcnJvOC41LnjniYjmnKzvvIzml7bpl7Tnm7jlhbPnmoTpgInmi6nlmajmsqHmnInmmrTpnLLlh7pvcGVu5pa55rOV77yM5pqC5pe25YWI5LiN5aSE55CG44CC77yIMTAueOWPiuS7peS4iueJiOacrOaPkOS+m+S6hm9wZW7mlrnms5XvvIlcbiAgICAgICAgaWYgKGp1bXBEaXJlY3Rpb24gPT09IFwicmlnaHRcIikge1xuICAgICAgICAgIHRoaXMuanVtcFRvTmV4dElucHV0KHgsIHkpO1xuICAgICAgICB9IGVsc2UgaWYgKGp1bXBEaXJlY3Rpb24gPT09IFwibGVmdFwiKSB7XG4gICAgICAgICAgdGhpcy5qdW1wVG9QcmV2SW5wdXQoeCwgeSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5zZXRBY3RpdmVEb20oeCwgeSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIOayoeaciWRvbeeahOWcuuaZr+S4i++8jOmcgOimgeWIpOaWreaYr+W3pui/mOaYr+WPs++8jFxuICAgIH1cbiAgfVxuXG4gIGNsZWFuRm9jdXNEb20oeDogbnVtYmVyLCB5OiBudW1iZXIpIHtcbiAgICBpZiAoXG4gICAgICB4ID09PSBudWxsIHx8XG4gICAgICB5ID09PSBudWxsIHx8XG4gICAgICAhdGhpcy5jb2xsZWN0RG9tTGlzdCB8fFxuICAgICAgdGhpcy5jb2xsZWN0RG9tTGlzdC5sZW5ndGggPT09IDBcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuY29sbGVjdERvbUxpc3RbeF0gJiYgdGhpcy5jb2xsZWN0RG9tTGlzdFt4XVt5XSkge1xuICAgICAgY29uc3QgZG9tID0gdGhpcy5jb2xsZWN0RG9tTGlzdFt4XVt5XTtcbiAgICAgIGlmIChkb20gaW5zdGFuY2VvZiBOelNlbGVjdENvbXBvbmVudCkge1xuICAgICAgICBkb20uYmx1cigpO1xuICAgICAgICBkb20ubnpPcGVuID0gZmFsc2U7XG4gICAgICB9IGVsc2UgaWYgKGRvbSBpbnN0YW5jZW9mIE56SW5wdXROdW1iZXJDb21wb25lbnQpIHtcbiAgICAgICAgZG9tLmJsdXIoKTtcbiAgICAgIH0gZWxzZSBpZiAoZG9tIGluc3RhbmNlb2YgRWxlbWVudFJlZikge1xuICAgICAgICBkb20ubmF0aXZlRWxlbWVudC5ibHVyKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHNldEFjdGl2ZURvbSh4OiBudW1iZXIsIHk6IG51bWJlcikge1xuICAgIHRoaXMuYWN0aXZlRG9tWCA9IHg7XG4gICAgdGhpcy5hY3RpdmVEb21ZID0geTtcbiAgICB0aGlzLmFjdGl2ZURvbSA9IHRoaXMuY29sbGVjdERvbUxpc3RbdGhpcy5hY3RpdmVEb21YXVt0aGlzLmFjdGl2ZURvbVldO1xuICAgIGlmICh0aGlzLmFjdGl2ZURvbSBpbnN0YW5jZW9mIE56U2VsZWN0Q29tcG9uZW50KSB7XG4gICAgICB0aGlzLnNldEFjdGl2ZVNlbGVjdGVkQ29tcG9uZW50T3Blbih0aGlzLmFjdGl2ZURvbS5vcGVuKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5qC55o2u6KGM5Y+35ZKM5YiX5Y+35ZCN56ew6I635Y+W5b2T5YmN6IGa54Sm55qEZG9t5L2N572uXG4gICAqIEBwYXJhbSByb3dOdW1iZXIg6KGM5Y+3XG4gICAqIEBwYXJhbSBjb2xOdW1iZXIg5YiX5Y+3XG4gICAqL1xuICBzZXRBY3RpdmVEb21JbkZvcm1MaW5lcyhyb3dOdW1iZXI6IG51bWJlciwgY29sTnVtYmVyOiBudW1iZXIpIHtcbiAgICB0aGlzLmFjdGl2ZURvbVggPSByb3dOdW1iZXI7XG4gICAgdGhpcy5hY3RpdmVEb21ZID0gdGhpcy5nZXREb21JbmRleChjb2xOdW1iZXIsIHRoaXMuZm9ybUxpbmVzKTtcbiAgICB0aGlzLnNldEFjdGl2ZURvbSh0aGlzLmFjdGl2ZURvbVgsIHRoaXMuYWN0aXZlRG9tWSk7XG4gIH1cblxuICAvKipcbiAgICog6ZSu55uY54K55Ye75LqL5Lu2XG4gICAqIEBwYXJhbSBldmVudCDplK7nm5jkuovku7ZcbiAgICogQHJldHVybnNcbiAgICovXG4gIG9uS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgIGlmICghdGhpcy5lbmFibGVLZXlib2FyZE9wZXJhdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuYWN0aXZlRG9tWCA9PT0gbnVsbCB8fCB0aGlzLmFjdGl2ZURvbVkgPT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc3dpdGNoIChldmVudC5rZXkpIHtcbiAgICAgIGNhc2UgXCJBcnJvd1VwXCI6XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0aGlzLmFjdGl2ZURvbSBpbnN0YW5jZW9mIE56U2VsZWN0Q29tcG9uZW50ICYmXG4gICAgICAgICAgdGhpcy5hY3RpdmVTZWxlY3RlZENvbXBvbmVudE9wZW5cbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZURvbVggIT09IDApIHtcbiAgICAgICAgICB0aGlzLmZvY3VzRG9tKHRoaXMuYWN0aXZlRG9tWCAtIDEsIHRoaXMuYWN0aXZlRG9tWSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiQXJyb3dEb3duXCI6XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0aGlzLmFjdGl2ZURvbSBpbnN0YW5jZW9mIE56U2VsZWN0Q29tcG9uZW50ICYmXG4gICAgICAgICAgdGhpcy5hY3RpdmVTZWxlY3RlZENvbXBvbmVudE9wZW5cbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIOWIpOaWreaYr+WQpuWcqOacgOWQjuS4gOihjO+8jOWKoOihjFxuICAgICAgICBpZiAodGhpcy5hY3RpdmVEb21YID09PSB0aGlzLmNvbGxlY3REb21MaXN0Lmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICB0aGlzLmNsZWFuRm9jdXNEb20odGhpcy5hY3RpdmVEb21YLCB0aGlzLmFjdGl2ZURvbVkpO1xuICAgICAgICAgIHRoaXMuYWRkTmV3TGluZUFuZEZvY3VzKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5mb2N1c0RvbSh0aGlzLmFjdGl2ZURvbVggKyAxLCB0aGlzLmFjdGl2ZURvbVkpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIkFycm93TGVmdFwiOlxuICAgICAgICB0aGlzLmp1bXBUb1ByZXZJbnB1dCh0aGlzLmFjdGl2ZURvbVgsIHRoaXMuYWN0aXZlRG9tWSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIkFycm93UmlnaHRcIjpcbiAgICAgICAgdGhpcy5qdW1wVG9OZXh0SW5wdXQodGhpcy5hY3RpdmVEb21YLCB0aGlzLmFjdGl2ZURvbVkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJFbnRlclwiOlxuICAgICAgICBpZiAodGhpcy5hY3RpdmVEb20gaW5zdGFuY2VvZiBOelNlbGVjdENvbXBvbmVudCkge1xuICAgICAgICAgIHRoaXMuc2V0QWN0aXZlU2VsZWN0ZWRDb21wb25lbnRPcGVuKHRoaXMuYWN0aXZlRG9tLm9wZW4pO1xuICAgICAgICAgIGlmICh0aGlzLmFjdGl2ZVNlbGVjdGVkQ29tcG9uZW50T3BlbiA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNEb20odGhpcy5hY3RpdmVEb21YLCB0aGlzLmFjdGl2ZURvbVkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmFjdGl2ZURvbVggPT09IHRoaXMuY29sbGVjdERvbUxpc3QubGVuZ3RoIC0gMSkge1xuICAgICAgICAgIHRoaXMuYWRkTmV3TGluZUFuZEZvY3VzKCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiRXNjYXBlXCI6XG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZURvbSBpbnN0YW5jZW9mIE56U2VsZWN0Q29tcG9uZW50KSB7XG4gICAgICAgICAgY29uc3Qgbm93QWN0aXZlRG9tID0gdGhpcy5hY3RpdmVEb20gYXMgTnpTZWxlY3RDb21wb25lbnQ7XG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNldEFjdGl2ZVNlbGVjdGVkQ29tcG9uZW50T3Blbihub3dBY3RpdmVEb20ub3Blbik7XG4gICAgICAgICAgICBpZiAodGhpcy5hY3RpdmVTZWxlY3RlZENvbXBvbmVudE9wZW4gPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgIGlmIChub3dBY3RpdmVEb20ubnpTZWxlY3RTZXJ2aWNlLm1vZGUgPT09IFwibXVsdGlwbGVcIikge1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgdGhpcy5mb2N1c0RvbSh0aGlzLmFjdGl2ZURvbVgsIHRoaXMuYWN0aXZlRG9tWSk7XG4gICAgICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5mb2N1c0RvbSh0aGlzLmFjdGl2ZURvbVgsIHRoaXMuYWN0aXZlRG9tWSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LCAwKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIC8vIOWmguaenOW9k+WJjeiBmueEpueahOaYr+mAieaLqeahhu+8jOS4lOmUruWFpTAtOWEtekEtWu+8jOWImeW8ueWHulxuICAgICAgICBpZiAoXG4gICAgICAgICAgdGhpcy5hY3RpdmVEb20gaW5zdGFuY2VvZiBOelNlbGVjdENvbXBvbmVudCAmJlxuICAgICAgICAgIHRoaXMuYWN0aXZlU2VsZWN0ZWRDb21wb25lbnRPcGVuID09PSBmYWxzZSAmJlxuICAgICAgICAgIC9eWzAtOWEtekEtWl0kLy50ZXN0KGV2ZW50LmtleSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgZG9tID0gdGhpcy5hY3RpdmVEb207XG4gICAgICAgICAgZG9tLm56T3BlbiA9IHRydWU7XG4gICAgICAgICAgdGhpcy5zZXRBY3RpdmVTZWxlY3RlZENvbXBvbmVudE9wZW4odHJ1ZSk7XG4gICAgICAgICAgLy8gLy8gVE9ETzrov5nph4zmmoLml7bms6jph4rvvIzkuI3og73nm7TmjqXluKblhaXplK7lhaXlgLzvvIzov5nmoLfkvJrlr7zoh7TovpPlhaXkuK3mlofnmoTml7blgJnluKblhaXoi7HmloflrZfnrKbvvIzkuI3nrKblkIjpooTmnJ9cbiAgICAgICAgICAvLyBkb20ubnpTZWxlY3RUb3BDb250cm9sQ29tcG9uZW50LmlucHV0VmFsdWUgPSBldmVudC5rZXk7XG4gICAgICAgICAgLy8gLy8g6I635Y+WIGlucHV0IOWFg+e0oFxuICAgICAgICAgIC8vIGNvbnN0IGlucHV0RWxlbWVudCA9IGRvbS5uelNlbGVjdFRvcENvbnRyb2xDb21wb25lbnQuaW5wdXRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgICAgLy8gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgLy8gICAvLyDop6blj5HovpPlhaXkuovku7bvvIzku6Xnoa7kv50gQW5ndWxhciDmo4DmtYvliLDlgLznmoTlj5jljJZcbiAgICAgICAgICAvLyAgIGNvbnN0IGV2ZW50SW5wdXQgPSBuZXcgRXZlbnQoJ2lucHV0JywgeyBidWJibGVzOiB0cnVlIH0pO1xuICAgICAgICAgIC8vICAgaW5wdXRFbGVtZW50LmRpc3BhdGNoRXZlbnQoZXZlbnRJbnB1dCk7XG4gICAgICAgICAgLy8gfSwgMCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOagueaNruWcqOWIneWni2RvbeS4i+agh+WSjOaVsOaNrumbhiDojrflj5blnKhjb2xsZWN0RG9tTGlzdOS4reeahOS4i+agh1xuICAgKiBAcGFyYW0gaW5kZXgg5Yid5aeL5LiL5qCHXG4gICAqIEBwYXJhbSBsaXN0IOiAgeaVsOaNrumbhlxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgcHJpdmF0ZSBnZXREb21JbmRleChpbmRleDogbnVtYmVyLCBsaXN0OiBBcnJheTxGb3JtTGluZT4pOiBudW1iZXIge1xuICAgIGNvbnN0IHR5cGVMaXN0ID0gW1xuICAgICAgXCJJbnB1dFwiLFxuICAgICAgXCJTZWxlY3RcIixcbiAgICAgIFwiRGF0ZVwiLFxuICAgICAgXCJEYXRlUmFuZ2VcIixcbiAgICAgIFwiVGV4dEFyZWFcIixcbiAgICAgIFwiSW5wdXROdW1iZXJcIixcbiAgICAgIFwiTXVsdGlwbGVTZWxlY3RcIixcbiAgICBdO1xuICAgIGxldCBmaWx0ZXJMaXN0ID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoaSA9PT0gaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIGZpbHRlckxpc3QubGVuZ3RoO1xuICAgICAgfVxuICAgICAgLy8g5LiO5qih5p2/5LiA6Ie077yaaGlkZSAvIGlzU2hvdz1mYWxzZSDnmoTliJfkuI3muLLmn5MgI2Zvcm1JbnB1dERvbe+8jOS4jeiuoeWFpSBjb2xsZWN0RG9tTGlzdCDnmoTliJfkuIvmoIdcbiAgICAgIGlmIChcbiAgICAgICAgdHlwZUxpc3QuaW5jbHVkZXMobGlzdFtpXS50eXBlKSAmJlxuICAgICAgICAhbGlzdFtpXS5oaWRlICYmXG4gICAgICAgIGxpc3RbaV0uaXNTaG93ICE9PSBmYWxzZVxuICAgICAgKSB7XG4gICAgICAgIGZpbHRlckxpc3QucHVzaChsaXN0W2ldKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICog5qC55o2u5ZyoY29sbGVjdERvbUxpc3TkuK3nmoTkuIvmoIflkozmlbDmja7pm4Yg6I635Y+W5Yid5aeLZG9t5LiL5qCHXG4gICAqIEBwYXJhbSBpbmRleCDmlrDkuIvmoIdcbiAgICogQHBhcmFtIGxpc3Qg6ICB5pWw5o2u6ZuGXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBwcml2YXRlIGdldE9sZERvbUluZGV4KGluZGV4OiBudW1iZXIsIGxpc3Q6IEFycmF5PEZvcm1MaW5lPik6IG51bWJlciB7XG4gICAgY29uc29sZS5sb2coXCJpbmRleFwiLCBpbmRleCk7XG4gICAgY29uc29sZS5sb2coXCJsaXN0XCIsIGxpc3QpO1xuICAgIGNvbnN0IHR5cGVMaXN0ID0gW1xuICAgICAgXCJJbnB1dFwiLFxuICAgICAgXCJTZWxlY3RcIixcbiAgICAgIFwiRGF0ZVwiLFxuICAgICAgXCJEYXRlUmFuZ2VcIixcbiAgICAgIFwiVGV4dEFyZWFcIixcbiAgICAgIFwiSW5wdXROdW1iZXJcIixcbiAgICAgIFwiTXVsdGlwbGVTZWxlY3RcIixcbiAgICBdO1xuICAgIGxldCBmaWx0ZXJMaXN0ID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHR5cGVMaXN0LmluY2x1ZGVzKGxpc3RbaV0udHlwZSkgJiZcbiAgICAgICAgIWxpc3RbaV0uaGlkZSAmJlxuICAgICAgICBsaXN0W2ldLmlzU2hvdyAhPT0gZmFsc2VcbiAgICAgICkge1xuICAgICAgICBmaWx0ZXJMaXN0LnB1c2gobGlzdFtpXSk7XG4gICAgICAgIGlmIChmaWx0ZXJMaXN0Lmxlbmd0aCA9PT0gaW5kZXggKyAxKSB7XG4gICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBnZXQgbGluZXNGb3JtQXJyYXkoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy52YWxpZGF0ZUhkRm9ybUxpbmVzLmdldChcImxpbmVzXCIpIGFzIEZvcm1BcnJheTtcbiAgfVxuXG4gIGdldCBMb2Rhc2hSb3VuZCgpIHtcbiAgICByZXR1cm4gcm91bmQ7XG4gIH1cblxuICAvLyDmmrTpnLLnmoTmlrnms5XvvIznlKjkuo7ojrflj5bmiYDmnInmlbDmja7nmoR2YWxpZOeKtuaAgVxuICBwdWJsaWMgZ2V0VmFsaWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybVZhbGlkO1xuICB9XG5cbiAgb25TZWFyY2hFdmVudChcbiAgICBmbjogYW55LFxuICAgIGV2ZW50OiBhbnksXG4gICAgbGluZTogYW55LFxuICAgIG9uU2VhcmNoRXZlbnREZWJvdW5jZVRpbWU6IGFueSxcbiAgKSB7XG4gICAgaWYgKCFmbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBkZWJvdW5jZU1zID1cbiAgICAgIG9uU2VhcmNoRXZlbnREZWJvdW5jZVRpbWUgIT0gbnVsbCA/IG9uU2VhcmNoRXZlbnREZWJvdW5jZVRpbWUgOiAwO1xuICAgIC8vIOacqumFjee9ruaIluS4uiAw77ya5ZCM5q2l6Kem5Y+R77yM5LiN6LWwIGRlYm91bmNlVGltZe+8iOmBv+WFjeW8guatpe+8iVxuICAgIGlmICghZGVib3VuY2VNcykge1xuICAgICAgdGhpcy50cmlnZ2VyRXZlbnQoZm4sIGV2ZW50LCBsaW5lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kZWJvdW5jZVRpbWVvdXQgPSBkZWJvdW5jZU1zO1xuICAgICAgaWYgKHRoaXMuc2VhcmNoU3Vic2NyaXB0aW9uKSB7XG4gICAgICAgIHRoaXMuc2VhcmNoU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICB9XG4gICAgICB0aGlzLnNlYXJjaFN1YnNjcmlwdGlvbiA9IHRoaXMuc2VhcmNoU3ViamVjdFxuICAgICAgICAucGlwZShkZWJvdW5jZVRpbWUodGhpcy5kZWJvdW5jZVRpbWVvdXQpKVxuICAgICAgICAuc3Vic2NyaWJlKCh7IGZuLCBldmVudCwgbGluZSB9KSA9PiB0aGlzLnRyaWdnZXJFdmVudChmbiwgZXZlbnQsIGxpbmUpKTtcbiAgICAgIHRoaXMuc2VhcmNoU3ViamVjdC5uZXh0KHsgZm4sIGV2ZW50LCBsaW5lIH0pO1xuICAgIH1cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuc2V0QWN0aXZlU2VsZWN0ZWRDb21wb25lbnRPcGVuKHRydWUpO1xuICAgIH0sIDApO1xuICB9XG5cbiAgb25PcGVuQ2hhbmdlRXZlbnQoXG4gICAgZm46IGFueSxcbiAgICBvcGVuOiBib29sZWFuLFxuICAgIGxpbmU6IGFueSxcbiAgICBvbk9wZW5DaGFuZ2VFdmVudERlYm91bmNlVGltZTogYW55LFxuICAgIGZvcm1JdGVtPzogYW55LFxuICApIHtcbiAgICBpZiAoIWZuKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIOWxleW8gOaXtuWFiOa4heepuuaXpyBvcHRpb25z77yM6YG/5YWN5p2h5Lu25Y+Y5YyW5ZCO6K+35rGC6L+U5Zue5YmN5LuN5bGV56S65LiK5LiA5om55LiL5ouJ5pWw5o2uXG4gICAgaWYgKG9wZW4pIHtcbiAgICAgIHRoaXMuY2xlYXJTZWxlY3RPcHRpb25zT25PcGVuKGZvcm1JdGVtLCBsaW5lKTtcbiAgICB9XG4gICAgY29uc3QgZGVib3VuY2VNcyA9XG4gICAgICBvbk9wZW5DaGFuZ2VFdmVudERlYm91bmNlVGltZSAhPSBudWxsXG4gICAgICAgID8gb25PcGVuQ2hhbmdlRXZlbnREZWJvdW5jZVRpbWVcbiAgICAgICAgOiAwO1xuICAgIC8vIOacqumFjee9ruaIluS4uiAw77ya5ZCM5q2l6Kem5Y+R77yM5LiN6LWwIGRlYm91bmNlVGltZe+8iOmBv+WFjeW8guatpe+8iVxuICAgIGlmICghZGVib3VuY2VNcykge1xuICAgICAgaWYgKG9wZW4pIHtcbiAgICAgICAgdGhpcy50cmlnZ2VyRXZlbnQoZm4sIG9wZW4sIGxpbmUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLm9wZW5DaGFuZ2VEZWJvdW5jZVRpbWVvdXQgPSBkZWJvdW5jZU1zO1xuICAgIGlmICh0aGlzLm9wZW5DaGFuZ2VTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMub3BlbkNoYW5nZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICB0aGlzLm9wZW5DaGFuZ2VTdWJzY3JpcHRpb24gPSB0aGlzLm9wZW5DaGFuZ2VTdWJqZWN0XG4gICAgICAucGlwZShkZWJvdW5jZVRpbWUodGhpcy5vcGVuQ2hhbmdlRGVib3VuY2VUaW1lb3V0KSlcbiAgICAgIC5zdWJzY3JpYmUoKHsgZm4sIGV2ZW50LCBsaW5lIH0pID0+IHtcbiAgICAgICAgaWYgKGV2ZW50KSB7XG4gICAgICAgICAgdGhpcy50cmlnZ2VyRXZlbnQoZm4sIGV2ZW50LCBsaW5lKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgdGhpcy5vcGVuQ2hhbmdlU3ViamVjdC5uZXh0KHsgZm4sIGV2ZW50OiBvcGVuLCBsaW5lIH0pO1xuICB9XG5cbiAgLyoqIOaciSBvbk9wZW5DaGFuZ2VFdmVudCDml7blsZXlvIDkuIvmi4nlhYjmuIXnqbrpgInpobnvvIznlLHkuJrliqHlm57osIPlho3lhpnlhaXmlrDmlbDmja4gKi9cbiAgcHJpdmF0ZSBjbGVhclNlbGVjdE9wdGlvbnNPbk9wZW4oZm9ybUl0ZW06IGFueSwgbGluZTogYW55KTogdm9pZCB7XG4gICAgaWYgKCFmb3JtSXRlbSB8fCAhZm9ybUl0ZW0uc2VsZWN0T3B0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG9wdCA9IGZvcm1JdGVtLnNlbGVjdE9wdGlvbjtcbiAgICBpZiAob3B0LnNlbGVjdExpc3QgIT0gbnVsbCkge1xuICAgICAgb3B0LnNlbGVjdExpc3QgPSBbXTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgb3B0LnNlbGVjdExpc3ROYW1lICYmXG4gICAgICBsaW5lICYmXG4gICAgICBsaW5lLmdldCAmJlxuICAgICAgbGluZS5nZXQob3B0LnNlbGVjdExpc3ROYW1lKVxuICAgICkge1xuICAgICAgbGluZS5nZXQob3B0LnNlbGVjdExpc3ROYW1lKS5zZXRWYWx1ZShbXSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gZm4g54i257uE5Lu25Ye95pWwXG4gICAqIEBwYXJhbSBldmVudCDkuovku7blgLxcbiAgICogQHBhcmFtIGxpbmUg6Kem5Y+R55qE6KGMXG4gICAqL1xuICB0cmlnZ2VyRXZlbnQoZm46IGFueSwgZXZlbnQ6IGFueSwgbGluZTogYW55KSB7XG4gICAgaWYgKGZuKSB7XG4gICAgICBmbihldmVudCwgbGluZSk7XG4gICAgfVxuICB9XG5cbiAgaW5uZXJHZXRWYWxpZCgpIHtcbiAgICBsZXQgdG1wVmFsaWRhdGVIZEZvcm1MaW5lcyA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgbGluZXM6IHRoaXMuZmIuYXJyYXkoW10pLFxuICAgIH0pO1xuICAgIHRoaXMuc3RvcmVGb3JtTGluZXNEYXRhLmZvckVhY2goKGZvcm1MaW5lc0RhdGFJdGVtKSA9PiB7XG4gICAgICBsZXQgZm9ybUdyb3VwT2JqOiBhbnkgPSB7fTtcbiAgICAgIHRoaXMuZm9ybUxpbmVzLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgLy8g5paw5aKe6KGMIOWIneWni+aVsOaNrumDveS4um51bGxcbiAgICAgICAgZm9ybUdyb3VwT2JqW2l0ZW0ubmFtZV0gPSB0aGlzLmZiLmNvbnRyb2woXG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFsdWU6IHRoaXMuanVkZ2VWYWx1ZUlzTm90RW1wdHkoZm9ybUxpbmVzRGF0YUl0ZW1baXRlbS5uYW1lXSlcbiAgICAgICAgICAgICAgPyBmb3JtTGluZXNEYXRhSXRlbVtpdGVtLm5hbWVdXG4gICAgICAgICAgICAgIDogaXRlbS52YWx1ZSB8fCBudWxsLFxuICAgICAgICAgICAgZGlzYWJsZWQ6IGl0ZW0uZGlzYWJsZWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBpdGVtLnJlcXVpcmUgPyBbVmFsaWRhdG9ycy5yZXF1aXJlZF0gOiBbXSxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGl0ZW0uc2VsZWN0T3B0aW9uICYmIGl0ZW0uc2VsZWN0T3B0aW9uLmxhYmVsKSB7XG4gICAgICAgICAgZm9ybUdyb3VwT2JqW2l0ZW0uc2VsZWN0T3B0aW9uLmxhYmVsXSA9IHRoaXMuZmIuY29udHJvbChcbiAgICAgICAgICAgIGZvcm1MaW5lc0RhdGFJdGVtW2l0ZW0uc2VsZWN0T3B0aW9uLmxhYmVsXSB8fCBudWxsLFxuICAgICAgICAgICAgW10sXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBmb3JtR3JvdXBPYmoubGluZUluZGV4ID0gdGhpcy5mYi5jb250cm9sKFxuICAgICAgICAodG1wVmFsaWRhdGVIZEZvcm1MaW5lcy5nZXQoXCJsaW5lc1wiKSBhcyBGb3JtQXJyYXkpLmNvbnRyb2xzLmxlbmd0aCArIDEsXG4gICAgICAgIFtdLFxuICAgICAgKTtcbiAgICAgIGxldCBmb3JtR3JvdXBUbXAgPSB0aGlzLmZiLmdyb3VwKGZvcm1Hcm91cE9iaik7XG4gICAgICB0aGlzLmZvcm1MaW5lcy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgIGlmIChpdGVtLm9uQ2hhbmdlRXZlbnQpIHtcbiAgICAgICAgICBjb25zdCBkZWJvdW5jZU1zID1cbiAgICAgICAgICAgIGl0ZW0ub25DaGFuZ2VFdmVudERlYm91bmNlVGltZSAhPSBudWxsXG4gICAgICAgICAgICAgID8gaXRlbS5vbkNoYW5nZUV2ZW50RGVib3VuY2VUaW1lXG4gICAgICAgICAgICAgIDogMDtcbiAgICAgICAgICBjb25zdCBjb250cm9sID0gZm9ybUdyb3VwVG1wLmdldChpdGVtLm5hbWUpO1xuICAgICAgICAgIC8vIOacqumFjee9ruaIluS4uiAw77ya5ZCM5q2l6K6i6ZiF77yM5LiN6LWwIGRlYm91bmNlVGltZVxuICAgICAgICAgIGlmIChkZWJvdW5jZU1zID4gMCkge1xuICAgICAgICAgICAgY29udHJvbC52YWx1ZUNoYW5nZXNcbiAgICAgICAgICAgICAgLnBpcGUoZGVib3VuY2VUaW1lKGRlYm91bmNlTXMpKVxuICAgICAgICAgICAgICAuc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMudHJpZ2dlckV2ZW50KGl0ZW0ub25DaGFuZ2VFdmVudCwgdmFsdWUsIGZvcm1Hcm91cFRtcCk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb250cm9sLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMudHJpZ2dlckV2ZW50KGl0ZW0ub25DaGFuZ2VFdmVudCwgdmFsdWUsIGZvcm1Hcm91cFRtcCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgKHRtcFZhbGlkYXRlSGRGb3JtTGluZXMuZ2V0KFwibGluZXNcIikgYXMgRm9ybUFycmF5KS5pbnNlcnQoXG4gICAgICAgICh0bXBWYWxpZGF0ZUhkRm9ybUxpbmVzLmdldChcImxpbmVzXCIpIGFzIEZvcm1BcnJheSkuY29udHJvbHMubGVuZ3RoLFxuICAgICAgICBmb3JtR3JvdXBUbXAsXG4gICAgICApO1xuICAgIH0pO1xuICAgIHJldHVybiB0bXBWYWxpZGF0ZUhkRm9ybUxpbmVzLnZhbGlkO1xuICB9XG5cbiAgLy8g5pq06Zyy55qE5pa55rOV77yM55So5LqO6I635Y+W5omA5pyJ5pWw5o2uXG4gIHB1YmxpYyBnZXRMaW5lcygpIHtcbiAgICBsZXQgYWxsTGluZXMgPSBbXTtcbiAgICB0aGlzLnN0b3JlRm9ybUxpbmVzRGF0YS5mb3JFYWNoKChmb3JtTGluZXNEYXRhSXRlbSkgPT4ge1xuICAgICAgbGV0IGZvcm1Hcm91cE9iajogYW55ID0ge307XG4gICAgICB0aGlzLmZvcm1MaW5lcy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgIC8vIOaWsOWinuihjCDliJ3lp4vmlbDmja7pg73kuLpudWxsXG4gICAgICAgIGZvcm1Hcm91cE9ialtpdGVtLm5hbWVdID0gZm9ybUxpbmVzRGF0YUl0ZW1baXRlbS5uYW1lXTtcbiAgICAgIH0pO1xuICAgICAgZm9ybUdyb3VwT2JqLmxpbmVJbmRleCA9IGZvcm1MaW5lc0RhdGFJdGVtLmxpbmVJbmRleDtcbiAgICAgIGFsbExpbmVzLnB1c2goZm9ybUdyb3VwT2JqKTtcbiAgICB9KTtcbiAgICByZXR1cm4gYWxsTGluZXM7XG4gIH1cblxuICAvLyDlhajlsYDmgKfnmoTmkJzntKLvvIjmtrXnm5bpobXpnaLkuIrmiYDmnInnmoTlj6/op4bmloflrZfvvIlcbiAgc2VhcmNoTGluZXMoKSB7XG4gICAgaWYgKHRoaXMuc3RvcmVGb3JtTGluZXNEYXRhLmxlbmd0aCA8IDEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy50YWJsZUxvYWRpbmcgPSB0cnVlO1xuICAgIC8vIOWmguaenOayoeaciei+k+WFpeaQnOe0ouWtl+espuS4su+8jOWImeaYvuekuue8k+WtmOWGheeahOaJgOacieaVsOaNrlxuICAgIGlmICghdGhpcy5maWx0ZXJTdHIpIHtcbiAgICAgIHRoaXMuaXNGaWx0ZXJEYXRhID0gZmFsc2U7XG4gICAgICB0aGlzLnNldFN0b3JlRGF0YSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBmaWx0ZXJWYWx1ZSA9IHRoaXMuZmlsdGVyU3RyLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgIHRoaXMuaXNGaWx0ZXJEYXRhID0gdHJ1ZTtcbiAgICB0aGlzLmZpbHRlckluZGV4U3RvcmUgPSBbXTtcblxuICAgIC8vIOagueaNruaQnOe0ouWtl+espuS4sui/h+a7pOaVsOaNrlxuICAgIGNvbnN0IGZpbHRlcmVkRGF0YSA9IHRoaXMuc3RvcmVGb3JtTGluZXNEYXRhLmZpbHRlcihcbiAgICAgIChkYXRhOiBhbnksIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHRoaXMuZm9ybUxpbmVzKSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgKGl0ZW0uaGlkZSAmJiBpdGVtLmNhblNlYXJjaCkgfHxcbiAgICAgICAgICAgICghaXRlbS5oaWRlICYmIGl0ZW0ubmFtZSAhPT0gXCJ1dWlkXCIpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIml0ZW1cIiwgaXRlbS5uYW1lKTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZGF0YVtpdGVtLm5hbWVdXG4gICAgICAgICAgICAgID8gZGF0YVtpdGVtLm5hbWVdLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgICA6IFwiXCI7XG4gICAgICAgICAgICBpZiAodmFsdWUuaW5jbHVkZXMoZmlsdGVyVmFsdWUpKSB7XG4gICAgICAgICAgICAgIHRoaXMuZmlsdGVySW5kZXhTdG9yZS5wdXNoKGluZGV4KTtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0sXG4gICAgKTtcbiAgICAvLyDnvJPlrZjkuIDkuIvnrZvpgInlkI7nmoTooajljZXmlbDmja5cbiAgICB0aGlzLmZpbHRlclN0b3JlRm9ybUxpbmVzRGF0YSA9IGZpbHRlcmVkRGF0YTtcbiAgICAvLyDlpITnkIbnrZvpgInlpb3nmoTmlbDmja4g54S25ZCO6YeN5paw5riy5p+TXG4gICAgdGhpcy5mb3JtTGluZXNEYXRhID0gZmlsdGVyZWREYXRhO1xuICAgIHRoaXMuaW5pdCh0cnVlKTtcbiAgfVxuXG4gIHNldFN0b3JlRGF0YSgpIHtcbiAgICB0aGlzLmZvcm1MaW5lc0RhdGEgPSB0aGlzLnN0b3JlRm9ybUxpbmVzRGF0YTtcbiAgICB0aGlzLmluaXQodHJ1ZSk7XG4gIH1cblxuICBnZXRTdHlsZShsaW5lOiBGb3JtR3JvdXAsIGZvcm1JdGVtOiBhbnksIHdpZHRoOiBzdHJpbmcpIHtcbiAgICBsZXQgc3R5bGVPYmogPSB7XG4gICAgICBcIm1pbi13aWR0aFwiOiB3aWR0aCxcbiAgICB9O1xuICAgIGlmIChmb3JtSXRlbS5zdHlsZSkge1xuICAgICAgc3R5bGVPYmogPSB7IC4uLnN0eWxlT2JqLCAuLi5mb3JtSXRlbS5zdHlsZSB9O1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBmb3JtSXRlbS5jb2xvck9wdGlvbiAmJlxuICAgICAgZm9ybUl0ZW0uY29sb3JPcHRpb24ubmFtZSAmJlxuICAgICAgbGluZS5nZXQoZm9ybUl0ZW0uY29sb3JPcHRpb24ubmFtZSkudmFsdWVcbiAgICApIHtcbiAgICAgIHN0eWxlT2JqID0ge1xuICAgICAgICAuLi5zdHlsZU9iaixcbiAgICAgICAgLi4ueyBjb2xvcjogbGluZS5nZXQoZm9ybUl0ZW0uY29sb3JPcHRpb24ubmFtZSkudmFsdWUgfSxcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBzdHlsZU9iajtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICBpZiAoXG4gICAgICBjaGFuZ2VzW1wiZm9ybUxpbmVzRGF0YVwiXSAmJlxuICAgICAgSlNPTi5zdHJpbmdpZnkoY2hhbmdlc1tcImZvcm1MaW5lc0RhdGFcIl0uY3VycmVudFZhbHVlKSAhPT1cbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoY2hhbmdlc1tcImZvcm1MaW5lc0RhdGFcIl0ucHJldmlvdXNWYWx1ZSlcbiAgICApIHtcbiAgICAgIGlmICh0aGlzLnN0b3JlRm9ybUxpbmVzRGF0YSAmJiB0aGlzLnN0b3JlRm9ybUxpbmVzRGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhpcy5zdG9yZUZvcm1MaW5lc0RhdGEgPSB0aGlzLmZvcm1MaW5lc0RhdGE7XG4gICAgICB9XG4gICAgICB0aGlzLmluaXQoKTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgY2hhbmdlc1tcImZvcm1MaW5lc1wiXSAmJlxuICAgICAgY2hhbmdlc1tcImZvcm1MaW5lc1wiXS5wcmV2aW91c1ZhbHVlICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIEpTT04uc3RyaW5naWZ5KGNoYW5nZXNbXCJmb3JtTGluZXNcIl0uY3VycmVudFZhbHVlKSAhPT1cbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoY2hhbmdlc1tcImZvcm1MaW5lc1wiXS5wcmV2aW91c1ZhbHVlKVxuICAgICkge1xuICAgICAgdGhpcy5pbml0Q29sU2V0dGluZ3MoKTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgY2hhbmdlc1tcInRvdGFsT3B0aW9uXCJdICYmXG4gICAgICBKU09OLnN0cmluZ2lmeShjaGFuZ2VzW1widG90YWxPcHRpb25cIl0uY3VycmVudFZhbHVlKSAhPT1cbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoY2hhbmdlc1tcInRvdGFsT3B0aW9uXCJdLnByZXZpb3VzVmFsdWUpXG4gICAgKSB7XG4gICAgICB0aGlzLmNhbGN1bGF0ZVRvdGFsKCk7XG4gICAgfVxuICB9XG5cbiAgY2FsY3VsYXRlVG90YWwoKSB7XG4gICAgLy8g6L+Z6YeM5aSE55CG5ZCI6K6h5pWw5o2uXG4gICAgaWYgKHRoaXMuc2hvd1RvdGFsKSB7XG4gICAgICB0aGlzLnRvdGFsT3B0aW9uTGlzdCA9IG5ldyBBcnJheShOdW1iZXIodGhpcy5jb2x1bW5zTnVtYmVyKSAtIDEpLmZpbGwoXCJcIik7XG4gICAgICB0aGlzLnRvdGFsT3B0aW9uLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgaWYgKGl0ZW0uaW5zZXJ0SW5kZXggJiYgKGl0ZW0uaW5zZXJ0VmFsdWUgfHwgaXRlbS5pbnNlcnRWYWx1ZSA9PT0gMCkpIHtcbiAgICAgICAgICB0aGlzLnRvdGFsT3B0aW9uTGlzdFtpdGVtLmluc2VydEluZGV4IC0gMV0gPSB7XG4gICAgICAgICAgICB2YWx1ZTogaXRlbS5pbnNlcnRWYWx1ZSxcbiAgICAgICAgICAgIGFsaWduOiBpdGVtLmFsaWduIHx8IFwibGVmdFwiLFxuICAgICAgICAgICAgc2hvd0RlY2ltYWw6IGl0ZW0uc2hvd0RlY2ltYWwgfHwgZmFsc2UsXG4gICAgICAgICAgICBwcmVzZXJ2ZU51bWJlcjogaXRlbS5wcmVzZXJ2ZU51bWJlciAhPSBudWxsID8gaXRlbS5wcmVzZXJ2ZU51bWJlciA6IDIsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpbml0KGlzRWRpdDogYm9vbGVhbiA9IGZhbHNlKTogdm9pZCB7XG4gICAgdGhpcy5wYWdpbmF0aW9uUGFnZUluZGV4ID0gMTtcbiAgICAvLyDlvILluLjmjZXojrdcbiAgICBpZiAoIXRoaXMuY2hlY2tMaXN0KHRoaXMuZm9ybUxpbmVzKSkge1xuICAgICAgdGhpcy50YWJsZUxvYWRpbmcgPSBmYWxzZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5jcmVhdGVGb3JtKCk7XG4gICAgLy8g5aaC5p6c5rKh5pyJZm9ybUxpbmVzRGF0Ye+8jOWImeiupOS4uuaYr+aWsOWinlxuICAgIGlmIChcbiAgICAgICFpc0VkaXQgJiZcbiAgICAgICghdGhpcy5mb3JtTGluZXNEYXRhIHx8XG4gICAgICAgICh0aGlzLmZvcm1MaW5lc0RhdGEgJiYgdGhpcy5mb3JtTGluZXNEYXRhLmxlbmd0aCA9PT0gMCkpXG4gICAgKSB7XG4gICAgICB0aGlzLnRhYmxlTG9hZGluZyA9IGZhbHNlO1xuICAgICAgLy8gYWxsb3dFbXB0eSDkuJTku4XliKDpmaTmjInpkq7vvJrkuI3oh6rliqjooaXnqbrooYxcbiAgICAgIGlmICghdGhpcy5pc1RydWx5RW1wdHlBbGxvd2VkKSB7XG4gICAgICAgIHRoaXMuYWRkRm9ybUxpbmUobnVsbCwgZmFsc2UpO1xuICAgICAgfVxuICAgICAgdGhpcy5zaG93Rm9ybSA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIOe8lui+kemAu+i+kVxuICAgICAgdGhpcy5hZGRGb3JtTGluZVdpdGhEYXRhKCk7XG4gICAgfVxuICAgIHRoaXMudmFsaWRhdGVIZEZvcm1MaW5lcy52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKChkYXRhKSA9PlxuICAgICAgdGhpcy5vbkhkRm9ybVZhbHVlQ2hhbmdlZChkYXRhKSxcbiAgICApO1xuICAgIHRoaXMub25IZEZvcm1WYWx1ZUNoYW5nZWQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDliJvlu7rooajljZVcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlRm9ybSgpIHtcbiAgICB0aGlzLnZhbGlkYXRlSGRGb3JtTGluZXMgPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIGxpbmVzOiB0aGlzLmZiLmFycmF5KFtdKSxcbiAgICB9KTtcbiAgICB0aGlzLm5ld0xpbmUgPSB0aGlzLm5ld0xpbmVJdGVtKCk7XG4gIH1cblxuICBkZWxheUp1bXBUb05leHRJbnB1dCgpIHtcbiAgICAvLyDlhbPpl63plK7nm5jmk43kvZzml7bvvIzpgInmi6nmoYbpgInkuK3lkI7kuI3oh6rliqjot7PovazliLDkuIvkuIDkuKrovpPlhaXmjqfku7ZcbiAgICBpZiAoIXRoaXMuZW5hYmxlS2V5Ym9hcmRPcGVyYXRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5qdW1wVG9OZXh0SW5wdXQodGhpcy5hY3RpdmVEb21YLCB0aGlzLmFjdGl2ZURvbVkpO1xuICAgIH0sIDApO1xuICB9XG5cbiAgLyoqXG4gICAqIOWumuS5ieepuueahG5ld0xpbmVJdGVtIOe7k+aehFxuICAgKi9cbiAgcHJpdmF0ZSBuZXdMaW5lSXRlbSgpOiBGb3JtR3JvdXAge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZUxpbmVGcm9tVmFsdWVzKG51bGwsIHRydWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIOagueaNruihjOaVsOaNruWIm+W7uiBGb3JtR3JvdXDvvIjlkKvpmpDol4/lrZfmrrXjgIFzZWxlY3Qg55qEIGxhYmVsIOetiemZhOWxnuWtl+aute+8iVxuICAgKiBAcGFyYW0gZm9ybUxpbmVzRGF0YUl0ZW0g6KGM5pWw5o2u77yM56m66KGM5LygIG51bGxcbiAgICogQHBhcmFtIGlzRW1wdHlMaW5lIOaYr+WQpuepuuihjO+8iOW9seWTjeW/heWhq+agoemqjOinhOWIme+8jOS4juWOhuWPsumAu+i+keS/neaMgeS4gOiHtO+8iVxuICAgKiBAcGFyYW0gcmVnZW5lcmF0ZVJvd0lkIOaYr+WQpuW8uuWItueUn+aIkOaWsOihjCBpZO+8iOWkjeWItuihjOaXtuS9v+eUqO+8iVxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVMaW5lRnJvbVZhbHVlcyhcbiAgICBmb3JtTGluZXNEYXRhSXRlbTogYW55LFxuICAgIGlzRW1wdHlMaW5lOiBib29sZWFuID0gZmFsc2UsXG4gICAgcmVnZW5lcmF0ZVJvd0lkOiBib29sZWFuID0gZmFsc2UsXG4gICk6IEZvcm1Hcm91cCB7XG4gICAgbGV0IGZvcm1Hcm91cE9iajogYW55ID0ge307XG4gICAgdGhpcy5mb3JtTGluZXMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgZm9ybUdyb3VwT2JqW2l0ZW0ubmFtZV0gPSB0aGlzLmZiLmNvbnRyb2woXG4gICAgICAgIHtcbiAgICAgICAgICB2YWx1ZTpcbiAgICAgICAgICAgIGZvcm1MaW5lc0RhdGFJdGVtICE9IG51bGxcbiAgICAgICAgICAgICAgPyBmb3JtTGluZXNEYXRhSXRlbVtpdGVtLm5hbWVdXG4gICAgICAgICAgICAgIDogaXRlbS52YWx1ZSxcbiAgICAgICAgICBkaXNhYmxlZDogaXRlbS5kaXNhYmxlZCxcbiAgICAgICAgfSxcbiAgICAgICAgaXNFbXB0eUxpbmVcbiAgICAgICAgICA/IGl0ZW0ucmVxdWlyZSAmJiAhaXRlbS5oaWRlXG4gICAgICAgICAgICA/IFtWYWxpZGF0b3JzLnJlcXVpcmVkXVxuICAgICAgICAgICAgOiBbXVxuICAgICAgICAgIDogaXRlbS5yZXF1aXJlXG4gICAgICAgICAgICA/IFtWYWxpZGF0b3JzLnJlcXVpcmVkXVxuICAgICAgICAgICAgOiBbXSxcbiAgICAgICk7XG4gICAgICBpZiAoaXRlbS5zZWxlY3RPcHRpb24gJiYgaXRlbS5zZWxlY3RPcHRpb24ubGFiZWwpIHtcbiAgICAgICAgZm9ybUdyb3VwT2JqW2l0ZW0uc2VsZWN0T3B0aW9uLmxhYmVsXSA9IHRoaXMuZmIuY29udHJvbChcbiAgICAgICAgICBmb3JtTGluZXNEYXRhSXRlbSAhPSBudWxsXG4gICAgICAgICAgICA/IGZvcm1MaW5lc0RhdGFJdGVtW2l0ZW0uc2VsZWN0T3B0aW9uLmxhYmVsXSB8fCBudWxsXG4gICAgICAgICAgICA6IG51bGwsXG4gICAgICAgICAgW10sXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyDnqLPlrprooYwgaWTvvJrmkJzntKLph43lu7rooajljZXlkI7nlKjkuo7kv53nlZnli77pgIlcbiAgICBjb25zdCByb3dJZCA9XG4gICAgICAhcmVnZW5lcmF0ZVJvd0lkICYmIGZvcm1MaW5lc0RhdGFJdGVtICYmIGZvcm1MaW5lc0RhdGFJdGVtLl9oZFJvd0lkXG4gICAgICAgID8gZm9ybUxpbmVzRGF0YUl0ZW0uX2hkUm93SWRcbiAgICAgICAgOiB0aGlzLmdlbmVyYXRlUm93SWQoKTtcbiAgICBmb3JtR3JvdXBPYmouX2hkUm93SWQgPSB0aGlzLmZiLmNvbnRyb2wocm93SWQpO1xuICAgIGlmIChmb3JtTGluZXNEYXRhSXRlbSAmJiAhZm9ybUxpbmVzRGF0YUl0ZW0uX2hkUm93SWQpIHtcbiAgICAgIGZvcm1MaW5lc0RhdGFJdGVtLl9oZFJvd0lkID0gcm93SWQ7XG4gICAgfVxuXG4gICAgLy8g5aSN5Yi25rqQ6KGM5LiK5aSa5L2Z55qE5a2X5q6177yI6ZqQ6JeP6ZmE5bGe5a2X5q6144CBc2VsZWN0TGlzdE5hbWUg562J77yJXG4gICAgaWYgKGZvcm1MaW5lc0RhdGFJdGVtKSB7XG4gICAgICBPYmplY3Qua2V5cyhmb3JtTGluZXNEYXRhSXRlbSkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBrZXkgPT09IFwibGluZUluZGV4XCIgfHxcbiAgICAgICAgICBrZXkgPT09IFwiaXNIZEZvcm1MaW5lU2VhcmNoQWRkXCIgfHxcbiAgICAgICAgICBrZXkgPT09IFwiX2hkUm93SWRcIlxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFmb3JtR3JvdXBPYmpba2V5XSkge1xuICAgICAgICAgIGZvcm1Hcm91cE9ialtrZXldID0gdGhpcy5mYi5jb250cm9sKGZvcm1MaW5lc0RhdGFJdGVtW2tleV0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBmb3JtR3JvdXBPYmoubGluZUluZGV4ID0gdGhpcy5mYi5jb250cm9sKFxuICAgICAgdGhpcy5saW5lc0Zvcm1BcnJheS5jb250cm9scy5sZW5ndGggKyAxLFxuICAgICAgW10sXG4gICAgKTtcbiAgICBmb3JtR3JvdXBPYmouaXNIZEZvcm1MaW5lU2VhcmNoQWRkID0gdGhpcy5mYi5jb250cm9sKHRoaXMuaXNGaWx0ZXJEYXRhLCBbXSk7XG4gICAgbGV0IGZvcm1Hcm91cFN1Ym1pdCA9IHRoaXMuZmIuZ3JvdXAoZm9ybUdyb3VwT2JqKTtcbiAgICB0aGlzLmZvcm1MaW5lcy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICBpZiAoaXRlbS5vbkNoYW5nZUV2ZW50KSB7XG4gICAgICAgIGNvbnN0IGRlYm91bmNlTXMgPVxuICAgICAgICAgIGl0ZW0ub25DaGFuZ2VFdmVudERlYm91bmNlVGltZSAhPSBudWxsXG4gICAgICAgICAgICA/IGl0ZW0ub25DaGFuZ2VFdmVudERlYm91bmNlVGltZVxuICAgICAgICAgICAgOiAwO1xuICAgICAgICBjb25zdCBjb250cm9sID0gZm9ybUdyb3VwU3VibWl0LmdldChpdGVtLm5hbWUpO1xuICAgICAgICBjb25zdCBoYW5kbGVDaGFuZ2UgPSAodmFsdWU6IGFueSkgPT4ge1xuICAgICAgICAgIGlmIChpdGVtLnR5cGUgPT09IEZvcm1MaW5lVHlwZS5TZWxlY3QgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuZGVsYXlKdW1wVG9OZXh0SW5wdXQoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy50cmlnZ2VyRXZlbnQoaXRlbS5vbkNoYW5nZUV2ZW50LCB2YWx1ZSwgZm9ybUdyb3VwU3VibWl0KTtcbiAgICAgICAgfTtcbiAgICAgICAgLy8g5pyq6YWN572u5oiW5Li6IDDvvJrlkIzmraXorqLpmIXvvIzkuI3otbAgZGVib3VuY2VUaW1lXG4gICAgICAgIGlmIChkZWJvdW5jZU1zID4gMCkge1xuICAgICAgICAgIGNvbnRyb2wudmFsdWVDaGFuZ2VzXG4gICAgICAgICAgICAucGlwZShkZWJvdW5jZVRpbWUoZGVib3VuY2VNcykpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKGhhbmRsZUNoYW5nZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29udHJvbC52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKGhhbmRsZUNoYW5nZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gZm9ybUdyb3VwU3VibWl0O1xuICB9XG5cbiAgcHJpdmF0ZSBjYWxjdWxhdGVMaW5lTnVtYmVyKCkge1xuICAgIHRoaXMubGluZXNGb3JtQXJyYXkuY29udHJvbHMuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgIGl0ZW0uZ2V0KFwibGluZUluZGV4XCIpLnNldFZhbHVlKGluZGV4ICsgMSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOe8lui+keeahOaXtuWAmeaVsOaNruWkhOeQhlxuICAgKi9cbiAgYWRkRm9ybUxpbmVXaXRoRGF0YSgpIHtcbiAgICB0aGlzLmZvcm1MaW5lc0RhdGEuZm9yRWFjaCgoZm9ybUxpbmVzRGF0YUl0ZW0pID0+IHtcbiAgICAgIHRoaXMubGluZXNGb3JtQXJyYXkuaW5zZXJ0KFxuICAgICAgICB0aGlzLmxpbmVzRm9ybUFycmF5LmNvbnRyb2xzLmxlbmd0aCxcbiAgICAgICAgdGhpcy5jcmVhdGVMaW5lRnJvbVZhbHVlcyhmb3JtTGluZXNEYXRhSXRlbSksXG4gICAgICApO1xuICAgIH0pO1xuICAgIHRoaXMuY2FsY3VsYXRlTGluZU51bWJlcigpO1xuICAgIHRoaXMudGFibGVMb2FkaW5nID0gZmFsc2U7XG4gICAgdGhpcy5zaG93Rm9ybSA9IHRydWU7XG4gIH1cblxuICAvKipcbiAgICog5Zyo5oyH5a6a6KGM5LiL5pa55paw5aKe56m66KGM77yb5LiN5LygIGFmdGVyTGluZSDliJnov73liqDliLDmnKvlsL5cbiAgICogQHBhcmFtIGFmdGVyTGluZSDlvZPliY3ooYwgRm9ybUdyb3Vw77yI5LiN6KaB5LygIGxpbmVJbmRleO+8jOmBv+WFjeW6j+WPt+WBj+enu+WvvOiHtOaPkumUmeS9jee9ru+8iVxuICAgKi9cbiAgYWRkRm9ybUxpbmUoYWZ0ZXJMaW5lPzogRm9ybUdyb3VwIHwgbnVsbCwgaXNGb2N1czogYm9vbGVhbiA9IHRydWUpIHtcbiAgICBjb25zdCBpbnNlcnRBdCA9IHRoaXMuZ2V0SW5zZXJ0SW5kZXhBZnRlcihhZnRlckxpbmUpO1xuICAgIGNvbnN0IG5ld0xpbmUgPSB0aGlzLm5ld0xpbmVJdGVtKCk7XG4gICAgdGhpcy5saW5lc0Zvcm1BcnJheS5pbnNlcnQoaW5zZXJ0QXQsIG5ld0xpbmUpO1xuICAgIHRoaXMuY2FsY3VsYXRlTGluZU51bWJlcigpO1xuICAgIHRoaXMuYWRkTGluZUV2ZW50LmVtaXQobmV3TGluZSk7XG4gICAgLy8g6Lez5Yiw5paw5aKe6KGM5omA5Zyo6aG177yM6YG/5YWN6aG156CB5byC5bi45pe255yL5LiN5Yiw5pWw5o2uXG4gICAgdGhpcy5wYWdpbmF0aW9uUGFnZUluZGV4ID1cbiAgICAgIE1hdGguZmxvb3IoaW5zZXJ0QXQgLyB0aGlzLnBhZ2luYXRpb25QYWdlU2l6ZSkgKyAxO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5jb2xsZWN0RG9tRGF0YSgpO1xuICAgICAgaWYgKGlzRm9jdXMpIHtcbiAgICAgICAgdGhpcy5hY3RpdmVEb21YID0gdGhpcy50b1BhZ2VMb2NhbFJvd0luZGV4KGluc2VydEF0KTtcbiAgICAgICAgdGhpcy5hY3RpdmVEb21ZID0gMDtcbiAgICAgICAgY29uc29sZS5sb2coXCLmiafooYzov4fnqIsxM1wiKTtcbiAgICAgICAgdGhpcy5mb2N1c0RvbSh0aGlzLmFjdGl2ZURvbVgsIHRoaXMuYWN0aXZlRG9tWSk7XG4gICAgICB9XG4gICAgfSwgMCk7XG4gIH1cblxuICAvKipcbiAgICog5aSN5Yi25b2T5YmN6KGM77ya5Zyo5b2T5YmN6KGM5LiL5pa55paw5aKe5LiA6KGM77yM5aSN5Yi25omA5pyJ5a2X5q615YC877yI5ZCr6ZqQ6JeP5a2X5q6177yJXG4gICAqL1xuICBjb3B5Rm9ybUxpbmUobGluZTogRm9ybUdyb3VwKSB7XG4gICAgY29uc3Qgc291cmNlSW5kZXggPSB0aGlzLmxpbmVzRm9ybUFycmF5LmNvbnRyb2xzLmluZGV4T2YobGluZSk7XG4gICAgaWYgKHNvdXJjZUluZGV4IDwgMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBnZXRSYXdWYWx1ZSDljIXlkKsgZGlzYWJsZWQg5a2X5q6177yb5aSN5Yi26KGM5L2/55So5paw55qEIF9oZFJvd0lkXG4gICAgY29uc3Qgc291cmNlVmFsdWVzID0gbGluZS5nZXRSYXdWYWx1ZSgpO1xuICAgIGNvbnN0IGluc2VydEF0ID0gc291cmNlSW5kZXggKyAxO1xuICAgIHRoaXMubGluZXNGb3JtQXJyYXkuaW5zZXJ0KFxuICAgICAgaW5zZXJ0QXQsXG4gICAgICB0aGlzLmNyZWF0ZUxpbmVGcm9tVmFsdWVzKHNvdXJjZVZhbHVlcywgZmFsc2UsIHRydWUpLFxuICAgICk7XG4gICAgdGhpcy5jYWxjdWxhdGVMaW5lTnVtYmVyKCk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmNvbGxlY3REb21EYXRhKCk7XG4gICAgICB0aGlzLmFjdGl2ZURvbVggPSB0aGlzLnRvUGFnZUxvY2FsUm93SW5kZXgoaW5zZXJ0QXQpO1xuICAgICAgdGhpcy5hY3RpdmVEb21ZID0gMDtcbiAgICAgIHRoaXMuZm9jdXNEb20odGhpcy5hY3RpdmVEb21YLCB0aGlzLmFjdGl2ZURvbVkpO1xuICAgIH0sIDApO1xuICB9XG5cbiAgQE91dHB1dCgpIGRlbGV0ZUxpbmVFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAvKipcbiAgICog5Yig6Zmk6KGMXG4gICAqIEBwYXJhbSBsaW5lT3JJbmRleCDooYwgRm9ybUdyb3Vw77yM5oiWIDEtYmFzZWQg55qEIGxpbmVJbmRleO+8iOWFvOWuuSByZXNldEZvcm3vvIlcbiAgICovXG4gIGRlbGV0ZUZvcm1MaW5lKGxpbmVPckluZGV4OiBGb3JtR3JvdXAgfCBudW1iZXIpIHtcbiAgICBsZXQgcmVtb3ZlQXQgPSAtMTtcbiAgICBpZiAodHlwZW9mIGxpbmVPckluZGV4ID09PSBcIm51bWJlclwiKSB7XG4gICAgICByZW1vdmVBdCA9IGxpbmVPckluZGV4IC0gMTtcbiAgICB9IGVsc2UgaWYgKGxpbmVPckluZGV4KSB7XG4gICAgICByZW1vdmVBdCA9IHRoaXMubGluZXNGb3JtQXJyYXkuY29udHJvbHMuaW5kZXhPZihsaW5lT3JJbmRleCk7XG4gICAgfVxuICAgIGNvbnNvbGUubG9nKFxuICAgICAgXCJpbmRleFwiLFxuICAgICAgdHlwZW9mIGxpbmVPckluZGV4ID09PSBcIm51bWJlclwiID8gbGluZU9ySW5kZXggOiByZW1vdmVBdCxcbiAgICApO1xuICAgIGlmIChyZW1vdmVBdCA8IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8g5pyA5ZCO5LiA5p2h5pWw5o2u55qE5pe25YCZ6KaB5Yik5pat5LiA5LiLXG4gICAgaWYgKHRoaXMubGluZXNGb3JtQXJyYXkuY29udHJvbHMubGVuZ3RoID09PSAxICYmICF0aGlzLmFsbG93RW1wdHkpIHtcbiAgICAgIGlmICh0aGlzLmRlbGV0ZUxhc3RMaW5lRXZlbnQpIHtcbiAgICAgICAgdGhpcy5kZWxldGVMYXN0TGluZUV2ZW50LmVtaXQoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcmVtb3ZlZExpbmUgPSB0aGlzLmxpbmVzRm9ybUFycmF5LmF0KHJlbW92ZUF0KSBhcyBGb3JtR3JvdXA7XG4gICAgdGhpcy5saW5lc0Zvcm1BcnJheS5yZW1vdmVBdChyZW1vdmVBdCk7XG4gICAgdGhpcy5yZW1vdmVMaW5lRnJvbVNlbGVjdGlvbihyZW1vdmVkTGluZSk7XG4gICAgaWYgKFxuICAgICAgIXRoaXMuaXNGaWx0ZXJEYXRhICYmXG4gICAgICB0aGlzLmxpbmVzRm9ybUFycmF5LmNvbnRyb2xzICYmXG4gICAgICB0aGlzLmxpbmVzRm9ybUFycmF5LmNvbnRyb2xzLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgIXRoaXMuaXNUcnVseUVtcHR5QWxsb3dlZFxuICAgICkge1xuICAgICAgdGhpcy5hZGRGb3JtTGluZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyDlvZPliY3pobXlt7Lml6DmlbDmja7ml7blm57pgIDpobXnoIHvvIzkuJTpobXnoIHmnIDlsI/kuLogMe+8iOmBv+WFjeWIoOepuuWQjuWPmOaIkCAwIOWvvOiHtOWGjea3u+WKoOeci+S4jeinge+8iVxuICAgICAgY29uc3QgbWF4UGFnZSA9IE1hdGgubWF4KFxuICAgICAgICAxLFxuICAgICAgICBNYXRoLmNlaWwoXG4gICAgICAgICAgdGhpcy5saW5lc0Zvcm1BcnJheS5jb250cm9scy5sZW5ndGggLyB0aGlzLnBhZ2luYXRpb25QYWdlU2l6ZSxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgICBpZiAodGhpcy5wYWdpbmF0aW9uUGFnZUluZGV4ID4gbWF4UGFnZSkge1xuICAgICAgICB0aGlzLnBhZ2luYXRpb25QYWdlSW5kZXggPSBtYXhQYWdlO1xuICAgICAgfVxuICAgICAgdGhpcy5jYWxjdWxhdGVMaW5lTnVtYmVyKCk7XG4gICAgfVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5jb2xsZWN0RG9tRGF0YSgpO1xuICAgIH0sIDApO1xuICB9XG5cbiAgLyoqIOWcqOaMh+WumuihjOWQjuaWueeahOaPkuWFpeS4i+agh++8m+aXoOihjOWImei/veWKoOWIsOacq+WwviAqL1xuICBwcml2YXRlIGdldEluc2VydEluZGV4QWZ0ZXIoYWZ0ZXJMaW5lPzogRm9ybUdyb3VwIHwgbnVsbCk6IG51bWJlciB7XG4gICAgaWYgKCFhZnRlckxpbmUpIHtcbiAgICAgIHJldHVybiB0aGlzLmxpbmVzRm9ybUFycmF5LmNvbnRyb2xzLmxlbmd0aDtcbiAgICB9XG4gICAgY29uc3QgaWR4ID0gdGhpcy5saW5lc0Zvcm1BcnJheS5jb250cm9scy5pbmRleE9mKGFmdGVyTGluZSk7XG4gICAgcmV0dXJuIGlkeCA+PSAwID8gaWR4ICsgMSA6IHRoaXMubGluZXNGb3JtQXJyYXkuY29udHJvbHMubGVuZ3RoO1xuICB9XG5cbiAgLyoqIOWFqOWxgOihjOS4i+agh+i9rOW9k+WJjemhteWGheeahOihjOS4i+agh++8iOS+m+iBmueEpueUqO+8iSAqL1xuICBwcml2YXRlIHRvUGFnZUxvY2FsUm93SW5kZXgoZ2xvYmFsSW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIChcbiAgICAgIGdsb2JhbEluZGV4IC0gKHRoaXMucGFnaW5hdGlvblBhZ2VJbmRleCAtIDEpICogdGhpcy5wYWdpbmF0aW9uUGFnZVNpemVcbiAgICApO1xuICB9XG5cbiAgcHVibGljIHBhZ2VJbmRleENoYW5nZShldmVudDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5wYWdpbmF0aW9uUGFnZUluZGV4ID0gZXZlbnQ7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmNvbGxlY3REb21EYXRhKCk7XG4gICAgfSwgMCk7XG4gIH1cblxuICBwdWJsaWMgcGFnZVNpemVDaGFuZ2UoZXZlbnQ6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMucGFnaW5hdGlvblBhZ2VTaXplID0gZXZlbnQ7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmNvbGxlY3REb21EYXRhKCk7XG4gICAgfSwgMCk7XG4gIH1cblxuICBwcml2YXRlIG9uSGRGb3JtVmFsdWVDaGFuZ2VkKGRhdGE/OiBhbnkpIHtcbiAgICBpZiAodGhpcy5pc0ZpbHRlckRhdGEpIHtcbiAgICAgIGlmIChkYXRhICYmIGRhdGEubGluZXMgJiYgdGhpcy5maWx0ZXJJbmRleFN0b3JlLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICBjb25zdCBsaW5lcyA9IGRhdGEubGluZXM7XG4gICAgICAgIGlmIChsaW5lcy5sZW5ndGggPT09IHRoaXMuZmlsdGVySW5kZXhTdG9yZS5sZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLmZpbHRlckluZGV4U3RvcmUuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc3RvcmVGb3JtTGluZXNEYXRhW2l0ZW1dID0ge1xuICAgICAgICAgICAgICAuLi50aGlzLmZpbHRlclN0b3JlRm9ybUxpbmVzRGF0YVtpbmRleF0sXG4gICAgICAgICAgICAgIC4uLmxpbmVzW2luZGV4XSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAobGluZXMubGVuZ3RoID4gdGhpcy5maWx0ZXJJbmRleFN0b3JlLmxlbmd0aCkge1xuICAgICAgICAgIC8vIOacieaWsOWinuaVsOaNrueahOaDheWGtVxuICAgICAgICAgIC8vIHN0ZXAgMTog5YWI5om+5paw5aKe55qEaW5kZXjkuIvmoIdcbiAgICAgICAgICBjb25zdCBnZXROb3dMaW5lcyA9IHRoaXMudmFsaWRhdGVIZEZvcm1MaW5lcy5nZXRSYXdWYWx1ZSgpLmxpbmVzO1xuICAgICAgICAgIGxldCBhZGRJbmRleCA9IC0xO1xuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZ2V0Tm93TGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChnZXROb3dMaW5lc1tpXS5pc0hkRm9ybUxpbmVTZWFyY2hBZGQpIHtcbiAgICAgICAgICAgICAgYWRkSW5kZXggPSBpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGFkZEluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgdGhpcy5zdG9yZUZvcm1MaW5lc0RhdGEuc3BsaWNlKFxuICAgICAgICAgICAgICB0aGlzLmZpbHRlckluZGV4U3RvcmVbYWRkSW5kZXggLSAxXSArIDEsXG4gICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgIGdldE5vd0xpbmVzW2FkZEluZGV4XSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuZmlsdGVySW5kZXhTdG9yZS5wdXNoKHRoaXMuZmlsdGVySW5kZXhTdG9yZVthZGRJbmRleCAtIDFdICsgMSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8g5pyJ5Yig6Zmk5pWw5o2u55qE5oOF5Ya1XG4gICAgICAgICAgLy8gc3RlcCAxOuWFiOaJvuWIsOWIoOmZpOeahGluZGV45LiL5qCHXG4gICAgICAgICAgbGV0IGRlbGV0ZWRJbmRleCA9IC0xO1xuICAgICAgICAgIGxldCBjb3VudCA9IDA7XG4gICAgICAgICAgaWYgKGxpbmVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgZGVsZXRlZEluZGV4ID0gMDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICBpZiAobGluZXNbaV0ubGluZUluZGV4IC0gY291bnQgPiAxKSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlZEluZGV4ID0gaTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb3VudCsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZGVsZXRlZEluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgLy8gc3RlcCAyOiDliKDpmaTmgLvmlbDmja7kuK3nmoTlr7nlupTmlbDmja4sIOaKiuS4i+agh+aVsOe7hOWSjGxpbmVz6ZW/5bqm5a+56b2Q77yM5ZCM5pe25oqK5LiL5qCH5pWw57uE5ZyoZGVsZXRlZEluZGV45ZCO6Z2i55qE5YC85YWo6YO9LTFcbiAgICAgICAgICAgIHRoaXMuc3RvcmVGb3JtTGluZXNEYXRhID0gdGhpcy5zdG9yZUZvcm1MaW5lc0RhdGEuZmlsdGVyKFxuICAgICAgICAgICAgICAoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXggIT09IHRoaXMuZmlsdGVySW5kZXhTdG9yZVtkZWxldGVkSW5kZXhdO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVySW5kZXhTdG9yZS5zcGxpY2UoZGVsZXRlZEluZGV4LCAxKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5maWx0ZXJJbmRleFN0b3JlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgIGlmIChpID49IGRlbGV0ZWRJbmRleCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVySW5kZXhTdG9yZVtpXS0tO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHN0ZXAgMjog5rKh5pyJ5om+5YiwZGVsZXRlZEluZGV46K+05piO5Yig6Zmk5pON5L2c5Zyo5pyA5ZCO5LiA6KGMXG4gICAgICAgICAgICBjb25zdCBmaWx0ZXJJbmRleCA9XG4gICAgICAgICAgICAgIHRoaXMuZmlsdGVySW5kZXhTdG9yZVt0aGlzLmZpbHRlckluZGV4U3RvcmUubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICB0aGlzLnN0b3JlRm9ybUxpbmVzRGF0YSA9IHRoaXMuc3RvcmVGb3JtTGluZXNEYXRhLmZpbHRlcihcbiAgICAgICAgICAgICAgKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGluZGV4ICE9PSBmaWx0ZXJJbmRleDtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLmZpbHRlckluZGV4U3RvcmUucG9wKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoZGF0YSAmJiBkYXRhLmxpbmVzKSB7XG4gICAgICAgICAgdGhpcy5zdG9yZUZvcm1MaW5lc0RhdGEgPSBkYXRhLmxpbmVzO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChkYXRhICYmIGRhdGEubGluZXMpIHtcbiAgICAgICAgdGhpcy5zdG9yZUZvcm1MaW5lc0RhdGEgPSBkYXRhLmxpbmVzO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIOaAu+ihqOWNlVxuICAgIGlmICghdGhpcy5pc0ZpbHRlckRhdGEpIHtcbiAgICAgIHRoaXMuZm9ybVZhbGlkID0gdGhpcy52YWxpZGF0ZUhkRm9ybUxpbmVzLnZhbGlkO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5mb3JtVmFsaWQpIHtcbiAgICAgICAgLy8g5aaC5p6c5pW05L2T6KGo5Y2V5pivdHJ1Ze+8jOS4jeeuoeWtkOihqOWNleaYr+S7gOS5iO+8jOmDveWPmOaIkOWtkOihqOWNleeahOeKtuaAgVxuICAgICAgICB0aGlzLmZvcm1WYWxpZCA9IHRoaXMudmFsaWRhdGVIZEZvcm1MaW5lcy52YWxpZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIOWmguaenOaVtOS9k+ihqOWNleaYr2ZhbHNl77yaMeOAgeWtkOihqOWNleS4unRydWXvvIzpnIDopoHph43nrpfvvJsy44CB5a2Q6KGo5Y2V5Li6ZmFsc2XvvIznlKjlrZDooajljZXnirbmgIFcbiAgICAgICAgaWYgKHRoaXMudmFsaWRhdGVIZEZvcm1MaW5lcy52YWxpZCkge1xuICAgICAgICAgIHRoaXMuZm9ybVZhbGlkID0gdGhpcy5pbm5lckdldFZhbGlkKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5mb3JtVmFsaWQgPSB0aGlzLnZhbGlkYXRlSGRGb3JtTGluZXMudmFsaWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgLy8gdGhpcy5jYWxjdWxhdGVMaW5lTnVtYmVyKCk7XG4gICAgdGhpcy5jaGFuZ2VFdmVudC5lbWl0KHRoaXMudmFsaWRhdGVIZEZvcm1MaW5lcyk7XG4gIH1cblxuICBwcml2YXRlIGNoZWNrTGlzdChsaXN0OiBBcnJheTxGb3JtTGluZT4pOiBib29sZWFuIHtcbiAgICBpZiAoIWxpc3QgfHwgKGxpc3QgJiYgbGlzdC5sZW5ndGggPT09IDApKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGxldCBuYW1lTGlzdCA9IFtdO1xuICAgIGxldCBzZWxlY3RPcHRpb25DaGVja0xpc3QgPSBbXTtcbiAgICBsaXN0LmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIC8vIOagoemqjOWNlemhuemAieaLqeWZqFxuICAgICAgLy8gaWYgKGl0ZW0udHlwZSA9PT0gRm9ybUxpbmVUeXBlLlNlbGVjdCAmJiAoIWl0ZW0uc2VsZWN0TGlzdCB8fCAoaXRlbS5zZWxlY3RMaXN0ICYmIGl0ZW0uc2VsZWN0TGlzdC5sZW5ndGggPT09IDApKSkge1xuICAgICAgLy8gICB0aHJvdyAnZm9ybUxpbmVz57uE5Lu25pWw5o2u5qC85byP5LiN6KeE6IyD77yM5a2Y5Zyo5Y2V6aG56YCJ5oup5Zmo5rKh5pyJ5Lyg5YWl6YCJ6aG5ISdcbiAgICAgIC8vIH1cbiAgICAgIG5hbWVMaXN0LnB1c2goaXRlbS5uYW1lKTtcblxuICAgICAgLy8g5qCh6aqM5pyJb25TZWFyY2jnmoTlrZfmrrXnmoRzZWxlY3RPcHRpb27nmoR2YWx1ZeOAgWxhYmVs5piv5ZCm5ZyoZm9ybUxpbmXph4zpnaLpg73lrprkuYnkuoZcbiAgICAgIGlmIChpdGVtLm9uU2VhcmNoRXZlbnQgJiYgaXRlbS5zZWxlY3RPcHRpb24pIHtcbiAgICAgICAgc2VsZWN0T3B0aW9uQ2hlY2tMaXN0ID0gW107XG4gICAgICAgIGxpc3QuZm9yRWFjaCgoaW5uZXJJdGVtKSA9PiB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgaW5uZXJJdGVtLm5hbWUgPT09IGl0ZW0uc2VsZWN0T3B0aW9uLnZhbHVlIHx8XG4gICAgICAgICAgICBpbm5lckl0ZW0ubmFtZSA9PT0gaXRlbS5zZWxlY3RPcHRpb24ubGFiZWxcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHNlbGVjdE9wdGlvbkNoZWNrTGlzdC5wdXNoKGlubmVySXRlbS5uYW1lKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoc2VsZWN0T3B0aW9uQ2hlY2tMaXN0Lmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICB0aHJvdyBgZm9ybUxpbmVz57uE5Lu25pWw5o2u5qC85byP5LiN6KeE6IyD77yM5a2X5q61JHtpdGVtLm5hbWV955qEc2VsZWN0T3B0aW9u55qEdmFsdWXjgIFsYWJlbOWtl+auteacquiDveWcqGZvcm1MaW5lc+S4reaJvuWIsOWvueW6lOWtl+aute+8gWA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICAvLyDmoKHpqoxuYW1l5piv5ZCm6YeN5aSNXG4gICAgaWYgKFsuLi5uZXcgU2V0KG5hbWVMaXN0KV0ubGVuZ3RoICE9PSBsaXN0Lmxlbmd0aCkge1xuICAgICAgdGhyb3cgXCJmb3JtTGluZXPnu4Tku7bmlbDmja7moLzlvI/kuI3op4TojIPvvIzlrZjlnKjph43lpI1uYW1l5YC8IVwiO1xuICAgIH1cbiAgICAvLyAuLi5tb3JlIGNoZWNrXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwdWJsaWMgc3VibWl0Rm9ybSgpOiB2b2lkIHtcbiAgICB0aGlzLmNoYW5nZUV2ZW50LmVtaXQodGhpcy52YWxpZGF0ZUhkRm9ybUxpbmVzLmdldFJhd1ZhbHVlKCkpO1xuICB9XG5cbiAgcHVibGljIHJlc2V0Rm9ybSgpOiB2b2lkIHtcbiAgICAvLyDliKDpmaRcbiAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKCk7XG4gICAgZm9yIChsZXQgaSA9IHRoaXMubGluZXNGb3JtQXJyYXkuY29udHJvbHMubGVuZ3RoOyBpID49IDA7IGktLSkge1xuICAgICAgdGhpcy5kZWxldGVGb3JtTGluZShpKTtcbiAgICB9XG4gICAgdGhpcy5wYWdpbmF0aW9uUGFnZUluZGV4ID0gMTtcbiAgfVxuXG4gIHB1YmxpYyBpbnB1dENsZWFuKGZvcm1JdGVtOiBhbnksIGxpbmU6IGFueSk6IHZvaWQge1xuICAgIGxpbmUuZ2V0KGZvcm1JdGVtLm5hbWUpLnNldFZhbHVlKG51bGwpO1xuICB9XG5cbiAgcHVibGljIHNlbGVjdFZhbHVlKGlkOiBzdHJpbmcsIHJvd051bWJlcjogbnVtYmVyLCBjb2xOdW1iZXI6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGlucHV0RG9tOiBhbnkgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGlkKTtcbiAgICBpbnB1dERvbS5zZWxlY3QoKTtcbiAgICB0aGlzLnNldEFjdGl2ZURvbUluRm9ybUxpbmVzKHJvd051bWJlciwgY29sTnVtYmVyKTtcbiAgfVxuXG4gIHByaXZhdGUgdGV4dFdpZHRoQ2FjaGU6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0gPSB7fTtcblxuICBpc1RleHRPdmVyZmxvdyh0ZXh0OiBzdHJpbmcsIG1heFdpZHRoOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBjb25zdCBjYWNoZWRXaWR0aCA9IHRoaXMudGV4dFdpZHRoQ2FjaGVbdGV4dF07XG4gICAgaWYgKGNhY2hlZFdpZHRoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBjYWNoZWRXaWR0aCArIDE1ID49IG1heFdpZHRoO1xuICAgIH1cblxuICAgIGNvbnN0IHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgICBzcGFuLnN0eWxlLnZpc2liaWxpdHkgPSBcImhpZGRlblwiO1xuICAgIHNwYW4uc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XG4gICAgc3Bhbi5zdHlsZS53aGl0ZVNwYWNlID0gXCJub3dyYXBcIjtcbiAgICBzcGFuLnN0eWxlLmZvbnRTaXplID0gXCIxNHB4XCI7XG4gICAgc3Bhbi5zdHlsZS5kaXNwbGF5ID0gXCJpbmxpbmUtYmxvY2tcIjsgLy8g5bCG5qC35byP5L+u5pS55Li6IGlubGluZS1ibG9ja1xuICAgIHNwYW4uaW5uZXJUZXh0ID0gdGV4dDtcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHNwYW4pO1xuICAgIGNvbnN0IGlzT3ZlcmZsb3cgPSBzcGFuLm9mZnNldFdpZHRoICsgMTUgPj0gbWF4V2lkdGg7XG4gICAgdGhpcy50ZXh0V2lkdGhDYWNoZVt0ZXh0XSA9IHNwYW4ub2Zmc2V0V2lkdGg7XG4gICAgc3Bhbi5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChzcGFuKTtcbiAgICByZXR1cm4gaXNPdmVyZmxvdztcbiAgfVxuXG4gIGp1ZGdlQ29sRW1wdHkoc3RyOiBhbnkpIHtcbiAgICBpZiAoc3RyIHx8IHN0ciA9PT0gMCkge1xuICAgICAgcmV0dXJuIHN0cjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFwiPOepuj5cIjtcbiAgICB9XG4gIH1cblxuICBqdWRnZVZhbHVlSXNOb3RFbXB0eShzdHI6IGFueSkge1xuICAgIGlmIChzdHIgPT09IG51bGwgJiYgc3RyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG59XG4iXX0=
3324
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGQtZm9ybS1saW5lcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9mYW50YXN5LW5nem9ycm8vIiwic291cmNlcyI6WyJoZC1mb3JtLWxpbmVzL2hkLWZvcm0tbGluZXMuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUVMLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsWUFBWSxFQUNaLFVBQVUsRUFDVixZQUFZLEVBQ1osS0FBSyxFQUdMLE1BQU0sRUFDTixTQUFTLEVBRVQsV0FBVyxFQUNYLFlBQVksR0FDYixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQWEsV0FBVyxFQUFhLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQy9FLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDL0IsT0FBTyxLQUFLLFdBQVcsTUFBTSxhQUFhLENBQUM7QUFDM0MsT0FBTyxFQUNMLFlBQVksRUFDWixxQkFBcUIsRUFDckIsc0JBQXNCLEVBQ3RCLHNCQUFzQixFQUN0QixpQkFBaUIsRUFDakIscUJBQXFCLEdBQ3RCLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxPQUFPLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQzdDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUk5QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUN6RSxPQUFPLEVBQVksWUFBWSxFQUFFLG9CQUFvQixFQUFFLE1BQU0seUJBQXlCLENBQUM7Ozs7O0lBR2pGLHNDQUFzQyxHQUFHLEVBQUU7QUFFakQ7SUFnSEUsOEJBQ1UsRUFBZSxFQUNmLEdBQXNCLEVBQ3RCLG9CQUEwQztRQUhwRCxpQkFxQkM7UUFwQlMsT0FBRSxHQUFGLEVBQUUsQ0FBYTtRQUNmLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBQ3RCLHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBc0I7UUEzRzNCLG1CQUFjLEdBQVksSUFBSSxDQUFDO1FBQy9CLGVBQVUsR0FBWSxJQUFJLENBQUM7UUFDMUMsd0JBQW1CLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUMxQiwyQkFBc0IsR0FBWSxLQUFLLENBQUM7Ozs7UUFFeEMsMEJBQXFCLEdBQVksSUFBSSxDQUFDO1FBQ3RDLGlCQUFZLEdBQVksS0FBSyxDQUFDO1FBQzlCLGVBQVUsR0FBWSxLQUFLLENBQUM7Ozs7UUFFNUIsaUJBQVksR0FBWSxLQUFLLENBQUM7Ozs7UUFFOUIsb0JBQWUsR0FBWSxLQUFLLENBQUM7UUFNakQsbUJBQWMsR0FBa0IsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyw0QkFBNEI7O1FBQy9FLFdBQU0sR0FBOEIsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUM7UUFDaEQsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDOzs7O1FBRWpDLGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQWEsQ0FBQzs7OztRQUU3QyxvQkFBZSxHQUFHLElBQUksWUFBWSxFQUFlLENBQUM7UUFDbkMsc0JBQWlCLEdBQVksS0FBSyxDQUFDO1FBQzVELHdCQUFtQixHQUFXLENBQUMsQ0FBQztRQUNoQyx1QkFBa0IsR0FBVyxFQUFFLENBQUM7O1FBTVAsY0FBUyxHQUFZLEtBQUssQ0FBQztRQUMzQyxnQkFBVyxHQUF1QixFQUFFLENBQUM7UUFDckMsa0JBQWEsR0FBb0IsQ0FBQyxDQUFDO1FBQzVDLG9CQUFlLEdBQUcsRUFBRSxDQUFDO1FBRXJCLGFBQVEsR0FBWSxLQUFLLENBQUM7UUFFMUIsdUJBQWtCLEdBQVEsRUFBRSxDQUFDLENBQUMsWUFBWTs7UUFDMUMsNkJBQXdCLEdBQVEsRUFBRSxDQUFDLENBQUMsWUFBWTs7UUFDaEQscUJBQWdCLEdBQWtCLEVBQUUsQ0FBQyxDQUFDLG1CQUFtQjs7UUFDekQsaUJBQVksR0FBWSxLQUFLLENBQUMsQ0FBQyxjQUFjOztRQUM3QyxjQUFTLEdBQVksS0FBSyxDQUFDLENBQUMsVUFBVTs7Ozs7UUFFOUIsbUJBQWMsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO1FBQ25DLGtCQUFhLEdBQUcsSUFBSSxPQUFPLEVBQXNDLENBQUM7UUFDbEUsb0JBQWUsR0FBVyxDQUFDLENBQUMsQ0FBQyxTQUFTO1FBS3RDLHNCQUFpQixHQUFHLElBQUksT0FBTyxFQUFzQyxDQUFDO1FBQ3RFLDhCQUF5QixHQUFXLENBQUMsQ0FBQzs7UUFJOUMsbUJBQWMsR0FTVixFQUFFLENBQUM7O1FBRVAsZUFBVSxHQUFXLElBQUksQ0FBQztRQUMxQixlQUFVLEdBQVcsSUFBSSxDQUFDO1FBQzFCLGNBQVMsR0FNbUIsSUFBSSxDQUFDO1FBQ2pDLGdDQUEyQixHQUFZLEtBQUssQ0FBQzs7UUFjN0Msc0JBQWlCLEdBQVksS0FBSyxDQUFDO1FBQ25DLGtCQUFhLEdBQVksS0FBSyxDQUFDO1FBQy9CLGlCQUFZLEdBQW9CLEVBQUUsQ0FBQztRQUNuQyxrQkFBYSxHQUFvQixFQUFFLENBQUM7UUFDcEMsdUJBQWtCLEdBQW9CLEVBQUUsQ0FBQztRQUN6Qyx3QkFBbUIsR0FBb0IsRUFBRSxDQUFDO1FBQzFDLHlCQUFvQixHQUF5QixJQUFJLG9CQUFvQixFQUFFLENBQUM7UUFDaEUsZ0JBQVcsR0FBUSxJQUFJLENBQUM7UUFDeEIsaUJBQVksR0FBVyxFQUFFLENBQUM7Ozs7UUFHMUIsb0JBQWUsR0FBWSxLQUFLLENBQUM7UUE0aUQvQixvQkFBZSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUF1UHZDLG1CQUFjLEdBQThCLEVBQUUsQ0FBQztRQTV4RHJELElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDLGNBQWMsQ0FBQztZQUM1QyxNQUFNLEVBQUUsV0FBVyxDQUFDLFNBQVM7WUFDN0IsSUFBSSxFQUFFLFNBQVM7WUFDZixPQUFPLEVBQUUsR0FBRztZQUNaLFNBQVMsRUFBRSxlQUFlO1NBQzNCLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsYUFBYTthQUN6QyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQzthQUN4QyxTQUFTOzs7O1FBQUMsVUFBQyxFQUFtQjtnQkFBakIsVUFBRSxFQUFFLGdCQUFLLEVBQUUsY0FBSTtZQUFPLE9BQUEsS0FBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQztRQUFsQyxDQUFrQyxFQUFDLENBQUM7UUFDMUUsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQyxpQkFBaUI7YUFDakQsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQUMsQ0FBQzthQUNsRCxTQUFTOzs7O1FBQUMsVUFBQyxFQUFtQjtnQkFBakIsVUFBRSxFQUFFLGdCQUFLLEVBQUUsY0FBSTtZQUMzQixJQUFJLEtBQUssRUFBRTtnQkFDVCxLQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7YUFDcEM7UUFDSCxDQUFDLEVBQUMsQ0FBQztJQUNQLENBQUM7Ozs7SUFFRCx1Q0FBUTs7O0lBQVI7UUFDRSxJQUFJLENBQUMsWUFBWSxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUM7UUFDdEMsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3JCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1NBQzNEO1FBQ0QsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsVUFBVSxDQUNyRCw4QkFBOEIsQ0FDL0IsQ0FBQztRQUNGLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ3JCLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUM7U0FDeEM7UUFDRCxhQUFhO1FBQ2IsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDN0MsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNkLENBQUM7Ozs7SUFFRCw4Q0FBZTs7O0lBQWY7UUFBQSxpQkFLQztRQUpDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxTQUFTOzs7UUFBQztZQUNqRSxLQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDeEIsQ0FBQyxFQUFDLENBQUM7SUFDTCxDQUFDOzs7O0lBRUQsMENBQVc7OztJQUFYO1FBQ0UsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUU7WUFDM0IsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsRUFBRSxDQUFDO1NBQ3ZDO1FBQ0QsSUFBSSxJQUFJLENBQUMsc0JBQXNCLEVBQUU7WUFDL0IsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFdBQVcsRUFBRSxDQUFDO1NBQzNDO1FBQ0QsSUFBSSxJQUFJLENBQUMsbUJBQW1CLEVBQUU7WUFDNUIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsRUFBRSxDQUFDO1NBQ3hDO0lBQ0gsQ0FBQztJQUVELHNCQUFJLGlEQUFlOzs7O1FBQW5CO1lBQ0UsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7UUFDN0MsQ0FBQzs7O09BQUE7SUFFRCxzQkFBSSxpREFBZTs7OztRQUFuQjs7Z0JBQ1EsS0FBSyxHQUFHLENBQUMsSUFBSSxDQUFDLGNBQWMsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNOzs7O1lBQUMsVUFBQyxHQUFHO2dCQUNuRCxPQUFBLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDO1lBQXZDLENBQXVDLEVBQ3hDLENBQUMsTUFBTTtZQUNSLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2xDLENBQUM7OztPQUFBO0lBR0Qsc0JBQUkscURBQW1CO1FBRHZCLGlEQUFpRDs7Ozs7UUFDakQ7O2dCQUNRLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxjQUFjLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTTs7OztZQUFDLFVBQUMsR0FBRztnQkFDckQsT0FBQSxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQztZQUF2QyxDQUF1QyxFQUN4QztZQUNELE9BQU8sQ0FDTCxJQUFJLENBQUMsVUFBVTtnQkFDZixPQUFPLENBQUMsTUFBTSxLQUFLLENBQUM7Z0JBQ3BCLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxRQUFRLENBQ3hCLENBQUM7UUFDSixDQUFDOzs7T0FBQTtJQUdELHNCQUFJLGdEQUFjO1FBRGxCLDBCQUEwQjs7Ozs7UUFDMUI7WUFDRSxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1FBQzVDLENBQUM7OztPQUFBOzs7OztJQUVPLDRDQUFhOzs7O0lBQXJCO1FBQ0UsT0FBTyxZQUFVLElBQUksQ0FBQyxHQUFHLEVBQUUsU0FBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFHLENBQUM7SUFDMUUsQ0FBQzs7Ozs7O0lBRU8sdUNBQVE7Ozs7O0lBQWhCLFVBQWlCLElBQWU7UUFDOUIsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDbEMsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUNELE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDcEMsQ0FBQztJQUVELG9DQUFvQzs7Ozs7O0lBQzVCLGtEQUFtQjs7Ozs7SUFBM0I7O1lBQ1EsS0FBSyxHQUFHLENBQUMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxrQkFBa0I7O1lBQ2hFLEdBQUcsR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDLGtCQUFrQjtRQUMzQyxPQUFPLENBQUMsbUJBQUEsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQWUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDekUsQ0FBQzs7Ozs7SUFFRCw0Q0FBYTs7OztJQUFiLFVBQWMsSUFBZTs7WUFDckIsRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO1FBQzlCLE9BQU8sQ0FBQyxDQUFDLEVBQUUsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM3QyxDQUFDOzs7O0lBRUQsMkNBQVk7OztJQUFaO1FBQUEsaUJBTUM7O1lBTE8sU0FBUyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsRUFBRTtRQUM1QyxPQUFPLENBQ0wsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDO1lBQ3BCLFNBQVMsQ0FBQyxLQUFLOzs7O1lBQUMsVUFBQyxJQUFJLElBQUssT0FBQSxLQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxFQUF4QixDQUF3QixFQUFDLENBQ3BELENBQUM7SUFDSixDQUFDOzs7O0lBRUQsOENBQWU7OztJQUFmO1FBQUEsaUJBTUM7O1lBTE8sU0FBUyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsRUFBRTs7WUFDdEMsWUFBWSxHQUFHLFNBQVMsQ0FBQyxNQUFNOzs7O1FBQUMsVUFBQyxJQUFJO1lBQ3pDLE9BQUEsS0FBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUM7UUFBeEIsQ0FBd0IsRUFDekIsQ0FBQyxNQUFNO1FBQ1IsT0FBTyxZQUFZLEdBQUcsQ0FBQyxJQUFJLFlBQVksR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDO0lBQzdELENBQUM7Ozs7O0lBRUQsMkNBQVk7Ozs7SUFBWixVQUFhLE9BQWdCO1FBQTdCLGlCQWFDO1FBWkMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUMsT0FBTzs7OztRQUFDLFVBQUMsSUFBSTs7Z0JBQ2hDLEVBQUUsR0FBRyxLQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztZQUM5QixJQUFJLENBQUMsRUFBRSxFQUFFO2dCQUNQLE9BQU87YUFDUjtZQUNELElBQUksT0FBTyxFQUFFO2dCQUNYLEtBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2FBQzdCO2lCQUFNO2dCQUNMLEtBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2FBQ2hDO1FBQ0gsQ0FBQyxFQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztJQUM3QixDQUFDOzs7Ozs7SUFFRCxrREFBbUI7Ozs7O0lBQW5CLFVBQW9CLElBQWUsRUFBRSxPQUFnQjs7WUFDN0MsRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO1FBQzlCLElBQUksQ0FBQyxFQUFFLEVBQUU7WUFDUCxPQUFPO1NBQ1I7UUFDRCxJQUFJLE9BQU8sRUFBRTtZQUNYLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQzdCO2FBQU07WUFDTCxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUNoQztRQUNELElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO0lBQzdCLENBQUM7Ozs7O0lBRU8sa0RBQW1COzs7O0lBQTNCO1FBQ0UsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQztRQUNuRCxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzFCLENBQUM7Ozs7OztJQUVPLHNEQUF1Qjs7Ozs7SUFBL0IsVUFBZ0MsSUFBZTs7WUFDdkMsRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO1FBQzlCLElBQUksRUFBRSxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFO1lBQ3JDLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQy9CLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1NBQzVCO0lBQ0gsQ0FBQzs7Ozs7Ozs7SUFFTyxnREFBaUI7Ozs7Ozs7SUFBekIsVUFDRSxJQUFlLEVBQ2YsTUFBZ0MsRUFDaEMsU0FBa0I7UUFIcEIsaUJBd0JDO1FBbkJDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTzs7OztRQUFDLFVBQUMsR0FBRzs7Z0JBQzFCLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztZQUMzQixJQUFJLENBQUMsT0FBTyxFQUFFO2dCQUNaLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLEtBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ25ELE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQ3pCO1lBQ0QsZ0RBQWdEO1lBQ2hELE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDcEQsT0FBTyxDQUFDLGNBQWMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQzNDLE9BQU8sQ0FBQyxlQUFlLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUM1QyxPQUFPLENBQUMsc0JBQXNCLENBQUMsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUNyRCxJQUFJLFNBQVMsRUFBRTs7b0JBQ1AsUUFBUSxHQUFHLEtBQUksQ0FBQyxTQUFTLENBQUMsSUFBSTs7OztnQkFBQyxVQUFDLElBQUksSUFBSyxPQUFBLElBQUksQ0FBQyxJQUFJLEtBQUssR0FBRyxFQUFqQixDQUFpQixFQUFDO2dCQUNqRSxJQUFJLFFBQVEsSUFBSSxRQUFRLENBQUMsYUFBYSxFQUFFO29CQUN0QyxLQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO2lCQUM5RDthQUNGO1FBQ0gsQ0FBQyxFQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRDs7O09BR0c7Ozs7Ozs7O0lBQ0gsdURBQXdCOzs7Ozs7O0lBQXhCLFVBQXlCLElBQWUsRUFBRSxRQUFrQjs7WUFDcEQsT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztRQUN2QyxJQUFJLENBQUMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxRQUFRLEVBQUU7WUFDaEMsT0FBTyxFQUFFLENBQUM7U0FDWDs7WUFDSyxLQUFLLEdBQ1QsT0FBTyxDQUFDLEtBQUssS0FBSyxJQUFJO1lBQ3RCLE9BQU8sQ0FBQyxLQUFLLEtBQUssU0FBUztZQUMzQixPQUFPLENBQUMsS0FBSyxLQUFLLEVBQUU7UUFDdEIsSUFDRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQztZQUNsQyxLQUFLO1lBQ0wsT0FBTyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsRUFDNUI7WUFDQSxPQUFPLE9BQU8sQ0FBQztTQUNoQjtRQUNELE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVELHFEQUFxRDs7Ozs7Ozs7SUFDckQsK0NBQWdCOzs7Ozs7O0lBQWhCLFVBQWlCLEtBQVksRUFBRSxJQUFlLEVBQUUsUUFBa0I7UUFDaEUsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUU7WUFDcEMsT0FBTztTQUNSOztZQUNLLEtBQUssR0FBRyxtQkFBQSxLQUFLLENBQUMsTUFBTSxFQUFvQjtRQUM5QyxJQUFJLEtBQUssSUFBSSxLQUFLLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxTQUFTLEVBQUU7O2dCQUM3RCxJQUFJLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxTQUFTLENBQUM7WUFDckQsS0FBSyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7O2dCQUNiLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7WUFDdkMsSUFBSSxPQUFPLEVBQUU7Z0JBQ1gsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUN4QjtTQUNGO0lBQ0gsQ0FBQztJQUVELHNDQUFzQzs7Ozs7SUFDL0IsK0NBQWdCOzs7O0lBQXZCO1FBQUEsaUJBSUM7UUFIQyxPQUFPLENBQUMsbUJBQUEsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQWUsQ0FBQyxDQUFDLE1BQU07Ozs7UUFBQyxVQUFDLElBQUk7WUFDL0QsT0FBQSxLQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQztRQUF4QixDQUF3QixFQUN6QixDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHOzs7OztJQUNJLG1EQUFvQjs7OztJQUEzQjtRQUFBLGlCQTJCQzs7WUExQk8sTUFBTSxHQUFHLEVBQUU7O1lBQ1gsV0FBVyxHQUFHLElBQUksR0FBRyxFQUFlO1FBQzFDLENBQUMsbUJBQUEsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQWUsQ0FBQyxDQUFDLE9BQU87Ozs7UUFBQyxVQUFDLElBQUk7O2dCQUNuRCxFQUFFLEdBQUcsS0FBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7WUFDOUIsSUFBSSxFQUFFLElBQUksS0FBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUU7Z0JBQ3JDLFdBQVcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO2FBQ3pDO1FBQ0gsQ0FBQyxFQUFDLENBQUM7UUFFSCxDQUFDLElBQUksQ0FBQyxrQkFBa0IsSUFBSSxFQUFFLENBQUMsQ0FBQyxPQUFPOzs7O1FBQUMsVUFBQyxJQUFJOztnQkFDckMsRUFBRSxHQUFHLElBQUksSUFBSSxJQUFJLENBQUMsUUFBUTtZQUNoQyxJQUFJLEVBQUUsSUFBSSxLQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRTtnQkFDckMsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsc0JBQU0sSUFBSSxDQUFFLENBQUMsQ0FBQzthQUN0RTtRQUNILENBQUMsRUFBQyxDQUFDO1FBRUgsd0JBQXdCO1FBQ3hCLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTzs7OztRQUFDLFVBQUMsRUFBRTtZQUM3QixJQUNFLENBQUMsTUFBTSxDQUFDLElBQUk7Ozs7WUFBQyxVQUFDLElBQUksSUFBSyxPQUFBLElBQUksSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLEVBQUUsRUFBNUIsQ0FBNEIsRUFBQztnQkFDcEQsV0FBVyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFDbkI7Z0JBQ0EsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7YUFDbEM7UUFDSCxDQUFDLEVBQUMsQ0FBQztRQUNILE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRDs7Ozs7T0FLRzs7Ozs7OztJQUNJLGdEQUFpQjs7Ozs7O0lBQXhCLFVBQ0UsTUFBZ0MsRUFDaEMsU0FBeUI7UUFGM0IsaUJBbUNDO1FBakNDLDBCQUFBLEVBQUEsZ0JBQXlCO1FBRXpCLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUFFO1lBQzdDLE9BQU8sQ0FBQyxDQUFDO1NBQ1Y7O1lBQ0ssV0FBVyxHQUFHLElBQUksR0FBRyxFQUFxQjtRQUNoRCxDQUFDLG1CQUFBLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFlLENBQUMsQ0FBQyxPQUFPOzs7O1FBQUMsVUFBQyxJQUFJOztnQkFDbkQsRUFBRSxHQUFHLEtBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO1lBQzlCLElBQUksRUFBRSxFQUFFO2dCQUNOLFdBQVcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO2FBQzNCO1FBQ0gsQ0FBQyxFQUFDLENBQUM7O1lBRUMsS0FBSyxHQUFHLENBQUM7UUFDYixJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU87Ozs7UUFBQyxVQUFDLEVBQUU7O2dCQUN2QixJQUFJLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDaEMsSUFBSSxJQUFJLEVBQUU7Z0JBQ1IsS0FBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUM7Z0JBQ2hELEtBQUssRUFBRSxDQUFDO2dCQUNSLE9BQU87YUFDUjs7O2dCQUVLLFNBQVMsR0FBRyxDQUFDLEtBQUksQ0FBQyxrQkFBa0IsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJOzs7O1lBQ3BELFVBQUMsSUFBSSxJQUFLLE9BQUEsSUFBSSxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssRUFBRSxFQUE1QixDQUE0QixFQUN2QztZQUNELElBQUksU0FBUyxFQUFFO2dCQUNiLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTzs7OztnQkFBQyxVQUFDLEdBQUc7b0JBQzlCLFNBQVMsQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQy9CLENBQUMsRUFBQyxDQUFDO2dCQUNILEtBQUssRUFBRSxDQUFDO2FBQ1Q7UUFDSCxDQUFDLEVBQUMsQ0FBQztRQUNILE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELFdBQVc7Ozs7O0lBQ0osNkNBQWM7Ozs7SUFBckI7UUFDRSxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRTtZQUNsQyxPQUFPO1NBQ1I7UUFDRCxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFRCx1QkFBdUI7Ozs7O0lBQ2hCLCtDQUFnQjs7OztJQUF2QjtRQUNFLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUM7SUFDbEMsQ0FBQztJQUdELHNCQUFJLDZDQUFXO1FBRGYsZ0JBQWdCOzs7OztRQUNoQjtZQUNFLE9BQU8sQ0FDTCxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVU7Z0JBQ2pCLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWTtnQkFDbkIsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUI7Z0JBQzFCLENBQUMsQ0FBQyxJQUFJLENBQUMsb0JBQW9CO2dCQUMzQixJQUFJLENBQUMscUJBQXFCLENBQzNCLENBQUM7UUFDSixDQUFDOzs7T0FBQTtJQUdELHNCQUFJLHVEQUFxQjtRQUR6QixnQ0FBZ0M7Ozs7O1FBQ2hDO1lBQ0UsT0FBTyxDQUNMLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxJQUFJLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQ3JFLENBQUM7UUFDSixDQUFDOzs7T0FBQTtJQUVELDBDQUEwQzs7Ozs7O0lBQzFDLDhDQUFlOzs7OztJQUFmLFVBQWdCLElBQWM7UUFDNUIsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ3RCLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFDRCxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssWUFBWSxDQUFDLE9BQU8sRUFBRTtZQUN0QyxPQUFPLElBQUksQ0FBQyxNQUFNLEtBQUssS0FBSyxDQUFDO1NBQzlCO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsaUNBQWlDOzs7OztJQUNqQyx1REFBd0I7Ozs7SUFBeEI7UUFDRSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFO1lBQzdDLE9BQU8sRUFBRSxDQUFDO1NBQ1g7UUFDRCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTTs7OztRQUMxQixVQUFDLElBQUksSUFBSyxPQUFBLElBQUksQ0FBQyxJQUFJLEtBQUssWUFBWSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQWhELENBQWdELEVBQzNELENBQUM7SUFDSixDQUFDOzs7OztJQUVPLDBDQUFXOzs7O0lBQW5COztZQUNRLFFBQVEsR0FDWixDQUFDLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsSUFBSSxLQUFLO1FBQzFELE9BQU8sQ0FDTCxnQkFBZ0I7WUFDaEIsUUFBUTtZQUNSLEdBQUc7WUFDSCxJQUFJLENBQUMsWUFBWTtZQUNqQixHQUFHO1lBQ0gsSUFBSSxDQUFDLElBQUksQ0FDVixDQUFDO0lBQ0osQ0FBQzs7Ozs7SUFFTyw4Q0FBZTs7OztJQUF2QjtRQUFBLGlCQXFDQztRQXBDQyxJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztRQUM3QixJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRTtZQUN0RSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDZixPQUFPO1NBQ1I7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRTtZQUNkLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNmLE9BQU87U0FDUjtRQUNELElBQUksQ0FBQyxXQUFXO2FBQ2IsS0FBSyxFQUFFO2FBQ1AsSUFBSTs7O1FBQUM7WUFDSixLQUFJLENBQUMsV0FBVztpQkFDYixPQUFPLENBQUMsS0FBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO2lCQUMzQixJQUFJOzs7O1lBQUMsVUFBQyxLQUEyQjtnQkFDaEMsSUFBSSxLQUFLLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUU7b0JBQ3RDLEtBQUksQ0FBQyxvQkFBb0IsR0FBRyxLQUFLLENBQUM7b0JBQ2xDLEtBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO2lCQUM3QjtxQkFBTTtvQkFDTCxLQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxvQkFBb0IsRUFBRSxDQUFDO29CQUN2RCxLQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztpQkFDOUI7Z0JBQ0QsS0FBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2pCLENBQUMsRUFBQztpQkFDRCxLQUFLOzs7WUFBQztnQkFDTCxLQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxvQkFBb0IsRUFBRSxDQUFDO2dCQUN2RCxLQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztnQkFDN0IsS0FBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2pCLENBQUMsRUFBQyxDQUFDO1FBQ1AsQ0FBQyxFQUFDO2FBQ0QsS0FBSzs7OztRQUFDLFVBQUMsQ0FBQztZQUNQLE9BQU8sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDbEMsS0FBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksb0JBQW9CLEVBQUUsQ0FBQztZQUN2RCxLQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztZQUM3QixLQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDakIsQ0FBQyxFQUFDLENBQUM7SUFDUCxDQUFDOzs7OztJQUVPLDJDQUFZOzs7O0lBQXBCO1FBQ0UsT0FBTyxJQUFJLENBQUMsZUFBZSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQy9FLENBQUM7Ozs7O0lBRU8sdURBQXdCOzs7O0lBQWhDO1FBQ0UsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDZCxPQUFPO1NBQ1I7UUFDRCxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7SUFDMUUsQ0FBQztJQUVELHVDQUF1Qzs7Ozs7OztJQUMvQix3REFBeUI7Ozs7OztJQUFqQyxVQUFrQyxLQUFpQjs7WUFDM0MsS0FBSyxHQUFHLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDLEdBQUc7Ozs7UUFBQyxVQUFDLENBQUMsSUFBSyxPQUFBLENBQUMsQ0FBQyxJQUFJLEVBQU4sQ0FBTSxFQUFDO1FBQ2hFLE9BQU8sS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDLElBQUk7Ozs7O1FBQUMsVUFBQyxDQUFDLEVBQUUsQ0FBQztZQUM3QixPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3JELENBQUMsRUFBQyxDQUFDO0lBQ0wsQ0FBQzs7OztJQUVELHNDQUFPOzs7SUFBUDtRQUFBLGlCQThCQztRQTdCQyxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztRQUMzQixJQUFJLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsYUFBYSxHQUFHLEVBQUUsQ0FBQzs7WUFDbEIsWUFBWSxHQUFHLElBQUksQ0FBQyx3QkFBd0IsRUFBRTs7WUFDOUMsUUFBUSxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUU7UUFDcEMsWUFBWSxDQUFDLE9BQU87Ozs7UUFBQyxVQUFDLE9BQU87WUFDM0IsSUFBSSxRQUFRLEVBQUU7Z0JBQ1osT0FBTyxDQUFDLE1BQU0sR0FBRyxLQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDeEU7aUJBQU0sSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLFNBQVMsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLElBQUksRUFBRTtnQkFDbEUsT0FBTyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7YUFDdkI7O2dCQUNLLElBQUksR0FBYTtnQkFDckIsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLO2dCQUNwQixHQUFHLEVBQUUsT0FBTyxDQUFDLElBQUk7Z0JBQ2pCLE9BQU8sRUFBRSxPQUFPLENBQUMsTUFBTSxLQUFLLEtBQUs7Z0JBQ2pDLFFBQVEsRUFBRSxLQUFLO2FBQ2hCO1lBQ0QsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLEtBQUssRUFBRTtnQkFDNUIsS0FBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDOUI7aUJBQU07Z0JBQ0wsS0FBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDL0I7UUFDSCxDQUFDLEVBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN0RSxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDeEUsVUFBVTs7O1FBQUM7WUFDVCxLQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztZQUMxQixLQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQzFCLENBQUMsR0FBRSxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7Ozs7SUFFRCw2Q0FBYzs7O0lBQWQ7UUFDRSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO1FBQy9CLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7UUFDMUUsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQztRQUN4RSxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzFCLENBQUM7Ozs7SUFFRCw4Q0FBZTs7O0lBQWY7UUFDRSxJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO1FBQzFFLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7UUFDeEUsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztRQUM5QixJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzFCLENBQUM7Ozs7SUFFRCwwQ0FBVzs7O0lBQVg7O1lBQ1EsWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRzs7OztRQUFDLFVBQUMsSUFBSSxJQUFLLE9BQUEsSUFBSSxDQUFDLEdBQUcsRUFBUixDQUFRLEVBQUM7UUFDOUQsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUMsT0FBTzs7OztRQUFDLFVBQUMsSUFBSTtZQUMzQyxJQUFJLENBQUMsTUFBTSxHQUFHLFlBQVksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pELENBQUMsRUFBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksR0FBRyxZQUFZLENBQUM7UUFDOUMsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7UUFDNUIsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7UUFDaEMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQztRQUMvQixJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRCwwQ0FBMEM7Ozs7OztJQUMxQywwQ0FBVzs7Ozs7SUFBWCxVQUFZLEtBQXdCO1FBQ2xDLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFOztnQkFDdkIsSUFBSSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSTs7OztZQUFDLFVBQUMsSUFBSTtnQkFDeEMsT0FBTyxJQUFJLENBQUMsR0FBRyxLQUFLLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQztZQUM1QyxDQUFDLEVBQUM7WUFDRixJQUFJLENBQUMsSUFBSSxFQUFFO2dCQUNULE9BQU87YUFDUjtZQUNELElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1lBQ3BCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNOzs7O1lBQUMsVUFBQyxJQUFJO2dCQUNsRCxPQUFPLElBQUksQ0FBQyxHQUFHLEtBQUssS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDO1lBQzVDLENBQUMsRUFBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMseUJBQXlCLENBQ2hELElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FDakMsQ0FBQztTQUNIO2FBQU07O2dCQUNDLG1CQUFpQixHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUNyRCxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU87Ozs7WUFBQyxVQUFDLElBQUk7Z0JBQzdCLElBQUksSUFBSSxDQUFDLEdBQUcsS0FBSyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUU7O3dCQUNoQyxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNsRCxTQUFTLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztvQkFDMUIsbUJBQWlCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2lCQUNuQztZQUNILENBQUMsRUFBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMseUJBQXlCLENBQUMsbUJBQWlCLENBQUMsQ0FBQztZQUN2RSxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTTs7OztZQUFDLFVBQUMsSUFBSTtnQkFDaEQsT0FBTyxJQUFJLENBQUMsR0FBRyxLQUFLLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQztZQUM1QyxDQUFDLEVBQUMsQ0FBQztTQUNKO1FBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUMxQixDQUFDOzs7OztJQUVELDZEQUE4Qjs7OztJQUE5QixVQUErQixLQUFjO1FBQTdDLGlCQTJCQztRQTFCQyxJQUFJLENBQUMsMkJBQTJCLEdBQUcsS0FBSyxDQUFDO1FBQ3pDLElBQUksS0FBSyxLQUFLLElBQUksRUFBRTtZQUNsQixVQUFVOzs7WUFBQzs7b0JBQ0gsT0FBTyxHQUFHLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FDdkMsc0NBQXNDLENBQ3ZDO2dCQUNELElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7O3dCQUNoQixHQUFHLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQztvQkFDdEIsR0FBRzt5QkFDQSxnQkFBZ0IsQ0FBQyxtQkFBbUIsQ0FBQzt5QkFDckMsT0FBTzs7OztvQkFBQyxVQUFDLE1BQU0sSUFBSyxPQUFBLE1BQU0sQ0FBQyxNQUFNLEVBQUUsRUFBZixDQUFlLEVBQUMsQ0FBQzs7d0JBQ2xDLFFBQVEsR0FBRyxLQUFJLENBQUMsY0FBYyxDQUFDLEtBQUksQ0FBQyxVQUFVLEVBQUUsS0FBSSxDQUFDLFNBQVMsQ0FBQztvQkFDckUsR0FBRyxDQUFDLFlBQVksQ0FDZCxLQUFJLENBQUMsa0JBQWtCLENBQ3JCLEtBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEVBQ3hCLEtBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FDaEMsQ0FBQyxLQUFJLENBQUMsbUJBQW1CLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSSxDQUFDLGtCQUFrQixFQUN4RCxDQUFDLEtBQUksQ0FBQyxtQkFBbUIsR0FBRyxDQUFDLENBQUMsR0FBRyxLQUFJLENBQUMsa0JBQWtCO3dCQUN0RCxLQUFJLENBQUMsa0JBQWtCLENBQzFCLENBQUMsS0FBSSxDQUFDLFVBQVUsQ0FBQyxDQUNuQixFQUNELEdBQUcsQ0FBQyxVQUFVLENBQ2YsQ0FBQztpQkFDSDtZQUNILENBQUMsR0FBRSxDQUFDLENBQUMsQ0FBQztTQUNQO0lBQ0gsQ0FBQzs7Ozs7SUFFRCx3REFBeUI7Ozs7SUFBekIsVUFBMEIsTUFBK0I7UUFHdkQsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUU7WUFDNUIsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsQ0FBQztTQUMzQjtRQUNELE9BQU8sRUFBRSxLQUFLLEVBQUssTUFBTSxDQUFDLEtBQUssT0FBSSxFQUFFLENBQUM7SUFDeEMsQ0FBQzs7Ozs7O0lBRUQsaURBQWtCOzs7OztJQUFsQixVQUFtQixRQUFRLEVBQUUsSUFBSTtRQUFqQyxpQkFxQ0M7OztZQW5DTyxjQUFjLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUM7UUFDcEQsY0FBYyxDQUFDLFNBQVMsR0FBRyxrQkFBa0IsQ0FBQztRQUM5QyxjQUFjLENBQUMsS0FBSyxDQUFDLFdBQVcsR0FBTSxzQ0FBc0MsT0FBSSxDQUFDO1FBQ2pGLGNBQWMsQ0FBQyxLQUFLLENBQUMsWUFBWSxHQUFNLHNDQUFzQyxPQUFJLENBQUM7UUFFbEYsa0JBQWtCO1FBQ2xCLG9KQUFvSjtRQUNwSixLQUFLO1FBQ0wsd01BQXdNO1FBRXhNLHFEQUFxRDtRQUNyRCw0QkFBNEI7UUFDNUIsUUFBUSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsT0FBTzs7OztRQUFDLFVBQUMsdUJBQXVCOztnQkFDM0QsU0FBUyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDO1lBQy9DLFNBQVMsQ0FBQyxTQUFTLEdBQUcseUJBQXlCLENBQUM7O2dCQUUxQyxVQUFVLEdBQUcsS0FBSSxDQUFDLHlCQUF5QixDQUMvQyx1QkFBdUIsQ0FDeEI7WUFDRCxTQUFTLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDO1lBRXpDLFVBQVU7WUFDVixJQUFJLHVCQUF1QixDQUFDLEtBQUssRUFBRTs7b0JBQzNCLFNBQVMsR0FBRyxRQUFRLENBQUMsY0FBYyxDQUN2Qyx1QkFBdUIsQ0FBQyxLQUFLLENBQzlCO2dCQUNELFNBQVMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUM7YUFDbEM7WUFFRCxrQkFBa0I7WUFDbEIsY0FBYyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN4QyxDQUFDLEVBQUMsQ0FBQztRQUNILElBQUk7UUFFSixPQUFPLGNBQWMsQ0FBQztJQUN4QixDQUFDOzs7O0lBRUQsNkNBQWM7OztJQUFkO1FBQ0UsSUFBSSxDQUFDLGNBQWMsR0FBRyxFQUFFLENBQUM7O1lBQ25CLFdBQVcsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFOzs7WUFFN0MsVUFBVSxHQUFHLENBQUMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxrQkFBa0I7O1lBQ3JFLFFBQVEsR0FBRyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLGtCQUFrQjs7WUFDN0QsZ0JBQWdCLEdBQ3BCLFFBQVEsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxRQUFROztZQUM3RCxlQUFlLEdBQUcsZ0JBQWdCLEdBQUcsVUFBVTs7WUFFL0MsUUFBUSxHQUFHLFdBQVcsQ0FBQyxNQUFNLEdBQUcsZUFBZTtRQUNyRCw2QkFBNkI7UUFDN0IsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGVBQWUsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN4QyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO1NBQzNEO1FBQ0QsSUFBSSxDQUFDLDhCQUE4QixFQUFFLENBQUM7SUFDeEMsQ0FBQztJQUVEOzs7T0FHRzs7Ozs7OztJQUNLLDZEQUE4Qjs7Ozs7O0lBQXRDO1FBQ0UsSUFBSSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsRUFBRTtZQUMvQixPQUFPO1NBQ1I7UUFDRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7b0NBQzFDLENBQUM7O29CQUNGLEdBQUcsR0FBRyxPQUFLLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3JDLElBQUksR0FBRyxZQUFZLHNCQUFzQixFQUFFO29CQUN6QyxHQUFHLENBQUMsU0FBUzs7OztvQkFBRyxVQUFDLENBQWdCO3dCQUMvQixJQUFJLENBQUMsQ0FBQyxPQUFPLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxPQUFPLEtBQUssRUFBRSxFQUFFOzRCQUN4QyxPQUFPO3lCQUNSO3dCQUNELElBQUksQ0FBQyxDQUFDLE9BQU8sS0FBSyxFQUFFLEVBQUU7NEJBQ3BCLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO3lCQUN4QjtvQkFDSCxDQUFDLENBQUEsQ0FBQztpQkFDSDs7O1lBWEgsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRTt3QkFBN0MsQ0FBQzthQVlUO1NBQ0Y7SUFDSCxDQUFDO0lBRUQsV0FBVzs7Ozs7OztJQUNYLDhDQUFlOzs7Ozs7O0lBQWYsVUFBZ0IsQ0FBUyxFQUFFLENBQVM7UUFDbEMsSUFDRSxDQUFDLEtBQUssSUFBSTtZQUNWLENBQUMsS0FBSyxJQUFJO1lBQ1YsQ0FBQyxJQUFJLENBQUMsY0FBYztZQUNwQixJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQ2hDO1lBQ0EsT0FBTztTQUNSO1FBQ0QsbUJBQW1CO1FBQ25CLElBQ0UsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLFlBQVksaUJBQWlCLENBQUM7WUFDOUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxHQUFHLENBQUM7WUFDcEMsQ0FBQyxLQUFLLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsRUFDdkM7WUFDQSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztTQUMzQjthQUFNO1lBQ0wsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUMzQyxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUNyQix3QkFBd0I7Z0JBQ3hCLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7YUFDbEM7aUJBQU07Z0JBQ0wsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDckIseUJBQXlCO2dCQUN6QixJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO2FBQ2xDO1NBQ0Y7SUFDSCxDQUFDO0lBRUQ7OztPQUdHOzs7Ozs7SUFDSCxpREFBa0I7Ozs7O0lBQWxCO1FBQUEsaUJBOEJDO1FBN0JDLDRCQUE0QjtRQUM1QixzQkFBc0I7UUFDdEIsMkJBQTJCO1FBQzNCLElBQUksSUFBSSxDQUFDLFVBQVUsS0FBSyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsQ0FBQyxFQUFFO1lBQ25ELGFBQWE7WUFDYixJQUNFLElBQUksQ0FBQyxtQkFBbUI7Z0JBQ3hCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsRUFDekQ7Z0JBQ0EsZ0JBQWdCO2dCQUNoQixJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztnQkFDM0IsVUFBVTs7O2dCQUFDO29CQUNULEtBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztvQkFDdEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDckIsS0FBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dCQUMvQixDQUFDLEdBQUUsQ0FBQyxDQUFDLENBQUM7YUFDUDtpQkFBTTtnQkFDTCxvQkFBb0I7Z0JBQ3BCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDbkIsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7Z0JBQzNCLFVBQVU7OztnQkFBQztvQkFDVCxLQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7b0JBQ3RCLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7b0JBQ3JCLEtBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUN0QixDQUFDLEdBQUUsQ0FBQyxDQUFDLENBQUM7YUFDUDtTQUNGO2FBQU07WUFDTCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDcEI7SUFDSCxDQUFDO0lBRUQsWUFBWTs7Ozs7OztJQUNaLDhDQUFlOzs7Ozs7O0lBQWYsVUFBZ0IsQ0FBUyxFQUFFLENBQVM7UUFBcEMsaUJBbUNDO1FBbENDLElBQ0UsQ0FBQyxLQUFLLElBQUk7WUFDVixDQUFDLEtBQUssSUFBSTtZQUNWLENBQUMsSUFBSSxDQUFDLGNBQWM7WUFDcEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUNoQztZQUNBLE9BQU87U0FDUjtRQUNELElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ3RCLDhDQUE4QztZQUM5QyxJQUFJLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxDQUFDLEVBQUU7Z0JBQ2hDLGtCQUFrQjtnQkFDbEIsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7Z0JBQzNCLFVBQVU7OztnQkFBQztvQkFDVCxLQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7b0JBQ3RCLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7b0JBQ3JCLEtBQUksQ0FBQyxRQUFRLENBQ1gsS0FBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUM5QixLQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQ2xDLENBQUM7Z0JBQ0osQ0FBQyxHQUFFLENBQUMsQ0FBQyxDQUFDO2FBQ1A7WUFDRCxPQUFPO1NBQ1I7YUFBTTtZQUNMLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDWCxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUNyQix3QkFBd0I7Z0JBQ3hCLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7YUFDakU7aUJBQU07Z0JBQ0wsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDckIsd0JBQXdCO2dCQUN4QixJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO2FBQ2pDO1NBQ0Y7SUFDSCxDQUFDO0lBRUQ7Ozs7O09BS0c7Ozs7Ozs7O0lBQ0gsdUNBQVE7Ozs7Ozs7SUFBUixVQUFTLENBQVMsRUFBRSxDQUFTLEVBQUUsYUFBK0I7UUFBL0IsOEJBQUEsRUFBQSx1QkFBK0I7UUFDNUQsSUFDRSxDQUFDLEtBQUssSUFBSTtZQUNWLENBQUMsS0FBSyxJQUFJO1lBQ1YsQ0FBQyxJQUFJLENBQUMsY0FBYztZQUNwQixJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQ2hDO1lBQ0EsT0FBTztTQUNSO1FBQ0QsYUFBYTtRQUNiLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDckQsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7O2dCQUNqRCxLQUFHLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDckMsc0NBQXNDO1lBQ3RDLElBQUksS0FBRyxZQUFZLGlCQUFpQixFQUFFO2dCQUNwQyxJQUFJLEtBQUcsQ0FBQyxVQUFVLEVBQUU7b0JBQ2xCLElBQUksYUFBYSxLQUFLLE9BQU8sRUFBRTt3QkFDN0IsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7cUJBQzVCO3lCQUFNLElBQUksYUFBYSxLQUFLLE1BQU0sRUFBRTt3QkFDbkMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7cUJBQzVCO29CQUNELE9BQU87aUJBQ1I7Z0JBQ0QsS0FBRyxDQUFDLDJCQUEyQixDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUN2RSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLENBQzFELENBQUM7Z0JBQ0YsOERBQThEO2dCQUM5RCxJQUFJLEtBQUcsQ0FBQyxlQUFlLENBQUMsSUFBSSxLQUFLLFVBQVUsRUFBRTtvQkFDM0MsVUFBVTs7O29CQUFDO3dCQUNULEtBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztvQkFDZCxDQUFDLEdBQUUsQ0FBQyxDQUFDLENBQUM7aUJBQ1A7cUJBQU07b0JBQ0wsS0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDO2lCQUNiO2FBQ0Y7aUJBQU0sSUFBSSxLQUFHLFlBQVksc0JBQXNCLEVBQUU7Z0JBQ2hELElBQUksS0FBRyxDQUFDLFVBQVUsRUFBRTtvQkFDbEIsSUFBSSxhQUFhLEtBQUssT0FBTyxFQUFFO3dCQUM3QixJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztxQkFDNUI7eUJBQU0sSUFBSSxhQUFhLEtBQUssTUFBTSxFQUFFO3dCQUNuQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztxQkFDNUI7b0JBQ0QsT0FBTztpQkFDUjs7b0JBQ0ssVUFBUSxHQUFRLFFBQVEsQ0FBQyxjQUFjLENBQUMsS0FBRyxDQUFDLElBQUksQ0FBQztnQkFDdkQsVUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNqQixVQUFRLENBQUMsY0FBYyxDQUFDO29CQUN0QixRQUFRLEVBQUUsUUFBUTtvQkFDbEIsS0FBSyxFQUFFLFFBQVE7b0JBQ2YsTUFBTSxFQUFFLFFBQVE7aUJBQ2pCLENBQUMsQ0FBQztnQkFDSCxVQUFVOzs7Z0JBQUM7b0JBQ1QsVUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNwQixDQUFDLEdBQUUsQ0FBQyxDQUFDLENBQUM7YUFDUDtpQkFBTSxJQUFJLEtBQUcsWUFBWSxVQUFVLEVBQUU7Z0JBQ3BDLElBQUksS0FBRyxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUU7b0JBQzlCLElBQUksYUFBYSxLQUFLLE9BQU8sRUFBRTt3QkFDN0IsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7cUJBQzVCO3lCQUFNLElBQUksYUFBYSxLQUFLLE1BQU0sRUFBRTt3QkFDbkMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7cUJBQzVCO29CQUNELE9BQU87aUJBQ1I7Z0JBQ0QsS0FBRyxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDMUIsS0FBRyxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUM7b0JBQy9CLFFBQVEsRUFBRSxRQUFRO29CQUNsQixLQUFLLEVBQUUsUUFBUTtvQkFDZixNQUFNLEVBQUUsUUFBUTtpQkFDakIsQ0FBQyxDQUFDO2dCQUNILFVBQVU7OztnQkFBQztvQkFDVCxLQUFHLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUM3QixDQUFDLEdBQUUsQ0FBQyxDQUFDLENBQUM7YUFDUDtpQkFBTSxJQUNMLEtBQUcsWUFBWSxxQkFBcUI7Z0JBQ3BDLEtBQUcsWUFBWSxzQkFBc0I7Z0JBQ3JDLEtBQUcsWUFBWSxxQkFBcUIsRUFDcEM7Z0JBQ0EsdUVBQXVFO2dCQUN2RSxJQUFJLGFBQWEsS0FBSyxPQUFPLEVBQUU7b0JBQzdCLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2lCQUM1QjtxQkFBTSxJQUFJLGFBQWEsS0FBSyxNQUFNLEVBQUU7b0JBQ25DLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2lCQUM1QjtnQkFDRCxPQUFPO2FBQ1I7WUFDRCxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztTQUN6QjthQUFNO1lBQ0wsdUJBQXVCO1NBQ3hCO0lBQ0gsQ0FBQzs7Ozs7O0lBRUQsNENBQWE7Ozs7O0lBQWIsVUFBYyxDQUFTLEVBQUUsQ0FBUztRQUNoQyxJQUNFLENBQUMsS0FBSyxJQUFJO1lBQ1YsQ0FBQyxLQUFLLElBQUk7WUFDVixDQUFDLElBQUksQ0FBQyxjQUFjO1lBQ3BCLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxLQUFLLENBQUMsRUFDaEM7WUFDQSxPQUFPO1NBQ1I7UUFDRCxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTs7Z0JBQ2pELEdBQUcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNyQyxJQUFJLEdBQUcsWUFBWSxpQkFBaUIsRUFBRTtnQkFDcEMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUNYLEdBQUcsQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO2FBQ3BCO2lCQUFNLElBQUksR0FBRyxZQUFZLHNCQUFzQixFQUFFO2dCQUNoRCxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7YUFDWjtpQkFBTSxJQUFJLEdBQUcsWUFBWSxVQUFVLEVBQUU7Z0JBQ3BDLEdBQUcsQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLENBQUM7YUFDMUI7aUJBQU07YUFDTjtTQUNGO0lBQ0gsQ0FBQzs7Ozs7O0lBRUQsMkNBQVk7Ozs7O0lBQVosVUFBYSxDQUFTLEVBQUUsQ0FBUztRQUMvQixJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQztRQUNwQixJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQztRQUNwQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN2RSxJQUFJLElBQUksQ0FBQyxTQUFTLFlBQVksaUJBQWlCLEVBQUU7WUFDL0MsSUFBSSxDQUFDLDhCQUE4QixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDMUQ7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRzs7Ozs7OztJQUNILHNEQUF1Qjs7Ozs7O0lBQXZCLFVBQXdCLFNBQWlCLEVBQUUsU0FBaUI7UUFDMUQsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUM7UUFDNUIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDOUQsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBRUQ7Ozs7T0FJRzs7Ozs7O0lBQ0gsd0NBQVM7Ozs7O0lBQVQsVUFBVSxLQUFvQjtRQUE5QixpQkEwRkM7UUF6RkMsSUFBSSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsRUFBRTtZQUMvQixPQUFPO1NBQ1I7UUFDRCxJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssSUFBSSxFQUFFO1lBQ3hELE9BQU87U0FDUjtRQUNELFFBQVEsS0FBSyxDQUFDLEdBQUcsRUFBRTtZQUNqQixLQUFLLFNBQVM7Z0JBQ1osSUFDRSxJQUFJLENBQUMsU0FBUyxZQUFZLGlCQUFpQjtvQkFDM0MsSUFBSSxDQUFDLDJCQUEyQixFQUNoQztvQkFDQSxPQUFPO2lCQUNSO2dCQUNELElBQUksSUFBSSxDQUFDLFVBQVUsS0FBSyxDQUFDLEVBQUU7b0JBQ3pCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2lCQUNyRDtnQkFDRCxNQUFNO1lBQ1IsS0FBSyxXQUFXO2dCQUNkLElBQ0UsSUFBSSxDQUFDLFNBQVMsWUFBWSxpQkFBaUI7b0JBQzNDLElBQUksQ0FBQywyQkFBMkIsRUFDaEM7b0JBQ0EsT0FBTztpQkFDUjtnQkFDRCxlQUFlO2dCQUNmLElBQUksSUFBSSxDQUFDLFVBQVUsS0FBSyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7b0JBQ3RELElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7b0JBQ3JELElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO29CQUMxQixNQUFNO2lCQUNQO3FCQUFNO29CQUNMLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2lCQUNyRDtnQkFDRCxNQUFNO1lBQ1IsS0FBSyxXQUFXO2dCQUNkLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQ3ZELE1BQU07WUFDUixLQUFLLFlBQVk7Z0JBQ2YsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDdkQsTUFBTTtZQUNSLEtBQUssT0FBTztnQkFDVixJQUFJLElBQUksQ0FBQyxTQUFTLFlBQVksaUJBQWlCLEVBQUU7b0JBQy9DLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUN6RCxJQUFJLElBQUksQ0FBQywyQkFBMkIsS0FBSyxLQUFLLEVBQUU7d0JBQzlDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7cUJBQ2pEO2lCQUNGO3FCQUFNLElBQUksSUFBSSxDQUFDLFVBQVUsS0FBSyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7b0JBQzdELElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO2lCQUMzQjtnQkFDRCxNQUFNO1lBQ1IsS0FBSyxRQUFRO2dCQUNYLElBQUksSUFBSSxDQUFDLFNBQVMsWUFBWSxpQkFBaUIsRUFBRTs7d0JBQ3pDLGNBQVksR0FBRyxtQkFBQSxJQUFJLENBQUMsU0FBUyxFQUFxQjtvQkFDeEQsVUFBVTs7O29CQUFDO3dCQUNULEtBQUksQ0FBQyw4QkFBOEIsQ0FBQyxjQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7d0JBQ3ZELElBQUksS0FBSSxDQUFDLDJCQUEyQixLQUFLLEtBQUssRUFBRTs0QkFDOUMsSUFBSSxjQUFZLENBQUMsZUFBZSxDQUFDLElBQUksS0FBSyxVQUFVLEVBQUU7Z0NBQ3BELFVBQVU7OztnQ0FBQztvQ0FDVCxLQUFJLENBQUMsUUFBUSxDQUFDLEtBQUksQ0FBQyxVQUFVLEVBQUUsS0FBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dDQUNsRCxDQUFDLEdBQUUsQ0FBQyxDQUFDLENBQUM7NkJBQ1A7aUNBQU07Z0NBQ0wsS0FBSSxDQUFDLFFBQVEsQ0FBQyxLQUFJLENBQUMsVUFBVSxFQUFFLEtBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQzs2QkFDakQ7eUJBQ0Y7b0JBQ0gsQ0FBQyxHQUFFLENBQUMsQ0FBQyxDQUFDO2lCQUNQO2dCQUNELE1BQU07WUFDUjtnQkFDRSwrQkFBK0I7Z0JBQy9CLElBQ0UsSUFBSSxDQUFDLFNBQVMsWUFBWSxpQkFBaUI7b0JBQzNDLElBQUksQ0FBQywyQkFBMkIsS0FBSyxLQUFLO29CQUMxQyxlQUFlLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFDL0I7O3dCQUNNLEdBQUcsR0FBRyxJQUFJLENBQUMsU0FBUztvQkFDMUIsR0FBRyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7b0JBQ2xCLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDMUMsb0RBQW9EO29CQUNwRCwwREFBMEQ7b0JBQzFELGlCQUFpQjtvQkFDakIsbUZBQW1GO29CQUNuRixxQkFBcUI7b0JBQ3JCLGtDQUFrQztvQkFDbEMsOERBQThEO29CQUM5RCw0Q0FBNEM7b0JBQzVDLFNBQVM7aUJBQ1Y7Z0JBQ0QsTUFBTTtTQUNUO0lBQ0gsQ0FBQztJQUVEOzs7OztPQUtHOzs7Ozs7OztJQUNLLDBDQUFXOzs7Ozs7O0lBQW5CLFVBQW9CLEtBQWEsRUFBRSxJQUFxQjs7WUFDaEQsUUFBUSxHQUFHO1lBQ2YsT0FBTztZQUNQLFFBQVE7WUFDUixNQUFNO1lBQ04sV0FBVztZQUNYLFVBQVU7WUFDVixhQUFhO1lBQ2IsZ0JBQWdCO1NBQ2pCOztZQUNHLFVBQVUsR0FBRyxFQUFFO1FBQ25CLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3BDLElBQUksQ0FBQyxLQUFLLEtBQUssRUFBRTtnQkFDZixPQUFPLFVBQVUsQ0FBQyxNQUFNLENBQUM7YUFDMUI7WUFDRCx3RUFBd0U7WUFDeEUsSUFDRSxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7Z0JBQy9CLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUk7Z0JBQ2IsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxLQUFLLEVBQ3hCO2dCQUNBLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDMUI7U0FDRjtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVEOzs7OztPQUtHOzs7Ozs7OztJQUNLLDZDQUFjOzs7Ozs7O0lBQXRCLFVBQXVCLEtBQWEsRUFBRSxJQUFxQjtRQUN6RCxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztRQUM1QixPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQzs7WUFDcEIsUUFBUSxHQUFHO1lBQ2YsT0FBTztZQUNQLFFBQVE7WUFDUixNQUFNO1lBQ04sV0FBVztZQUNYLFVBQVU7WUFDVixhQUFhO1lBQ2IsZ0JBQWdCO1NBQ2pCOztZQUNHLFVBQVUsR0FBRyxFQUFFO1FBQ25CLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3BDLElBQ0UsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO2dCQUMvQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJO2dCQUNiLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEtBQUssS0FBSyxFQUN4QjtnQkFDQSxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN6QixJQUFJLFVBQVUsQ0FBQyxNQUFNLEtBQUssS0FBSyxHQUFHLENBQUMsRUFBRTtvQkFDbkMsT0FBTyxDQUFDLENBQUM7aUJBQ1Y7YUFDRjtTQUNGO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsc0JBQUksZ0RBQWM7Ozs7UUFBbEI7WUFDRSxPQUFPLG1CQUFBLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQWEsQ0FBQztRQUM1RCxDQUFDOzs7T0FBQTtJQUVELHNCQUFJLDZDQUFXOzs7O1FBQWY7WUFDRSxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7OztPQUFBO0lBRUQseUJBQXlCOzs7OztJQUNsQix1Q0FBUTs7Ozs7SUFBZjtRQUNFLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUN4QixDQUFDOzs7Ozs7OztJQUVELDRDQUFhOzs7Ozs7O0lBQWIsVUFDRSxFQUFPLEVBQ1AsS0FBVSxFQUNWLElBQVMsRUFDVCx5QkFBOEI7UUFKaEMsaUJBMkJDO1FBckJDLElBQUksQ0FBQyxFQUFFLEVBQUU7WUFDUCxPQUFPO1NBQ1I7O1lBQ0ssVUFBVSxHQUNkLHlCQUF5QixJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMseUJBQXlCLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkUscUNBQXFDO1FBQ3JDLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDZixJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDcEM7YUFBTTtZQUNMLElBQUksQ0FBQyxlQUFlLEdBQUcsVUFBVSxDQUFDO1lBQ2xDLElBQUksSUFBSSxDQUFDLGtCQUFrQixFQUFFO2dCQUMzQixJQUFJLENBQUMsa0JBQWtCLENBQUMsV0FBVyxFQUFFLENBQUM7YUFDdkM7WUFDRCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLGFBQWE7aUJBQ3pDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO2lCQUN4QyxTQUFTOzs7O1lBQUMsVUFBQyxFQUFtQjtvQkFBakIsVUFBRSxFQUFFLGdCQUFLLEVBQUUsY0FBSTtnQkFBTyxPQUFBLEtBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUM7WUFBbEMsQ0FBa0MsRUFBQyxDQUFDO1lBQzFFLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxJQUFBLEVBQUUsS0FBSyxPQUFBLEVBQUUsSUFBSSxNQUFBLEVBQUUsQ0FBQyxDQUFDO1NBQzlDO1FBQ0QsVUFBVTs7O1FBQUM7WUFDVCxLQUFJLENBQUMsOEJBQThCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDNUMsQ0FBQyxHQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ1IsQ0FBQzs7Ozs7Ozs7O0lBRUQsZ0RBQWlCOzs7Ozs7OztJQUFqQixVQUNFLEVBQU8sRUFDUCxJQUFhLEVBQ2IsSUFBUyxFQUNULDZCQUFrQyxFQUNsQyxRQUFjO1FBTGhCLGlCQXFDQztRQTlCQyxJQUFJLENBQUMsRUFBRSxFQUFFO1lBQ1AsT0FBTztTQUNSO1FBQ0QseUNBQXlDO1FBQ3pDLElBQUksSUFBSSxFQUFFO1lBQ1IsSUFBSSxDQUFDLHdCQUF3QixDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztTQUMvQzs7WUFDSyxVQUFVLEdBQ2QsNkJBQTZCLElBQUksSUFBSTtZQUNuQyxDQUFDLENBQUMsNkJBQTZCO1lBQy9CLENBQUMsQ0FBQyxDQUFDO1FBQ1AscUNBQXFDO1FBQ3JDLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDZixJQUFJLElBQUksRUFBRTtnQkFDUixJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7YUFDbkM7WUFDRCxPQUFPO1NBQ1I7UUFDRCxJQUFJLENBQUMseUJBQXlCLEdBQUcsVUFBVSxDQUFDO1FBQzVDLElBQUksSUFBSSxDQUFDLHNCQUFzQixFQUFFO1lBQy9CLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQztTQUMzQztRQUNELElBQUksQ0FBQyxzQkFBc0IsR0FBRyxJQUFJLENBQUMsaUJBQWlCO2FBQ2pELElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLENBQUM7YUFDbEQsU0FBUzs7OztRQUFDLFVBQUMsRUFBbUI7Z0JBQWpCLFVBQUUsRUFBRSxnQkFBSyxFQUFFLGNBQUk7WUFDM0IsSUFBSSxLQUFLLEVBQUU7Z0JBQ1QsS0FBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO2FBQ3BDO1FBQ0gsQ0FBQyxFQUFDLENBQUM7UUFDTCxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxJQUFBLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLE1BQUEsRUFBRSxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVELGlEQUFpRDs7Ozs7Ozs7SUFDekMsdURBQXdCOzs7Ozs7O0lBQWhDLFVBQWlDLFFBQWEsRUFBRSxJQUFTO1FBQ3ZELElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxFQUFFO1lBQ3ZDLE9BQU87U0FDUjs7WUFDSyxHQUFHLEdBQUcsUUFBUSxDQUFDLFlBQVk7UUFDakMsSUFBSSxHQUFHLENBQUMsVUFBVSxJQUFJLElBQUksRUFBRTtZQUMxQixHQUFHLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztTQUNyQjtRQUNELElBQ0UsR0FBRyxDQUFDLGNBQWM7WUFDbEIsSUFBSTtZQUNKLElBQUksQ0FBQyxHQUFHO1lBQ1IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLEVBQzVCO1lBQ0EsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1NBQ2pFO0lBQ0gsQ0FBQztJQUVEOzs7OztPQUtHOzs7Ozs7OztJQUNILDJDQUFZOzs7Ozs7O0lBQVosVUFBYSxFQUFPLEVBQUUsS0FBVSxFQUFFLElBQVM7UUFDekMsSUFBSSxFQUFFLEVBQUU7WUFDTixFQUFFLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQ2pCO0lBQ0gsQ0FBQzs7OztJQUVELDRDQUFhOzs7SUFBYjtRQUFBLGlCQXdEQzs7WUF2REssc0JBQXNCLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDekMsS0FBSyxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztTQUN6QixDQUFDO1FBQ0YsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU87Ozs7UUFBQyxVQUFDLGlCQUFpQjs7Z0JBQzVDLFlBQVksR0FBUSxFQUFFO1lBQzFCLEtBQUksQ0FBQyxTQUFTLENBQUMsT0FBTzs7OztZQUFDLFVBQUMsSUFBSTtnQkFDMUIsaUJBQWlCO2dCQUNqQixZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUN2QztvQkFDRSxLQUFLLEVBQUUsS0FBSSxDQUFDLG9CQUFvQixDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzt3QkFDNUQsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7d0JBQzlCLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUk7b0JBQ3RCLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtpQkFDeEIsRUFDRCxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUMxQyxDQUFDO2dCQUNGLElBQUksSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRTtvQkFDaEQsWUFBWSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLEdBQUcsS0FBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQ3JELGlCQUFpQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxFQUNsRCxFQUFFLENBQ0gsQ0FBQztpQkFDSDtZQUNILENBQUMsRUFBQyxDQUFDO1lBQ0gsWUFBWSxDQUFDLFNBQVMsR0FBRyxLQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FDdEMsQ0FBQyxtQkFBQSxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQWEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUN0RSxFQUFFLENBQ0gsQ0FBQzs7Z0JBQ0UsWUFBWSxHQUFHLEtBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQztZQUM5QyxLQUFJLENBQUMsU0FBUyxDQUFDLE9BQU87Ozs7WUFBQyxVQUFDLElBQUk7Z0JBQzFCLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRTs7d0JBQ2hCLFVBQVUsR0FDZCxJQUFJLENBQUMseUJBQXlCLElBQUksSUFBSTt3QkFDcEMsQ0FBQyxDQUFDLElBQUksQ0FBQyx5QkFBeUI7d0JBQ2hDLENBQUMsQ0FBQyxDQUFDOzt3QkFDRCxPQUFPLEdBQUcsWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO29CQUMzQywrQkFBK0I7b0JBQy9CLElBQUksVUFBVSxHQUFHLENBQUMsRUFBRTt3QkFDbEIsT0FBTyxDQUFDLFlBQVk7NkJBQ2pCLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUM7NkJBQzlCLFNBQVM7Ozs7d0JBQUMsVUFBQyxLQUFLOzRCQUNmLEtBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxLQUFLLEVBQUUsWUFBWSxDQUFDLENBQUM7d0JBQzdELENBQUMsRUFBQyxDQUFDO3FCQUNOO3lCQUFNO3dCQUNMLE9BQU8sQ0FBQyxZQUFZLENBQUMsU0FBUzs7Ozt3QkFBQyxVQUFDLEtBQUs7NEJBQ25DLEtBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxLQUFLLEVBQUUsWUFBWSxDQUFDLENBQUM7d0JBQzdELENBQUMsRUFBQyxDQUFDO3FCQUNKO2lCQUNGO1lBQ0gsQ0FBQyxFQUFDLENBQUM7WUFDSCxDQUFDLG1CQUFBLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBYSxDQUFDLENBQUMsTUFBTSxDQUN2RCxDQUFDLG1CQUFBLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBYSxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFDbEUsWUFBWSxDQUNiLENBQUM7UUFDSixDQUFDLEVBQUMsQ0FBQztRQUNILE9BQU8sc0JBQXNCLENBQUMsS0FBSyxDQUFDO0lBQ3RDLENBQUM7SUFFRCxpQkFBaUI7Ozs7O0lBQ1YsdUNBQVE7Ozs7O0lBQWY7UUFBQSxpQkFZQzs7WUFYSyxRQUFRLEdBQUcsRUFBRTtRQUNqQixJQUFJLENBQUMsa0JBQWtCLENBQUMsT0FBTzs7OztRQUFDLFVBQUMsaUJBQWlCOztnQkFDNUMsWUFBWSxHQUFRLEVBQUU7WUFDMUIsS0FBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPOzs7O1lBQUMsVUFBQyxJQUFJO2dCQUMxQixpQkFBaUI7Z0JBQ2pCLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3pELENBQUMsRUFBQyxDQUFDO1lBQ0gsWUFBWSxDQUFDLFNBQVMsR0FBRyxpQkFBaUIsQ0FBQyxTQUFTLENBQUM7WUFDckQsUUFBUSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUM5QixDQUFDLEVBQUMsQ0FBQztRQUNILE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFFRCx1QkFBdUI7Ozs7O0lBQ3ZCLDBDQUFXOzs7OztJQUFYO1FBQUEsaUJBeUNDO1FBeENDLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDdEMsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDekIsMEJBQTBCO1FBQzFCLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ25CLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO1lBQzFCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUNwQixPQUFPO1NBQ1I7O1lBQ0ssV0FBVyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFO1FBQ3ZELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7OztZQUdyQixZQUFZLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU07Ozs7O1FBQ2pELFVBQUMsSUFBUyxFQUFFLEtBQWE7OztnQkFDdkIsS0FBbUIsSUFBQSxLQUFBLGlCQUFBLEtBQUksQ0FBQyxTQUFTLENBQUEsZ0JBQUEsNEJBQUU7b0JBQTlCLElBQU0sSUFBSSxXQUFBO29CQUNiLElBQ0UsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUM7d0JBQzdCLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssTUFBTSxDQUFDLEVBQ3BDO3dCQUNBLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzs7NEJBQ3pCLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQzs0QkFDM0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsV0FBVyxFQUFFOzRCQUMxQyxDQUFDLENBQUMsRUFBRTt3QkFDTixJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLEVBQUU7NEJBQy9CLEtBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7NEJBQ2xDLE9BQU8sSUFBSSxDQUFDO3lCQUNiO3FCQUNGO2lCQUNGOzs7Ozs7Ozs7WUFDRCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUMsRUFDRjtRQUNELGVBQWU7UUFDZixJQUFJLENBQUMsd0JBQXdCLEdBQUcsWUFBWSxDQUFDO1FBQzdDLGtCQUFrQjtRQUNsQixJQUFJLENBQUMsYUFBYSxHQUFHLFlBQVksQ0FBQztRQUNsQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2xCLENBQUM7Ozs7SUFFRCwyQ0FBWTs7O0lBQVo7UUFDRSxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztRQUM3QyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2xCLENBQUM7Ozs7Ozs7SUFFRCx1Q0FBUTs7Ozs7O0lBQVIsVUFBUyxJQUFlLEVBQUUsUUFBYSxFQUFFLEtBQWE7O1lBQ2hELFFBQVEsR0FBRztZQUNiLFdBQVcsRUFBRSxLQUFLO1NBQ25CO1FBQ0QsSUFBSSxRQUFRLENBQUMsS0FBSyxFQUFFO1lBQ2xCLFFBQVEsd0JBQVEsUUFBUSxFQUFLLFFBQVEsQ0FBQyxLQUFLLENBQUUsQ0FBQztTQUMvQztRQUNELElBQ0UsUUFBUSxDQUFDLFdBQVc7WUFDcEIsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJO1lBQ3pCLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQ3pDO1lBQ0EsUUFBUSx3QkFDSCxRQUFRLEVBQ1IsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUN4RCxDQUFDO1NBQ0g7UUFDRCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDOzs7OztJQUVELDBDQUFXOzs7O0lBQVgsVUFBWSxPQUFzQjtRQUNoQyxJQUNFLE9BQU8sQ0FBQyxlQUFlLENBQUM7WUFDeEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUMsWUFBWSxDQUFDO2dCQUNuRCxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQyxhQUFhLENBQUMsRUFDeEQ7WUFDQSxJQUFJLElBQUksQ0FBQyxrQkFBa0IsSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtnQkFDbkUsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7YUFDOUM7WUFDRCxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7U0FDYjtRQUNELElBQ0UsT0FBTyxDQUFDLFdBQVcsQ0FBQztZQUNwQixPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsYUFBYSxLQUFLLFNBQVM7WUFDaEQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsWUFBWSxDQUFDO2dCQUMvQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxhQUFhLENBQUMsRUFDcEQ7WUFDQSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7U0FDeEI7UUFDRCxJQUNFLE9BQU8sQ0FBQyxhQUFhLENBQUM7WUFDdEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsWUFBWSxDQUFDO2dCQUNqRCxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxhQUFhLENBQUMsRUFDdEQ7WUFDQSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7U0FDdkI7SUFDSCxDQUFDOzs7O0lBRUQsNkNBQWM7OztJQUFkO1FBQUEsaUJBZUM7UUFkQyxXQUFXO1FBQ1gsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ2xCLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDMUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPOzs7O1lBQUMsVUFBQyxJQUFJO2dCQUM1QixJQUFJLElBQUksQ0FBQyxXQUFXLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssQ0FBQyxDQUFDLEVBQUU7b0JBQ3BFLEtBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsR0FBRzt3QkFDM0MsS0FBSyxFQUFFLElBQUksQ0FBQyxXQUFXO3dCQUN2QixLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssSUFBSSxNQUFNO3dCQUMzQixXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVcsSUFBSSxLQUFLO3dCQUN0QyxjQUFjLEVBQUUsSUFBSSxDQUFDLGNBQWMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUM7cUJBQ3RFLENBQUM7aUJBQ0g7WUFDSCxDQUFDLEVBQUMsQ0FBQztTQUNKO0lBQ0gsQ0FBQzs7Ozs7O0lBRU8sbUNBQUk7Ozs7O0lBQVosVUFBYSxNQUF1QjtRQUFwQyxpQkE0QkM7UUE1QlksdUJBQUEsRUFBQSxjQUF1QjtRQUNsQyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsQ0FBQyxDQUFDO1FBQzdCLE9BQU87UUFDUCxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUU7WUFDbkMsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7WUFDMUIsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2xCLDJCQUEyQjtRQUMzQixJQUNFLENBQUMsTUFBTTtZQUNQLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYTtnQkFDbEIsQ0FBQyxJQUFJLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQzFEO1lBQ0EsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7WUFDMUIsMkJBQTJCO1lBQzNCLElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEVBQUU7Z0JBQzdCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO2FBQy9CO1lBQ0QsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7U0FDdEI7YUFBTTtZQUNMLE9BQU87WUFDUCxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztTQUM1QjtRQUNELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxZQUFZLENBQUMsU0FBUzs7OztRQUFDLFVBQUMsSUFBSTtZQUNuRCxPQUFBLEtBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUM7UUFBL0IsQ0FBK0IsRUFDaEMsQ0FBQztRQUNGLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFFRDs7T0FFRzs7Ozs7O0lBQ0sseUNBQVU7Ozs7O0lBQWxCO1FBQ0UsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ3ZDLEtBQUssRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7U0FDekIsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDcEMsQ0FBQzs7OztJQUVELG1EQUFvQjs7O0lBQXBCO1FBQUEsaUJBUUM7UUFQQyw4QkFBOEI7UUFDOUIsSUFBSSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsRUFBRTtZQUMvQixPQUFPO1NBQ1I7UUFDRCxVQUFVOzs7UUFBQztZQUNULEtBQUksQ0FBQyxlQUFlLENBQUMsS0FBSSxDQUFDLFVBQVUsRUFBRSxLQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDekQsQ0FBQyxHQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ1IsQ0FBQztJQUVEOztPQUVHOzs7Ozs7SUFDSywwQ0FBVzs7Ozs7SUFBbkI7UUFDRSxPQUFPLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVEOzs7OztPQUtHOzs7Ozs7Ozs7SUFDSyxtREFBb0I7Ozs7Ozs7O0lBQTVCLFVBQ0UsaUJBQXNCLEVBQ3RCLFdBQTRCLEVBQzVCLGVBQWdDO1FBSGxDLGlCQXlGQztRQXZGQyw0QkFBQSxFQUFBLG1CQUE0QjtRQUM1QixnQ0FBQSxFQUFBLHVCQUFnQzs7WUFFNUIsWUFBWSxHQUFRLEVBQUU7UUFDMUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPOzs7O1FBQUMsVUFBQyxJQUFJO1lBQzFCLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQ3ZDO2dCQUNFLEtBQUssRUFDSCxpQkFBaUIsSUFBSSxJQUFJO29CQUN2QixDQUFDLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztvQkFDOUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLO2dCQUNoQixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7YUFDeEIsRUFDRCxXQUFXO2dCQUNULENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUk7b0JBQzFCLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUM7b0JBQ3ZCLENBQUMsQ0FBQyxFQUFFO2dCQUNOLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTztvQkFDWixDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDO29CQUN2QixDQUFDLENBQUMsRUFBRSxDQUNULENBQUM7WUFDRixJQUFJLElBQUksQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUU7Z0JBQ2hELFlBQVksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxHQUFHLEtBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUNyRCxpQkFBaUIsSUFBSSxJQUFJO29CQUN2QixDQUFDLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJO29CQUNwRCxDQUFDLENBQUMsSUFBSSxFQUNSLEVBQUUsQ0FDSCxDQUFDO2FBQ0g7UUFDSCxDQUFDLEVBQUMsQ0FBQzs7O1lBR0csS0FBSyxHQUNULENBQUMsZUFBZSxJQUFJLGlCQUFpQixJQUFJLGlCQUFpQixDQUFDLFFBQVE7WUFDakUsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLFFBQVE7WUFDNUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUU7UUFDMUIsWUFBWSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMvQyxJQUFJLGlCQUFpQixJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxFQUFFO1lBQ3BELGlCQUFpQixDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7U0FDcEM7UUFFRCxzQ0FBc0M7UUFDdEMsSUFBSSxpQkFBaUIsRUFBRTtZQUNyQixNQUFNLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsT0FBTzs7OztZQUFDLFVBQUMsR0FBRztnQkFDekMsSUFDRSxHQUFHLEtBQUssV0FBVztvQkFDbkIsR0FBRyxLQUFLLHVCQUF1QjtvQkFDL0IsR0FBRyxLQUFLLFVBQVUsRUFDbEI7b0JBQ0EsT0FBTztpQkFDUjtnQkFDRCxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxFQUFFO29CQUN0QixZQUFZLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztpQkFDN0Q7WUFDSCxDQUFDLEVBQUMsQ0FBQztTQUNKO1FBRUQsWUFBWSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FDdEMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFDdkMsRUFBRSxDQUNILENBQUM7UUFDRixZQUFZLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsQ0FBQzs7WUFDeEUsZUFBZSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQztRQUNqRCxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU87Ozs7UUFBQyxVQUFDLElBQUk7WUFDMUIsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFOztvQkFDaEIsVUFBVSxHQUNkLElBQUksQ0FBQyx5QkFBeUIsSUFBSSxJQUFJO29CQUNwQyxDQUFDLENBQUMsSUFBSSxDQUFDLHlCQUF5QjtvQkFDaEMsQ0FBQyxDQUFDLENBQUM7O29CQUNELE9BQU8sR0FBRyxlQUFlLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7O29CQUN4QyxZQUFZOzs7O2dCQUFHLFVBQUMsS0FBVTtvQkFDOUIsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLFlBQVksQ0FBQyxNQUFNLElBQUksS0FBSyxLQUFLLElBQUksRUFBRTt3QkFDdkQsS0FBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7cUJBQzdCO29CQUNELEtBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxLQUFLLEVBQUUsZUFBZSxDQUFDLENBQUM7Z0JBQ2hFLENBQUMsQ0FBQTtnQkFDRCwrQkFBK0I7Z0JBQy9CLElBQUksVUFBVSxHQUFHLENBQUMsRUFBRTtvQkFDbEIsT0FBTyxDQUFDLFlBQVk7eUJBQ2pCLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUM7eUJBQzlCLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQztpQkFDNUI7cUJBQU07b0JBQ0wsT0FBTyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUM7aUJBQzlDO2FBQ0Y7UUFDSCxDQUFDLEVBQUMsQ0FBQztRQUNILE9BQU8sZUFBZSxDQUFDO0lBQ3pCLENBQUM7Ozs7O0lBRU8sa0RBQW1COzs7O0lBQTNCO1FBQ0UsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsT0FBTzs7Ozs7UUFBQyxVQUFDLElBQUksRUFBRSxLQUFLO1lBQy9DLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUUsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUNsRSxDQUFDLEVBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRzs7Ozs7SUFDSCxrREFBbUI7Ozs7SUFBbkI7UUFBQSxpQkFVQztRQVRDLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTzs7OztRQUFDLFVBQUMsaUJBQWlCO1lBQzNDLEtBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUN4QixLQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQ25DLEtBQUksQ0FBQyxvQkFBb0IsQ0FBQyxpQkFBaUIsQ0FBQyxDQUM3QyxDQUFDO1FBQ0osQ0FBQyxFQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztRQUMxQixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztJQUN2QixDQUFDO0lBRUQ7OztPQUdHOzs7Ozs7O0lBQ0gsMENBQVc7Ozs7OztJQUFYLFVBQVksU0FBNEIsRUFBRSxPQUF1QjtRQUFqRSxpQkFrQkM7UUFsQnlDLHdCQUFBLEVBQUEsY0FBdUI7O1lBQ3pELFFBQVEsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDOztZQUM5QyxPQUFPLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRTtRQUNsQyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDOUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFDM0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDaEMsd0JBQXdCO1FBQ3hCLElBQUksQ0FBQyxtQkFBbUI7WUFDdEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3JELFVBQVU7OztRQUFDO1lBQ1QsS0FBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3RCLElBQUksT0FBTyxFQUFFO2dCQUNYLEtBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUNyRCxLQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQztnQkFDcEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDdEIsS0FBSSxDQUFDLFFBQVEsQ0FBQyxLQUFJLENBQUMsVUFBVSxFQUFFLEtBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQzthQUNqRDtRQUNILENBQUMsR0FBRSxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFRDs7T0FFRzs7Ozs7O0lBQ0gsMkNBQVk7Ozs7O0lBQVosVUFBYSxJQUFlO1FBQTVCLGlCQW1CQzs7WUFsQk8sV0FBVyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7UUFDOUQsSUFBSSxXQUFXLEdBQUcsQ0FBQyxFQUFFO1lBQ25CLE9BQU87U0FDUjs7O1lBRUssWUFBWSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUU7O1lBQ2pDLFFBQVEsR0FBRyxXQUFXLEdBQUcsQ0FBQztRQUNoQyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FDeEIsUUFBUSxFQUNSLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxZQUFZLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUNyRCxDQUFDO1FBQ0YsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFDM0IsVUFBVTs7O1FBQUM7WUFDVCxLQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDdEIsS0FBSSxDQUFDLFVBQVUsR0FBRyxLQUFJLENBQUMsbUJBQW1CLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDckQsS0FBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUM7WUFDcEIsS0FBSSxDQUFDLFFBQVEsQ0FBQyxLQUFJLENBQUMsVUFBVSxFQUFFLEtBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNsRCxDQUFDLEdBQUUsQ0FBQyxDQUFDLENBQUM7SUFDUixDQUFDO0lBSUQ7OztPQUdHOzs7Ozs7SUFDSCw2Q0FBYzs7Ozs7SUFBZCxVQUFlLFdBQStCO1FBQTlDLGlCQStDQzs7WUE5Q0ssUUFBUSxHQUFHLENBQUMsQ0FBQztRQUNqQixJQUFJLE9BQU8sV0FBVyxLQUFLLFFBQVEsRUFBRTtZQUNuQyxRQUFRLEdBQUcsV0FBVyxHQUFHLENBQUMsQ0FBQztTQUM1QjthQUFNLElBQUksV0FBVyxFQUFFO1lBQ3RCLFFBQVEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7U0FDOUQ7UUFDRCxPQUFPLENBQUMsR0FBRyxDQUNULE9BQU8sRUFDUCxPQUFPLFdBQVcsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUN6RCxDQUFDO1FBQ0YsSUFBSSxRQUFRLEdBQUcsQ0FBQyxFQUFFO1lBQ2hCLE9BQU87U0FDUjtRQUNELGlCQUFpQjtRQUNqQixJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ2pFLElBQUksSUFBSSxDQUFDLG1CQUFtQixFQUFFO2dCQUM1QixJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxFQUFFLENBQUM7YUFDakM7WUFDRCxPQUFPO1NBQ1I7O1lBQ0ssV0FBVyxHQUFHLG1CQUFBLElBQUksQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFhO1FBQ2pFLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUMxQyxJQUNFLENBQUMsSUFBSSxDQUFDLFlBQVk7WUFDbEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRO1lBQzVCLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQ3pDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUN6QjtZQUNBLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztTQUNwQjthQUFNOzs7Z0JBRUMsT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQ3RCLENBQUMsRUFDRCxJQUFJLENBQUMsSUFBSSxDQUNQLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQzlELENBQ0Y7WUFDRCxJQUFJLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxPQUFPLEVBQUU7Z0JBQ3RDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxPQUFPLENBQUM7YUFDcEM7WUFDRCxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztTQUM1QjtRQUNELFVBQVU7OztRQUFDO1lBQ1QsS0FBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3hCLENBQUMsR0FBRSxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFRCwyQkFBMkI7Ozs7Ozs7SUFDbkIsa0RBQW1COzs7Ozs7SUFBM0IsVUFBNEIsU0FBNEI7UUFDdEQsSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNkLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO1NBQzVDOztZQUNLLEdBQUcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDO1FBQzNELE9BQU8sR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO0lBQ2xFLENBQUM7SUFFRCwyQkFBMkI7Ozs7Ozs7SUFDbkIsa0RBQW1COzs7Ozs7SUFBM0IsVUFBNEIsV0FBbUI7UUFDN0MsT0FBTyxDQUNMLFdBQVcsR0FBRyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQ3ZFLENBQUM7SUFDSixDQUFDOzs7OztJQUVNLDhDQUFlOzs7O0lBQXRCLFVBQXVCLEtBQWE7UUFBcEMsaUJBS0M7UUFKQyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsS0FBSyxDQUFDO1FBQ2pDLFVBQVU7OztRQUFDO1lBQ1QsS0FBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3hCLENBQUMsR0FBRSxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7Ozs7O0lBRU0sNkNBQWM7Ozs7SUFBckIsVUFBc0IsS0FBYTtRQUFuQyxpQkFLQztRQUpDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxLQUFLLENBQUM7UUFDaEMsVUFBVTs7O1FBQUM7WUFDVCxLQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDeEIsQ0FBQyxHQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ1IsQ0FBQzs7Ozs7O0lBRU8sbURBQW9COzs7OztJQUE1QixVQUE2QixJQUFVO1FBQXZDLGlCQW9HQztRQW5HQyxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDckIsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTs7b0JBQ3RELE9BQUssR0FBRyxJQUFJLENBQUMsS0FBSztnQkFDeEIsSUFBSSxPQUFLLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUU7b0JBQ2pELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPOzs7OztvQkFBQyxVQUFDLElBQUksRUFBRSxLQUFLO3dCQUN4QyxLQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLHdCQUN4QixLQUFJLENBQUMsd0JBQXdCLENBQUMsS0FBSyxDQUFDLEVBQ3BDLE9BQUssQ0FBQyxLQUFLLENBQUMsQ0FDaEIsQ0FBQztvQkFDSixDQUFDLEVBQUMsQ0FBQztpQkFDSjtxQkFBTSxJQUFJLE9BQUssQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRTs7Ozt3QkFHaEQsV0FBVyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxLQUFLOzt3QkFDNUQsUUFBUSxHQUFHLENBQUMsQ0FBQztvQkFDakIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7d0JBQzNDLElBQUksV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLHFCQUFxQixFQUFFOzRCQUN4QyxRQUFRLEdBQUcsQ0FBQyxDQUFDOzRCQUNiLE1BQU07eUJBQ1A7cUJBQ0Y7b0JBQ0QsSUFBSSxRQUFRLEtBQUssQ0FBQyxDQUFDLEVBQUU7d0JBQ25CLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQzVCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUN2QyxDQUFDLEVBQ0QsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUN0QixDQUFDO3FCQUNIO29CQUNELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztpQkFDckU7cUJBQU07Ozs7d0JBR0QsY0FBWSxHQUFHLENBQUMsQ0FBQzs7d0JBQ2pCLEtBQUssR0FBRyxDQUFDO29CQUNiLElBQUksT0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7d0JBQ3RCLGNBQVksR0FBRyxDQUFDLENBQUM7cUJBQ2xCO3lCQUFNO3dCQUNMLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxPQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFOzRCQUNyQyxJQUFJLE9BQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEdBQUcsS0FBSyxHQUFHLENBQUMsRUFBRTtnQ0FDbEMsY0FBWSxHQUFHLENBQUMsQ0FBQztnQ0FDakIsTUFBTTs2QkFDUDs0QkFDRCxLQUFLLEVBQUUsQ0FBQzt5QkFDVDtxQkFDRjtvQkFDRCxJQUFJLGNBQVksS0FBSyxDQUFDLENBQUMsRUFBRTt3QkFDdkIsb0VBQW9FO3dCQUNwRSxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU07Ozs7O3dCQUN0RCxVQUFDLElBQUksRUFBRSxLQUFLOzRCQUNWLE9BQU8sS0FBSyxLQUFLLEtBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFZLENBQUMsQ0FBQzt3QkFDdkQsQ0FBQyxFQUNGLENBQUM7d0JBQ0YsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxjQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUM7d0JBQzlDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFOzRCQUNyRCxJQUFJLENBQUMsSUFBSSxjQUFZLEVBQUU7Z0NBQ3JCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDOzZCQUM1Qjt5QkFDRjtxQkFDRjt5QkFBTTs7OzRCQUVDLGFBQVcsR0FDZixJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7d0JBQ3pELElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTTs7Ozs7d0JBQ3RELFVBQUMsSUFBSSxFQUFFLEtBQUs7NEJBQ1YsT0FBTyxLQUFLLEtBQUssYUFBVyxDQUFDO3dCQUMvQixDQUFDLEVBQ0YsQ0FBQzt3QkFDRixJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxFQUFFLENBQUM7cUJBQzdCO2lCQUNGO2FBQ0Y7aUJBQU07Z0JBQ0wsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtvQkFDdEIsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7aUJBQ3RDO2FBQ0Y7U0FDRjthQUFNO1lBQ0wsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtnQkFDdEIsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7YUFDdEM7U0FDRjtRQUVELE1BQU07UUFDTixJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRTtZQUN0QixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUM7U0FDakQ7YUFBTTtZQUNMLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtnQkFDbEIsaUNBQWlDO2dCQUNqQyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUM7YUFDakQ7aUJBQU07Z0JBQ0wsa0RBQWtEO2dCQUNsRCxJQUFJLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUU7b0JBQ2xDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO2lCQUN2QztxQkFBTTtvQkFDTCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUM7aUJBQ2pEO2FBQ0Y7U0FDRjtRQUNELDhCQUE4QjtRQUM5QixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUNsRCxDQUFDOzs7Ozs7SUFFTyx3Q0FBUzs7Ozs7SUFBakIsVUFBa0IsSUFBcUI7UUFDckMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxFQUFFO1lBQ3hDLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7O1lBQ0csUUFBUSxHQUFHLEVBQUU7O1lBQ2IscUJBQXFCLEdBQUcsRUFBRTtRQUM5QixJQUFJLENBQUMsT0FBTzs7OztRQUFDLFVBQUMsSUFBSTtZQUNoQixVQUFVO1lBQ1Ysc0hBQXNIO1lBQ3RILDhDQUE4QztZQUM5QyxJQUFJO1lBQ0osUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFFekIsMkRBQTJEO1lBQzNELElBQUksSUFBSSxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO2dCQUMzQyxxQkFBcUIsR0FBRyxFQUFFLENBQUM7Z0JBQzNCLElBQUksQ0FBQyxPQUFPOzs7O2dCQUFDLFVBQUMsU0FBUztvQkFDckIsSUFDRSxTQUFTLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSzt3QkFDMUMsU0FBUyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssRUFDMUM7d0JBQ0EscUJBQXFCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztxQkFDNUM7Z0JBQ0gsQ0FBQyxFQUFDLENBQUM7Z0JBQ0gsSUFBSSxxQkFBcUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO29CQUNwQyxNQUFNLHNGQUF3QixJQUFJLENBQUMsSUFBSSxvSUFBaUQsQ0FBQztpQkFDMUY7YUFDRjtRQUNILENBQUMsRUFBQyxDQUFDO1FBQ0gsYUFBYTtRQUNiLElBQUksaUJBQUksSUFBSSxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsTUFBTSxLQUFLLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDakQsTUFBTSwrQkFBK0IsQ0FBQztTQUN2QztRQUNELGdCQUFnQjtRQUNoQixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7Ozs7SUFFTSx5Q0FBVTs7O0lBQWpCO1FBQ0UsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7SUFDaEUsQ0FBQzs7OztJQUVNLHdDQUFTOzs7SUFBaEI7UUFDRSxLQUFLO1FBQ0wsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3RCLEtBQUssSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDN0QsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUN4QjtRQUNELElBQUksQ0FBQyxtQkFBbUIsR0FBRyxDQUFDLENBQUM7SUFDL0IsQ0FBQzs7Ozs7O0lBRU0seUNBQVU7Ozs7O0lBQWpCLFVBQWtCLFFBQWEsRUFBRSxJQUFTO1FBQ3hDLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN6QyxDQUFDOzs7Ozs7O0lBRU0sMENBQVc7Ozs7OztJQUFsQixVQUFtQixFQUFVLEVBQUUsU0FBaUIsRUFBRSxTQUFpQjs7WUFDM0QsUUFBUSxHQUFRLFFBQVEsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDO1FBQ2hELFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNsQixJQUFJLENBQUMsdUJBQXVCLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ3JELENBQUM7Ozs7OztJQUlELDZDQUFjOzs7OztJQUFkLFVBQWUsSUFBWSxFQUFFLFFBQWdCOztZQUNyQyxXQUFXLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUM7UUFDN0MsSUFBSSxXQUFXLEtBQUssU0FBUyxFQUFFO1lBQzdCLE9BQU8sV0FBVyxHQUFHLEVBQUUsSUFBSSxRQUFRLENBQUM7U0FDckM7O1lBRUssSUFBSSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDO1FBQzNDLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxHQUFHLFFBQVEsQ0FBQztRQUNqQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxVQUFVLENBQUM7UUFDakMsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLEdBQUcsUUFBUSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQztRQUM3QixJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxjQUFjLENBQUMsQ0FBQyxzQkFBc0I7UUFDM0QsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7UUFDdEIsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7O1lBQzFCLFVBQVUsR0FBRyxJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsSUFBSSxRQUFRO1FBQ3BELElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUM3QyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7UUFDNUIsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDaEMsT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQzs7Ozs7SUFFRCw0Q0FBYTs7OztJQUFiLFVBQWMsR0FBUTtRQUNwQixJQUFJLEdBQUcsSUFBSSxHQUFHLEtBQUssQ0FBQyxFQUFFO1lBQ3BCLE9BQU8sR0FBRyxDQUFDO1NBQ1o7YUFBTTtZQUNMLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7SUFDSCxDQUFDOzs7OztJQUVELG1EQUFvQjs7OztJQUFwQixVQUFxQixHQUFRO1FBQzNCLElBQUksR0FBRyxLQUFLLElBQUksSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFO1lBQ3JDLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7YUFBTTtZQUNMLE9BQU8sSUFBSSxDQUFDO1NBQ2I7SUFDSCxDQUFDOztnQkF0N0RGLFNBQVMsU0FBQztvQkFDVCxRQUFRLEVBQUUsZUFBZTtvQkFDekIsMmtrQ0FBNkM7O2lCQUU5Qzs7OztnQkEzQm1CLFdBQVc7Z0JBZDdCLGlCQUFpQjtnQkErQlYsb0JBQW9COzs7bUNBWTFCLFlBQVksU0FBQyxjQUFjO2lDQUUzQixLQUFLOzZCQUNMLEtBQUs7c0NBQ0wsTUFBTTt5Q0FDTixLQUFLO3dDQUVMLEtBQUs7K0JBQ0wsS0FBSzs2QkFDTCxLQUFLOytCQUVMLEtBQUs7a0NBRUwsS0FBSzt1QkFFTCxLQUFLOzRCQUNMLEtBQUs7Z0NBRUwsS0FBSztpQ0FDTCxLQUFLO3lCQUNMLEtBQUs7OEJBQ0wsTUFBTTsrQkFFTixNQUFNO2tDQUVOLE1BQU07b0NBQ04sS0FBSzs0QkFRTCxLQUFLOzhCQUNMLEtBQUs7Z0NBQ0wsS0FBSzt1Q0E0Q0wsWUFBWSxTQUFDLHNCQUFzQixFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtzQ0FHdEQsWUFBWSxTQUFDLHFCQUFxQixFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTt1Q0FHckQsWUFBWSxTQUFDLHNCQUFzQixFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTs2QkFHdEQsWUFBWSxTQUFDLFlBQVksRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7a0NBMmpENUMsTUFBTTs7SUFscERrQjtRQUFmLFlBQVksRUFBRTs7Z0VBQWdDO0lBQy9CO1FBQWYsWUFBWSxFQUFFOzs0REFBNEI7SUFFM0I7UUFBZixZQUFZLEVBQUU7O3dFQUF5QztJQUV4QztRQUFmLFlBQVksRUFBRTs7dUVBQXVDO0lBQ3RDO1FBQWYsWUFBWSxFQUFFOzs4REFBK0I7SUFDOUI7UUFBZixZQUFZLEVBQUU7OzREQUE2QjtJQUU1QjtRQUFmLFlBQVksRUFBRTs7OERBQStCO0lBRTlCO1FBQWYsWUFBWSxFQUFFOztpRUFBa0M7SUFhakM7UUFBZixZQUFZLEVBQUU7O21FQUFvQztJQVFuQztRQUFmLFlBQVksRUFBRTs7MkRBQTRCO0lBKzREdEQsMkJBQUM7Q0FBQSxBQXY3REQsSUF1N0RDO1NBbDdEWSxvQkFBb0I7OztJQUMvQixnREFBdUU7O0lBRXZFLDhDQUF3RDs7SUFDeEQsMENBQW9EOztJQUNwRCxtREFBbUQ7O0lBQ25ELHNEQUFpRTs7Ozs7SUFFakUscURBQStEOztJQUMvRCw0Q0FBdUQ7O0lBQ3ZELDBDQUFxRDs7Ozs7SUFFckQsNENBQXVEOzs7OztJQUV2RCwrQ0FBMEQ7Ozs7O0lBRTFELG9DQUFzQjs7SUFDdEIseUNBQW9DOztJQUVwQyw2Q0FBNEI7O0lBQzVCLDhDQUEyRDs7SUFDM0Qsc0NBQTBEOztJQUMxRCwyQ0FBMkM7Ozs7O0lBRTNDLDRDQUF1RDs7Ozs7SUFFdkQsK0NBQTREOztJQUM1RCxpREFBNEQ7O0lBQzVELG1EQUFnQzs7SUFDaEMsa0RBQWdDOztJQUNoQyxtREFBK0I7O0lBQy9CLHVDQUFhOztJQUNiLDBDQUFtQjs7SUFHbkIseUNBQW9EOztJQUNwRCwyQ0FBOEM7O0lBQzlDLDZDQUE0Qzs7SUFDNUMsK0NBQXFCOztJQUVyQix3Q0FBMEI7O0lBQzFCLHlDQUFrQjs7SUFDbEIsa0RBQTZCOztJQUM3Qix3REFBbUM7O0lBQ25DLGdEQUFxQzs7SUFDckMsNENBQThCOztJQUM5Qix5Q0FBMkI7Ozs7OztJQUUzQiw4Q0FBMkM7Ozs7O0lBQzNDLDZDQUEwRTs7Ozs7SUFDMUUsK0NBQW9DOzs7OztJQUVwQyxrREFBcUQ7Ozs7O0lBQ3JELG1EQUFzRDs7Ozs7SUFFdEQsaURBQThFOzs7OztJQUM5RSx5REFBOEM7Ozs7O0lBQzlDLHNEQUF5RDs7SUFHekQsOENBU087O0lBRVAsMENBQTBCOztJQUMxQiwwQ0FBMEI7O0lBQzFCLHlDQU1pQzs7SUFDakMsMkRBQTZDOztJQUM3QyxvREFDdUM7Ozs7O0lBRXZDLG1EQUNzQzs7Ozs7SUFFdEMsb0RBQ3VDOzs7OztJQUV2QywwQ0FDNkI7O0lBRzdCLGlEQUFtQzs7SUFDbkMsNkNBQStCOztJQUMvQiw0Q0FBbUM7O0lBQ25DLDZDQUFvQzs7SUFDcEMsa0RBQXlDOztJQUN6QyxtREFBMEM7O0lBQzFDLG9EQUF3RTs7Ozs7SUFDeEUsMkNBQWdDOzs7OztJQUNoQyw0Q0FBa0M7Ozs7O0lBQ2xDLDJDQUF5Qjs7Ozs7O0lBRXpCLCtDQUF5Qzs7SUE0aUR6QywrQ0FBK0M7Ozs7O0lBdVAvQyw4Q0FBdUQ7Ozs7O0lBaHlEckQsa0NBQXVCOzs7OztJQUN2QixtQ0FBOEI7Ozs7O0lBQzlCLG9EQUFrRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIENvbnRlbnRDaGlsZCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgUXVlcnlMaXN0LFxuICBTaW1wbGVDaGFuZ2VzLFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0NoaWxkcmVuLFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgRm9ybUFycmF5LCBGb3JtQnVpbGRlciwgRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XG5pbXBvcnQgeyByb3VuZCB9IGZyb20gXCJsb2Rhc2hcIjtcbmltcG9ydCAqIGFzIGxvY2FsZm9yYWdlIGZyb20gXCJsb2NhbGZvcmFnZVwiO1xuaW1wb3J0IHtcbiAgSW5wdXRCb29sZWFuLFxuICBOekRhdGVQaWNrZXJDb21wb25lbnQsXG4gIE56SW5wdXROdW1iZXJDb21wb25lbnQsXG4gIE56UmFuZ2VQaWNrZXJDb21wb25lbnQsXG4gIE56U2VsZWN0Q29tcG9uZW50LFxuICBOelRpbWVQaWNrZXJDb21wb25lbnQsXG59IGZyb20gXCJuZy16b3Jyby1hbnRkXCI7XG5pbXBvcnQgeyBOekZvcm1hdEVtaXRFdmVudCB9IGZyb20gXCJuZy16b3Jyby1hbnRkL2NvcmVcIjtcbmltcG9ydCB7IFN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUgfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcbmltcG9ydCB7IFRvdGFsT3B0aW9uIH0gZnJvbSBcIi4uL2hkLWRldGFpbC1saW5lcy9oZC1kZXRhaWwtbGluZXMuc2VydmljZVwiO1xuaW1wb3J0IHsgVHJlZUdyaWQgfSBmcm9tIFwiLi4vaGQtdGFibGUvaGQtdGFibGUuc2VydmljZVwiO1xuaW1wb3J0IHsgU2VsZWN0T3B0aW9uVGFibGVDb2x1bW4gfSBmcm9tIFwiLi4vbW9kZWwvY29tbW9uLXR5cGVcIjtcbmltcG9ydCB7IENvbW1vblNlc3Npb25TZXJ2aWNlIH0gZnJvbSBcIi4uL3NlcnZpY2UvY29tbW9uLXNlc3Npb24uc2VydmljZVwiO1xuaW1wb3J0IHsgRm9ybUxpbmUsIEZvcm1MaW5lVHlwZSwgRm9ybUxpbmVzQ2FjaGVPcHRpb24gfSBmcm9tIFwiLi9oZC1mb3JtLWxpbmVzLnNlcnZpY2VcIjtcblxuLyoqIOS4jiBhbnQtc2VsZWN0IOmAiemhuemhueawtOW5s+WGhei+uei3neS4gOiHtO+8jOeUqOS6juihqOWktOS4jumAiemhueihjOWvuem9kCAqL1xuY29uc3QgU0VMRUNUX1RBQkxFX09QVElPTl9IT1JJWk9OVEFMX1BBRERJTkcgPSAxMjtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcImhkLWZvcm0tbGluZXNcIixcbiAgdGVtcGxhdGVVcmw6IFwiLi9oZC1mb3JtLWxpbmVzLmNvbXBvbmVudC5odG1sXCIsXG4gIHN0eWxlVXJsczogW1wiLi9oZC1mb3JtLWxpbmVzLmNvbXBvbmVudC5sZXNzXCJdLFxufSlcbmV4cG9ydCBjbGFzcyBIZEZvcm1MaW5lc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgQFZpZXdDaGlsZHJlbihcImZvcm1JbnB1dERvbVwiKSBmb3JtSW5wdXREb21MaXN0ITogUXVlcnlMaXN0PEVsZW1lbnRSZWY+O1xuXG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBzaG93TGluZU51bWJlcjogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBhbGxvd0VtcHR5OiBib29sZWFuID0gdHJ1ZTtcbiAgQE91dHB1dCgpIGRlbGV0ZUxhc3RMaW5lRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBzaG93S2V5Ym9hcmRPcGVyYXRlVGlwOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiDmmK/lkKblkK/nlKjplK7nm5jmlrnlkJHplK4vRW50ZXIg5Zyo5Y2V5YWD5qC86Ze06Lez6L2s77yM6buY6K6k5byA5ZCvICovXG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBlbmFibGVLZXlib2FyZE9wZXJhdGU6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgdGFibGVMb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBzaG93U2VhcmNoOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiDmmK/lkKblsZXnpLrooYzli77pgInliJfvvIznlKjkuo7lpJbpg6jmibnph4/mk43kvZzli77pgInooYwgKi9cbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIHNob3dDaGVja2JveDogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiog5piv5ZCm5bGV56S65YiX6K6+572u77yI6b2/6L2u77yJ77yM6buY6K6k5YWz6Zet77yb6ZyA6KaB5pe26aG16Z2i5omL5belIGBbc2hvd0NvbFNldHRpbmdzXT1cInRydWVcImDvvJvku4XpnZ4gaGlkZSDnmoQgVmlld0RvbSDlj6/phY3nva7vvIznpoHmraLmi5bmi73osIPluo8gKi9cbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIHNob3dDb2xTZXR0aW5nczogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiog5YiX6K6+572u57yT5a2YIGtleSDniYfmrrXvvJvmnInlgLzml7bmjIHkuYXljJbliLAgSW5kZXhlZERC77yM5peg5YiZ5LuF5b2T5YmN5Lya6K+d55Sf5pWIICovXG4gIEBJbnB1dCgpIHV1aWQ6IHN0cmluZztcbiAgQElucHV0KCkgZm9ybUxpbmVzOiBBcnJheTxGb3JtTGluZT47XG4gIC8vIOmSiOWvuWZvcm1MaW5lc+mHjOmdouaJgOacieeahG5hbWXvvIxcbiAgQElucHV0KCkgZm9ybUxpbmVzRGF0YTogYW55O1xuICBASW5wdXQoKSBvcGVyYXRlQnV0dG9uczogQXJyYXk8c3RyaW5nPiA9IFtcImFkZFwiLCBcImRlbGV0ZVwiXTsgLy8g5pON5L2c5YiX5oyJ6ZKu77yaYWRkIC8gZGVsZXRlIC8gY29weVxuICBASW5wdXQoKSBzY3JvbGw6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7IHg6IFwiMXB4XCIgfTtcbiAgQE91dHB1dCgpIGNoYW5nZUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAvKiog5paw5aKe56m66KGM5ZCO5oqb5Ye66K+l6KGMIEZvcm1Hcm91cO+8iOaJi+WKqOa3u+WKoOOAgemUruebmOi3s+ihjOiHquWKqOihpeihjOetie+8iSAqL1xuICBAT3V0cHV0KCkgYWRkTGluZUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxGb3JtR3JvdXA+KCk7XG4gIC8qKiDli77pgInlj5jljJbml7bmipvlh7rlvZPliY3li77pgInooYwgRm9ybUdyb3VwIOWIl+ihqCAqL1xuICBAT3V0cHV0KCkgc2VsZWN0aW9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxGb3JtR3JvdXBbXT4oKTtcbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIHNob3dEZWxldGVDb25maXJtOiBib29sZWFuID0gZmFsc2U7XG4gIHBhZ2luYXRpb25QYWdlSW5kZXg6IG51bWJlciA9IDE7XG4gIHBhZ2luYXRpb25QYWdlU2l6ZTogbnVtYmVyID0gMTA7XG4gIHZhbGlkYXRlSGRGb3JtTGluZXM6IEZvcm1Hcm91cDtcbiAgbmV3TGluZTogYW55O1xuICBpbnB1dFZhbHVlOiBzdHJpbmc7XG5cbiAgLy8g5ZCI6K6h5Yy65Z+fXG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBzaG93VG90YWw6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgdG90YWxPcHRpb246IEFycmF5PFRvdGFsT3B0aW9uPiA9IFtdO1xuICBASW5wdXQoKSBjb2x1bW5zTnVtYmVyOiBudW1iZXIgfCBzdHJpbmcgPSAwO1xuICB0b3RhbE9wdGlvbkxpc3QgPSBbXTtcblxuICBzaG93Rm9ybTogYm9vbGVhbiA9IGZhbHNlO1xuICBmaWx0ZXJTdHI6IHN0cmluZztcbiAgc3RvcmVGb3JtTGluZXNEYXRhOiBhbnkgPSBbXTsgLy8g57yT5a2Y55qE5oC755qE6KGo5Y2V5pWw5o2uXG4gIGZpbHRlclN0b3JlRm9ybUxpbmVzRGF0YTogYW55ID0gW107IC8vIOetm+mAieWHuuadpeeahOaVsOaNruWIl+ihqFxuICBmaWx0ZXJJbmRleFN0b3JlOiBBcnJheTxudW1iZXI+ID0gW107IC8vIOetm+mAieWHuuadpeeahOaVsOaNruWcqOWOn+Wni+WIl+ihqOS4reeahOS4i+agh1xuICBpc0ZpbHRlckRhdGE6IGJvb2xlYW4gPSBmYWxzZTsgLy8g5piv5ZCm5piv5bey57uP562b6YCJ6L+H55qE5pWw5o2uXG4gIGZvcm1WYWxpZDogYm9vbGVhbiA9IGZhbHNlOyAvLyDooajljZXlvZPliY3nmoTnirbmgIFcbiAgLyoqIOWLvumAieeahOihjCBpZO+8iOi3qOmhteOAgeaQnOe0oumHjeW7uuWQjuS7jeS/neeVme+8iSAqL1xuICBwcml2YXRlIHNlbGVjdGVkUm93SWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIHByaXZhdGUgc2VhcmNoU3ViamVjdCA9IG5ldyBTdWJqZWN0PHsgZm46IGFueTsgZXZlbnQ6IGFueTsgbGluZTogYW55IH0+KCk7XG4gIHByaXZhdGUgZGVib3VuY2VUaW1lb3V0OiBudW1iZXIgPSAwOyAvLyDpu5jorqTpmLLmipbml7bpl7RcblxuICBwcml2YXRlIHNlYXJjaFN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIGZvcm1JbnB1dERvbUxpc3RTdWI6IFN1YnNjcmlwdGlvbiB8IHVuZGVmaW5lZDtcblxuICBwcml2YXRlIG9wZW5DaGFuZ2VTdWJqZWN0ID0gbmV3IFN1YmplY3Q8eyBmbjogYW55OyBldmVudDogYW55OyBsaW5lOiBhbnkgfT4oKTtcbiAgcHJpdmF0ZSBvcGVuQ2hhbmdlRGVib3VuY2VUaW1lb3V0OiBudW1iZXIgPSAwO1xuICBwcml2YXRlIG9wZW5DaGFuZ2VTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiB8IHVuZGVmaW5lZDtcblxuICAvLyDlvZPliY3pobXnmoRkb23kuoznu7TmlbDnu4RcbiAgY29sbGVjdERvbUxpc3Q6IEFycmF5PFxuICAgIEFycmF5PFxuICAgICAgfCBFbGVtZW50UmVmXG4gICAgICB8IE56U2VsZWN0Q29tcG9uZW50XG4gICAgICB8IE56SW5wdXROdW1iZXJDb21wb25lbnRcbiAgICAgIHwgTnpEYXRlUGlja2VyQ29tcG9uZW50XG4gICAgICB8IE56UmFuZ2VQaWNrZXJDb21wb25lbnRcbiAgICAgIHwgTnpUaW1lUGlja2VyQ29tcG9uZW50XG4gICAgPlxuICA+ID0gW107XG4gIC8vIOW9k+WJjeiBmueEpueahGRvbeWFg+e0oOWdkOagh1xuICBhY3RpdmVEb21YOiBudW1iZXIgPSBudWxsO1xuICBhY3RpdmVEb21ZOiBudW1iZXIgPSBudWxsO1xuICBhY3RpdmVEb206XG4gICAgfCBFbGVtZW50UmVmXG4gICAgfCBOelNlbGVjdENvbXBvbmVudFxuICAgIHwgTnpJbnB1dE51bWJlckNvbXBvbmVudFxuICAgIHwgTnpEYXRlUGlja2VyQ29tcG9uZW50XG4gICAgfCBOelJhbmdlUGlja2VyQ29tcG9uZW50XG4gICAgfCBOelRpbWVQaWNrZXJDb21wb25lbnQgPSBudWxsO1xuICBhY3RpdmVTZWxlY3RlZENvbXBvbmVudE9wZW46IGJvb2xlYW4gPSBmYWxzZTtcbiAgQENvbnRlbnRDaGlsZChcIlZpZXdEb21SaWdodFRlbXBsYXRlXCIsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBWaWV3RG9tUmlnaHRUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcbiAgLyoqIOW3peWFt+agj+W3puS+p+iHquWumuS5ieaMiemSru+8jOeUqOazleWQjCBoZC10YWJsZSDnmoQgdGFibGVMZWZ0QnV0dG9uICovXG4gIEBDb250ZW50Q2hpbGQoXCJmb3JtTGluZXNMZWZ0QnV0dG9uXCIsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBmb3JtTGluZXNMZWZ0QnV0dG9uOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICAvKiog5bel5YW35qCP5Y+z5L6n6Ieq5a6a5LmJ5oyJ6ZKu77yM55So5rOV5ZCMIGhkLXRhYmxlIOeahCB0YWJsZVJpZ2h0QnV0dG9uICovXG4gIEBDb250ZW50Q2hpbGQoXCJmb3JtTGluZXNSaWdodEJ1dHRvblwiLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgZm9ybUxpbmVzUmlnaHRCdXR0b246IFRlbXBsYXRlUmVmPGFueT47XG4gIC8qKiDooajmoLzkuIrmlrnoh6rlrprkuYnljLrln5/vvIjlpoLli77pgInmj5DnpLrvvInvvIznlKjms5XlkIwgaGQtdGFibGUg55qEIHRhYmxlVG90YWwgKi9cbiAgQENvbnRlbnRDaGlsZChcInRhYmxlVG90YWxcIiwgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIHRhYmxlVG90YWw6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgLy8g5YiX6K6+572uXG4gIGlzRHJvcGRvd25WaXNpYmxlOiBib29sZWFuID0gZmFsc2U7XG4gIHNob3dMaXN0Tm9kZXM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgbm93TGlzdE5vZGVzOiBBcnJheTxUcmVlR3JpZD4gPSBbXTtcbiAgaGlkZUxpc3ROb2RlczogQXJyYXk8VHJlZUdyaWQ+ID0gW107XG4gIGNhbmNlbE5vd0xpc3ROb2RlczogQXJyYXk8VHJlZUdyaWQ+ID0gW107XG4gIGNhbmNlbEhpZGVMaXN0Tm9kZXM6IEFycmF5PFRyZWVHcmlkPiA9IFtdO1xuICBmb3JtTGluZXNDYWNoZU9wdGlvbjogRm9ybUxpbmVzQ2FjaGVPcHRpb24gPSBuZXcgRm9ybUxpbmVzQ2FjaGVPcHRpb24oKTtcbiAgcHJpdmF0ZSBsb2NhbGZvcmFnZTogYW55ID0gbnVsbDtcbiAgcHJpdmF0ZSBsb2NhbHRpb25UbXA6IHN0cmluZyA9IFwiXCI7XG4gIHByaXZhdGUgdXNlclNlc3Npb246IGFueTtcbiAgLyoqIOaYr+WQpuW3suS7jiBJbmRleGVkREIg6K+75Yiw6L+H5YiX6K6+572u57yT5a2Y77yI5ZCrIGNvbHMg5Li656m677yJICovXG4gIHByaXZhdGUgY29sc0NhY2hlTG9hZGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIsXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgY29tbW9uU2Vzc2lvblNlcnZpY2U6IENvbW1vblNlc3Npb25TZXJ2aWNlLFxuICApIHtcbiAgICB0aGlzLmxvY2FsZm9yYWdlID0gbG9jYWxmb3JhZ2UuY3JlYXRlSW5zdGFuY2Uoe1xuICAgICAgZHJpdmVyOiBsb2NhbGZvcmFnZS5JTkRFWEVEREIsXG4gICAgICBuYW1lOiBcImhkLWZzY21cIixcbiAgICAgIHZlcnNpb246IDEuMCxcbiAgICAgIHN0b3JlTmFtZTogXCJoZC1mc2NtLXN0b3JlXCIsXG4gICAgfSk7XG4gICAgdGhpcy5zZWFyY2hTdWJzY3JpcHRpb24gPSB0aGlzLnNlYXJjaFN1YmplY3RcbiAgICAgIC5waXBlKGRlYm91bmNlVGltZSh0aGlzLmRlYm91bmNlVGltZW91dCkpXG4gICAgICAuc3Vic2NyaWJlKCh7IGZuLCBldmVudCwgbGluZSB9KSA9PiB0aGlzLnRyaWdnZXJFdmVudChmbiwgZXZlbnQsIGxpbmUpKTtcbiAgICB0aGlzLm9wZW5DaGFuZ2VTdWJzY3JpcHRpb24gPSB0aGlzLm9wZW5DaGFuZ2VTdWJqZWN0XG4gICAgICAucGlwZShkZWJvdW5jZVRpbWUodGhpcy5vcGVuQ2hhbmdlRGVib3VuY2VUaW1lb3V0KSlcbiAgICAgIC5zdWJzY3JpYmUoKHsgZm4sIGV2ZW50LCBsaW5lIH0pID0+IHtcbiAgICAgICAgaWYgKGV2ZW50KSB7XG4gICAgICAgICAgdGhpcy50cmlnZ2VyRXZlbnQoZm4sIGV2ZW50LCBsaW5lKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmxvY2FsdGlvblRtcCA9IGxvY2F0aW9uLnBhdGhuYW1lO1xuICAgIGlmICh0aGlzLmxvY2FsdGlvblRtcCkge1xuICAgICAgdGhpcy5sb2NhbHRpb25UbXAgPSB0aGlzLmxvY2FsdGlvblRtcC5yZXBsYWNlKC9cXC8vZywgXCJfXCIpO1xuICAgIH1cbiAgICB0aGlzLnVzZXJTZXNzaW9uID0gdGhpcy5jb21tb25TZXNzaW9uU2VydmljZS5nZXRTZXNzaW9uKFxuICAgICAgXCJfX2p5X2F1dGhvcml6YXRpb25fc2Vzc2lvbl9fXCIsXG4gICAgKTtcbiAgICBpZiAoIXRoaXMudXNlclNlc3Npb24pIHtcbiAgICAgIHRoaXMudXNlclNlc3Npb24gPSB7IHVzZXJDb2RlOiBcImRldlwiIH07XG4gICAgfVxuICAgIC8vIOe8k+WtmOS4gOS4i+aAu+eahOihqOWNleaVsOaNrlxuICAgIHRoaXMuc3RvcmVGb3JtTGluZXNEYXRhID0gdGhpcy5mb3JtTGluZXNEYXRhO1xuICAgIHRoaXMuaW5pdENvbFNldHRpbmdzKCk7XG4gICAgdGhpcy5pbml0KCk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgdGhpcy5jb2xsZWN0RG9tRGF0YSgpO1xuICAgIHRoaXMuZm9ybUlucHV0RG9tTGlzdFN1YiA9IHRoaXMuZm9ybUlucHV0RG9tTGlzdC5jaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLmNvbGxlY3REb21EYXRhKCk7XG4gICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5zZWFyY2hTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuc2VhcmNoU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLm9wZW5DaGFuZ2VTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMub3BlbkNoYW5nZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5mb3JtSW5wdXREb21MaXN0U3ViKSB7XG4gICAgICB0aGlzLmZvcm1JbnB1dERvbUxpc3RTdWIudW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cblxuICBnZXQgZm9ybUxpbmVzTGVuZ3RoKCkge1xuICAgIHJldHVybiB0aGlzLmxpbmVzRm9ybUFycmF5LmNvbnRyb2xzLmxlbmd0aDtcbiAgfVxuXG4gIGdldCBvcGVyYXRlQ29sV2lkdGgoKSB7XG4gICAgY29uc3QgY291bnQgPSAodGhpcy5vcGVyYXRlQnV0dG9ucyB8fCBbXSkuZmlsdGVyKChidG4pID0+XG4gICAgICBbXCJhZGRcIiwgXCJjb3B5XCIsIFwiZGVsZXRlXCJdLmluY2x1ZGVzKGJ0biksXG4gICAgKS5sZW5ndGg7XG4gICAgcmV0dXJuIE1hdGgubWF4KGNvdW50ICogNDAsIDgwKTtcbiAgfVxuXG4gIC8qKiBhbGxvd0VtcHR5IOS4lOaTjeS9nOWIl+S7heacieWIoOmZpOaXtu+8muWFgeiuuCAwIOihjO+8jOWIneWni+WMluS4juWIoOiHs+epuumDveS4jeiHquWKqOihpeepuuihjCAqL1xuICBnZXQgaXNUcnVseUVtcHR5QWxsb3dlZCgpOiBib29sZWFuIHtcbiAgICBjb25zdCBidXR0b25zID0gKHRoaXMub3BlcmF0ZUJ1dHRvbnMgfHwgW10pLmZpbHRlcigoYnRuKSA9PlxuICAgICAgW1wiYWRkXCIsIFwiY29weVwiLCBcImRlbGV0ZVwiXS5pbmNsdWRlcyhidG4pLFxuICAgICk7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuYWxsb3dFbXB0eSAmJlxuICAgICAgYnV0dG9ucy5sZW5ndGggPT09IDEgJiZcbiAgICAgIGJ1dHRvbnNbMF0gPT09IFwiZGVsZXRlXCJcbiAgICApO1xuICB9XG5cbiAgLyoqIOWLvumAieWIl+WbuuWumuaXtu+8jOW6j+WPt+WIl+eahCBsZWZ0IOWBj+enuyAqL1xuICBnZXQgbGluZU51bWJlckxlZnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2hvd0NoZWNrYm94ID8gXCI0MHB4XCIgOiBcIjBweFwiO1xuICB9XG5cbiAgcHJpdmF0ZSBnZW5lcmF0ZVJvd0lkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBoZF9yb3dfJHtEYXRlLm5vdygpfV8ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIsIDkpfWA7XG4gIH1cblxuICBwcml2YXRlIGdldFJvd0lkKGxpbmU6IEZvcm1Hcm91cCk6IHN0cmluZyB7XG4gICAgaWYgKCFsaW5lIHx8ICFsaW5lLmdldChcIl9oZFJvd0lkXCIpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGxpbmUuZ2V0KFwiX2hkUm93SWRcIikudmFsdWU7XG4gIH1cblxuICAvKiog5b2T5YmN6aG155qE6KGM77yI55So5LqO6KGo5aS05YWo6YCJ77yM5LuF5L2c55So5LqO5b2T5YmN6aG177yM6Leo6aG15Yu+6YCJ5LuN5L+d55WZ77yJICovXG4gIHByaXZhdGUgZ2V0Q3VycmVudFBhZ2VMaW5lcygpOiBGb3JtR3JvdXBbXSB7XG4gICAgY29uc3Qgc3RhcnQgPSAodGhpcy5wYWdpbmF0aW9uUGFnZUluZGV4IC0gMSkgKiB0aGlzLnBhZ2luYXRpb25QYWdlU2l6ZTtcbiAgICBjb25zdCBlbmQgPSBzdGFydCArIHRoaXMucGFnaW5hdGlvblBhZ2VTaXplO1xuICAgIHJldHVybiAodGhpcy5saW5lc0Zvcm1BcnJheS5jb250cm9scyBhcyBGb3JtR3JvdXBbXSkuc2xpY2Uoc3RhcnQsIGVuZCk7XG4gIH1cblxuICBpc0xpbmVDaGVja2VkKGxpbmU6IEZvcm1Hcm91cCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGlkID0gdGhpcy5nZXRSb3dJZChsaW5lKTtcbiAgICByZXR1cm4gISFpZCAmJiB0aGlzLnNlbGVjdGVkUm93SWRzLmhhcyhpZCk7XG4gIH1cblxuICBpc0FsbENoZWNrZWQoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcGFnZUxpbmVzID0gdGhpcy5nZXRDdXJyZW50UGFnZUxpbmVzKCk7XG4gICAgcmV0dXJuIChcbiAgICAgIHBhZ2VMaW5lcy5sZW5ndGggPiAwICYmXG4gICAgICBwYWdlTGluZXMuZXZlcnkoKGxpbmUpID0+IHRoaXMuaXNMaW5lQ2hlY2tlZChsaW5lKSlcbiAgICApO1xuICB9XG5cbiAgaXNJbmRldGVybWluYXRlKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHBhZ2VMaW5lcyA9IHRoaXMuZ2V0Q3VycmVudFBhZ2VMaW5lcygpO1xuICAgIGNvbnN0IGNoZWNrZWRDb3VudCA9IHBhZ2VMaW5lcy5maWx0ZXIoKGxpbmUpID0+XG4gICAgICB0aGlzLmlzTGluZUNoZWNrZWQobGluZSksXG4gICAgKS5sZW5ndGg7XG4gICAgcmV0dXJuIGNoZWNrZWRDb3VudCA+IDAgJiYgY2hlY2tlZENvdW50IDwgcGFnZUxpbmVzLmxlbmd0aDtcbiAgfVxuXG4gIG9uQWxsQ2hlY2tlZChjaGVja2VkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5nZXRDdXJyZW50UGFnZUxpbmVzKCkuZm9yRWFjaCgobGluZSkgPT4ge1xuICAgICAgY29uc3QgaWQgPSB0aGlzLmdldFJvd0lkKGxpbmUpO1xuICAgICAgaWYgKCFpZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoY2hlY2tlZCkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkUm93SWRzLmFkZChpZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNlbGVjdGVkUm93SWRzLmRlbGV0ZShpZCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5lbWl0U2VsZWN0aW9uQ2hhbmdlKCk7XG4gIH1cblxuICBvbkxpbmVDaGVja2VkQ2hhbmdlKGxpbmU6IEZvcm1Hcm91cCwgY2hlY2tlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIGNvbnN0IGlkID0gdGhpcy5nZXRSb3dJZChsaW5lKTtcbiAgICBpZiAoIWlkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChjaGVja2VkKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkUm93SWRzLmFkZChpZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRSb3dJZHMuZGVsZXRlKGlkKTtcbiAgICB9XG4gICAgdGhpcy5lbWl0U2VsZWN0aW9uQ2hhbmdlKCk7XG4gIH1cblxuICBwcml2YXRlIGVtaXRTZWxlY3Rpb25DaGFuZ2UoKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2UuZW1pdCh0aGlzLmdldFNlbGVjdGVkTGluZXMoKSk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZUxpbmVGcm9tU2VsZWN0aW9uKGxpbmU6IEZvcm1Hcm91cCk6IHZvaWQge1xuICAgIGNvbnN0IGlkID0gdGhpcy5nZXRSb3dJZChsaW5lKTtcbiAgICBpZiAoaWQgJiYgdGhpcy5zZWxlY3RlZFJvd0lkcy5oYXMoaWQpKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkUm93SWRzLmRlbGV0ZShpZCk7XG4gICAgICB0aGlzLmVtaXRTZWxlY3Rpb25DaGFuZ2UoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFwcGx5VmFsdWVzVG9MaW5lKFxuICAgIGxpbmU6IEZvcm1Hcm91cCxcbiAgICB2YWx1ZXM6IHsgW2ZpZWxkOiBzdHJpbmddOiBhbnkgfSxcbiAgICBlbWl0RXZlbnQ6IGJvb2xlYW4sXG4gICk6IHZvaWQge1xuICAgIE9iamVjdC5rZXlzKHZhbHVlcykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICBsZXQgY29udHJvbCA9IGxpbmUuZ2V0KGtleSk7XG4gICAgICBpZiAoIWNvbnRyb2wpIHtcbiAgICAgICAgbGluZS5hZGRDb250cm9sKGtleSwgdGhpcy5mYi5jb250cm9sKHZhbHVlc1trZXldKSk7XG4gICAgICAgIGNvbnRyb2wgPSBsaW5lLmdldChrZXkpO1xuICAgICAgfVxuICAgICAgLy8g6Z2Z6buY6LWL5YC877yM6YG/5YWNIHZhbHVlQ2hhbmdlcyAvIERPTSBtYXhsZW5ndGgg5Zue5YaZ5oqK5qCh6aqM5oCB5omT5LmxXG4gICAgICBjb250cm9sLnNldFZhbHVlKHZhbHVlc1trZXldLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICBjb250cm9sLm1hcmtBc1ByaXN0aW5lKHsgb25seVNlbGY6IHRydWUgfSk7XG4gICAgICBjb250cm9sLm1hcmtBc1VudG91Y2hlZCh7IG9ubHlTZWxmOiB0cnVlIH0pO1xuICAgICAgY29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgIGlmIChlbWl0RXZlbnQpIHtcbiAgICAgICAgY29uc3QgZm9ybUl0ZW0gPSB0aGlzLmZvcm1MaW5lcy5maW5kKChpdGVtKSA9PiBpdGVtLm5hbWUgPT09IGtleSk7XG4gICAgICAgIGlmIChmb3JtSXRlbSAmJiBmb3JtSXRlbS5vbkNoYW5nZUV2ZW50KSB7XG4gICAgICAgICAgdGhpcy50cmlnZ2VyRXZlbnQoZm9ybUl0ZW0ub25DaGFuZ2VFdmVudCwgdmFsdWVzW2tleV0sIGxpbmUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIOS7heWcqOeUqOaIt+S6pOS6kuWQjuOAgeS4lOW9k+WJjeWAvOehruWunuS4uuepuueahCByZXF1aXJlZCDplJnor6/ml7blsZXnpLrnuqLmoYbvvIxcbiAgICog6YG/5YWN5om56YeP6LWL5YC85pe2IG5nLXpvcnJvIOaui+eVmeOAjOS4jeiDveS4uuepuuOAjeaPkOekulxuICAgKi9cbiAgZ2V0Q29udHJvbFZhbGlkYXRlU3RhdHVzKGxpbmU6IEZvcm1Hcm91cCwgZm9ybUl0ZW06IEZvcm1MaW5lKTogc3RyaW5nIHtcbiAgICBjb25zdCBjb250cm9sID0gbGluZS5nZXQoZm9ybUl0ZW0ubmFtZSk7XG4gICAgaWYgKCFjb250cm9sIHx8IGNvbnRyb2wuZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cbiAgICBjb25zdCBlbXB0eSA9XG4gICAgICBjb250cm9sLnZhbHVlID09PSBudWxsIHx8XG4gICAgICBjb250cm9sLnZhbHVlID09PSB1bmRlZmluZWQgfHxcbiAgICAgIGNvbnRyb2wudmFsdWUgPT09IFwiXCI7XG4gICAgaWYgKFxuICAgICAgKGNvbnRyb2wuZGlydHkgfHwgY29udHJvbC50b3VjaGVkKSAmJlxuICAgICAgZW1wdHkgJiZcbiAgICAgIGNvbnRyb2wuaGFzRXJyb3IoXCJyZXF1aXJlZFwiKVxuICAgICkge1xuICAgICAgcmV0dXJuIFwiZXJyb3JcIjtcbiAgICB9XG4gICAgcmV0dXJuIFwiXCI7XG4gIH1cblxuICAvKiog55So5oi36L6T5YWl5pe25oyJIG1heExlbmd0aCDmiKrmlq3vvIjkuI3kvb/nlKjljp/nlJ8gbWF4bGVuZ3Ro77yM6YG/5YWN5bmy5omw56iL5bqP5YyW6LWL5YC877yJICovXG4gIGxpbWl0SW5wdXRMZW5ndGgoZXZlbnQ6IEV2ZW50LCBsaW5lOiBGb3JtR3JvdXAsIGZvcm1JdGVtOiBGb3JtTGluZSk6IHZvaWQge1xuICAgIGlmICghZm9ybUl0ZW0gfHwgIWZvcm1JdGVtLm1heExlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpbnB1dCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgIGlmIChpbnB1dCAmJiBpbnB1dC52YWx1ZSAmJiBpbnB1dC52YWx1ZS5sZW5ndGggPiBmb3JtSXRlbS5tYXhMZW5ndGgpIHtcbiAgICAgIGNvbnN0IG5leHQgPSBpbnB1dC52YWx1ZS5zbGljZSgwLCBmb3JtSXRlbS5tYXhMZW5ndGgpO1xuICAgICAgaW5wdXQudmFsdWUgPSBuZXh0O1xuICAgICAgY29uc3QgY29udHJvbCA9IGxpbmUuZ2V0KGZvcm1JdGVtLm5hbWUpO1xuICAgICAgaWYgKGNvbnRyb2wpIHtcbiAgICAgICAgY29udHJvbC5zZXRWYWx1ZShuZXh0KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiog6I635Y+W5b2T5YmN5Yu+6YCJ5LiU5bey5oyC6L2955qE6KGMIEZvcm1Hcm91cO+8iOW9k+WJjeetm+mAiee7k+aenOWGhe+8iSAqL1xuICBwdWJsaWMgZ2V0U2VsZWN0ZWRMaW5lcygpOiBGb3JtR3JvdXBbXSB7XG4gICAgcmV0dXJuICh0aGlzLmxpbmVzRm9ybUFycmF5LmNvbnRyb2xzIGFzIEZvcm1Hcm91cFtdKS5maWx0ZXIoKGxpbmUpID0+XG4gICAgICB0aGlzLmlzTGluZUNoZWNrZWQobGluZSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5blhajpg6jli77pgInooYzmlbDmja7vvIjlkKvot6jpobXjgIHmkJzntKLlkI7mnKrlsZXnpLrkvYbku43li77pgInnmoTooYzvvIlcbiAgICovXG4gIHB1YmxpYyBnZXRTZWxlY3RlZExpbmVzRGF0YSgpOiBhbnlbXSB7XG4gICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgY29uc3QgbW91bnRlZEJ5SWQgPSBuZXcgTWFwPHN0cmluZywgYW55PigpO1xuICAgICh0aGlzLmxpbmVzRm9ybUFycmF5LmNvbnRyb2xzIGFzIEZvcm1Hcm91cFtdKS5mb3JFYWNoKChsaW5lKSA9PiB7XG4gICAgICBjb25zdCBpZCA9IHRoaXMuZ2V0Um93SWQobGluZSk7XG4gICAgICBpZiAoaWQgJiYgdGhpcy5zZWxlY3RlZFJvd0lkcy5oYXMoaWQpKSB7XG4gICAgICAgIG1vdW50ZWRCeUlkLnNldChpZCwgbGluZS5nZXRSYXdWYWx1ZSgpKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgICh0aGlzLnN0b3JlRm9ybUxpbmVzRGF0YSB8fCBbXSkuZm9yRWFjaCgoZGF0YSkgPT4ge1xuICAgICAgY29uc3QgaWQgPSBkYXRhICYmIGRhdGEuX2hkUm93SWQ7XG4gICAgICBpZiAoaWQgJiYgdGhpcy5zZWxlY3RlZFJvd0lkcy5oYXMoaWQpKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKG1vdW50ZWRCeUlkLmhhcyhpZCkgPyBtb3VudGVkQnlJZC5nZXQoaWQpIDogeyAuLi5kYXRhIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8g5YWc5bqV77ya5Yia5paw5aKe44CB5bCa5pyq6L+bIHN0b3JlIOeahOWLvumAieihjFxuICAgIHRoaXMuc2VsZWN0ZWRSb3dJZHMuZm9yRWFjaCgoaWQpID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgIXJlc3VsdC5zb21lKChpdGVtKSA9PiBpdGVtICYmIGl0ZW0uX2hkUm93SWQgPT09IGlkKSAmJlxuICAgICAgICBtb3VudGVkQnlJZC5oYXMoaWQpXG4gICAgICApIHtcbiAgICAgICAgcmVzdWx0LnB1c2gobW91bnRlZEJ5SWQuZ2V0KGlkKSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiDmibnph4/loavlhYXli77pgInooYzlrZfmrrXvvIjmlK/mjIHot6jpobXjgIHmkJzntKLlkI7mnKrlsZXnpLrkvYbku43li77pgInnmoTooYzvvIlcbiAgICogQHBhcmFtIHZhbHVlcyDopoHlhpnlhaXnmoTlrZfmrrXvvIzlpoIgeyByZW1hcms6ICfmibnph4/lpIfms6gnLCBwcmljZTogMTAgfVxuICAgKiBAcGFyYW0gZW1pdEV2ZW50IOaYr+WQpuinpuWPkSB2YWx1ZUNoYW5nZXMgLyBvbkNoYW5nZUV2ZW5077yM6buY6K6kIHRydWVcbiAgICogQHJldHVybnMg5a6e6ZmF5aGr5YWF55qE6KGM5pWwXG4gICAqL1xuICBwdWJsaWMgYmF0Y2hGaWxsU2VsZWN0ZWQoXG4gICAgdmFsdWVzOiB7IFtmaWVsZDogc3RyaW5nXTogYW55IH0sXG4gICAgZW1pdEV2ZW50OiBib29sZWFuID0gdHJ1ZSxcbiAgKTogbnVtYmVyIHtcbiAgICBpZiAoIXZhbHVlcyB8fCB0aGlzLnNlbGVjdGVkUm93SWRzLnNpemUgPT09IDApIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICBjb25zdCBtb3VudGVkQnlJZCA9IG5ldyBNYXA8c3RyaW5nLCBGb3JtR3JvdXA+KCk7XG4gICAgKHRoaXMubGluZXNGb3JtQXJyYXkuY29udHJvbHMgYXMgRm9ybUdyb3VwW10pLmZvckVhY2goKGxpbmUpID0+IHtcbiAgICAgIGNvbnN0IGlkID0gdGhpcy5nZXRSb3dJZChsaW5lKTtcbiAgICAgIGlmIChpZCkge1xuICAgICAgICBtb3VudGVkQnlJZC5zZXQoaWQsIGxpbmUpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgbGV0IGNvdW50ID0gMDtcbiAgICB0aGlzLnNlbGVjdGVkUm93SWRzLmZvckVhY2goKGlkKSA9PiB7XG4gICAgICBjb25zdCBsaW5lID0gbW91bnRlZEJ5SWQuZ2V0KGlkKTtcbiAgICAgIGlmIChsaW5lKSB7XG4gICAgICAgIHRoaXMuYXBwbHlWYWx1ZXNUb0xpbmUobGluZSwgdmFsdWVzLCBlbWl0RXZlbnQpO1xuICAgICAgICBjb3VudCsrO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyDlvZPliY3nrZvpgIkv6aG16Z2i5pyq5oyC6L2977ya55u05o6l5pS55oC75pWw5o2u77yM6YCA5Ye65pCc57Si5ZCO5Y+v6KeBXG4gICAgICBjb25zdCBzdG9yZUl0ZW0gPSAodGhpcy5zdG9yZUZvcm1MaW5lc0RhdGEgfHwgW10pLmZpbmQoXG4gICAgICAgIChkYXRhKSA9PiBkYXRhICYmIGRhdGEuX2hkUm93SWQgPT09IGlkLFxuICAgICAgKTtcbiAgICAgIGlmIChzdG9yZUl0ZW0pIHtcbiAgICAgICAgT2JqZWN0LmtleXModmFsdWVzKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICBzdG9yZUl0ZW1ba2V5XSA9IHZhbHVlc1trZXldO1xuICAgICAgICB9KTtcbiAgICAgICAgY291bnQrKztcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gY291bnQ7XG4gIH1cblxuICAvKiog5riF56m65Yu+6YCJICovXG4gIHB1YmxpYyBjbGVhclNlbGVjdGlvbigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZFJvd0lkcy5zaXplID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc2VsZWN0ZWRSb3dJZHMuY2xlYXIoKTtcbiAgICB0aGlzLmVtaXRTZWxlY3Rpb25DaGFuZ2UoKTtcbiAgfVxuXG4gIC8qKiDlvZPliY3li77pgInmlbDph4/vvIjlkKvot6jpobXjgIHmkJzntKLkv53nlZnvvIkgKi9cbiAgcHVibGljIGdldFNlbGVjdGVkQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZFJvd0lkcy5zaXplO1xuICB9XG5cbiAgLyoqIOaYr+WQpuWxleekuumhtumDqOW3peWFt+agjyAqL1xuICBnZXQgc2hvd1Rvb2xiYXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgICEhdGhpcy5zaG93U2VhcmNoIHx8XG4gICAgICAhIXRoaXMuc2hvd0NoZWNrYm94IHx8XG4gICAgICAhIXRoaXMuZm9ybUxpbmVzTGVmdEJ1dHRvbiB8fFxuICAgICAgISF0aGlzLmZvcm1MaW5lc1JpZ2h0QnV0dG9uIHx8XG4gICAgICB0aGlzLnNob3dDb2xTZXR0aW5nc0J1dHRvblxuICAgICk7XG4gIH1cblxuICAvKiog5piv5ZCm5bGV56S65YiX6K6+572u6b2/6L2u77yI5pyJ5Y+v6YWN572uIFZpZXdEb20g5pe277yJICovXG4gIGdldCBzaG93Q29sU2V0dGluZ3NCdXR0b24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgICEhdGhpcy5zaG93Q29sU2V0dGluZ3MgJiYgdGhpcy5nZXRDb25maWd1cmFibGVGb3JtTGluZXMoKS5sZW5ndGggPiAwXG4gICAgKTtcbiAgfVxuXG4gIC8qKiDliJfmmK/lkKbmuLLmn5PvvJpoaWRlIOawuOS4jeWxleekuu+8m1ZpZXdEb20g5Y+XIGlzU2hvdyDmjqfliLYgKi9cbiAgaXNDb2x1bW5WaXNpYmxlKGl0ZW06IEZvcm1MaW5lKTogYm9vbGVhbiB7XG4gICAgaWYgKCFpdGVtIHx8IGl0ZW0uaGlkZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoaXRlbS50eXBlID09PSBGb3JtTGluZVR5cGUuVmlld0RvbSkge1xuICAgICAgcmV0dXJuIGl0ZW0uaXNTaG93ICE9PSBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKiog5Y+v6L+b5YWl5YiX6K6+572u55qE5a2X5q6177ya6Z2eIGhpZGUg55qEIFZpZXdEb20gKi9cbiAgZ2V0Q29uZmlndXJhYmxlRm9ybUxpbmVzKCk6IEZvcm1MaW5lW10ge1xuICAgIGlmICghdGhpcy5mb3JtTGluZXMgfHwgIXRoaXMuZm9ybUxpbmVzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5mb3JtTGluZXMuZmlsdGVyKFxuICAgICAgKGl0ZW0pID0+IGl0ZW0udHlwZSA9PT0gRm9ybUxpbmVUeXBlLlZpZXdEb20gJiYgIWl0ZW0uaGlkZSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDYWNoZUtleSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHVzZXJDb2RlID1cbiAgICAgICh0aGlzLnVzZXJTZXNzaW9uICYmIHRoaXMudXNlclNlc3Npb24udXNlckNvZGUpIHx8IFwiZGV2XCI7XG4gICAgcmV0dXJuIChcbiAgICAgIFwiaGQtZm9ybS1saW5lc19cIiArXG4gICAgICB1c2VyQ29kZSArXG4gICAgICBcIl9cIiArXG4gICAgICB0aGlzLmxvY2FsdGlvblRtcCArXG4gICAgICBcIl9cIiArXG4gICAgICB0aGlzLnV1aWRcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0Q29sU2V0dGluZ3MoKTogdm9pZCB7XG4gICAgdGhpcy5jb2xzQ2FjaGVMb2FkZWQgPSBmYWxzZTtcbiAgICBpZiAoIXRoaXMuc2hvd0NvbFNldHRpbmdzIHx8ICF0aGlzLmZvcm1MaW5lcyB8fCAhdGhpcy5mb3JtTGluZXMubGVuZ3RoKSB7XG4gICAgICB0aGlzLnNldENvbHMoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnV1aWQpIHtcbiAgICAgIHRoaXMuc2V0Q29scygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmxvY2FsZm9yYWdlXG4gICAgICAucmVhZHkoKVxuICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICB0aGlzLmxvY2FsZm9yYWdlXG4gICAgICAgICAgLmdldEl0ZW0odGhpcy5nZXRDYWNoZUtleSgpKVxuICAgICAgICAgIC50aGVuKCh2YWx1ZTogRm9ybUxpbmVzQ2FjaGVPcHRpb24pID0+IHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSAmJiBBcnJheS5pc0FycmF5KHZhbHVlLmNvbHMpKSB7XG4gICAgICAgICAgICAgIHRoaXMuZm9ybUxpbmVzQ2FjaGVPcHRpb24gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgdGhpcy5jb2xzQ2FjaGVMb2FkZWQgPSB0cnVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5mb3JtTGluZXNDYWNoZU9wdGlvbiA9IG5ldyBGb3JtTGluZXNDYWNoZU9wdGlvbigpO1xuICAgICAgICAgICAgICB0aGlzLmNvbHNDYWNoZUxvYWRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zZXRDb2xzKCk7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5mb3JtTGluZXNDYWNoZU9wdGlvbiA9IG5ldyBGb3JtTGluZXNDYWNoZU9wdGlvbigpO1xuICAgICAgICAgICAgdGhpcy5jb2xzQ2FjaGVMb2FkZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuc2V0Q29scygpO1xuICAgICAgICAgIH0pO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoZSkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZyhcImxvY2FsZm9yYWdl5Yqg6L295byC5bi4XCIsIGUpO1xuICAgICAgICB0aGlzLmZvcm1MaW5lc0NhY2hlT3B0aW9uID0gbmV3IEZvcm1MaW5lc0NhY2hlT3B0aW9uKCk7XG4gICAgICAgIHRoaXMuY29sc0NhY2hlTG9hZGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc2V0Q29scygpO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGhhc0NvbHNDYWNoZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jb2xzQ2FjaGVMb2FkZWQgJiYgQXJyYXkuaXNBcnJheSh0aGlzLmZvcm1MaW5lc0NhY2hlT3B0aW9uLmNvbHMpO1xuICB9XG5cbiAgcHJpdmF0ZSBzYXZlRm9ybUxpbmVzQ2FjaGVPcHRpb24oKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnV1aWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5sb2NhbGZvcmFnZS5zZXRJdGVtKHRoaXMuZ2V0Q2FjaGVLZXkoKSwgdGhpcy5mb3JtTGluZXNDYWNoZU9wdGlvbik7XG4gIH1cblxuICAvKiog5oyJIGZvcm1MaW5lcyDljp/lp4vpobrluo/mjpLliJfoioLngrnvvIjnpoHmraLosIPluo/ml7bkv53mjIHmupDpobrluo/vvIkgKi9cbiAgcHJpdmF0ZSBzb3J0Tm9kZXNCeUZvcm1MaW5lc09yZGVyKG5vZGVzOiBUcmVlR3JpZFtdKTogVHJlZUdyaWRbXSB7XG4gICAgY29uc3Qgb3JkZXIgPSB0aGlzLmdldENvbmZpZ3VyYWJsZUZvcm1MaW5lcygpLm1hcCgoZikgPT4gZi5uYW1lKTtcbiAgICByZXR1cm4gbm9kZXMuc2xpY2UoKS5zb3J0KChhLCBiKSA9PiB7XG4gICAgICByZXR1cm4gb3JkZXIuaW5kZXhPZihhLmtleSkgLSBvcmRlci5pbmRleE9mKGIua2V5KTtcbiAgICB9KTtcbiAgfVxuXG4gIHNldENvbHMoKTogdm9pZCB7XG4gICAgdGhpcy5zaG93TGlzdE5vZGVzID0gZmFsc2U7XG4gICAgdGhpcy5ub3dMaXN0Tm9kZXMgPSBbXTtcbiAgICB0aGlzLmhpZGVMaXN0Tm9kZXMgPSBbXTtcbiAgICBjb25zdCBjb25maWd1cmFibGUgPSB0aGlzLmdldENvbmZpZ3VyYWJsZUZvcm1MaW5lcygpO1xuICAgIGNvbnN0IGhhc0NhY2hlID0gdGhpcy5oYXNDb2xzQ2FjaGUoKTtcbiAgICBjb25maWd1cmFibGUuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgaWYgKGhhc0NhY2hlKSB7XG4gICAgICAgIGVsZW1lbnQuaXNTaG93ID0gdGhpcy5mb3JtTGluZXNDYWNoZU9wdGlvbi5jb2xzLmluY2x1ZGVzKGVsZW1lbnQubmFtZSk7XG4gICAgICB9IGVsc2UgaWYgKGVsZW1lbnQuaXNTaG93ID09PSB1bmRlZmluZWQgfHwgZWxlbWVudC5pc1Nob3cgPT09IG51bGwpIHtcbiAgICAgICAgZWxlbWVudC5pc1Nob3cgPSB0cnVlO1xuICAgICAgfVxuICAgICAgY29uc3Qgbm9kZTogVHJlZUdyaWQgPSB7XG4gICAgICAgIHRpdGxlOiBlbGVtZW50LmxhYmVsLFxuICAgICAgICBrZXk6IGVsZW1lbnQubmFtZSxcbiAgICAgICAgY2hlY2tlZDogZWxlbWVudC5pc1Nob3cgIT09IGZhbHNlLFxuICAgICAgICBkaXNhYmxlZDogZmFsc2UsXG4gICAgICB9O1xuICAgICAgaWYgKGVsZW1lbnQuaXNTaG93ICE9PSBmYWxzZSkge1xuICAgICAgICB0aGlzLm5vd0xpc3ROb2Rlcy5wdXNoKG5vZGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5oaWRlTGlzdE5vZGVzLnB1c2gobm9kZSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5ub3dMaXN0Tm9kZXMgPSB0aGlzLnNvcnROb2Rlc0J5Rm9ybUxpbmVzT3JkZXIodGhpcy5ub3dMaXN0Tm9kZXMpO1xuICAgIHRoaXMuaGlkZUxpc3ROb2RlcyA9IHRoaXMuc29ydE5vZGVzQnlGb3JtTGluZXNPcmRlcih0aGlzLmhpZGVMaXN0Tm9kZXMpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5zaG93TGlzdE5vZGVzID0gdHJ1ZTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH0sIDApO1xuICB9XG5cbiAgY2FuY2VsRHJvcGRvd24oKTogdm9pZCB7XG4gICAgdGhpcy5pc0Ryb3Bkb3duVmlzaWJsZSA9IGZhbHNlO1xuICAgIHRoaXMuaGlkZUxpc3ROb2RlcyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5jYW5jZWxIaWRlTGlzdE5vZGVzKSk7XG4gICAgdGhpcy5ub3dMaXN0Tm9kZXMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuY2FuY2VsTm93TGlzdE5vZGVzKSk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBjb25maXJtRHJvcGRvd24oKTogdm9pZCB7XG4gICAgdGhpcy5jYW5jZWxIaWRlTGlzdE5vZGVzID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLmhpZGVMaXN0Tm9kZXMpKTtcbiAgICB0aGlzLmNhbmNlbE5vd0xpc3ROb2RlcyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5ub3dMaXN0Tm9kZXMpKTtcbiAgICB0aGlzLmlzRHJvcGRvd25WaXNpYmxlID0gdHJ1ZTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHN1Ym1pdEdyaWRzKCk6IHZvaWQge1xuICAgIGNvbnN0IHZpc2libGVOYW1lcyA9IHRoaXMubm93TGlzdE5vZGVzLm1hcCgoaXRlbSkgPT4gaXRlbS5rZXkpO1xuICAgIHRoaXMuZ2V0Q29uZmlndXJhYmxlRm9ybUxpbmVzKCkuZm9yRWFjaCgobGluZSkgPT4ge1xuICAgICAgbGluZS5pc1Nob3cgPSB2aXNpYmxlTmFtZXMuaW5jbHVkZXMobGluZS5uYW1lKTtcbiAgICB9KTtcbiAgICB0aGlzLmZvcm1MaW5lc0NhY2hlT3B0aW9uLmNvbHMgPSB2aXNpYmxlTmFtZXM7XG4gICAgdGhpcy5jb2xzQ2FjaGVMb2FkZWQgPSB0cnVlO1xuICAgIHRoaXMuc2F2ZUZvcm1MaW5lc0NhY2hlT3B0aW9uKCk7XG4gICAgdGhpcy5pc0Ryb3Bkb3duVmlzaWJsZSA9IGZhbHNlO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLyoqIOWLvumAiS/lj5bmtojvvJrku4XlnKjmmL7npLov6ZqQ6JeP5Lik57uE6Ze056e75Yqo77yM5LiN5pS55Y+YIGZvcm1MaW5lcyDpobrluo8gKi9cbiAgY2hlY2tBY3Rpb24oZXZlbnQ6IE56Rm9ybWF0RW1pdEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKGV2ZW50Lm5vZGUub3JpZ2luLmNoZWNrZWQpIHtcbiAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLmhpZGVMaXN0Tm9kZXMuZmluZCgoaXRlbSkgPT4ge1xuICAgICAgICByZXR1cm4gaXRlbS5rZXkgPT09IGV2ZW50Lm5vZGUub3JpZ2luLmtleTtcbiAgICAgIH0pO1xuICAgICAgaWYgKCFub2RlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIG5vZGUuY2hlY2tlZCA9IHRydWU7XG4gICAgICB0aGlzLmhpZGVMaXN0Tm9kZXMgPSB0aGlzLmhpZGVMaXN0Tm9kZXMuZmlsdGVyKChpdGVtKSA9PiB7XG4gICAgICAgIHJldHVybiBpdGVtLmtleSAhPT0gZXZlbnQubm9kZS5vcmlnaW4ua2V5O1xuICAgICAgfSk7XG4gICAgICB0aGlzLm5vd0xpc3ROb2RlcyA9IHRoaXMuc29ydE5vZGVzQnlGb3JtTGluZXNPcmRlcihcbiAgICAgICAgdGhpcy5ub3dMaXN0Tm9kZXMuY29uY2F0KFtub2RlXSksXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB0ZW1wb3JhcnlOb2RlTGlzdCA9IHRoaXMuaGlkZUxpc3ROb2Rlcy5zbGljZSgwKTtcbiAgICAgIHRoaXMubm93TGlzdE5vZGVzLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgaWYgKGl0ZW0ua2V5ID09PSBldmVudC5ub2RlLm9yaWdpbi5rZXkpIHtcbiAgICAgICAgICBjb25zdCBpbm5lckl0ZW0gPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGl0ZW0pKTtcbiAgICAgICAgICBpbm5lckl0ZW0uY2hlY2tlZCA9IGZhbHNlO1xuICAgICAgICAgIHRlbXBvcmFyeU5vZGVMaXN0LnB1c2goaW5uZXJJdGVtKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLmhpZGVMaXN0Tm9kZXMgPSB0aGlzLnNvcnROb2Rlc0J5Rm9ybUxpbmVzT3JkZXIodGVtcG9yYXJ5Tm9kZUxpc3QpO1xuICAgICAgdGhpcy5ub3dMaXN0Tm9kZXMgPSB0aGlzLm5vd0xpc3ROb2Rlcy5maWx0ZXIoKGl0ZW0pID0+IHtcbiAgICAgICAgcmV0dXJuIGl0ZW0ua2V5ICE9PSBldmVudC5ub2RlLm9yaWdpbi5rZXk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBzZXRBY3RpdmVTZWxlY3RlZENvbXBvbmVudE9wZW4odmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmFjdGl2ZVNlbGVjdGVkQ29tcG9uZW50T3BlbiA9IHZhbHVlO1xuICAgIGlmICh2YWx1ZSA9PT0gdHJ1ZSkge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGRvbUxpc3QgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFxuICAgICAgICAgIFwiLmFudC1zZWxlY3QtZHJvcGRvd24uaGQtc2VsZWN0LXRhYmxlXCIsXG4gICAgICAgICk7XG4gICAgICAgIGlmIChkb21MaXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCBkb20gPSBkb21MaXN0WzBdO1xuICAgICAgICAgIGRvbVxuICAgICAgICAgICAgLnF1ZXJ5U2VsZWN0b3JBbGwoXCIuaGQtb3B0aW9uLWhlYWRlclwiKVxuICAgICAgICAgICAgLmZvckVhY2goKGhlYWRlcikgPT4gaGVhZGVyLnJlbW92ZSgpKTtcbiAgICAgICAgICBjb25zdCBvbGRJbmRleCA9IHRoaXMuZ2V0T2xkRG9tSW5kZXgodGhpcy5hY3RpdmVEb21ZLCB0aGlzLmZvcm1MaW5lcyk7XG4gICAgICAgICAgZG9tLmluc2VydEJlZm9yZShcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlRE9NU3RydWN0dXJlKFxuICAgICAgICAgICAgICB0aGlzLmZvcm1MaW5lc1tvbGRJbmRleF0sXG4gICAgICAgICAgICAgIHRoaXMubGluZXNGb3JtQXJyYXkuY29udHJvbHMuc2xpY2UoXG4gICAgICAgICAgICAgICAgKHRoaXMucGFnaW5hdGlvblBhZ2VJbmRleCAtIDEpICogdGhpcy5wYWdpbmF0aW9uUGFnZVNpemUsXG4gICAgICAgICAgICAgICAgKHRoaXMucGFnaW5hdGlvblBhZ2VJbmRleCAtIDEpICogdGhpcy5wYWdpbmF0aW9uUGFnZVNpemUgK1xuICAgICAgICAgICAgICAgICAgdGhpcy5wYWdpbmF0aW9uUGFnZVNpemUsXG4gICAgICAgICAgICAgIClbdGhpcy5hY3RpdmVEb21YXSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBkb20uZmlyc3RDaGlsZCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9LCAwKTtcbiAgICB9XG4gIH1cblxuICBnZXRTZWxlY3RUYWJsZUNvbHVtblN0eWxlKGNvbHVtbjogU2VsZWN0T3B0aW9uVGFibGVDb2x1bW4pOiB7XG4gICAgW2tleTogc3RyaW5nXTogc3RyaW5nO1xuICB9IHtcbiAgICBpZiAoIWNvbHVtbiB8fCAhY29sdW1uLndpZHRoKSB7XG4gICAgICByZXR1cm4geyB3aWR0aDogXCJ1bnNldFwiIH07XG4gICAgfVxuICAgIHJldHVybiB7IHdpZHRoOiBgJHtjb2x1bW4ud2lkdGh9cHhgIH07XG4gIH1cblxuICBjcmVhdGVET01TdHJ1Y3R1cmUoZm9ybUl0ZW0sIGxpbmUpIHtcbiAgICAvLyDliJvlu7rlpJbpg6ggZGl2XG4gICAgY29uc3QgaGRPcHRpb25IZWFkZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIGhkT3B0aW9uSGVhZGVyLmNsYXNzTmFtZSA9IFwiaGQtb3B0aW9uLWhlYWRlclwiO1xuICAgIGhkT3B0aW9uSGVhZGVyLnN0eWxlLnBhZGRpbmdMZWZ0ID0gYCR7U0VMRUNUX1RBQkxFX09QVElPTl9IT1JJWk9OVEFMX1BBRERJTkd9cHhgO1xuICAgIGhkT3B0aW9uSGVhZGVyLnN0eWxlLnBhZGRpbmdSaWdodCA9IGAke1NFTEVDVF9UQUJMRV9PUFRJT05fSE9SSVpPTlRBTF9QQURESU5HfXB4YDtcblxuICAgIC8vIOajgOafpeadoeS7tu+8jOehruWumuaYr+WQpuimgeWIm+W7uuWtkOWFg+e0oFxuICAgIC8vIGNvbnN0IHNlbGVjdExpc3RMZW5ndGggPSAoZm9ybUl0ZW0gJiYgZm9ybUl0ZW0uc2VsZWN0T3B0aW9uICYmIGZvcm1JdGVtLnNlbGVjdE9wdGlvbi5zZWxlY3RMaXN0ICYmIGZvcm1JdGVtLnNlbGVjdE9wdGlvbi5zZWxlY3RMaXN0Lmxlbmd0aCkgfHwgMDtcbiAgICAvLyBpZlxuICAgIC8vIGNvbnN0IGxpbmVWYWx1ZUxlbmd0aCA9IChsaW5lLmdldChmb3JtSXRlbS5zZWxlY3RPcHRpb24uc2VsZWN0TGlzdE5hbWUpICYmIGxpbmUuZ2V0KGZvcm1JdGVtLnNlbGVjdE9wdGlvbi5zZWxlY3RMaXN0TmFtZSkudmFsdWUgJiYgbGluZS5nZXQoZm9ybUl0ZW0uc2VsZWN0T3B0aW9uLnNlbGVjdExpc3ROYW1lKS52YWx1ZS5sZW5ndGgpIHx8IDA7XG5cbiAgICAvLyBpZiAoc2VsZWN0TGlzdExlbmd0aCA+IDAgfHwgbGluZVZhbHVlTGVuZ3RoID4gMCkge1xuICAgIC8vIOmBjeWOhiB0YWJsZUNvbHVtbnMg5Yib5bu65YaF6YOo5YiXIGRpdlxuICAgIGZvcm1JdGVtLnNlbGVjdE9wdGlvbi50YWJsZUNvbHVtbnMuZm9yRWFjaCgoc2VsZWN0T3B0aW9uVGFibGVDb2x1bW4pID0+IHtcbiAgICAgIGNvbnN0IGNvbHVtbkRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICBjb2x1bW5EaXYuY2xhc3NOYW1lID0gXCJoZC1vcHRpb24taGVhZGVyLWNvbHVtblwiO1xuXG4gICAgICBjb25zdCB3aWR0aFN0eWxlID0gdGhpcy5nZXRTZWxlY3RUYWJsZUNvbHVtblN0eWxlKFxuICAgICAgICBzZWxlY3RPcHRpb25UYWJsZUNvbHVtbixcbiAgICAgICk7XG4gICAgICBjb2x1bW5EaXYuc3R5bGUud2lkdGggPSB3aWR0aFN0eWxlLndpZHRoO1xuXG4gICAgICAvLyDmt7vliqDliJfmoIfnrb7lhoXlrrlcbiAgICAgIGlmIChzZWxlY3RPcHRpb25UYWJsZUNvbHVtbi5sYWJlbCkge1xuICAgICAgICBjb25zdCBsYWJlbFRleHQgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShcbiAgICAgICAgICBzZWxlY3RPcHRpb25UYWJsZUNvbHVtbi5sYWJlbCxcbiAgICAgICAgKTtcbiAgICAgICAgY29sdW1uRGl2LmFwcGVuZENoaWxkKGxhYmVsVGV4dCk7XG4gICAgICB9XG5cbiAgICAgIC8vIOa3u+WKoOWIlyBkaXYg5Yiw5aSW6YOoIGRpdlxuICAgICAgaGRPcHRpb25IZWFkZXIuYXBwZW5kQ2hpbGQoY29sdW1uRGl2KTtcbiAgICB9KTtcbiAgICAvLyB9XG5cbiAgICByZXR1cm4gaGRPcHRpb25IZWFkZXI7XG4gIH1cblxuICBjb2xsZWN0RG9tRGF0YSgpIHtcbiAgICB0aGlzLmNvbGxlY3REb21MaXN0ID0gW107XG4gICAgY29uc3QgcGFnZURvbUxpc3QgPSB0aGlzLmZvcm1JbnB1dERvbUxpc3QudG9BcnJheSgpO1xuICAgIC8vIFN0ZXAgMTog6I635Y+W5b2T5YmN6aG155qE5pWw5o2u6YePXG4gICAgY29uc3Qgc3RhcnRJbmRleCA9ICh0aGlzLnBhZ2luYXRpb25QYWdlSW5kZXggLSAxKSAqIHRoaXMucGFnaW5hdGlvblBhZ2VTaXplO1xuICAgIGNvbnN0IGVuZEluZGV4ID0gdGhpcy5wYWdpbmF0aW9uUGFnZUluZGV4ICogdGhpcy5wYWdpbmF0aW9uUGFnZVNpemU7XG4gICAgY29uc3QgYWRqdXN0ZWRFbmRJbmRleCA9XG4gICAgICBlbmRJbmRleCA+IHRoaXMuZm9ybUxpbmVzTGVuZ3RoID8gdGhpcy5mb3JtTGluZXNMZW5ndGggOiBlbmRJbmRleDtcbiAgICBjb25zdCBwYWdlTGluZXNMZW5ndGggPSBhZGp1c3RlZEVuZEluZGV4IC0gc3RhcnRJbmRleDtcblxuICAgIGNvbnN0IGludGVydmFsID0gcGFnZURvbUxpc3QubGVuZ3RoIC8gcGFnZUxpbmVzTGVuZ3RoO1xuICAgIC8vIFN0ZXAgMjog5ouG5YiGZm9ybUlucHV0RG9tTGlzdFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFnZUxpbmVzTGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuY29sbGVjdERvbUxpc3QucHVzaChwYWdlRG9tTGlzdC5zcGxpY2UoMCwgaW50ZXJ2YWwpKTtcbiAgICB9XG4gICAgdGhpcy5kaXNhYmxlSW5wdXROdW1iZXJLZXlib2FyZFN0ZXAoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBuZy16b3JybyA4IOWcqCBpbnB1dCDnmoQgb25LZXlEb3duIOmHjOeUqOS4iuS4i+mUruiwgyB1cCgpL2Rvd24oKSDmlLkgc3RlcOOAglxuICAgKiDlj6ropobnm5Ygb25LZXlEb3du77yI5LiN5YqoIHVwL2Rvd27vvInvvIzplK7nm5jmlrnlkJHplK7kuqTnu5nooajljZXot7PovazvvIwrLy0g5oyJ6ZKu5LuN5Y+v55So44CCXG4gICAqL1xuICBwcml2YXRlIGRpc2FibGVJbnB1dE51bWJlcktleWJvYXJkU3RlcCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZW5hYmxlS2V5Ym9hcmRPcGVyYXRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jb2xsZWN0RG9tTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB0aGlzLmNvbGxlY3REb21MaXN0W2ldLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIGNvbnN0IGRvbSA9IHRoaXMuY29sbGVjdERvbUxpc3RbaV1bal07XG4gICAgICAgIGlmIChkb20gaW5zdGFuY2VvZiBOeklucHV0TnVtYmVyQ29tcG9uZW50KSB7XG4gICAgICAgICAgZG9tLm9uS2V5RG93biA9IChlOiBLZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAoZS5rZXlDb2RlID09PSAzOCB8fCBlLmtleUNvZGUgPT09IDQwKSB7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlLmtleUNvZGUgPT09IDEzKSB7XG4gICAgICAgICAgICAgIGRvbS5zZXRWYWxpZGF0ZVZhbHVlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIOiBmueEpuS4i+S4gOS4qmRvbVxuICBqdW1wVG9OZXh0SW5wdXQoeDogbnVtYmVyLCB5OiBudW1iZXIpIHtcbiAgICBpZiAoXG4gICAgICB4ID09PSBudWxsIHx8XG4gICAgICB5ID09PSBudWxsIHx8XG4gICAgICAhdGhpcy5jb2xsZWN0RG9tTGlzdCB8fFxuICAgICAgdGhpcy5jb2xsZWN0RG9tTGlzdC5sZW5ndGggPT09IDBcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8g5aaC5p6c5piv5pyA5ZCO5LiA5Liq5Y+v6L6T5YWl5YWD57Sg77yM5paw5aKe6KGMXG4gICAgaWYgKFxuICAgICAgISh0aGlzLmFjdGl2ZURvbSBpbnN0YW5jZW9mIE56U2VsZWN0Q29tcG9uZW50KSAmJlxuICAgICAgeCA9PT0gdGhpcy5jb2xsZWN0RG9tTGlzdC5sZW5ndGggLSAxICYmXG4gICAgICB5ID09PSB0aGlzLmNvbGxlY3REb21MaXN0WzBdLmxlbmd0aCAtIDFcbiAgICApIHtcbiAgICAgIHRoaXMuYWRkTmV3TGluZUFuZEZvY3VzKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh5ID09PSB0aGlzLmNvbGxlY3REb21MaXN0WzBdLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgY29uc29sZS5sb2coXCLmiafooYzov4fnqIsxXCIpO1xuICAgICAgICAvLyDlpoLmnpzmmK/mnIDlkI7kuIDliJfvvIzliJnot7PovazliLDkuIvkuIDooYznrKzkuIDkuKrovpPlhaXmoYZcbiAgICAgICAgdGhpcy5mb2N1c0RvbSh4ICsgMSwgMCwgXCJyaWdodFwiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwi5omn6KGM6L+H56iLMlwiKTtcbiAgICAgICAgLy8g5aaC5p6c5LiN5piv5pyA5ZCO5LiA5YiX77yM5YiZ6Lez6L2s5Yiw5b2T5YmN6KGM5LiL5LiA5Liq6L6T5YWl5qGGXG4gICAgICAgIHRoaXMuZm9jdXNEb20oeCwgeSArIDEsIFwicmlnaHRcIik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOWinuWKoOaWsOihjOW5tuS4lOiBmueEpuWIsOesrOS4gOS4quWFg+e0oO+8jFxuICAgKiDov5nph4zopoHms6jmhI/vvIzlpoLmnpzlrZjlnKjnv7vpobXmg4XlhrXvvIzpnIDopoHlpITnkIZcbiAgICovXG4gIGFkZE5ld0xpbmVBbmRGb2N1cygpIHtcbiAgICAvLyDlvZPliY3ooYzkuLrlvZPliY3pobXmnIDlkI7kuIDooYznmoTml7blgJnvvIzliKTmlq3kuIvkuIDpobXmmK/lkKbmnInmlbDmja5cbiAgICAvLyAx44CB5aaC5p6c5pyJ77ya57+76aG1K+iBmueEpuesrOS4gOihjOesrOS4gOS4quWFg+e0oFxuICAgIC8vIDLjgIHlpoLmnpzmsqHmnInvvJrmlrDlop7ooYwr57+76aG1K+iBmueEpuesrOS4gOihjOesrOS4gOS4quWFg+e0oFxuICAgIGlmICh0aGlzLmFjdGl2ZURvbVggPT09IHRoaXMucGFnaW5hdGlvblBhZ2VTaXplIC0gMSkge1xuICAgICAgLy8g5Yik5pat5LiL5LiA6aG15piv5ZCm5pyJ5pWw5o2uXG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMucGFnaW5hdGlvblBhZ2VJbmRleCA8XG4gICAgICAgIE1hdGguY2VpbCh0aGlzLmZvcm1MaW5lc0xlbmd0aCAvIHRoaXMucGFnaW5hdGlvblBhZ2VTaXplKVxuICAgICAgKSB7XG4gICAgICAgIC8vIOe/u+mhtSvogZrnhKbnrKzkuIDooYznrKzkuIDkuKrlhYPntKBcbiAgICAgICAgdGhpcy5wYWdpbmF0aW9uUGFnZUluZGV4Kys7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuY29sbGVjdERvbURhdGEoKTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIuaJp+ihjOi/h+eoizNcIik7XG4gICAgICAgICAgdGhpcy5mb2N1c0RvbSgwLCAwLCBcInJpZ2h0XCIpO1xuICAgICAgICB9LCAwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIOaWsOWinuihjCvnv7vpobUr6IGa54Sm56ys5LiA6KGM56ys5LiA5Liq5YWD57SgXG4gICAgICAgIHRoaXMuYWRkRm9ybUxpbmUoKTtcbiAgICAgICAgdGhpcy5wYWdpbmF0aW9uUGFnZUluZGV4Kys7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuY29sbGVjdERvbURhdGEoKTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIuaJp+ihjOi/h+eoizRcIik7XG4gICAgICAgICAgdGhpcy5mb2N1c0RvbSgwLCAwKTtcbiAgICAgICAgfSwgMCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYWRkRm9ybUxpbmUoKTtcbiAgICB9XG4gIH1cblxuICAvLyDogZrnhKbliLDkuIrkuIDkuKpkb21cbiAganVtcFRvUHJldklucHV0KHg6IG51bWJlciwgeTogbnVtYmVyKSB7XG4gICAgaWYgKFxuICAgICAgeCA9PT0gbnVsbCB8fFxuICAgICAgeSA9PT0gbnVsbCB8fFxuICAgICAgIXRoaXMuY29sbGVjdERvbUxpc3QgfHxcbiAgICAgIHRoaXMuY29sbGVjdERvbUxpc3QubGVuZ3RoID09PSAwXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh4ID09PSAwICYmIHkgPT09IDApIHtcbiAgICAgIC8vIOWmguaenOaYr+esrOS4gOS4quWPr+i+k+WFpeWFg+e0oO+8jCDliKTmlq3mmK/lkKbmnInkuIrkuIDpobXvvIwg5aaC5p6c5pyJ77yM5YiZ57+76aG1K+iBmueEpuWIsOS4iuS4gOmhteacgOWQjuS4gOS4quWFg+e0oFxuICAgICAgaWYgKHRoaXMucGFnaW5hdGlvblBhZ2VJbmRleCA+IDEpIHtcbiAgICAgICAgLy8g57+76aG1K+iBmueEpuWIsOS4iuS4gOmhteacgOWQjuS4gOS4quWFg+e0oFxuICAgICAgICB0aGlzLnBhZ2luYXRpb25QYWdlSW5kZXgtLTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5jb2xsZWN0RG9tRGF0YSgpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKFwi5omn6KGM6L+H56iLNVwiKTtcbiAgICAgICAgICB0aGlzLmZvY3VzRG9tKFxuICAgICAgICAgICAgdGhpcy5jb2xsZWN0RG9tTGlzdC5sZW5ndGggLSAxLFxuICAgICAgICAgICAgdGhpcy5jb2xsZWN0RG9tTGlzdFswXS5sZW5ndGggLSAxLFxuICAgICAgICAgICk7XG4gICAgICAgIH0sIDApO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoeSA9PT0gMCkge1xuICAgICAgICBjb25zb2xlLmxvZyhcIuaJp+ihjOi/h+eoizZcIik7XG4gICAgICAgIC8vIOWmguaenOaYr+esrOS4gOWIl++8jOWImei3s+i9rOWIsOS4iuS4gOihjOacgOWQjuS4gOS4qui+k+WFpeahhlxuICAgICAgICB0aGlzLmZvY3VzRG9tKHggLSAxLCB0aGlzLmNvbGxlY3REb21MaXN0WzBdLmxlbmd0aCAtIDEsIFwibGVmdFwiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwi5omn6KGM6L+H56iLN1wiKTtcbiAgICAgICAgLy8g5aaC5p6c5LiN5piv56ys5LiA5YiX77yM5YiZ6Lez6L2s5Yiw5b2T5YmN6KGM5LiK5LiA5Liq6L6T5YWl5qGGXG4gICAgICAgIHRoaXMuZm9jdXNEb20oeCwgeSAtIDEsIFwibGVmdFwiKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog6IGa54Sm5Yiw5p+Q5LiqZG9tXG4gICAqIEBwYXJhbSB4IOWdkOagh3hcbiAgICogQHBhcmFtIHkg5Z2Q5qCHeVxuICAgKiBAcGFyYW0ganVtcERpcmVjdGlvbiDot7PovazmlrnlkJFcbiAgICovXG4gIGZvY3VzRG9tKHg6IG51bWJlciwgeTogbnVtYmVyLCBqdW1wRGlyZWN0aW9uOiBzdHJpbmcgPSBcInJpZ2h0XCIpIHtcbiAgICBpZiAoXG4gICAgICB4ID09PSBudWxsIHx8XG4gICAgICB5ID09PSBudWxsIHx8XG4gICAgICAhdGhpcy5jb2xsZWN0RG9tTGlzdCB8fFxuICAgICAgdGhpcy5jb2xsZWN0RG9tTGlzdC5sZW5ndGggPT09IDBcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8g5YWI5riF6Zmk5LiA5LiL5b2T5YmN55qE54Sm54K5XG4gICAgdGhpcy5jbGVhbkZvY3VzRG9tKHRoaXMuYWN0aXZlRG9tWCwgdGhpcy5hY3RpdmVEb21ZKTtcbiAgICBpZiAodGhpcy5jb2xsZWN0RG9tTGlzdFt4XSAmJiB0aGlzLmNvbGxlY3REb21MaXN0W3hdW3ldKSB7XG4gICAgICBjb25zdCBkb20gPSB0aGlzLmNvbGxlY3REb21MaXN0W3hdW3ldO1xuICAgICAgLy8g6ZyA6KaB5Yik5pat5LiL5LiA5LiqZm9jdXPnmoRkb23mmK/lkKbmmK/npoHnlKjnirbmgIHvvIzlpoLmnpzmmK/npoHnlKjnirbmgIHpnIDopoHot7Pov4dcbiAgICAgIGlmIChkb20gaW5zdGFuY2VvZiBOelNlbGVjdENvbXBvbmVudCkge1xuICAgICAgICBpZiAoZG9tLm56RGlzYWJsZWQpIHtcbiAgICAgICAgICBpZiAoanVtcERpcmVjdGlvbiA9PT0gXCJyaWdodFwiKSB7XG4gICAgICAgICAgICB0aGlzLmp1bXBUb05leHRJbnB1dCh4LCB5KTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGp1bXBEaXJlY3Rpb24gPT09IFwibGVmdFwiKSB7XG4gICAgICAgICAgICB0aGlzLmp1bXBUb1ByZXZJbnB1dCh4LCB5KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGRvbS5uelNlbGVjdFRvcENvbnRyb2xDb21wb25lbnQuaW5wdXRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuc2Nyb2xsSW50b1ZpZXcoXG4gICAgICAgICAgeyBiZWhhdmlvcjogXCJzbW9vdGhcIiwgYmxvY2s6IFwiY2VudGVyXCIsIGlubGluZTogXCJjZW50ZXJcIiB9LFxuICAgICAgICApO1xuICAgICAgICAvLyDov5nph4zlpJrpgInmoYbpnIDopoHpop3lpJblpITnkIbkuIvvvIzlm6DkuLrlkJHkuIvnmoTml7blgJnkvJrop6blj5HlhoXpg6hJbnB1dOeahOiBmueEpu+8jOaKiuS4i+S4gOS4qmRvbeeahGZvY3Vz5pS+5Yiw5a6P5Lu75Yqh5Lit77yM5bu26L+f5aSE55CG44CCXG4gICAgICAgIGlmIChkb20ubnpTZWxlY3RTZXJ2aWNlLm1vZGUgPT09IFwibXVsdGlwbGVcIikge1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgZG9tLmZvY3VzKCk7XG4gICAgICAgICAgfSwgMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZG9tLmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZG9tIGluc3RhbmNlb2YgTnpJbnB1dE51bWJlckNvbXBvbmVudCkge1xuICAgICAgICBpZiAoZG9tLm56RGlzYWJsZWQpIHtcbiAgICAgICAgICBpZiAoanVtcERpcmVjdGlvbiA9PT0gXCJyaWdodFwiKSB7XG4gICAgICAgICAgICB0aGlzLmp1bXBUb05leHRJbnB1dCh4LCB5KTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGp1bXBEaXJlY3Rpb24gPT09IFwibGVmdFwiKSB7XG4gICAgICAgICAgICB0aGlzLmp1bXBUb1ByZXZJbnB1dCh4LCB5KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGlucHV0RG9tOiBhbnkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChkb20ubnpJZCk7XG4gICAgICAgIGlucHV0RG9tLmZvY3VzKCk7XG4gICAgICAgIGlucHV0RG9tLnNjcm9sbEludG9WaWV3KHtcbiAgICAgICAgICBiZWhhdmlvcjogXCJzbW9vdGhcIixcbiAgICAgICAgICBibG9jazogXCJjZW50ZXJcIixcbiAgICAgICAgICBpbmxpbmU6IFwiY2VudGVyXCIsXG4gICAgICAgIH0pO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBpbnB1dERvbS5zZWxlY3QoKTtcbiAgICAgICAgfSwgMCk7XG4gICAgICB9IGVsc2UgaWYgKGRvbSBpbnN0YW5jZW9mIEVsZW1lbnRSZWYpIHtcbiAgICAgICAgaWYgKGRvbS5uYXRpdmVFbGVtZW50LmRpc2FibGVkKSB7XG4gICAgICAgICAgaWYgKGp1bXBEaXJlY3Rpb24gPT09IFwicmlnaHRcIikge1xuICAgICAgICAgICAgdGhpcy5qdW1wVG9OZXh0SW5wdXQoeCwgeSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChqdW1wRGlyZWN0aW9uID09PSBcImxlZnRcIikge1xuICAgICAgICAgICAgdGhpcy5qdW1wVG9QcmV2SW5wdXQoeCwgeSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBkb20ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICBkb20ubmF0aXZlRWxlbWVudC5zY3JvbGxJbnRvVmlldyh7XG4gICAgICAgICAgYmVoYXZpb3I6IFwic21vb3RoXCIsXG4gICAgICAgICAgYmxvY2s6IFwiY2VudGVyXCIsXG4gICAgICAgICAgaW5saW5lOiBcImNlbnRlclwiLFxuICAgICAgICB9KTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgZG9tLm5hdGl2ZUVsZW1lbnQuc2VsZWN0KCk7XG4gICAgICAgIH0sIDApO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgZG9tIGluc3RhbmNlb2YgTnpEYXRlUGlja2VyQ29tcG9uZW50IHx8XG4gICAgICAgIGRvbSBpbnN0YW5jZW9mIE56UmFuZ2VQaWNrZXJDb21wb25lbnQgfHxcbiAgICAgICAgZG9tIGluc3RhbmNlb2YgTnpUaW1lUGlja2VyQ29tcG9uZW50XG4gICAgICApIHtcbiAgICAgICAgLy8gVE9ETzrlnKhuZ3pvcnJvOC41LnjniYjmnKzvvIzml7bpl7Tnm7jlhbPnmoTpgInmi6nlmajmsqHmnInmmrTpnLLlh7pvcGVu5pa55rOV77yM5pqC5pe25YWI5LiN5aSE55CG44CC77yIMTAueOWPiuS7peS4iueJiOacrOaPkOS+m+S6hm9wZW7mlrnms5XvvIlcbiAgICAgICAgaWYgKGp1bXBEaXJlY3Rpb24gPT09IFwicmlnaHRcIikge1xuICAgICAgICAgIHRoaXMuanVtcFRvTmV4dElucHV0KHgsIHkpO1xuICAgICAgICB9IGVsc2UgaWYgKGp1bXBEaXJlY3Rpb24gPT09IFwibGVmdFwiKSB7XG4gICAgICAgICAgdGhpcy5qdW1wVG9QcmV2SW5wdXQoeCwgeSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5zZXRBY3RpdmVEb20oeCwgeSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIOayoeaciWRvbeeahOWcuuaZr+S4i++8jOmcgOimgeWIpOaWreaYr+W3pui/mOaYr+WPs++8jFxuICAgIH1cbiAgfVxuXG4gIGNsZWFuRm9jdXNEb20oeDogbnVtYmVyLCB5OiBudW1iZXIpIHtcbiAgICBpZiAoXG4gICAgICB4ID09PSBudWxsIHx8XG4gICAgICB5ID09PSBudWxsIHx8XG4gICAgICAhdGhpcy5jb2xsZWN0RG9tTGlzdCB8fFxuICAgICAgdGhpcy5jb2xsZWN0RG9tTGlzdC5sZW5ndGggPT09IDBcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuY29sbGVjdERvbUxpc3RbeF0gJiYgdGhpcy5jb2xsZWN0RG9tTGlzdFt4XVt5XSkge1xuICAgICAgY29uc3QgZG9tID0gdGhpcy5jb2xsZWN0RG9tTGlzdFt4XVt5XTtcbiAgICAgIGlmIChkb20gaW5zdGFuY2VvZiBOelNlbGVjdENvbXBvbmVudCkge1xuICAgICAgICBkb20uYmx1cigpO1xuICAgICAgICBkb20ubnpPcGVuID0gZmFsc2U7XG4gICAgICB9IGVsc2UgaWYgKGRvbSBpbnN0YW5jZW9mIE56SW5wdXROdW1iZXJDb21wb25lbnQpIHtcbiAgICAgICAgZG9tLmJsdXIoKTtcbiAgICAgIH0gZWxzZSBpZiAoZG9tIGluc3RhbmNlb2YgRWxlbWVudFJlZikge1xuICAgICAgICBkb20ubmF0aXZlRWxlbWVudC5ibHVyKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHNldEFjdGl2ZURvbSh4OiBudW1iZXIsIHk6IG51bWJlcikge1xuICAgIHRoaXMuYWN0aXZlRG9tWCA9IHg7XG4gICAgdGhpcy5hY3RpdmVEb21ZID0geTtcbiAgICB0aGlzLmFjdGl2ZURvbSA9IHRoaXMuY29sbGVjdERvbUxpc3RbdGhpcy5hY3RpdmVEb21YXVt0aGlzLmFjdGl2ZURvbVldO1xuICAgIGlmICh0aGlzLmFjdGl2ZURvbSBpbnN0YW5jZW9mIE56U2VsZWN0Q29tcG9uZW50KSB7XG4gICAgICB0aGlzLnNldEFjdGl2ZVNlbGVjdGVkQ29tcG9uZW50T3Blbih0aGlzLmFjdGl2ZURvbS5vcGVuKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5qC55o2u6KGM5Y+35ZKM5YiX5Y+35ZCN56ew6I635Y+W5b2T5YmN6IGa54Sm55qEZG9t5L2N572uXG4gICAqIEBwYXJhbSByb3dOdW1iZXIg6KGM5Y+3XG4gICAqIEBwYXJhbSBjb2xOdW1iZXIg5YiX5Y+3XG4gICAqL1xuICBzZXRBY3RpdmVEb21JbkZvcm1MaW5lcyhyb3dOdW1iZXI6IG51bWJlciwgY29sTnVtYmVyOiBudW1iZXIpIHtcbiAgICB0aGlzLmFjdGl2ZURvbVggPSByb3dOdW1iZXI7XG4gICAgdGhpcy5hY3RpdmVEb21ZID0gdGhpcy5nZXREb21JbmRleChjb2xOdW1iZXIsIHRoaXMuZm9ybUxpbmVzKTtcbiAgICB0aGlzLnNldEFjdGl2ZURvbSh0aGlzLmFjdGl2ZURvbVgsIHRoaXMuYWN0aXZlRG9tWSk7XG4gIH1cblxuICAvKipcbiAgICog6ZSu55uY54K55Ye75LqL5Lu2XG4gICAqIEBwYXJhbSBldmVudCDplK7nm5jkuovku7ZcbiAgICogQHJldHVybnNcbiAgICovXG4gIG9uS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgIGlmICghdGhpcy5lbmFibGVLZXlib2FyZE9wZXJhdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuYWN0aXZlRG9tWCA9PT0gbnVsbCB8fCB0aGlzLmFjdGl2ZURvbVkgPT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc3dpdGNoIChldmVudC5rZXkpIHtcbiAgICAgIGNhc2UgXCJBcnJvd1VwXCI6XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0aGlzLmFjdGl2ZURvbSBpbnN0YW5jZW9mIE56U2VsZWN0Q29tcG9uZW50ICYmXG4gICAgICAgICAgdGhpcy5hY3RpdmVTZWxlY3RlZENvbXBvbmVudE9wZW5cbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZURvbVggIT09IDApIHtcbiAgICAgICAgICB0aGlzLmZvY3VzRG9tKHRoaXMuYWN0aXZlRG9tWCAtIDEsIHRoaXMuYWN0aXZlRG9tWSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiQXJyb3dEb3duXCI6XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0aGlzLmFjdGl2ZURvbSBpbnN0YW5jZW9mIE56U2VsZWN0Q29tcG9uZW50ICYmXG4gICAgICAgICAgdGhpcy5hY3RpdmVTZWxlY3RlZENvbXBvbmVudE9wZW5cbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIOWIpOaWreaYr+WQpuWcqOacgOWQjuS4gOihjO+8jOWKoOihjFxuICAgICAgICBpZiAodGhpcy5hY3RpdmVEb21YID09PSB0aGlzLmNvbGxlY3REb21MaXN0Lmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICB0aGlzLmNsZWFuRm9jdXNEb20odGhpcy5hY3RpdmVEb21YLCB0aGlzLmFjdGl2ZURvbVkpO1xuICAgICAgICAgIHRoaXMuYWRkTmV3TGluZUFuZEZvY3VzKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5mb2N1c0RvbSh0aGlzLmFjdGl2ZURvbVggKyAxLCB0aGlzLmFjdGl2ZURvbVkpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIkFycm93TGVmdFwiOlxuICAgICAgICB0aGlzLmp1bXBUb1ByZXZJbnB1dCh0aGlzLmFjdGl2ZURvbVgsIHRoaXMuYWN0aXZlRG9tWSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIkFycm93UmlnaHRcIjpcbiAgICAgICAgdGhpcy5qdW1wVG9OZXh0SW5wdXQodGhpcy5hY3RpdmVEb21YLCB0aGlzLmFjdGl2ZURvbVkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJFbnRlclwiOlxuICAgICAgICBpZiAodGhpcy5hY3RpdmVEb20gaW5zdGFuY2VvZiBOelNlbGVjdENvbXBvbmVudCkge1xuICAgICAgICAgIHRoaXMuc2V0QWN0aXZlU2VsZWN0ZWRDb21wb25lbnRPcGVuKHRoaXMuYWN0aXZlRG9tLm9wZW4pO1xuICAgICAgICAgIGlmICh0aGlzLmFjdGl2ZVNlbGVjdGVkQ29tcG9uZW50T3BlbiA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNEb20odGhpcy5hY3RpdmVEb21YLCB0aGlzLmFjdGl2ZURvbVkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmFjdGl2ZURvbVggPT09IHRoaXMuY29sbGVjdERvbUxpc3QubGVuZ3RoIC0gMSkge1xuICAgICAgICAgIHRoaXMuYWRkTmV3TGluZUFuZEZvY3VzKCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiRXNjYXBlXCI6XG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZURvbSBpbnN0YW5jZW9mIE56U2VsZWN0Q29tcG9uZW50KSB7XG4gICAgICAgICAgY29uc3Qgbm93QWN0aXZlRG9tID0gdGhpcy5hY3RpdmVEb20gYXMgTnpTZWxlY3RDb21wb25lbnQ7XG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNldEFjdGl2ZVNlbGVjdGVkQ29tcG9uZW50T3Blbihub3dBY3RpdmVEb20ub3Blbik7XG4gICAgICAgICAgICBpZiAodGhpcy5hY3RpdmVTZWxlY3RlZENvbXBvbmVudE9wZW4gPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgIGlmIChub3dBY3RpdmVEb20ubnpTZWxlY3RTZXJ2aWNlLm1vZGUgPT09IFwibXVsdGlwbGVcIikge1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgdGhpcy5mb2N1c0RvbSh0aGlzLmFjdGl2ZURvbVgsIHRoaXMuYWN0aXZlRG9tWSk7XG4gICAgICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5mb2N1c0RvbSh0aGlzLmFjdGl2ZURvbVgsIHRoaXMuYWN0aXZlRG9tWSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LCAwKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIC8vIOWmguaenOW9k+WJjeiBmueEpueahOaYr+mAieaLqeahhu+8jOS4lOmUruWFpTAtOWEtekEtWu+8jOWImeW8ueWHulxuICAgICAgICBpZiAoXG4gICAgICAgICAgdGhpcy5hY3RpdmVEb20gaW5zdGFuY2VvZiBOelNlbGVjdENvbXBvbmVudCAmJlxuICAgICAgICAgIHRoaXMuYWN0aXZlU2VsZWN0ZWRDb21wb25lbnRPcGVuID09PSBmYWxzZSAmJlxuICAgICAgICAgIC9eWzAtOWEtekEtWl0kLy50ZXN0KGV2ZW50LmtleSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgZG9tID0gdGhpcy5hY3RpdmVEb207XG4gICAgICAgICAgZG9tLm56T3BlbiA9IHRydWU7XG4gICAgICAgICAgdGhpcy5zZXRBY3RpdmVTZWxlY3RlZENvbXBvbmVudE9wZW4odHJ1ZSk7XG4gICAgICAgICAgLy8gLy8gVE9ETzrov5nph4zmmoLml7bms6jph4rvvIzkuI3og73nm7TmjqXluKblhaXplK7lhaXlgLzvvIzov5nmoLfkvJrlr7zoh7TovpPlhaXkuK3mlofnmoTml7blgJnluKblhaXoi7HmloflrZfnrKbvvIzkuI3nrKblkIjpooTmnJ9cbiAgICAgICAgICAvLyBkb20ubnpTZWxlY3RUb3BDb250cm9sQ29tcG9uZW50LmlucHV0VmFsdWUgPSBldmVudC5rZXk7XG4gICAgICAgICAgLy8gLy8g6I635Y+WIGlucHV0IOWFg+e0oFxuICAgICAgICAgIC8vIGNvbnN0IGlucHV0RWxlbWVudCA9IGRvbS5uelNlbGVjdFRvcENvbnRyb2xDb21wb25lbnQuaW5wdXRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgICAgLy8gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgLy8gICAvLyDop6blj5HovpPlhaXkuovku7bvvIzku6Xnoa7kv50gQW5ndWxhciDmo4DmtYvliLDlgLznmoTlj5jljJZcbiAgICAgICAgICAvLyAgIGNvbnN0IGV2ZW50SW5wdXQgPSBuZXcgRXZlbnQoJ2lucHV0JywgeyBidWJibGVzOiB0cnVlIH0pO1xuICAgICAgICAgIC8vICAgaW5wdXRFbGVtZW50LmRpc3BhdGNoRXZlbnQoZXZlbnRJbnB1dCk7XG4gICAgICAgICAgLy8gfSwgMCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOagueaNruWcqOWIneWni2RvbeS4i+agh+WSjOaVsOaNrumbhiDojrflj5blnKhjb2xsZWN0RG9tTGlzdOS4reeahOS4i+agh1xuICAgKiBAcGFyYW0gaW5kZXgg5Yid5aeL5LiL5qCHXG4gICAqIEBwYXJhbSBsaXN0IOiAgeaVsOaNrumbhlxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgcHJpdmF0ZSBnZXREb21JbmRleChpbmRleDogbnVtYmVyLCBsaXN0OiBBcnJheTxGb3JtTGluZT4pOiBudW1iZXIge1xuICAgIGNvbnN0IHR5cGVMaXN0ID0gW1xuICAgICAgXCJJbnB1dFwiLFxuICAgICAgXCJTZWxlY3RcIixcbiAgICAgIFwiRGF0ZVwiLFxuICAgICAgXCJEYXRlUmFuZ2VcIixcbiAgICAgIFwiVGV4dEFyZWFcIixcbiAgICAgIFwiSW5wdXROdW1iZXJcIixcbiAgICAgIFwiTXVsdGlwbGVTZWxlY3RcIixcbiAgICBdO1xuICAgIGxldCBmaWx0ZXJMaXN0ID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoaSA9PT0gaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIGZpbHRlckxpc3QubGVuZ3RoO1xuICAgICAgfVxuICAgICAgLy8g5LiO5qih5p2/5LiA6Ie077yaaGlkZSAvIGlzU2hvdz1mYWxzZSDnmoTliJfkuI3muLLmn5MgI2Zvcm1JbnB1dERvbe+8jOS4jeiuoeWFpSBjb2xsZWN0RG9tTGlzdCDnmoTliJfkuIvmoIdcbiAgICAgIGlmIChcbiAgICAgICAgdHlwZUxpc3QuaW5jbHVkZXMobGlzdFtpXS50eXBlKSAmJlxuICAgICAgICAhbGlzdFtpXS5oaWRlICYmXG4gICAgICAgIGxpc3RbaV0uaXNTaG93ICE9PSBmYWxzZVxuICAgICAgKSB7XG4gICAgICAgIGZpbHRlckxpc3QucHVzaChsaXN0W2ldKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICog5qC55o2u5ZyoY29sbGVjdERvbUxpc3TkuK3nmoTkuIvmoIflkozmlbDmja7pm4Yg6I635Y+W5Yid5aeLZG9t5LiL5qCHXG4gICAqIEBwYXJhbSBpbmRleCDmlrDkuIvmoIdcbiAgICogQHBhcmFtIGxpc3Qg6ICB5pWw5o2u6ZuGXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBwcml2YXRlIGdldE9sZERvbUluZGV4KGluZGV4OiBudW1iZXIsIGxpc3Q6IEFycmF5PEZvcm1MaW5lPik6IG51bWJlciB7XG4gICAgY29uc29sZS5sb2coXCJpbmRleFwiLCBpbmRleCk7XG4gICAgY29uc29sZS5sb2coXCJsaXN0XCIsIGxpc3QpO1xuICAgIGNvbnN0IHR5cGVMaXN0ID0gW1xuICAgICAgXCJJbnB1dFwiLFxuICAgICAgXCJTZWxlY3RcIixcbiAgICAgIFwiRGF0ZVwiLFxuICAgICAgXCJEYXRlUmFuZ2VcIixcbiAgICAgIFwiVGV4dEFyZWFcIixcbiAgICAgIFwiSW5wdXROdW1iZXJcIixcbiAgICAgIFwiTXVsdGlwbGVTZWxlY3RcIixcbiAgICBdO1xuICAgIGxldCBmaWx0ZXJMaXN0ID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHR5cGVMaXN0LmluY2x1ZGVzKGxpc3RbaV0udHlwZSkgJiZcbiAgICAgICAgIWxpc3RbaV0uaGlkZSAmJlxuICAgICAgICBsaXN0W2ldLmlzU2hvdyAhPT0gZmFsc2VcbiAgICAgICkge1xuICAgICAgICBmaWx0ZXJMaXN0LnB1c2gobGlzdFtpXSk7XG4gICAgICAgIGlmIChmaWx0ZXJMaXN0Lmxlbmd0aCA9PT0gaW5kZXggKyAxKSB7XG4gICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBnZXQgbGluZXNGb3JtQXJyYXkoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy52YWxpZGF0ZUhkRm9ybUxpbmVzLmdldChcImxpbmVzXCIpIGFzIEZvcm1BcnJheTtcbiAgfVxuXG4gIGdldCBMb2Rhc2hSb3VuZCgpIHtcbiAgICByZXR1cm4gcm91bmQ7XG4gIH1cblxuICAvLyDmmrTpnLLnmoTmlrnms5XvvIznlKjkuo7ojrflj5bmiYDmnInmlbDmja7nmoR2YWxpZOeKtuaAgVxuICBwdWJsaWMgZ2V0VmFsaWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybVZhbGlkO1xuICB9XG5cbiAgb25TZWFyY2hFdmVudChcbiAgICBmbjogYW55LFxuICAgIGV2ZW50OiBhbnksXG4gICAgbGluZTogYW55LFxuICAgIG9uU2VhcmNoRXZlbnREZWJvdW5jZVRpbWU6IGFueSxcbiAgKSB7XG4gICAgaWYgKCFmbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBkZWJvdW5jZU1zID1cbiAgICAgIG9uU2VhcmNoRXZlbnREZWJvdW5jZVRpbWUgIT0gbnVsbCA/IG9uU2VhcmNoRXZlbnREZWJvdW5jZVRpbWUgOiAwO1xuICAgIC8vIOacqumFjee9ruaIluS4uiAw77ya5ZCM5q2l6Kem5Y+R77yM5LiN6LWwIGRlYm91bmNlVGltZe+8iOmBv+WFjeW8guatpe+8iVxuICAgIGlmICghZGVib3VuY2VNcykge1xuICAgICAgdGhpcy50cmlnZ2VyRXZlbnQoZm4sIGV2ZW50LCBsaW5lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kZWJvdW5jZVRpbWVvdXQgPSBkZWJvdW5jZU1zO1xuICAgICAgaWYgKHRoaXMuc2VhcmNoU3Vic2NyaXB0aW9uKSB7XG4gICAgICAgIHRoaXMuc2VhcmNoU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICB9XG4gICAgICB0aGlzLnNlYXJjaFN1YnNjcmlwdGlvbiA9IHRoaXMuc2VhcmNoU3ViamVjdFxuICAgICAgICAucGlwZShkZWJvdW5jZVRpbWUodGhpcy5kZWJvdW5jZVRpbWVvdXQpKVxuICAgICAgICAuc3Vic2NyaWJlKCh7IGZuLCBldmVudCwgbGluZSB9KSA9PiB0aGlzLnRyaWdnZXJFdmVudChmbiwgZXZlbnQsIGxpbmUpKTtcbiAgICAgIHRoaXMuc2VhcmNoU3ViamVjdC5uZXh0KHsgZm4sIGV2ZW50LCBsaW5lIH0pO1xuICAgIH1cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuc2V0QWN0aXZlU2VsZWN0ZWRDb21wb25lbnRPcGVuKHRydWUpO1xuICAgIH0sIDApO1xuICB9XG5cbiAgb25PcGVuQ2hhbmdlRXZlbnQoXG4gICAgZm46IGFueSxcbiAgICBvcGVuOiBib29sZWFuLFxuICAgIGxpbmU6IGFueSxcbiAgICBvbk9wZW5DaGFuZ2VFdmVudERlYm91bmNlVGltZTogYW55LFxuICAgIGZvcm1JdGVtPzogYW55LFxuICApIHtcbiAgICBpZiAoIWZuKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIOWxleW8gOaXtuWFiOa4heepuuaXpyBvcHRpb25z77yM6YG/5YWN5p2h5Lu25Y+Y5YyW5ZCO6K+35rGC6L+U5Zue5YmN5LuN5bGV56S65LiK5LiA5om55LiL5ouJ5pWw5o2uXG4gICAgaWYgKG9wZW4pIHtcbiAgICAgIHRoaXMuY2xlYXJTZWxlY3RPcHRpb25zT25PcGVuKGZvcm1JdGVtLCBsaW5lKTtcbiAgICB9XG4gICAgY29uc3QgZGVib3VuY2VNcyA9XG4gICAgICBvbk9wZW5DaGFuZ2VFdmVudERlYm91bmNlVGltZSAhPSBudWxsXG4gICAgICAgID8gb25PcGVuQ2hhbmdlRXZlbnREZWJvdW5jZVRpbWVcbiAgICAgICAgOiAwO1xuICAgIC8vIOacqumFjee9ruaIluS4uiAw77ya5ZCM5q2l6Kem5Y+R77yM5LiN6LWwIGRlYm91bmNlVGltZe+8iOmBv+WFjeW8guatpe+8iVxuICAgIGlmICghZGVib3VuY2VNcykge1xuICAgICAgaWYgKG9wZW4pIHtcbiAgICAgICAgdGhpcy50cmlnZ2VyRXZlbnQoZm4sIG9wZW4sIGxpbmUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLm9wZW5DaGFuZ2VEZWJvdW5jZVRpbWVvdXQgPSBkZWJvdW5jZU1zO1xuICAgIGlmICh0aGlzLm9wZW5DaGFuZ2VTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMub3BlbkNoYW5nZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICB0aGlzLm9wZW5DaGFuZ2VTdWJzY3JpcHRpb24gPSB0aGlzLm9wZW5DaGFuZ2VTdWJqZWN0XG4gICAgICAucGlwZShkZWJvdW5jZVRpbWUodGhpcy5vcGVuQ2hhbmdlRGVib3VuY2VUaW1lb3V0KSlcbiAgICAgIC5zdWJzY3JpYmUoKHsgZm4sIGV2ZW50LCBsaW5lIH0pID0+IHtcbiAgICAgICAgaWYgKGV2ZW50KSB7XG4gICAgICAgICAgdGhpcy50cmlnZ2VyRXZlbnQoZm4sIGV2ZW50LCBsaW5lKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgdGhpcy5vcGVuQ2hhbmdlU3ViamVjdC5uZXh0KHsgZm4sIGV2ZW50OiBvcGVuLCBsaW5lIH0pO1xuICB9XG5cbiAgLyoqIOaciSBvbk9wZW5DaGFuZ2VFdmVudCDml7blsZXlvIDkuIvmi4nlhYjmuIXnqbrpgInpobnvvIznlLHkuJrliqHlm57osIPlho3lhpnlhaXmlrDmlbDmja4gKi9cbiAgcHJpdmF0ZSBjbGVhclNlbGVjdE9wdGlvbnNPbk9wZW4oZm9ybUl0ZW06IGFueSwgbGluZTogYW55KTogdm9pZCB7XG4gICAgaWYgKCFmb3JtSXRlbSB8fCAhZm9ybUl0ZW0uc2VsZWN0T3B0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG9wdCA9IGZvcm1JdGVtLnNlbGVjdE9wdGlvbjtcbiAgICBpZiAob3B0LnNlbGVjdExpc3QgIT0gbnVsbCkge1xuICAgICAgb3B0LnNlbGVjdExpc3QgPSBbXTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgb3B0LnNlbGVjdExpc3ROYW1lICYmXG4gICAgICBsaW5lICYmXG4gICAgICBsaW5lLmdldCAmJlxuICAgICAgbGluZS5nZXQob3B0LnNlbGVjdExpc3ROYW1lKVxuICAgICkge1xuICAgICAgbGluZS5nZXQob3B0LnNlbGVjdExpc3ROYW1lKS5zZXRWYWx1ZShbXSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gZm4g54i257uE5Lu25Ye95pWwXG4gICAqIEBwYXJhbSBldmVudCDkuovku7blgLxcbiAgICogQHBhcmFtIGxpbmUg6Kem5Y+R55qE6KGMXG4gICAqL1xuICB0cmlnZ2VyRXZlbnQoZm46IGFueSwgZXZlbnQ6IGFueSwgbGluZTogYW55KSB7XG4gICAgaWYgKGZuKSB7XG4gICAgICBmbihldmVudCwgbGluZSk7XG4gICAgfVxuICB9XG5cbiAgaW5uZXJHZXRWYWxpZCgpIHtcbiAgICBsZXQgdG1wVmFsaWRhdGVIZEZvcm1MaW5lcyA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgbGluZXM6IHRoaXMuZmIuYXJyYXkoW10pLFxuICAgIH0pO1xuICAgIHRoaXMuc3RvcmVGb3JtTGluZXNEYXRhLmZvckVhY2goKGZvcm1MaW5lc0RhdGFJdGVtKSA9PiB7XG4gICAgICBsZXQgZm9ybUdyb3VwT2JqOiBhbnkgPSB7fTtcbiAgICAgIHRoaXMuZm9ybUxpbmVzLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgLy8g5paw5aKe6KGMIOWIneWni+aVsOaNrumDveS4um51bGxcbiAgICAgICAgZm9ybUdyb3VwT2JqW2l0ZW0ubmFtZV0gPSB0aGlzLmZiLmNvbnRyb2woXG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFsdWU6IHRoaXMuanVkZ2VWYWx1ZUlzTm90RW1wdHkoZm9ybUxpbmVzRGF0YUl0ZW1baXRlbS5uYW1lXSlcbiAgICAgICAgICAgICAgPyBmb3JtTGluZXNEYXRhSXRlbVtpdGVtLm5hbWVdXG4gICAgICAgICAgICAgIDogaXRlbS52YWx1ZSB8fCBudWxsLFxuICAgICAgICAgICAgZGlzYWJsZWQ6IGl0ZW0uZGlzYWJsZWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBpdGVtLnJlcXVpcmUgPyBbVmFsaWRhdG9ycy5yZXF1aXJlZF0gOiBbXSxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGl0ZW0uc2VsZWN0T3B0aW9uICYmIGl0ZW0uc2VsZWN0T3B0aW9uLmxhYmVsKSB7XG4gICAgICAgICAgZm9ybUdyb3VwT2JqW2l0ZW0uc2VsZWN0T3B0aW9uLmxhYmVsXSA9IHRoaXMuZmIuY29udHJvbChcbiAgICAgICAgICAgIGZvcm1MaW5lc0RhdGFJdGVtW2l0ZW0uc2VsZWN0T3B0aW9uLmxhYmVsXSB8fCBudWxsLFxuICAgICAgICAgICAgW10sXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBmb3JtR3JvdXBPYmoubGluZUluZGV4ID0gdGhpcy5mYi5jb250cm9sKFxuICAgICAgICAodG1wVmFsaWRhdGVIZEZvcm1MaW5lcy5nZXQoXCJsaW5lc1wiKSBhcyBGb3JtQXJyYXkpLmNvbnRyb2xzLmxlbmd0aCArIDEsXG4gICAgICAgIFtdLFxuICAgICAgKTtcbiAgICAgIGxldCBmb3JtR3JvdXBUbXAgPSB0aGlzLmZiLmdyb3VwKGZvcm1Hcm91cE9iaik7XG4gICAgICB0aGlzLmZvcm1MaW5lcy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgIGlmIChpdGVtLm9uQ2hhbmdlRXZlbnQpIHtcbiAgICAgICAgICBjb25zdCBkZWJvdW5jZU1zID1cbiAgICAgICAgICAgIGl0ZW0ub25DaGFuZ2VFdmVudERlYm91bmNlVGltZSAhPSBudWxsXG4gICAgICAgICAgICAgID8gaXRlbS5vbkNoYW5nZUV2ZW50RGVib3VuY2VUaW1lXG4gICAgICAgICAgICAgIDogMDtcbiAgICAgICAgICBjb25zdCBjb250cm9sID0gZm9ybUdyb3VwVG1wLmdldChpdGVtLm5hbWUpO1xuICAgICAgICAgIC8vIOacqumFjee9ruaIluS4uiAw77ya5ZCM5q2l6K6i6ZiF77yM5LiN6LWwIGRlYm91bmNlVGltZVxuICAgICAgICAgIGlmIChkZWJvdW5jZU1zID4gMCkge1xuICAgICAgICAgICAgY29udHJvbC52YWx1ZUNoYW5nZXNcbiAgICAgICAgICAgICAgLnBpcGUoZGVib3VuY2VUaW1lKGRlYm91bmNlTXMpKVxuICAgICAgICAgICAgICAuc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMudHJpZ2dlckV2ZW50KGl0ZW0ub25DaGFuZ2VFdmVudCwgdmFsdWUsIGZvcm1Hcm91cFRtcCk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb250cm9sLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMudHJpZ2dlckV2ZW50KGl0ZW0ub25DaGFuZ2VFdmVudCwgdmFsdWUsIGZvcm1Hcm91cFRtcCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgKHRtcFZhbGlkYXRlSGRGb3JtTGluZXMuZ2V0KFwibGluZXNcIikgYXMgRm9ybUFycmF5KS5pbnNlcnQoXG4gICAgICAgICh0bXBWYWxpZGF0ZUhkRm9ybUxpbmVzLmdldChcImxpbmVzXCIpIGFzIEZvcm1BcnJheSkuY29udHJvbHMubGVuZ3RoLFxuICAgICAgICBmb3JtR3JvdXBUbXAsXG4gICAgICApO1xuICAgIH0pO1xuICAgIHJldHVybiB0bXBWYWxpZGF0ZUhkRm9ybUxpbmVzLnZhbGlkO1xuICB9XG5cbiAgLy8g5pq06Zyy55qE5pa55rOV77yM55So5LqO6I635Y+W5omA5pyJ5pWw5o2uXG4gIHB1YmxpYyBnZXRMaW5lcygpIHtcbiAgICBsZXQgYWxsTGluZXMgPSBbXTtcbiAgICB0aGlzLnN0b3JlRm9ybUxpbmVzRGF0YS5mb3JFYWNoKChmb3JtTGluZXNEYXRhSXRlbSkgPT4ge1xuICAgICAgbGV0IGZvcm1Hcm91cE9iajogYW55ID0ge307XG4gICAgICB0aGlzLmZvcm1MaW5lcy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgIC8vIOaWsOWinuihjCDliJ3lp4vmlbDmja7pg73kuLpudWxsXG4gICAgICAgIGZvcm1Hcm91cE9ialtpdGVtLm5hbWVdID0gZm9ybUxpbmVzRGF0YUl0ZW1baXRlbS5uYW1lXTtcbiAgICAgIH0pO1xuICAgICAgZm9ybUdyb3VwT2JqLmxpbmVJbmRleCA9IGZvcm1MaW5lc0RhdGFJdGVtLmxpbmVJbmRleDtcbiAgICAgIGFsbExpbmVzLnB1c2goZm9ybUdyb3VwT2JqKTtcbiAgICB9KTtcbiAgICByZXR1cm4gYWxsTGluZXM7XG4gIH1cblxuICAvLyDlhajlsYDmgKfnmoTmkJzntKLvvIjmtrXnm5bpobXpnaLkuIrmiYDmnInnmoTlj6/op4bmloflrZfvvIlcbiAgc2VhcmNoTGluZXMoKSB7XG4gICAgaWYgKHRoaXMuc3RvcmVGb3JtTGluZXNEYXRhLmxlbmd0aCA8IDEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy50YWJsZUxvYWRpbmcgPSB0cnVlO1xuICAgIC8vIOWmguaenOayoeaciei+k+WFpeaQnOe0ouWtl+espuS4su+8jOWImeaYvuekuue8k+WtmOWGheeahOaJgOacieaVsOaNrlxuICAgIGlmICghdGhpcy5maWx0ZXJTdHIpIHtcbiAgICAgIHRoaXMuaXNGaWx0ZXJEYXRhID0gZmFsc2U7XG4gICAgICB0aGlzLnNldFN0b3JlRGF0YSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBmaWx0ZXJWYWx1ZSA9IHRoaXMuZmlsdGVyU3RyLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgIHRoaXMuaXNGaWx0ZXJEYXRhID0gdHJ1ZTtcbiAgICB0aGlzLmZpbHRlckluZGV4U3RvcmUgPSBbXTtcblxuICAgIC8vIOagueaNruaQnOe0ouWtl+espuS4sui/h+a7pOaVsOaNrlxuICAgIGNvbnN0IGZpbHRlcmVkRGF0YSA9IHRoaXMuc3RvcmVGb3JtTGluZXNEYXRhLmZpbHRlcihcbiAgICAgIChkYXRhOiBhbnksIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHRoaXMuZm9ybUxpbmVzKSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgKGl0ZW0uaGlkZSAmJiBpdGVtLmNhblNlYXJjaCkgfHxcbiAgICAgICAgICAgICghaXRlbS5oaWRlICYmIGl0ZW0ubmFtZSAhPT0gXCJ1dWlkXCIpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIml0ZW1cIiwgaXRlbS5uYW1lKTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZGF0YVtpdGVtLm5hbWVdXG4gICAgICAgICAgICAgID8gZGF0YVtpdGVtLm5hbWVdLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgICA6IFwiXCI7XG4gICAgICAgICAgICBpZiAodmFsdWUuaW5jbHVkZXMoZmlsdGVyVmFsdWUpKSB7XG4gICAgICAgICAgICAgIHRoaXMuZmlsdGVySW5kZXhTdG9yZS5wdXNoKGluZGV4KTtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0sXG4gICAgKTtcbiAgICAvLyDnvJPlrZjkuIDkuIvnrZvpgInlkI7nmoTooajljZXmlbDmja5cbiAgICB0aGlzLmZpbHRlclN0b3JlRm9ybUxpbmVzRGF0YSA9IGZpbHRlcmVkRGF0YTtcbiAgICAvLyDlpITnkIbnrZvpgInlpb3nmoTmlbDmja4g54S25ZCO6YeN5paw5riy5p+TXG4gICAgdGhpcy5mb3JtTGluZXNEYXRhID0gZmlsdGVyZWREYXRhO1xuICAgIHRoaXMuaW5pdCh0cnVlKTtcbiAgfVxuXG4gIHNldFN0b3JlRGF0YSgpIHtcbiAgICB0aGlzLmZvcm1MaW5lc0RhdGEgPSB0aGlzLnN0b3JlRm9ybUxpbmVzRGF0YTtcbiAgICB0aGlzLmluaXQodHJ1ZSk7XG4gIH1cblxuICBnZXRTdHlsZShsaW5lOiBGb3JtR3JvdXAsIGZvcm1JdGVtOiBhbnksIHdpZHRoOiBzdHJpbmcpIHtcbiAgICBsZXQgc3R5bGVPYmogPSB7XG4gICAgICBcIm1pbi13aWR0aFwiOiB3aWR0aCxcbiAgICB9O1xuICAgIGlmIChmb3JtSXRlbS5zdHlsZSkge1xuICAgICAgc3R5bGVPYmogPSB7IC4uLnN0eWxlT2JqLCAuLi5mb3JtSXRlbS5zdHlsZSB9O1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBmb3JtSXRlbS5jb2xvck9wdGlvbiAmJlxuICAgICAgZm9ybUl0ZW0uY29sb3JPcHRpb24ubmFtZSAmJlxuICAgICAgbGluZS5nZXQoZm9ybUl0ZW0uY29sb3JPcHRpb24ubmFtZSkudmFsdWVcbiAgICApIHtcbiAgICAgIHN0eWxlT2JqID0ge1xuICAgICAgICAuLi5zdHlsZU9iaixcbiAgICAgICAgLi4ueyBjb2xvcjogbGluZS5nZXQoZm9ybUl0ZW0uY29sb3JPcHRpb24ubmFtZSkudmFsdWUgfSxcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBzdHlsZU9iajtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICBpZiAoXG4gICAgICBjaGFuZ2VzW1wiZm9ybUxpbmVzRGF0YVwiXSAmJlxuICAgICAgSlNPTi5zdHJpbmdpZnkoY2hhbmdlc1tcImZvcm1MaW5lc0RhdGFcIl0uY3VycmVudFZhbHVlKSAhPT1cbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoY2hhbmdlc1tcImZvcm1MaW5lc0RhdGFcIl0ucHJldmlvdXNWYWx1ZSlcbiAgICApIHtcbiAgICAgIGlmICh0aGlzLnN0b3JlRm9ybUxpbmVzRGF0YSAmJiB0aGlzLnN0b3JlRm9ybUxpbmVzRGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhpcy5zdG9yZUZvcm1MaW5lc0RhdGEgPSB0aGlzLmZvcm1MaW5lc0RhdGE7XG4gICAgICB9XG4gICAgICB0aGlzLmluaXQoKTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgY2hhbmdlc1tcImZvcm1MaW5lc1wiXSAmJlxuICAgICAgY2hhbmdlc1tcImZvcm1MaW5lc1wiXS5wcmV2aW91c1ZhbHVlICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIEpTT04uc3RyaW5naWZ5KGNoYW5nZXNbXCJmb3JtTGluZXNcIl0uY3VycmVudFZhbHVlKSAhPT1cbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoY2hhbmdlc1tcImZvcm1MaW5lc1wiXS5wcmV2aW91c1ZhbHVlKVxuICAgICkge1xuICAgICAgdGhpcy5pbml0Q29sU2V0dGluZ3MoKTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgY2hhbmdlc1tcInRvdGFsT3B0aW9uXCJdICYmXG4gICAgICBKU09OLnN0cmluZ2lmeShjaGFuZ2VzW1widG90YWxPcHRpb25cIl0uY3VycmVudFZhbHVlKSAhPT1cbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoY2hhbmdlc1tcInRvdGFsT3B0aW9uXCJdLnByZXZpb3VzVmFsdWUpXG4gICAgKSB7XG4gICAgICB0aGlzLmNhbGN1bGF0ZVRvdGFsKCk7XG4gICAgfVxuICB9XG5cbiAgY2FsY3VsYXRlVG90YWwoKSB7XG4gICAgLy8g6L+Z6YeM5aSE55CG5ZCI6K6h5pWw5o2uXG4gICAgaWYgKHRoaXMuc2hvd1RvdGFsKSB7XG4gICAgICB0aGlzLnRvdGFsT3B0aW9uTGlzdCA9IG5ldyBBcnJheShOdW1iZXIodGhpcy5jb2x1bW5zTnVtYmVyKSAtIDEpLmZpbGwoXCJcIik7XG4gICAgICB0aGlzLnRvdGFsT3B0aW9uLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgaWYgKGl0ZW0uaW5zZXJ0SW5kZXggJiYgKGl0ZW0uaW5zZXJ0VmFsdWUgfHwgaXRlbS5pbnNlcnRWYWx1ZSA9PT0gMCkpIHtcbiAgICAgICAgICB0aGlzLnRvdGFsT3B0aW9uTGlzdFtpdGVtLmluc2VydEluZGV4IC0gMV0gPSB7XG4gICAgICAgICAgICB2YWx1ZTogaXRlbS5pbnNlcnRWYWx1ZSxcbiAgICAgICAgICAgIGFsaWduOiBpdGVtLmFsaWduIHx8IFwibGVmdFwiLFxuICAgICAgICAgICAgc2hvd0RlY2ltYWw6IGl0ZW0uc2hvd0RlY2ltYWwgfHwgZmFsc2UsXG4gICAgICAgICAgICBwcmVzZXJ2ZU51bWJlcjogaXRlbS5wcmVzZXJ2ZU51bWJlciAhPSBudWxsID8gaXRlbS5wcmVzZXJ2ZU51bWJlciA6IDIsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpbml0KGlzRWRpdDogYm9vbGVhbiA9IGZhbHNlKTogdm9pZCB7XG4gICAgdGhpcy5wYWdpbmF0aW9uUGFnZUluZGV4ID0gMTtcbiAgICAvLyDlvILluLjmjZXojrdcbiAgICBpZiAoIXRoaXMuY2hlY2tMaXN0KHRoaXMuZm9ybUxpbmVzKSkge1xuICAgICAgdGhpcy50YWJsZUxvYWRpbmcgPSBmYWxzZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5jcmVhdGVGb3JtKCk7XG4gICAgLy8g5aaC5p6c5rKh5pyJZm9ybUxpbmVzRGF0Ye+8jOWImeiupOS4uuaYr+aWsOWinlxuICAgIGlmIChcbiAgICAgICFpc0VkaXQgJiZcbiAgICAgICghdGhpcy5mb3JtTGluZXNEYXRhIHx8XG4gICAgICAgICh0aGlzLmZvcm1MaW5lc0RhdGEgJiYgdGhpcy5mb3JtTGluZXNEYXRhLmxlbmd0aCA9PT0gMCkpXG4gICAgKSB7XG4gICAgICB0aGlzLnRhYmxlTG9hZGluZyA9IGZhbHNlO1xuICAgICAgLy8gYWxsb3dFbXB0eSDkuJTku4XliKDpmaTmjInpkq7vvJrkuI3oh6rliqjooaXnqbrooYxcbiAgICAgIGlmICghdGhpcy5pc1RydWx5RW1wdHlBbGxvd2VkKSB7XG4gICAgICAgIHRoaXMuYWRkRm9ybUxpbmUobnVsbCwgZmFsc2UpO1xuICAgICAgfVxuICAgICAgdGhpcy5zaG93Rm9ybSA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIOe8lui+kemAu+i+kVxuICAgICAgdGhpcy5hZGRGb3JtTGluZVdpdGhEYXRhKCk7XG4gICAgfVxuICAgIHRoaXMudmFsaWRhdGVIZEZvcm1MaW5lcy52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKChkYXRhKSA9PlxuICAgICAgdGhpcy5vbkhkRm9ybVZhbHVlQ2hhbmdlZChkYXRhKSxcbiAgICApO1xuICAgIHRoaXMub25IZEZvcm1WYWx1ZUNoYW5nZWQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDliJvlu7rooajljZVcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlRm9ybSgpIHtcbiAgICB0aGlzLnZhbGlkYXRlSGRGb3JtTGluZXMgPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIGxpbmVzOiB0aGlzLmZiLmFycmF5KFtdKSxcbiAgICB9KTtcbiAgICB0aGlzLm5ld0xpbmUgPSB0aGlzLm5ld0xpbmVJdGVtKCk7XG4gIH1cblxuICBkZWxheUp1bXBUb05leHRJbnB1dCgpIHtcbiAgICAvLyDlhbPpl63plK7nm5jmk43kvZzml7bvvIzpgInmi6nmoYbpgInkuK3lkI7kuI3oh6rliqjot7PovazliLDkuIvkuIDkuKrovpPlhaXmjqfku7ZcbiAgICBpZiAoIXRoaXMuZW5hYmxlS2V5Ym9hcmRPcGVyYXRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5qdW1wVG9OZXh0SW5wdXQodGhpcy5hY3RpdmVEb21YLCB0aGlzLmFjdGl2ZURvbVkpO1xuICAgIH0sIDApO1xuICB9XG5cbiAgLyoqXG4gICAqIOWumuS5ieepuueahG5ld0xpbmVJdGVtIOe7k+aehFxuICAgKi9cbiAgcHJpdmF0ZSBuZXdMaW5lSXRlbSgpOiBGb3JtR3JvdXAge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZUxpbmVGcm9tVmFsdWVzKG51bGwsIHRydWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIOagueaNruihjOaVsOaNruWIm+W7uiBGb3JtR3JvdXDvvIjlkKvpmpDol4/lrZfmrrXjgIFzZWxlY3Qg55qEIGxhYmVsIOetiemZhOWxnuWtl+aute+8iVxuICAgKiBAcGFyYW0gZm9ybUxpbmVzRGF0YUl0ZW0g6KGM5pWw5o2u77yM56m66KGM5LygIG51bGxcbiAgICogQHBhcmFtIGlzRW1wdHlMaW5lIOaYr+WQpuepuuihjO+8iOW9seWTjeW/heWhq+agoemqjOinhOWIme+8jOS4juWOhuWPsumAu+i+keS/neaMgeS4gOiHtO+8iVxuICAgKiBAcGFyYW0gcmVnZW5lcmF0ZVJvd0lkIOaYr+WQpuW8uuWItueUn+aIkOaWsOihjCBpZO+8iOWkjeWItuihjOaXtuS9v+eUqO+8iVxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVMaW5lRnJvbVZhbHVlcyhcbiAgICBmb3JtTGluZXNEYXRhSXRlbTogYW55LFxuICAgIGlzRW1wdHlMaW5lOiBib29sZWFuID0gZmFsc2UsXG4gICAgcmVnZW5lcmF0ZVJvd0lkOiBib29sZWFuID0gZmFsc2UsXG4gICk6IEZvcm1Hcm91cCB7XG4gICAgbGV0IGZvcm1Hcm91cE9iajogYW55ID0ge307XG4gICAgdGhpcy5mb3JtTGluZXMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgZm9ybUdyb3VwT2JqW2l0ZW0ubmFtZV0gPSB0aGlzLmZiLmNvbnRyb2woXG4gICAgICAgIHtcbiAgICAgICAgICB2YWx1ZTpcbiAgICAgICAgICAgIGZvcm1MaW5lc0RhdGFJdGVtICE9IG51bGxcbiAgICAgICAgICAgICAgPyBmb3JtTGluZXNEYXRhSXRlbVtpdGVtLm5hbWVdXG4gICAgICAgICAgICAgIDogaXRlbS52YWx1ZSxcbiAgICAgICAgICBkaXNhYmxlZDogaXRlbS5kaXNhYmxlZCxcbiAgICAgICAgfSxcbiAgICAgICAgaXNFbXB0eUxpbmVcbiAgICAgICAgICA/IGl0ZW0ucmVxdWlyZSAmJiAhaXRlbS5oaWRlXG4gICAgICAgICAgICA/IFtWYWxpZGF0b3JzLnJlcXVpcmVkXVxuICAgICAgICAgICAgOiBbXVxuICAgICAgICAgIDogaXRlbS5yZXF1aXJlXG4gICAgICAgICAgICA/IFtWYWxpZGF0b3JzLnJlcXVpcmVkXVxuICAgICAgICAgICAgOiBbXSxcbiAgICAgICk7XG4gICAgICBpZiAoaXRlbS5zZWxlY3RPcHRpb24gJiYgaXRlbS5zZWxlY3RPcHRpb24ubGFiZWwpIHtcbiAgICAgICAgZm9ybUdyb3VwT2JqW2l0ZW0uc2VsZWN0T3B0aW9uLmxhYmVsXSA9IHRoaXMuZmIuY29udHJvbChcbiAgICAgICAgICBmb3JtTGluZXNEYXRhSXRlbSAhPSBudWxsXG4gICAgICAgICAgICA/IGZvcm1MaW5lc0RhdGFJdGVtW2l0ZW0uc2VsZWN0T3B0aW9uLmxhYmVsXSB8fCBudWxsXG4gICAgICAgICAgICA6IG51bGwsXG4gICAgICAgICAgW10sXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyDnqLPlrprooYwgaWTvvJrmkJzntKLph43lu7rooajljZXlkI7nlKjkuo7kv53nlZnli77pgIlcbiAgICBjb25zdCByb3dJZCA9XG4gICAgICAhcmVnZW5lcmF0ZVJvd0lkICYmIGZvcm1MaW5lc0RhdGFJdGVtICYmIGZvcm1MaW5lc0RhdGFJdGVtLl9oZFJvd0lkXG4gICAgICAgID8gZm9ybUxpbmVzRGF0YUl0ZW0uX2hkUm93SWRcbiAgICAgICAgOiB0aGlzLmdlbmVyYXRlUm93SWQoKTtcbiAgICBmb3JtR3JvdXBPYmouX2hkUm93SWQgPSB0aGlzLmZiLmNvbnRyb2wocm93SWQpO1xuICAgIGlmIChmb3JtTGluZXNEYXRhSXRlbSAmJiAhZm9ybUxpbmVzRGF0YUl0ZW0uX2hkUm93SWQpIHtcbiAgICAgIGZvcm1MaW5lc0RhdGFJdGVtLl9oZFJvd0lkID0gcm93SWQ7XG4gICAgfVxuXG4gICAgLy8g5aSN5Yi25rqQ6KGM5LiK5aSa5L2Z55qE5a2X5q6177yI6ZqQ6JeP6ZmE5bGe5a2X5q6144CBc2VsZWN0TGlzdE5hbWUg562J77yJXG4gICAgaWYgKGZvcm1MaW5lc0RhdGFJdGVtKSB7XG4gICAgICBPYmplY3Qua2V5cyhmb3JtTGluZXNEYXRhSXRlbSkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBrZXkgPT09IFwibGluZUluZGV4XCIgfHxcbiAgICAgICAgICBrZXkgPT09IFwiaXNIZEZvcm1MaW5lU2VhcmNoQWRkXCIgfHxcbiAgICAgICAgICBrZXkgPT09IFwiX2hkUm93SWRcIlxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFmb3JtR3JvdXBPYmpba2V5XSkge1xuICAgICAgICAgIGZvcm1Hcm91cE9ialtrZXldID0gdGhpcy5mYi5jb250cm9sKGZvcm1MaW5lc0RhdGFJdGVtW2tleV0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBmb3JtR3JvdXBPYmoubGluZUluZGV4ID0gdGhpcy5mYi5jb250cm9sKFxuICAgICAgdGhpcy5saW5lc0Zvcm1BcnJheS5jb250cm9scy5sZW5ndGggKyAxLFxuICAgICAgW10sXG4gICAgKTtcbiAgICBmb3JtR3JvdXBPYmouaXNIZEZvcm1MaW5lU2VhcmNoQWRkID0gdGhpcy5mYi5jb250cm9sKHRoaXMuaXNGaWx0ZXJEYXRhLCBbXSk7XG4gICAgbGV0IGZvcm1Hcm91cFN1Ym1pdCA9IHRoaXMuZmIuZ3JvdXAoZm9ybUdyb3VwT2JqKTtcbiAgICB0aGlzLmZvcm1MaW5lcy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICBpZiAoaXRlbS5vbkNoYW5nZUV2ZW50KSB7XG4gICAgICAgIGNvbnN0IGRlYm91bmNlTXMgPVxuICAgICAgICAgIGl0ZW0ub25DaGFuZ2VFdmVudERlYm91bmNlVGltZSAhPSBudWxsXG4gICAgICAgICAgICA/IGl0ZW0ub25DaGFuZ2VFdmVudERlYm91bmNlVGltZVxuICAgICAgICAgICAgOiAwO1xuICAgICAgICBjb25zdCBjb250cm9sID0gZm9ybUdyb3VwU3VibWl0LmdldChpdGVtLm5hbWUpO1xuICAgICAgICBjb25zdCBoYW5kbGVDaGFuZ2UgPSAodmFsdWU6IGFueSkgPT4ge1xuICAgICAgICAgIGlmIChpdGVtLnR5cGUgPT09IEZvcm1MaW5lVHlwZS5TZWxlY3QgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuZGVsYXlKdW1wVG9OZXh0SW5wdXQoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy50cmlnZ2VyRXZlbnQoaXRlbS5vbkNoYW5nZUV2ZW50LCB2YWx1ZSwgZm9ybUdyb3VwU3VibWl0KTtcbiAgICAgICAgfTtcbiAgICAgICAgLy8g5pyq6YWN572u5oiW5Li6IDDvvJrlkIzmraXorqLpmIXvvIzkuI3otbAgZGVib3VuY2VUaW1lXG4gICAgICAgIGlmIChkZWJvdW5jZU1zID4gMCkge1xuICAgICAgICAgIGNvbnRyb2wudmFsdWVDaGFuZ2VzXG4gICAgICAgICAgICAucGlwZShkZWJvdW5jZVRpbWUoZGVib3VuY2VNcykpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKGhhbmRsZUNoYW5nZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29udHJvbC52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKGhhbmRsZUNoYW5nZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gZm9ybUdyb3VwU3VibWl0O1xuICB9XG5cbiAgcHJpdmF0ZSBjYWxjdWxhdGVMaW5lTnVtYmVyKCkge1xuICAgIHRoaXMubGluZXNGb3JtQXJyYXkuY29udHJvbHMuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgIGl0ZW0uZ2V0KFwibGluZUluZGV4XCIpLnNldFZhbHVlKGluZGV4ICsgMSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOe8lui+keeahOaXtuWAmeaVsOaNruWkhOeQhlxuICAgKi9cbiAgYWRkRm9ybUxpbmVXaXRoRGF0YSgpIHtcbiAgICB0aGlzLmZvcm1MaW5lc0RhdGEuZm9yRWFjaCgoZm9ybUxpbmVzRGF0YUl0ZW0pID0+IHtcbiAgICAgIHRoaXMubGluZXNGb3JtQXJyYXkuaW5zZXJ0KFxuICAgICAgICB0aGlzLmxpbmVzRm9ybUFycmF5LmNvbnRyb2xzLmxlbmd0aCxcbiAgICAgICAgdGhpcy5jcmVhdGVMaW5lRnJvbVZhbHVlcyhmb3JtTGluZXNEYXRhSXRlbSksXG4gICAgICApO1xuICAgIH0pO1xuICAgIHRoaXMuY2FsY3VsYXRlTGluZU51bWJlcigpO1xuICAgIHRoaXMudGFibGVMb2FkaW5nID0gZmFsc2U7XG4gICAgdGhpcy5zaG93Rm9ybSA9IHRydWU7XG4gIH1cblxuICAvKipcbiAgICog5Zyo5oyH5a6a6KGM5LiL5pa55paw5aKe56m66KGM77yb5LiN5LygIGFmdGVyTGluZSDliJnov73liqDliLDmnKvlsL5cbiAgICogQHBhcmFtIGFmdGVyTGluZSDlvZPliY3ooYwgRm9ybUdyb3Vw77yI5LiN6KaB5LygIGxpbmVJbmRleO+8jOmBv+WFjeW6j+WPt+WBj+enu+WvvOiHtOaPkumUmeS9jee9ru+8iVxuICAgKi9cbiAgYWRkRm9ybUxpbmUoYWZ0ZXJMaW5lPzogRm9ybUdyb3VwIHwgbnVsbCwgaXNGb2N1czogYm9vbGVhbiA9IHRydWUpIHtcbiAgICBjb25zdCBpbnNlcnRBdCA9IHRoaXMuZ2V0SW5zZXJ0SW5kZXhBZnRlcihhZnRlckxpbmUpO1xuICAgIGNvbnN0IG5ld0xpbmUgPSB0aGlzLm5ld0xpbmVJdGVtKCk7XG4gICAgdGhpcy5saW5lc0Zvcm1BcnJheS5pbnNlcnQoaW5zZXJ0QXQsIG5ld0xpbmUpO1xuICAgIHRoaXMuY2FsY3VsYXRlTGluZU51bWJlcigpO1xuICAgIHRoaXMuYWRkTGluZUV2ZW50LmVtaXQobmV3TGluZSk7XG4gICAgLy8g6Lez5Yiw5paw5aKe6KGM5omA5Zyo6aG177yM6YG/5YWN6aG156CB5byC5bi45pe255yL5LiN5Yiw5pWw5o2uXG4gICAgdGhpcy5wYWdpbmF0aW9uUGFnZUluZGV4ID1cbiAgICAgIE1hdGguZmxvb3IoaW5zZXJ0QXQgLyB0aGlzLnBhZ2luYXRpb25QYWdlU2l6ZSkgKyAxO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5jb2xsZWN0RG9tRGF0YSgpO1xuICAgICAgaWYgKGlzRm9jdXMpIHtcbiAgICAgICAgdGhpcy5hY3RpdmVEb21YID0gdGhpcy50b1BhZ2VMb2NhbFJvd0luZGV4KGluc2VydEF0KTtcbiAgICAgICAgdGhpcy5hY3RpdmVEb21ZID0gMDtcbiAgICAgICAgY29uc29sZS5sb2coXCLmiafooYzov4fnqIsxM1wiKTtcbiAgICAgICAgdGhpcy5mb2N1c0RvbSh0aGlzLmFjdGl2ZURvbVgsIHRoaXMuYWN0aXZlRG9tWSk7XG4gICAgICB9XG4gICAgfSwgMCk7XG4gIH1cblxuICAvKipcbiAgICog5aSN5Yi25b2T5YmN6KGM77ya5Zyo5b2T5YmN6KGM5LiL5pa55paw5aKe5LiA6KGM77yM5aSN5Yi25omA5pyJ5a2X5q615YC877yI5ZCr6ZqQ6JeP5a2X5q6177yJXG4gICAqL1xuICBjb3B5Rm9ybUxpbmUobGluZTogRm9ybUdyb3VwKSB7XG4gICAgY29uc3Qgc291cmNlSW5kZXggPSB0aGlzLmxpbmVzRm9ybUFycmF5LmNvbnRyb2xzLmluZGV4T2YobGluZSk7XG4gICAgaWYgKHNvdXJjZUluZGV4IDwgMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBnZXRSYXdWYWx1ZSDljIXlkKsgZGlzYWJsZWQg5a2X5q6177yb5aSN5Yi26KGM5L2/55So5paw55qEIF9oZFJvd0lkXG4gICAgY29uc3Qgc291cmNlVmFsdWVzID0gbGluZS5nZXRSYXdWYWx1ZSgpO1xuICAgIGNvbnN0IGluc2VydEF0ID0gc291cmNlSW5kZXggKyAxO1xuICAgIHRoaXMubGluZXNGb3JtQXJyYXkuaW5zZXJ0KFxuICAgICAgaW5zZXJ0QXQsXG4gICAgICB0aGlzLmNyZWF0ZUxpbmVGcm9tVmFsdWVzKHNvdXJjZVZhbHVlcywgZmFsc2UsIHRydWUpLFxuICAgICk7XG4gICAgdGhpcy5jYWxjdWxhdGVMaW5lTnVtYmVyKCk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmNvbGxlY3REb21EYXRhKCk7XG4gICAgICB0aGlzLmFjdGl2ZURvbVggPSB0aGlzLnRvUGFnZUxvY2FsUm93SW5kZXgoaW5zZXJ0QXQpO1xuICAgICAgdGhpcy5hY3RpdmVEb21ZID0gMDtcbiAgICAgIHRoaXMuZm9jdXNEb20odGhpcy5hY3RpdmVEb21YLCB0aGlzLmFjdGl2ZURvbVkpO1xuICAgIH0sIDApO1xuICB9XG5cbiAgQE91dHB1dCgpIGRlbGV0ZUxpbmVFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAvKipcbiAgICog5Yig6Zmk6KGMXG4gICAqIEBwYXJhbSBsaW5lT3JJbmRleCDooYwgRm9ybUdyb3Vw77yM5oiWIDEtYmFzZWQg55qEIGxpbmVJbmRleO+8iOWFvOWuuSByZXNldEZvcm3vvIlcbiAgICovXG4gIGRlbGV0ZUZvcm1MaW5lKGxpbmVPckluZGV4OiBGb3JtR3JvdXAgfCBudW1iZXIpIHtcbiAgICBsZXQgcmVtb3ZlQXQgPSAtMTtcbiAgICBpZiAodHlwZW9mIGxpbmVPckluZGV4ID09PSBcIm51bWJlclwiKSB7XG4gICAgICByZW1vdmVBdCA9IGxpbmVPckluZGV4IC0gMTtcbiAgICB9IGVsc2UgaWYgKGxpbmVPckluZGV4KSB7XG4gICAgICByZW1vdmVBdCA9IHRoaXMubGluZXNGb3JtQXJyYXkuY29udHJvbHMuaW5kZXhPZihsaW5lT3JJbmRleCk7XG4gICAgfVxuICAgIGNvbnNvbGUubG9nKFxuICAgICAgXCJpbmRleFwiLFxuICAgICAgdHlwZW9mIGxpbmVPckluZGV4ID09PSBcIm51bWJlclwiID8gbGluZU9ySW5kZXggOiByZW1vdmVBdCxcbiAgICApO1xuICAgIGlmIChyZW1vdmVBdCA8IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8g5pyA5ZCO5LiA5p2h5pWw5o2u55qE5pe25YCZ6KaB5Yik5pat5LiA5LiLXG4gICAgaWYgKHRoaXMubGluZXNGb3JtQXJyYXkuY29udHJvbHMubGVuZ3RoID09PSAxICYmICF0aGlzLmFsbG93RW1wdHkpIHtcbiAgICAgIGlmICh0aGlzLmRlbGV0ZUxhc3RMaW5lRXZlbnQpIHtcbiAgICAgICAgdGhpcy5kZWxldGVMYXN0TGluZUV2ZW50LmVtaXQoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcmVtb3ZlZExpbmUgPSB0aGlzLmxpbmVzRm9ybUFycmF5LmF0KHJlbW92ZUF0KSBhcyBGb3JtR3JvdXA7XG4gICAgdGhpcy5saW5lc0Zvcm1BcnJheS5yZW1vdmVBdChyZW1vdmVBdCk7XG4gICAgdGhpcy5yZW1vdmVMaW5lRnJvbVNlbGVjdGlvbihyZW1vdmVkTGluZSk7XG4gICAgaWYgKFxuICAgICAgIXRoaXMuaXNGaWx0ZXJEYXRhICYmXG4gICAgICB0aGlzLmxpbmVzRm9ybUFycmF5LmNvbnRyb2xzICYmXG4gICAgICB0aGlzLmxpbmVzRm9ybUFycmF5LmNvbnRyb2xzLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgIXRoaXMuaXNUcnVseUVtcHR5QWxsb3dlZFxuICAgICkge1xuICAgICAgdGhpcy5hZGRGb3JtTGluZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyDlvZPliY3pobXlt7Lml6DmlbDmja7ml7blm57pgIDpobXnoIHvvIzkuJTpobXnoIHmnIDlsI/kuLogMe+8iOmBv+WFjeWIoOepuuWQjuWPmOaIkCAwIOWvvOiHtOWGjea3u+WKoOeci+S4jeinge+8iVxuICAgICAgY29uc3QgbWF4UGFnZSA9IE1hdGgubWF4KFxuICAgICAgICAxLFxuICAgICAgICBNYXRoLmNlaWwoXG4gICAgICAgICAgdGhpcy5saW5lc0Zvcm1BcnJheS5jb250cm9scy5sZW5ndGggLyB0aGlzLnBhZ2luYXRpb25QYWdlU2l6ZSxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgICBpZiAodGhpcy5wYWdpbmF0aW9uUGFnZUluZGV4ID4gbWF4UGFnZSkge1xuICAgICAgICB0aGlzLnBhZ2luYXRpb25QYWdlSW5kZXggPSBtYXhQYWdlO1xuICAgICAgfVxuICAgICAgdGhpcy5jYWxjdWxhdGVMaW5lTnVtYmVyKCk7XG4gICAgfVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5jb2xsZWN0RG9tRGF0YSgpO1xuICAgIH0sIDApO1xuICB9XG5cbiAgLyoqIOWcqOaMh+WumuihjOWQjuaWueeahOaPkuWFpeS4i+agh++8m+aXoOihjOWImei/veWKoOWIsOacq+WwviAqL1xuICBwcml2YXRlIGdldEluc2VydEluZGV4QWZ0ZXIoYWZ0ZXJMaW5lPzogRm9ybUdyb3VwIHwgbnVsbCk6IG51bWJlciB7XG4gICAgaWYgKCFhZnRlckxpbmUpIHtcbiAgICAgIHJldHVybiB0aGlzLmxpbmVzRm9ybUFycmF5LmNvbnRyb2xzLmxlbmd0aDtcbiAgICB9XG4gICAgY29uc3QgaWR4ID0gdGhpcy5saW5lc0Zvcm1BcnJheS5jb250cm9scy5pbmRleE9mKGFmdGVyTGluZSk7XG4gICAgcmV0dXJuIGlkeCA+PSAwID8gaWR4ICsgMSA6IHRoaXMubGluZXNGb3JtQXJyYXkuY29udHJvbHMubGVuZ3RoO1xuICB9XG5cbiAgLyoqIOWFqOWxgOihjOS4i+agh+i9rOW9k+WJjemhteWGheeahOihjOS4i+agh++8iOS+m+iBmueEpueUqO+8iSAqL1xuICBwcml2YXRlIHRvUGFnZUxvY2FsUm93SW5kZXgoZ2xvYmFsSW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIChcbiAgICAgIGdsb2JhbEluZGV4IC0gKHRoaXMucGFnaW5hdGlvblBhZ2VJbmRleCAtIDEpICogdGhpcy5wYWdpbmF0aW9uUGFnZVNpemVcbiAgICApO1xuICB9XG5cbiAgcHVibGljIHBhZ2VJbmRleENoYW5nZShldmVudDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5wYWdpbmF0aW9uUGFnZUluZGV4ID0gZXZlbnQ7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmNvbGxlY3REb21EYXRhKCk7XG4gICAgfSwgMCk7XG4gIH1cblxuICBwdWJsaWMgcGFnZVNpemVDaGFuZ2UoZXZlbnQ6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMucGFnaW5hdGlvblBhZ2VTaXplID0gZXZlbnQ7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmNvbGxlY3REb21EYXRhKCk7XG4gICAgfSwgMCk7XG4gIH1cblxuICBwcml2YXRlIG9uSGRGb3JtVmFsdWVDaGFuZ2VkKGRhdGE/OiBhbnkpIHtcbiAgICBpZiAodGhpcy5pc0ZpbHRlckRhdGEpIHtcbiAgICAgIGlmIChkYXRhICYmIGRhdGEubGluZXMgJiYgdGhpcy5maWx0ZXJJbmRleFN0b3JlLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICBjb25zdCBsaW5lcyA9IGRhdGEubGluZXM7XG4gICAgICAgIGlmIChsaW5lcy5sZW5ndGggPT09IHRoaXMuZmlsdGVySW5kZXhTdG9yZS5sZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLmZpbHRlckluZGV4U3RvcmUuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc3RvcmVGb3JtTGluZXNEYXRhW2l0ZW1dID0ge1xuICAgICAgICAgICAgICAuLi50aGlzLmZpbHRlclN0b3JlRm9ybUxpbmVzRGF0YVtpbmRleF0sXG4gICAgICAgICAgICAgIC4uLmxpbmVzW2luZGV4XSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAobGluZXMubGVuZ3RoID4gdGhpcy5maWx0ZXJJbmRleFN0b3JlLmxlbmd0aCkge1xuICAgICAgICAgIC8vIOacieaWsOWinuaVsOaNrueahOaDheWGtVxuICAgICAgICAgIC8vIHN0ZXAgMTog5YWI5om+5paw5aKe55qEaW5kZXjkuIvmoIdcbiAgICAgICAgICBjb25zdCBnZXROb3dMaW5lcyA9IHRoaXMudmFsaWRhdGVIZEZvcm1MaW5lcy5nZXRSYXdWYWx1ZSgpLmxpbmVzO1xuICAgICAgICAgIGxldCBhZGRJbmRleCA9IC0xO1xuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZ2V0Tm93TGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChnZXROb3dMaW5lc1tpXS5pc0hkRm9ybUxpbmVTZWFyY2hBZGQpIHtcbiAgICAgICAgICAgICAgYWRkSW5kZXggPSBpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGFkZEluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgdGhpcy5zdG9yZUZvcm1MaW5lc0RhdGEuc3BsaWNlKFxuICAgICAgICAgICAgICB0aGlzLmZpbHRlckluZGV4U3RvcmVbYWRkSW5kZXggLSAxXSArIDEsXG4gICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgIGdldE5vd0xpbmVzW2FkZEluZGV4XSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuZmlsdGVySW5kZXhTdG9yZS5wdXNoKHRoaXMuZmlsdGVySW5kZXhTdG9yZVthZGRJbmRleCAtIDFdICsgMSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8g5pyJ5Yig6Zmk5pWw5o2u55qE5oOF5Ya1XG4gICAgICAgICAgLy8gc3RlcCAxOuWFiOaJvuWIsOWIoOmZpOeahGluZGV45LiL5qCHXG4gICAgICAgICAgbGV0IGRlbGV0ZWRJbmRleCA9IC0xO1xuICAgICAgICAgIGxldCBjb3VudCA9IDA7XG4gICAgICAgICAgaWYgKGxpbmVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgZGVsZXRlZEluZGV4ID0gMDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICBpZiAobGluZXNbaV0ubGluZUluZGV4IC0gY291bnQgPiAxKSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlZEluZGV4ID0gaTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb3VudCsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZGVsZXRlZEluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgLy8gc3RlcCAyOiDliKDpmaTmgLvmlbDmja7kuK3nmoTlr7nlupTmlbDmja4sIOaKiuS4i+agh+aVsOe7hOWSjGxpbmVz6ZW/5bqm5a+56b2Q77yM5ZCM5pe25oqK5LiL5qCH5pWw57uE5ZyoZGVsZXRlZEluZGV45ZCO6Z2i55qE5YC85YWo6YO9LTFcbiAgICAgICAgICAgIHRoaXMuc3RvcmVGb3JtTGluZXNEYXRhID0gdGhpcy5zdG9yZUZvcm1MaW5lc0RhdGEuZmlsdGVyKFxuICAgICAgICAgICAgICAoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXggIT09IHRoaXMuZmlsdGVySW5kZXhTdG9yZVtkZWxldGVkSW5kZXhdO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVySW5kZXhTdG9yZS5zcGxpY2UoZGVsZXRlZEluZGV4LCAxKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5maWx0ZXJJbmRleFN0b3JlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgIGlmIChpID49IGRlbGV0ZWRJbmRleCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVySW5kZXhTdG9yZVtpXS0tO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHN0ZXAgMjog5rKh5pyJ5om+5YiwZGVsZXRlZEluZGV46K+05piO5Yig6Zmk5pON5L2c5Zyo5pyA5ZCO5LiA6KGMXG4gICAgICAgICAgICBjb25zdCBmaWx0ZXJJbmRleCA9XG4gICAgICAgICAgICAgIHRoaXMuZmlsdGVySW5kZXhTdG9yZVt0aGlzLmZpbHRlckluZGV4U3RvcmUubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICB0aGlzLnN0b3JlRm9ybUxpbmVzRGF0YSA9IHRoaXMuc3RvcmVGb3JtTGluZXNEYXRhLmZpbHRlcihcbiAgICAgICAgICAgICAgKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGluZGV4ICE9PSBmaWx0ZXJJbmRleDtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLmZpbHRlckluZGV4U3RvcmUucG9wKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoZGF0YSAmJiBkYXRhLmxpbmVzKSB7XG4gICAgICAgICAgdGhpcy5zdG9yZUZvcm1MaW5lc0RhdGEgPSBkYXRhLmxpbmVzO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChkYXRhICYmIGRhdGEubGluZXMpIHtcbiAgICAgICAgdGhpcy5zdG9yZUZvcm1MaW5lc0RhdGEgPSBkYXRhLmxpbmVzO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIOaAu+ihqOWNlVxuICAgIGlmICghdGhpcy5pc0ZpbHRlckRhdGEpIHtcbiAgICAgIHRoaXMuZm9ybVZhbGlkID0gdGhpcy52YWxpZGF0ZUhkRm9ybUxpbmVzLnZhbGlkO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5mb3JtVmFsaWQpIHtcbiAgICAgICAgLy8g5aaC5p6c5pW05L2T6KGo5Y2V5pivdHJ1Ze+8jOS4jeeuoeWtkOihqOWNleaYr+S7gOS5iO+8jOmDveWPmOaIkOWtkOihqOWNleeahOeKtuaAgVxuICAgICAgICB0aGlzLmZvcm1WYWxpZCA9IHRoaXMudmFsaWRhdGVIZEZvcm1MaW5lcy52YWxpZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIOWmguaenOaVtOS9k+ihqOWNleaYr2ZhbHNl77yaMeOAgeWtkOihqOWNleS4unRydWXvvIzpnIDopoHph43nrpfvvJsy44CB5a2Q6KGo5Y2V5Li6ZmFsc2XvvIznlKjlrZDooajljZXnirbmgIFcbiAgICAgICAgaWYgKHRoaXMudmFsaWRhdGVIZEZvcm1MaW5lcy52YWxpZCkge1xuICAgICAgICAgIHRoaXMuZm9ybVZhbGlkID0gdGhpcy5pbm5lckdldFZhbGlkKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5mb3JtVmFsaWQgPSB0aGlzLnZhbGlkYXRlSGRGb3JtTGluZXMudmFsaWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgLy8gdGhpcy5jYWxjdWxhdGVMaW5lTnVtYmVyKCk7XG4gICAgdGhpcy5jaGFuZ2VFdmVudC5lbWl0KHRoaXMudmFsaWRhdGVIZEZvcm1MaW5lcyk7XG4gIH1cblxuICBwcml2YXRlIGNoZWNrTGlzdChsaXN0OiBBcnJheTxGb3JtTGluZT4pOiBib29sZWFuIHtcbiAgICBpZiAoIWxpc3QgfHwgKGxpc3QgJiYgbGlzdC5sZW5ndGggPT09IDApKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGxldCBuYW1lTGlzdCA9IFtdO1xuICAgIGxldCBzZWxlY3RPcHRpb25DaGVja0xpc3QgPSBbXTtcbiAgICBsaXN0LmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIC8vIOagoemqjOWNlemhuemAieaLqeWZqFxuICAgICAgLy8gaWYgKGl0ZW0udHlwZSA9PT0gRm9ybUxpbmVUeXBlLlNlbGVjdCAmJiAoIWl0ZW0uc2VsZWN0TGlzdCB8fCAoaXRlbS5zZWxlY3RMaXN0ICYmIGl0ZW0uc2VsZWN0TGlzdC5sZW5ndGggPT09IDApKSkge1xuICAgICAgLy8gICB0aHJvdyAnZm9ybUxpbmVz57uE5Lu25pWw5o2u5qC85byP5LiN6KeE6IyD77yM5a2Y5Zyo5Y2V6aG56YCJ5oup5Zmo5rKh5pyJ5Lyg5YWl6YCJ6aG5ISdcbiAgICAgIC8vIH1cbiAgICAgIG5hbWVMaXN0LnB1c2goaXRlbS5uYW1lKTtcblxuICAgICAgLy8g5qCh6aqM5pyJb25TZWFyY2jnmoTlrZfmrrXnmoRzZWxlY3RPcHRpb27nmoR2YWx1ZeOAgWxhYmVs5piv5ZCm5ZyoZm9ybUxpbmXph4zpnaLpg73lrprkuYnkuoZcbiAgICAgIGlmIChpdGVtLm9uU2VhcmNoRXZlbnQgJiYgaXRlbS5zZWxlY3RPcHRpb24pIHtcbiAgICAgICAgc2VsZWN0T3B0aW9uQ2hlY2tMaXN0ID0gW107XG4gICAgICAgIGxpc3QuZm9yRWFjaCgoaW5uZXJJdGVtKSA9PiB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgaW5uZXJJdGVtLm5hbWUgPT09IGl0ZW0uc2VsZWN0T3B0aW9uLnZhbHVlIHx8XG4gICAgICAgICAgICBpbm5lckl0ZW0ubmFtZSA9PT0gaXRlbS5zZWxlY3RPcHRpb24ubGFiZWxcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHNlbGVjdE9wdGlvbkNoZWNrTGlzdC5wdXNoKGlubmVySXRlbS5uYW1lKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoc2VsZWN0T3B0aW9uQ2hlY2tMaXN0Lmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICB0aHJvdyBgZm9ybUxpbmVz57uE5Lu25pWw5o2u5qC85byP5LiN6KeE6IyD77yM5a2X5q61JHtpdGVtLm5hbWV955qEc2VsZWN0T3B0aW9u55qEdmFsdWXjgIFsYWJlbOWtl+auteacquiDveWcqGZvcm1MaW5lc+S4reaJvuWIsOWvueW6lOWtl+aute+8gWA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICAvLyDmoKHpqoxuYW1l5piv5ZCm6YeN5aSNXG4gICAgaWYgKFsuLi5uZXcgU2V0KG5hbWVMaXN0KV0ubGVuZ3RoICE9PSBsaXN0Lmxlbmd0aCkge1xuICAgICAgdGhyb3cgXCJmb3JtTGluZXPnu4Tku7bmlbDmja7moLzlvI/kuI3op4TojIPvvIzlrZjlnKjph43lpI1uYW1l5YC8IVwiO1xuICAgIH1cbiAgICAvLyAuLi5tb3JlIGNoZWNrXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwdWJsaWMgc3VibWl0Rm9ybSgpOiB2b2lkIHtcbiAgICB0aGlzLmNoYW5nZUV2ZW50LmVtaXQodGhpcy52YWxpZGF0ZUhkRm9ybUxpbmVzLmdldFJhd1ZhbHVlKCkpO1xuICB9XG5cbiAgcHVibGljIHJlc2V0Rm9ybSgpOiB2b2lkIHtcbiAgICAvLyDliKDpmaRcbiAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKCk7XG4gICAgZm9yIChsZXQgaSA9IHRoaXMubGluZXNGb3JtQXJyYXkuY29udHJvbHMubGVuZ3RoOyBpID49IDA7IGktLSkge1xuICAgICAgdGhpcy5kZWxldGVGb3JtTGluZShpKTtcbiAgICB9XG4gICAgdGhpcy5wYWdpbmF0aW9uUGFnZUluZGV4ID0gMTtcbiAgfVxuXG4gIHB1YmxpYyBpbnB1dENsZWFuKGZvcm1JdGVtOiBhbnksIGxpbmU6IGFueSk6IHZvaWQge1xuICAgIGxpbmUuZ2V0KGZvcm1JdGVtLm5hbWUpLnNldFZhbHVlKG51bGwpO1xuICB9XG5cbiAgcHVibGljIHNlbGVjdFZhbHVlKGlkOiBzdHJpbmcsIHJvd051bWJlcjogbnVtYmVyLCBjb2xOdW1iZXI6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGlucHV0RG9tOiBhbnkgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGlkKTtcbiAgICBpbnB1dERvbS5zZWxlY3QoKTtcbiAgICB0aGlzLnNldEFjdGl2ZURvbUluRm9ybUxpbmVzKHJvd051bWJlciwgY29sTnVtYmVyKTtcbiAgfVxuXG4gIHByaXZhdGUgdGV4dFdpZHRoQ2FjaGU6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0gPSB7fTtcblxuICBpc1RleHRPdmVyZmxvdyh0ZXh0OiBzdHJpbmcsIG1heFdpZHRoOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBjb25zdCBjYWNoZWRXaWR0aCA9IHRoaXMudGV4dFdpZHRoQ2FjaGVbdGV4dF07XG4gICAgaWYgKGNhY2hlZFdpZHRoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBjYWNoZWRXaWR0aCArIDE1ID49IG1heFdpZHRoO1xuICAgIH1cblxuICAgIGNvbnN0IHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgICBzcGFuLnN0eWxlLnZpc2liaWxpdHkgPSBcImhpZGRlblwiO1xuICAgIHNwYW4uc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XG4gICAgc3Bhbi5zdHlsZS53aGl0ZVNwYWNlID0gXCJub3dyYXBcIjtcbiAgICBzcGFuLnN0eWxlLmZvbnRTaXplID0gXCIxNHB4XCI7XG4gICAgc3Bhbi5zdHlsZS5kaXNwbGF5ID0gXCJpbmxpbmUtYmxvY2tcIjsgLy8g5bCG5qC35byP5L+u5pS55Li6IGlubGluZS1ibG9ja1xuICAgIHNwYW4uaW5uZXJUZXh0ID0gdGV4dDtcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHNwYW4pO1xuICAgIGNvbnN0IGlzT3ZlcmZsb3cgPSBzcGFuLm9mZnNldFdpZHRoICsgMTUgPj0gbWF4V2lkdGg7XG4gICAgdGhpcy50ZXh0V2lkdGhDYWNoZVt0ZXh0XSA9IHNwYW4ub2Zmc2V0V2lkdGg7XG4gICAgc3Bhbi5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChzcGFuKTtcbiAgICByZXR1cm4gaXNPdmVyZmxvdztcbiAgfVxuXG4gIGp1ZGdlQ29sRW1wdHkoc3RyOiBhbnkpIHtcbiAgICBpZiAoc3RyIHx8IHN0ciA9PT0gMCkge1xuICAgICAgcmV0dXJuIHN0cjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFwiPOepuj5cIjtcbiAgICB9XG4gIH1cblxuICBqdWRnZVZhbHVlSXNOb3RFbXB0eShzdHI6IGFueSkge1xuICAgIGlmIChzdHIgPT09IG51bGwgJiYgc3RyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG59XG4iXX0=