@c8y/ngx-components 1018.0.205 → 1018.0.208
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/api/api.service.d.ts +7 -1
- package/ecosystem/shared/ecosystem.constants.d.ts +1 -1
- package/esm2020/api/api.service.mjs +17 -2
- package/esm2020/assets-navigator/asset-node.service.mjs +2 -2
- package/esm2020/auth-configuration/sso-configuration/template-parts/external-token-config.component.mjs +3 -3
- package/esm2020/cockpit-config/cockpit-configuration.component.mjs +3 -3
- package/esm2020/cockpit-config/setup/cockpit-setup-step3.component.mjs +3 -3
- package/esm2020/core/file-picker-new/file-picker-new.component.mjs +3 -3
- package/esm2020/core/file-picker-new/file-picker-validators.mjs +4 -4
- package/esm2020/core/help/help.component.mjs +3 -3
- package/esm2020/ecosystem/license-confirm/license-confirm-modal.component.mjs +5 -5
- package/esm2020/ecosystem/shared/ecosystem.constants.mjs +2 -2
- package/esm2020/icon-selector/icons/hands/index.mjs +2 -2
- package/esm2020/map/map-status.component.mjs +3 -3
- package/esm2020/protocol-lwm2m/factories/lwm2m-device-grid.factory.mjs +2 -2
- package/esm2020/sub-assets/assign-devices/assign-devices.component.mjs +3 -3
- package/esm2020/widgets/implementations/map/map-widget-config.component.mjs +3 -3
- package/fesm2015/c8y-ngx-components-api.mjs +16 -1
- package/fesm2015/c8y-ngx-components-api.mjs.map +1 -1
- package/fesm2015/c8y-ngx-components-assets-navigator.mjs +1 -1
- package/fesm2015/c8y-ngx-components-assets-navigator.mjs.map +1 -1
- package/fesm2015/c8y-ngx-components-auth-configuration.mjs +2 -2
- package/fesm2015/c8y-ngx-components-auth-configuration.mjs.map +1 -1
- package/fesm2015/c8y-ngx-components-cockpit-config.mjs +4 -4
- package/fesm2015/c8y-ngx-components-cockpit-config.mjs.map +1 -1
- package/fesm2015/c8y-ngx-components-ecosystem-license-confirm.mjs +4 -4
- package/fesm2015/c8y-ngx-components-ecosystem-license-confirm.mjs.map +1 -1
- package/fesm2015/c8y-ngx-components-ecosystem-shared.mjs +1 -1
- package/fesm2015/c8y-ngx-components-ecosystem-shared.mjs.map +1 -1
- package/fesm2015/c8y-ngx-components-icon-selector-icons-hands.mjs +1 -1
- package/fesm2015/c8y-ngx-components-icon-selector-icons-hands.mjs.map +1 -1
- package/fesm2015/c8y-ngx-components-map.mjs +2 -2
- package/fesm2015/c8y-ngx-components-map.mjs.map +1 -1
- package/fesm2015/c8y-ngx-components-protocol-lwm2m-factories.mjs +1 -1
- package/fesm2015/c8y-ngx-components-protocol-lwm2m-factories.mjs.map +1 -1
- package/fesm2015/c8y-ngx-components-sub-assets.mjs +2 -2
- package/fesm2015/c8y-ngx-components-sub-assets.mjs.map +1 -1
- package/fesm2015/c8y-ngx-components-widgets-implementations-map.mjs +2 -2
- package/fesm2015/c8y-ngx-components-widgets-implementations-map.mjs.map +1 -1
- package/fesm2015/c8y-ngx-components.mjs +7 -7
- package/fesm2015/c8y-ngx-components.mjs.map +1 -1
- package/fesm2020/c8y-ngx-components-api.mjs +16 -1
- package/fesm2020/c8y-ngx-components-api.mjs.map +1 -1
- package/fesm2020/c8y-ngx-components-assets-navigator.mjs +1 -1
- package/fesm2020/c8y-ngx-components-assets-navigator.mjs.map +1 -1
- package/fesm2020/c8y-ngx-components-auth-configuration.mjs +2 -2
- package/fesm2020/c8y-ngx-components-auth-configuration.mjs.map +1 -1
- package/fesm2020/c8y-ngx-components-cockpit-config.mjs +4 -4
- package/fesm2020/c8y-ngx-components-cockpit-config.mjs.map +1 -1
- package/fesm2020/c8y-ngx-components-ecosystem-license-confirm.mjs +4 -4
- package/fesm2020/c8y-ngx-components-ecosystem-license-confirm.mjs.map +1 -1
- package/fesm2020/c8y-ngx-components-ecosystem-shared.mjs +1 -1
- package/fesm2020/c8y-ngx-components-ecosystem-shared.mjs.map +1 -1
- package/fesm2020/c8y-ngx-components-icon-selector-icons-hands.mjs +1 -1
- package/fesm2020/c8y-ngx-components-icon-selector-icons-hands.mjs.map +1 -1
- package/fesm2020/c8y-ngx-components-map.mjs +2 -2
- package/fesm2020/c8y-ngx-components-map.mjs.map +1 -1
- package/fesm2020/c8y-ngx-components-protocol-lwm2m-factories.mjs +1 -1
- package/fesm2020/c8y-ngx-components-protocol-lwm2m-factories.mjs.map +1 -1
- package/fesm2020/c8y-ngx-components-sub-assets.mjs +2 -2
- package/fesm2020/c8y-ngx-components-sub-assets.mjs.map +1 -1
- package/fesm2020/c8y-ngx-components-widgets-implementations-map.mjs +2 -2
- package/fesm2020/c8y-ngx-components-widgets-implementations-map.mjs.map +1 -1
- package/fesm2020/c8y-ngx-components.mjs +7 -7
- package/fesm2020/c8y-ngx-components.mjs.map +1 -1
- package/icon-selector/icons/hands/index.d.ts +1 -1
- package/locales/de.po +519 -166
- package/locales/en.po +4 -1
- package/locales/es.po +816 -305
- package/locales/fr.po +732 -220
- package/locales/ja_JP.po +812 -225
- package/locales/ko.po +940 -429
- package/locales/locales.pot +20 -38
- package/locales/nl.po +804 -293
- package/locales/pl.po +712 -222
- package/locales/pt_BR.po +875 -364
- package/locales/ru.po +752 -250
- package/locales/zh_CN.po +823 -312
- package/locales/zh_TW.po +1188 -677
- package/package.json +1 -1
|
@@ -154,10 +154,10 @@ export class MapWidgetConfigComponent {
|
|
|
154
154
|
}
|
|
155
155
|
}
|
|
156
156
|
MapWidgetConfigComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: MapWidgetConfigComponent, deps: [{ token: i1.MapService }, { token: i2.AlertService }, { token: i3.TranslateService }, { token: MAP_DEFAULT_CONFIG, optional: true }, { token: i4.IconSelectorService }], target: i0.ɵɵFactoryTarget.Component });
|
|
157
|
-
MapWidgetConfigComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: MapWidgetConfigComponent, selector: "c8y-map-widget-config", inputs: { config: "config" }, viewQueries: [{ propertyName: "previewMap", first: true, predicate: MapComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"row p-t-16\">\n <div class=\"col-xs-2\">\n <c8y-form-group class=\"m-b-0 text-center form-group-sm\">\n <label translate>Marker icon</label>\n <div class=\"icon-32 text-muted text-center p-b-8\" *ngIf=\"formConfig.icon\">\n <i [c8yIcon]=\"formConfig.icon\"></i>\n </div>\n <div class=\"icon-32 text-muted text-center\" *ngIf=\"!formConfig.icon\">\n <span class=\"d-block text-12 p-b-16 p-t-16\">\n <em>{{ 'Auto' | translate }}</em>\n </span>\n </div>\n <button\n type=\"button\"\n title=\"{{ 'Select icon to override default behavior' | translate }}\"\n class=\"btn btn-default btn-xs btn-block\"\n *ngIf=\"!formConfig.icon\"\n (click)=\"openIconSelector()\"\n >\n {{ 'Select' | translate }}\n </button>\n <button\n type=\"button\"\n title=\"{{ 'Change icon' | translate }}\"\n class=\"btn btn-default btn-xs btn-block\"\n *ngIf=\"formConfig.icon\"\n (click)=\"openIconSelector()\"\n >\n {{ 'Change' | translate }}\n </button>\n <button\n type=\"button\"\n title=\"{{ 'Remove icon and use default behavior' | translate }}\"\n class=\"btn btn-danger btn-xs btn-block\"\n *ngIf=\"formConfig.icon\"\n (click)=\"removeIcon()\"\n >\n {{ 'Remove' | translate }}\n </button>\n </c8y-form-group>\n </div>\n <div class=\"col-xs-10\">\n <div class=\"row tight-grid separator-bottom\">\n <div class=\"col-xs-4\">\n <div class=\"form-group form-group-sm\">\n <label translate>Zoom level</label>\n <c8y-range\n #range\n [(ngModel)]=\"formConfig.zoomLevel\"\n name=\"zoomLevel\"\n class=\"label-bottom\"\n (change)=\"zoomLevelChanged()\"\n >\n <input type=\"range\" min=\"2\" max=\"18\" step=\"1\" />\n </c8y-range>\n </div>\n </div>\n <div class=\"col-xs-8\">\n <c8y-form-group class=\"form-group-sm m-b-8\">\n <label translate>Center bound</label>\n <div class=\"input-group input-group-sm\">\n <input\n class=\"form-control\"\n type=\"number\"\n required\n placeholder=\"lat\"\n [(ngModel)]=\"formConfig.center[0]\"\n (change)=\"changeCenter()\"\n name=\"centerLat\"\n />\n <input\n class=\"form-control\"\n type=\"number\"\n required\n placeholder=\"lng\"\n [(ngModel)]=\"formConfig.center[1]\"\n (change)=\"changeCenter()\"\n name=\"centerLng\"\n />\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-default\"\n (click)=\"useOwnPosition()\"\n [attr.aria-label]=\"'Use your location' | translate\"\n [tooltip]=\"'Use your location' | translate\"\n container=\"body\"\n placement=\"top\"\n >\n <i c8yIcon=\"location-arrow\" class=\"icon-14\"></i>\n </button>\n </div>\n <div class=\"input-group-btn\" *ngIf=\"canAutoCenter\">\n <button\n class=\"btn btn-default\"\n [attr.aria-label]=\"'Use selected asset location' | translate\"\n [tooltip]=\"'Use selected asset location' | translate\"\n placement=\"top\"\n container=\"body\"\n (click)=\"centerToAsset()\"\n >\n <i c8yIcon=\"location\" class=\"icon-14\"></i>\n </button>\n </div>\n </div>\n <div class=\"help-block\">\n {{ 'Drag the map below to the desired position' | translate }}\n </div>\n </c8y-form-group>\n </div>\n </div>\n\n <div class=\"row tight-grid p-t-8 d-flex a-i-center\">\n <div class=\"col-xs-4\">\n <c8y-form-group class=\"m-b-0 form-group-sm\">\n <div class=\"c8y-select-wrapper\">\n <select\n id=\"selectExample\"\n class=\"form-control\"\n [(ngModel)]=\"refreshOptions\"\n name=\"refreshSelection\"\n title=\"{{ 'Refresh options' | translate }}\"\n (change)=\"updateRefreshOptions()\"\n >\n <option value=\"none\" [title]=\"'Only refreshing on interaction' | translate\" translate>\n No automatic refresh\n </option>\n <option\n value=\"interval\"\n *ngIf=\"!isPositionedDevice\"\n [title]=\"'Refreshing after a give interval and on interaction' | translate\"\n translate\n >\n Use refresh interval\n </option>\n <option\n value=\"realtime\"\n *ngIf=\"isPositionedDevice\"\n [title]=\"'Live updating on each position change' | translate\"\n translate\n >\n Realtime\n </option>\n </select>\n </div>\n </c8y-form-group>\n </div>\n <div class=\"col-xs-8\">\n <div class=\"form-group form-group-sm m-b-0\">\n <c8y-range\n #intervalRange\n [(ngModel)]=\"formConfig.refreshInterval\"\n name=\"refreshInterval\"\n class=\"label-bottom\"\n *ngIf=\"refreshOptions === 'interval'\"\n >\n <ng-template #c8yRangeValue>\n <div>\n <span\n translate\n [translateParams]=\"{ interval: intervalRange.value * 0.001 }\"\n ngNonBindable\n >\n {{ interval }}s\n </span>\n </div>\n </ng-template>\n <input type=\"range\" min=\"5000\" max=\"100000\" step=\"1000\" />\n </c8y-range>\n </div>\n <label class=\"c8y-switch c8y-switch--inline\" *ngIf=\"refreshOptions === 'realtime'\">\n <input type=\"checkbox\" [(ngModel)]=\"formConfig.follow\" name=\"follow\" />\n <span></span>\n <span class=\"text-12\" translate>Follow selected</span>\n </label>\n </div>\n </div>\n </div>\n</div>\n\n<div class=\"p-t-16 p-b-16\" style=\"width: 100%; height: 240px\">\n <c8y-map\n [assets]=\"assets\"\n (onMove)=\"onPreviewMapMove($event)\"\n (onZoomStart)=\"onPreviewZoomStart()\"\n (onZoomEnd)=\"onPreviewZoomEnd($event)\"\n [config]=\"config.mapConfig\"\n ></c8y-map>\n</div>\n", dependencies: [{ kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i6.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i6.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i6.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i6.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i6.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i2.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i2.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i2.MinValidationDirective, selector: "[min]", inputs: ["min"] }, { kind: "directive", type: i2.MaxValidationDirective, selector: "[max]", inputs: ["max"] }, { kind: "component", type: i2.FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: i2.RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "directive", type: i2.RangeDirective, selector: "input[type=\"range\"]" }, { kind: "component", type: i2.RangeComponent, selector: "c8y-range" }, { kind: "component", type: i1.MapComponent, selector: "c8y-map", inputs: ["config", "assets"], outputs: ["onMove", "onMoveEnd", "onZoomStart", "onZoomEnd"] }, { kind: "directive", type: i7.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }, { kind: "pipe", type: i2.C8yTranslatePipe, name: "translate" }], viewProviders: [{ provide: ControlContainer, useExisting: NgForm }] });
|
|
157
|
+
MapWidgetConfigComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: MapWidgetConfigComponent, selector: "c8y-map-widget-config", inputs: { config: "config" }, viewQueries: [{ propertyName: "previewMap", first: true, predicate: MapComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"row p-t-16\">\n <div class=\"col-xs-2\">\n <c8y-form-group class=\"m-b-0 text-center form-group-sm\">\n <label translate>Marker icon</label>\n <div class=\"icon-32 text-muted text-center p-b-8\" *ngIf=\"formConfig.icon\">\n <i [c8yIcon]=\"formConfig.icon\"></i>\n </div>\n <div class=\"icon-32 text-muted text-center\" *ngIf=\"!formConfig.icon\">\n <span class=\"d-block text-12 p-b-16 p-t-16\">\n <em>{{ 'Auto' | translate }}</em>\n </span>\n </div>\n <button\n type=\"button\"\n title=\"{{ 'Select icon to override default behavior' | translate }}\"\n class=\"btn btn-default btn-xs btn-block\"\n *ngIf=\"!formConfig.icon\"\n (click)=\"openIconSelector()\"\n >\n {{ 'Select' | translate }}\n </button>\n <button\n type=\"button\"\n title=\"{{ 'Change icon' | translate }}\"\n class=\"btn btn-default btn-xs btn-block\"\n *ngIf=\"formConfig.icon\"\n (click)=\"openIconSelector()\"\n >\n {{ 'Change' | translate }}\n </button>\n <button\n type=\"button\"\n title=\"{{ 'Remove icon and use default behavior' | translate }}\"\n class=\"btn btn-danger btn-xs btn-block\"\n *ngIf=\"formConfig.icon\"\n (click)=\"removeIcon()\"\n >\n {{ 'Remove' | translate }}\n </button>\n </c8y-form-group>\n </div>\n <div class=\"col-xs-10\">\n <div class=\"row tight-grid separator-bottom\">\n <div class=\"col-xs-4\">\n <div class=\"form-group form-group-sm\">\n <label translate>Zoom level</label>\n <c8y-range\n #range\n [(ngModel)]=\"formConfig.zoomLevel\"\n name=\"zoomLevel\"\n class=\"label-bottom\"\n (change)=\"zoomLevelChanged()\"\n >\n <input type=\"range\" min=\"2\" max=\"18\" step=\"1\" />\n </c8y-range>\n </div>\n </div>\n <div class=\"col-xs-8\">\n <c8y-form-group class=\"form-group-sm m-b-8\">\n <label translate>Center bound</label>\n <div class=\"input-group input-group-sm\">\n <input\n class=\"form-control\"\n type=\"number\"\n required\n placeholder=\"lat\"\n [(ngModel)]=\"formConfig.center[0]\"\n (change)=\"changeCenter()\"\n name=\"centerLat\"\n />\n <input\n class=\"form-control\"\n type=\"number\"\n required\n placeholder=\"lng\"\n [(ngModel)]=\"formConfig.center[1]\"\n (change)=\"changeCenter()\"\n name=\"centerLng\"\n />\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-default\"\n (click)=\"useOwnPosition()\"\n [attr.aria-label]=\"'Use your location' | translate\"\n [tooltip]=\"'Use your location' | translate\"\n container=\"body\"\n placement=\"top\"\n >\n <i c8yIcon=\"location-arrow\" class=\"icon-14\"></i>\n </button>\n </div>\n <div class=\"input-group-btn\" *ngIf=\"canAutoCenter\">\n <button\n class=\"btn btn-default\"\n [attr.aria-label]=\"'Use selected asset location' | translate\"\n [tooltip]=\"'Use selected asset location' | translate\"\n placement=\"top\"\n container=\"body\"\n (click)=\"centerToAsset()\"\n >\n <i c8yIcon=\"location\" class=\"icon-14\"></i>\n </button>\n </div>\n </div>\n <div class=\"help-block\">\n {{ 'Drag the map to the desired position' | translate }}\n </div>\n </c8y-form-group>\n </div>\n </div>\n\n <div class=\"row tight-grid p-t-8 d-flex a-i-center\">\n <div class=\"col-xs-4\">\n <c8y-form-group class=\"m-b-0 form-group-sm\">\n <div class=\"c8y-select-wrapper\">\n <select\n id=\"selectExample\"\n class=\"form-control\"\n [(ngModel)]=\"refreshOptions\"\n name=\"refreshSelection\"\n title=\"{{ 'Refresh options' | translate }}\"\n (change)=\"updateRefreshOptions()\"\n >\n <option value=\"none\" [title]=\"'Only refreshing on interaction' | translate\" translate>\n No automatic refresh\n </option>\n <option\n value=\"interval\"\n *ngIf=\"!isPositionedDevice\"\n [title]=\"'Refreshing after a give interval and on interaction' | translate\"\n translate\n >\n Use refresh interval\n </option>\n <option\n value=\"realtime\"\n *ngIf=\"isPositionedDevice\"\n [title]=\"'Live updating on each position change' | translate\"\n translate\n >\n Realtime\n </option>\n </select>\n </div>\n </c8y-form-group>\n </div>\n <div class=\"col-xs-8\">\n <div class=\"form-group form-group-sm m-b-0\">\n <c8y-range\n #intervalRange\n [(ngModel)]=\"formConfig.refreshInterval\"\n name=\"refreshInterval\"\n class=\"label-bottom\"\n *ngIf=\"refreshOptions === 'interval'\"\n >\n <ng-template #c8yRangeValue>\n <div>\n <span\n translate\n [translateParams]=\"{ interval: intervalRange.value * 0.001 }\"\n ngNonBindable\n >\n {{ interval }}s\n </span>\n </div>\n </ng-template>\n <input type=\"range\" min=\"5000\" max=\"100000\" step=\"1000\" />\n </c8y-range>\n </div>\n <label class=\"c8y-switch c8y-switch--inline\" *ngIf=\"refreshOptions === 'realtime'\">\n <input type=\"checkbox\" [(ngModel)]=\"formConfig.follow\" name=\"follow\" />\n <span></span>\n <span class=\"text-12\" translate>Follow selected</span>\n </label>\n </div>\n </div>\n </div>\n</div>\n\n<div class=\"p-t-16 p-b-16\" style=\"width: 100%; height: 240px\">\n <c8y-map\n [assets]=\"assets\"\n (onMove)=\"onPreviewMapMove($event)\"\n (onZoomStart)=\"onPreviewZoomStart()\"\n (onZoomEnd)=\"onPreviewZoomEnd($event)\"\n [config]=\"config.mapConfig\"\n ></c8y-map>\n</div>\n", dependencies: [{ kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i6.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i6.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i6.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i6.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i6.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i2.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i2.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i2.MinValidationDirective, selector: "[min]", inputs: ["min"] }, { kind: "directive", type: i2.MaxValidationDirective, selector: "[max]", inputs: ["max"] }, { kind: "component", type: i2.FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: i2.RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "directive", type: i2.RangeDirective, selector: "input[type=\"range\"]" }, { kind: "component", type: i2.RangeComponent, selector: "c8y-range" }, { kind: "component", type: i1.MapComponent, selector: "c8y-map", inputs: ["config", "assets"], outputs: ["onMove", "onMoveEnd", "onZoomStart", "onZoomEnd"] }, { kind: "directive", type: i7.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }, { kind: "pipe", type: i2.C8yTranslatePipe, name: "translate" }], viewProviders: [{ provide: ControlContainer, useExisting: NgForm }] });
|
|
158
158
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: MapWidgetConfigComponent, decorators: [{
|
|
159
159
|
type: Component,
|
|
160
|
-
args: [{ selector: 'c8y-map-widget-config', viewProviders: [{ provide: ControlContainer, useExisting: NgForm }], template: "<div class=\"row p-t-16\">\n <div class=\"col-xs-2\">\n <c8y-form-group class=\"m-b-0 text-center form-group-sm\">\n <label translate>Marker icon</label>\n <div class=\"icon-32 text-muted text-center p-b-8\" *ngIf=\"formConfig.icon\">\n <i [c8yIcon]=\"formConfig.icon\"></i>\n </div>\n <div class=\"icon-32 text-muted text-center\" *ngIf=\"!formConfig.icon\">\n <span class=\"d-block text-12 p-b-16 p-t-16\">\n <em>{{ 'Auto' | translate }}</em>\n </span>\n </div>\n <button\n type=\"button\"\n title=\"{{ 'Select icon to override default behavior' | translate }}\"\n class=\"btn btn-default btn-xs btn-block\"\n *ngIf=\"!formConfig.icon\"\n (click)=\"openIconSelector()\"\n >\n {{ 'Select' | translate }}\n </button>\n <button\n type=\"button\"\n title=\"{{ 'Change icon' | translate }}\"\n class=\"btn btn-default btn-xs btn-block\"\n *ngIf=\"formConfig.icon\"\n (click)=\"openIconSelector()\"\n >\n {{ 'Change' | translate }}\n </button>\n <button\n type=\"button\"\n title=\"{{ 'Remove icon and use default behavior' | translate }}\"\n class=\"btn btn-danger btn-xs btn-block\"\n *ngIf=\"formConfig.icon\"\n (click)=\"removeIcon()\"\n >\n {{ 'Remove' | translate }}\n </button>\n </c8y-form-group>\n </div>\n <div class=\"col-xs-10\">\n <div class=\"row tight-grid separator-bottom\">\n <div class=\"col-xs-4\">\n <div class=\"form-group form-group-sm\">\n <label translate>Zoom level</label>\n <c8y-range\n #range\n [(ngModel)]=\"formConfig.zoomLevel\"\n name=\"zoomLevel\"\n class=\"label-bottom\"\n (change)=\"zoomLevelChanged()\"\n >\n <input type=\"range\" min=\"2\" max=\"18\" step=\"1\" />\n </c8y-range>\n </div>\n </div>\n <div class=\"col-xs-8\">\n <c8y-form-group class=\"form-group-sm m-b-8\">\n <label translate>Center bound</label>\n <div class=\"input-group input-group-sm\">\n <input\n class=\"form-control\"\n type=\"number\"\n required\n placeholder=\"lat\"\n [(ngModel)]=\"formConfig.center[0]\"\n (change)=\"changeCenter()\"\n name=\"centerLat\"\n />\n <input\n class=\"form-control\"\n type=\"number\"\n required\n placeholder=\"lng\"\n [(ngModel)]=\"formConfig.center[1]\"\n (change)=\"changeCenter()\"\n name=\"centerLng\"\n />\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-default\"\n (click)=\"useOwnPosition()\"\n [attr.aria-label]=\"'Use your location' | translate\"\n [tooltip]=\"'Use your location' | translate\"\n container=\"body\"\n placement=\"top\"\n >\n <i c8yIcon=\"location-arrow\" class=\"icon-14\"></i>\n </button>\n </div>\n <div class=\"input-group-btn\" *ngIf=\"canAutoCenter\">\n <button\n class=\"btn btn-default\"\n [attr.aria-label]=\"'Use selected asset location' | translate\"\n [tooltip]=\"'Use selected asset location' | translate\"\n placement=\"top\"\n container=\"body\"\n (click)=\"centerToAsset()\"\n >\n <i c8yIcon=\"location\" class=\"icon-14\"></i>\n </button>\n </div>\n </div>\n <div class=\"help-block\">\n {{ 'Drag the map
|
|
160
|
+
args: [{ selector: 'c8y-map-widget-config', viewProviders: [{ provide: ControlContainer, useExisting: NgForm }], template: "<div class=\"row p-t-16\">\n <div class=\"col-xs-2\">\n <c8y-form-group class=\"m-b-0 text-center form-group-sm\">\n <label translate>Marker icon</label>\n <div class=\"icon-32 text-muted text-center p-b-8\" *ngIf=\"formConfig.icon\">\n <i [c8yIcon]=\"formConfig.icon\"></i>\n </div>\n <div class=\"icon-32 text-muted text-center\" *ngIf=\"!formConfig.icon\">\n <span class=\"d-block text-12 p-b-16 p-t-16\">\n <em>{{ 'Auto' | translate }}</em>\n </span>\n </div>\n <button\n type=\"button\"\n title=\"{{ 'Select icon to override default behavior' | translate }}\"\n class=\"btn btn-default btn-xs btn-block\"\n *ngIf=\"!formConfig.icon\"\n (click)=\"openIconSelector()\"\n >\n {{ 'Select' | translate }}\n </button>\n <button\n type=\"button\"\n title=\"{{ 'Change icon' | translate }}\"\n class=\"btn btn-default btn-xs btn-block\"\n *ngIf=\"formConfig.icon\"\n (click)=\"openIconSelector()\"\n >\n {{ 'Change' | translate }}\n </button>\n <button\n type=\"button\"\n title=\"{{ 'Remove icon and use default behavior' | translate }}\"\n class=\"btn btn-danger btn-xs btn-block\"\n *ngIf=\"formConfig.icon\"\n (click)=\"removeIcon()\"\n >\n {{ 'Remove' | translate }}\n </button>\n </c8y-form-group>\n </div>\n <div class=\"col-xs-10\">\n <div class=\"row tight-grid separator-bottom\">\n <div class=\"col-xs-4\">\n <div class=\"form-group form-group-sm\">\n <label translate>Zoom level</label>\n <c8y-range\n #range\n [(ngModel)]=\"formConfig.zoomLevel\"\n name=\"zoomLevel\"\n class=\"label-bottom\"\n (change)=\"zoomLevelChanged()\"\n >\n <input type=\"range\" min=\"2\" max=\"18\" step=\"1\" />\n </c8y-range>\n </div>\n </div>\n <div class=\"col-xs-8\">\n <c8y-form-group class=\"form-group-sm m-b-8\">\n <label translate>Center bound</label>\n <div class=\"input-group input-group-sm\">\n <input\n class=\"form-control\"\n type=\"number\"\n required\n placeholder=\"lat\"\n [(ngModel)]=\"formConfig.center[0]\"\n (change)=\"changeCenter()\"\n name=\"centerLat\"\n />\n <input\n class=\"form-control\"\n type=\"number\"\n required\n placeholder=\"lng\"\n [(ngModel)]=\"formConfig.center[1]\"\n (change)=\"changeCenter()\"\n name=\"centerLng\"\n />\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-default\"\n (click)=\"useOwnPosition()\"\n [attr.aria-label]=\"'Use your location' | translate\"\n [tooltip]=\"'Use your location' | translate\"\n container=\"body\"\n placement=\"top\"\n >\n <i c8yIcon=\"location-arrow\" class=\"icon-14\"></i>\n </button>\n </div>\n <div class=\"input-group-btn\" *ngIf=\"canAutoCenter\">\n <button\n class=\"btn btn-default\"\n [attr.aria-label]=\"'Use selected asset location' | translate\"\n [tooltip]=\"'Use selected asset location' | translate\"\n placement=\"top\"\n container=\"body\"\n (click)=\"centerToAsset()\"\n >\n <i c8yIcon=\"location\" class=\"icon-14\"></i>\n </button>\n </div>\n </div>\n <div class=\"help-block\">\n {{ 'Drag the map to the desired position' | translate }}\n </div>\n </c8y-form-group>\n </div>\n </div>\n\n <div class=\"row tight-grid p-t-8 d-flex a-i-center\">\n <div class=\"col-xs-4\">\n <c8y-form-group class=\"m-b-0 form-group-sm\">\n <div class=\"c8y-select-wrapper\">\n <select\n id=\"selectExample\"\n class=\"form-control\"\n [(ngModel)]=\"refreshOptions\"\n name=\"refreshSelection\"\n title=\"{{ 'Refresh options' | translate }}\"\n (change)=\"updateRefreshOptions()\"\n >\n <option value=\"none\" [title]=\"'Only refreshing on interaction' | translate\" translate>\n No automatic refresh\n </option>\n <option\n value=\"interval\"\n *ngIf=\"!isPositionedDevice\"\n [title]=\"'Refreshing after a give interval and on interaction' | translate\"\n translate\n >\n Use refresh interval\n </option>\n <option\n value=\"realtime\"\n *ngIf=\"isPositionedDevice\"\n [title]=\"'Live updating on each position change' | translate\"\n translate\n >\n Realtime\n </option>\n </select>\n </div>\n </c8y-form-group>\n </div>\n <div class=\"col-xs-8\">\n <div class=\"form-group form-group-sm m-b-0\">\n <c8y-range\n #intervalRange\n [(ngModel)]=\"formConfig.refreshInterval\"\n name=\"refreshInterval\"\n class=\"label-bottom\"\n *ngIf=\"refreshOptions === 'interval'\"\n >\n <ng-template #c8yRangeValue>\n <div>\n <span\n translate\n [translateParams]=\"{ interval: intervalRange.value * 0.001 }\"\n ngNonBindable\n >\n {{ interval }}s\n </span>\n </div>\n </ng-template>\n <input type=\"range\" min=\"5000\" max=\"100000\" step=\"1000\" />\n </c8y-range>\n </div>\n <label class=\"c8y-switch c8y-switch--inline\" *ngIf=\"refreshOptions === 'realtime'\">\n <input type=\"checkbox\" [(ngModel)]=\"formConfig.follow\" name=\"follow\" />\n <span></span>\n <span class=\"text-12\" translate>Follow selected</span>\n </label>\n </div>\n </div>\n </div>\n</div>\n\n<div class=\"p-t-16 p-b-16\" style=\"width: 100%; height: 240px\">\n <c8y-map\n [assets]=\"assets\"\n (onMove)=\"onPreviewMapMove($event)\"\n (onZoomStart)=\"onPreviewZoomStart()\"\n (onZoomEnd)=\"onPreviewZoomEnd($event)\"\n [config]=\"config.mapConfig\"\n ></c8y-map>\n</div>\n" }]
|
|
161
161
|
}], ctorParameters: function () { return [{ type: i1.MapService }, { type: i2.AlertService }, { type: i3.TranslateService }, { type: undefined, decorators: [{
|
|
162
162
|
type: Optional
|
|
163
163
|
}, {
|
|
@@ -169,4 +169,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImpor
|
|
|
169
169
|
type: ViewChild,
|
|
170
170
|
args: [MapComponent]
|
|
171
171
|
}] } });
|
|
172
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFwLXdpZGdldC1jb25maWcuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vd2lkZ2V0cy9pbXBsZW1lbnRhdGlvbnMvbWFwL21hcC13aWRnZXQtY29uZmlnLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3dpZGdldHMvaW1wbGVtZW50YXRpb25zL21hcC9tYXAtd2lkZ2V0LWNvbmZpZy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsU0FBUyxFQUNULE1BQU0sRUFDTixLQUFLLEVBR0wsUUFBUSxFQUVSLFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUQsT0FBTyxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUN4RSxPQUFPLEVBRUwsZ0JBQWdCLEVBQ2hCLFlBQVksRUFFWixVQUFVLEVBQ1Ysa0JBQWtCLEVBRW5CLE1BQU0seUJBQXlCLENBQUM7QUFDakMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7Ozs7Ozs7OztBQVN2RCxNQUFNLE9BQU8sd0JBQXdCO0lBa0JuQyxZQUNVLFVBQXNCLEVBQ3RCLFlBQTBCLEVBQzFCLGdCQUFrQyxFQUNNLGFBQStCLEVBQ3ZFLFlBQWlDO1FBSmpDLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDdEIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUNNLGtCQUFhLEdBQWIsYUFBYSxDQUFrQjtRQUN2RSxpQkFBWSxHQUFaLFlBQVksQ0FBcUI7UUF0QmxDLFdBQU0sR0FBb0I7WUFDakMsU0FBUyxFQUFFLFNBQVM7U0FDckIsQ0FB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dEI3Qix3QkFBd0IsdUlBZXhCLFlBQVkscUVDL0N6QixtcE5BNExBLG1zR0Q5SmlCLENBQUMsRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxDQUFDOzJGQUV4RCx3QkFBd0I7a0JBTHBDLFNBQVM7K0JBQ0UsdUJBQXVCLGlCQUVsQixDQUFDLEVBQUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsQ0FBQzs7MEJBd0JoRSxRQUFROzswQkFBSSxNQUFNOzJCQUFDLGtCQUFrQjs4RUFyQi9CLE1BQU07c0JBQWQsS0FBSztnQkFlRSxVQUFVO3NCQURqQixTQUFTO3VCQUFDLFlBQVkiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDb21wb25lbnQsXG4gIEluamVjdCxcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25Jbml0LFxuICBPcHRpb25hbCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVmlld0NoaWxkXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbENvbnRhaW5lciwgTmdGb3JtIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQWxlcnRTZXJ2aWNlLCBnZXR0ZXh0IH0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cyc7XG5pbXBvcnQgeyBJY29uU2VsZWN0b3JTZXJ2aWNlIH0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cy9pY29uLXNlbGVjdG9yJztcbmltcG9ydCB7XG4gIENsdXN0ZXJNYXBDb25maWcsXG4gIGRlZmF1bHRNYXBDb25maWcsXG4gIE1hcENvbXBvbmVudCxcbiAgTWFwRGVmYXVsdENvbmZpZyxcbiAgTWFwU2VydmljZSxcbiAgTUFQX0RFRkFVTFRfQ09ORklHLFxuICBQb3NpdGlvbk1hbmFnZWRPYmplY3Rcbn0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cy9tYXAnO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHR5cGUgTCBmcm9tICdsZWFmbGV0JztcbmltcG9ydCB7IE1hcFdpZGdldENvbmZpZywgUmVmcmVzaE9wdGlvbnMgfSBmcm9tICcuL21hcC13aWRnZXQubW9kZWwnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjOHktbWFwLXdpZGdldC1jb25maWcnLFxuICB0ZW1wbGF0ZVVybDogJy4vbWFwLXdpZGdldC1jb25maWcuY29tcG9uZW50Lmh0bWwnLFxuICB2aWV3UHJvdmlkZXJzOiBbeyBwcm92aWRlOiBDb250cm9sQ29udGFpbmVyLCB1c2VFeGlzdGluZzogTmdGb3JtIH1dXG59KVxuZXhwb3J0IGNsYXNzIE1hcFdpZGdldENvbmZpZ0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzIHtcbiAgQElucHV0KCkgY29uZmlnOiBNYXBXaWRnZXRDb25maWcgPSB7XG4gICAgbWFwQ29uZmlnOiB1bmRlZmluZWRcbiAgfTtcblxuICBmb3JtQ29uZmlnOiBDbHVzdGVyTWFwQ29uZmlnO1xuXG4gIGNhbkF1dG9DZW50ZXIgPSB0cnVlO1xuICBpc1Bvc2l0aW9uZWREZXZpY2UgPSBmYWxzZTtcbiAgYXNzZXRzOiBQb3NpdGlvbk1hbmFnZWRPYmplY3RbXTtcbiAgcmVmcmVzaE9wdGlvbnM6IFJlZnJlc2hPcHRpb25zID0gJ25vbmUnO1xuXG4gIHByaXZhdGUgbGVhZmxldDogdHlwZW9mIEw7XG4gIHByaXZhdGUgY2VudGVySWNvbjogTC5NYXJrZXI7XG5cbiAgQFZpZXdDaGlsZChNYXBDb21wb25lbnQpXG4gIHByaXZhdGUgcHJldmlld01hcDogTWFwQ29tcG9uZW50O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgbWFwU2VydmljZTogTWFwU2VydmljZSxcbiAgICBwcml2YXRlIGFsZXJ0U2VydmljZTogQWxlcnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KE1BUF9ERUZBVUxUX0NPTkZJRykgcHJpdmF0ZSBkZWZhdWx0Q29uZmlnOiBNYXBEZWZhdWx0Q29uZmlnLFxuICAgIHByaXZhdGUgaWNvblNlbGVjdG9yOiBJY29uU2VsZWN0b3JTZXJ2aWNlXG4gICkge1xuICAgIGlmICghdGhpcy5kZWZhdWx0Q29uZmlnKSB7XG4gICAgICB0aGlzLmRlZmF1bHRDb25maWcgPSBkZWZhdWx0TWFwQ29uZmlnO1xuICAgIH1cbiAgICB0aGlzLmZvcm1Db25maWcgPSB7XG4gICAgICB6b29tTGV2ZWw6IHRoaXMuZGVmYXVsdENvbmZpZy56b29tTGV2ZWwsXG4gICAgICBjZW50ZXI6IHRoaXMuZGVmYXVsdENvbmZpZy5jZW50ZXJcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgbmdPbkluaXQoKSB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZy5tYXBDb25maWcpIHtcbiAgICAgIHRoaXMuY29uZmlnLm1hcENvbmZpZyA9IHRoaXMuZm9ybUNvbmZpZztcbiAgICB9XG4gICAgdGhpcy5mb3JtQ29uZmlnID0ge1xuICAgICAgLi4udGhpcy5mb3JtQ29uZmlnLFxuICAgICAgLi4udGhpcy5jb25maWcubWFwQ29uZmlnLFxuICAgICAgZGlzYWJsZVBhbjogZmFsc2VcbiAgICB9O1xuICAgIGF3YWl0IHRoaXMudXBkYXRlQXNzZXQoKTtcbiAgfVxuXG4gIGFzeW5jIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICBpZiAoXG4gICAgICBjaGFuZ2VzLmNvbmZpZy5jdXJyZW50VmFsdWUgIT09IGNoYW5nZXMuY29uZmlnLnByZXZpb3VzVmFsdWUgJiZcbiAgICAgICFjaGFuZ2VzLmNvbmZpZy5maXJzdENoYW5nZVxuICAgICkge1xuICAgICAgYXdhaXQgdGhpcy51cGRhdGVBc3NldCgpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0aGlzLmxlYWZsZXQgPSBhd2FpdCB0aGlzLm1hcFNlcnZpY2UuZ2V0TGVhZmxldCgpO1xuICAgIHRoaXMuYWRkQ2VudGVySWNvbih0aGlzLmZvcm1Db25maWcuY2VudGVyWzBdLCB0aGlzLmZvcm1Db25maWcuY2VudGVyWzFdKTtcbiAgfVxuXG4gIG9uQmVmb3JlU2F2ZSgpIHtcbiAgICB0aGlzLmNvbmZpZy5tYXBDb25maWcgPSB0aGlzLmZvcm1Db25maWc7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICB6b29tTGV2ZWxDaGFuZ2VkKCkge1xuICAgIHRoaXMuY29uZmlnLm1hcENvbmZpZyA9IHtcbiAgICAgIC4uLnRoaXMuY29uZmlnLm1hcENvbmZpZyxcbiAgICAgIHpvb21MZXZlbDogdGhpcy5mb3JtQ29uZmlnLnpvb21MZXZlbFxuICAgIH07XG4gIH1cblxuICBjaGFuZ2VDZW50ZXIoKSB7XG4gICAgdGhpcy5jb25maWcubWFwQ29uZmlnID0geyAuLi50aGlzLmZvcm1Db25maWcsIGNlbnRlcjogdGhpcy5mb3JtQ29uZmlnLmNlbnRlciB9O1xuICB9XG5cbiAgb25QcmV2aWV3Wm9vbVN0YXJ0KCkge1xuICAgIHRoaXMuY2VudGVySWNvbi5yZW1vdmUoKTtcbiAgfVxuXG4gIG9uUHJldmlld1pvb21FbmQoZXZlbnQ6IEwuTGVhZmxldEV2ZW50KSB7XG4gICAgdGhpcy5mb3JtQ29uZmlnLnpvb21MZXZlbCA9IE1hdGguZmxvb3IoZXZlbnQudGFyZ2V0LmdldFpvb20oKSk7XG4gIH1cblxuICBvblByZXZpZXdNYXBNb3ZlKGV2ZW50OiBMLkxlYWZsZXRFdmVudCkge1xuICAgIGlmICh0aGlzLmNlbnRlckljb24pIHtcbiAgICAgIHRoaXMuY2VudGVySWNvbi5yZW1vdmUoKTtcbiAgICB9XG4gICAgY29uc3QgeyBsYXQsIGxuZyB9ID0gZXZlbnQudGFyZ2V0LmdldEJvdW5kcygpLmdldENlbnRlcigpO1xuICAgIHRoaXMuYWRkQ2VudGVySWNvbihsYXQsIGxuZyk7XG4gICAgdGhpcy5mb3JtQ29uZmlnLmNlbnRlciA9IFtsYXQsIGxuZ107XG4gIH1cblxuICB1c2VPd25Qb3NpdGlvbigpIHtcbiAgICBuYXZpZ2F0b3IuZ2VvbG9jYXRpb24uZ2V0Q3VycmVudFBvc2l0aW9uKCh7IGNvb3JkcyB9KSA9PiB7XG4gICAgICB0aGlzLmZvcm1Db25maWcuY2VudGVyID0gW2Nvb3Jkcy5sYXRpdHVkZSwgY29vcmRzLmxvbmdpdHVkZV07XG4gICAgICB0aGlzLmNoYW5nZUNlbnRlcigpO1xuICAgIH0pO1xuICB9XG5cbiAgY2VudGVyVG9Bc3NldCgpIHtcbiAgICB0aGlzLmZvcm1Db25maWcuY2VudGVyID0gW1xuICAgICAgdGhpcy5jb25maWcuZGV2aWNlLmM4eV9Qb3NpdGlvbi5sYXQsXG4gICAgICB0aGlzLmNvbmZpZy5kZXZpY2UuYzh5X1Bvc2l0aW9uLmxuZ1xuICAgIF07XG4gICAgdGhpcy5jaGFuZ2VDZW50ZXIoKTtcbiAgfVxuXG4gIHVwZGF0ZVJlZnJlc2hPcHRpb25zKCkge1xuICAgIHRoaXMuZm9ybUNvbmZpZy5yZWFsdGltZSA9IHRoaXMucmVmcmVzaE9wdGlvbnMgPT09ICdyZWFsdGltZSc7XG4gICAgdGhpcy5mb3JtQ29uZmlnLnJlZnJlc2hJbnRlcnZhbCA9IHRoaXMucmVmcmVzaE9wdGlvbnMgPT09ICdpbnRlcnZhbCcgPyA1MDAwIDogbnVsbDtcbiAgICBpZiAoIXRoaXMuZm9ybUNvbmZpZy5yZWFsdGltZSkge1xuICAgICAgdGhpcy5mb3JtQ29uZmlnLmZvbGxvdyA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIG9wZW5JY29uU2VsZWN0b3IoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGljb24gPSBhd2FpdCB0aGlzLmljb25TZWxlY3Rvci5zZWxlY3RJY29uKHtcbiAgICAgICAgY3VycmVudFNlbGVjdGlvbjogdGhpcy5mb3JtQ29uZmlnLmljb25cbiAgICAgIH0pO1xuICAgICAgdGhpcy5mb3JtQ29uZmlnLmljb24gPSBpY29uO1xuICAgICAgdGhpcy5jb25maWcubWFwQ29uZmlnID0geyAuLi50aGlzLmNvbmZpZy5tYXBDb25maWcsIGljb24gfTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIG5vdGhpbmcgdG8gZG9cbiAgICB9XG4gIH1cblxuICByZW1vdmVJY29uKCkge1xuICAgIHRoaXMuZm9ybUNvbmZpZy5pY29uID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuY29uZmlnLm1hcENvbmZpZy5pY29uID0gdW5kZWZpbmVkO1xuICAgIHRoaXMucHJldmlld01hcC5yZWZyZXNoTWFya2VycygpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB1cGRhdGVBc3NldCgpIHtcbiAgICB0aGlzLmNhbkF1dG9DZW50ZXIgPSB0aGlzLm1hcFNlcnZpY2UuaGFzUG9zaXRpb24odGhpcy5jb25maWcuZGV2aWNlKTtcbiAgICB0aGlzLmlzUG9zaXRpb25lZERldmljZSA9IHRoaXMubWFwU2VydmljZS5pc1Bvc2l0aW9uZWREZXZpY2UodGhpcy5jb25maWcuZGV2aWNlKTtcbiAgICB0aGlzLnJlZnJlc2hPcHRpb25zID0gdGhpcy5nZXRSZWZyZXNoT3B0aW9ucygpO1xuICAgIHRoaXMudXBkYXRlUmVmcmVzaE9wdGlvbnMoKTtcblxuICAgIGNvbnN0IHsgZGF0YSwgcGFnaW5nIH0gPSBhd2FpdCB0aGlzLm1hcFNlcnZpY2UuZ2V0QWxsUG9zaXRpb25zTU9zKHRoaXMuY29uZmlnLmRldmljZSk7XG4gICAgdGhpcy5hc3NldHMgPSBkYXRhO1xuICAgIGlmIChwYWdpbmcudG90YWxQYWdlcyA+IDEpIHtcbiAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLmRhbmdlcihcbiAgICAgICAgZ2V0dGV4dChcbiAgICAgICAgICAnSXQgbWlnaHQgYmUgcG9zc2libGUgdGhhdCBhc3NldHMgYXJlIG5vdCBzaG93biBpbiB0aGUgcHJldmlldywgYXMgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGhhcyBtb3JlIHRoYW4gNTAwIGFzc2V0cyBhbmQgdGhlIHByZXZpZXcgb25seSBzdXBwb3J0cyBhIG1heGltdW0gb2YgNTAwIGFzc2V0cy4nXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRSZWZyZXNoT3B0aW9ucygpOiBSZWZyZXNoT3B0aW9ucyB7XG4gICAgbGV0IG9wdGlvbjogUmVmcmVzaE9wdGlvbnMgPSAnbm9uZSc7XG4gICAgaWYgKHRoaXMuZm9ybUNvbmZpZy5yZWFsdGltZSkge1xuICAgICAgb3B0aW9uID0gJ3JlYWx0aW1lJztcbiAgICB9IGVsc2UgaWYgKHRoaXMuZm9ybUNvbmZpZy5yZWZyZXNoSW50ZXJ2YWwpIHtcbiAgICAgIG9wdGlvbiA9ICdpbnRlcnZhbCc7XG4gICAgfVxuICAgIGNvbnN0IGlzTm90QWxsb3dlZE9wdGlvbiA9XG4gICAgICAoIXRoaXMuaXNQb3NpdGlvbmVkRGV2aWNlICYmIG9wdGlvbiA9PT0gJ3JlYWx0aW1lJykgfHxcbiAgICAgICh0aGlzLmlzUG9zaXRpb25lZERldmljZSAmJiBvcHRpb24gPT09ICdpbnRlcnZhbCcpO1xuICAgIG9wdGlvbiA9IGlzTm90QWxsb3dlZE9wdGlvbiA/ICdub25lJyA6IG9wdGlvbjtcbiAgICByZXR1cm4gb3B0aW9uO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRDZW50ZXJJY29uKGxhdDogbnVtYmVyLCBsbmc6IG51bWJlcikge1xuICAgIGNvbnN0IHRpdGxlVGV4dCA9IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KGdldHRleHQoJ01hcCBjZW50ZXInKSk7XG4gICAgY29uc3QgaWNvbiA9IHRoaXMubGVhZmxldC5kaXZJY29uKHtcbiAgICAgIGh0bWw6IGA8aSBzdHlsZT1cInBvaW50ZXItZXZlbnRzOiBub25lXCIgY2xhc3M9XCJjOHktbWFwLW1hcmtlci1pY29uIHRleHQtbXV0ZWQgZGx0LWM4eS1pY29uLXRhcmdldCBpY29uLTJ4XCIgdGl0bGU9XCIke3RpdGxlVGV4dH1cIiAvPmBcbiAgICB9KTtcbiAgICB0aGlzLmNlbnRlckljb24gPSB0aGlzLmxlYWZsZXQubWFya2VyKFtsYXQsIGxuZ10sIHtcbiAgICAgIGljb25cbiAgICB9KTtcbiAgICB0aGlzLnByZXZpZXdNYXAuYWRkTWFya2VyVG9NYXAodGhpcy5jZW50ZXJJY29uKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cInJvdyBwLXQtMTZcIj5cbiAgPGRpdiBjbGFzcz1cImNvbC14cy0yXCI+XG4gICAgPGM4eS1mb3JtLWdyb3VwIGNsYXNzPVwibS1iLTAgdGV4dC1jZW50ZXIgZm9ybS1ncm91cC1zbVwiPlxuICAgICAgPGxhYmVsIHRyYW5zbGF0ZT5NYXJrZXIgaWNvbjwvbGFiZWw+XG4gICAgICA8ZGl2IGNsYXNzPVwiaWNvbi0zMiB0ZXh0LW11dGVkIHRleHQtY2VudGVyIHAtYi04XCIgKm5nSWY9XCJmb3JtQ29uZmlnLmljb25cIj5cbiAgICAgICAgPGkgW2M4eUljb25dPVwiZm9ybUNvbmZpZy5pY29uXCI+PC9pPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiaWNvbi0zMiB0ZXh0LW11dGVkIHRleHQtY2VudGVyXCIgKm5nSWY9XCIhZm9ybUNvbmZpZy5pY29uXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiZC1ibG9jayB0ZXh0LTEyIHAtYi0xNiBwLXQtMTZcIj5cbiAgICAgICAgICA8ZW0+e3sgJ0F1dG8nIHwgdHJhbnNsYXRlIH19PC9lbT5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICB0aXRsZT1cInt7ICdTZWxlY3QgaWNvbiB0byBvdmVycmlkZSBkZWZhdWx0IGJlaGF2aW9yJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0IGJ0bi14cyBidG4tYmxvY2tcIlxuICAgICAgICAqbmdJZj1cIiFmb3JtQ29uZmlnLmljb25cIlxuICAgICAgICAoY2xpY2spPVwib3Blbkljb25TZWxlY3RvcigpXCJcbiAgICAgID5cbiAgICAgICAge3sgJ1NlbGVjdCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgdGl0bGU9XCJ7eyAnQ2hhbmdlIGljb24nIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHQgYnRuLXhzIGJ0bi1ibG9ja1wiXG4gICAgICAgICpuZ0lmPVwiZm9ybUNvbmZpZy5pY29uXCJcbiAgICAgICAgKGNsaWNrKT1cIm9wZW5JY29uU2VsZWN0b3IoKVwiXG4gICAgICA+XG4gICAgICAgIHt7ICdDaGFuZ2UnIHwgdHJhbnNsYXRlIH19XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIHRpdGxlPVwie3sgJ1JlbW92ZSBpY29uIGFuZCB1c2UgZGVmYXVsdCBiZWhhdmlvcicgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICBjbGFzcz1cImJ0biBidG4tZGFuZ2VyIGJ0bi14cyBidG4tYmxvY2tcIlxuICAgICAgICAqbmdJZj1cImZvcm1Db25maWcuaWNvblwiXG4gICAgICAgIChjbGljayk9XCJyZW1vdmVJY29uKClcIlxuICAgICAgPlxuICAgICAgICB7eyAnUmVtb3ZlJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgPC9idXR0b24+XG4gICAgPC9jOHktZm9ybS1ncm91cD5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJjb2wteHMtMTBcIj5cbiAgICA8ZGl2IGNsYXNzPVwicm93IHRpZ2h0LWdyaWQgc2VwYXJhdG9yLWJvdHRvbVwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbC14cy00XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIGZvcm0tZ3JvdXAtc21cIj5cbiAgICAgICAgICA8bGFiZWwgdHJhbnNsYXRlPlpvb20gbGV2ZWw8L2xhYmVsPlxuICAgICAgICAgIDxjOHktcmFuZ2VcbiAgICAgICAgICAgICNyYW5nZVxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJmb3JtQ29uZmlnLnpvb21MZXZlbFwiXG4gICAgICAgICAgICBuYW1lPVwiem9vbUxldmVsXCJcbiAgICAgICAgICAgIGNsYXNzPVwibGFiZWwtYm90dG9tXCJcbiAgICAgICAgICAgIChjaGFuZ2UpPVwiem9vbUxldmVsQ2hhbmdlZCgpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInJhbmdlXCIgbWluPVwiMlwiIG1heD1cIjE4XCIgc3RlcD1cIjFcIiAvPlxuICAgICAgICAgIDwvYzh5LXJhbmdlPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNvbC14cy04XCI+XG4gICAgICAgIDxjOHktZm9ybS1ncm91cCBjbGFzcz1cImZvcm0tZ3JvdXAtc20gbS1iLThcIj5cbiAgICAgICAgICA8bGFiZWwgdHJhbnNsYXRlPkNlbnRlciBib3VuZDwvbGFiZWw+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwIGlucHV0LWdyb3VwLXNtXCI+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcbiAgICAgICAgICAgICAgcmVxdWlyZWRcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJsYXRcIlxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImZvcm1Db25maWcuY2VudGVyWzBdXCJcbiAgICAgICAgICAgICAgKGNoYW5nZSk9XCJjaGFuZ2VDZW50ZXIoKVwiXG4gICAgICAgICAgICAgIG5hbWU9XCJjZW50ZXJMYXRcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxuICAgICAgICAgICAgICByZXF1aXJlZFxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImxuZ1wiXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZm9ybUNvbmZpZy5jZW50ZXJbMV1cIlxuICAgICAgICAgICAgICAoY2hhbmdlKT1cImNoYW5nZUNlbnRlcigpXCJcbiAgICAgICAgICAgICAgbmFtZT1cImNlbnRlckxuZ1wiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwLWJ0blwiPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHRcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJ1c2VPd25Qb3NpdGlvbigpXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidVc2UgeW91ciBsb2NhdGlvbicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgIFt0b29sdGlwXT1cIidVc2UgeW91ciBsb2NhdGlvbicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgIGNvbnRhaW5lcj1cImJvZHlcIlxuICAgICAgICAgICAgICAgIHBsYWNlbWVudD1cInRvcFwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8aSBjOHlJY29uPVwibG9jYXRpb24tYXJyb3dcIiBjbGFzcz1cImljb24tMTRcIj48L2k+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAtYnRuXCIgKm5nSWY9XCJjYW5BdXRvQ2VudGVyXCI+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tZGVmYXVsdFwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInVXNlIHNlbGVjdGVkIGFzc2V0IGxvY2F0aW9uJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgW3Rvb2x0aXBdPVwiJ1VzZSBzZWxlY3RlZCBhc3NldCBsb2NhdGlvbicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgIHBsYWNlbWVudD1cInRvcFwiXG4gICAgICAgICAgICAgICAgY29udGFpbmVyPVwiYm9keVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImNlbnRlclRvQXNzZXQoKVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8aSBjOHlJY29uPVwibG9jYXRpb25cIiBjbGFzcz1cImljb24tMTRcIj48L2k+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImhlbHAtYmxvY2tcIj5cbiAgICAgICAgICAgIHt7ICdEcmFnIHRoZSBtYXAgYmVsb3cgdG8gdGhlIGRlc2lyZWQgcG9zaXRpb24nIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvYzh5LWZvcm0tZ3JvdXA+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJyb3cgdGlnaHQtZ3JpZCBwLXQtOCBkLWZsZXggYS1pLWNlbnRlclwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbC14cy00XCI+XG4gICAgICAgIDxjOHktZm9ybS1ncm91cCBjbGFzcz1cIm0tYi0wIGZvcm0tZ3JvdXAtc21cIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYzh5LXNlbGVjdC13cmFwcGVyXCI+XG4gICAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICAgIGlkPVwic2VsZWN0RXhhbXBsZVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJyZWZyZXNoT3B0aW9uc1wiXG4gICAgICAgICAgICAgIG5hbWU9XCJyZWZyZXNoU2VsZWN0aW9uXCJcbiAgICAgICAgICAgICAgdGl0bGU9XCJ7eyAnUmVmcmVzaCBvcHRpb25zJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgIChjaGFuZ2UpPVwidXBkYXRlUmVmcmVzaE9wdGlvbnMoKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJub25lXCIgW3RpdGxlXT1cIidPbmx5IHJlZnJlc2hpbmcgb24gaW50ZXJhY3Rpb24nIHwgdHJhbnNsYXRlXCIgdHJhbnNsYXRlPlxuICAgICAgICAgICAgICAgIE5vIGF1dG9tYXRpYyByZWZyZXNoXG4gICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICA8b3B0aW9uXG4gICAgICAgICAgICAgICAgdmFsdWU9XCJpbnRlcnZhbFwiXG4gICAgICAgICAgICAgICAgKm5nSWY9XCIhaXNQb3NpdGlvbmVkRGV2aWNlXCJcbiAgICAgICAgICAgICAgICBbdGl0bGVdPVwiJ1JlZnJlc2hpbmcgYWZ0ZXIgYSBnaXZlIGludGVydmFsIGFuZCBvbiBpbnRlcmFjdGlvbicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgIHRyYW5zbGF0ZVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgVXNlIHJlZnJlc2ggaW50ZXJ2YWxcbiAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgIDxvcHRpb25cbiAgICAgICAgICAgICAgICB2YWx1ZT1cInJlYWx0aW1lXCJcbiAgICAgICAgICAgICAgICAqbmdJZj1cImlzUG9zaXRpb25lZERldmljZVwiXG4gICAgICAgICAgICAgICAgW3RpdGxlXT1cIidMaXZlIHVwZGF0aW5nIG9uIGVhY2ggcG9zaXRpb24gY2hhbmdlJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgdHJhbnNsYXRlXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICBSZWFsdGltZVxuICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2M4eS1mb3JtLWdyb3VwPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLXhzLThcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgZm9ybS1ncm91cC1zbSBtLWItMFwiPlxuICAgICAgICAgIDxjOHktcmFuZ2VcbiAgICAgICAgICAgICNpbnRlcnZhbFJhbmdlXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cImZvcm1Db25maWcucmVmcmVzaEludGVydmFsXCJcbiAgICAgICAgICAgIG5hbWU9XCJyZWZyZXNoSW50ZXJ2YWxcIlxuICAgICAgICAgICAgY2xhc3M9XCJsYWJlbC1ib3R0b21cIlxuICAgICAgICAgICAgKm5nSWY9XCJyZWZyZXNoT3B0aW9ucyA9PT0gJ2ludGVydmFsJ1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNjOHlSYW5nZVZhbHVlPlxuICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICB0cmFuc2xhdGVcbiAgICAgICAgICAgICAgICAgIFt0cmFuc2xhdGVQYXJhbXNdPVwieyBpbnRlcnZhbDogaW50ZXJ2YWxSYW5nZS52YWx1ZSAqIDAuMDAxIH1cIlxuICAgICAgICAgICAgICAgICAgbmdOb25CaW5kYWJsZVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIHt7IGludGVydmFsIH19c1xuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJyYW5nZVwiIG1pbj1cIjUwMDBcIiBtYXg9XCIxMDAwMDBcIiBzdGVwPVwiMTAwMFwiIC8+XG4gICAgICAgICAgPC9jOHktcmFuZ2U+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJjOHktc3dpdGNoIGM4eS1zd2l0Y2gtLWlubGluZVwiICpuZ0lmPVwicmVmcmVzaE9wdGlvbnMgPT09ICdyZWFsdGltZSdcIj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgWyhuZ01vZGVsKV09XCJmb3JtQ29uZmlnLmZvbGxvd1wiIG5hbWU9XCJmb2xsb3dcIiAvPlxuICAgICAgICAgIDxzcGFuPjwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtMTJcIiB0cmFuc2xhdGU+Rm9sbG93IHNlbGVjdGVkPC9zcGFuPlxuICAgICAgICA8L2xhYmVsPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG5cbjxkaXYgY2xhc3M9XCJwLXQtMTYgcC1iLTE2XCIgc3R5bGU9XCJ3aWR0aDogMTAwJTsgaGVpZ2h0OiAyNDBweFwiPlxuICA8Yzh5LW1hcFxuICAgIFthc3NldHNdPVwiYXNzZXRzXCJcbiAgICAob25Nb3ZlKT1cIm9uUHJldmlld01hcE1vdmUoJGV2ZW50KVwiXG4gICAgKG9uWm9vbVN0YXJ0KT1cIm9uUHJldmlld1pvb21TdGFydCgpXCJcbiAgICAob25ab29tRW5kKT1cIm9uUHJldmlld1pvb21FbmQoJGV2ZW50KVwiXG4gICAgW2NvbmZpZ109XCJjb25maWcubWFwQ29uZmlnXCJcbiAgPjwvYzh5LW1hcD5cbjwvZGl2PlxuIl19
|
|
172
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFwLXdpZGdldC1jb25maWcuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vd2lkZ2V0cy9pbXBsZW1lbnRhdGlvbnMvbWFwL21hcC13aWRnZXQtY29uZmlnLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3dpZGdldHMvaW1wbGVtZW50YXRpb25zL21hcC9tYXAtd2lkZ2V0LWNvbmZpZy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsU0FBUyxFQUNULE1BQU0sRUFDTixLQUFLLEVBR0wsUUFBUSxFQUVSLFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUQsT0FBTyxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUN4RSxPQUFPLEVBRUwsZ0JBQWdCLEVBQ2hCLFlBQVksRUFFWixVQUFVLEVBQ1Ysa0JBQWtCLEVBRW5CLE1BQU0seUJBQXlCLENBQUM7QUFDakMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7Ozs7Ozs7OztBQVN2RCxNQUFNLE9BQU8sd0JBQXdCO0lBa0JuQyxZQUNVLFVBQXNCLEVBQ3RCLFlBQTBCLEVBQzFCLGdCQUFrQyxFQUNNLGFBQStCLEVBQ3ZFLFlBQWlDO1FBSmpDLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDdEIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUNNLGtCQUFhLEdBQWIsYUFBYSxDQUFrQjtRQUN2RSxpQkFBWSxHQUFaLFlBQVksQ0FBcUI7UUF0QmxDLFdBQU0sR0FBb0I7WUFDakMsU0FBUyxFQUFFLFNBQVM7U0FDckIsQ0FB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dEI3Qix3QkFBd0IsdUlBZXhCLFlBQVkscUVDL0N6Qiw2b05BNExBLG1zR0Q5SmlCLENBQUMsRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxDQUFDOzJGQUV4RCx3QkFBd0I7a0JBTHBDLFNBQVM7K0JBQ0UsdUJBQXVCLGlCQUVsQixDQUFDLEVBQUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsQ0FBQzs7MEJBd0JoRSxRQUFROzswQkFBSSxNQUFNOzJCQUFDLGtCQUFrQjs4RUFyQi9CLE1BQU07c0JBQWQsS0FBSztnQkFlRSxVQUFVO3NCQURqQixTQUFTO3VCQUFDLFlBQVkiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDb21wb25lbnQsXG4gIEluamVjdCxcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25Jbml0LFxuICBPcHRpb25hbCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVmlld0NoaWxkXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbENvbnRhaW5lciwgTmdGb3JtIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQWxlcnRTZXJ2aWNlLCBnZXR0ZXh0IH0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cyc7XG5pbXBvcnQgeyBJY29uU2VsZWN0b3JTZXJ2aWNlIH0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cy9pY29uLXNlbGVjdG9yJztcbmltcG9ydCB7XG4gIENsdXN0ZXJNYXBDb25maWcsXG4gIGRlZmF1bHRNYXBDb25maWcsXG4gIE1hcENvbXBvbmVudCxcbiAgTWFwRGVmYXVsdENvbmZpZyxcbiAgTWFwU2VydmljZSxcbiAgTUFQX0RFRkFVTFRfQ09ORklHLFxuICBQb3NpdGlvbk1hbmFnZWRPYmplY3Rcbn0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cy9tYXAnO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHR5cGUgTCBmcm9tICdsZWFmbGV0JztcbmltcG9ydCB7IE1hcFdpZGdldENvbmZpZywgUmVmcmVzaE9wdGlvbnMgfSBmcm9tICcuL21hcC13aWRnZXQubW9kZWwnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjOHktbWFwLXdpZGdldC1jb25maWcnLFxuICB0ZW1wbGF0ZVVybDogJy4vbWFwLXdpZGdldC1jb25maWcuY29tcG9uZW50Lmh0bWwnLFxuICB2aWV3UHJvdmlkZXJzOiBbeyBwcm92aWRlOiBDb250cm9sQ29udGFpbmVyLCB1c2VFeGlzdGluZzogTmdGb3JtIH1dXG59KVxuZXhwb3J0IGNsYXNzIE1hcFdpZGdldENvbmZpZ0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzIHtcbiAgQElucHV0KCkgY29uZmlnOiBNYXBXaWRnZXRDb25maWcgPSB7XG4gICAgbWFwQ29uZmlnOiB1bmRlZmluZWRcbiAgfTtcblxuICBmb3JtQ29uZmlnOiBDbHVzdGVyTWFwQ29uZmlnO1xuXG4gIGNhbkF1dG9DZW50ZXIgPSB0cnVlO1xuICBpc1Bvc2l0aW9uZWREZXZpY2UgPSBmYWxzZTtcbiAgYXNzZXRzOiBQb3NpdGlvbk1hbmFnZWRPYmplY3RbXTtcbiAgcmVmcmVzaE9wdGlvbnM6IFJlZnJlc2hPcHRpb25zID0gJ25vbmUnO1xuXG4gIHByaXZhdGUgbGVhZmxldDogdHlwZW9mIEw7XG4gIHByaXZhdGUgY2VudGVySWNvbjogTC5NYXJrZXI7XG5cbiAgQFZpZXdDaGlsZChNYXBDb21wb25lbnQpXG4gIHByaXZhdGUgcHJldmlld01hcDogTWFwQ29tcG9uZW50O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgbWFwU2VydmljZTogTWFwU2VydmljZSxcbiAgICBwcml2YXRlIGFsZXJ0U2VydmljZTogQWxlcnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KE1BUF9ERUZBVUxUX0NPTkZJRykgcHJpdmF0ZSBkZWZhdWx0Q29uZmlnOiBNYXBEZWZhdWx0Q29uZmlnLFxuICAgIHByaXZhdGUgaWNvblNlbGVjdG9yOiBJY29uU2VsZWN0b3JTZXJ2aWNlXG4gICkge1xuICAgIGlmICghdGhpcy5kZWZhdWx0Q29uZmlnKSB7XG4gICAgICB0aGlzLmRlZmF1bHRDb25maWcgPSBkZWZhdWx0TWFwQ29uZmlnO1xuICAgIH1cbiAgICB0aGlzLmZvcm1Db25maWcgPSB7XG4gICAgICB6b29tTGV2ZWw6IHRoaXMuZGVmYXVsdENvbmZpZy56b29tTGV2ZWwsXG4gICAgICBjZW50ZXI6IHRoaXMuZGVmYXVsdENvbmZpZy5jZW50ZXJcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgbmdPbkluaXQoKSB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZy5tYXBDb25maWcpIHtcbiAgICAgIHRoaXMuY29uZmlnLm1hcENvbmZpZyA9IHRoaXMuZm9ybUNvbmZpZztcbiAgICB9XG4gICAgdGhpcy5mb3JtQ29uZmlnID0ge1xuICAgICAgLi4udGhpcy5mb3JtQ29uZmlnLFxuICAgICAgLi4udGhpcy5jb25maWcubWFwQ29uZmlnLFxuICAgICAgZGlzYWJsZVBhbjogZmFsc2VcbiAgICB9O1xuICAgIGF3YWl0IHRoaXMudXBkYXRlQXNzZXQoKTtcbiAgfVxuXG4gIGFzeW5jIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICBpZiAoXG4gICAgICBjaGFuZ2VzLmNvbmZpZy5jdXJyZW50VmFsdWUgIT09IGNoYW5nZXMuY29uZmlnLnByZXZpb3VzVmFsdWUgJiZcbiAgICAgICFjaGFuZ2VzLmNvbmZpZy5maXJzdENoYW5nZVxuICAgICkge1xuICAgICAgYXdhaXQgdGhpcy51cGRhdGVBc3NldCgpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0aGlzLmxlYWZsZXQgPSBhd2FpdCB0aGlzLm1hcFNlcnZpY2UuZ2V0TGVhZmxldCgpO1xuICAgIHRoaXMuYWRkQ2VudGVySWNvbih0aGlzLmZvcm1Db25maWcuY2VudGVyWzBdLCB0aGlzLmZvcm1Db25maWcuY2VudGVyWzFdKTtcbiAgfVxuXG4gIG9uQmVmb3JlU2F2ZSgpIHtcbiAgICB0aGlzLmNvbmZpZy5tYXBDb25maWcgPSB0aGlzLmZvcm1Db25maWc7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICB6b29tTGV2ZWxDaGFuZ2VkKCkge1xuICAgIHRoaXMuY29uZmlnLm1hcENvbmZpZyA9IHtcbiAgICAgIC4uLnRoaXMuY29uZmlnLm1hcENvbmZpZyxcbiAgICAgIHpvb21MZXZlbDogdGhpcy5mb3JtQ29uZmlnLnpvb21MZXZlbFxuICAgIH07XG4gIH1cblxuICBjaGFuZ2VDZW50ZXIoKSB7XG4gICAgdGhpcy5jb25maWcubWFwQ29uZmlnID0geyAuLi50aGlzLmZvcm1Db25maWcsIGNlbnRlcjogdGhpcy5mb3JtQ29uZmlnLmNlbnRlciB9O1xuICB9XG5cbiAgb25QcmV2aWV3Wm9vbVN0YXJ0KCkge1xuICAgIHRoaXMuY2VudGVySWNvbi5yZW1vdmUoKTtcbiAgfVxuXG4gIG9uUHJldmlld1pvb21FbmQoZXZlbnQ6IEwuTGVhZmxldEV2ZW50KSB7XG4gICAgdGhpcy5mb3JtQ29uZmlnLnpvb21MZXZlbCA9IE1hdGguZmxvb3IoZXZlbnQudGFyZ2V0LmdldFpvb20oKSk7XG4gIH1cblxuICBvblByZXZpZXdNYXBNb3ZlKGV2ZW50OiBMLkxlYWZsZXRFdmVudCkge1xuICAgIGlmICh0aGlzLmNlbnRlckljb24pIHtcbiAgICAgIHRoaXMuY2VudGVySWNvbi5yZW1vdmUoKTtcbiAgICB9XG4gICAgY29uc3QgeyBsYXQsIGxuZyB9ID0gZXZlbnQudGFyZ2V0LmdldEJvdW5kcygpLmdldENlbnRlcigpO1xuICAgIHRoaXMuYWRkQ2VudGVySWNvbihsYXQsIGxuZyk7XG4gICAgdGhpcy5mb3JtQ29uZmlnLmNlbnRlciA9IFtsYXQsIGxuZ107XG4gIH1cblxuICB1c2VPd25Qb3NpdGlvbigpIHtcbiAgICBuYXZpZ2F0b3IuZ2VvbG9jYXRpb24uZ2V0Q3VycmVudFBvc2l0aW9uKCh7IGNvb3JkcyB9KSA9PiB7XG4gICAgICB0aGlzLmZvcm1Db25maWcuY2VudGVyID0gW2Nvb3Jkcy5sYXRpdHVkZSwgY29vcmRzLmxvbmdpdHVkZV07XG4gICAgICB0aGlzLmNoYW5nZUNlbnRlcigpO1xuICAgIH0pO1xuICB9XG5cbiAgY2VudGVyVG9Bc3NldCgpIHtcbiAgICB0aGlzLmZvcm1Db25maWcuY2VudGVyID0gW1xuICAgICAgdGhpcy5jb25maWcuZGV2aWNlLmM4eV9Qb3NpdGlvbi5sYXQsXG4gICAgICB0aGlzLmNvbmZpZy5kZXZpY2UuYzh5X1Bvc2l0aW9uLmxuZ1xuICAgIF07XG4gICAgdGhpcy5jaGFuZ2VDZW50ZXIoKTtcbiAgfVxuXG4gIHVwZGF0ZVJlZnJlc2hPcHRpb25zKCkge1xuICAgIHRoaXMuZm9ybUNvbmZpZy5yZWFsdGltZSA9IHRoaXMucmVmcmVzaE9wdGlvbnMgPT09ICdyZWFsdGltZSc7XG4gICAgdGhpcy5mb3JtQ29uZmlnLnJlZnJlc2hJbnRlcnZhbCA9IHRoaXMucmVmcmVzaE9wdGlvbnMgPT09ICdpbnRlcnZhbCcgPyA1MDAwIDogbnVsbDtcbiAgICBpZiAoIXRoaXMuZm9ybUNvbmZpZy5yZWFsdGltZSkge1xuICAgICAgdGhpcy5mb3JtQ29uZmlnLmZvbGxvdyA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIG9wZW5JY29uU2VsZWN0b3IoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGljb24gPSBhd2FpdCB0aGlzLmljb25TZWxlY3Rvci5zZWxlY3RJY29uKHtcbiAgICAgICAgY3VycmVudFNlbGVjdGlvbjogdGhpcy5mb3JtQ29uZmlnLmljb25cbiAgICAgIH0pO1xuICAgICAgdGhpcy5mb3JtQ29uZmlnLmljb24gPSBpY29uO1xuICAgICAgdGhpcy5jb25maWcubWFwQ29uZmlnID0geyAuLi50aGlzLmNvbmZpZy5tYXBDb25maWcsIGljb24gfTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIG5vdGhpbmcgdG8gZG9cbiAgICB9XG4gIH1cblxuICByZW1vdmVJY29uKCkge1xuICAgIHRoaXMuZm9ybUNvbmZpZy5pY29uID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuY29uZmlnLm1hcENvbmZpZy5pY29uID0gdW5kZWZpbmVkO1xuICAgIHRoaXMucHJldmlld01hcC5yZWZyZXNoTWFya2VycygpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB1cGRhdGVBc3NldCgpIHtcbiAgICB0aGlzLmNhbkF1dG9DZW50ZXIgPSB0aGlzLm1hcFNlcnZpY2UuaGFzUG9zaXRpb24odGhpcy5jb25maWcuZGV2aWNlKTtcbiAgICB0aGlzLmlzUG9zaXRpb25lZERldmljZSA9IHRoaXMubWFwU2VydmljZS5pc1Bvc2l0aW9uZWREZXZpY2UodGhpcy5jb25maWcuZGV2aWNlKTtcbiAgICB0aGlzLnJlZnJlc2hPcHRpb25zID0gdGhpcy5nZXRSZWZyZXNoT3B0aW9ucygpO1xuICAgIHRoaXMudXBkYXRlUmVmcmVzaE9wdGlvbnMoKTtcblxuICAgIGNvbnN0IHsgZGF0YSwgcGFnaW5nIH0gPSBhd2FpdCB0aGlzLm1hcFNlcnZpY2UuZ2V0QWxsUG9zaXRpb25zTU9zKHRoaXMuY29uZmlnLmRldmljZSk7XG4gICAgdGhpcy5hc3NldHMgPSBkYXRhO1xuICAgIGlmIChwYWdpbmcudG90YWxQYWdlcyA+IDEpIHtcbiAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLmRhbmdlcihcbiAgICAgICAgZ2V0dGV4dChcbiAgICAgICAgICAnSXQgbWlnaHQgYmUgcG9zc2libGUgdGhhdCBhc3NldHMgYXJlIG5vdCBzaG93biBpbiB0aGUgcHJldmlldywgYXMgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGhhcyBtb3JlIHRoYW4gNTAwIGFzc2V0cyBhbmQgdGhlIHByZXZpZXcgb25seSBzdXBwb3J0cyBhIG1heGltdW0gb2YgNTAwIGFzc2V0cy4nXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRSZWZyZXNoT3B0aW9ucygpOiBSZWZyZXNoT3B0aW9ucyB7XG4gICAgbGV0IG9wdGlvbjogUmVmcmVzaE9wdGlvbnMgPSAnbm9uZSc7XG4gICAgaWYgKHRoaXMuZm9ybUNvbmZpZy5yZWFsdGltZSkge1xuICAgICAgb3B0aW9uID0gJ3JlYWx0aW1lJztcbiAgICB9IGVsc2UgaWYgKHRoaXMuZm9ybUNvbmZpZy5yZWZyZXNoSW50ZXJ2YWwpIHtcbiAgICAgIG9wdGlvbiA9ICdpbnRlcnZhbCc7XG4gICAgfVxuICAgIGNvbnN0IGlzTm90QWxsb3dlZE9wdGlvbiA9XG4gICAgICAoIXRoaXMuaXNQb3NpdGlvbmVkRGV2aWNlICYmIG9wdGlvbiA9PT0gJ3JlYWx0aW1lJykgfHxcbiAgICAgICh0aGlzLmlzUG9zaXRpb25lZERldmljZSAmJiBvcHRpb24gPT09ICdpbnRlcnZhbCcpO1xuICAgIG9wdGlvbiA9IGlzTm90QWxsb3dlZE9wdGlvbiA/ICdub25lJyA6IG9wdGlvbjtcbiAgICByZXR1cm4gb3B0aW9uO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRDZW50ZXJJY29uKGxhdDogbnVtYmVyLCBsbmc6IG51bWJlcikge1xuICAgIGNvbnN0IHRpdGxlVGV4dCA9IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KGdldHRleHQoJ01hcCBjZW50ZXInKSk7XG4gICAgY29uc3QgaWNvbiA9IHRoaXMubGVhZmxldC5kaXZJY29uKHtcbiAgICAgIGh0bWw6IGA8aSBzdHlsZT1cInBvaW50ZXItZXZlbnRzOiBub25lXCIgY2xhc3M9XCJjOHktbWFwLW1hcmtlci1pY29uIHRleHQtbXV0ZWQgZGx0LWM4eS1pY29uLXRhcmdldCBpY29uLTJ4XCIgdGl0bGU9XCIke3RpdGxlVGV4dH1cIiAvPmBcbiAgICB9KTtcbiAgICB0aGlzLmNlbnRlckljb24gPSB0aGlzLmxlYWZsZXQubWFya2VyKFtsYXQsIGxuZ10sIHtcbiAgICAgIGljb25cbiAgICB9KTtcbiAgICB0aGlzLnByZXZpZXdNYXAuYWRkTWFya2VyVG9NYXAodGhpcy5jZW50ZXJJY29uKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cInJvdyBwLXQtMTZcIj5cbiAgPGRpdiBjbGFzcz1cImNvbC14cy0yXCI+XG4gICAgPGM4eS1mb3JtLWdyb3VwIGNsYXNzPVwibS1iLTAgdGV4dC1jZW50ZXIgZm9ybS1ncm91cC1zbVwiPlxuICAgICAgPGxhYmVsIHRyYW5zbGF0ZT5NYXJrZXIgaWNvbjwvbGFiZWw+XG4gICAgICA8ZGl2IGNsYXNzPVwiaWNvbi0zMiB0ZXh0LW11dGVkIHRleHQtY2VudGVyIHAtYi04XCIgKm5nSWY9XCJmb3JtQ29uZmlnLmljb25cIj5cbiAgICAgICAgPGkgW2M4eUljb25dPVwiZm9ybUNvbmZpZy5pY29uXCI+PC9pPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiaWNvbi0zMiB0ZXh0LW11dGVkIHRleHQtY2VudGVyXCIgKm5nSWY9XCIhZm9ybUNvbmZpZy5pY29uXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiZC1ibG9jayB0ZXh0LTEyIHAtYi0xNiBwLXQtMTZcIj5cbiAgICAgICAgICA8ZW0+e3sgJ0F1dG8nIHwgdHJhbnNsYXRlIH19PC9lbT5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICB0aXRsZT1cInt7ICdTZWxlY3QgaWNvbiB0byBvdmVycmlkZSBkZWZhdWx0IGJlaGF2aW9yJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0IGJ0bi14cyBidG4tYmxvY2tcIlxuICAgICAgICAqbmdJZj1cIiFmb3JtQ29uZmlnLmljb25cIlxuICAgICAgICAoY2xpY2spPVwib3Blbkljb25TZWxlY3RvcigpXCJcbiAgICAgID5cbiAgICAgICAge3sgJ1NlbGVjdCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgdGl0bGU9XCJ7eyAnQ2hhbmdlIGljb24nIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHQgYnRuLXhzIGJ0bi1ibG9ja1wiXG4gICAgICAgICpuZ0lmPVwiZm9ybUNvbmZpZy5pY29uXCJcbiAgICAgICAgKGNsaWNrKT1cIm9wZW5JY29uU2VsZWN0b3IoKVwiXG4gICAgICA+XG4gICAgICAgIHt7ICdDaGFuZ2UnIHwgdHJhbnNsYXRlIH19XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIHRpdGxlPVwie3sgJ1JlbW92ZSBpY29uIGFuZCB1c2UgZGVmYXVsdCBiZWhhdmlvcicgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICBjbGFzcz1cImJ0biBidG4tZGFuZ2VyIGJ0bi14cyBidG4tYmxvY2tcIlxuICAgICAgICAqbmdJZj1cImZvcm1Db25maWcuaWNvblwiXG4gICAgICAgIChjbGljayk9XCJyZW1vdmVJY29uKClcIlxuICAgICAgPlxuICAgICAgICB7eyAnUmVtb3ZlJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgPC9idXR0b24+XG4gICAgPC9jOHktZm9ybS1ncm91cD5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJjb2wteHMtMTBcIj5cbiAgICA8ZGl2IGNsYXNzPVwicm93IHRpZ2h0LWdyaWQgc2VwYXJhdG9yLWJvdHRvbVwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbC14cy00XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIGZvcm0tZ3JvdXAtc21cIj5cbiAgICAgICAgICA8bGFiZWwgdHJhbnNsYXRlPlpvb20gbGV2ZWw8L2xhYmVsPlxuICAgICAgICAgIDxjOHktcmFuZ2VcbiAgICAgICAgICAgICNyYW5nZVxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJmb3JtQ29uZmlnLnpvb21MZXZlbFwiXG4gICAgICAgICAgICBuYW1lPVwiem9vbUxldmVsXCJcbiAgICAgICAgICAgIGNsYXNzPVwibGFiZWwtYm90dG9tXCJcbiAgICAgICAgICAgIChjaGFuZ2UpPVwiem9vbUxldmVsQ2hhbmdlZCgpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInJhbmdlXCIgbWluPVwiMlwiIG1heD1cIjE4XCIgc3RlcD1cIjFcIiAvPlxuICAgICAgICAgIDwvYzh5LXJhbmdlPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNvbC14cy04XCI+XG4gICAgICAgIDxjOHktZm9ybS1ncm91cCBjbGFzcz1cImZvcm0tZ3JvdXAtc20gbS1iLThcIj5cbiAgICAgICAgICA8bGFiZWwgdHJhbnNsYXRlPkNlbnRlciBib3VuZDwvbGFiZWw+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwIGlucHV0LWdyb3VwLXNtXCI+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcbiAgICAgICAgICAgICAgcmVxdWlyZWRcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJsYXRcIlxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImZvcm1Db25maWcuY2VudGVyWzBdXCJcbiAgICAgICAgICAgICAgKGNoYW5nZSk9XCJjaGFuZ2VDZW50ZXIoKVwiXG4gICAgICAgICAgICAgIG5hbWU9XCJjZW50ZXJMYXRcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxuICAgICAgICAgICAgICByZXF1aXJlZFxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImxuZ1wiXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZm9ybUNvbmZpZy5jZW50ZXJbMV1cIlxuICAgICAgICAgICAgICAoY2hhbmdlKT1cImNoYW5nZUNlbnRlcigpXCJcbiAgICAgICAgICAgICAgbmFtZT1cImNlbnRlckxuZ1wiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwLWJ0blwiPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHRcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJ1c2VPd25Qb3NpdGlvbigpXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidVc2UgeW91ciBsb2NhdGlvbicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgIFt0b29sdGlwXT1cIidVc2UgeW91ciBsb2NhdGlvbicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgIGNvbnRhaW5lcj1cImJvZHlcIlxuICAgICAgICAgICAgICAgIHBsYWNlbWVudD1cInRvcFwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8aSBjOHlJY29uPVwibG9jYXRpb24tYXJyb3dcIiBjbGFzcz1cImljb24tMTRcIj48L2k+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAtYnRuXCIgKm5nSWY9XCJjYW5BdXRvQ2VudGVyXCI+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tZGVmYXVsdFwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInVXNlIHNlbGVjdGVkIGFzc2V0IGxvY2F0aW9uJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgW3Rvb2x0aXBdPVwiJ1VzZSBzZWxlY3RlZCBhc3NldCBsb2NhdGlvbicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgIHBsYWNlbWVudD1cInRvcFwiXG4gICAgICAgICAgICAgICAgY29udGFpbmVyPVwiYm9keVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImNlbnRlclRvQXNzZXQoKVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8aSBjOHlJY29uPVwibG9jYXRpb25cIiBjbGFzcz1cImljb24tMTRcIj48L2k+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImhlbHAtYmxvY2tcIj5cbiAgICAgICAgICAgIHt7ICdEcmFnIHRoZSBtYXAgdG8gdGhlIGRlc2lyZWQgcG9zaXRpb24nIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvYzh5LWZvcm0tZ3JvdXA+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJyb3cgdGlnaHQtZ3JpZCBwLXQtOCBkLWZsZXggYS1pLWNlbnRlclwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbC14cy00XCI+XG4gICAgICAgIDxjOHktZm9ybS1ncm91cCBjbGFzcz1cIm0tYi0wIGZvcm0tZ3JvdXAtc21cIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYzh5LXNlbGVjdC13cmFwcGVyXCI+XG4gICAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICAgIGlkPVwic2VsZWN0RXhhbXBsZVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJyZWZyZXNoT3B0aW9uc1wiXG4gICAgICAgICAgICAgIG5hbWU9XCJyZWZyZXNoU2VsZWN0aW9uXCJcbiAgICAgICAgICAgICAgdGl0bGU9XCJ7eyAnUmVmcmVzaCBvcHRpb25zJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgIChjaGFuZ2UpPVwidXBkYXRlUmVmcmVzaE9wdGlvbnMoKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJub25lXCIgW3RpdGxlXT1cIidPbmx5IHJlZnJlc2hpbmcgb24gaW50ZXJhY3Rpb24nIHwgdHJhbnNsYXRlXCIgdHJhbnNsYXRlPlxuICAgICAgICAgICAgICAgIE5vIGF1dG9tYXRpYyByZWZyZXNoXG4gICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICA8b3B0aW9uXG4gICAgICAgICAgICAgICAgdmFsdWU9XCJpbnRlcnZhbFwiXG4gICAgICAgICAgICAgICAgKm5nSWY9XCIhaXNQb3NpdGlvbmVkRGV2aWNlXCJcbiAgICAgICAgICAgICAgICBbdGl0bGVdPVwiJ1JlZnJlc2hpbmcgYWZ0ZXIgYSBnaXZlIGludGVydmFsIGFuZCBvbiBpbnRlcmFjdGlvbicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgIHRyYW5zbGF0ZVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgVXNlIHJlZnJlc2ggaW50ZXJ2YWxcbiAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgIDxvcHRpb25cbiAgICAgICAgICAgICAgICB2YWx1ZT1cInJlYWx0aW1lXCJcbiAgICAgICAgICAgICAgICAqbmdJZj1cImlzUG9zaXRpb25lZERldmljZVwiXG4gICAgICAgICAgICAgICAgW3RpdGxlXT1cIidMaXZlIHVwZGF0aW5nIG9uIGVhY2ggcG9zaXRpb24gY2hhbmdlJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgdHJhbnNsYXRlXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICBSZWFsdGltZVxuICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2M4eS1mb3JtLWdyb3VwPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLXhzLThcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgZm9ybS1ncm91cC1zbSBtLWItMFwiPlxuICAgICAgICAgIDxjOHktcmFuZ2VcbiAgICAgICAgICAgICNpbnRlcnZhbFJhbmdlXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cImZvcm1Db25maWcucmVmcmVzaEludGVydmFsXCJcbiAgICAgICAgICAgIG5hbWU9XCJyZWZyZXNoSW50ZXJ2YWxcIlxuICAgICAgICAgICAgY2xhc3M9XCJsYWJlbC1ib3R0b21cIlxuICAgICAgICAgICAgKm5nSWY9XCJyZWZyZXNoT3B0aW9ucyA9PT0gJ2ludGVydmFsJ1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNjOHlSYW5nZVZhbHVlPlxuICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICB0cmFuc2xhdGVcbiAgICAgICAgICAgICAgICAgIFt0cmFuc2xhdGVQYXJhbXNdPVwieyBpbnRlcnZhbDogaW50ZXJ2YWxSYW5nZS52YWx1ZSAqIDAuMDAxIH1cIlxuICAgICAgICAgICAgICAgICAgbmdOb25CaW5kYWJsZVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIHt7IGludGVydmFsIH19c1xuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJyYW5nZVwiIG1pbj1cIjUwMDBcIiBtYXg9XCIxMDAwMDBcIiBzdGVwPVwiMTAwMFwiIC8+XG4gICAgICAgICAgPC9jOHktcmFuZ2U+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJjOHktc3dpdGNoIGM4eS1zd2l0Y2gtLWlubGluZVwiICpuZ0lmPVwicmVmcmVzaE9wdGlvbnMgPT09ICdyZWFsdGltZSdcIj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgWyhuZ01vZGVsKV09XCJmb3JtQ29uZmlnLmZvbGxvd1wiIG5hbWU9XCJmb2xsb3dcIiAvPlxuICAgICAgICAgIDxzcGFuPjwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtMTJcIiB0cmFuc2xhdGU+Rm9sbG93IHNlbGVjdGVkPC9zcGFuPlxuICAgICAgICA8L2xhYmVsPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG5cbjxkaXYgY2xhc3M9XCJwLXQtMTYgcC1iLTE2XCIgc3R5bGU9XCJ3aWR0aDogMTAwJTsgaGVpZ2h0OiAyNDBweFwiPlxuICA8Yzh5LW1hcFxuICAgIFthc3NldHNdPVwiYXNzZXRzXCJcbiAgICAob25Nb3ZlKT1cIm9uUHJldmlld01hcE1vdmUoJGV2ZW50KVwiXG4gICAgKG9uWm9vbVN0YXJ0KT1cIm9uUHJldmlld1pvb21TdGFydCgpXCJcbiAgICAob25ab29tRW5kKT1cIm9uUHJldmlld1pvb21FbmQoJGV2ZW50KVwiXG4gICAgW2NvbmZpZ109XCJjb25maWcubWFwQ29uZmlnXCJcbiAgPjwvYzh5LW1hcD5cbjwvZGl2PlxuIl19
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { __awaiter } from 'tslib';
|
|
2
2
|
import * as i0 from '@angular/core';
|
|
3
3
|
import { Injectable, NgModule } from '@angular/core';
|
|
4
|
-
import { from, Subject } from 'rxjs';
|
|
4
|
+
import { from, Subject, pipe } from 'rxjs';
|
|
5
5
|
import { filter } from 'rxjs/operators';
|
|
6
6
|
import * as i1 from '@c8y/client';
|
|
7
7
|
import { FetchClient, BasicAuth, CookieAuth, Realtime, EventBinaryService, EventService, InventoryService, MeasurementService, AlarmService, OperationBulkService, OperationService, ApplicationService, UserService, TenantService, SystemOptionsService, TenantOptionsService, TenantSecurityOptionsService, TenantLoginOptionsService, AuditService, InventoryRoleService, InventoryBinaryService, DeviceRegistrationService, DeviceRegistrationBulkService, UserRoleService, UserGroupService, IdentityService, TrustedCertificateService, SmartGroupsService, SmartRulesService } from '@c8y/client';
|
|
@@ -89,6 +89,21 @@ class ApiService {
|
|
|
89
89
|
return response.clone().json().then(cb, cb);
|
|
90
90
|
}
|
|
91
91
|
}
|
|
92
|
+
/**
|
|
93
|
+
* Can be added to a pipe to exclude any permission call. Permission calls are PUT
|
|
94
|
+
* request with only an id in it, to verify if the user has access to this managed object.
|
|
95
|
+
* @returns The operator to be added to a pipe.
|
|
96
|
+
*/
|
|
97
|
+
excludePermissionCall() {
|
|
98
|
+
return pipe(filter(({ method, options }) => {
|
|
99
|
+
if (method === 'PUT' && options.body && typeof options.body === 'string') {
|
|
100
|
+
const parsedBody = JSON.parse(options.body);
|
|
101
|
+
const bodyKeys = Object.keys(parsedBody);
|
|
102
|
+
return !(bodyKeys.length === 1 && bodyKeys[0] === 'id');
|
|
103
|
+
}
|
|
104
|
+
return true;
|
|
105
|
+
}));
|
|
106
|
+
}
|
|
92
107
|
/**
|
|
93
108
|
* Allows to intercept requests performed via the FetchClient requests.
|
|
94
109
|
* @param interceptor The interceptor to be added.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"c8y-ngx-components-api.mjs","sources":["../../api/interceptor.model.ts","../../api/http-handler.model.ts","../../api/api.service.ts","../../api/data.module.ts","../../api/index.ts","../../api/c8y-ngx-components-api.ts"],"sourcesContent":["import { ApiCall } from './api.model';\nimport { Observable } from 'rxjs';\nimport { IFetchResponse } from '@c8y/client';\n\nexport interface HttpInterceptor {\n intercept(req: ApiCall, next: HttpHandler): Observable<IFetchResponse>;\n}\n\nexport abstract class HttpHandler {\n abstract handle(req: ApiCall): Observable<IFetchResponse>;\n}\n","import { ApiCall } from './api.model';\nimport { Observable, from } from 'rxjs';\nimport { FetchClient, IFetchResponse } from '@c8y/client';\nimport { HttpHandler, HttpInterceptor } from './interceptor.model';\n\nexport class HttpInterceptHandler extends HttpHandler {\n constructor(protected interceptor: HttpInterceptor, protected nextHandler: HttpHandler) {\n super();\n }\n\n handle(req: ApiCall): Observable<IFetchResponse> {\n return this.interceptor.intercept(req, this.nextHandler);\n }\n}\n\nexport interface RequestStartAndFinish {\n onStart(req: ApiCall): void;\n onFinish(res: ApiCall): void;\n}\n\nexport class HttpRequestHandler extends HttpHandler {\n constructor(protected fetch: FetchClient['fetch'], protected apiService?: RequestStartAndFinish) {\n super();\n }\n\n handle(req: ApiCall): Observable<IFetchResponse> {\n const { options, url } = req;\n const { method } = options;\n this.apiService?.onStart({ method, options, url });\n let fetchPromise = this.fetch(url, options);\n if (typeof options.responseInterceptor === 'function') {\n fetchPromise = fetchPromise.then(options.responseInterceptor);\n }\n fetchPromise.then(\n (response: IFetchResponse) => this.apiService?.onFinish({ method, options, url, response }),\n (response: IFetchResponse) => this.apiService?.onFinish({ method, options, url, response })\n );\n return from(fetchPromise);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { FetchClient, IFetchOptions, IFetchResponse } from '@c8y/client';\nimport { Subject, Observable } from 'rxjs';\nimport { ApiCall, ApiCallOptions } from './api.model';\nimport { filter } from 'rxjs/operators';\nimport { HttpInterceptor, HttpHandler } from './interceptor.model';\nimport {\n HttpInterceptHandler,\n HttpRequestHandler,\n RequestStartAndFinish\n} from './http-handler.model';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ApiService implements RequestStartAndFinish {\n calls: Observable<ApiCall>;\n private callsSubject = new Subject<ApiCall>();\n private interceptors = new Map<string, HttpInterceptor>();\n private interceptorCounter = 0;\n\n constructor(private client: FetchClient) {\n this.calls = this.callsSubject.asObservable();\n this.hookIntoClientFetch();\n }\n\n /**\n * Allows to hook into the responses received by the FetchClient.\n * This is meant to be used to react on the responses, not for manipulation of the responses.\n * @param hookFilter A filter function to filter for specific responses.\n * @returns An Observable of the filtered responses.\n */\n hookResponse(hookFilter: (call: ApiCall) => boolean) {\n return this.callsSubject.pipe(\n filter(({ phase }) => phase === 'finish'),\n filter(hookFilter)\n );\n }\n\n /**\n * Allows to hook into the requests performed by the FetchClient.\n * This is meant to be used to react on the requests, not for manipulation of the requests.\n * @param hookFilter A filter function to filter for specific requests.\n * @returns An Observable of the filtered requests.\n */\n hookRequest(hookFilter: (call: ApiCall) => boolean) {\n return this.callsSubject.pipe(\n filter(({ phase }) => phase === 'start'),\n filter(hookFilter)\n );\n }\n\n async onFinish(call: ApiCall) {\n this.callsSubject.next({ phase: 'finish', ...call });\n }\n\n onStart(call: ApiCall) {\n this.callsSubject.next({ phase: 'start', ...call });\n }\n\n resolveData<T = unknown>(call: ApiCall): Promise<{ data: T; method: string; url: string }> {\n const { response, method, url } = call;\n if ('data' in response) {\n return Promise.resolve({ data: response.data, method, url });\n } else {\n // No Content success status, for example DELETE request.\n if ((response as Response)?.status === 204) {\n return Promise.resolve({ data: null, method, url });\n }\n const cb = data => ({ data, method, url });\n return (response as Response).clone().json().then(cb, cb);\n }\n }\n\n /**\n * Allows to intercept requests performed via the FetchClient requests.\n * @param interceptor The interceptor to be added.\n * @param id An optional unique identifier for the interceptor. The chain of interceptors is ordered by this id. And it can be used to remove the interceptor later on.\n * @returns The id of the interceptor (same as provided id if one was provided, otherwise an id will be generated).\n */\n addInterceptor(interceptor: HttpInterceptor, id?: string): string {\n if (!id) {\n id = `${++this.interceptorCounter}`;\n }\n this.interceptors.set(id, interceptor);\n return id;\n }\n\n /**\n * Allows to remove a previously added interceptor by it's id.\n * @param id The id of the interceptor that should be removed.\n * @returns true if an interceptor existed and has been removed, or false if id does not exist.\n */\n removeInterceptor(id: string): boolean {\n return this.interceptors.delete(id);\n }\n\n private hookIntoClientFetch() {\n const fetch: FetchClient['fetch'] = this.client.fetch.bind(this.client);\n const requestHandler = new HttpRequestHandler(fetch, this);\n this.client.fetch = async (\n url,\n options: ApiCallOptions & IFetchOptions = { method: 'GET' }\n ) => {\n const { method } = options;\n return this.createInterceptorChain({ url, options, method }, requestHandler).toPromise();\n };\n }\n\n private createInterceptorChain(\n call: ApiCall,\n requestHandler: HttpRequestHandler\n ): Observable<IFetchResponse> {\n let handler: HttpHandler = requestHandler;\n // Do some sorting to always apply the interceptors in the specific order\n const sortedInterceptorIds = Array.from(this.interceptors.keys()).sort((a, b) =>\n b.localeCompare(a)\n );\n for (const interceptorId of sortedInterceptorIds) {\n handler = new HttpInterceptHandler(this.interceptors.get(interceptorId), handler);\n }\n return handler.handle(call);\n }\n}\n","import { ModuleWithProviders, NgModule, Provider, Type } from '@angular/core';\nimport { BasicAuth, FetchClient, Realtime, CookieAuth } from '@c8y/client';\nimport { ApiService } from './api.service';\nimport * as services from './services';\n\nfunction toProvider(provide: Type<unknown>): Provider {\n let deps: Array<Type<FetchClient | Realtime | CookieAuth>> = [FetchClient, Realtime];\n if (provide === FetchClient) {\n deps = [CookieAuth];\n }\n if (provide === BasicAuth || provide === CookieAuth) {\n deps = [];\n }\n if (provide === Realtime) {\n deps = [FetchClient];\n }\n return { provide, useClass: provide, deps };\n}\n\nconst providers: Provider[] = Object.keys(services)\n .map(k => toProvider(services[k]))\n .concat([{ provide: ApiService, useClass: ApiService, deps: [FetchClient] }]);\n// @dynamic\n@NgModule({\n providers\n})\nexport class DataModule {\n static providers(): Provider[] {\n return providers;\n }\n static forRoot(): ModuleWithProviders<DataModule> {\n return {\n ngModule: DataModule,\n providers\n };\n }\n}\n","export * from './api.service';\nexport * from './api.model';\nexport * from './data.module';\nexport * from './services';\nexport * from './interceptor.model';\n// do not expose as it might confuse people on what to implement\n// export * from './http-handler.model';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"c8y-ngx-components-api.mjs","sources":["../../api/interceptor.model.ts","../../api/http-handler.model.ts","../../api/api.service.ts","../../api/data.module.ts","../../api/index.ts","../../api/c8y-ngx-components-api.ts"],"sourcesContent":["import { ApiCall } from './api.model';\nimport { Observable } from 'rxjs';\nimport { IFetchResponse } from '@c8y/client';\n\nexport interface HttpInterceptor {\n intercept(req: ApiCall, next: HttpHandler): Observable<IFetchResponse>;\n}\n\nexport abstract class HttpHandler {\n abstract handle(req: ApiCall): Observable<IFetchResponse>;\n}\n","import { ApiCall } from './api.model';\nimport { Observable, from } from 'rxjs';\nimport { FetchClient, IFetchResponse } from '@c8y/client';\nimport { HttpHandler, HttpInterceptor } from './interceptor.model';\n\nexport class HttpInterceptHandler extends HttpHandler {\n constructor(protected interceptor: HttpInterceptor, protected nextHandler: HttpHandler) {\n super();\n }\n\n handle(req: ApiCall): Observable<IFetchResponse> {\n return this.interceptor.intercept(req, this.nextHandler);\n }\n}\n\nexport interface RequestStartAndFinish {\n onStart(req: ApiCall): void;\n onFinish(res: ApiCall): void;\n}\n\nexport class HttpRequestHandler extends HttpHandler {\n constructor(protected fetch: FetchClient['fetch'], protected apiService?: RequestStartAndFinish) {\n super();\n }\n\n handle(req: ApiCall): Observable<IFetchResponse> {\n const { options, url } = req;\n const { method } = options;\n this.apiService?.onStart({ method, options, url });\n let fetchPromise = this.fetch(url, options);\n if (typeof options.responseInterceptor === 'function') {\n fetchPromise = fetchPromise.then(options.responseInterceptor);\n }\n fetchPromise.then(\n (response: IFetchResponse) => this.apiService?.onFinish({ method, options, url, response }),\n (response: IFetchResponse) => this.apiService?.onFinish({ method, options, url, response })\n );\n return from(fetchPromise);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { FetchClient, IFetchOptions, IFetchResponse } from '@c8y/client';\nimport { Subject, Observable, MonoTypeOperatorFunction, pipe } from 'rxjs';\nimport { ApiCall, ApiCallOptions } from './api.model';\nimport { filter } from 'rxjs/operators';\nimport { HttpInterceptor, HttpHandler } from './interceptor.model';\nimport {\n HttpInterceptHandler,\n HttpRequestHandler,\n RequestStartAndFinish\n} from './http-handler.model';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ApiService implements RequestStartAndFinish {\n calls: Observable<ApiCall>;\n private callsSubject = new Subject<ApiCall>();\n private interceptors = new Map<string, HttpInterceptor>();\n private interceptorCounter = 0;\n\n constructor(private client: FetchClient) {\n this.calls = this.callsSubject.asObservable();\n this.hookIntoClientFetch();\n }\n\n /**\n * Allows to hook into the responses received by the FetchClient.\n * This is meant to be used to react on the responses, not for manipulation of the responses.\n * @param hookFilter A filter function to filter for specific responses.\n * @returns An Observable of the filtered responses.\n */\n hookResponse(hookFilter: (call: ApiCall) => boolean) {\n return this.callsSubject.pipe(\n filter(({ phase }) => phase === 'finish'),\n filter(hookFilter)\n );\n }\n\n /**\n * Allows to hook into the requests performed by the FetchClient.\n * This is meant to be used to react on the requests, not for manipulation of the requests.\n * @param hookFilter A filter function to filter for specific requests.\n * @returns An Observable of the filtered requests.\n */\n hookRequest(hookFilter: (call: ApiCall) => boolean) {\n return this.callsSubject.pipe(\n filter(({ phase }) => phase === 'start'),\n filter(hookFilter)\n );\n }\n\n async onFinish(call: ApiCall) {\n this.callsSubject.next({ phase: 'finish', ...call });\n }\n\n onStart(call: ApiCall) {\n this.callsSubject.next({ phase: 'start', ...call });\n }\n\n resolveData<T = unknown>(call: ApiCall): Promise<{ data: T; method: string; url: string }> {\n const { response, method, url } = call;\n if ('data' in response) {\n return Promise.resolve({ data: response.data, method, url });\n } else {\n // No Content success status, for example DELETE request.\n if ((response as Response)?.status === 204) {\n return Promise.resolve({ data: null, method, url });\n }\n const cb = data => ({ data, method, url });\n return (response as Response).clone().json().then(cb, cb);\n }\n }\n /**\n * Can be added to a pipe to exclude any permission call. Permission calls are PUT\n * request with only an id in it, to verify if the user has access to this managed object.\n * @returns The operator to be added to a pipe.\n */\n excludePermissionCall(): MonoTypeOperatorFunction<ApiCall> {\n return pipe(\n filter(({ method, options }) => {\n if (method === 'PUT' && options.body && typeof options.body === 'string') {\n const parsedBody = JSON.parse(options.body as string);\n const bodyKeys = Object.keys(parsedBody);\n return !(bodyKeys.length === 1 && bodyKeys[0] === 'id');\n }\n return true;\n })\n );\n }\n\n /**\n * Allows to intercept requests performed via the FetchClient requests.\n * @param interceptor The interceptor to be added.\n * @param id An optional unique identifier for the interceptor. The chain of interceptors is ordered by this id. And it can be used to remove the interceptor later on.\n * @returns The id of the interceptor (same as provided id if one was provided, otherwise an id will be generated).\n */\n addInterceptor(interceptor: HttpInterceptor, id?: string): string {\n if (!id) {\n id = `${++this.interceptorCounter}`;\n }\n this.interceptors.set(id, interceptor);\n return id;\n }\n\n /**\n * Allows to remove a previously added interceptor by it's id.\n * @param id The id of the interceptor that should be removed.\n * @returns true if an interceptor existed and has been removed, or false if id does not exist.\n */\n removeInterceptor(id: string): boolean {\n return this.interceptors.delete(id);\n }\n\n private hookIntoClientFetch() {\n const fetch: FetchClient['fetch'] = this.client.fetch.bind(this.client);\n const requestHandler = new HttpRequestHandler(fetch, this);\n this.client.fetch = async (\n url,\n options: ApiCallOptions & IFetchOptions = { method: 'GET' }\n ) => {\n const { method } = options;\n return this.createInterceptorChain({ url, options, method }, requestHandler).toPromise();\n };\n }\n\n private createInterceptorChain(\n call: ApiCall,\n requestHandler: HttpRequestHandler\n ): Observable<IFetchResponse> {\n let handler: HttpHandler = requestHandler;\n // Do some sorting to always apply the interceptors in the specific order\n const sortedInterceptorIds = Array.from(this.interceptors.keys()).sort((a, b) =>\n b.localeCompare(a)\n );\n for (const interceptorId of sortedInterceptorIds) {\n handler = new HttpInterceptHandler(this.interceptors.get(interceptorId), handler);\n }\n return handler.handle(call);\n }\n}\n","import { ModuleWithProviders, NgModule, Provider, Type } from '@angular/core';\nimport { BasicAuth, FetchClient, Realtime, CookieAuth } from '@c8y/client';\nimport { ApiService } from './api.service';\nimport * as services from './services';\n\nfunction toProvider(provide: Type<unknown>): Provider {\n let deps: Array<Type<FetchClient | Realtime | CookieAuth>> = [FetchClient, Realtime];\n if (provide === FetchClient) {\n deps = [CookieAuth];\n }\n if (provide === BasicAuth || provide === CookieAuth) {\n deps = [];\n }\n if (provide === Realtime) {\n deps = [FetchClient];\n }\n return { provide, useClass: provide, deps };\n}\n\nconst providers: Provider[] = Object.keys(services)\n .map(k => toProvider(services[k]))\n .concat([{ provide: ApiService, useClass: ApiService, deps: [FetchClient] }]);\n// @dynamic\n@NgModule({\n providers\n})\nexport class DataModule {\n static providers(): Provider[] {\n return providers;\n }\n static forRoot(): ModuleWithProviders<DataModule> {\n return {\n ngModule: DataModule,\n providers\n };\n }\n}\n","export * from './api.service';\nexport * from './api.model';\nexport * from './data.module';\nexport * from './services';\nexport * from './interceptor.model';\n// do not expose as it might confuse people on what to implement\n// export * from './http-handler.model';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -632,7 +632,7 @@ class AssetNodeService {
|
|
|
632
632
|
return this.apiService
|
|
633
633
|
.hookResponse(({ url, method }) => ['PUT', 'DELETE', 'POST'].includes(method) &&
|
|
634
634
|
RegExp(`((inventory/managedObjects)|(service/smartgroup/smartgroups))/${mo.id}`).test(url))
|
|
635
|
-
.pipe(filter(() => !this.draggedData), mergeMap((this.apiService.resolveData)), filter(response => { var _a; return !((_a = response === null || response === void 0 ? void 0 : response.data) === null || _a === void 0 ? void 0 : _a.c8y_Dashboard); }));
|
|
635
|
+
.pipe(filter(() => !this.draggedData), this.apiService.excludePermissionCall(), mergeMap((this.apiService.resolveData)), filter(response => { var _a; return !((_a = response === null || response === void 0 ? void 0 : response.data) === null || _a === void 0 ? void 0 : _a.c8y_Dashboard); }));
|
|
636
636
|
}
|
|
637
637
|
else if (root) {
|
|
638
638
|
return this.apiService
|