gamma-app-controller 1.1.5 → 1.1.7
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.
- package/esm2020/lib/application-controller/application-content.service.mjs +32 -1
- package/esm2020/lib/application-controller/application-controller.module.mjs +27 -5
- package/esm2020/lib/application-controller/application-dataset-call.service.mjs +15 -10
- package/esm2020/lib/application-controller/application-dataset-component/application-dataset/application-dataset.component.mjs +14 -10
- package/esm2020/lib/application-controller/application-metric-config/all-metrics-config/all-metrics-config.component.mjs +95 -0
- package/esm2020/lib/application-controller/application-metric-config/create-metrics/create-metrics.component.mjs +42 -21
- package/esm2020/lib/application-controller/application-metric-config/ofline-metrics/ofline-metrics.component.mjs +3 -3
- package/esm2020/lib/application-controller/application-metric-config/online-metrics/online-metrics.component.mjs +5 -3
- package/esm2020/lib/application-controller/application-view-components/create-comp-view/create-comp-view.component.mjs +7 -6
- package/esm2020/lib/application-controller/shared/advanced-component/gamma-today-previous/gamma-today-previous.component.mjs +30 -19
- package/esm2020/lib/application-controller/support-components/dash-today-previous/dash-today-previous.component.mjs +278 -0
- package/esm2020/public-api.mjs +3 -1
- package/fesm2015/gamma-app-controller.mjs +603 -163
- package/fesm2015/gamma-app-controller.mjs.map +1 -1
- package/fesm2020/gamma-app-controller.mjs +598 -163
- package/fesm2020/gamma-app-controller.mjs.map +1 -1
- package/lib/application-controller/application-content.service.d.ts +4 -0
- package/lib/application-controller/application-controller.module.d.ts +13 -11
- package/lib/application-controller/application-dataset-call.service.d.ts +2 -1
- package/lib/application-controller/application-dataset-component/application-dataset/application-dataset.component.d.ts +2 -1
- package/lib/application-controller/application-metric-config/all-metrics-config/all-metrics-config.component.d.ts +41 -0
- package/lib/application-controller/application-metric-config/create-metrics/create-metrics.component.d.ts +7 -1
- package/lib/application-controller/shared/advanced-component/gamma-today-previous/gamma-today-previous.component.d.ts +3 -0
- package/lib/application-controller/support-components/dash-today-previous/dash-today-previous.component.d.ts +63 -0
- package/package.json +1 -1
- package/public-api.d.ts +2 -0
|
@@ -64,14 +64,14 @@ export class OflineMetricsComponent {
|
|
|
64
64
|
}
|
|
65
65
|
}
|
|
66
66
|
OflineMetricsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: OflineMetricsComponent, deps: [{ token: i1.CommonService }, { token: i2.ToastrService }, { token: i3.ApplicationContentService }], target: i0.ɵɵFactoryTarget.Component });
|
|
67
|
-
OflineMetricsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: OflineMetricsComponent, selector: "app-ofline-metrics", inputs: { onflineMetricData: "onflineMetricData" }, outputs: { getMetRicOflineDataSet: "getMetRicOflineDataSet" }, ngImport: i0, template: "<div class=\"flex flex-col flex-auto min-w-0 my-3\">\n <div class=\"text-lg py-2 font-extrabold border-b bg-gray-700 text-white px-2\"> Target\n </div>\n <div class=\"pt-2 border-x border-b \">\n <div class=\"flex flex-wrap p-2\">\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Database Name</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.target.databaseName\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> DB Config </div>\n <dx-select-box [items]=\"['mongo','impala','postgres','mysql','bigquery']\"\n (onValueChanged)=\"getDataConfig($event)\"\n [(ngModel)]=\"metricMainObject.target.dbConfig\"></dx-select-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Table Name</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.target.tableName\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Dimension Columns</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.target.dimensionColumns\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/3\">\n <div class=\"text-md mb-2\"> Measure Columns</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.target.measureColumns\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/3\">\n <div class=\"text-md mb-2\"> Partition Column</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.target.partitionColumn\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/3\">\n <div class=\"text-md mb-2\"> Write Disposition</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.target.writeDisposition\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/3\">\n <div class=\"text-md mb-2 mt-8\"></div>\n <dx-check-box text=\"Create Table\" [(ngModel)]=\"metricMainObject.target.createTable\"></dx-check-box>\n </div>\n </div>\n </div>\n</div>\n<div class=\"flex flex-col flex-auto min-w-0 my-3\">\n <div class=\"text-lg py-2 font-extrabold border-b bg-gray-700 text-white px-2\"> Source\n </div>\n <div class=\"pt-2 border-x border-b \">\n <div class=\"flex flex-wrap p-2\">\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Database Name</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.source.databaseName\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Db Config</div>\n <dx-select-box [items]=\"['mongo','impala','postgres','mysql','bigquery']\"\n (onValueChanged)=\"getDataConfig($event)\"\n [(ngModel)]=\"metricMainObject.target.dbConfig\"></dx-select-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Query Template</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.source.queryTemplate\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Query Template File</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.source.queryTemplateFile\"></dx-text-box>\n </div>\n </div>\n </div>\n</div>\n<div class=\"flex flex-col flex-auto min-w-0 my-2\">\n <div class=\"text-lg py-2 font-extrabold border-b bg-gray-700 text-white px-2\">Execution\n </div>\n <div class=\"pt-2 border-x border-b \">\n <div class=\"my-2 flex justify-between\"\n *ngFor=\"let item of metricMainObject.execution.arguments; let i = index;\">\n\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Argument Name</div>\n <dx-text-box [(ngModel)]=\"item.argumentName\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Label Name</div>\n <dx-text-box [(ngModel)]=\"item.labelName\"></dx-text-box>\n </div>\n\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Datatype</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"['date','string','timestamp','int', 'double', 'boolean']\"\n [(ngModel)]=\"item.dataType\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Function</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"functionNameContainer\"\n [(ngModel)]=\"item.function\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> runtimeValue</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"['static','dynamic']\"\n [(ngModel)]=\"item.runtimeValue\"></dx-select-box>\n </div>\n\n <div class=\"px-1 mt-7 text-center\">\n <button class=\"{{commonService.btn_danger_sm}} cursor-pointer\" (click)=\"deleteArguments(i)\"><i\n class=\"fa fa-trash-o\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n\n <div class=\"flex flex-row justify-end my-2\">\n <button class=\"{{commonService.btn_primary_sm}} cursor-pointer\" (click)=\"addArguments()\">Add\n Columns</button>\n </div>\n </div>\n</div>\n\n<div class=\"flex w-full justify-end mt-5 border-t\">\n <button class=\"{{commonService.btn_success_md}} cursor-pointer mx-1 my-2\" (click)=\"createOflineMetrics()\">\n Save Ofline Metrics\n </button>\n</div>", styles: [""], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: i5.DxCheckBoxComponent, selector: "dx-check-box", inputs: ["accessKey", "activeStateEnabled", "disabled", "elementAttr", "focusStateEnabled", "height", "hint", "hoverStateEnabled", "iconSize", "isValid", "name", "readOnly", "rtlEnabled", "tabIndex", "text", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "visible", "width"], outputs: ["onContentReady", "onDisposing", "onInitialized", "onOptionChanged", "onValueChanged", "accessKeyChange", "activeStateEnabledChange", "disabledChange", "elementAttrChange", "focusStateEnabledChange", "heightChange", "hintChange", "hoverStateEnabledChange", "iconSizeChange", "isValidChange", "nameChange", "readOnlyChange", "rtlEnabledChange", "tabIndexChange", "textChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "visibleChange", "widthChange", "onBlur"] }, { kind: "component", type: i6.DxSelectBoxComponent, selector: "dx-select-box", inputs: ["acceptCustomValue", "accessKey", "activeStateEnabled", "buttons", "dataSource", "deferRendering", "disabled", "displayExpr", "displayValue", "dropDownButtonTemplate", "dropDownOptions", "elementAttr", "fieldTemplate", "focusStateEnabled", "grouped", "groupTemplate", "height", "hint", "hoverStateEnabled", "inputAttr", "isValid", "items", "itemTemplate", "label", "labelMode", "maxLength", "minSearchLength", "name", "noDataText", "opened", "openOnFieldClick", "placeholder", "readOnly", "rtlEnabled", "searchEnabled", "searchExpr", "searchMode", "searchTimeout", "selectedItem", "showClearButton", "showDataBeforeSearch", "showDropDownButton", "showSelectionControls", "spellcheck", "stylingMode", "tabIndex", "text", "useItemTextAsTitle", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "valueChangeEvent", "valueExpr", "visible", "width", "wrapItemText"], outputs: ["onChange", "onClosed", "onContentReady", "onCopy", "onCustomItemCreating", "onCut", "onDisposing", "onEnterKey", "onFocusIn", "onFocusOut", "onInitialized", "onInput", "onItemClick", "onKeyDown", "onKeyUp", "onOpened", "onOptionChanged", "onPaste", "onSelectionChanged", "onValueChanged", "acceptCustomValueChange", "accessKeyChange", "activeStateEnabledChange", "buttonsChange", "dataSourceChange", "deferRenderingChange", "disabledChange", "displayExprChange", "displayValueChange", "dropDownButtonTemplateChange", "dropDownOptionsChange", "elementAttrChange", "fieldTemplateChange", "focusStateEnabledChange", "groupedChange", "groupTemplateChange", "heightChange", "hintChange", "hoverStateEnabledChange", "inputAttrChange", "isValidChange", "itemsChange", "itemTemplateChange", "labelChange", "labelModeChange", "maxLengthChange", "minSearchLengthChange", "nameChange", "noDataTextChange", "openedChange", "openOnFieldClickChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "searchEnabledChange", "searchExprChange", "searchModeChange", "searchTimeoutChange", "selectedItemChange", "showClearButtonChange", "showDataBeforeSearchChange", "showDropDownButtonChange", "showSelectionControlsChange", "spellcheckChange", "stylingModeChange", "tabIndexChange", "textChange", "useItemTextAsTitleChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "valueChangeEventChange", "valueExprChange", "visibleChange", "widthChange", "wrapItemTextChange", "onBlur"] }, { kind: "component", type: i7.DxTextBoxComponent, selector: "dx-text-box", inputs: ["accessKey", "activeStateEnabled", "buttons", "disabled", "elementAttr", "focusStateEnabled", "height", "hint", "hoverStateEnabled", "inputAttr", "isValid", "label", "labelMode", "mask", "maskChar", "maskInvalidMessage", "maskRules", "maxLength", "mode", "name", "placeholder", "readOnly", "rtlEnabled", "showClearButton", "showMaskMode", "spellcheck", "stylingMode", "tabIndex", "text", "useMaskedValue", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "valueChangeEvent", "visible", "width"], outputs: ["onChange", "onContentReady", "onCopy", "onCut", "onDisposing", "onEnterKey", "onFocusIn", "onFocusOut", "onInitialized", "onInput", "onKeyDown", "onKeyUp", "onOptionChanged", "onPaste", "onValueChanged", "accessKeyChange", "activeStateEnabledChange", "buttonsChange", "disabledChange", "elementAttrChange", "focusStateEnabledChange", "heightChange", "hintChange", "hoverStateEnabledChange", "inputAttrChange", "isValidChange", "labelChange", "labelModeChange", "maskChange", "maskCharChange", "maskInvalidMessageChange", "maskRulesChange", "maxLengthChange", "modeChange", "nameChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "showClearButtonChange", "showMaskModeChange", "spellcheckChange", "stylingModeChange", "tabIndexChange", "textChange", "useMaskedValueChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "valueChangeEventChange", "visibleChange", "widthChange", "onBlur"] }, { kind: "directive", type: i8.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i8.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
|
|
67
|
+
OflineMetricsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: OflineMetricsComponent, selector: "app-ofline-metrics", inputs: { onflineMetricData: "onflineMetricData" }, outputs: { getMetRicOflineDataSet: "getMetRicOflineDataSet" }, ngImport: i0, template: "<div class=\"flex flex-col flex-auto min-w-0 my-3\">\n <div class=\"text-lg py-2 font-extrabold border-b bg-gray-700 text-white px-2\"> Basic\n </div>\n <div class=\"pt-2 border-x border-b \">\n <div class=\"flex flex-wrap p-2\">\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Runner</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.runner\"></dx-text-box>\n </div>\n \n </div>\n </div>\n</div>\n<div class=\"flex flex-col flex-auto min-w-0 my-3\">\n <div class=\"text-lg py-2 font-extrabold border-b bg-gray-700 text-white px-2\"> Target\n </div>\n <div class=\"pt-2 border-x border-b \">\n <div class=\"flex flex-wrap p-2\">\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Database Name</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.target.databaseName\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> DB Config </div>\n <dx-select-box [items]=\"['mongo','impala','postgres','mysql','bigquery']\"\n (onValueChanged)=\"getDataConfig($event)\"\n [(ngModel)]=\"metricMainObject.target.dbConfig\"></dx-select-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Table Name</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.target.tableName\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Dimension Columns</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.target.dimensionColumns\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/3\">\n <div class=\"text-md mb-2\"> Measure Columns</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.target.measureColumns\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/3\">\n <div class=\"text-md mb-2\"> Partition Column</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.target.partitionColumn\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/3\">\n <div class=\"text-md mb-2\"> Write Disposition</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.target.writeDisposition\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/3\">\n <div class=\"text-md mb-2 mt-8\"></div>\n <dx-check-box text=\"Create Table\" [(ngModel)]=\"metricMainObject.target.createTable\"></dx-check-box>\n </div>\n </div>\n </div>\n</div>\n<div class=\"flex flex-col flex-auto min-w-0 my-3\">\n <div class=\"text-lg py-2 font-extrabold border-b bg-gray-700 text-white px-2\"> Source\n </div>\n <div class=\"pt-2 border-x border-b \">\n <div class=\"flex flex-wrap p-2\">\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Database Name</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.source.databaseName\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Db Config</div>\n <dx-select-box [items]=\"['mongo','impala','postgres','mysql','bigquery']\"\n (onValueChanged)=\"getDataConfig($event)\"\n [(ngModel)]=\"metricMainObject.target.dbConfig\"></dx-select-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Query Template</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.source.queryTemplate\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Query Template File</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.source.queryTemplateFile\"></dx-text-box>\n </div>\n </div>\n </div>\n</div>\n\n<div class=\"flex flex-col flex-auto min-w-0 my-2\">\n <div class=\"text-lg py-2 font-extrabold border-b bg-gray-700 text-white px-2\">Execution\n </div>\n <div class=\"pt-2 border-x border-b \">\n\n <div class=\"flex flex-wrap p-2\">\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Type</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.execution.type\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Job GroupId</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.execution.jobGroupId\"></dx-text-box>\n </div>\n \n </div>\n\n <div class=\"my-2 flex justify-between\"\n *ngFor=\"let item of metricMainObject.execution.arguments; let i = index;\">\n\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Argument Name</div>\n <dx-text-box [(ngModel)]=\"item.argumentName\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Label Name</div>\n <dx-text-box [(ngModel)]=\"item.labelName\"></dx-text-box>\n </div>\n\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Datatype</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"['date','string','timestamp','int', 'double', 'boolean']\"\n [(ngModel)]=\"item.dataType\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Function</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"functionNameContainer\"\n [(ngModel)]=\"item.function\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> runtimeValue</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"['static','dynamic']\"\n [(ngModel)]=\"item.runtimeValue\"></dx-select-box>\n </div>\n\n <div class=\"px-1 mt-7 text-center\">\n <button class=\"{{commonService.btn_danger_sm}} cursor-pointer\" (click)=\"deleteArguments(i)\"><i\n class=\"fa fa-trash-o\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n\n <div class=\"flex flex-row justify-end my-2\">\n <button class=\"{{commonService.btn_primary_sm}} cursor-pointer\" (click)=\"addArguments()\">Add\n Columns</button>\n </div>\n </div>\n</div>\n\n<div class=\"flex w-full justify-end mt-5 border-t\">\n <button class=\"{{commonService.btn_success_md}} cursor-pointer mx-1 my-2\" (click)=\"createOflineMetrics()\">\n Save Ofline Metrics\n </button>\n</div>", styles: [""], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: i5.DxCheckBoxComponent, selector: "dx-check-box", inputs: ["accessKey", "activeStateEnabled", "disabled", "elementAttr", "focusStateEnabled", "height", "hint", "hoverStateEnabled", "iconSize", "isValid", "name", "readOnly", "rtlEnabled", "tabIndex", "text", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "visible", "width"], outputs: ["onContentReady", "onDisposing", "onInitialized", "onOptionChanged", "onValueChanged", "accessKeyChange", "activeStateEnabledChange", "disabledChange", "elementAttrChange", "focusStateEnabledChange", "heightChange", "hintChange", "hoverStateEnabledChange", "iconSizeChange", "isValidChange", "nameChange", "readOnlyChange", "rtlEnabledChange", "tabIndexChange", "textChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "visibleChange", "widthChange", "onBlur"] }, { kind: "component", type: i6.DxSelectBoxComponent, selector: "dx-select-box", inputs: ["acceptCustomValue", "accessKey", "activeStateEnabled", "buttons", "dataSource", "deferRendering", "disabled", "displayExpr", "displayValue", "dropDownButtonTemplate", "dropDownOptions", "elementAttr", "fieldTemplate", "focusStateEnabled", "grouped", "groupTemplate", "height", "hint", "hoverStateEnabled", "inputAttr", "isValid", "items", "itemTemplate", "label", "labelMode", "maxLength", "minSearchLength", "name", "noDataText", "opened", "openOnFieldClick", "placeholder", "readOnly", "rtlEnabled", "searchEnabled", "searchExpr", "searchMode", "searchTimeout", "selectedItem", "showClearButton", "showDataBeforeSearch", "showDropDownButton", "showSelectionControls", "spellcheck", "stylingMode", "tabIndex", "text", "useItemTextAsTitle", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "valueChangeEvent", "valueExpr", "visible", "width", "wrapItemText"], outputs: ["onChange", "onClosed", "onContentReady", "onCopy", "onCustomItemCreating", "onCut", "onDisposing", "onEnterKey", "onFocusIn", "onFocusOut", "onInitialized", "onInput", "onItemClick", "onKeyDown", "onKeyUp", "onOpened", "onOptionChanged", "onPaste", "onSelectionChanged", "onValueChanged", "acceptCustomValueChange", "accessKeyChange", "activeStateEnabledChange", "buttonsChange", "dataSourceChange", "deferRenderingChange", "disabledChange", "displayExprChange", "displayValueChange", "dropDownButtonTemplateChange", "dropDownOptionsChange", "elementAttrChange", "fieldTemplateChange", "focusStateEnabledChange", "groupedChange", "groupTemplateChange", "heightChange", "hintChange", "hoverStateEnabledChange", "inputAttrChange", "isValidChange", "itemsChange", "itemTemplateChange", "labelChange", "labelModeChange", "maxLengthChange", "minSearchLengthChange", "nameChange", "noDataTextChange", "openedChange", "openOnFieldClickChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "searchEnabledChange", "searchExprChange", "searchModeChange", "searchTimeoutChange", "selectedItemChange", "showClearButtonChange", "showDataBeforeSearchChange", "showDropDownButtonChange", "showSelectionControlsChange", "spellcheckChange", "stylingModeChange", "tabIndexChange", "textChange", "useItemTextAsTitleChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "valueChangeEventChange", "valueExprChange", "visibleChange", "widthChange", "wrapItemTextChange", "onBlur"] }, { kind: "component", type: i7.DxTextBoxComponent, selector: "dx-text-box", inputs: ["accessKey", "activeStateEnabled", "buttons", "disabled", "elementAttr", "focusStateEnabled", "height", "hint", "hoverStateEnabled", "inputAttr", "isValid", "label", "labelMode", "mask", "maskChar", "maskInvalidMessage", "maskRules", "maxLength", "mode", "name", "placeholder", "readOnly", "rtlEnabled", "showClearButton", "showMaskMode", "spellcheck", "stylingMode", "tabIndex", "text", "useMaskedValue", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "valueChangeEvent", "visible", "width"], outputs: ["onChange", "onContentReady", "onCopy", "onCut", "onDisposing", "onEnterKey", "onFocusIn", "onFocusOut", "onInitialized", "onInput", "onKeyDown", "onKeyUp", "onOptionChanged", "onPaste", "onValueChanged", "accessKeyChange", "activeStateEnabledChange", "buttonsChange", "disabledChange", "elementAttrChange", "focusStateEnabledChange", "heightChange", "hintChange", "hoverStateEnabledChange", "inputAttrChange", "isValidChange", "labelChange", "labelModeChange", "maskChange", "maskCharChange", "maskInvalidMessageChange", "maskRulesChange", "maxLengthChange", "modeChange", "nameChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "showClearButtonChange", "showMaskModeChange", "spellcheckChange", "stylingModeChange", "tabIndexChange", "textChange", "useMaskedValueChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "valueChangeEventChange", "visibleChange", "widthChange", "onBlur"] }, { kind: "directive", type: i8.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i8.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
|
|
68
68
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: OflineMetricsComponent, decorators: [{
|
|
69
69
|
type: Component,
|
|
70
|
-
args: [{ selector: 'app-ofline-metrics', template: "<div class=\"flex flex-col flex-auto min-w-0 my-3\">\n <div class=\"text-lg py-2 font-extrabold border-b bg-gray-700 text-white px-2\"> Target\n </div>\n <div class=\"pt-2 border-x border-b \">\n <div class=\"flex flex-wrap p-2\">\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Database Name</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.target.databaseName\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> DB Config </div>\n <dx-select-box [items]=\"['mongo','impala','postgres','mysql','bigquery']\"\n (onValueChanged)=\"getDataConfig($event)\"\n [(ngModel)]=\"metricMainObject.target.dbConfig\"></dx-select-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Table Name</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.target.tableName\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Dimension Columns</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.target.dimensionColumns\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/3\">\n <div class=\"text-md mb-2\"> Measure Columns</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.target.measureColumns\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/3\">\n <div class=\"text-md mb-2\"> Partition Column</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.target.partitionColumn\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/3\">\n <div class=\"text-md mb-2\"> Write Disposition</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.target.writeDisposition\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/3\">\n <div class=\"text-md mb-2 mt-8\"></div>\n <dx-check-box text=\"Create Table\" [(ngModel)]=\"metricMainObject.target.createTable\"></dx-check-box>\n </div>\n </div>\n </div>\n</div>\n<div class=\"flex flex-col flex-auto min-w-0 my-3\">\n <div class=\"text-lg py-2 font-extrabold border-b bg-gray-700 text-white px-2\"> Source\n </div>\n <div class=\"pt-2 border-x border-b \">\n <div class=\"flex flex-wrap p-2\">\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Database Name</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.source.databaseName\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Db Config</div>\n <dx-select-box [items]=\"['mongo','impala','postgres','mysql','bigquery']\"\n (onValueChanged)=\"getDataConfig($event)\"\n [(ngModel)]=\"metricMainObject.target.dbConfig\"></dx-select-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Query Template</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.source.queryTemplate\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Query Template File</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.source.queryTemplateFile\"></dx-text-box>\n </div>\n </div>\n </div>\n</div>\n<div class=\"flex flex-col flex-auto min-w-0 my-2\">\n <div class=\"text-lg py-2 font-extrabold border-b bg-gray-700 text-white px-2\">Execution\n </div>\n <div class=\"pt-2 border-x border-b \">\n <div class=\"my-2 flex justify-between\"\n *ngFor=\"let item of metricMainObject.execution.arguments; let i = index;\">\n\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Argument Name</div>\n <dx-text-box [(ngModel)]=\"item.argumentName\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Label Name</div>\n <dx-text-box [(ngModel)]=\"item.labelName\"></dx-text-box>\n </div>\n\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Datatype</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"['date','string','timestamp','int', 'double', 'boolean']\"\n [(ngModel)]=\"item.dataType\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Function</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"functionNameContainer\"\n [(ngModel)]=\"item.function\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> runtimeValue</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"['static','dynamic']\"\n [(ngModel)]=\"item.runtimeValue\"></dx-select-box>\n </div>\n\n <div class=\"px-1 mt-7 text-center\">\n <button class=\"{{commonService.btn_danger_sm}} cursor-pointer\" (click)=\"deleteArguments(i)\"><i\n class=\"fa fa-trash-o\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n\n <div class=\"flex flex-row justify-end my-2\">\n <button class=\"{{commonService.btn_primary_sm}} cursor-pointer\" (click)=\"addArguments()\">Add\n Columns</button>\n </div>\n </div>\n</div>\n\n<div class=\"flex w-full justify-end mt-5 border-t\">\n <button class=\"{{commonService.btn_success_md}} cursor-pointer mx-1 my-2\" (click)=\"createOflineMetrics()\">\n Save Ofline Metrics\n </button>\n</div>" }]
|
|
70
|
+
args: [{ selector: 'app-ofline-metrics', template: "<div class=\"flex flex-col flex-auto min-w-0 my-3\">\n <div class=\"text-lg py-2 font-extrabold border-b bg-gray-700 text-white px-2\"> Basic\n </div>\n <div class=\"pt-2 border-x border-b \">\n <div class=\"flex flex-wrap p-2\">\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Runner</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.runner\"></dx-text-box>\n </div>\n \n </div>\n </div>\n</div>\n<div class=\"flex flex-col flex-auto min-w-0 my-3\">\n <div class=\"text-lg py-2 font-extrabold border-b bg-gray-700 text-white px-2\"> Target\n </div>\n <div class=\"pt-2 border-x border-b \">\n <div class=\"flex flex-wrap p-2\">\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Database Name</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.target.databaseName\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> DB Config </div>\n <dx-select-box [items]=\"['mongo','impala','postgres','mysql','bigquery']\"\n (onValueChanged)=\"getDataConfig($event)\"\n [(ngModel)]=\"metricMainObject.target.dbConfig\"></dx-select-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Table Name</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.target.tableName\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Dimension Columns</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.target.dimensionColumns\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/3\">\n <div class=\"text-md mb-2\"> Measure Columns</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.target.measureColumns\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/3\">\n <div class=\"text-md mb-2\"> Partition Column</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.target.partitionColumn\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/3\">\n <div class=\"text-md mb-2\"> Write Disposition</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.target.writeDisposition\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/3\">\n <div class=\"text-md mb-2 mt-8\"></div>\n <dx-check-box text=\"Create Table\" [(ngModel)]=\"metricMainObject.target.createTable\"></dx-check-box>\n </div>\n </div>\n </div>\n</div>\n<div class=\"flex flex-col flex-auto min-w-0 my-3\">\n <div class=\"text-lg py-2 font-extrabold border-b bg-gray-700 text-white px-2\"> Source\n </div>\n <div class=\"pt-2 border-x border-b \">\n <div class=\"flex flex-wrap p-2\">\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Database Name</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.source.databaseName\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Db Config</div>\n <dx-select-box [items]=\"['mongo','impala','postgres','mysql','bigquery']\"\n (onValueChanged)=\"getDataConfig($event)\"\n [(ngModel)]=\"metricMainObject.target.dbConfig\"></dx-select-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Query Template</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.source.queryTemplate\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Query Template File</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.source.queryTemplateFile\"></dx-text-box>\n </div>\n </div>\n </div>\n</div>\n\n<div class=\"flex flex-col flex-auto min-w-0 my-2\">\n <div class=\"text-lg py-2 font-extrabold border-b bg-gray-700 text-white px-2\">Execution\n </div>\n <div class=\"pt-2 border-x border-b \">\n\n <div class=\"flex flex-wrap p-2\">\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Type</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.execution.type\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Job GroupId</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.execution.jobGroupId\"></dx-text-box>\n </div>\n \n </div>\n\n <div class=\"my-2 flex justify-between\"\n *ngFor=\"let item of metricMainObject.execution.arguments; let i = index;\">\n\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Argument Name</div>\n <dx-text-box [(ngModel)]=\"item.argumentName\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Label Name</div>\n <dx-text-box [(ngModel)]=\"item.labelName\"></dx-text-box>\n </div>\n\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Datatype</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"['date','string','timestamp','int', 'double', 'boolean']\"\n [(ngModel)]=\"item.dataType\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Function</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"functionNameContainer\"\n [(ngModel)]=\"item.function\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> runtimeValue</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"['static','dynamic']\"\n [(ngModel)]=\"item.runtimeValue\"></dx-select-box>\n </div>\n\n <div class=\"px-1 mt-7 text-center\">\n <button class=\"{{commonService.btn_danger_sm}} cursor-pointer\" (click)=\"deleteArguments(i)\"><i\n class=\"fa fa-trash-o\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n\n <div class=\"flex flex-row justify-end my-2\">\n <button class=\"{{commonService.btn_primary_sm}} cursor-pointer\" (click)=\"addArguments()\">Add\n Columns</button>\n </div>\n </div>\n</div>\n\n<div class=\"flex w-full justify-end mt-5 border-t\">\n <button class=\"{{commonService.btn_success_md}} cursor-pointer mx-1 my-2\" (click)=\"createOflineMetrics()\">\n Save Ofline Metrics\n </button>\n</div>" }]
|
|
71
71
|
}], ctorParameters: function () { return [{ type: i1.CommonService }, { type: i2.ToastrService }, { type: i3.ApplicationContentService }]; }, propDecorators: { getMetRicOflineDataSet: [{
|
|
72
72
|
type: Output
|
|
73
73
|
}], onflineMetricData: [{
|
|
74
74
|
type: Input,
|
|
75
75
|
args: ['onflineMetricData']
|
|
76
76
|
}] } });
|
|
77
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2ZsaW5lLW1ldHJpY3MuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZ2FtbWEtYXBwLWNvbnRyb2xsZXIvc3JjL2xpYi9hcHBsaWNhdGlvbi1jb250cm9sbGVyL2FwcGxpY2F0aW9uLW1ldHJpYy1jb25maWcvb2ZsaW5lLW1ldHJpY3Mvb2ZsaW5lLW1ldHJpY3MuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZ2FtbWEtYXBwLWNvbnRyb2xsZXIvc3JjL2xpYi9hcHBsaWNhdGlvbi1jb250cm9sbGVyL2FwcGxpY2F0aW9uLW1ldHJpYy1jb25maWcvb2ZsaW5lLW1ldHJpY3Mvb2ZsaW5lLW1ldHJpY3MuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQzs7Ozs7Ozs7OztBQVUvRSxNQUFNLE9BQU8sc0JBQXNCO0lBc0NqQyxZQUFtQixhQUE0QixFQUFVLE1BQXFCLEVBQVUsT0FBa0M7UUFBdkcsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFBVSxXQUFNLEdBQU4sTUFBTSxDQUFlO1FBQVUsWUFBTyxHQUFQLE9BQU8sQ0FBMkI7UUFuQzFILHdCQUFtQixHQUFRLEVBQUUsQ0FBQztRQUM5QixnQkFBVyxHQUFZLEtBQUssQ0FBQztRQUM3QixnQkFBVyxHQUFZLEtBQUssQ0FBQztRQUM3Qix3QkFBbUIsR0FBUSxFQUFFLENBQUM7UUFDOUIsaUJBQVksR0FBUSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLGdCQUFnQixDQUFDLENBQUE7UUFDckYsaUJBQVksR0FBUSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUE7UUFDN0Qsd0JBQW1CLEdBQVEsRUFBRSxDQUFDO1FBQzlCLHVCQUFrQixHQUFRLEVBQUUsQ0FBQztRQUM3QiwyQkFBc0IsR0FBUSxFQUFFLENBQUM7UUFFakMsbUJBQWMsR0FBWSxLQUFLLENBQUM7UUFDaEMsb0JBQWUsR0FBWSxLQUFLLENBQUM7UUFFakMsa0JBQWEsR0FBWSxLQUFLLENBQUM7UUFDZCwyQkFBc0IsR0FBc0IsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNoRiwwQkFBcUIsR0FBRyxDQUFDLGVBQWUsRUFBRSxXQUFXLEVBQUUsYUFBYSxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxXQUFXLEVBQUUsY0FBYyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsZ0JBQWdCLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFFalQsMEJBQXFCLEdBQUcsRUFBRSxDQUFDO1FBRzNCLHNCQUFpQixHQUFZLEtBQUssQ0FBQztRQUVuQyxnQ0FBMkIsR0FBRyxFQUFFLENBQUM7UUFDakMscUJBQWdCLEdBQVEsRUFBRSxDQUFDO0lBWW1HLENBQUM7SUFQL0gsSUFDSSxpQkFBaUIsQ0FBQyxLQUFLO1FBQ3pCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7SUFDaEMsQ0FBQztJQU1ELFFBQVE7UUFDTixJQUFJLENBQUMsT0FBTyxDQUFDLDZCQUE2QixFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQzVELElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUM7UUFDbEMsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQsWUFBWTtRQUNWLElBQUksR0FBRyxHQUFHO1lBQ1IsY0FBYyxFQUFFLEVBQUU7WUFDbEIsV0FBVyxFQUFFLEVBQUU7WUFDZixjQUFjLEVBQUUsRUFBRTtZQUNsQixVQUFVLEVBQUUsRUFBRTtZQUNkLFVBQVUsRUFBRSxFQUFFO1NBQ2YsQ0FBQTtRQUNELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBR0QsZUFBZSxDQUFDLENBQUM7UUFDZixJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO0lBQ3hELENBQUM7SUFJRCxtQkFBbUI7UUFHakIsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQTtJQUN6RCxDQUFDO0lBSUQsYUFBYSxDQUFDLENBQUM7UUFDYixJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUU7WUFDWCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQztZQUNsQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO1NBQy9CO0lBRUgsQ0FBQzs7bUhBOUVVLHNCQUFzQjt1R0FBdEIsc0JBQXNCLDZLQ1ZuQyxvOExBc0hNOzJGRDVHTyxzQkFBc0I7a0JBTGxDLFNBQVM7K0JBQ0Usb0JBQW9CO3dLQXFCYixzQkFBc0I7c0JBQXRDLE1BQU07Z0JBZUgsaUJBQWlCO3NCQURwQixLQUFLO3VCQUFDLG1CQUFtQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFRvYXN0clNlcnZpY2UgfSBmcm9tICduZ3gtdG9hc3RyJztcbmltcG9ydCB7IEFwcGxpY2F0aW9uQ29udGVudFNlcnZpY2UgfSBmcm9tICcuLi8uLi9hcHBsaWNhdGlvbi1jb250ZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29tbW9uU2VydmljZSB9IGZyb20gJy4uLy4uL2NvbW1vbic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1vZmxpbmUtbWV0cmljcycsXG4gIHRlbXBsYXRlVXJsOiAnLi9vZmxpbmUtbWV0cmljcy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL29mbGluZS1tZXRyaWNzLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgT2ZsaW5lTWV0cmljc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIGxvYWRpbmdNb2RhbDogYm9vbGVhbjtcbiAgLy8gQElucHV0KCkgcXVlcnlCdWxkZXJEYXRhc2V0OiBhbnk7XG4gIHJlcUZpZWxkc0RhdGFTb3VyY2U6IGFueSA9IFtdO1xuICBpc3JlcUZpZWxkczogYm9vbGVhbiA9IGZhbHNlO1xuICBpc2NkclBhcmFtczogYm9vbGVhbiA9IGZhbHNlO1xuICBjZHJGaWVsZHNEYXRhU291cmNlOiBhbnkgPSBbXTtcbiAga3BpX2Z1bmN0aW9uOiBhbnkgPSBbXCJzdW1cIiwgXCJjb3VudFwiLCBcImF2Z1wiLCBcIm1heFwiLCBcIm1pblwiLCBcInN0ZGRldlwiLCBcImNvdW50X2Rpc3RpbmN0XCJdXG4gIGtwaV9vcGVyYXRvcjogYW55ID0gW1wiZXFcIiwgXCJndGVcIiwgXCJsdGVcIiwgXCJuZVwiLCBcImluXCIsIFwibm90SW5cIl1cbiAga3BpX2VucmljaG1lbnRfbmFtZTogYW55ID0gW107XG4gIHJlcVNob3J0RGF0YVNvdXJjZTogYW55ID0gW107XG4gIGZpbHRlck1hcGluZ0RhdGFzb3VyY2U6IGFueSA9IFtdO1xuICBxdWVyeV9kYXRhOiBhbnk7XG4gIGlzTW9kZWxWaXNpYmxlOiBib29sZWFuID0gZmFsc2U7XG4gIGlzU3FsQ29waWVkVGV4dDogYm9vbGVhbiA9IGZhbHNlO1xuICBxdWVyeUJ1bGRlckRhdGFzZXQ6IGFueTtcbiAgaXNSZWNvbkNvbHVtZTogYm9vbGVhbiA9IGZhbHNlO1xuICBAT3V0cHV0KCkgcHVibGljIGdldE1ldFJpY09mbGluZURhdGFTZXQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBmdW5jdGlvbk5hbWVDb250YWluZXIgPSBbXCJMQVNUREFZX1NUQVJUXCIsIFwiRF8xX1NUQVJUXCIsIFwiTEFTVERBWV9FTkRcIiwgXCJEXzFfRU5EXCIsIFwiTEFTVERBWTJfU1RBUlRcIiwgXCJEXzJfU1RBUlRcIiwgXCJMQVNUREFZMl9FTkRcIiwgXCJEXzJfRU5EXCIsIFwiRF83X1NUQVJUXCIsIFwiRF83X0VORFwiLCBcIlRPREFZX1NUQVJUXCIsIFwiVE9EQVlfRU5EXCIsIFwiV0VFS19TVEFSVFwiLCBcIldFRUtfRU5EXCIsIFwiTU9OVEhfU1RBUlRcIiwgXCJNT05USF9FTkRcIiwgXCJIT1VSX1NUQVJUXCIsIFwiSE9VUl9FTkRcIiwgXCJMQVNUSE9VUl9TVEFSVFwiLCBcIkxBU1RIT1VSX0VORFwiXTtcblxuICByZWNvbkNvbHVtZURhdGFzb3VyY2UgPSBbXTtcblxuICBzZWxlY3RlZERhdGFTb3VyY2U6IGFueTtcbiAgaXNRdWVyeVR5cGVTZWxlY3Q6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBtZXN1cmVzQW5kRGltZW50aW9uc0NvbHVtbnMgPSBbXTtcbiAgbWV0cmljTWFpbk9iamVjdDogYW55ID0ge307XG5cbiAgbWV0cmljdHlwZTogYW55O1xuXG5cbiAgQElucHV0KCdvbmZsaW5lTWV0cmljRGF0YScpXG4gIHNldCBvbmZsaW5lTWV0cmljRGF0YSh2YWx1ZSkge1xuICAgIHRoaXMubWV0cmljTWFpbk9iamVjdCA9IHZhbHVlO1xuICB9XG5cblxuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBjb21tb25TZXJ2aWNlOiBDb21tb25TZXJ2aWNlLCBwcml2YXRlIHRvYXN0cjogVG9hc3RyU2VydmljZSwgcHJpdmF0ZSBzZXJ2aWNlOiBBcHBsaWNhdGlvbkNvbnRlbnRTZXJ2aWNlKSB7IH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnNlcnZpY2UubGlzdENvbHVtbkVucmljaG1lbnRGdW5jdGlvbnMoKS5zdWJzY3JpYmUoZGF0YSA9PiB7XG4gICAgICB0aGlzLmtwaV9lbnJpY2htZW50X25hbWUgPSBkYXRhO1xuICAgIH0pXG4gIH1cblxuICBhZGRBcmd1bWVudHMoKSB7XG4gICAgbGV0IG9iaiA9IHtcbiAgICAgIFwiYXJndW1lbnROYW1lXCI6IFwiXCIsXG4gICAgICBcImxhYmVsTmFtZVwiOiBcIlwiLFxuICAgICAgXCJydW50aW1lVmFsdWVcIjogXCJcIixcbiAgICAgIFwiZGF0YVR5cGVcIjogXCJcIixcbiAgICAgIFwiZnVuY3Rpb25cIjogXCJcIlxuICAgIH1cbiAgICB0aGlzLm1ldHJpY01haW5PYmplY3QuZXhlY3V0aW9uLmFyZ3VtZW50cy5wdXNoKG9iaik7XG4gIH1cblxuXG4gIGRlbGV0ZUFyZ3VtZW50cyhpKSB7XG4gICAgdGhpcy5tZXRyaWNNYWluT2JqZWN0LmV4ZWN1dGlvbi5hcmd1bWVudHMuc3BsaWNlKGksIDEpXG4gIH1cblxuXG5cbiAgY3JlYXRlT2ZsaW5lTWV0cmljcygpIHtcblxuXG4gICAgdGhpcy5nZXRNZXRSaWNPZmxpbmVEYXRhU2V0LmVtaXQodGhpcy5tZXRyaWNNYWluT2JqZWN0KVxuICB9XG5cblxuXG4gIGdldERhdGFDb25maWcoZSkge1xuICAgIGlmIChlLmV2ZW50KSB7XG4gICAgICB0aGlzLnNlbGVjdGVkRGF0YVNvdXJjZSA9IGUudmFsdWU7XG4gICAgICB0aGlzLmlzUXVlcnlUeXBlU2VsZWN0ID0gdHJ1ZTtcbiAgICB9XG5cbiAgfVxuXG5cbn1cbiIsIjxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGZsZXgtYXV0byBtaW4tdy0wIG15LTNcIj5cbiAgICA8ZGl2IGNsYXNzPVwidGV4dC1sZyBweS0yIGZvbnQtZXh0cmFib2xkIGJvcmRlci1iIGJnLWdyYXktNzAwIHRleHQtd2hpdGUgcHgtMlwiPiBUYXJnZXRcbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwicHQtMiBib3JkZXIteCBib3JkZXItYiBcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC13cmFwIHAtMlwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTIgbWItMiB3LTEvMlwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj4gRGF0YWJhc2UgTmFtZTwvZGl2PlxuICAgICAgICAgICAgICAgIDxkeC10ZXh0LWJveCBbKG5nTW9kZWwpXT1cIm1ldHJpY01haW5PYmplY3QudGFyZ2V0LmRhdGFiYXNlTmFtZVwiPjwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0yIG1iLTIgdy0xLzJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+IERCIENvbmZpZyA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZHgtc2VsZWN0LWJveCBbaXRlbXNdPVwiWydtb25nbycsJ2ltcGFsYScsJ3Bvc3RncmVzJywnbXlzcWwnLCdiaWdxdWVyeSddXCJcbiAgICAgICAgICAgICAgICAgICAgKG9uVmFsdWVDaGFuZ2VkKT1cImdldERhdGFDb25maWcoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwibWV0cmljTWFpbk9iamVjdC50YXJnZXQuZGJDb25maWdcIj48L2R4LXNlbGVjdC1ib3g+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0yIG1iLTIgdy0xLzJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+IFRhYmxlIE5hbWU8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJtZXRyaWNNYWluT2JqZWN0LnRhcmdldC50YWJsZU5hbWVcIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMiBtYi0yIHctMS8yXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPiBEaW1lbnNpb24gQ29sdW1uczwvZGl2PlxuICAgICAgICAgICAgICAgIDxkeC10ZXh0LWJveCBbKG5nTW9kZWwpXT1cIm1ldHJpY01haW5PYmplY3QudGFyZ2V0LmRpbWVuc2lvbkNvbHVtbnNcIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMiBtYi0yIHctMS8zXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPiBNZWFzdXJlIENvbHVtbnM8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJtZXRyaWNNYWluT2JqZWN0LnRhcmdldC5tZWFzdXJlQ29sdW1uc1wiPjwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0yIG1iLTIgdy0xLzNcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+IFBhcnRpdGlvbiBDb2x1bW48L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJtZXRyaWNNYWluT2JqZWN0LnRhcmdldC5wYXJ0aXRpb25Db2x1bW5cIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMiBtYi0yIHctMS8zXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPiBXcml0ZSBEaXNwb3NpdGlvbjwvZGl2PlxuICAgICAgICAgICAgICAgIDxkeC10ZXh0LWJveCBbKG5nTW9kZWwpXT1cIm1ldHJpY01haW5PYmplY3QudGFyZ2V0LndyaXRlRGlzcG9zaXRpb25cIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMiBtYi0yIHctMS8zXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMiBtdC04XCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgPGR4LWNoZWNrLWJveCB0ZXh0PVwiQ3JlYXRlIFRhYmxlXCIgWyhuZ01vZGVsKV09XCJtZXRyaWNNYWluT2JqZWN0LnRhcmdldC5jcmVhdGVUYWJsZVwiPjwvZHgtY2hlY2stYm94PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9kaXY+XG48ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBmbGV4LWF1dG8gbWluLXctMCBteS0zXCI+XG4gICAgPGRpdiBjbGFzcz1cInRleHQtbGcgcHktMiBmb250LWV4dHJhYm9sZCBib3JkZXItYiBiZy1ncmF5LTcwMCB0ZXh0LXdoaXRlIHB4LTJcIj4gU291cmNlXG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cInB0LTIgYm9yZGVyLXggYm9yZGVyLWIgXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtd3JhcCBwLTJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0yIG1iLTIgdy0xLzJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+IERhdGFiYXNlIE5hbWU8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJtZXRyaWNNYWluT2JqZWN0LnNvdXJjZS5kYXRhYmFzZU5hbWVcIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMiBtYi0yIHctMS8yXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPiBEYiBDb25maWc8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZHgtc2VsZWN0LWJveCBbaXRlbXNdPVwiWydtb25nbycsJ2ltcGFsYScsJ3Bvc3RncmVzJywnbXlzcWwnLCdiaWdxdWVyeSddXCJcbiAgICAgICAgICAgICAgICAgICAgKG9uVmFsdWVDaGFuZ2VkKT1cImdldERhdGFDb25maWcoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwibWV0cmljTWFpbk9iamVjdC50YXJnZXQuZGJDb25maWdcIj48L2R4LXNlbGVjdC1ib3g+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0yIG1iLTIgdy0xLzJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+IFF1ZXJ5IFRlbXBsYXRlPC9kaXY+XG4gICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwibWV0cmljTWFpbk9iamVjdC5zb3VyY2UucXVlcnlUZW1wbGF0ZVwiPjwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0yIG1iLTIgdy0xLzJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+IFF1ZXJ5IFRlbXBsYXRlIEZpbGU8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJtZXRyaWNNYWluT2JqZWN0LnNvdXJjZS5xdWVyeVRlbXBsYXRlRmlsZVwiPjwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG48L2Rpdj5cbjxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGZsZXgtYXV0byBtaW4tdy0wIG15LTJcIj5cbiAgICA8ZGl2IGNsYXNzPVwidGV4dC1sZyBweS0yIGZvbnQtZXh0cmFib2xkIGJvcmRlci1iIGJnLWdyYXktNzAwIHRleHQtd2hpdGUgcHgtMlwiPkV4ZWN1dGlvblxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJwdC0yIGJvcmRlci14IGJvcmRlci1iIFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibXktMiBmbGV4IGp1c3RpZnktYmV0d2VlblwiXG4gICAgICAgICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBtZXRyaWNNYWluT2JqZWN0LmV4ZWN1dGlvbi5hcmd1bWVudHM7IGxldCBpID0gaW5kZXg7XCI+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0xIG1iLTIgdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPiBBcmd1bWVudCBOYW1lPC9kaXY+XG4gICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwiaXRlbS5hcmd1bWVudE5hbWVcIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMSBtYi0yIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj4gTGFiZWwgTmFtZTwvZGl2PlxuICAgICAgICAgICAgICAgIDxkeC10ZXh0LWJveCBbKG5nTW9kZWwpXT1cIml0ZW0ubGFiZWxOYW1lXCI+PC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMSBtYi0yIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj4gRGF0YXR5cGU8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZHgtc2VsZWN0LWJveCBbc2VhcmNoRW5hYmxlZF09XCJ0cnVlXCIgW2l0ZW1zXT1cIlsnZGF0ZScsJ3N0cmluZycsJ3RpbWVzdGFtcCcsJ2ludCcsICdkb3VibGUnLCAnYm9vbGVhbiddXCJcbiAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJpdGVtLmRhdGFUeXBlXCI+PC9keC1zZWxlY3QtYm94PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMSBtYi0yIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj4gRnVuY3Rpb248L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZHgtc2VsZWN0LWJveCBbc2VhcmNoRW5hYmxlZF09XCJ0cnVlXCIgW2l0ZW1zXT1cImZ1bmN0aW9uTmFtZUNvbnRhaW5lclwiXG4gICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiaXRlbS5mdW5jdGlvblwiPjwvZHgtc2VsZWN0LWJveD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTEgbWItMiB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+IHJ1bnRpbWVWYWx1ZTwvZGl2PlxuICAgICAgICAgICAgICAgIDxkeC1zZWxlY3QtYm94IFtzZWFyY2hFbmFibGVkXT1cInRydWVcIiBbaXRlbXNdPVwiWydzdGF0aWMnLCdkeW5hbWljJ11cIlxuICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIml0ZW0ucnVudGltZVZhbHVlXCI+PC9keC1zZWxlY3QtYm94PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0xIG10LTcgdGV4dC1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl9kYW5nZXJfc219fSBjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJkZWxldGVBcmd1bWVudHMoaSlcIj48aVxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYSBmYS10cmFzaC1vXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGp1c3RpZnktZW5kIG15LTJcIj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX3ByaW1hcnlfc219fSBjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJhZGRBcmd1bWVudHMoKVwiPkFkZFxuICAgICAgICAgICAgICAgIENvbHVtbnM8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG48L2Rpdj5cblxuPGRpdiBjbGFzcz1cImZsZXggdy1mdWxsIGp1c3RpZnktZW5kIG10LTUgYm9yZGVyLXRcIj5cbiAgICA8YnV0dG9uIGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl9zdWNjZXNzX21kfX0gY3Vyc29yLXBvaW50ZXIgbXgtMSBteS0yXCIgKGNsaWNrKT1cImNyZWF0ZU9mbGluZU1ldHJpY3MoKVwiPlxuICAgICAgICBTYXZlIE9mbGluZSBNZXRyaWNzXG4gICAgPC9idXR0b24+XG48L2Rpdj4iXX0=
|
|
77
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2ZsaW5lLW1ldHJpY3MuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZ2FtbWEtYXBwLWNvbnRyb2xsZXIvc3JjL2xpYi9hcHBsaWNhdGlvbi1jb250cm9sbGVyL2FwcGxpY2F0aW9uLW1ldHJpYy1jb25maWcvb2ZsaW5lLW1ldHJpY3Mvb2ZsaW5lLW1ldHJpY3MuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZ2FtbWEtYXBwLWNvbnRyb2xsZXIvc3JjL2xpYi9hcHBsaWNhdGlvbi1jb250cm9sbGVyL2FwcGxpY2F0aW9uLW1ldHJpYy1jb25maWcvb2ZsaW5lLW1ldHJpY3Mvb2ZsaW5lLW1ldHJpY3MuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQzs7Ozs7Ozs7OztBQVUvRSxNQUFNLE9BQU8sc0JBQXNCO0lBc0NqQyxZQUFtQixhQUE0QixFQUFVLE1BQXFCLEVBQVUsT0FBa0M7UUFBdkcsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFBVSxXQUFNLEdBQU4sTUFBTSxDQUFlO1FBQVUsWUFBTyxHQUFQLE9BQU8sQ0FBMkI7UUFuQzFILHdCQUFtQixHQUFRLEVBQUUsQ0FBQztRQUM5QixnQkFBVyxHQUFZLEtBQUssQ0FBQztRQUM3QixnQkFBVyxHQUFZLEtBQUssQ0FBQztRQUM3Qix3QkFBbUIsR0FBUSxFQUFFLENBQUM7UUFDOUIsaUJBQVksR0FBUSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLGdCQUFnQixDQUFDLENBQUE7UUFDckYsaUJBQVksR0FBUSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUE7UUFDN0Qsd0JBQW1CLEdBQVEsRUFBRSxDQUFDO1FBQzlCLHVCQUFrQixHQUFRLEVBQUUsQ0FBQztRQUM3QiwyQkFBc0IsR0FBUSxFQUFFLENBQUM7UUFFakMsbUJBQWMsR0FBWSxLQUFLLENBQUM7UUFDaEMsb0JBQWUsR0FBWSxLQUFLLENBQUM7UUFFakMsa0JBQWEsR0FBWSxLQUFLLENBQUM7UUFDZCwyQkFBc0IsR0FBc0IsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNoRiwwQkFBcUIsR0FBRyxDQUFDLGVBQWUsRUFBRSxXQUFXLEVBQUUsYUFBYSxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxXQUFXLEVBQUUsY0FBYyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsZ0JBQWdCLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFFalQsMEJBQXFCLEdBQUcsRUFBRSxDQUFDO1FBRzNCLHNCQUFpQixHQUFZLEtBQUssQ0FBQztRQUVuQyxnQ0FBMkIsR0FBRyxFQUFFLENBQUM7UUFDakMscUJBQWdCLEdBQVEsRUFBRSxDQUFDO0lBWW1HLENBQUM7SUFQL0gsSUFDSSxpQkFBaUIsQ0FBQyxLQUFLO1FBQ3pCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7SUFDaEMsQ0FBQztJQU1ELFFBQVE7UUFDTixJQUFJLENBQUMsT0FBTyxDQUFDLDZCQUE2QixFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQzVELElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUM7UUFDbEMsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQsWUFBWTtRQUNWLElBQUksR0FBRyxHQUFHO1lBQ1IsY0FBYyxFQUFFLEVBQUU7WUFDbEIsV0FBVyxFQUFFLEVBQUU7WUFDZixjQUFjLEVBQUUsRUFBRTtZQUNsQixVQUFVLEVBQUUsRUFBRTtZQUNkLFVBQVUsRUFBRSxFQUFFO1NBQ2YsQ0FBQTtRQUNELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBR0QsZUFBZSxDQUFDLENBQUM7UUFDZixJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO0lBQ3hELENBQUM7SUFJRCxtQkFBbUI7UUFHakIsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQTtJQUN6RCxDQUFDO0lBSUQsYUFBYSxDQUFDLENBQUM7UUFDYixJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUU7WUFDWCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQztZQUNsQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO1NBQy9CO0lBRUgsQ0FBQzs7bUhBOUVVLHNCQUFzQjt1R0FBdEIsc0JBQXNCLDZLQ1ZuQyx1OE5BaUpNOzJGRHZJTyxzQkFBc0I7a0JBTGxDLFNBQVM7K0JBQ0Usb0JBQW9CO3dLQXFCYixzQkFBc0I7c0JBQXRDLE1BQU07Z0JBZUgsaUJBQWlCO3NCQURwQixLQUFLO3VCQUFDLG1CQUFtQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFRvYXN0clNlcnZpY2UgfSBmcm9tICduZ3gtdG9hc3RyJztcbmltcG9ydCB7IEFwcGxpY2F0aW9uQ29udGVudFNlcnZpY2UgfSBmcm9tICcuLi8uLi9hcHBsaWNhdGlvbi1jb250ZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29tbW9uU2VydmljZSB9IGZyb20gJy4uLy4uL2NvbW1vbic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1vZmxpbmUtbWV0cmljcycsXG4gIHRlbXBsYXRlVXJsOiAnLi9vZmxpbmUtbWV0cmljcy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL29mbGluZS1tZXRyaWNzLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgT2ZsaW5lTWV0cmljc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIGxvYWRpbmdNb2RhbDogYm9vbGVhbjtcbiAgLy8gQElucHV0KCkgcXVlcnlCdWxkZXJEYXRhc2V0OiBhbnk7XG4gIHJlcUZpZWxkc0RhdGFTb3VyY2U6IGFueSA9IFtdO1xuICBpc3JlcUZpZWxkczogYm9vbGVhbiA9IGZhbHNlO1xuICBpc2NkclBhcmFtczogYm9vbGVhbiA9IGZhbHNlO1xuICBjZHJGaWVsZHNEYXRhU291cmNlOiBhbnkgPSBbXTtcbiAga3BpX2Z1bmN0aW9uOiBhbnkgPSBbXCJzdW1cIiwgXCJjb3VudFwiLCBcImF2Z1wiLCBcIm1heFwiLCBcIm1pblwiLCBcInN0ZGRldlwiLCBcImNvdW50X2Rpc3RpbmN0XCJdXG4gIGtwaV9vcGVyYXRvcjogYW55ID0gW1wiZXFcIiwgXCJndGVcIiwgXCJsdGVcIiwgXCJuZVwiLCBcImluXCIsIFwibm90SW5cIl1cbiAga3BpX2VucmljaG1lbnRfbmFtZTogYW55ID0gW107XG4gIHJlcVNob3J0RGF0YVNvdXJjZTogYW55ID0gW107XG4gIGZpbHRlck1hcGluZ0RhdGFzb3VyY2U6IGFueSA9IFtdO1xuICBxdWVyeV9kYXRhOiBhbnk7XG4gIGlzTW9kZWxWaXNpYmxlOiBib29sZWFuID0gZmFsc2U7XG4gIGlzU3FsQ29waWVkVGV4dDogYm9vbGVhbiA9IGZhbHNlO1xuICBxdWVyeUJ1bGRlckRhdGFzZXQ6IGFueTtcbiAgaXNSZWNvbkNvbHVtZTogYm9vbGVhbiA9IGZhbHNlO1xuICBAT3V0cHV0KCkgcHVibGljIGdldE1ldFJpY09mbGluZURhdGFTZXQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBmdW5jdGlvbk5hbWVDb250YWluZXIgPSBbXCJMQVNUREFZX1NUQVJUXCIsIFwiRF8xX1NUQVJUXCIsIFwiTEFTVERBWV9FTkRcIiwgXCJEXzFfRU5EXCIsIFwiTEFTVERBWTJfU1RBUlRcIiwgXCJEXzJfU1RBUlRcIiwgXCJMQVNUREFZMl9FTkRcIiwgXCJEXzJfRU5EXCIsIFwiRF83X1NUQVJUXCIsIFwiRF83X0VORFwiLCBcIlRPREFZX1NUQVJUXCIsIFwiVE9EQVlfRU5EXCIsIFwiV0VFS19TVEFSVFwiLCBcIldFRUtfRU5EXCIsIFwiTU9OVEhfU1RBUlRcIiwgXCJNT05USF9FTkRcIiwgXCJIT1VSX1NUQVJUXCIsIFwiSE9VUl9FTkRcIiwgXCJMQVNUSE9VUl9TVEFSVFwiLCBcIkxBU1RIT1VSX0VORFwiXTtcblxuICByZWNvbkNvbHVtZURhdGFzb3VyY2UgPSBbXTtcblxuICBzZWxlY3RlZERhdGFTb3VyY2U6IGFueTtcbiAgaXNRdWVyeVR5cGVTZWxlY3Q6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBtZXN1cmVzQW5kRGltZW50aW9uc0NvbHVtbnMgPSBbXTtcbiAgbWV0cmljTWFpbk9iamVjdDogYW55ID0ge307XG5cbiAgbWV0cmljdHlwZTogYW55O1xuXG5cbiAgQElucHV0KCdvbmZsaW5lTWV0cmljRGF0YScpXG4gIHNldCBvbmZsaW5lTWV0cmljRGF0YSh2YWx1ZSkge1xuICAgIHRoaXMubWV0cmljTWFpbk9iamVjdCA9IHZhbHVlO1xuICB9XG5cblxuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBjb21tb25TZXJ2aWNlOiBDb21tb25TZXJ2aWNlLCBwcml2YXRlIHRvYXN0cjogVG9hc3RyU2VydmljZSwgcHJpdmF0ZSBzZXJ2aWNlOiBBcHBsaWNhdGlvbkNvbnRlbnRTZXJ2aWNlKSB7IH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnNlcnZpY2UubGlzdENvbHVtbkVucmljaG1lbnRGdW5jdGlvbnMoKS5zdWJzY3JpYmUoZGF0YSA9PiB7XG4gICAgICB0aGlzLmtwaV9lbnJpY2htZW50X25hbWUgPSBkYXRhO1xuICAgIH0pXG4gIH1cblxuICBhZGRBcmd1bWVudHMoKSB7XG4gICAgbGV0IG9iaiA9IHtcbiAgICAgIFwiYXJndW1lbnROYW1lXCI6IFwiXCIsXG4gICAgICBcImxhYmVsTmFtZVwiOiBcIlwiLFxuICAgICAgXCJydW50aW1lVmFsdWVcIjogXCJcIixcbiAgICAgIFwiZGF0YVR5cGVcIjogXCJcIixcbiAgICAgIFwiZnVuY3Rpb25cIjogXCJcIlxuICAgIH1cbiAgICB0aGlzLm1ldHJpY01haW5PYmplY3QuZXhlY3V0aW9uLmFyZ3VtZW50cy5wdXNoKG9iaik7XG4gIH1cblxuXG4gIGRlbGV0ZUFyZ3VtZW50cyhpKSB7XG4gICAgdGhpcy5tZXRyaWNNYWluT2JqZWN0LmV4ZWN1dGlvbi5hcmd1bWVudHMuc3BsaWNlKGksIDEpXG4gIH1cblxuXG5cbiAgY3JlYXRlT2ZsaW5lTWV0cmljcygpIHtcblxuXG4gICAgdGhpcy5nZXRNZXRSaWNPZmxpbmVEYXRhU2V0LmVtaXQodGhpcy5tZXRyaWNNYWluT2JqZWN0KVxuICB9XG5cblxuXG4gIGdldERhdGFDb25maWcoZSkge1xuICAgIGlmIChlLmV2ZW50KSB7XG4gICAgICB0aGlzLnNlbGVjdGVkRGF0YVNvdXJjZSA9IGUudmFsdWU7XG4gICAgICB0aGlzLmlzUXVlcnlUeXBlU2VsZWN0ID0gdHJ1ZTtcbiAgICB9XG5cbiAgfVxuXG5cbn1cbiIsIjxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGZsZXgtYXV0byBtaW4tdy0wIG15LTNcIj5cbiAgICA8ZGl2IGNsYXNzPVwidGV4dC1sZyBweS0yIGZvbnQtZXh0cmFib2xkIGJvcmRlci1iIGJnLWdyYXktNzAwIHRleHQtd2hpdGUgcHgtMlwiPiBCYXNpY1xuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJwdC0yIGJvcmRlci14IGJvcmRlci1iIFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXdyYXAgcC0yXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMiBtYi0yIHctMS8yXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPiBSdW5uZXI8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJtZXRyaWNNYWluT2JqZWN0LnJ1bm5lclwiPjwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgXG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9kaXY+XG48ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBmbGV4LWF1dG8gbWluLXctMCBteS0zXCI+XG4gICAgPGRpdiBjbGFzcz1cInRleHQtbGcgcHktMiBmb250LWV4dHJhYm9sZCBib3JkZXItYiBiZy1ncmF5LTcwMCB0ZXh0LXdoaXRlIHB4LTJcIj4gVGFyZ2V0XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cInB0LTIgYm9yZGVyLXggYm9yZGVyLWIgXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtd3JhcCBwLTJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0yIG1iLTIgdy0xLzJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+IERhdGFiYXNlIE5hbWU8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJtZXRyaWNNYWluT2JqZWN0LnRhcmdldC5kYXRhYmFzZU5hbWVcIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMiBtYi0yIHctMS8yXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPiBEQiBDb25maWcgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGR4LXNlbGVjdC1ib3ggW2l0ZW1zXT1cIlsnbW9uZ28nLCdpbXBhbGEnLCdwb3N0Z3JlcycsJ215c3FsJywnYmlncXVlcnknXVwiXG4gICAgICAgICAgICAgICAgICAgIChvblZhbHVlQ2hhbmdlZCk9XCJnZXREYXRhQ29uZmlnKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIm1ldHJpY01haW5PYmplY3QudGFyZ2V0LmRiQ29uZmlnXCI+PC9keC1zZWxlY3QtYm94PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMiBtYi0yIHctMS8yXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPiBUYWJsZSBOYW1lPC9kaXY+XG4gICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwibWV0cmljTWFpbk9iamVjdC50YXJnZXQudGFibGVOYW1lXCI+PC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTIgbWItMiB3LTEvMlwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj4gRGltZW5zaW9uIENvbHVtbnM8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJtZXRyaWNNYWluT2JqZWN0LnRhcmdldC5kaW1lbnNpb25Db2x1bW5zXCI+PC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTIgbWItMiB3LTEvM1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj4gTWVhc3VyZSBDb2x1bW5zPC9kaXY+XG4gICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwibWV0cmljTWFpbk9iamVjdC50YXJnZXQubWVhc3VyZUNvbHVtbnNcIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMiBtYi0yIHctMS8zXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPiBQYXJ0aXRpb24gQ29sdW1uPC9kaXY+XG4gICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwibWV0cmljTWFpbk9iamVjdC50YXJnZXQucGFydGl0aW9uQ29sdW1uXCI+PC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTIgbWItMiB3LTEvM1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj4gV3JpdGUgRGlzcG9zaXRpb248L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJtZXRyaWNNYWluT2JqZWN0LnRhcmdldC53cml0ZURpc3Bvc2l0aW9uXCI+PC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTIgbWItMiB3LTEvM1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTIgbXQtOFwiPjwvZGl2PlxuICAgICAgICAgICAgICAgIDxkeC1jaGVjay1ib3ggdGV4dD1cIkNyZWF0ZSBUYWJsZVwiIFsobmdNb2RlbCldPVwibWV0cmljTWFpbk9iamVjdC50YXJnZXQuY3JlYXRlVGFibGVcIj48L2R4LWNoZWNrLWJveD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZmxleC1hdXRvIG1pbi13LTAgbXktM1wiPlxuICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWxnIHB5LTIgZm9udC1leHRyYWJvbGQgYm9yZGVyLWIgYmctZ3JheS03MDAgdGV4dC13aGl0ZSBweC0yXCI+IFNvdXJjZVxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJwdC0yIGJvcmRlci14IGJvcmRlci1iIFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXdyYXAgcC0yXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMiBtYi0yIHctMS8yXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPiBEYXRhYmFzZSBOYW1lPC9kaXY+XG4gICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwibWV0cmljTWFpbk9iamVjdC5zb3VyY2UuZGF0YWJhc2VOYW1lXCI+PC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTIgbWItMiB3LTEvMlwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj4gRGIgQ29uZmlnPC9kaXY+XG4gICAgICAgICAgICAgICAgPGR4LXNlbGVjdC1ib3ggW2l0ZW1zXT1cIlsnbW9uZ28nLCdpbXBhbGEnLCdwb3N0Z3JlcycsJ215c3FsJywnYmlncXVlcnknXVwiXG4gICAgICAgICAgICAgICAgICAgIChvblZhbHVlQ2hhbmdlZCk9XCJnZXREYXRhQ29uZmlnKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIm1ldHJpY01haW5PYmplY3QudGFyZ2V0LmRiQ29uZmlnXCI+PC9keC1zZWxlY3QtYm94PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMiBtYi0yIHctMS8yXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPiBRdWVyeSBUZW1wbGF0ZTwvZGl2PlxuICAgICAgICAgICAgICAgIDxkeC10ZXh0LWJveCBbKG5nTW9kZWwpXT1cIm1ldHJpY01haW5PYmplY3Quc291cmNlLnF1ZXJ5VGVtcGxhdGVcIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMiBtYi0yIHctMS8yXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPiBRdWVyeSBUZW1wbGF0ZSBGaWxlPC9kaXY+XG4gICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwibWV0cmljTWFpbk9iamVjdC5zb3VyY2UucXVlcnlUZW1wbGF0ZUZpbGVcIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9kaXY+XG5cbjxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGZsZXgtYXV0byBtaW4tdy0wIG15LTJcIj5cbiAgICA8ZGl2IGNsYXNzPVwidGV4dC1sZyBweS0yIGZvbnQtZXh0cmFib2xkIGJvcmRlci1iIGJnLWdyYXktNzAwIHRleHQtd2hpdGUgcHgtMlwiPkV4ZWN1dGlvblxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJwdC0yIGJvcmRlci14IGJvcmRlci1iIFwiPlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtd3JhcCBwLTJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0yIG1iLTIgdy0xLzJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+IFR5cGU8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJtZXRyaWNNYWluT2JqZWN0LmV4ZWN1dGlvbi50eXBlXCI+PC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTIgbWItMiB3LTEvMlwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj4gSm9iIEdyb3VwSWQ8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJtZXRyaWNNYWluT2JqZWN0LmV4ZWN1dGlvbi5qb2JHcm91cElkXCI+PC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICBcbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm15LTIgZmxleCBqdXN0aWZ5LWJldHdlZW5cIlxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgbWV0cmljTWFpbk9iamVjdC5leGVjdXRpb24uYXJndW1lbnRzOyBsZXQgaSA9IGluZGV4O1wiPlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMSBtYi0yIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj4gQXJndW1lbnQgTmFtZTwvZGl2PlxuICAgICAgICAgICAgICAgIDxkeC10ZXh0LWJveCBbKG5nTW9kZWwpXT1cIml0ZW0uYXJndW1lbnROYW1lXCI+PC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTEgbWItMiB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+IExhYmVsIE5hbWU8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJpdGVtLmxhYmVsTmFtZVwiPjwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTEgbWItMiB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+IERhdGF0eXBlPC9kaXY+XG4gICAgICAgICAgICAgICAgPGR4LXNlbGVjdC1ib3ggW3NlYXJjaEVuYWJsZWRdPVwidHJ1ZVwiIFtpdGVtc109XCJbJ2RhdGUnLCdzdHJpbmcnLCd0aW1lc3RhbXAnLCdpbnQnLCAnZG91YmxlJywgJ2Jvb2xlYW4nXVwiXG4gICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiaXRlbS5kYXRhVHlwZVwiPjwvZHgtc2VsZWN0LWJveD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTEgbWItMiB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+IEZ1bmN0aW9uPC9kaXY+XG4gICAgICAgICAgICAgICAgPGR4LXNlbGVjdC1ib3ggW3NlYXJjaEVuYWJsZWRdPVwidHJ1ZVwiIFtpdGVtc109XCJmdW5jdGlvbk5hbWVDb250YWluZXJcIlxuICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIml0ZW0uZnVuY3Rpb25cIj48L2R4LXNlbGVjdC1ib3g+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0xIG1iLTIgdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPiBydW50aW1lVmFsdWU8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZHgtc2VsZWN0LWJveCBbc2VhcmNoRW5hYmxlZF09XCJ0cnVlXCIgW2l0ZW1zXT1cIlsnc3RhdGljJywnZHluYW1pYyddXCJcbiAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJpdGVtLnJ1bnRpbWVWYWx1ZVwiPjwvZHgtc2VsZWN0LWJveD5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMSBtdC03IHRleHQtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fZGFuZ2VyX3NtfX0gY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwiZGVsZXRlQXJndW1lbnRzKGkpXCI+PGlcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmEgZmEtdHJhc2gtb1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBqdXN0aWZ5LWVuZCBteS0yXCI+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl9wcmltYXJ5X3NtfX0gY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwiYWRkQXJndW1lbnRzKClcIj5BZGRcbiAgICAgICAgICAgICAgICBDb2x1bW5zPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9kaXY+XG5cbjxkaXYgY2xhc3M9XCJmbGV4IHctZnVsbCBqdXN0aWZ5LWVuZCBtdC01IGJvcmRlci10XCI+XG4gICAgPGJ1dHRvbiBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fc3VjY2Vzc19tZH19IGN1cnNvci1wb2ludGVyIG14LTEgbXktMlwiIChjbGljayk9XCJjcmVhdGVPZmxpbmVNZXRyaWNzKClcIj5cbiAgICAgICAgU2F2ZSBPZmxpbmUgTWV0cmljc1xuICAgIDwvYnV0dG9uPlxuPC9kaXY+Il19
|
|
@@ -57,6 +57,8 @@ export class OnlineMetricsComponent {
|
|
|
57
57
|
"fieldName": "",
|
|
58
58
|
"aliasName": "",
|
|
59
59
|
"dataType": "",
|
|
60
|
+
"format": "",
|
|
61
|
+
"method": "",
|
|
60
62
|
"type": ""
|
|
61
63
|
};
|
|
62
64
|
this.mesuresAndDimentionsColumns.push(obj);
|
|
@@ -156,14 +158,14 @@ export class OnlineMetricsComponent {
|
|
|
156
158
|
}
|
|
157
159
|
}
|
|
158
160
|
OnlineMetricsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: OnlineMetricsComponent, deps: [{ token: i1.CommonService }, { token: i2.ToastrService }, { token: i3.ApplicationContentService }], target: i0.ɵɵFactoryTarget.Component });
|
|
159
|
-
OnlineMetricsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: OnlineMetricsComponent, selector: "app-online-metrics", inputs: { onlineMetricData: "onlineMetricData" }, outputs: { getMetRicOnlineDataSet: "getMetRicOnlineDataSet" }, ngImport: i0, template: "<div class=\"flex flex-col flex-auto min-w-0 my-3\">\n <div class=\"text-lg py-2 font-extrabold border-b bg-gray-700 text-white px-2\"> Target\n </div>\n <div class=\"pt-2 border-x border-b \">\n <div class=\"flex flex-wrap p-2\">\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Database Name</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.target.databaseName\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> DB Config </div>\n <dx-select-box [items]=\"['mongo','impala','postgres','mysql','bigquery']\"\n (onValueChanged)=\"getDataConfig($event)\"\n [(ngModel)]=\"metricMainObject.target.dbConfig\"></dx-select-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Table Name</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.target.tableName\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Dimension Columns</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.target.dimensionColumns\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/3\">\n <div class=\"text-md mb-2\"> Measure Columns</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.target.measureColumns\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/3\">\n <div class=\"text-md mb-2\"> Write Disposition</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.target.writeDisposition\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/3\">\n <div class=\"text-md mb-2 mt-8\"></div>\n <dx-check-box text=\"Create Table\" [(ngModel)]=\"metricMainObject.target.createTable\"></dx-check-box>\n </div>\n </div>\n </div>\n</div>\n<div class=\"flex flex-col flex-auto min-w-0 my-3\">\n <div class=\"text-lg py-2 font-extrabold border-b bg-gray-700 text-white px-2\"> Source\n </div>\n <div class=\"pt-2 border-x border-b \">\n <div class=\"flex flex-wrap p-2\">\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Data Source Name</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.source.datasource\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Event Name</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.source.eventName\"></dx-text-box>\n </div>\n </div>\n </div>\n</div>\n<div class=\"flex flex-col flex-auto min-w-0 my-2\">\n <div class=\"text-lg py-2 font-extrabold border-b bg-gray-700 text-white px-2\">Measures and\n Dimensions\n </div>\n <div class=\"pt-2 border-x border-b \">\n <div class=\"my-2 flex justify-between\" *ngFor=\"let item of mesuresAndDimentionsColumns; let i = index;\">\n <div class=\"px-1 mb-2\">\n <div class=\"text-md mb-2\"> Measures</div>\n <dx-check-box [value]=\"item.measures\" [(ngModel)]=\"item.measures\"></dx-check-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Value Field(aliasName)</div>\n <dx-text-box [(ngModel)]=\"item.aliasName\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Server Column Name</div>\n <dx-text-box [(ngModel)]=\"item.fieldName\"></dx-text-box>\n </div>\n <!-- <div class=\"px-1 mb-2\">\n <div class=\"text-md mb-2\"> Function Name</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"kpi_function\"\n [(ngModel)]=\"item.functionName\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-2\">\n <div class=\"text-md mb-2\"> Enrich Name</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"kpi_enrichment_name\"\n [(ngModel)]=\"item.enrichFunction\"></dx-select-box>\n </div> -->\n <!-- <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Advanced Column</div>\n <dx-text-box [(ngModel)]=\"item.advancedColumn\"></dx-text-box>\n </div> -->\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Datatype</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"['date','string','timestamp','int', 'double', 'boolean']\"\n [(ngModel)]=\"item.dataType\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Type</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"kpi_function\" [(ngModel)]=\"item.type\"></dx-select-box>\n </div>\n\n <div class=\"px-1 mt-7 text-center\">\n <button class=\"{{commonService.btn_danger_sm}} cursor-pointer\" (click)=\"deleteColumns(i)\"><i\n class=\"fa fa-trash-o\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n\n <div class=\"flex flex-row justify-end my-2\">\n <button class=\"{{commonService.btn_primary_sm}} cursor-pointer\" (click)=\"addColumns()\">Add\n Columns</button>\n </div>\n </div>\n</div>\n<div class=\"flex flex-col flex-auto min-w-0 my-2\">\n <div class=\"text-lg py-2 font-extrabold border-b bg-gray-700 text-white px-2\"> Filter Maping\n </div>\n <div class=\"pt-2 border-x border-b \">\n <div class=\"my-2 flex flex-row justify-between\"\n *ngFor=\"let item of metricMainObject.source.filters; let i = index;\">\n\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Field Name</div>\n <dx-text-box [(ngModel)]=\"item.fieldName\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Operation</div>\n <dx-text-box [(ngModel)]=\"item.operation\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Threshold</div>\n <dx-text-box [(ngModel)]=\"item.threshold\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Comparator</div>\n <dx-select-box [(ngModel)]=\"item.comparator\" [items]=\"kpi_operator\"></dx-select-box>\n </div>\n\n <div class=\"px-1 mt-7 text-center\">\n <button class=\"{{commonService.btn_danger_sm}} cursor-pointer\" (click)=\"deleteFilterMapingColumns(i)\"><i\n class=\"fa fa-trash-o\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n\n <div class=\"flex flex-row\">\n <div class=\"w-full\">\n <div class=\"flex flex-row justify-end my-2\">\n <button class=\"{{commonService.btn_primary_sm}} cursor-pointer\"\n (click)=\"addFilterMapingColumns()\">Add\n Maping</button>\n </div>\n </div>\n </div>\n </div>\n</div>\n<div class=\"flex flex-col flex-auto min-w-0 my-2\">\n <div class=\"text-lg py-2 font-extrabold border-b bg-gray-700 text-white px-2\"> Exclusions\n </div>\n <div class=\"pt-2 border-x border-b \">\n <div class=\"my-2 flex flex-row justify-between\"\n *ngFor=\"let item of metricMainObject.source.exclusions; let i = index;\">\n\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Field Name</div>\n <dx-text-box [(ngModel)]=\"item.fieldName\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Operation</div>\n <dx-text-box [(ngModel)]=\"item.operation\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Threshold</div>\n <dx-text-box [(ngModel)]=\"item.threshold\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Comparator</div>\n <dx-select-box [(ngModel)]=\"item.comparator\" [items]=\"kpi_operator\"></dx-select-box>\n\n </div>\n\n <div class=\"px-1 mt-7 text-center\">\n <button class=\"{{commonService.btn_danger_sm}} cursor-pointer\"\n (click)=\"deleteExclusionsMapingColumns(i)\"><i class=\"fa fa-trash-o\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n\n <div class=\"flex flex-row\">\n <div class=\"w-full\">\n <div class=\"flex flex-row justify-end my-2\">\n <button class=\"{{commonService.btn_primary_sm}} cursor-pointer\"\n (click)=\"addExclusionsMapingColumns()\">Add\n Exclusions</button>\n </div>\n </div>\n </div>\n </div>\n</div>\n<div class=\"flex w-full justify-end mt-5 border-t\">\n <button class=\"{{commonService.btn_success_md}} cursor-pointer mx-1 my-2\" (click)=\"createOnlineMetrics()\">\n Save Online Metrics\n </button>\n</div>", styles: [""], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: i5.DxCheckBoxComponent, selector: "dx-check-box", inputs: ["accessKey", "activeStateEnabled", "disabled", "elementAttr", "focusStateEnabled", "height", "hint", "hoverStateEnabled", "iconSize", "isValid", "name", "readOnly", "rtlEnabled", "tabIndex", "text", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "visible", "width"], outputs: ["onContentReady", "onDisposing", "onInitialized", "onOptionChanged", "onValueChanged", "accessKeyChange", "activeStateEnabledChange", "disabledChange", "elementAttrChange", "focusStateEnabledChange", "heightChange", "hintChange", "hoverStateEnabledChange", "iconSizeChange", "isValidChange", "nameChange", "readOnlyChange", "rtlEnabledChange", "tabIndexChange", "textChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "visibleChange", "widthChange", "onBlur"] }, { kind: "component", type: i6.DxSelectBoxComponent, selector: "dx-select-box", inputs: ["acceptCustomValue", "accessKey", "activeStateEnabled", "buttons", "dataSource", "deferRendering", "disabled", "displayExpr", "displayValue", "dropDownButtonTemplate", "dropDownOptions", "elementAttr", "fieldTemplate", "focusStateEnabled", "grouped", "groupTemplate", "height", "hint", "hoverStateEnabled", "inputAttr", "isValid", "items", "itemTemplate", "label", "labelMode", "maxLength", "minSearchLength", "name", "noDataText", "opened", "openOnFieldClick", "placeholder", "readOnly", "rtlEnabled", "searchEnabled", "searchExpr", "searchMode", "searchTimeout", "selectedItem", "showClearButton", "showDataBeforeSearch", "showDropDownButton", "showSelectionControls", "spellcheck", "stylingMode", "tabIndex", "text", "useItemTextAsTitle", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "valueChangeEvent", "valueExpr", "visible", "width", "wrapItemText"], outputs: ["onChange", "onClosed", "onContentReady", "onCopy", "onCustomItemCreating", "onCut", "onDisposing", "onEnterKey", "onFocusIn", "onFocusOut", "onInitialized", "onInput", "onItemClick", "onKeyDown", "onKeyUp", "onOpened", "onOptionChanged", "onPaste", "onSelectionChanged", "onValueChanged", "acceptCustomValueChange", "accessKeyChange", "activeStateEnabledChange", "buttonsChange", "dataSourceChange", "deferRenderingChange", "disabledChange", "displayExprChange", "displayValueChange", "dropDownButtonTemplateChange", "dropDownOptionsChange", "elementAttrChange", "fieldTemplateChange", "focusStateEnabledChange", "groupedChange", "groupTemplateChange", "heightChange", "hintChange", "hoverStateEnabledChange", "inputAttrChange", "isValidChange", "itemsChange", "itemTemplateChange", "labelChange", "labelModeChange", "maxLengthChange", "minSearchLengthChange", "nameChange", "noDataTextChange", "openedChange", "openOnFieldClickChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "searchEnabledChange", "searchExprChange", "searchModeChange", "searchTimeoutChange", "selectedItemChange", "showClearButtonChange", "showDataBeforeSearchChange", "showDropDownButtonChange", "showSelectionControlsChange", "spellcheckChange", "stylingModeChange", "tabIndexChange", "textChange", "useItemTextAsTitleChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "valueChangeEventChange", "valueExprChange", "visibleChange", "widthChange", "wrapItemTextChange", "onBlur"] }, { kind: "component", type: i7.DxTextBoxComponent, selector: "dx-text-box", inputs: ["accessKey", "activeStateEnabled", "buttons", "disabled", "elementAttr", "focusStateEnabled", "height", "hint", "hoverStateEnabled", "inputAttr", "isValid", "label", "labelMode", "mask", "maskChar", "maskInvalidMessage", "maskRules", "maxLength", "mode", "name", "placeholder", "readOnly", "rtlEnabled", "showClearButton", "showMaskMode", "spellcheck", "stylingMode", "tabIndex", "text", "useMaskedValue", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "valueChangeEvent", "visible", "width"], outputs: ["onChange", "onContentReady", "onCopy", "onCut", "onDisposing", "onEnterKey", "onFocusIn", "onFocusOut", "onInitialized", "onInput", "onKeyDown", "onKeyUp", "onOptionChanged", "onPaste", "onValueChanged", "accessKeyChange", "activeStateEnabledChange", "buttonsChange", "disabledChange", "elementAttrChange", "focusStateEnabledChange", "heightChange", "hintChange", "hoverStateEnabledChange", "inputAttrChange", "isValidChange", "labelChange", "labelModeChange", "maskChange", "maskCharChange", "maskInvalidMessageChange", "maskRulesChange", "maxLengthChange", "modeChange", "nameChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "showClearButtonChange", "showMaskModeChange", "spellcheckChange", "stylingModeChange", "tabIndexChange", "textChange", "useMaskedValueChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "valueChangeEventChange", "visibleChange", "widthChange", "onBlur"] }, { kind: "directive", type: i8.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i8.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
|
|
161
|
+
OnlineMetricsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: OnlineMetricsComponent, selector: "app-online-metrics", inputs: { onlineMetricData: "onlineMetricData" }, outputs: { getMetRicOnlineDataSet: "getMetRicOnlineDataSet" }, ngImport: i0, template: "<div class=\"flex flex-col flex-auto min-w-0 my-3\">\n <div class=\"text-lg py-2 font-extrabold border-b bg-gray-700 text-white px-2\"> Target\n </div>\n <div class=\"pt-2 border-x border-b \">\n <div class=\"flex flex-wrap p-2\">\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Database Name</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.target.databaseName\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> DB Config </div>\n <dx-select-box [items]=\"['mongo','impala','postgres','mysql','bigquery']\"\n (onValueChanged)=\"getDataConfig($event)\"\n [(ngModel)]=\"metricMainObject.target.dbConfig\"></dx-select-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Table Name</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.target.tableName\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Dimension Columns</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.target.dimensionColumns\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/3\">\n <div class=\"text-md mb-2\"> Measure Columns</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.target.measureColumns\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/3\">\n <div class=\"text-md mb-2\"> Write Disposition</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.target.writeDisposition\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/3\">\n <div class=\"text-md mb-2 mt-8\"></div>\n <dx-check-box text=\"Create Table\" [(ngModel)]=\"metricMainObject.target.createTable\"></dx-check-box>\n </div>\n </div>\n </div>\n</div>\n<div class=\"flex flex-col flex-auto min-w-0 my-3\">\n <div class=\"text-lg py-2 font-extrabold border-b bg-gray-700 text-white px-2\"> Source\n </div>\n <div class=\"pt-2 border-x border-b \">\n <div class=\"flex flex-wrap p-2\">\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Data Source Name</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.source.datasource\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Event Name</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.source.eventName\"></dx-text-box>\n </div>\n </div>\n </div>\n</div>\n<div class=\"flex flex-col flex-auto min-w-0 my-2\">\n <div class=\"text-lg py-2 font-extrabold border-b bg-gray-700 text-white px-2\">Measures and\n Dimensions\n </div>\n <div class=\"pt-2 border-x border-b \">\n <div class=\"my-2 flex justify-between\" *ngFor=\"let item of mesuresAndDimentionsColumns; let i = index;\">\n <div class=\"px-1 mb-2\">\n <div class=\"text-md mb-2\"> Measures</div>\n <dx-check-box [value]=\"item.measures\" [(ngModel)]=\"item.measures\"></dx-check-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Value Field(aliasName)</div>\n <dx-text-box [(ngModel)]=\"item.aliasName\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Server Column Name</div>\n <dx-text-box [(ngModel)]=\"item.fieldName\"></dx-text-box>\n </div>\n \n \n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Datatype</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"['date','string','timestamp','int', 'double', 'boolean']\"\n [(ngModel)]=\"item.dataType\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Type</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"kpi_function\" [(ngModel)]=\"item.type\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Format</div>\n <dx-text-box [(ngModel)]=\"item.format\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Method Name</div>\n <dx-text-box [(ngModel)]=\"item.method\"></dx-text-box>\n </div>\n\n <div class=\"px-1 mt-7 text-center\">\n <button class=\"{{commonService.btn_danger_sm}} cursor-pointer\" (click)=\"deleteColumns(i)\"><i\n class=\"fa fa-trash-o\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n\n <div class=\"flex flex-row justify-end my-2\">\n <button class=\"{{commonService.btn_primary_sm}} cursor-pointer\" (click)=\"addColumns()\">Add\n Columns</button>\n </div>\n </div>\n</div>\n<div class=\"flex flex-col flex-auto min-w-0 my-2\">\n <div class=\"text-lg py-2 font-extrabold border-b bg-gray-700 text-white px-2\"> Filter Maping\n </div>\n <div class=\"pt-2 border-x border-b \">\n <div class=\"my-2 flex flex-row justify-between\"\n *ngFor=\"let item of metricMainObject.source.filters; let i = index;\">\n\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Field Name</div>\n <dx-text-box [(ngModel)]=\"item.fieldName\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Operation</div>\n <dx-text-box [(ngModel)]=\"item.operation\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Threshold</div>\n <dx-text-box [(ngModel)]=\"item.threshold\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Comparator</div>\n <dx-select-box [(ngModel)]=\"item.comparator\" [items]=\"kpi_operator\"></dx-select-box>\n </div>\n\n <div class=\"px-1 mt-7 text-center\">\n <button class=\"{{commonService.btn_danger_sm}} cursor-pointer\" (click)=\"deleteFilterMapingColumns(i)\"><i\n class=\"fa fa-trash-o\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n\n <div class=\"flex flex-row\">\n <div class=\"w-full\">\n <div class=\"flex flex-row justify-end my-2\">\n <button class=\"{{commonService.btn_primary_sm}} cursor-pointer\"\n (click)=\"addFilterMapingColumns()\">Add\n Maping</button>\n </div>\n </div>\n </div>\n </div>\n</div>\n<div class=\"flex flex-col flex-auto min-w-0 my-2\">\n <div class=\"text-lg py-2 font-extrabold border-b bg-gray-700 text-white px-2\"> Exclusions\n </div>\n <div class=\"pt-2 border-x border-b \">\n <div class=\"my-2 flex flex-row justify-between\"\n *ngFor=\"let item of metricMainObject.source.exclusions; let i = index;\">\n\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Field Name</div>\n <dx-text-box [(ngModel)]=\"item.fieldName\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Operation</div>\n <dx-text-box [(ngModel)]=\"item.operation\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Threshold</div>\n <dx-text-box [(ngModel)]=\"item.threshold\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Comparator</div>\n <dx-select-box [(ngModel)]=\"item.comparator\" [items]=\"kpi_operator\"></dx-select-box>\n\n </div>\n\n <div class=\"px-1 mt-7 text-center\">\n <button class=\"{{commonService.btn_danger_sm}} cursor-pointer\"\n (click)=\"deleteExclusionsMapingColumns(i)\"><i class=\"fa fa-trash-o\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n\n <div class=\"flex flex-row\">\n <div class=\"w-full\">\n <div class=\"flex flex-row justify-end my-2\">\n <button class=\"{{commonService.btn_primary_sm}} cursor-pointer\"\n (click)=\"addExclusionsMapingColumns()\">Add\n Exclusions</button>\n </div>\n </div>\n </div>\n </div>\n</div>\n<div class=\"flex w-full justify-end mt-5 border-t\">\n <button class=\"{{commonService.btn_success_md}} cursor-pointer mx-1 my-2\" (click)=\"createOnlineMetrics()\">\n Save Online Metrics\n </button>\n</div>", styles: [""], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: i5.DxCheckBoxComponent, selector: "dx-check-box", inputs: ["accessKey", "activeStateEnabled", "disabled", "elementAttr", "focusStateEnabled", "height", "hint", "hoverStateEnabled", "iconSize", "isValid", "name", "readOnly", "rtlEnabled", "tabIndex", "text", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "visible", "width"], outputs: ["onContentReady", "onDisposing", "onInitialized", "onOptionChanged", "onValueChanged", "accessKeyChange", "activeStateEnabledChange", "disabledChange", "elementAttrChange", "focusStateEnabledChange", "heightChange", "hintChange", "hoverStateEnabledChange", "iconSizeChange", "isValidChange", "nameChange", "readOnlyChange", "rtlEnabledChange", "tabIndexChange", "textChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "visibleChange", "widthChange", "onBlur"] }, { kind: "component", type: i6.DxSelectBoxComponent, selector: "dx-select-box", inputs: ["acceptCustomValue", "accessKey", "activeStateEnabled", "buttons", "dataSource", "deferRendering", "disabled", "displayExpr", "displayValue", "dropDownButtonTemplate", "dropDownOptions", "elementAttr", "fieldTemplate", "focusStateEnabled", "grouped", "groupTemplate", "height", "hint", "hoverStateEnabled", "inputAttr", "isValid", "items", "itemTemplate", "label", "labelMode", "maxLength", "minSearchLength", "name", "noDataText", "opened", "openOnFieldClick", "placeholder", "readOnly", "rtlEnabled", "searchEnabled", "searchExpr", "searchMode", "searchTimeout", "selectedItem", "showClearButton", "showDataBeforeSearch", "showDropDownButton", "showSelectionControls", "spellcheck", "stylingMode", "tabIndex", "text", "useItemTextAsTitle", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "valueChangeEvent", "valueExpr", "visible", "width", "wrapItemText"], outputs: ["onChange", "onClosed", "onContentReady", "onCopy", "onCustomItemCreating", "onCut", "onDisposing", "onEnterKey", "onFocusIn", "onFocusOut", "onInitialized", "onInput", "onItemClick", "onKeyDown", "onKeyUp", "onOpened", "onOptionChanged", "onPaste", "onSelectionChanged", "onValueChanged", "acceptCustomValueChange", "accessKeyChange", "activeStateEnabledChange", "buttonsChange", "dataSourceChange", "deferRenderingChange", "disabledChange", "displayExprChange", "displayValueChange", "dropDownButtonTemplateChange", "dropDownOptionsChange", "elementAttrChange", "fieldTemplateChange", "focusStateEnabledChange", "groupedChange", "groupTemplateChange", "heightChange", "hintChange", "hoverStateEnabledChange", "inputAttrChange", "isValidChange", "itemsChange", "itemTemplateChange", "labelChange", "labelModeChange", "maxLengthChange", "minSearchLengthChange", "nameChange", "noDataTextChange", "openedChange", "openOnFieldClickChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "searchEnabledChange", "searchExprChange", "searchModeChange", "searchTimeoutChange", "selectedItemChange", "showClearButtonChange", "showDataBeforeSearchChange", "showDropDownButtonChange", "showSelectionControlsChange", "spellcheckChange", "stylingModeChange", "tabIndexChange", "textChange", "useItemTextAsTitleChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "valueChangeEventChange", "valueExprChange", "visibleChange", "widthChange", "wrapItemTextChange", "onBlur"] }, { kind: "component", type: i7.DxTextBoxComponent, selector: "dx-text-box", inputs: ["accessKey", "activeStateEnabled", "buttons", "disabled", "elementAttr", "focusStateEnabled", "height", "hint", "hoverStateEnabled", "inputAttr", "isValid", "label", "labelMode", "mask", "maskChar", "maskInvalidMessage", "maskRules", "maxLength", "mode", "name", "placeholder", "readOnly", "rtlEnabled", "showClearButton", "showMaskMode", "spellcheck", "stylingMode", "tabIndex", "text", "useMaskedValue", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "valueChangeEvent", "visible", "width"], outputs: ["onChange", "onContentReady", "onCopy", "onCut", "onDisposing", "onEnterKey", "onFocusIn", "onFocusOut", "onInitialized", "onInput", "onKeyDown", "onKeyUp", "onOptionChanged", "onPaste", "onValueChanged", "accessKeyChange", "activeStateEnabledChange", "buttonsChange", "disabledChange", "elementAttrChange", "focusStateEnabledChange", "heightChange", "hintChange", "hoverStateEnabledChange", "inputAttrChange", "isValidChange", "labelChange", "labelModeChange", "maskChange", "maskCharChange", "maskInvalidMessageChange", "maskRulesChange", "maxLengthChange", "modeChange", "nameChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "showClearButtonChange", "showMaskModeChange", "spellcheckChange", "stylingModeChange", "tabIndexChange", "textChange", "useMaskedValueChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "valueChangeEventChange", "visibleChange", "widthChange", "onBlur"] }, { kind: "directive", type: i8.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i8.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
|
|
160
162
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: OnlineMetricsComponent, decorators: [{
|
|
161
163
|
type: Component,
|
|
162
|
-
args: [{ selector: 'app-online-metrics', template: "<div class=\"flex flex-col flex-auto min-w-0 my-3\">\n <div class=\"text-lg py-2 font-extrabold border-b bg-gray-700 text-white px-2\"> Target\n </div>\n <div class=\"pt-2 border-x border-b \">\n <div class=\"flex flex-wrap p-2\">\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Database Name</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.target.databaseName\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> DB Config </div>\n <dx-select-box [items]=\"['mongo','impala','postgres','mysql','bigquery']\"\n (onValueChanged)=\"getDataConfig($event)\"\n [(ngModel)]=\"metricMainObject.target.dbConfig\"></dx-select-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Table Name</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.target.tableName\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Dimension Columns</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.target.dimensionColumns\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/3\">\n <div class=\"text-md mb-2\"> Measure Columns</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.target.measureColumns\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/3\">\n <div class=\"text-md mb-2\"> Write Disposition</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.target.writeDisposition\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/3\">\n <div class=\"text-md mb-2 mt-8\"></div>\n <dx-check-box text=\"Create Table\" [(ngModel)]=\"metricMainObject.target.createTable\"></dx-check-box>\n </div>\n </div>\n </div>\n</div>\n<div class=\"flex flex-col flex-auto min-w-0 my-3\">\n <div class=\"text-lg py-2 font-extrabold border-b bg-gray-700 text-white px-2\"> Source\n </div>\n <div class=\"pt-2 border-x border-b \">\n <div class=\"flex flex-wrap p-2\">\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Data Source Name</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.source.datasource\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Event Name</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.source.eventName\"></dx-text-box>\n </div>\n </div>\n </div>\n</div>\n<div class=\"flex flex-col flex-auto min-w-0 my-2\">\n <div class=\"text-lg py-2 font-extrabold border-b bg-gray-700 text-white px-2\">Measures and\n Dimensions\n </div>\n <div class=\"pt-2 border-x border-b \">\n <div class=\"my-2 flex justify-between\" *ngFor=\"let item of mesuresAndDimentionsColumns; let i = index;\">\n <div class=\"px-1 mb-2\">\n <div class=\"text-md mb-2\"> Measures</div>\n <dx-check-box [value]=\"item.measures\" [(ngModel)]=\"item.measures\"></dx-check-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Value Field(aliasName)</div>\n <dx-text-box [(ngModel)]=\"item.aliasName\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Server Column Name</div>\n <dx-text-box [(ngModel)]=\"item.fieldName\"></dx-text-box>\n </div>\n <!-- <div class=\"px-1 mb-2\">\n <div class=\"text-md mb-2\"> Function Name</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"kpi_function\"\n [(ngModel)]=\"item.functionName\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-2\">\n <div class=\"text-md mb-2\"> Enrich Name</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"kpi_enrichment_name\"\n [(ngModel)]=\"item.enrichFunction\"></dx-select-box>\n </div> -->\n <!-- <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Advanced Column</div>\n <dx-text-box [(ngModel)]=\"item.advancedColumn\"></dx-text-box>\n </div> -->\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Datatype</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"['date','string','timestamp','int', 'double', 'boolean']\"\n [(ngModel)]=\"item.dataType\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Type</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"kpi_function\" [(ngModel)]=\"item.type\"></dx-select-box>\n </div>\n\n <div class=\"px-1 mt-7 text-center\">\n <button class=\"{{commonService.btn_danger_sm}} cursor-pointer\" (click)=\"deleteColumns(i)\"><i\n class=\"fa fa-trash-o\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n\n <div class=\"flex flex-row justify-end my-2\">\n <button class=\"{{commonService.btn_primary_sm}} cursor-pointer\" (click)=\"addColumns()\">Add\n Columns</button>\n </div>\n </div>\n</div>\n<div class=\"flex flex-col flex-auto min-w-0 my-2\">\n <div class=\"text-lg py-2 font-extrabold border-b bg-gray-700 text-white px-2\"> Filter Maping\n </div>\n <div class=\"pt-2 border-x border-b \">\n <div class=\"my-2 flex flex-row justify-between\"\n *ngFor=\"let item of metricMainObject.source.filters; let i = index;\">\n\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Field Name</div>\n <dx-text-box [(ngModel)]=\"item.fieldName\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Operation</div>\n <dx-text-box [(ngModel)]=\"item.operation\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Threshold</div>\n <dx-text-box [(ngModel)]=\"item.threshold\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Comparator</div>\n <dx-select-box [(ngModel)]=\"item.comparator\" [items]=\"kpi_operator\"></dx-select-box>\n </div>\n\n <div class=\"px-1 mt-7 text-center\">\n <button class=\"{{commonService.btn_danger_sm}} cursor-pointer\" (click)=\"deleteFilterMapingColumns(i)\"><i\n class=\"fa fa-trash-o\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n\n <div class=\"flex flex-row\">\n <div class=\"w-full\">\n <div class=\"flex flex-row justify-end my-2\">\n <button class=\"{{commonService.btn_primary_sm}} cursor-pointer\"\n (click)=\"addFilterMapingColumns()\">Add\n Maping</button>\n </div>\n </div>\n </div>\n </div>\n</div>\n<div class=\"flex flex-col flex-auto min-w-0 my-2\">\n <div class=\"text-lg py-2 font-extrabold border-b bg-gray-700 text-white px-2\"> Exclusions\n </div>\n <div class=\"pt-2 border-x border-b \">\n <div class=\"my-2 flex flex-row justify-between\"\n *ngFor=\"let item of metricMainObject.source.exclusions; let i = index;\">\n\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Field Name</div>\n <dx-text-box [(ngModel)]=\"item.fieldName\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Operation</div>\n <dx-text-box [(ngModel)]=\"item.operation\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Threshold</div>\n <dx-text-box [(ngModel)]=\"item.threshold\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Comparator</div>\n <dx-select-box [(ngModel)]=\"item.comparator\" [items]=\"kpi_operator\"></dx-select-box>\n\n </div>\n\n <div class=\"px-1 mt-7 text-center\">\n <button class=\"{{commonService.btn_danger_sm}} cursor-pointer\"\n (click)=\"deleteExclusionsMapingColumns(i)\"><i class=\"fa fa-trash-o\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n\n <div class=\"flex flex-row\">\n <div class=\"w-full\">\n <div class=\"flex flex-row justify-end my-2\">\n <button class=\"{{commonService.btn_primary_sm}} cursor-pointer\"\n (click)=\"addExclusionsMapingColumns()\">Add\n Exclusions</button>\n </div>\n </div>\n </div>\n </div>\n</div>\n<div class=\"flex w-full justify-end mt-5 border-t\">\n <button class=\"{{commonService.btn_success_md}} cursor-pointer mx-1 my-2\" (click)=\"createOnlineMetrics()\">\n Save Online Metrics\n </button>\n</div>" }]
|
|
164
|
+
args: [{ selector: 'app-online-metrics', template: "<div class=\"flex flex-col flex-auto min-w-0 my-3\">\n <div class=\"text-lg py-2 font-extrabold border-b bg-gray-700 text-white px-2\"> Target\n </div>\n <div class=\"pt-2 border-x border-b \">\n <div class=\"flex flex-wrap p-2\">\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Database Name</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.target.databaseName\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> DB Config </div>\n <dx-select-box [items]=\"['mongo','impala','postgres','mysql','bigquery']\"\n (onValueChanged)=\"getDataConfig($event)\"\n [(ngModel)]=\"metricMainObject.target.dbConfig\"></dx-select-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Table Name</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.target.tableName\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Dimension Columns</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.target.dimensionColumns\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/3\">\n <div class=\"text-md mb-2\"> Measure Columns</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.target.measureColumns\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/3\">\n <div class=\"text-md mb-2\"> Write Disposition</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.target.writeDisposition\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/3\">\n <div class=\"text-md mb-2 mt-8\"></div>\n <dx-check-box text=\"Create Table\" [(ngModel)]=\"metricMainObject.target.createTable\"></dx-check-box>\n </div>\n </div>\n </div>\n</div>\n<div class=\"flex flex-col flex-auto min-w-0 my-3\">\n <div class=\"text-lg py-2 font-extrabold border-b bg-gray-700 text-white px-2\"> Source\n </div>\n <div class=\"pt-2 border-x border-b \">\n <div class=\"flex flex-wrap p-2\">\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Data Source Name</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.source.datasource\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Event Name</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.source.eventName\"></dx-text-box>\n </div>\n </div>\n </div>\n</div>\n<div class=\"flex flex-col flex-auto min-w-0 my-2\">\n <div class=\"text-lg py-2 font-extrabold border-b bg-gray-700 text-white px-2\">Measures and\n Dimensions\n </div>\n <div class=\"pt-2 border-x border-b \">\n <div class=\"my-2 flex justify-between\" *ngFor=\"let item of mesuresAndDimentionsColumns; let i = index;\">\n <div class=\"px-1 mb-2\">\n <div class=\"text-md mb-2\"> Measures</div>\n <dx-check-box [value]=\"item.measures\" [(ngModel)]=\"item.measures\"></dx-check-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Value Field(aliasName)</div>\n <dx-text-box [(ngModel)]=\"item.aliasName\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Server Column Name</div>\n <dx-text-box [(ngModel)]=\"item.fieldName\"></dx-text-box>\n </div>\n \n \n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Datatype</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"['date','string','timestamp','int', 'double', 'boolean']\"\n [(ngModel)]=\"item.dataType\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Type</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"kpi_function\" [(ngModel)]=\"item.type\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Format</div>\n <dx-text-box [(ngModel)]=\"item.format\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Method Name</div>\n <dx-text-box [(ngModel)]=\"item.method\"></dx-text-box>\n </div>\n\n <div class=\"px-1 mt-7 text-center\">\n <button class=\"{{commonService.btn_danger_sm}} cursor-pointer\" (click)=\"deleteColumns(i)\"><i\n class=\"fa fa-trash-o\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n\n <div class=\"flex flex-row justify-end my-2\">\n <button class=\"{{commonService.btn_primary_sm}} cursor-pointer\" (click)=\"addColumns()\">Add\n Columns</button>\n </div>\n </div>\n</div>\n<div class=\"flex flex-col flex-auto min-w-0 my-2\">\n <div class=\"text-lg py-2 font-extrabold border-b bg-gray-700 text-white px-2\"> Filter Maping\n </div>\n <div class=\"pt-2 border-x border-b \">\n <div class=\"my-2 flex flex-row justify-between\"\n *ngFor=\"let item of metricMainObject.source.filters; let i = index;\">\n\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Field Name</div>\n <dx-text-box [(ngModel)]=\"item.fieldName\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Operation</div>\n <dx-text-box [(ngModel)]=\"item.operation\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Threshold</div>\n <dx-text-box [(ngModel)]=\"item.threshold\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Comparator</div>\n <dx-select-box [(ngModel)]=\"item.comparator\" [items]=\"kpi_operator\"></dx-select-box>\n </div>\n\n <div class=\"px-1 mt-7 text-center\">\n <button class=\"{{commonService.btn_danger_sm}} cursor-pointer\" (click)=\"deleteFilterMapingColumns(i)\"><i\n class=\"fa fa-trash-o\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n\n <div class=\"flex flex-row\">\n <div class=\"w-full\">\n <div class=\"flex flex-row justify-end my-2\">\n <button class=\"{{commonService.btn_primary_sm}} cursor-pointer\"\n (click)=\"addFilterMapingColumns()\">Add\n Maping</button>\n </div>\n </div>\n </div>\n </div>\n</div>\n<div class=\"flex flex-col flex-auto min-w-0 my-2\">\n <div class=\"text-lg py-2 font-extrabold border-b bg-gray-700 text-white px-2\"> Exclusions\n </div>\n <div class=\"pt-2 border-x border-b \">\n <div class=\"my-2 flex flex-row justify-between\"\n *ngFor=\"let item of metricMainObject.source.exclusions; let i = index;\">\n\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Field Name</div>\n <dx-text-box [(ngModel)]=\"item.fieldName\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Operation</div>\n <dx-text-box [(ngModel)]=\"item.operation\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Threshold</div>\n <dx-text-box [(ngModel)]=\"item.threshold\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Comparator</div>\n <dx-select-box [(ngModel)]=\"item.comparator\" [items]=\"kpi_operator\"></dx-select-box>\n\n </div>\n\n <div class=\"px-1 mt-7 text-center\">\n <button class=\"{{commonService.btn_danger_sm}} cursor-pointer\"\n (click)=\"deleteExclusionsMapingColumns(i)\"><i class=\"fa fa-trash-o\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n\n <div class=\"flex flex-row\">\n <div class=\"w-full\">\n <div class=\"flex flex-row justify-end my-2\">\n <button class=\"{{commonService.btn_primary_sm}} cursor-pointer\"\n (click)=\"addExclusionsMapingColumns()\">Add\n Exclusions</button>\n </div>\n </div>\n </div>\n </div>\n</div>\n<div class=\"flex w-full justify-end mt-5 border-t\">\n <button class=\"{{commonService.btn_success_md}} cursor-pointer mx-1 my-2\" (click)=\"createOnlineMetrics()\">\n Save Online Metrics\n </button>\n</div>" }]
|
|
163
165
|
}], ctorParameters: function () { return [{ type: i1.CommonService }, { type: i2.ToastrService }, { type: i3.ApplicationContentService }]; }, propDecorators: { getMetRicOnlineDataSet: [{
|
|
164
166
|
type: Output
|
|
165
167
|
}], onlineMetricData: [{
|
|
166
168
|
type: Input,
|
|
167
169
|
args: ['onlineMetricData']
|
|
168
170
|
}] } });
|
|
169
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib25saW5lLW1ldHJpY3MuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZ2FtbWEtYXBwLWNvbnRyb2xsZXIvc3JjL2xpYi9hcHBsaWNhdGlvbi1jb250cm9sbGVyL2FwcGxpY2F0aW9uLW1ldHJpYy1jb25maWcvb25saW5lLW1ldHJpY3Mvb25saW5lLW1ldHJpY3MuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZ2FtbWEtYXBwLWNvbnRyb2xsZXIvc3JjL2xpYi9hcHBsaWNhdGlvbi1jb250cm9sbGVyL2FwcGxpY2F0aW9uLW1ldHJpYy1jb25maWcvb25saW5lLW1ldHJpY3Mvb25saW5lLW1ldHJpY3MuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQzs7Ozs7Ozs7OztBQVUvRSxNQUFNLE9BQU8sc0JBQXNCO0lBaURqQyxZQUFtQixhQUE0QixFQUFVLE1BQXFCLEVBQVUsT0FBa0M7UUFBdkcsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFBVSxXQUFNLEdBQU4sTUFBTSxDQUFlO1FBQVUsWUFBTyxHQUFQLE9BQU8sQ0FBMkI7UUE5QzFILHdCQUFtQixHQUFRLEVBQUUsQ0FBQztRQUM5QixnQkFBVyxHQUFZLEtBQUssQ0FBQztRQUM3QixnQkFBVyxHQUFZLEtBQUssQ0FBQztRQUM3Qix3QkFBbUIsR0FBUSxFQUFFLENBQUM7UUFDOUIsaUJBQVksR0FBUSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLGdCQUFnQixDQUFDLENBQUE7UUFDckYsaUJBQVksR0FBUSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFB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QyxHQUFHLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRUQsbUJBQW1CLENBQUMsQ0FBQztRQUNuQixJQUFJLENBQUMsa0JBQWtCLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzNELENBQUM7O21IQXRMVSxzQkFBc0I7dUdBQXRCLHNCQUFzQiwyS0NWbkMsc3dUQXNNTTsyRkQ1TE8sc0JBQXNCO2tCQUxsQyxTQUFTOytCQUNFLG9CQUFvQjt3S0FxQmIsc0JBQXNCO3NCQUF0QyxNQUFNO2dCQWNILGdCQUFnQjtzQkFEbkIsS0FBSzt1QkFBQyxrQkFBa0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUb2FzdHJTZXJ2aWNlIH0gZnJvbSAnbmd4LXRvYXN0cic7XG5pbXBvcnQgeyBBcHBsaWNhdGlvbkNvbnRlbnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vYXBwbGljYXRpb24tY29udGVudC5zZXJ2aWNlJztcbmltcG9ydCB7IENvbW1vblNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb21tb24nO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtb25saW5lLW1ldHJpY3MnLFxuICB0ZW1wbGF0ZVVybDogJy4vb25saW5lLW1ldHJpY3MuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9vbmxpbmUtbWV0cmljcy5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIE9ubGluZU1ldHJpY3NDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBsb2FkaW5nTW9kYWw6IGJvb2xlYW47XG4gIC8vIEBJbnB1dCgpIHF1ZXJ5QnVsZGVyRGF0YXNldDogYW55O1xuICByZXFGaWVsZHNEYXRhU291cmNlOiBhbnkgPSBbXTtcbiAgaXNyZXFGaWVsZHM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgaXNjZHJQYXJhbXM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgY2RyRmllbGRzRGF0YVNvdXJjZTogYW55ID0gW107XG4gIGtwaV9mdW5jdGlvbjogYW55ID0gW1wic3VtXCIsIFwiY291bnRcIiwgXCJhdmdcIiwgXCJtYXhcIiwgXCJtaW5cIiwgXCJzdGRkZXZcIiwgXCJjb3VudF9kaXN0aW5jdFwiXVxuICBrcGlfb3BlcmF0b3I6IGFueSA9IFtcImVxXCIsIFwiZ3RlXCIsIFwibHRlXCIsIFwibmVcIiwgXCJpblwiLCBcIm5vdEluXCJdXG4gIGtwaV9lbnJpY2htZW50X25hbWU6IGFueSA9IFtdO1xuICByZXFTaG9ydERhdGFTb3VyY2U6IGFueSA9IFtdO1xuICBmaWx0ZXJNYXBpbmdEYXRhc291cmNlOiBhbnkgPSBbXTtcbiAgcXVlcnlfZGF0YTogYW55O1xuICBpc01vZGVsVmlzaWJsZTogYm9vbGVhbiA9IGZhbHNlO1xuICBpc1NxbENvcGllZFRleHQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcXVlcnlCdWxkZXJEYXRhc2V0OiBhbnk7XG4gIGlzUmVjb25Db2x1bWU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQE91dHB1dCgpIHB1YmxpYyBnZXRNZXRSaWNPbmxpbmVEYXRhU2V0OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICByZWNvbkNvbHVtZURhdGFzb3VyY2UgPSBbXTtcblxuICBzZWxlY3RlZERhdGFTb3VyY2U6IGFueTtcbiAgaXNRdWVyeVR5cGVTZWxlY3Q6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBtZXN1cmVzQW5kRGltZW50aW9uc0NvbHVtbnMgPSBbXTtcbiAgbWV0cmljTWFpbk9iamVjdDogYW55ID0ge307XG5cbiAgbWV0cmljdHlwZTogYW55O1xuXG5cbiAgQElucHV0KCdvbmxpbmVNZXRyaWNEYXRhJylcbiAgc2V0IG9ubGluZU1ldHJpY0RhdGEodmFsdWUpIHtcbiAgICB0aGlzLm1ldHJpY01haW5PYmplY3QgPSB2YWx1ZTtcbiAgICB2YWx1ZS5zb3VyY2UuZGltZW5zaW9ucy5mb3JFYWNoKGRpbWVuc2lvbiA9PiB7XG4gICAgICB0aGlzLm1lc3VyZXNBbmREaW1lbnRpb25zQ29sdW1ucy5wdXNoKHtcbiAgICAgICAgLi4uZGltZW5zaW9uLFxuICAgICAgICBtZWFzdXJlczogZmFsc2VcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHZhbHVlLnNvdXJjZS5tZWFzdXJlcy5mb3JFYWNoKG1lYXN1cmUgPT4ge1xuICAgICAgdGhpcy5tZXN1cmVzQW5kRGltZW50aW9uc0NvbHVtbnMucHVzaCh7XG4gICAgICAgIC4uLm1lYXN1cmUsXG4gICAgICAgIG1lYXN1cmVzOiB0cnVlXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG5cblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgY29tbW9uU2VydmljZTogQ29tbW9uU2VydmljZSwgcHJpdmF0ZSB0b2FzdHI6IFRvYXN0clNlcnZpY2UsIHByaXZhdGUgc2VydmljZTogQXBwbGljYXRpb25Db250ZW50U2VydmljZSkgeyB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5zZXJ2aWNlLmxpc3RDb2x1bW5FbnJpY2htZW50RnVuY3Rpb25zKCkuc3Vic2NyaWJlKGRhdGEgPT4ge1xuICAgICAgdGhpcy5rcGlfZW5yaWNobWVudF9uYW1lID0gZGF0YTtcbiAgICB9KVxuICB9XG5cbiAgYWRkQ29sdW1ucygpIHtcbiAgICBsZXQgb2JqID0ge1xuICAgICAgXCJtZWFzdXJlc1wiOiB0cnVlLFxuICAgICAgXCJmaWVsZE5hbWVcIjogXCJcIixcbiAgICAgIFwiYWxpYXNOYW1lXCI6IFwiXCIsXG4gICAgICBcImRhdGFUeXBlXCI6IFwiXCIsXG4gICAgICBcInR5cGVcIjogXCJcIlxuICAgIH1cbiAgICB0aGlzLm1lc3VyZXNBbmREaW1lbnRpb25zQ29sdW1ucy5wdXNoKG9iaik7XG4gIH1cblxuXG4gIGRlbGV0ZUNvbHVtbnMoaSkge1xuICAgIHRoaXMubWVzdXJlc0FuZERpbWVudGlvbnNDb2x1bW5zLnNwbGljZShpLCAxKVxuICB9XG5cbiAgYWRkRmlsdGVyTWFwaW5nQ29sdW1ucygpIHtcbiAgICBsZXQgb2JqID0ge1xuICAgICAgXCJmaWVsZE5hbWVcIjogXCJcIixcbiAgICAgIFwib3BlcmF0aW9uXCI6IFwiXCIsXG4gICAgICBcInRocmVzaG9sZFwiOiBcIlwiLFxuICAgICAgXCJjb21wYXJhdG9yXCI6IFwiXCIsXG4gICAgfVxuICAgIHRoaXMubWV0cmljTWFpbk9iamVjdC5zb3VyY2UuZmlsdGVycy5wdXNoKG9iaik7XG4gIH1cblxuICBkZWxldGVGaWx0ZXJNYXBpbmdDb2x1bW5zKGkpIHtcbiAgICB0aGlzLm1ldHJpY01haW5PYmplY3Quc291cmNlLmZpbHRlcnMuc3BsaWNlKGksIDEpO1xuICB9XG5cbiAgYWRkRXhjbHVzaW9uc01hcGluZ0NvbHVtbnMoKSB7XG4gICAgbGV0IG9iaiA9IHtcbiAgICAgIFwiZmllbGROYW1lXCI6IFwiXCIsXG4gICAgICBcIm9wZXJhdGlvblwiOiBcIlwiLFxuICAgICAgXCJ0aHJlc2hvbGRcIjogXCJcIixcbiAgICAgIFwiY29tcGFyYXRvclwiOiBcIlwiLFxuICAgIH1cbiAgICB0aGlzLm1ldHJpY01haW5PYmplY3Quc291cmNlLmV4Y2x1c2lvbnMucHVzaChvYmopO1xuICB9XG5cbiAgZGVsZXRlRXhjbHVzaW9uc01hcGluZ0NvbHVtbnMoaSkge1xuICAgIHRoaXMubWV0cmljTWFpbk9iamVjdC5zb3VyY2UuZXhjbHVzaW9ucy5zcGxpY2UoaSwgMSk7XG4gIH1cblxuXG5cbiAgdHJhbnNmb3JtRGF0YUZvck1GaWx0ZXIobWFwZmlsdGVyKSB7XG4gICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgIG1hcGZpbHRlci5mb3JFYWNoKG1hcHBpbmcgPT4ge1xuICAgICAgbGV0IHJlc3VsdE9iaiA9IHtcbiAgICAgICAgY29sdW1uTmFtZTogbWFwcGluZy5zZXJ2ZXJDb2x1bW4sXG4gICAgICAgIGRhdGFUeXBlOiBtYXBwaW5nLmRhdGFUeXBlLFxuICAgICAgICBvcGVyYXRvcjogbWFwcGluZy5vcGVyYXRvck5hbWUsXG4gICAgICAgIHZhbHVlOiBtYXBwaW5nLmRlZmF1bHRWYWx1ZVxuICAgICAgfTtcbiAgICAgIHJlc3VsdC5wdXNoKHJlc3VsdE9iaik7XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG5cblxuICBjcmVhdGVPbmxpbmVNZXRyaWNzKCkge1xuICAgIHRoaXMubWV0cmljTWFpbk9iamVjdC5zb3VyY2UubWVhc3VyZXMgPSBbXTtcbiAgICB0aGlzLm1ldHJpY01haW5PYmplY3Quc291cmNlLmRpbWVuc2lvbnMgPSBbXTtcblxuICAgIHRoaXMubWVzdXJlc0FuZERpbWVudGlvbnNDb2x1bW5zLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAvLyBDaGVjayBpZiBlbGVtZW50LmFkdmFuY2VkQ29sdW1uIGlzIGFuIGVtcHR5IHN0cmluZyBhbmQgc2V0IGl0IHRvIG51bGxcbiAgICAgIC8vIGNvbnN0IGFkdmFuY2VkQ29sdW1uVmFsdWUgPSBlbGVtZW50LmFkdmFuY2VkQ29sdW1uID09PSBcIlwiID8gbnVsbCA6IGVsZW1lbnQuYWR2YW5jZWRDb2x1bW47XG5cbiAgICAgIGlmIChlbGVtZW50Lm1lYXN1cmVzKSB7XG4gICAgICAgIGxldCBvYmogPSB7XG4gICAgICAgICAgZmllbGROYW1lOiBlbGVtZW50LmZpZWxkTmFtZSxcbiAgICAgICAgICBhbGlhc05hbWU6IGVsZW1lbnQuYWxpYXNOYW1lLFxuICAgICAgICAgIGRhdGFUeXBlOiBlbGVtZW50LmRhdGFUeXBlLFxuICAgICAgICAgIHR5cGU6IGVsZW1lbnQudHlwZSxcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubWV0cmljTWFpbk9iamVjdC5zb3VyY2UubWVhc3VyZXMucHVzaChvYmopO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IG9iaiA9IHtcbiAgICAgICAgICBmaWVsZE5hbWU6IGVsZW1lbnQuZmllbGROYW1lLFxuICAgICAgICAgIGFsaWFzTmFtZTogZWxlbWVudC5hbGlhc05hbWUsXG4gICAgICAgICAgZGF0YVR5cGU6IGVsZW1lbnQuZGF0YVR5cGUsXG4gICAgICAgICAgdHlwZTogZWxlbWVudC50eXBlLFxuICAgICAgICB9XG4gICAgICAgIHRoaXMubWV0cmljTWFpbk9iamVjdC5zb3VyY2UuZGltZW5zaW9ucy5wdXNoKG9iaik7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLmdldE1ldFJpY09ubGluZURhdGFTZXQuZW1pdCh0aGlzLm1ldHJpY01haW5PYmplY3QpXG4gIH1cblxuICBnZXRRdWVyeUZvckRldGFpbHNEYXRhKGUpIHtcbiAgICBpZiAoZS52YWx1ZSA9PSAnQmFzaWMnKSB7XG4gICAgICB0aGlzLnF1ZXJ5QnVsZGVyRGF0YXNldC5hcGkgPSAnL2twaS9nZW5lcmljRGV0YWlsRGF0YVJlc3BvbnNlJ1xuICAgICAgdGhpcy5xdWVyeUJ1bGRlckRhdGFzZXQucXVlcnlDb25maWcuY29sdW1ucyA9IFtdO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnF1ZXJ5QnVsZGVyRGF0YXNldC5hcGkgPSAnL2twaS9nZW5lcmljQWdncmVnYXRlUGFnaW5hdGVkS3BpU2VydmljZVJlc3BvbnNlJztcbiAgICB9XG4gIH1cblxuXG4gIGdldERhdGFDb25maWcoZSkge1xuICAgIGlmIChlLmV2ZW50KSB7XG4gICAgICB0aGlzLnNlbGVjdGVkRGF0YVNvdXJjZSA9IGUudmFsdWU7XG4gICAgICB0aGlzLmlzUXVlcnlUeXBlU2VsZWN0ID0gdHJ1ZTtcbiAgICB9XG5cbiAgfVxuXG5cbiAgYWRkSGF2aW5nc0NvbHVtZSgpIHtcbiAgICBsZXQgb2JqID0ge1xuICAgICAgXCJjb2x1bW5OYW1lXCI6IFwiXCIsXG4gICAgICBcImFkdmFuY2VkQ29sdW1uXCI6IFwiXCIsXG4gICAgICBcImRhdGFUeXBlXCI6IFwiXCIsXG4gICAgICBcIm9wZXJhdG9yXCI6IFwiXCIsXG4gICAgICBcInZhbHVlXCI6IFwiXCJcbiAgICB9XG4gICAgdGhpcy5xdWVyeUJ1bGRlckRhdGFzZXQucXVlcnlDb25maWcuaGF2aW5ncy5wdXNoKG9iaik7XG4gIH1cblxuICBkZWxldGVIYXZpbmdzQ29sdW1lKGkpIHtcbiAgICB0aGlzLnF1ZXJ5QnVsZGVyRGF0YXNldC5xdWVyeUNvbmZpZy5oYXZpbmdzLnNwbGljZShpLCAxKTtcbiAgfVxuXG5cbn1cbiIsIjxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGZsZXgtYXV0byBtaW4tdy0wIG15LTNcIj5cbiAgICA8ZGl2IGNsYXNzPVwidGV4dC1sZyBweS0yIGZvbnQtZXh0cmFib2xkIGJvcmRlci1iIGJnLWdyYXktNzAwIHRleHQtd2hpdGUgcHgtMlwiPiBUYXJnZXRcbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwicHQtMiBib3JkZXIteCBib3JkZXItYiBcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC13cmFwIHAtMlwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTIgbWItMiB3LTEvMlwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj4gRGF0YWJhc2UgTmFtZTwvZGl2PlxuICAgICAgICAgICAgICAgIDxkeC10ZXh0LWJveCBbKG5nTW9kZWwpXT1cIm1ldHJpY01haW5PYmplY3QudGFyZ2V0LmRhdGFiYXNlTmFtZVwiPjwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0yIG1iLTIgdy0xLzJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+IERCIENvbmZpZyA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZHgtc2VsZWN0LWJveCBbaXRlbXNdPVwiWydtb25nbycsJ2ltcGFsYScsJ3Bvc3RncmVzJywnbXlzcWwnLCdiaWdxdWVyeSddXCJcbiAgICAgICAgICAgICAgICAgICAgKG9uVmFsdWVDaGFuZ2VkKT1cImdldERhdGFDb25maWcoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwibWV0cmljTWFpbk9iamVjdC50YXJnZXQuZGJDb25maWdcIj48L2R4LXNlbGVjdC1ib3g+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0yIG1iLTIgdy0xLzJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+IFRhYmxlIE5hbWU8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJtZXRyaWNNYWluT2JqZWN0LnRhcmdldC50YWJsZU5hbWVcIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMiBtYi0yIHctMS8yXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPiBEaW1lbnNpb24gQ29sdW1uczwvZGl2PlxuICAgICAgICAgICAgICAgIDxkeC10ZXh0LWJveCBbKG5nTW9kZWwpXT1cIm1ldHJpY01haW5PYmplY3QudGFyZ2V0LmRpbWVuc2lvbkNvbHVtbnNcIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMiBtYi0yIHctMS8zXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPiBNZWFzdXJlIENvbHVtbnM8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJtZXRyaWNNYWluT2JqZWN0LnRhcmdldC5tZWFzdXJlQ29sdW1uc1wiPjwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0yIG1iLTIgdy0xLzNcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+IFdyaXRlIERpc3Bvc2l0aW9uPC9kaXY+XG4gICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwibWV0cmljTWFpbk9iamVjdC50YXJnZXQud3JpdGVEaXNwb3NpdGlvblwiPjwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0yIG1iLTIgdy0xLzNcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yIG10LThcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZHgtY2hlY2stYm94IHRleHQ9XCJDcmVhdGUgVGFibGVcIiBbKG5nTW9kZWwpXT1cIm1ldHJpY01haW5PYmplY3QudGFyZ2V0LmNyZWF0ZVRhYmxlXCI+PC9keC1jaGVjay1ib3g+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG48L2Rpdj5cbjxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGZsZXgtYXV0byBtaW4tdy0wIG15LTNcIj5cbiAgICA8ZGl2IGNsYXNzPVwidGV4dC1sZyBweS0yIGZvbnQtZXh0cmFib2xkIGJvcmRlci1iIGJnLWdyYXktNzAwIHRleHQtd2hpdGUgcHgtMlwiPiBTb3VyY2VcbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwicHQtMiBib3JkZXIteCBib3JkZXItYiBcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC13cmFwIHAtMlwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTIgbWItMiB3LTEvMlwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj4gRGF0YSBTb3VyY2UgTmFtZTwvZGl2PlxuICAgICAgICAgICAgICAgIDxkeC10ZXh0LWJveCBbKG5nTW9kZWwpXT1cIm1ldHJpY01haW5PYmplY3Quc291cmNlLmRhdGFzb3VyY2VcIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMiBtYi0yIHctMS8yXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPiBFdmVudCBOYW1lPC9kaXY+XG4gICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwibWV0cmljTWFpbk9iamVjdC5zb3VyY2UuZXZlbnROYW1lXCI+PC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZmxleC1hdXRvIG1pbi13LTAgbXktMlwiPlxuICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWxnIHB5LTIgZm9udC1leHRyYWJvbGQgYm9yZGVyLWIgYmctZ3JheS03MDAgdGV4dC13aGl0ZSBweC0yXCI+TWVhc3VyZXMgYW5kXG4gICAgICAgIERpbWVuc2lvbnNcbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwicHQtMiBib3JkZXIteCBib3JkZXItYiBcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm15LTIgZmxleCBqdXN0aWZ5LWJldHdlZW5cIiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBtZXN1cmVzQW5kRGltZW50aW9uc0NvbHVtbnM7IGxldCBpID0gaW5kZXg7XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMSBtYi0yXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPiBNZWFzdXJlczwvZGl2PlxuICAgICAgICAgICAgICAgIDxkeC1jaGVjay1ib3ggW3ZhbHVlXT1cIml0ZW0ubWVhc3VyZXNcIiBbKG5nTW9kZWwpXT1cIml0ZW0ubWVhc3VyZXNcIj48L2R4LWNoZWNrLWJveD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTEgbWItMiB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+IFZhbHVlIEZpZWxkKGFsaWFzTmFtZSk8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJpdGVtLmFsaWFzTmFtZVwiPjwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0xIG1iLTIgdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPiBTZXJ2ZXIgQ29sdW1uIE5hbWU8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJpdGVtLmZpZWxkTmFtZVwiPjwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cInB4LTEgbWItMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPiBGdW5jdGlvbiBOYW1lPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtc2VsZWN0LWJveCBbc2VhcmNoRW5hYmxlZF09XCJ0cnVlXCIgW2l0ZW1zXT1cImtwaV9mdW5jdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJpdGVtLmZ1bmN0aW9uTmFtZVwiPjwvZHgtc2VsZWN0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0xIG1iLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj4gRW5yaWNoIE5hbWU8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC1zZWxlY3QtYm94IFtzZWFyY2hFbmFibGVkXT1cInRydWVcIiBbaXRlbXNdPVwia3BpX2VucmljaG1lbnRfbmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJpdGVtLmVucmljaEZ1bmN0aW9uXCI+PC9keC1zZWxlY3QtYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gLS0+XG4gICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJweC0xIG1iLTIgdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPiBBZHZhbmNlZCBDb2x1bW48L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJpdGVtLmFkdmFuY2VkQ29sdW1uXCI+PC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgIDwvZGl2PiAtLT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0xIG1iLTIgdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPiBEYXRhdHlwZTwvZGl2PlxuICAgICAgICAgICAgICAgIDxkeC1zZWxlY3QtYm94IFtzZWFyY2hFbmFibGVkXT1cInRydWVcIiBbaXRlbXNdPVwiWydkYXRlJywnc3RyaW5nJywndGltZXN0YW1wJywnaW50JywgJ2RvdWJsZScsICdib29sZWFuJ11cIlxuICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIml0ZW0uZGF0YVR5cGVcIj48L2R4LXNlbGVjdC1ib3g+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0xIG1iLTIgdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPiBUeXBlPC9kaXY+XG4gICAgICAgICAgICAgICAgPGR4LXNlbGVjdC1ib3ggW3NlYXJjaEVuYWJsZWRdPVwidHJ1ZVwiIFtpdGVtc109XCJrcGlfZnVuY3Rpb25cIiBbKG5nTW9kZWwpXT1cIml0ZW0udHlwZVwiPjwvZHgtc2VsZWN0LWJveD5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMSBtdC03IHRleHQtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fZGFuZ2VyX3NtfX0gY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwiZGVsZXRlQ29sdW1ucyhpKVwiPjxpXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZhIGZhLXRyYXNoLW9cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cganVzdGlmeS1lbmQgbXktMlwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fcHJpbWFyeV9zbX19IGN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cImFkZENvbHVtbnMoKVwiPkFkZFxuICAgICAgICAgICAgICAgIENvbHVtbnM8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG48L2Rpdj5cbjxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGZsZXgtYXV0byBtaW4tdy0wIG15LTJcIj5cbiAgICA8ZGl2IGNsYXNzPVwidGV4dC1sZyBweS0yIGZvbnQtZXh0cmFib2xkIGJvcmRlci1iIGJnLWdyYXktNzAwIHRleHQtd2hpdGUgcHgtMlwiPiBGaWx0ZXIgTWFwaW5nXG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cInB0LTIgYm9yZGVyLXggYm9yZGVyLWIgXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJteS0yIGZsZXggZmxleC1yb3cganVzdGlmeS1iZXR3ZWVuXCJcbiAgICAgICAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIG1ldHJpY01haW5PYmplY3Quc291cmNlLmZpbHRlcnM7IGxldCBpID0gaW5kZXg7XCI+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0xIG1iLTIgdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPiBGaWVsZCBOYW1lPC9kaXY+XG4gICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwiaXRlbS5maWVsZE5hbWVcIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMSBtYi0yIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj4gT3BlcmF0aW9uPC9kaXY+XG4gICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwiaXRlbS5vcGVyYXRpb25cIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMSBtYi0yIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj4gVGhyZXNob2xkPC9kaXY+XG4gICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwiaXRlbS50aHJlc2hvbGRcIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMSBtYi0yIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj4gQ29tcGFyYXRvcjwvZGl2PlxuICAgICAgICAgICAgICAgIDxkeC1zZWxlY3QtYm94IFsobmdNb2RlbCldPVwiaXRlbS5jb21wYXJhdG9yXCIgW2l0ZW1zXT1cImtwaV9vcGVyYXRvclwiPjwvZHgtc2VsZWN0LWJveD5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMSBtdC03IHRleHQtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fZGFuZ2VyX3NtfX0gY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwiZGVsZXRlRmlsdGVyTWFwaW5nQ29sdW1ucyhpKVwiPjxpXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZhIGZhLXRyYXNoLW9cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3dcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBqdXN0aWZ5LWVuZCBteS0yXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX3ByaW1hcnlfc219fSBjdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkRmlsdGVyTWFwaW5nQ29sdW1ucygpXCI+QWRkXG4gICAgICAgICAgICAgICAgICAgICAgICBNYXBpbmc8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZmxleC1hdXRvIG1pbi13LTAgbXktMlwiPlxuICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWxnIHB5LTIgZm9udC1leHRyYWJvbGQgYm9yZGVyLWIgYmctZ3JheS03MDAgdGV4dC13aGl0ZSBweC0yXCI+IEV4Y2x1c2lvbnNcbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwicHQtMiBib3JkZXIteCBib3JkZXItYiBcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm15LTIgZmxleCBmbGV4LXJvdyBqdXN0aWZ5LWJldHdlZW5cIlxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgbWV0cmljTWFpbk9iamVjdC5zb3VyY2UuZXhjbHVzaW9uczsgbGV0IGkgPSBpbmRleDtcIj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTEgbWItMiB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+IEZpZWxkIE5hbWU8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJpdGVtLmZpZWxkTmFtZVwiPjwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0xIG1iLTIgdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPiBPcGVyYXRpb248L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJpdGVtLm9wZXJhdGlvblwiPjwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0xIG1iLTIgdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPiBUaHJlc2hvbGQ8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJpdGVtLnRocmVzaG9sZFwiPjwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0xIG1iLTIgdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPiBDb21wYXJhdG9yPC9kaXY+XG4gICAgICAgICAgICAgICAgPGR4LXNlbGVjdC1ib3ggWyhuZ01vZGVsKV09XCJpdGVtLmNvbXBhcmF0b3JcIiBbaXRlbXNdPVwia3BpX29wZXJhdG9yXCI+PC9keC1zZWxlY3QtYm94PlxuXG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTEgbXQtNyB0ZXh0LWNlbnRlclwiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX2Rhbmdlcl9zbX19IGN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImRlbGV0ZUV4Y2x1c2lvbnNNYXBpbmdDb2x1bW5zKGkpXCI+PGkgY2xhc3M9XCJmYSBmYS10cmFzaC1vXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cganVzdGlmeS1lbmQgbXktMlwiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl9wcmltYXJ5X3NtfX0gY3Vyc29yLXBvaW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZEV4Y2x1c2lvbnNNYXBpbmdDb2x1bW5zKClcIj5BZGRcbiAgICAgICAgICAgICAgICAgICAgICAgIEV4Y2x1c2lvbnM8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuPGRpdiBjbGFzcz1cImZsZXggdy1mdWxsIGp1c3RpZnktZW5kIG10LTUgYm9yZGVyLXRcIj5cbiAgICA8YnV0dG9uIGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl9zdWNjZXNzX21kfX0gY3Vyc29yLXBvaW50ZXIgbXgtMSBteS0yXCIgKGNsaWNrKT1cImNyZWF0ZU9ubGluZU1ldHJpY3MoKVwiPlxuICAgICAgICBTYXZlIE9ubGluZSBNZXRyaWNzXG4gICAgPC9idXR0b24+XG48L2Rpdj4iXX0=
|
|
171
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib25saW5lLW1ldHJpY3MuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZ2FtbWEtYXBwLWNvbnRyb2xsZXIvc3JjL2xpYi9hcHBsaWNhdGlvbi1jb250cm9sbGVyL2FwcGxpY2F0aW9uLW1ldHJpYy1jb25maWcvb25saW5lLW1ldHJpY3Mvb25saW5lLW1ldHJpY3MuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZ2FtbWEtYXBwLWNvbnRyb2xsZXIvc3JjL2xpYi9hcHBsaWNhdGlvbi1jb250cm9sbGVyL2FwcGxpY2F0aW9uLW1ldHJpYy1jb25maWcvb25saW5lLW1ldHJpY3Mvb25saW5lLW1ldHJpY3MuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQzs7Ozs7Ozs7OztBQVUvRSxNQUFNLE9BQU8sc0JBQXNCO0lBaURqQyxZQUFtQixhQUE0QixFQUFVLE1BQXFCLEVBQVUsT0FBa0M7UUFBdkcsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFBVSxXQUFNLEdBQU4sTUFBTSxDQUFlO1FBQVUsWUFBTyxHQUFQLE9BQU8sQ0FBMkI7UUE5QzFILHdCQUFtQixHQUFRLEVBQUUsQ0FBQztRQUM5QixnQkFBVyxHQUFZLEtBQUssQ0FBQztRQUM3QixnQkFBVyxHQUFZLEtBQUssQ0FBQztRQUM3Qix3QkFBbUIsR0FBUSxFQUFFLENBQUM7UUFDOUIsaUJBQVksR0FBUSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLGdCQUFnQixDQUFDLENBQUE7UUFDckYsaUJBQVksR0FBUSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFB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a0JBQWtCLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVELG1CQUFtQixDQUFDLENBQUM7UUFDbkIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMzRCxDQUFDOzttSEF4TFUsc0JBQXNCO3VHQUF0QixzQkFBc0IsMktDVm5DLCt0U0FrTU07MkZEeExPLHNCQUFzQjtrQkFMbEMsU0FBUzsrQkFDRSxvQkFBb0I7d0tBcUJiLHNCQUFzQjtzQkFBdEMsTUFBTTtnQkFjSCxnQkFBZ0I7c0JBRG5CLEtBQUs7dUJBQUMsa0JBQWtCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVG9hc3RyU2VydmljZSB9IGZyb20gJ25neC10b2FzdHInO1xuaW1wb3J0IHsgQXBwbGljYXRpb25Db250ZW50U2VydmljZSB9IGZyb20gJy4uLy4uL2FwcGxpY2F0aW9uLWNvbnRlbnQuc2VydmljZSc7XG5pbXBvcnQgeyBDb21tb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29tbW9uJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLW9ubGluZS1tZXRyaWNzJyxcbiAgdGVtcGxhdGVVcmw6ICcuL29ubGluZS1tZXRyaWNzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vb25saW5lLW1ldHJpY3MuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBPbmxpbmVNZXRyaWNzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgbG9hZGluZ01vZGFsOiBib29sZWFuO1xuICAvLyBASW5wdXQoKSBxdWVyeUJ1bGRlckRhdGFzZXQ6IGFueTtcbiAgcmVxRmllbGRzRGF0YVNvdXJjZTogYW55ID0gW107XG4gIGlzcmVxRmllbGRzOiBib29sZWFuID0gZmFsc2U7XG4gIGlzY2RyUGFyYW1zOiBib29sZWFuID0gZmFsc2U7XG4gIGNkckZpZWxkc0RhdGFTb3VyY2U6IGFueSA9IFtdO1xuICBrcGlfZnVuY3Rpb246IGFueSA9IFtcInN1bVwiLCBcImNvdW50XCIsIFwiYXZnXCIsIFwibWF4XCIsIFwibWluXCIsIFwic3RkZGV2XCIsIFwiY291bnRfZGlzdGluY3RcIl1cbiAga3BpX29wZXJhdG9yOiBhbnkgPSBbXCJlcVwiLCBcImd0ZVwiLCBcImx0ZVwiLCBcIm5lXCIsIFwiaW5cIiwgXCJub3RJblwiXVxuICBrcGlfZW5yaWNobWVudF9uYW1lOiBhbnkgPSBbXTtcbiAgcmVxU2hvcnREYXRhU291cmNlOiBhbnkgPSBbXTtcbiAgZmlsdGVyTWFwaW5nRGF0YXNvdXJjZTogYW55ID0gW107XG4gIHF1ZXJ5X2RhdGE6IGFueTtcbiAgaXNNb2RlbFZpc2libGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgaXNTcWxDb3BpZWRUZXh0OiBib29sZWFuID0gZmFsc2U7XG4gIHF1ZXJ5QnVsZGVyRGF0YXNldDogYW55O1xuICBpc1JlY29uQ29sdW1lOiBib29sZWFuID0gZmFsc2U7XG4gIEBPdXRwdXQoKSBwdWJsaWMgZ2V0TWV0UmljT25saW5lRGF0YVNldDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgcmVjb25Db2x1bWVEYXRhc291cmNlID0gW107XG5cbiAgc2VsZWN0ZWREYXRhU291cmNlOiBhbnk7XG4gIGlzUXVlcnlUeXBlU2VsZWN0OiBib29sZWFuID0gZmFsc2U7XG5cbiAgbWVzdXJlc0FuZERpbWVudGlvbnNDb2x1bW5zID0gW107XG4gIG1ldHJpY01haW5PYmplY3Q6IGFueSA9IHt9O1xuXG4gIG1ldHJpY3R5cGU6IGFueTtcblxuXG4gIEBJbnB1dCgnb25saW5lTWV0cmljRGF0YScpXG4gIHNldCBvbmxpbmVNZXRyaWNEYXRhKHZhbHVlKSB7XG4gICAgdGhpcy5tZXRyaWNNYWluT2JqZWN0ID0gdmFsdWU7XG4gICAgdmFsdWUuc291cmNlLmRpbWVuc2lvbnMuZm9yRWFjaChkaW1lbnNpb24gPT4ge1xuICAgICAgdGhpcy5tZXN1cmVzQW5kRGltZW50aW9uc0NvbHVtbnMucHVzaCh7XG4gICAgICAgIC4uLmRpbWVuc2lvbixcbiAgICAgICAgbWVhc3VyZXM6IGZhbHNlXG4gICAgICB9KTtcbiAgICB9KTtcbiAgICB2YWx1ZS5zb3VyY2UubWVhc3VyZXMuZm9yRWFjaChtZWFzdXJlID0+IHtcbiAgICAgIHRoaXMubWVzdXJlc0FuZERpbWVudGlvbnNDb2x1bW5zLnB1c2goe1xuICAgICAgICAuLi5tZWFzdXJlLFxuICAgICAgICBtZWFzdXJlczogdHJ1ZVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuXG5cbiAgY29uc3RydWN0b3IocHVibGljIGNvbW1vblNlcnZpY2U6IENvbW1vblNlcnZpY2UsIHByaXZhdGUgdG9hc3RyOiBUb2FzdHJTZXJ2aWNlLCBwcml2YXRlIHNlcnZpY2U6IEFwcGxpY2F0aW9uQ29udGVudFNlcnZpY2UpIHsgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuc2VydmljZS5saXN0Q29sdW1uRW5yaWNobWVudEZ1bmN0aW9ucygpLnN1YnNjcmliZShkYXRhID0+IHtcbiAgICAgIHRoaXMua3BpX2VucmljaG1lbnRfbmFtZSA9IGRhdGE7XG4gICAgfSlcbiAgfVxuXG4gIGFkZENvbHVtbnMoKSB7XG4gICAgbGV0IG9iaiA9IHtcbiAgICAgIFwibWVhc3VyZXNcIjogdHJ1ZSxcbiAgICAgIFwiZmllbGROYW1lXCI6IFwiXCIsXG4gICAgICBcImFsaWFzTmFtZVwiOiBcIlwiLFxuICAgICAgXCJkYXRhVHlwZVwiOiBcIlwiLFxuICAgICAgXCJmb3JtYXRcIjogXCJcIixcbiAgICAgIFwibWV0aG9kXCI6IFwiXCIsXG4gICAgICBcInR5cGVcIjogXCJcIlxuICAgIH1cbiAgICB0aGlzLm1lc3VyZXNBbmREaW1lbnRpb25zQ29sdW1ucy5wdXNoKG9iaik7XG4gIH1cblxuXG4gIGRlbGV0ZUNvbHVtbnMoaSkge1xuICAgIHRoaXMubWVzdXJlc0FuZERpbWVudGlvbnNDb2x1bW5zLnNwbGljZShpLCAxKVxuICB9XG5cbiAgYWRkRmlsdGVyTWFwaW5nQ29sdW1ucygpIHtcbiAgICBsZXQgb2JqID0ge1xuICAgICAgXCJmaWVsZE5hbWVcIjogXCJcIixcbiAgICAgIFwib3BlcmF0aW9uXCI6IFwiXCIsXG4gICAgICBcInRocmVzaG9sZFwiOiBcIlwiLFxuICAgICAgXCJjb21wYXJhdG9yXCI6IFwiXCIsXG4gICAgfVxuICAgIHRoaXMubWV0cmljTWFpbk9iamVjdC5zb3VyY2UuZmlsdGVycy5wdXNoKG9iaik7XG4gIH1cblxuICBkZWxldGVGaWx0ZXJNYXBpbmdDb2x1bW5zKGkpIHtcbiAgICB0aGlzLm1ldHJpY01haW5PYmplY3Quc291cmNlLmZpbHRlcnMuc3BsaWNlKGksIDEpO1xuICB9XG5cbiAgYWRkRXhjbHVzaW9uc01hcGluZ0NvbHVtbnMoKSB7XG4gICAgbGV0IG9iaiA9IHtcbiAgICAgIFwiZmllbGROYW1lXCI6IFwiXCIsXG4gICAgICBcIm9wZXJhdGlvblwiOiBcIlwiLFxuICAgICAgXCJ0aHJlc2hvbGRcIjogXCJcIixcbiAgICAgIFwiY29tcGFyYXRvclwiOiBcIlwiLFxuICAgIH1cbiAgICB0aGlzLm1ldHJpY01haW5PYmplY3Quc291cmNlLmV4Y2x1c2lvbnMucHVzaChvYmopO1xuICB9XG5cbiAgZGVsZXRlRXhjbHVzaW9uc01hcGluZ0NvbHVtbnMoaSkge1xuICAgIHRoaXMubWV0cmljTWFpbk9iamVjdC5zb3VyY2UuZXhjbHVzaW9ucy5zcGxpY2UoaSwgMSk7XG4gIH1cblxuXG5cbiAgdHJhbnNmb3JtRGF0YUZvck1GaWx0ZXIobWFwZmlsdGVyKSB7XG4gICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgIG1hcGZpbHRlci5mb3JFYWNoKG1hcHBpbmcgPT4ge1xuICAgICAgbGV0IHJlc3VsdE9iaiA9IHtcbiAgICAgICAgY29sdW1uTmFtZTogbWFwcGluZy5zZXJ2ZXJDb2x1bW4sXG4gICAgICAgIGRhdGFUeXBlOiBtYXBwaW5nLmRhdGFUeXBlLFxuICAgICAgICBvcGVyYXRvcjogbWFwcGluZy5vcGVyYXRvck5hbWUsXG4gICAgICAgIHZhbHVlOiBtYXBwaW5nLmRlZmF1bHRWYWx1ZVxuICAgICAgfTtcbiAgICAgIHJlc3VsdC5wdXNoKHJlc3VsdE9iaik7XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG5cblxuICBjcmVhdGVPbmxpbmVNZXRyaWNzKCkge1xuICAgIHRoaXMubWV0cmljTWFpbk9iamVjdC5zb3VyY2UubWVhc3VyZXMgPSBbXTtcbiAgICB0aGlzLm1ldHJpY01haW5PYmplY3Quc291cmNlLmRpbWVuc2lvbnMgPSBbXTtcblxuICAgIHRoaXMubWVzdXJlc0FuZERpbWVudGlvbnNDb2x1bW5zLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAvLyBDaGVjayBpZiBlbGVtZW50LmFkdmFuY2VkQ29sdW1uIGlzIGFuIGVtcHR5IHN0cmluZyBhbmQgc2V0IGl0IHRvIG51bGxcbiAgICAgIC8vIGNvbnN0IGFkdmFuY2VkQ29sdW1uVmFsdWUgPSBlbGVtZW50LmFkdmFuY2VkQ29sdW1uID09PSBcIlwiID8gbnVsbCA6IGVsZW1lbnQuYWR2YW5jZWRDb2x1bW47XG5cbiAgICAgIGlmIChlbGVtZW50Lm1lYXN1cmVzKSB7XG4gICAgICAgIGxldCBvYmogPSB7XG4gICAgICAgICAgZmllbGROYW1lOiBlbGVtZW50LmZpZWxkTmFtZSxcbiAgICAgICAgICBhbGlhc05hbWU6IGVsZW1lbnQuYWxpYXNOYW1lLFxuICAgICAgICAgIGRhdGFUeXBlOiBlbGVtZW50LmRhdGFUeXBlLFxuICAgICAgICAgIHR5cGU6IGVsZW1lbnQudHlwZSxcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubWV0cmljTWFpbk9iamVjdC5zb3VyY2UubWVhc3VyZXMucHVzaChvYmopO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IG9iaiA9IHtcbiAgICAgICAgICBmaWVsZE5hbWU6IGVsZW1lbnQuZmllbGROYW1lLFxuICAgICAgICAgIGFsaWFzTmFtZTogZWxlbWVudC5hbGlhc05hbWUsXG4gICAgICAgICAgZGF0YVR5cGU6IGVsZW1lbnQuZGF0YVR5cGUsXG4gICAgICAgICAgdHlwZTogZWxlbWVudC50eXBlLFxuICAgICAgICB9XG4gICAgICAgIHRoaXMubWV0cmljTWFpbk9iamVjdC5zb3VyY2UuZGltZW5zaW9ucy5wdXNoKG9iaik7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLmdldE1ldFJpY09ubGluZURhdGFTZXQuZW1pdCh0aGlzLm1ldHJpY01haW5PYmplY3QpXG4gIH1cblxuICBnZXRRdWVyeUZvckRldGFpbHNEYXRhKGUpIHtcbiAgICBpZiAoZS52YWx1ZSA9PSAnQmFzaWMnKSB7XG4gICAgICB0aGlzLnF1ZXJ5QnVsZGVyRGF0YXNldC5hcGkgPSAnL2twaS9nZW5lcmljRGV0YWlsRGF0YVJlc3BvbnNlJ1xuICAgICAgdGhpcy5xdWVyeUJ1bGRlckRhdGFzZXQucXVlcnlDb25maWcuY29sdW1ucyA9IFtdO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnF1ZXJ5QnVsZGVyRGF0YXNldC5hcGkgPSAnL2twaS9nZW5lcmljQWdncmVnYXRlUGFnaW5hdGVkS3BpU2VydmljZVJlc3BvbnNlJztcbiAgICB9XG4gIH1cblxuXG4gIGdldERhdGFDb25maWcoZSkge1xuICAgIGlmIChlLmV2ZW50KSB7XG4gICAgICB0aGlzLnNlbGVjdGVkRGF0YVNvdXJjZSA9IGUudmFsdWU7XG4gICAgICB0aGlzLmlzUXVlcnlUeXBlU2VsZWN0ID0gdHJ1ZTtcbiAgICB9XG5cbiAgfVxuXG5cbiAgYWRkSGF2aW5nc0NvbHVtZSgpIHtcbiAgICBsZXQgb2JqID0ge1xuICAgICAgXCJjb2x1bW5OYW1lXCI6IFwiXCIsXG4gICAgICBcImFkdmFuY2VkQ29sdW1uXCI6IFwiXCIsXG4gICAgICBcImRhdGFUeXBlXCI6IFwiXCIsXG4gICAgICBcIm9wZXJhdG9yXCI6IFwiXCIsXG4gICAgICBcInZhbHVlXCI6IFwiXCJcbiAgICB9XG4gICAgdGhpcy5xdWVyeUJ1bGRlckRhdGFzZXQucXVlcnlDb25maWcuaGF2aW5ncy5wdXNoKG9iaik7XG4gIH1cblxuICBkZWxldGVIYXZpbmdzQ29sdW1lKGkpIHtcbiAgICB0aGlzLnF1ZXJ5QnVsZGVyRGF0YXNldC5xdWVyeUNvbmZpZy5oYXZpbmdzLnNwbGljZShpLCAxKTtcbiAgfVxuXG5cbn1cbiIsIjxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGZsZXgtYXV0byBtaW4tdy0wIG15LTNcIj5cbiAgICA8ZGl2IGNsYXNzPVwidGV4dC1sZyBweS0yIGZvbnQtZXh0cmFib2xkIGJvcmRlci1iIGJnLWdyYXktNzAwIHRleHQtd2hpdGUgcHgtMlwiPiBUYXJnZXRcbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwicHQtMiBib3JkZXIteCBib3JkZXItYiBcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC13cmFwIHAtMlwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTIgbWItMiB3LTEvMlwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj4gRGF0YWJhc2UgTmFtZTwvZGl2PlxuICAgICAgICAgICAgICAgIDxkeC10ZXh0LWJveCBbKG5nTW9kZWwpXT1cIm1ldHJpY01haW5PYmplY3QudGFyZ2V0LmRhdGFiYXNlTmFtZVwiPjwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0yIG1iLTIgdy0xLzJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+IERCIENvbmZpZyA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZHgtc2VsZWN0LWJveCBbaXRlbXNdPVwiWydtb25nbycsJ2ltcGFsYScsJ3Bvc3RncmVzJywnbXlzcWwnLCdiaWdxdWVyeSddXCJcbiAgICAgICAgICAgICAgICAgICAgKG9uVmFsdWVDaGFuZ2VkKT1cImdldERhdGFDb25maWcoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwibWV0cmljTWFpbk9iamVjdC50YXJnZXQuZGJDb25maWdcIj48L2R4LXNlbGVjdC1ib3g+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0yIG1iLTIgdy0xLzJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+IFRhYmxlIE5hbWU8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJtZXRyaWNNYWluT2JqZWN0LnRhcmdldC50YWJsZU5hbWVcIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMiBtYi0yIHctMS8yXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPiBEaW1lbnNpb24gQ29sdW1uczwvZGl2PlxuICAgICAgICAgICAgICAgIDxkeC10ZXh0LWJveCBbKG5nTW9kZWwpXT1cIm1ldHJpY01haW5PYmplY3QudGFyZ2V0LmRpbWVuc2lvbkNvbHVtbnNcIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMiBtYi0yIHctMS8zXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPiBNZWFzdXJlIENvbHVtbnM8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJtZXRyaWNNYWluT2JqZWN0LnRhcmdldC5tZWFzdXJlQ29sdW1uc1wiPjwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0yIG1iLTIgdy0xLzNcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+IFdyaXRlIERpc3Bvc2l0aW9uPC9kaXY+XG4gICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwibWV0cmljTWFpbk9iamVjdC50YXJnZXQud3JpdGVEaXNwb3NpdGlvblwiPjwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0yIG1iLTIgdy0xLzNcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yIG10LThcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZHgtY2hlY2stYm94IHRleHQ9XCJDcmVhdGUgVGFibGVcIiBbKG5nTW9kZWwpXT1cIm1ldHJpY01haW5PYmplY3QudGFyZ2V0LmNyZWF0ZVRhYmxlXCI+PC9keC1jaGVjay1ib3g+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG48L2Rpdj5cbjxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGZsZXgtYXV0byBtaW4tdy0wIG15LTNcIj5cbiAgICA8ZGl2IGNsYXNzPVwidGV4dC1sZyBweS0yIGZvbnQtZXh0cmFib2xkIGJvcmRlci1iIGJnLWdyYXktNzAwIHRleHQtd2hpdGUgcHgtMlwiPiBTb3VyY2VcbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwicHQtMiBib3JkZXIteCBib3JkZXItYiBcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC13cmFwIHAtMlwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTIgbWItMiB3LTEvMlwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj4gRGF0YSBTb3VyY2UgTmFtZTwvZGl2PlxuICAgICAgICAgICAgICAgIDxkeC10ZXh0LWJveCBbKG5nTW9kZWwpXT1cIm1ldHJpY01haW5PYmplY3Quc291cmNlLmRhdGFzb3VyY2VcIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMiBtYi0yIHctMS8yXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPiBFdmVudCBOYW1lPC9kaXY+XG4gICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwibWV0cmljTWFpbk9iamVjdC5zb3VyY2UuZXZlbnROYW1lXCI+PC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZmxleC1hdXRvIG1pbi13LTAgbXktMlwiPlxuICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWxnIHB5LTIgZm9udC1leHRyYWJvbGQgYm9yZGVyLWIgYmctZ3JheS03MDAgdGV4dC13aGl0ZSBweC0yXCI+TWVhc3VyZXMgYW5kXG4gICAgICAgIERpbWVuc2lvbnNcbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwicHQtMiBib3JkZXIteCBib3JkZXItYiBcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm15LTIgZmxleCBqdXN0aWZ5LWJldHdlZW5cIiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBtZXN1cmVzQW5kRGltZW50aW9uc0NvbHVtbnM7IGxldCBpID0gaW5kZXg7XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMSBtYi0yXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPiBNZWFzdXJlczwvZGl2PlxuICAgICAgICAgICAgICAgIDxkeC1jaGVjay1ib3ggW3ZhbHVlXT1cIml0ZW0ubWVhc3VyZXNcIiBbKG5nTW9kZWwpXT1cIml0ZW0ubWVhc3VyZXNcIj48L2R4LWNoZWNrLWJveD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTEgbWItMiB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+IFZhbHVlIEZpZWxkKGFsaWFzTmFtZSk8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJpdGVtLmFsaWFzTmFtZVwiPjwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0xIG1iLTIgdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPiBTZXJ2ZXIgQ29sdW1uIE5hbWU8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJpdGVtLmZpZWxkTmFtZVwiPjwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgXG4gICAgICAgICAgIFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTEgbWItMiB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+IERhdGF0eXBlPC9kaXY+XG4gICAgICAgICAgICAgICAgPGR4LXNlbGVjdC1ib3ggW3NlYXJjaEVuYWJsZWRdPVwidHJ1ZVwiIFtpdGVtc109XCJbJ2RhdGUnLCdzdHJpbmcnLCd0aW1lc3RhbXAnLCdpbnQnLCAnZG91YmxlJywgJ2Jvb2xlYW4nXVwiXG4gICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiaXRlbS5kYXRhVHlwZVwiPjwvZHgtc2VsZWN0LWJveD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTEgbWItMiB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+IFR5cGU8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZHgtc2VsZWN0LWJveCBbc2VhcmNoRW5hYmxlZF09XCJ0cnVlXCIgW2l0ZW1zXT1cImtwaV9mdW5jdGlvblwiIFsobmdNb2RlbCldPVwiaXRlbS50eXBlXCI+PC9keC1zZWxlY3QtYm94PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMSBtYi0yIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj4gRm9ybWF0PC9kaXY+XG4gICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwiaXRlbS5mb3JtYXRcIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMSBtYi0yIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj4gTWV0aG9kIE5hbWU8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJpdGVtLm1ldGhvZFwiPjwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTEgbXQtNyB0ZXh0LWNlbnRlclwiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX2Rhbmdlcl9zbX19IGN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cImRlbGV0ZUNvbHVtbnMoaSlcIj48aVxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYSBmYS10cmFzaC1vXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGp1c3RpZnktZW5kIG15LTJcIj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX3ByaW1hcnlfc219fSBjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJhZGRDb2x1bW5zKClcIj5BZGRcbiAgICAgICAgICAgICAgICBDb2x1bW5zPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9kaXY+XG48ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBmbGV4LWF1dG8gbWluLXctMCBteS0yXCI+XG4gICAgPGRpdiBjbGFzcz1cInRleHQtbGcgcHktMiBmb250LWV4dHJhYm9sZCBib3JkZXItYiBiZy1ncmF5LTcwMCB0ZXh0LXdoaXRlIHB4LTJcIj4gRmlsdGVyIE1hcGluZ1xuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJwdC0yIGJvcmRlci14IGJvcmRlci1iIFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibXktMiBmbGV4IGZsZXgtcm93IGp1c3RpZnktYmV0d2VlblwiXG4gICAgICAgICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBtZXRyaWNNYWluT2JqZWN0LnNvdXJjZS5maWx0ZXJzOyBsZXQgaSA9IGluZGV4O1wiPlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMSBtYi0yIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj4gRmllbGQgTmFtZTwvZGl2PlxuICAgICAgICAgICAgICAgIDxkeC10ZXh0LWJveCBbKG5nTW9kZWwpXT1cIml0ZW0uZmllbGROYW1lXCI+PC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTEgbWItMiB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+IE9wZXJhdGlvbjwvZGl2PlxuICAgICAgICAgICAgICAgIDxkeC10ZXh0LWJveCBbKG5nTW9kZWwpXT1cIml0ZW0ub3BlcmF0aW9uXCI+PC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTEgbWItMiB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+IFRocmVzaG9sZDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkeC10ZXh0LWJveCBbKG5nTW9kZWwpXT1cIml0ZW0udGhyZXNob2xkXCI+PC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTEgbWItMiB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+IENvbXBhcmF0b3I8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZHgtc2VsZWN0LWJveCBbKG5nTW9kZWwpXT1cIml0ZW0uY29tcGFyYXRvclwiIFtpdGVtc109XCJrcGlfb3BlcmF0b3JcIj48L2R4LXNlbGVjdC1ib3g+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTEgbXQtNyB0ZXh0LWNlbnRlclwiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX2Rhbmdlcl9zbX19IGN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cImRlbGV0ZUZpbHRlck1hcGluZ0NvbHVtbnMoaSlcIj48aVxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYSBmYS10cmFzaC1vXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cganVzdGlmeS1lbmQgbXktMlwiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl9wcmltYXJ5X3NtfX0gY3Vyc29yLXBvaW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZEZpbHRlck1hcGluZ0NvbHVtbnMoKVwiPkFkZFxuICAgICAgICAgICAgICAgICAgICAgICAgTWFwaW5nPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG48L2Rpdj5cbjxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGZsZXgtYXV0byBtaW4tdy0wIG15LTJcIj5cbiAgICA8ZGl2IGNsYXNzPVwidGV4dC1sZyBweS0yIGZvbnQtZXh0cmFib2xkIGJvcmRlci1iIGJnLWdyYXktNzAwIHRleHQtd2hpdGUgcHgtMlwiPiBFeGNsdXNpb25zXG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cInB0LTIgYm9yZGVyLXggYm9yZGVyLWIgXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJteS0yIGZsZXggZmxleC1yb3cganVzdGlmeS1iZXR3ZWVuXCJcbiAgICAgICAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIG1ldHJpY01haW5PYmplY3Quc291cmNlLmV4Y2x1c2lvbnM7IGxldCBpID0gaW5kZXg7XCI+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0xIG1iLTIgdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPiBGaWVsZCBOYW1lPC9kaXY+XG4gICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwiaXRlbS5maWVsZE5hbWVcIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMSBtYi0yIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj4gT3BlcmF0aW9uPC9kaXY+XG4gICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwiaXRlbS5vcGVyYXRpb25cIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMSBtYi0yIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj4gVGhyZXNob2xkPC9kaXY+XG4gICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwiaXRlbS50aHJlc2hvbGRcIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMSBtYi0yIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj4gQ29tcGFyYXRvcjwvZGl2PlxuICAgICAgICAgICAgICAgIDxkeC1zZWxlY3QtYm94IFsobmdNb2RlbCldPVwiaXRlbS5jb21wYXJhdG9yXCIgW2l0ZW1zXT1cImtwaV9vcGVyYXRvclwiPjwvZHgtc2VsZWN0LWJveD5cblxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0xIG10LTcgdGV4dC1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl9kYW5nZXJfc219fSBjdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkZWxldGVFeGNsdXNpb25zTWFwaW5nQ29sdW1ucyhpKVwiPjxpIGNsYXNzPVwiZmEgZmEtdHJhc2gtb1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvd1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctZnVsbFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGp1c3RpZnktZW5kIG15LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fcHJpbWFyeV9zbX19IGN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhZGRFeGNsdXNpb25zTWFwaW5nQ29sdW1ucygpXCI+QWRkXG4gICAgICAgICAgICAgICAgICAgICAgICBFeGNsdXNpb25zPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG48L2Rpdj5cbjxkaXYgY2xhc3M9XCJmbGV4IHctZnVsbCBqdXN0aWZ5LWVuZCBtdC01IGJvcmRlci10XCI+XG4gICAgPGJ1dHRvbiBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fc3VjY2Vzc19tZH19IGN1cnNvci1wb2ludGVyIG14LTEgbXktMlwiIChjbGljayk9XCJjcmVhdGVPbmxpbmVNZXRyaWNzKClcIj5cbiAgICAgICAgU2F2ZSBPbmxpbmUgTWV0cmljc1xuICAgIDwvYnV0dG9uPlxuPC9kaXY+Il19
|