@gravitee/ui-policy-studio-angular 15.13.0 → 16.0.0
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/fesm2022/gravitee-ui-policy-studio-angular-testing.mjs +1 -1
- package/fesm2022/gravitee-ui-policy-studio-angular-testing.mjs.map +1 -1
- package/fesm2022/gravitee-ui-policy-studio-angular.mjs +92 -95
- package/fesm2022/gravitee-ui-policy-studio-angular.mjs.map +1 -1
- package/index.d.ts +404 -3
- package/package.json +7 -11
- package/testing/index.d.ts +369 -3
- package/esm2022/gravitee-ui-policy-studio-angular.mjs +0 -5
- package/esm2022/lib/components/filter-pipe/gio-flter-connectors-by-mode.pipe.mjs +0 -43
- package/esm2022/lib/components/flow-details/gio-ps-flow-details.component.mjs +0 -184
- package/esm2022/lib/components/flow-details-info-bar/gio-ps-flow-details-info-bar.component.mjs +0 -115
- package/esm2022/lib/components/flow-details-phase/gio-ps-flow-details-phase.component.mjs +0 -179
- package/esm2022/lib/components/flow-details-phase-step/gio-ps-flow-details-phase-step.component.mjs +0 -162
- package/esm2022/lib/components/flow-execution-form-dialog/gio-ps-flow-execution-form-dialog.component.mjs +0 -81
- package/esm2022/lib/components/flow-form-dialog/flow-message-form-dialog/gio-ps-flow-message-form-dialog.component.mjs +0 -109
- package/esm2022/lib/components/flow-form-dialog/flow-native-form-dialog/gio-ps-flow-native-form-dialog.component.mjs +0 -89
- package/esm2022/lib/components/flow-form-dialog/flow-proxy-form-dialog/gio-ps-flow-proxy-form-dialog.component.mjs +0 -135
- package/esm2022/lib/components/flow-form-dialog/gio-ps-flow-form-dialog-result.model.mjs +0 -2
- package/esm2022/lib/components/flows-menu/gio-ps-flows-menu.component.mjs +0 -432
- package/esm2022/lib/components/policies-catalog-dialog/gio-ps-policies-catalog-dialog.component.mjs +0 -165
- package/esm2022/lib/components/step-edit-dialog/gio-ps-step-edit-dialog.component.mjs +0 -53
- package/esm2022/lib/components/step-form/gio-ps-step-form.component.mjs +0 -158
- package/esm2022/lib/models/ApiProtocolType.mjs +0 -17
- package/esm2022/lib/models/ApiType.mjs +0 -17
- package/esm2022/lib/models/ConnectorsInfo.mjs +0 -2
- package/esm2022/lib/models/PolicySchemaFetcher.mjs +0 -2
- package/esm2022/lib/models/SaveOutput.mjs +0 -2
- package/esm2022/lib/models/flow/Flow.mjs +0 -2
- package/esm2022/lib/models/flow/FlowExecution.mjs +0 -17
- package/esm2022/lib/models/flow/HttpMethod.mjs +0 -43
- package/esm2022/lib/models/flow/Selector.mjs +0 -2
- package/esm2022/lib/models/flow/Step.mjs +0 -2
- package/esm2022/lib/models/flow/index.mjs +0 -21
- package/esm2022/lib/models/index.mjs +0 -24
- package/esm2022/lib/models/plan/Plan.mjs +0 -17
- package/esm2022/lib/models/plan/index.mjs +0 -17
- package/esm2022/lib/models/policy/GenericPolicy.mjs +0 -24
- package/esm2022/lib/models/policy/Policy.mjs +0 -44
- package/esm2022/lib/models/policy/SharedPolicyGroupPolicy.mjs +0 -17
- package/esm2022/lib/models/policy/index.mjs +0 -19
- package/esm2022/lib/policy-group-studio/gio-policy-group-studio.component.mjs +0 -228
- package/esm2022/lib/policy-studio/gio-policy-studio.component.mjs +0 -304
- package/esm2022/lib/policy-studio/gio-policy-studio.model.mjs +0 -17
- package/esm2022/lib/policy-studio/gio-policy-studio.service.mjs +0 -74
- package/esm2022/public-api.mjs +0 -22
- package/esm2022/testing/gravitee-ui-policy-studio-angular-testing.mjs +0 -5
- package/esm2022/testing/lib/components/flow-details/gio-ps-flow-details.harness.mjs +0 -56
- package/esm2022/testing/lib/components/flow-details-info-bar/gio-ps-flow-details-info-bar.harness.mjs +0 -35
- package/esm2022/testing/lib/components/flow-details-phase/gio-ps-flow-details-phase.harness.mjs +0 -155
- package/esm2022/testing/lib/components/flow-details-phase-step/gio-ps-flow-details-phase-step.harness.mjs +0 -69
- package/esm2022/testing/lib/components/flow-execution-form-dialog/gio-ps-flow-execution-form-dialog.harness.mjs +0 -60
- package/esm2022/testing/lib/components/flow-form-dialog/flow-message-form-dialog/gio-ps-flow-message-form-dialog.harness.mjs +0 -128
- package/esm2022/testing/lib/components/flow-form-dialog/flow-native-form-dialog/gio-ps-flow-native-form-dialog.harness.mjs +0 -50
- package/esm2022/testing/lib/components/flow-form-dialog/flow-proxy-form-dialog/gio-ps-flow-proxy-form-dialog.harness.mjs +0 -98
- package/esm2022/testing/lib/components/flows-menu/gio-ps-flows-menu.harness.mjs +0 -91
- package/esm2022/testing/lib/components/policies-catalog-dialog/gio-ps-policies-catalog-dialog.harness.mjs +0 -87
- package/esm2022/testing/lib/components/step-edit-dialog/gio-ps-step-edit-dialog.harness.mjs +0 -30
- package/esm2022/testing/lib/components/step-form/gio-ps-step-form.harness.mjs +0 -56
- package/esm2022/testing/lib/models/ApiProtocolType.mjs +0 -17
- package/esm2022/testing/lib/models/ApiType.mjs +0 -17
- package/esm2022/testing/lib/models/ConnectorsInfo.fixture.mjs +0 -182
- package/esm2022/testing/lib/models/ConnectorsInfo.mjs +0 -2
- package/esm2022/testing/lib/models/PolicySchemaFetcher.mjs +0 -2
- package/esm2022/testing/lib/models/SaveOutput.mjs +0 -2
- package/esm2022/testing/lib/models/flow/Flow.fixture.mjs +0 -122
- package/esm2022/testing/lib/models/flow/Flow.mjs +0 -2
- package/esm2022/testing/lib/models/flow/FlowExecution.fixture.mjs +0 -43
- package/esm2022/testing/lib/models/flow/FlowExecution.mjs +0 -17
- package/esm2022/testing/lib/models/flow/HttpMethod.mjs +0 -43
- package/esm2022/testing/lib/models/flow/Selector.mjs +0 -2
- package/esm2022/testing/lib/models/flow/Step.fixture.mjs +0 -92
- package/esm2022/testing/lib/models/flow/Step.mjs +0 -2
- package/esm2022/testing/lib/models/flow/index-testing.mjs +0 -19
- package/esm2022/testing/lib/models/flow/index.mjs +0 -21
- package/esm2022/testing/lib/models/index-testing.mjs +0 -20
- package/esm2022/testing/lib/models/index.mjs +0 -24
- package/esm2022/testing/lib/models/plan/Plan.fixture.mjs +0 -31
- package/esm2022/testing/lib/models/plan/Plan.mjs +0 -17
- package/esm2022/testing/lib/models/plan/index-testing.mjs +0 -17
- package/esm2022/testing/lib/models/plan/index.mjs +0 -17
- package/esm2022/testing/lib/models/policy/GenericPolicy.mjs +0 -24
- package/esm2022/testing/lib/models/policy/Policy.fixture.mjs +0 -194
- package/esm2022/testing/lib/models/policy/Policy.mjs +0 -44
- package/esm2022/testing/lib/models/policy/SharedPolicyGroupPolicy.mjs +0 -17
- package/esm2022/testing/lib/models/policy/index-testing.mjs +0 -17
- package/esm2022/testing/lib/models/policy/index.mjs +0 -19
- package/esm2022/testing/lib/policy-group-studio/gio-policy-group-studio.harness.mjs +0 -52
- package/esm2022/testing/lib/policy-studio/gio-policy-studio.harness.mjs +0 -202
- package/esm2022/testing/lib/policy-studio/gio-policy-studio.model.mjs +0 -17
- package/esm2022/testing/public-testing-api.mjs +0 -19
- package/lib/components/filter-pipe/gio-flter-connectors-by-mode.pipe.d.ts +0 -8
- package/lib/components/flow-details/gio-ps-flow-details.component.d.ts +0 -29
- package/lib/components/flow-details-info-bar/gio-ps-flow-details-info-bar.component.d.ts +0 -20
- package/lib/components/flow-details-phase/gio-ps-flow-details-phase.component.d.ts +0 -47
- package/lib/components/flow-details-phase-step/gio-ps-flow-details-phase-step.component.d.ts +0 -33
- package/lib/components/flow-execution-form-dialog/gio-ps-flow-execution-form-dialog.component.d.ts +0 -18
- package/lib/components/flow-form-dialog/flow-message-form-dialog/gio-ps-flow-message-form-dialog.component.d.ts +0 -21
- package/lib/components/flow-form-dialog/flow-native-form-dialog/gio-ps-flow-native-form-dialog.component.d.ts +0 -21
- package/lib/components/flow-form-dialog/flow-proxy-form-dialog/gio-ps-flow-proxy-form-dialog.component.d.ts +0 -24
- package/lib/components/flow-form-dialog/gio-ps-flow-form-dialog-result.model.d.ts +0 -2
- package/lib/components/flows-menu/gio-ps-flows-menu.component.d.ts +0 -57
- package/lib/components/policies-catalog-dialog/gio-ps-policies-catalog-dialog.component.d.ts +0 -47
- package/lib/components/step-edit-dialog/gio-ps-step-edit-dialog.component.d.ts +0 -24
- package/lib/components/step-form/gio-ps-step-form.component.d.ts +0 -35
- package/lib/models/ApiProtocolType.d.ts +0 -1
- package/lib/models/ApiType.d.ts +0 -1
- package/lib/models/ConnectorsInfo.d.ts +0 -7
- package/lib/models/PolicySchemaFetcher.d.ts +0 -5
- package/lib/models/SaveOutput.d.ts +0 -7
- package/lib/models/flow/Flow.d.ts +0 -24
- package/lib/models/flow/FlowExecution.d.ts +0 -11
- package/lib/models/flow/HttpMethod.d.ts +0 -3
- package/lib/models/flow/Selector.d.ts +0 -37
- package/lib/models/flow/Step.d.ts +0 -34
- package/lib/models/flow/index.d.ts +0 -5
- package/lib/models/index.d.ts +0 -8
- package/lib/models/plan/Plan.d.ts +0 -6
- package/lib/models/plan/index.d.ts +0 -1
- package/lib/models/policy/GenericPolicy.d.ts +0 -22
- package/lib/models/policy/Policy.d.ts +0 -28
- package/lib/models/policy/SharedPolicyGroupPolicy.d.ts +0 -11
- package/lib/models/policy/index.d.ts +0 -3
- package/lib/policy-group-studio/gio-policy-group-studio.component.d.ts +0 -70
- package/lib/policy-studio/gio-policy-studio.component.d.ts +0 -98
- package/lib/policy-studio/gio-policy-studio.model.d.ts +0 -17
- package/lib/policy-studio/gio-policy-studio.service.d.ts +0 -30
- package/public-api.d.ts +0 -3
- package/testing/lib/components/flow-details/gio-ps-flow-details.harness.d.ts +0 -12
- package/testing/lib/components/flow-details-info-bar/gio-ps-flow-details-info-bar.harness.d.ts +0 -5
- package/testing/lib/components/flow-details-phase/gio-ps-flow-details-phase.harness.d.ts +0 -69
- package/testing/lib/components/flow-details-phase-step/gio-ps-flow-details-phase-step.harness.d.ts +0 -21
- package/testing/lib/components/flow-execution-form-dialog/gio-ps-flow-execution-form-dialog.harness.d.ts +0 -13
- package/testing/lib/components/flow-form-dialog/flow-message-form-dialog/gio-ps-flow-message-form-dialog.harness.d.ts +0 -37
- package/testing/lib/components/flow-form-dialog/flow-native-form-dialog/gio-ps-flow-native-form-dialog.harness.d.ts +0 -17
- package/testing/lib/components/flow-form-dialog/flow-proxy-form-dialog/gio-ps-flow-proxy-form-dialog.harness.d.ts +0 -33
- package/testing/lib/components/flows-menu/gio-ps-flows-menu.harness.d.ts +0 -31
- package/testing/lib/components/policies-catalog-dialog/gio-ps-policies-catalog-dialog.harness.d.ts +0 -20
- package/testing/lib/components/step-edit-dialog/gio-ps-step-edit-dialog.harness.d.ts +0 -8
- package/testing/lib/components/step-form/gio-ps-step-form.harness.d.ts +0 -18
- package/testing/lib/models/ApiProtocolType.d.ts +0 -1
- package/testing/lib/models/ApiType.d.ts +0 -1
- package/testing/lib/models/ConnectorsInfo.d.ts +0 -7
- package/testing/lib/models/ConnectorsInfo.fixture.d.ts +0 -12
- package/testing/lib/models/PolicySchemaFetcher.d.ts +0 -5
- package/testing/lib/models/SaveOutput.d.ts +0 -7
- package/testing/lib/models/flow/Flow.d.ts +0 -24
- package/testing/lib/models/flow/Flow.fixture.d.ts +0 -6
- package/testing/lib/models/flow/FlowExecution.d.ts +0 -11
- package/testing/lib/models/flow/FlowExecution.fixture.d.ts +0 -3
- package/testing/lib/models/flow/HttpMethod.d.ts +0 -3
- package/testing/lib/models/flow/Selector.d.ts +0 -37
- package/testing/lib/models/flow/Step.d.ts +0 -34
- package/testing/lib/models/flow/Step.fixture.d.ts +0 -5
- package/testing/lib/models/flow/index-testing.d.ts +0 -3
- package/testing/lib/models/flow/index.d.ts +0 -5
- package/testing/lib/models/index-testing.d.ts +0 -4
- package/testing/lib/models/index.d.ts +0 -8
- package/testing/lib/models/plan/Plan.d.ts +0 -6
- package/testing/lib/models/plan/Plan.fixture.d.ts +0 -2
- package/testing/lib/models/plan/index-testing.d.ts +0 -1
- package/testing/lib/models/plan/index.d.ts +0 -1
- package/testing/lib/models/policy/GenericPolicy.d.ts +0 -22
- package/testing/lib/models/policy/Policy.d.ts +0 -28
- package/testing/lib/models/policy/Policy.fixture.d.ts +0 -4
- package/testing/lib/models/policy/SharedPolicyGroupPolicy.d.ts +0 -11
- package/testing/lib/models/policy/index-testing.d.ts +0 -1
- package/testing/lib/models/policy/index.d.ts +0 -3
- package/testing/lib/policy-group-studio/gio-policy-group-studio.harness.d.ts +0 -20
- package/testing/lib/policy-studio/gio-policy-studio.harness.d.ts +0 -78
- package/testing/lib/policy-studio/gio-policy-studio.model.d.ts +0 -17
- package/testing/public-testing-api.d.ts +0 -3
|
@@ -1,432 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Copyright (C) 2022 The Gravitee team (http://gravitee.io)
|
|
3
|
-
*
|
|
4
|
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
-
* you may not use this file except in compliance with the License.
|
|
6
|
-
* You may obtain a copy of the License at
|
|
7
|
-
*
|
|
8
|
-
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
-
*
|
|
10
|
-
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
-
* See the License for the specific language governing permissions and
|
|
14
|
-
* limitations under the License.
|
|
15
|
-
*/
|
|
16
|
-
import { DragDropModule, moveItemInArray, transferArrayItem } from '@angular/cdk/drag-drop';
|
|
17
|
-
import { CommonModule } from '@angular/common';
|
|
18
|
-
import { Component, EventEmitter, Input, Output } from '@angular/core';
|
|
19
|
-
import { FormControl, ReactiveFormsModule } from '@angular/forms';
|
|
20
|
-
import { MatButtonModule } from '@angular/material/button';
|
|
21
|
-
import { MatFormFieldModule } from '@angular/material/form-field';
|
|
22
|
-
import { MatInputModule } from '@angular/material/input';
|
|
23
|
-
import { MatMenuModule } from '@angular/material/menu';
|
|
24
|
-
import { MatTooltipModule } from '@angular/material/tooltip';
|
|
25
|
-
import { GIO_DIALOG_WIDTH, GioIconsModule, GioLoaderModule } from '@gravitee/ui-particles-angular';
|
|
26
|
-
import { cloneDeep, flatten, isEmpty, uniqueId } from 'lodash';
|
|
27
|
-
import { debounceTime, distinctUntilChanged, startWith, takeUntil, tap } from 'rxjs/operators';
|
|
28
|
-
import { Subject } from 'rxjs';
|
|
29
|
-
import { GioPolicyStudioFlowExecutionFormDialogComponent, } from '../flow-execution-form-dialog/gio-ps-flow-execution-form-dialog.component';
|
|
30
|
-
import { GioPolicyStudioFlowMessageFormDialogComponent, } from '../flow-form-dialog/flow-message-form-dialog/gio-ps-flow-message-form-dialog.component';
|
|
31
|
-
import { GioPolicyStudioFlowNativeFormDialogComponent, } from '../flow-form-dialog/flow-native-form-dialog/gio-ps-flow-native-form-dialog.component';
|
|
32
|
-
import { GioPolicyStudioFlowProxyFormDialogComponent, } from '../flow-form-dialog/flow-proxy-form-dialog/gio-ps-flow-proxy-form-dialog.component';
|
|
33
|
-
import * as i0 from "@angular/core";
|
|
34
|
-
import * as i1 from "@angular/material/dialog";
|
|
35
|
-
import * as i2 from "@angular/material/icon";
|
|
36
|
-
import * as i3 from "@angular/material/tooltip";
|
|
37
|
-
import * as i4 from "@angular/material/button";
|
|
38
|
-
import * as i5 from "@angular/common";
|
|
39
|
-
import * as i6 from "@gravitee/ui-particles-angular";
|
|
40
|
-
import * as i7 from "@angular/material/menu";
|
|
41
|
-
import * as i8 from "@angular/cdk/drag-drop";
|
|
42
|
-
import * as i9 from "@angular/material/input";
|
|
43
|
-
import * as i10 from "@angular/material/form-field";
|
|
44
|
-
import * as i11 from "@angular/forms";
|
|
45
|
-
export class GioPolicyStudioFlowsMenuComponent {
|
|
46
|
-
constructor(matDialog) {
|
|
47
|
-
this.matDialog = matDialog;
|
|
48
|
-
this.readOnly = false;
|
|
49
|
-
this.loading = false;
|
|
50
|
-
this.flowsGroups = [];
|
|
51
|
-
this.selectedFlowId = undefined;
|
|
52
|
-
this.entrypoints = [];
|
|
53
|
-
this.entrypointsInfo = [];
|
|
54
|
-
this.selectedFlowIdChange = new EventEmitter();
|
|
55
|
-
this.flowsGroupsChange = new EventEmitter();
|
|
56
|
-
this.flowExecutionChange = new EventEmitter();
|
|
57
|
-
this.deleteFlow = new EventEmitter();
|
|
58
|
-
this.flowGroupMenuItems = [];
|
|
59
|
-
this.searchControl = new FormControl('');
|
|
60
|
-
this.filteredFlowGroupMenuItems = [];
|
|
61
|
-
this.unsubscribe$ = new Subject();
|
|
62
|
-
this.enterPredicate = () => true;
|
|
63
|
-
this.searchControl.valueChanges
|
|
64
|
-
.pipe(debounceTime(300), startWith(''), distinctUntilChanged(), tap(searchTerm => {
|
|
65
|
-
this.applyFilter(searchTerm || '');
|
|
66
|
-
}), takeUntil(this.unsubscribe$))
|
|
67
|
-
.subscribe();
|
|
68
|
-
}
|
|
69
|
-
ngOnChanges(changes) {
|
|
70
|
-
if (changes.flowsGroups || changes.selectedFlowId) {
|
|
71
|
-
this.flowGroupMenuItems = cloneDeep(this.flowsGroups).map(flowGroup => {
|
|
72
|
-
return {
|
|
73
|
-
...flowGroup,
|
|
74
|
-
flows: flowGroup.flows.map(flow => {
|
|
75
|
-
const badges = [];
|
|
76
|
-
let pathOrChannelLabel = '';
|
|
77
|
-
let hasCondition = false;
|
|
78
|
-
// MESSAGE API - CHANNEL
|
|
79
|
-
const channelSelector = flow.selectors?.find(s => s.type === 'CHANNEL');
|
|
80
|
-
if (channelSelector) {
|
|
81
|
-
const operationToBadge = {
|
|
82
|
-
PUBLISH: 'PUB',
|
|
83
|
-
SUBSCRIBE: 'SUB',
|
|
84
|
-
};
|
|
85
|
-
// If no operations are selected, all operations are valid
|
|
86
|
-
const operationBadges = (!channelSelector.operations || isEmpty(channelSelector.operations)
|
|
87
|
-
? ['PUBLISH', 'SUBSCRIBE']
|
|
88
|
-
: channelSelector.operations)
|
|
89
|
-
.map(operation => ({
|
|
90
|
-
label: operationToBadge[operation],
|
|
91
|
-
class: 'gio-badge-neutral',
|
|
92
|
-
}))
|
|
93
|
-
.sort((a, b) => a.label.localeCompare(b.label));
|
|
94
|
-
operationBadges && badges.push(...operationBadges);
|
|
95
|
-
pathOrChannelLabel = `${channelSelector.channel}${channelSelector.channelOperator === 'STARTS_WITH' ? '**' : ''}`;
|
|
96
|
-
}
|
|
97
|
-
// HTTP API - HTTP
|
|
98
|
-
const httpSelector = flow.selectors?.find(s => s.type === 'HTTP');
|
|
99
|
-
if (httpSelector) {
|
|
100
|
-
// Keep only 2 first http methods and add +X badge if there are more
|
|
101
|
-
const httpMethodsToKeep = httpSelector.methods?.slice(0, 2);
|
|
102
|
-
const httpMethodsLength = httpSelector.methods?.length ?? 0;
|
|
103
|
-
httpMethodsToKeep &&
|
|
104
|
-
badges.push(...httpMethodsToKeep.map(method => ({ label: method, class: `gio-method-badge-${method.toLowerCase()}` })));
|
|
105
|
-
if (httpMethodsLength && httpMethodsLength > 2) {
|
|
106
|
-
badges?.push({
|
|
107
|
-
label: `+${httpMethodsLength - 2}`,
|
|
108
|
-
class: 'gio-badge-neutral',
|
|
109
|
-
});
|
|
110
|
-
}
|
|
111
|
-
if (httpMethodsLength === 0) {
|
|
112
|
-
badges?.push({
|
|
113
|
-
label: 'ALL',
|
|
114
|
-
class: 'gio-badge-neutral',
|
|
115
|
-
});
|
|
116
|
-
}
|
|
117
|
-
pathOrChannelLabel = `${httpSelector.path}${httpSelector.pathOperator === 'STARTS_WITH' ? '/**' : ''}`;
|
|
118
|
-
}
|
|
119
|
-
const conditionSelector = flow.selectors?.find(s => s.type === 'CONDITION');
|
|
120
|
-
if (conditionSelector && conditionSelector.condition) {
|
|
121
|
-
hasCondition = true;
|
|
122
|
-
}
|
|
123
|
-
return {
|
|
124
|
-
...flow,
|
|
125
|
-
selected: this.selectedFlowId === flow._id,
|
|
126
|
-
mouseOver: false,
|
|
127
|
-
badges,
|
|
128
|
-
pathOrChannelLabel,
|
|
129
|
-
hasCondition,
|
|
130
|
-
};
|
|
131
|
-
}),
|
|
132
|
-
};
|
|
133
|
-
});
|
|
134
|
-
this.enterPredicate = (_drag, drop) => {
|
|
135
|
-
if (this.apiType === 'NATIVE') {
|
|
136
|
-
return isEmpty(drop.data.flows);
|
|
137
|
-
}
|
|
138
|
-
return true;
|
|
139
|
-
};
|
|
140
|
-
}
|
|
141
|
-
this.applyFilter(this.searchControl.value || '');
|
|
142
|
-
}
|
|
143
|
-
ngOnDestroy() {
|
|
144
|
-
this.unsubscribe$.next();
|
|
145
|
-
this.unsubscribe$.complete();
|
|
146
|
-
}
|
|
147
|
-
applyFilter(searchTerm) {
|
|
148
|
-
const term = searchTerm.toLowerCase();
|
|
149
|
-
if (!term) {
|
|
150
|
-
this.filteredFlowGroupMenuItems = [...this.flowGroupMenuItems];
|
|
151
|
-
return;
|
|
152
|
-
}
|
|
153
|
-
this.filteredFlowGroupMenuItems = this.flowGroupMenuItems
|
|
154
|
-
.map(group => {
|
|
155
|
-
const filteredFlows = group?.flows?.filter(flow => {
|
|
156
|
-
return ((group.name && group.name?.toLowerCase().includes(term)) ||
|
|
157
|
-
(flow.name && flow.name?.toLowerCase().includes(term)) ||
|
|
158
|
-
(flow.pathOrChannelLabel && flow.pathOrChannelLabel?.toLowerCase().includes(term)) ||
|
|
159
|
-
(flow.selectors && flow.selectors?.some(selector => this.selectorMatches(selector, term))) ||
|
|
160
|
-
(flow.badges && flow.badges?.some(badges => badges.label?.toLowerCase().includes(term))));
|
|
161
|
-
});
|
|
162
|
-
return { ...group, flows: filteredFlows };
|
|
163
|
-
})
|
|
164
|
-
.filter(group => group.flows.length > 0);
|
|
165
|
-
}
|
|
166
|
-
resetSearchTerm() {
|
|
167
|
-
this.searchControl.setValue('');
|
|
168
|
-
this.applyFilter('');
|
|
169
|
-
}
|
|
170
|
-
selectorMatches(selector, term) {
|
|
171
|
-
const type = selector.type;
|
|
172
|
-
if (type === 'HTTP') {
|
|
173
|
-
const httpSelector = selector;
|
|
174
|
-
if (httpSelector.path?.toLowerCase().includes(term))
|
|
175
|
-
return true;
|
|
176
|
-
if (httpSelector.methods?.some(method => method.toLowerCase().includes(term))) {
|
|
177
|
-
return true;
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
if (type === 'CHANNEL') {
|
|
181
|
-
const channelSelector = selector;
|
|
182
|
-
if (channelSelector.channel?.toLowerCase().includes(term))
|
|
183
|
-
return true;
|
|
184
|
-
if (channelSelector.operations?.some(op => op.toLowerCase().includes(term))) {
|
|
185
|
-
return true;
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
return false;
|
|
189
|
-
}
|
|
190
|
-
selectFlow(groupId, flowId) {
|
|
191
|
-
const flow = this.flowsGroups.find(fg => fg._id === groupId)?.flows.find(f => f._id === flowId);
|
|
192
|
-
if (flow) {
|
|
193
|
-
this.selectedFlowIdChange.emit(flow._id);
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
onAddFlow(flowGroup) {
|
|
197
|
-
let dialogResult;
|
|
198
|
-
switch (this.apiType) {
|
|
199
|
-
case 'MESSAGE':
|
|
200
|
-
dialogResult = this.matDialog
|
|
201
|
-
.open(GioPolicyStudioFlowMessageFormDialogComponent, {
|
|
202
|
-
data: {
|
|
203
|
-
flow: undefined,
|
|
204
|
-
entrypoints: this.entrypoints,
|
|
205
|
-
},
|
|
206
|
-
role: 'alertdialog',
|
|
207
|
-
id: 'gioPsFlowFormDialog',
|
|
208
|
-
width: GIO_DIALOG_WIDTH.MEDIUM,
|
|
209
|
-
})
|
|
210
|
-
.afterClosed();
|
|
211
|
-
break;
|
|
212
|
-
case 'PROXY':
|
|
213
|
-
dialogResult = this.matDialog
|
|
214
|
-
.open(GioPolicyStudioFlowProxyFormDialogComponent, {
|
|
215
|
-
data: {
|
|
216
|
-
flow: undefined,
|
|
217
|
-
},
|
|
218
|
-
role: 'alertdialog',
|
|
219
|
-
id: 'gioPsFlowFormDialog',
|
|
220
|
-
width: GIO_DIALOG_WIDTH.MEDIUM,
|
|
221
|
-
})
|
|
222
|
-
.afterClosed();
|
|
223
|
-
break;
|
|
224
|
-
case 'NATIVE':
|
|
225
|
-
dialogResult = this.matDialog
|
|
226
|
-
.open(GioPolicyStudioFlowNativeFormDialogComponent, {
|
|
227
|
-
data: {
|
|
228
|
-
parentGroupName: flowGroup.name,
|
|
229
|
-
flow: undefined,
|
|
230
|
-
},
|
|
231
|
-
role: 'alertdialog',
|
|
232
|
-
id: 'gioPsFlowFormDialog',
|
|
233
|
-
width: GIO_DIALOG_WIDTH.MEDIUM,
|
|
234
|
-
})
|
|
235
|
-
.afterClosed();
|
|
236
|
-
break;
|
|
237
|
-
default:
|
|
238
|
-
throw new Error(`Unsupported API type ${this.apiType}`);
|
|
239
|
-
}
|
|
240
|
-
dialogResult
|
|
241
|
-
.pipe(tap(createdOrEdited => {
|
|
242
|
-
if (!createdOrEdited) {
|
|
243
|
-
return;
|
|
244
|
-
}
|
|
245
|
-
const editedFlowsGroups = cloneDeep(this.flowsGroups);
|
|
246
|
-
const flowsGroupToEdit = editedFlowsGroups.find(fg => fg._id === flowGroup._id);
|
|
247
|
-
if (!flowsGroupToEdit) {
|
|
248
|
-
throw new Error(`Flow group ${flowGroup._id} not found`);
|
|
249
|
-
}
|
|
250
|
-
flowsGroupToEdit.flows.push(createdOrEdited);
|
|
251
|
-
this.flowsGroupsChange.emit(editedFlowsGroups);
|
|
252
|
-
this.selectedFlowIdChange.emit(createdOrEdited._id);
|
|
253
|
-
}))
|
|
254
|
-
.subscribe();
|
|
255
|
-
}
|
|
256
|
-
onConfigureExecution(flowExecution) {
|
|
257
|
-
const dialogResult = this.matDialog
|
|
258
|
-
.open(GioPolicyStudioFlowExecutionFormDialogComponent, {
|
|
259
|
-
data: {
|
|
260
|
-
flowExecution,
|
|
261
|
-
readOnly: this.readOnly,
|
|
262
|
-
},
|
|
263
|
-
role: 'alertdialog',
|
|
264
|
-
id: 'gioPsFlowExecutionFormDialog',
|
|
265
|
-
width: GIO_DIALOG_WIDTH.MEDIUM,
|
|
266
|
-
})
|
|
267
|
-
.afterClosed();
|
|
268
|
-
dialogResult
|
|
269
|
-
.pipe(tap(edited => {
|
|
270
|
-
if (!edited) {
|
|
271
|
-
return;
|
|
272
|
-
}
|
|
273
|
-
this.flowExecutionChange.emit(edited);
|
|
274
|
-
}))
|
|
275
|
-
.subscribe();
|
|
276
|
-
}
|
|
277
|
-
onDisableFlow(flowId) {
|
|
278
|
-
const flowToEdit = flatten(this.flowsGroups.map(flowGroup => flowGroup.flows)).find(f => f._id === flowId);
|
|
279
|
-
if (!flowToEdit) {
|
|
280
|
-
throw new Error(`Flow ${flowId} not found`);
|
|
281
|
-
}
|
|
282
|
-
flowToEdit.enabled = !flowToEdit.enabled;
|
|
283
|
-
flowToEdit._hasChanged = true;
|
|
284
|
-
this.flowsGroupsChange.emit(this.flowsGroups);
|
|
285
|
-
}
|
|
286
|
-
onDropFlow(event) {
|
|
287
|
-
if (event.previousContainer === event.container) {
|
|
288
|
-
// Move inside the same group
|
|
289
|
-
const flowsGroupToEdit = this.flowsGroups.find(fg => fg._id === event.container.data._id);
|
|
290
|
-
if (!flowsGroupToEdit) {
|
|
291
|
-
throw new Error(`Flow group ${event.container.data._id} not found`);
|
|
292
|
-
}
|
|
293
|
-
moveItemInArray(flowsGroupToEdit.flows, event.previousIndex, event.currentIndex);
|
|
294
|
-
this.flowsGroupsChange.emit(this.flowsGroups);
|
|
295
|
-
}
|
|
296
|
-
else {
|
|
297
|
-
// Move from a group to another
|
|
298
|
-
const previousFlowsGroupToEdit = this.flowsGroups.find(fg => fg._id === event.previousContainer.data._id);
|
|
299
|
-
const flowsGroupToEdit = this.flowsGroups.find(fg => fg._id === event.container.data._id);
|
|
300
|
-
if (!previousFlowsGroupToEdit || !flowsGroupToEdit) {
|
|
301
|
-
throw new Error(`Flow group ${event.previousContainer.data._id} or ${event.container.data._id} not found`);
|
|
302
|
-
}
|
|
303
|
-
transferArrayItem(previousFlowsGroupToEdit.flows, flowsGroupToEdit.flows, event.previousIndex, event.currentIndex);
|
|
304
|
-
flowsGroupToEdit.flows[event.currentIndex]._hasChanged = true;
|
|
305
|
-
flowsGroupToEdit.flows[event.currentIndex]._parentFlowGroupName = flowsGroupToEdit.name;
|
|
306
|
-
this.flowsGroupsChange.emit(this.flowsGroups);
|
|
307
|
-
}
|
|
308
|
-
}
|
|
309
|
-
onEditFlow(flowId) {
|
|
310
|
-
const flowToEdit = flatten(this.flowsGroups.map(flowGroup => flowGroup.flows)).find(f => f._id === flowId);
|
|
311
|
-
let dialogResult;
|
|
312
|
-
switch (this.apiType) {
|
|
313
|
-
case 'MESSAGE':
|
|
314
|
-
dialogResult = this.matDialog
|
|
315
|
-
.open(GioPolicyStudioFlowMessageFormDialogComponent, {
|
|
316
|
-
data: {
|
|
317
|
-
flow: flowToEdit,
|
|
318
|
-
entrypoints: this.entrypointsInfo ?? [],
|
|
319
|
-
},
|
|
320
|
-
role: 'alertdialog',
|
|
321
|
-
id: 'gioPsFlowMessageFormDialog',
|
|
322
|
-
width: GIO_DIALOG_WIDTH.MEDIUM,
|
|
323
|
-
})
|
|
324
|
-
.afterClosed();
|
|
325
|
-
break;
|
|
326
|
-
case 'PROXY':
|
|
327
|
-
dialogResult = this.matDialog
|
|
328
|
-
.open(GioPolicyStudioFlowProxyFormDialogComponent, {
|
|
329
|
-
data: {
|
|
330
|
-
flow: flowToEdit,
|
|
331
|
-
},
|
|
332
|
-
role: 'alertdialog',
|
|
333
|
-
id: 'gioPsFlowProxyFormDialog',
|
|
334
|
-
width: GIO_DIALOG_WIDTH.MEDIUM,
|
|
335
|
-
})
|
|
336
|
-
.afterClosed();
|
|
337
|
-
break;
|
|
338
|
-
case 'NATIVE':
|
|
339
|
-
dialogResult = this.matDialog
|
|
340
|
-
.open(GioPolicyStudioFlowNativeFormDialogComponent, {
|
|
341
|
-
data: {
|
|
342
|
-
parentGroupName: flowToEdit._parentFlowGroupName,
|
|
343
|
-
flow: flowToEdit,
|
|
344
|
-
},
|
|
345
|
-
role: 'alertdialog',
|
|
346
|
-
id: 'gioPsFlowNativeFormDialog',
|
|
347
|
-
width: GIO_DIALOG_WIDTH.MEDIUM,
|
|
348
|
-
})
|
|
349
|
-
.afterClosed();
|
|
350
|
-
break;
|
|
351
|
-
default:
|
|
352
|
-
throw new Error(`Unsupported API type ${this.apiType}`);
|
|
353
|
-
}
|
|
354
|
-
dialogResult
|
|
355
|
-
.pipe(tap(editedFlow => {
|
|
356
|
-
if (!editedFlow) {
|
|
357
|
-
return;
|
|
358
|
-
}
|
|
359
|
-
this.flowsGroups = this.flowsGroups.map(fg => ({
|
|
360
|
-
...fg,
|
|
361
|
-
flows: fg.flows.map(f => (f._id === editedFlow._id ? editedFlow : f)),
|
|
362
|
-
}));
|
|
363
|
-
this.flowsGroupsChange.emit(this.flowsGroups);
|
|
364
|
-
}))
|
|
365
|
-
.subscribe();
|
|
366
|
-
}
|
|
367
|
-
onDeleteFlow(flowId) {
|
|
368
|
-
const flowToEdit = flatten(this.flowsGroups.map(flowGroup => flowGroup.flows)).find(f => f._id === flowId);
|
|
369
|
-
this.deleteFlow.emit(flowToEdit);
|
|
370
|
-
}
|
|
371
|
-
onDuplicateFlow(flowGroupId, flowId) {
|
|
372
|
-
const flowsGroupToEdit = this.flowsGroups.find(fg => fg._id === flowGroupId);
|
|
373
|
-
if (!flowsGroupToEdit) {
|
|
374
|
-
throw new Error(`Flow group ${flowGroupId} not found`);
|
|
375
|
-
}
|
|
376
|
-
const flowToDuplicate = flowsGroupToEdit.flows.find(f => f._id === flowId);
|
|
377
|
-
if (!flowToDuplicate) {
|
|
378
|
-
throw new Error(`Flow ${flowId} not found`);
|
|
379
|
-
}
|
|
380
|
-
const duplicatedFlow = cloneDeep(flowToDuplicate);
|
|
381
|
-
delete duplicatedFlow.id;
|
|
382
|
-
duplicatedFlow._id = uniqueId('flow_');
|
|
383
|
-
duplicatedFlow.name = `${duplicatedFlow.name} - Copy`;
|
|
384
|
-
duplicatedFlow._hasChanged = true;
|
|
385
|
-
const index = flowsGroupToEdit.flows.indexOf(flowToDuplicate);
|
|
386
|
-
flowsGroupToEdit.flows.splice(index + 1, 0, duplicatedFlow);
|
|
387
|
-
this.flowsGroupsChange.emit(this.flowsGroups);
|
|
388
|
-
this.selectedFlowIdChange.emit(duplicatedFlow._id);
|
|
389
|
-
}
|
|
390
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.4", ngImport: i0, type: GioPolicyStudioFlowsMenuComponent, deps: [{ token: i1.MatDialog }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
391
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.4", type: GioPolicyStudioFlowsMenuComponent, isStandalone: true, selector: "gio-ps-flows-menu", inputs: { readOnly: "readOnly", loading: "loading", apiType: "apiType", flowExecution: "flowExecution", flowsGroups: "flowsGroups", selectedFlowId: "selectedFlowId", entrypoints: "entrypoints", entrypointsInfo: "entrypointsInfo" }, outputs: { selectedFlowIdChange: "selectedFlowIdChange", flowsGroupsChange: "flowsGroupsChange", flowExecutionChange: "flowExecutionChange", deleteFlow: "deleteFlow" }, usesOnChanges: true, ngImport: i0, template: "<!--\n\n Copyright (C) 2023 The Gravitee team (http://gravitee.io)\n \n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n \n http://www.apache.org/licenses/LICENSE-2.0\n \n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n-->\n\n<div class=\"header\">\n <div class=\"header__label\">\n Flows <mat-icon svgIcon=\"gio:info\" matTooltip=\"Flows allow you to apply different policies on your API event phases\"></mat-icon>\n </div>\n @if (apiType !== 'NATIVE') {\n <div class=\"header__configBtn\">\n <button class=\"header__configBtn_edit\" mat-stroked-button [disabled]=\"loading\" (click)=\"onConfigureExecution(flowExecution)\">\n <mat-icon [svgIcon]=\"readOnly ? 'gio:eye-empty' : 'gio:settings'\"></mat-icon>\n </button>\n </div>\n }\n</div>\n<div class=\"searchBar\" *ngIf=\"!loading\">\n <mat-form-field class=\"searchBar__input\">\n <mat-icon matPrefix>search</mat-icon>\n <input matInput placeholder=\"Search by name, path, or group...\" [formControl]=\"searchControl\" />\n <button *ngIf=\"searchControl.value\" matSuffix mat-icon-button aria-label=\"Clear\" (click)=\"resetSearchTerm()\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n</div>\n\n<div class=\"list\" *ngIf=\"!loading; else loadingList\" cdkDropListGroup>\n <div\n *ngFor=\"let flowsGroup of filteredFlowGroupMenuItems\"\n class=\"list__flowsGroup\"\n cdkDropList\n [cdkDropListData]=\"flowsGroup\"\n [cdkDropListEnterPredicate]=\"enterPredicate\"\n (cdkDropListDropped)=\"onDropFlow($event)\"\n >\n <div class=\"list__flowsGroup__header\">\n <div class=\"list__flowsGroup__header__label\">\n <span>{{ (flowsGroup._isPlan ? 'Plan: ' : '') + flowsGroup.name }}</span>\n </div>\n <div class=\"list__flowsGroup__header__addBtn\">\n @if (apiType === 'NATIVE') {\n <span [matTooltipDisabled]=\"flowsGroup.flows.length < 1\" matTooltip=\"Only one flow is allowed for a native API\">\n <button mat-button [disabled]=\"readOnly || flowsGroup.flows.length > 0\" (click)=\"onAddFlow(flowsGroup)\">\n <mat-icon svgIcon=\"gio:plus\" matTooltip=\"New flow\"></mat-icon>\n </button>\n </span>\n } @else {\n <button mat-button [disabled]=\"readOnly\" (click)=\"onAddFlow(flowsGroup)\">\n <mat-icon svgIcon=\"gio:plus\" matTooltip=\"New flow\"></mat-icon>\n </button>\n }\n </div>\n </div>\n\n <div class=\"list__flowsGroup__flows\">\n <ng-container *ngIf=\"flowsGroup.flows.length > 0; else noFlows\">\n @for (flow of flowsGroup.flows; track flow._id) {\n <div\n class=\"list__flowsGroup__flows__flow\"\n [class.selected]=\"flow.selected\"\n [class.disabled]=\"!flow.enabled\"\n (click)=\"selectFlow(flowsGroup._id, flow._id)\"\n (mouseout)=\"flow.mouseOver = false\"\n (mouseover)=\"flow.mouseOver = true\"\n cdkDrag\n >\n <div class=\"list__flowsGroup__flows__flow__left\">\n <div *ngIf=\"flow.name\" class=\"list__flowsGroup__flows__flow__left__name\" [attr.title]=\"flow.name\">\n {{ flow.name }}\n </div>\n @if (apiType !== 'NATIVE') {\n <div class=\"list__flowsGroup__flows__flow__left__infos\">\n <div class=\"list__flowsGroup__flows__flow__left__infos__badges\">\n <span\n *ngFor=\"let badge of flow.badges\"\n class=\"list__flowsGroup__flows__flow__left__infos__badges__badge\"\n [ngClass]=\"badge.class\"\n >{{ badge.label }}</span\n >\n </div>\n <div class=\"list__flowsGroup__flows__flow__left__infos__pathOrChannelLabel\">\n <span *ngIf=\"flow.pathOrChannelLabel; else emptyPathOrChannelLabel\" [attr.title]=\"flow.pathOrChannelLabel\">{{\n flow.pathOrChannelLabel\n }}</span>\n <ng-template #emptyPathOrChannelLabel>\n <em>Empty</em>\n </ng-template>\n </div>\n\n <span\n *ngIf=\"flow.hasCondition\"\n class=\"list__flowsGroup__flows__flow__left__infos__conditionBadge gio-badge-neutral\"\n matTooltip=\"Conditioned\"\n ><mat-icon svgIcon=\"gio:if\"></mat-icon\n ></span>\n </div>\n }\n </div>\n <div class=\"list__flowsGroup__flows__flow__right\">\n <button\n class=\"list__flowsGroup__flows__flow__right__name__menu\"\n mat-button\n [disabled]=\"readOnly\"\n [matMenuTriggerFor]=\"flowMenu\"\n (click)=\"$event.stopPropagation()\"\n >\n <mat-icon svgIcon=\"gio:more-vertical\"></mat-icon>\n </button>\n <mat-menu #flowMenu=\"matMenu\">\n <button [disabled]=\"readOnly\" mat-menu-item (click)=\"onDisableFlow(flow._id)\">\n <mat-icon [svgIcon]=\"flow.enabled ? 'gio:prohibition' : 'gio:check-circled-outline'\"></mat-icon>\n <span>{{ flow.enabled ? 'Disable' : 'Enable' }}</span>\n </button>\n <button mat-menu-item (click)=\"onEditFlow(flow._id)\"><mat-icon svgIcon=\"gio:edit-pencil\"></mat-icon> Edit</button>\n <button mat-menu-item (click)=\"onDeleteFlow(flow._id)\"><mat-icon svgIcon=\"gio:trash\"></mat-icon> Delete</button>\n @if (apiType !== 'NATIVE') {\n <button mat-menu-item (click)=\"onDuplicateFlow(flowsGroup._id, flow._id)\">\n <mat-icon svgIcon=\"gio:copy\"></mat-icon> Duplicate\n </button>\n }\n </mat-menu>\n </div>\n </div>\n }\n </ng-container>\n <ng-template #noFlows>\n <div class=\"list__flowsGroup__no-flows\">No flows yet</div>\n </ng-template>\n </div>\n </div>\n</div>\n\n<ng-template #loadingList>\n <div class=\"loadingList\">\n <gio-loader></gio-loader>\n </div>\n</ng-template>\n", styles: ["@charset \"UTF-8\";.gio-top-bar-menu .gio-badge-accent{background-color:var(--gio-oem-palette--active, #ffc2ac);color:var(--gio-oem-palette--active-contrast, #1e1b1b)}:host{display:flex;height:100%;max-height:100%;flex-direction:column;padding-top:16px}.header{display:flex;align-items:center;padding:0 16px;margin-bottom:14px}.header__label{font-family:Kanit,Helvetica Neue,sans-serif;font-size:16px;font-weight:500;letter-spacing:.4px;line-height:24px;display:flex;flex:1 1 auto;align-items:center;margin-bottom:0;gap:8px}.header__configBtn{margin-left:8px}.searchBar{display:flex;padding:0 16px}.searchBar__input{flex:1 1 auto}.list{padding:0 16px;overflow-y:overlay}.list__flowsGroup{display:flex;flex-direction:column;padding-bottom:8px;gap:8px}.list__flowsGroup__header{display:flex;align-items:center;padding:8px 0 0;border-radius:8px}.list__flowsGroup__header__label{font-size:14px;font-weight:700;line-height:20px;font-family:Manrope,sans-serif;letter-spacing:.4px;display:flex;overflow:hidden;flex:1 1 auto;align-items:center;gap:8px}.list__flowsGroup__header__label>mat-icon{width:22px;height:22px;flex:0 0 auto}.list__flowsGroup__header__label>span{display:-webkit-box;overflow:hidden;flex:1 1 auto;-webkit-box-orient:vertical;-webkit-line-clamp:2}.list__flowsGroup__header__addBtn{margin-left:8px}.list__flowsGroup__flows{display:flex;flex-direction:column;gap:8px}.list__flowsGroup__flows__flow{display:flex;overflow:hidden;height:68px;flex-direction:row;align-items:center;justify-content:space-between;padding:7px;border:1px solid #b2aaa9;border-radius:8px;background-color:#fff}.list__flowsGroup__flows__flow.disabled{border:1px solid rgba(178,170,169,0);background-color:#f7f7f8cc;text-decoration:line-through}.list__flowsGroup__flows__flow:hover,.list__flowsGroup__flows__flow.selected{padding:6px;border:2px solid #ffa685;cursor:pointer}.list__flowsGroup__flows__flow__left{display:flex;overflow:hidden;flex:1 1 auto;flex-direction:column;gap:8px}.list__flowsGroup__flows__flow__left__name{overflow:hidden;padding-left:4px;text-overflow:ellipsis;white-space:nowrap}.list__flowsGroup__flows__flow__left__infos{display:flex;align-items:center}.list__flowsGroup__flows__flow__left__infos__badges{flex:0 0 auto}.list__flowsGroup__flows__flow__left__infos__badges__badge{width:auto}.list__flowsGroup__flows__flow__left__infos__pathOrChannelLabel{overflow:hidden;flex:1 1 auto;direction:rtl;text-align:left;text-overflow:ellipsis;white-space:nowrap}.list__flowsGroup__flows__flow__left__infos__pathOrChannelLabel span{direction:ltr;unicode-bidi:bidi-override}.list__flowsGroup__flows__flow__left__infos__conditionBadge{flex:0 0 auto}.list__flowsGroup__no-flows{font-style:italic}.list__flowsGroup.cdk-drop-list-dragging{pointer-events:none}.list__flowsGroup .cdk-drag-preview{box-sizing:border-box;border-radius:4px;box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}.list__flowsGroup .cdk-drag-placeholder *{opacity:0}.list__flowsGroup .cdk-drag-animating{transition:transform .25s cubic-bezier(0,0,.2,1)}.list__flowsGroup.cdk-drop-list-dragging .list__flowsGroup__flows__flow:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}.loadingList{display:flex;height:100%;flex-direction:column;align-items:center;justify-content:center}\n"], dependencies: [{ kind: "ngmodule", type: GioIconsModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i3.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i4.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i4.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: GioLoaderModule }, { kind: "component", type: i6.GioLoaderComponent, selector: "gio-loader" }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i7.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i7.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i7.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: DragDropModule }, { kind: "directive", type: i8.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i8.CdkDropListGroup, selector: "[cdkDropListGroup]", inputs: ["cdkDropListGroupDisabled"], exportAs: ["cdkDropListGroup"] }, { kind: "directive", type: i8.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i9.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "component", type: i10.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i10.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i10.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i11.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: i11.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i11.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: MatFormFieldModule }] }); }
|
|
392
|
-
}
|
|
393
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.4", ngImport: i0, type: GioPolicyStudioFlowsMenuComponent, decorators: [{
|
|
394
|
-
type: Component,
|
|
395
|
-
args: [{ imports: [
|
|
396
|
-
GioIconsModule,
|
|
397
|
-
MatTooltipModule,
|
|
398
|
-
MatButtonModule,
|
|
399
|
-
CommonModule,
|
|
400
|
-
GioLoaderModule,
|
|
401
|
-
MatMenuModule,
|
|
402
|
-
DragDropModule,
|
|
403
|
-
MatInputModule,
|
|
404
|
-
ReactiveFormsModule,
|
|
405
|
-
MatFormFieldModule,
|
|
406
|
-
], selector: 'gio-ps-flows-menu', template: "<!--\n\n Copyright (C) 2023 The Gravitee team (http://gravitee.io)\n \n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n \n http://www.apache.org/licenses/LICENSE-2.0\n \n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n-->\n\n<div class=\"header\">\n <div class=\"header__label\">\n Flows <mat-icon svgIcon=\"gio:info\" matTooltip=\"Flows allow you to apply different policies on your API event phases\"></mat-icon>\n </div>\n @if (apiType !== 'NATIVE') {\n <div class=\"header__configBtn\">\n <button class=\"header__configBtn_edit\" mat-stroked-button [disabled]=\"loading\" (click)=\"onConfigureExecution(flowExecution)\">\n <mat-icon [svgIcon]=\"readOnly ? 'gio:eye-empty' : 'gio:settings'\"></mat-icon>\n </button>\n </div>\n }\n</div>\n<div class=\"searchBar\" *ngIf=\"!loading\">\n <mat-form-field class=\"searchBar__input\">\n <mat-icon matPrefix>search</mat-icon>\n <input matInput placeholder=\"Search by name, path, or group...\" [formControl]=\"searchControl\" />\n <button *ngIf=\"searchControl.value\" matSuffix mat-icon-button aria-label=\"Clear\" (click)=\"resetSearchTerm()\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n</div>\n\n<div class=\"list\" *ngIf=\"!loading; else loadingList\" cdkDropListGroup>\n <div\n *ngFor=\"let flowsGroup of filteredFlowGroupMenuItems\"\n class=\"list__flowsGroup\"\n cdkDropList\n [cdkDropListData]=\"flowsGroup\"\n [cdkDropListEnterPredicate]=\"enterPredicate\"\n (cdkDropListDropped)=\"onDropFlow($event)\"\n >\n <div class=\"list__flowsGroup__header\">\n <div class=\"list__flowsGroup__header__label\">\n <span>{{ (flowsGroup._isPlan ? 'Plan: ' : '') + flowsGroup.name }}</span>\n </div>\n <div class=\"list__flowsGroup__header__addBtn\">\n @if (apiType === 'NATIVE') {\n <span [matTooltipDisabled]=\"flowsGroup.flows.length < 1\" matTooltip=\"Only one flow is allowed for a native API\">\n <button mat-button [disabled]=\"readOnly || flowsGroup.flows.length > 0\" (click)=\"onAddFlow(flowsGroup)\">\n <mat-icon svgIcon=\"gio:plus\" matTooltip=\"New flow\"></mat-icon>\n </button>\n </span>\n } @else {\n <button mat-button [disabled]=\"readOnly\" (click)=\"onAddFlow(flowsGroup)\">\n <mat-icon svgIcon=\"gio:plus\" matTooltip=\"New flow\"></mat-icon>\n </button>\n }\n </div>\n </div>\n\n <div class=\"list__flowsGroup__flows\">\n <ng-container *ngIf=\"flowsGroup.flows.length > 0; else noFlows\">\n @for (flow of flowsGroup.flows; track flow._id) {\n <div\n class=\"list__flowsGroup__flows__flow\"\n [class.selected]=\"flow.selected\"\n [class.disabled]=\"!flow.enabled\"\n (click)=\"selectFlow(flowsGroup._id, flow._id)\"\n (mouseout)=\"flow.mouseOver = false\"\n (mouseover)=\"flow.mouseOver = true\"\n cdkDrag\n >\n <div class=\"list__flowsGroup__flows__flow__left\">\n <div *ngIf=\"flow.name\" class=\"list__flowsGroup__flows__flow__left__name\" [attr.title]=\"flow.name\">\n {{ flow.name }}\n </div>\n @if (apiType !== 'NATIVE') {\n <div class=\"list__flowsGroup__flows__flow__left__infos\">\n <div class=\"list__flowsGroup__flows__flow__left__infos__badges\">\n <span\n *ngFor=\"let badge of flow.badges\"\n class=\"list__flowsGroup__flows__flow__left__infos__badges__badge\"\n [ngClass]=\"badge.class\"\n >{{ badge.label }}</span\n >\n </div>\n <div class=\"list__flowsGroup__flows__flow__left__infos__pathOrChannelLabel\">\n <span *ngIf=\"flow.pathOrChannelLabel; else emptyPathOrChannelLabel\" [attr.title]=\"flow.pathOrChannelLabel\">{{\n flow.pathOrChannelLabel\n }}</span>\n <ng-template #emptyPathOrChannelLabel>\n <em>Empty</em>\n </ng-template>\n </div>\n\n <span\n *ngIf=\"flow.hasCondition\"\n class=\"list__flowsGroup__flows__flow__left__infos__conditionBadge gio-badge-neutral\"\n matTooltip=\"Conditioned\"\n ><mat-icon svgIcon=\"gio:if\"></mat-icon\n ></span>\n </div>\n }\n </div>\n <div class=\"list__flowsGroup__flows__flow__right\">\n <button\n class=\"list__flowsGroup__flows__flow__right__name__menu\"\n mat-button\n [disabled]=\"readOnly\"\n [matMenuTriggerFor]=\"flowMenu\"\n (click)=\"$event.stopPropagation()\"\n >\n <mat-icon svgIcon=\"gio:more-vertical\"></mat-icon>\n </button>\n <mat-menu #flowMenu=\"matMenu\">\n <button [disabled]=\"readOnly\" mat-menu-item (click)=\"onDisableFlow(flow._id)\">\n <mat-icon [svgIcon]=\"flow.enabled ? 'gio:prohibition' : 'gio:check-circled-outline'\"></mat-icon>\n <span>{{ flow.enabled ? 'Disable' : 'Enable' }}</span>\n </button>\n <button mat-menu-item (click)=\"onEditFlow(flow._id)\"><mat-icon svgIcon=\"gio:edit-pencil\"></mat-icon> Edit</button>\n <button mat-menu-item (click)=\"onDeleteFlow(flow._id)\"><mat-icon svgIcon=\"gio:trash\"></mat-icon> Delete</button>\n @if (apiType !== 'NATIVE') {\n <button mat-menu-item (click)=\"onDuplicateFlow(flowsGroup._id, flow._id)\">\n <mat-icon svgIcon=\"gio:copy\"></mat-icon> Duplicate\n </button>\n }\n </mat-menu>\n </div>\n </div>\n }\n </ng-container>\n <ng-template #noFlows>\n <div class=\"list__flowsGroup__no-flows\">No flows yet</div>\n </ng-template>\n </div>\n </div>\n</div>\n\n<ng-template #loadingList>\n <div class=\"loadingList\">\n <gio-loader></gio-loader>\n </div>\n</ng-template>\n", styles: ["@charset \"UTF-8\";.gio-top-bar-menu .gio-badge-accent{background-color:var(--gio-oem-palette--active, #ffc2ac);color:var(--gio-oem-palette--active-contrast, #1e1b1b)}:host{display:flex;height:100%;max-height:100%;flex-direction:column;padding-top:16px}.header{display:flex;align-items:center;padding:0 16px;margin-bottom:14px}.header__label{font-family:Kanit,Helvetica Neue,sans-serif;font-size:16px;font-weight:500;letter-spacing:.4px;line-height:24px;display:flex;flex:1 1 auto;align-items:center;margin-bottom:0;gap:8px}.header__configBtn{margin-left:8px}.searchBar{display:flex;padding:0 16px}.searchBar__input{flex:1 1 auto}.list{padding:0 16px;overflow-y:overlay}.list__flowsGroup{display:flex;flex-direction:column;padding-bottom:8px;gap:8px}.list__flowsGroup__header{display:flex;align-items:center;padding:8px 0 0;border-radius:8px}.list__flowsGroup__header__label{font-size:14px;font-weight:700;line-height:20px;font-family:Manrope,sans-serif;letter-spacing:.4px;display:flex;overflow:hidden;flex:1 1 auto;align-items:center;gap:8px}.list__flowsGroup__header__label>mat-icon{width:22px;height:22px;flex:0 0 auto}.list__flowsGroup__header__label>span{display:-webkit-box;overflow:hidden;flex:1 1 auto;-webkit-box-orient:vertical;-webkit-line-clamp:2}.list__flowsGroup__header__addBtn{margin-left:8px}.list__flowsGroup__flows{display:flex;flex-direction:column;gap:8px}.list__flowsGroup__flows__flow{display:flex;overflow:hidden;height:68px;flex-direction:row;align-items:center;justify-content:space-between;padding:7px;border:1px solid #b2aaa9;border-radius:8px;background-color:#fff}.list__flowsGroup__flows__flow.disabled{border:1px solid rgba(178,170,169,0);background-color:#f7f7f8cc;text-decoration:line-through}.list__flowsGroup__flows__flow:hover,.list__flowsGroup__flows__flow.selected{padding:6px;border:2px solid #ffa685;cursor:pointer}.list__flowsGroup__flows__flow__left{display:flex;overflow:hidden;flex:1 1 auto;flex-direction:column;gap:8px}.list__flowsGroup__flows__flow__left__name{overflow:hidden;padding-left:4px;text-overflow:ellipsis;white-space:nowrap}.list__flowsGroup__flows__flow__left__infos{display:flex;align-items:center}.list__flowsGroup__flows__flow__left__infos__badges{flex:0 0 auto}.list__flowsGroup__flows__flow__left__infos__badges__badge{width:auto}.list__flowsGroup__flows__flow__left__infos__pathOrChannelLabel{overflow:hidden;flex:1 1 auto;direction:rtl;text-align:left;text-overflow:ellipsis;white-space:nowrap}.list__flowsGroup__flows__flow__left__infos__pathOrChannelLabel span{direction:ltr;unicode-bidi:bidi-override}.list__flowsGroup__flows__flow__left__infos__conditionBadge{flex:0 0 auto}.list__flowsGroup__no-flows{font-style:italic}.list__flowsGroup.cdk-drop-list-dragging{pointer-events:none}.list__flowsGroup .cdk-drag-preview{box-sizing:border-box;border-radius:4px;box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}.list__flowsGroup .cdk-drag-placeholder *{opacity:0}.list__flowsGroup .cdk-drag-animating{transition:transform .25s cubic-bezier(0,0,.2,1)}.list__flowsGroup.cdk-drop-list-dragging .list__flowsGroup__flows__flow:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}.loadingList{display:flex;height:100%;flex-direction:column;align-items:center;justify-content:center}\n"] }]
|
|
407
|
-
}], ctorParameters: () => [{ type: i1.MatDialog }], propDecorators: { readOnly: [{
|
|
408
|
-
type: Input
|
|
409
|
-
}], loading: [{
|
|
410
|
-
type: Input
|
|
411
|
-
}], apiType: [{
|
|
412
|
-
type: Input
|
|
413
|
-
}], flowExecution: [{
|
|
414
|
-
type: Input
|
|
415
|
-
}], flowsGroups: [{
|
|
416
|
-
type: Input
|
|
417
|
-
}], selectedFlowId: [{
|
|
418
|
-
type: Input
|
|
419
|
-
}], entrypoints: [{
|
|
420
|
-
type: Input
|
|
421
|
-
}], entrypointsInfo: [{
|
|
422
|
-
type: Input
|
|
423
|
-
}], selectedFlowIdChange: [{
|
|
424
|
-
type: Output
|
|
425
|
-
}], flowsGroupsChange: [{
|
|
426
|
-
type: Output
|
|
427
|
-
}], flowExecutionChange: [{
|
|
428
|
-
type: Output
|
|
429
|
-
}], deleteFlow: [{
|
|
430
|
-
type: Output
|
|
431
|
-
}] } });
|
|
432
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2lvLXBzLWZsb3dzLW1lbnUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdWktcG9saWN5LXN0dWRpby1hbmd1bGFyL3NyYy9saWIvY29tcG9uZW50cy9mbG93cy1tZW51L2dpby1wcy1mbG93cy1tZW51LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3VpLXBvbGljeS1zdHVkaW8tYW5ndWxhci9zcmMvbGliL2NvbXBvbmVudHMvZmxvd3MtbWVudS9naW8tcHMtZmxvd3MtbWVudS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILE9BQU8sRUFBcUMsY0FBYyxFQUFFLGVBQWUsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQy9ILE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQXdCLE1BQU0sRUFBaUIsTUFBTSxlQUFlLENBQUM7QUFDNUcsT0FBTyxFQUFFLFdBQVcsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUUzRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzdELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxjQUFjLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDbkcsT0FBTyxFQUFFLFNBQVMs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LFdBQVc7c0JBRGpCLEtBQUs7Z0JBSUMsZUFBZTtzQkFEckIsS0FBSztnQkFJQyxvQkFBb0I7c0JBRDFCLE1BQU07Z0JBSUEsaUJBQWlCO3NCQUR2QixNQUFNO2dCQUlBLG1CQUFtQjtzQkFEekIsTUFBTTtnQkFJQSxVQUFVO3NCQURoQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoQykgMjAyMiBUaGUgR3Jhdml0ZWUgdGVhbSAoaHR0cDovL2dyYXZpdGVlLmlvKVxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCB7IENka0RyYWcsIENka0RyYWdEcm9wLCBDZGtEcm9wTGlzdCwgRHJhZ0Ryb3BNb2R1bGUsIG1vdmVJdGVtSW5BcnJheSwgdHJhbnNmZXJBcnJheUl0ZW0gfSBmcm9tICdAYW5ndWxhci9jZGsvZHJhZy1kcm9wJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBPdXRwdXQsIFNpbXBsZUNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1Db250cm9sLCBSZWFjdGl2ZUZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcbmltcG9ydCB7IE1hdERpYWxvZyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQgeyBNYXRGb3JtRmllbGRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkJztcbmltcG9ydCB7IE1hdElucHV0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaW5wdXQnO1xuaW1wb3J0IHsgTWF0TWVudU1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL21lbnUnO1xuaW1wb3J0IHsgTWF0VG9vbHRpcE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Rvb2x0aXAnO1xuaW1wb3J0IHsgR0lPX0RJQUxPR19XSURUSCwgR2lvSWNvbnNNb2R1bGUsIEdpb0xvYWRlck1vZHVsZSB9IGZyb20gJ0BncmF2aXRlZS91aS1wYXJ0aWNsZXMtYW5ndWxhcic7XG5pbXBvcnQgeyBjbG9uZURlZXAsIGZsYXR0ZW4sIGlzRW1wdHksIHVuaXF1ZUlkIH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQsIHN0YXJ0V2l0aCwgdGFrZVVudGlsLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IEFwaVR5cGUsIENoYW5uZWxTZWxlY3RvciwgQ29uZGl0aW9uU2VsZWN0b3IsIENvbm5lY3RvckluZm8sIEZsb3dFeGVjdXRpb24sIEh0dHBTZWxlY3RvciwgT3BlcmF0aW9uIH0gZnJvbSAnLi4vLi4vbW9kZWxzJztcbmltcG9ydCB7IFNlbGVjdG9yIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2Zsb3cvU2VsZWN0b3InO1xuaW1wb3J0IHsgRmxvd0dyb3VwVk0sIEZsb3dWTSB9IGZyb20gJy4uLy4uL3BvbGljeS1zdHVkaW8vZ2lvLXBvbGljeS1zdHVkaW8ubW9kZWwnO1xuaW1wb3J0IHtcbiAgR2lvUG9saWN5U3R1ZGlvRmxvd0V4ZWN1dGlvbkZvcm1EaWFsb2dDb21wb25lbnQsXG4gIEdpb1BvbGljeVN0dWRpb0Zsb3dFeGVjdXRpb25Gb3JtRGlhbG9nRGF0YSxcbn0gZnJvbSAnLi4vZmxvdy1leGVjdXRpb24tZm9ybS1kaWFsb2cvZ2lvLXBzLWZsb3ctZXhlY3V0aW9uLWZvcm0tZGlhbG9nLmNvbXBvbmVudCc7XG5pbXBvcnQge1xuICBHaW9Qb2xpY3lTdHVkaW9GbG93TWVzc2FnZUZvcm1EaWFsb2dDb21wb25lbnQsXG4gIEdpb1BvbGljeVN0dWRpb0Zsb3dNZXNzYWdlRm9ybURpYWxvZ0RhdGEsXG59IGZyb20gJy4uL2Zsb3ctZm9ybS1kaWFsb2cvZmxvdy1tZXNzYWdlLWZvcm0tZGlhbG9nL2dpby1wcy1mbG93LW1lc3NhZ2UtZm9ybS1kaWFsb2cuY29tcG9uZW50JztcbmltcG9ydCB7XG4gIEdpb1BvbGljeVN0dWRpb0Zsb3dOYXRpdmVGb3JtRGlhbG9nQ29tcG9uZW50LFxuICBHaW9Qb2xpY3lTdHVkaW9GbG93TmF0aXZlRm9ybURpYWxvZ0RhdGEsXG59IGZyb20gJy4uL2Zsb3ctZm9ybS1kaWFsb2cvZmxvdy1uYXRpdmUtZm9ybS1kaWFsb2cvZ2lvLXBzLWZsb3ctbmF0aXZlLWZvcm0tZGlhbG9nLmNvbXBvbmVudCc7XG5pbXBvcnQge1xuICBHaW9Qb2xpY3lTdHVkaW9GbG93UHJveHlGb3JtRGlhbG9nQ29tcG9uZW50LFxuICBHaW9Qb2xpY3lTdHVkaW9GbG93UHJveHlGb3JtRGlhbG9nRGF0YSxcbn0gZnJvbSAnLi4vZmxvdy1mb3JtLWRpYWxvZy9mbG93LXByb3h5LWZvcm0tZGlhbG9nL2dpby1wcy1mbG93LXByb3h5LWZvcm0tZGlhbG9nLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBHaW9Qb2xpY3lTdHVkaW9GbG93Rm9ybURpYWxvZ1Jlc3VsdCB9IGZyb20gJy4uL2Zsb3ctZm9ybS1kaWFsb2cvZ2lvLXBzLWZsb3ctZm9ybS1kaWFsb2ctcmVzdWx0Lm1vZGVsJztcblxuaW50ZXJmYWNlIEZsb3dHcm91cE1lbnVWTSBleHRlbmRzIEZsb3dHcm91cFZNIHtcbiAgZmxvd3M6IEZsb3dNZW51Vk1bXTtcbn1cblxuaW50ZXJmYWNlIEZsb3dNZW51Vk0gZXh0ZW5kcyBGbG93Vk0ge1xuICBzZWxlY3RlZDogYm9vbGVhbjtcbiAgbW91c2VPdmVyOiBib29sZWFuO1xuICBiYWRnZXM6IHtcbiAgICBsYWJlbDogc3RyaW5nO1xuICAgIGNsYXNzOiBzdHJpbmc7XG4gIH1bXTtcbiAgcGF0aE9yQ2hhbm5lbExhYmVsOiBzdHJpbmc7XG4gIGhhc0NvbmRpdGlvbjogYm9vbGVhbjtcbn1cblxuQENvbXBvbmVudCh7XG4gIGltcG9ydHM6IFtcbiAgICBHaW9JY29uc01vZHVsZSxcbiAgICBNYXRUb29sdGlwTW9kdWxlLFxuICAgIE1hdEJ1dHRvbk1vZHVsZSxcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgR2lvTG9hZGVyTW9kdWxlLFxuICAgIE1hdE1lbnVNb2R1bGUsXG4gICAgRHJhZ0Ryb3BNb2R1bGUsXG4gICAgTWF0SW5wdXRNb2R1bGUsXG4gICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcbiAgICBNYXRGb3JtRmllbGRNb2R1bGUsXG4gIF0sXG4gIHNlbGVjdG9yOiAnZ2lvLXBzLWZsb3dzLW1lbnUnLFxuICB0ZW1wbGF0ZVVybDogJy4vZ2lvLXBzLWZsb3dzLW1lbnUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9naW8tcHMtZmxvd3MtbWVudS5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBHaW9Qb2xpY3lTdHVkaW9GbG93c01lbnVDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyByZWFkT25seSA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBsb2FkaW5nID0gZmFsc2U7XG5cbiAgQElucHV0KClcbiAgcHVibGljIGFwaVR5cGUhOiBBcGlUeXBlO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBmbG93RXhlY3V0aW9uITogRmxvd0V4ZWN1dGlvbjtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgZmxvd3NHcm91cHM6IEZsb3dHcm91cFZNW10gPSBbXTtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgc2VsZWN0ZWRGbG93SWQ/OiBzdHJpbmcgPSB1bmRlZmluZWQ7XG5cbiAgQElucHV0KClcbiAgcHVibGljIGVudHJ5cG9pbnRzOiBDb25uZWN0b3JJbmZvW10gPSBbXTtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgZW50cnlwb2ludHNJbmZvOiBDb25uZWN0b3JJbmZvW10gPSBbXTtcblxuICBAT3V0cHV0KClcbiAgcHVibGljIHNlbGVjdGVkRmxvd0lkQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBmbG93c0dyb3Vwc0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Rmxvd0dyb3VwVk1bXT4oKTtcblxuICBAT3V0cHV0KClcbiAgcHVibGljIGZsb3dFeGVjdXRpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPEZsb3dFeGVjdXRpb24+KCk7XG5cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBkZWxldGVGbG93ID0gbmV3IEV2ZW50RW1pdHRlcjxGbG93Vk0+KCk7XG5cbiAgcHVibGljIGZsb3dHcm91cE1lbnVJdGVtczogRmxvd0dyb3VwTWVudVZNW10gPSBbXTtcblxuICBwdWJsaWMgc2VhcmNoQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbDxzdHJpbmc+KCcnKTtcblxuICBwdWJsaWMgZmlsdGVyZWRGbG93R3JvdXBNZW51SXRlbXM6IEZsb3dHcm91cE1lbnVWTVtdID0gW107XG5cbiAgcHJpdmF0ZSB1bnN1YnNjcmliZSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIHB1YmxpYyBlbnRlclByZWRpY2F0ZTogKGRyYWc6IENka0RyYWc8Rmxvd0dyb3VwTWVudVZNPiwgZHJvcDogQ2RrRHJvcExpc3Q8Rmxvd0dyb3VwTWVudVZNPikgPT4gYm9vbGVhbiA9ICgpID0+IHRydWU7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBtYXREaWFsb2c6IE1hdERpYWxvZykge1xuICAgIHRoaXMuc2VhcmNoQ29udHJvbC52YWx1ZUNoYW5nZXNcbiAgICAgIC5waXBlKFxuICAgICAgICBkZWJvdW5jZVRpbWUoMzAwKSxcbiAgICAgICAgc3RhcnRXaXRoKCcnKSxcbiAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgICAgdGFwKHNlYXJjaFRlcm0gPT4ge1xuICAgICAgICAgIHRoaXMuYXBwbHlGaWx0ZXIoc2VhcmNoVGVybSB8fCAnJyk7XG4gICAgICAgIH0pLFxuICAgICAgICB0YWtlVW50aWwodGhpcy51bnN1YnNjcmliZSQpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlcy5mbG93c0dyb3VwcyB8fCBjaGFuZ2VzLnNlbGVjdGVkRmxvd0lkKSB7XG4gICAgICB0aGlzLmZsb3dHcm91cE1lbnVJdGVtcyA9IGNsb25lRGVlcCh0aGlzLmZsb3dzR3JvdXBzKS5tYXAoZmxvd0dyb3VwID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5mbG93R3JvdXAsXG4gICAgICAgICAgZmxvd3M6IGZsb3dHcm91cC5mbG93cy5tYXAoZmxvdyA9PiB7XG4gICAgICAgICAgICBjb25zdCBiYWRnZXM6IEZsb3dNZW51Vk1bJ2JhZGdlcyddID0gW107XG4gICAgICAgICAgICBsZXQgcGF0aE9yQ2hhbm5lbExhYmVsID0gJyc7XG4gICAgICAgICAgICBsZXQgaGFzQ29uZGl0aW9uID0gZmFsc2U7XG5cbiAgICAgICAgICAgIC8vIE1FU1NBR0UgQVBJIC0gQ0hBTk5FTFxuICAgICAgICAgICAgY29uc3QgY2hhbm5lbFNlbGVjdG9yID0gZmxvdy5zZWxlY3RvcnM/LmZpbmQocyA9PiBzLnR5cGUgPT09ICdDSEFOTkVMJykgYXMgQ2hhbm5lbFNlbGVjdG9yO1xuICAgICAgICAgICAgaWYgKGNoYW5uZWxTZWxlY3Rvcikge1xuICAgICAgICAgICAgICBjb25zdCBvcGVyYXRpb25Ub0JhZGdlOiBSZWNvcmQ8T3BlcmF0aW9uLCBzdHJpbmc+ID0ge1xuICAgICAgICAgICAgICAgIFBVQkxJU0g6ICdQVUInLFxuICAgICAgICAgICAgICAgIFNVQlNDUklCRTogJ1NVQicsXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIC8vIElmIG5vIG9wZXJhdGlvbnMgYXJlIHNlbGVjdGVkLCBhbGwgb3BlcmF0aW9ucyBhcmUgdmFsaWRcbiAgICAgICAgICAgICAgY29uc3Qgb3BlcmF0aW9uQmFkZ2VzID0gKFxuICAgICAgICAgICAgICAgICFjaGFubmVsU2VsZWN0b3Iub3BlcmF0aW9ucyB8fCBpc0VtcHR5KGNoYW5uZWxTZWxlY3Rvci5vcGVyYXRpb25zKVxuICAgICAgICAgICAgICAgICAgPyAoWydQVUJMSVNIJywgJ1NVQlNDUklCRSddIGFzIGNvbnN0KVxuICAgICAgICAgICAgICAgICAgOiBjaGFubmVsU2VsZWN0b3Iub3BlcmF0aW9uc1xuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLm1hcChvcGVyYXRpb24gPT4gKHtcbiAgICAgICAgICAgICAgICAgIGxhYmVsOiBvcGVyYXRpb25Ub0JhZGdlW29wZXJhdGlvbl0sXG4gICAgICAgICAgICAgICAgICBjbGFzczogJ2dpby1iYWRnZS1uZXV0cmFsJyxcbiAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAuc29ydCgoYSwgYikgPT4gYS5sYWJlbC5sb2NhbGVDb21wYXJlKGIubGFiZWwpKTtcbiAgICAgICAgICAgICAgb3BlcmF0aW9uQmFkZ2VzICYmIGJhZGdlcy5wdXNoKC4uLm9wZXJhdGlvbkJhZGdlcyk7XG4gICAgICAgICAgICAgIHBhdGhPckNoYW5uZWxMYWJlbCA9IGAke2NoYW5uZWxTZWxlY3Rvci5jaGFubmVsfSR7Y2hhbm5lbFNlbGVjdG9yLmNoYW5uZWxPcGVyYXRvciA9PT0gJ1NUQVJUU19XSVRIJyA/ICcqKicgOiAnJ31gO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBIVFRQIEFQSSAtIEhUVFBcbiAgICAgICAgICAgIGNvbnN0IGh0dHBTZWxlY3RvciA9IGZsb3cuc2VsZWN0b3JzPy5maW5kKHMgPT4gcy50eXBlID09PSAnSFRUUCcpIGFzIEh0dHBTZWxlY3RvcjtcbiAgICAgICAgICAgIGlmIChodHRwU2VsZWN0b3IpIHtcbiAgICAgICAgICAgICAgLy8gS2VlcCBvbmx5IDIgZmlyc3QgaHR0cCBtZXRob2RzIGFuZCBhZGQgK1ggYmFkZ2UgaWYgdGhlcmUgYXJlIG1vcmVcbiAgICAgICAgICAgICAgY29uc3QgaHR0cE1ldGhvZHNUb0tlZXAgPSBodHRwU2VsZWN0b3IubWV0aG9kcz8uc2xpY2UoMCwgMik7XG4gICAgICAgICAgICAgIGNvbnN0IGh0dHBNZXRob2RzTGVuZ3RoID0gaHR0cFNlbGVjdG9yLm1ldGhvZHM/Lmxlbmd0aCA/PyAwO1xuICAgICAgICAgICAgICBodHRwTWV0aG9kc1RvS2VlcCAmJlxuICAgICAgICAgICAgICAgIGJhZGdlcy5wdXNoKC4uLmh0dHBNZXRob2RzVG9LZWVwLm1hcChtZXRob2QgPT4gKHsgbGFiZWw6IG1ldGhvZCwgY2xhc3M6IGBnaW8tbWV0aG9kLWJhZGdlLSR7bWV0aG9kLnRvTG93ZXJDYXNlKCl9YCB9KSkpO1xuICAgICAgICAgICAgICBpZiAoaHR0cE1ldGhvZHNMZW5ndGggJiYgaHR0cE1ldGhvZHNMZW5ndGggPiAyKSB7XG4gICAgICAgICAgICAgICAgYmFkZ2VzPy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgIGxhYmVsOiBgKyR7aHR0cE1ldGhvZHNMZW5ndGggLSAyfWAsXG4gICAgICAgICAgICAgICAgICBjbGFzczogJ2dpby1iYWRnZS1uZXV0cmFsJyxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoaHR0cE1ldGhvZHNMZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICBiYWRnZXM/LnB1c2goe1xuICAgICAgICAgICAgICAgICAgbGFiZWw6ICdBTEwnLFxuICAgICAgICAgICAgICAgICAgY2xhc3M6ICdnaW8tYmFkZ2UtbmV1dHJhbCcsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBwYXRoT3JDaGFubmVsTGFiZWwgPSBgJHtodHRwU2VsZWN0b3IucGF0aH0ke2h0dHBTZWxlY3Rvci5wYXRoT3BlcmF0b3IgPT09ICdTVEFSVFNfV0lUSCcgPyAnLyoqJyA6ICcnfWA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGNvbmRpdGlvblNlbGVjdG9yID0gZmxvdy5zZWxlY3RvcnM/LmZpbmQocyA9PiBzLnR5cGUgPT09ICdDT05ESVRJT04nKSBhcyBDb25kaXRpb25TZWxlY3RvcjtcbiAgICAgICAgICAgIGlmIChjb25kaXRpb25TZWxlY3RvciAmJiBjb25kaXRpb25TZWxlY3Rvci5jb25kaXRpb24pIHtcbiAgICAgICAgICAgICAgaGFzQ29uZGl0aW9uID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgLi4uZmxvdyxcbiAgICAgICAgICAgICAgc2VsZWN0ZWQ6IHRoaXMuc2VsZWN0ZWRGbG93SWQgPT09IGZsb3cuX2lkLFxuICAgICAgICAgICAgICBtb3VzZU92ZXI6IGZhbHNlLFxuICAgICAgICAgICAgICBiYWRnZXMsXG4gICAgICAgICAgICAgIHBhdGhPckNoYW5uZWxMYWJlbCxcbiAgICAgICAgICAgICAgaGFzQ29uZGl0aW9uLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLmVudGVyUHJlZGljYXRlID0gKF9kcmFnOiBDZGtEcmFnPEZsb3dHcm91cE1lbnVWTT4sIGRyb3A6IENka0Ryb3BMaXN0PEZsb3dHcm91cE1lbnVWTT4pID0+IHtcbiAgICAgICAgaWYgKHRoaXMuYXBpVHlwZSA9PT0gJ05BVElWRScpIHtcbiAgICAgICAgICByZXR1cm4gaXNFbXB0eShkcm9wLmRhdGEuZmxvd3MpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfTtcbiAgICB9XG4gICAgdGhpcy5hcHBseUZpbHRlcih0aGlzLnNlYXJjaENvbnRyb2wudmFsdWUgfHwgJycpO1xuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMudW5zdWJzY3JpYmUkLm5leHQoKTtcbiAgICB0aGlzLnVuc3Vic2NyaWJlJC5jb21wbGV0ZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseUZpbHRlcihzZWFyY2hUZXJtOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCB0ZXJtID0gc2VhcmNoVGVybS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmICghdGVybSkge1xuICAgICAgdGhpcy5maWx0ZXJlZEZsb3dHcm91cE1lbnVJdGVtcyA9IFsuLi50aGlzLmZsb3dHcm91cE1lbnVJdGVtc107XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZmlsdGVyZWRGbG93R3JvdXBNZW51SXRlbXMgPSB0aGlzLmZsb3dHcm91cE1lbnVJdGVtc1xuICAgICAgLm1hcChncm91cCA9PiB7XG4gICAgICAgIGNvbnN0IGZpbHRlcmVkRmxvd3MgPSBncm91cD8uZmxvd3M/LmZpbHRlcihmbG93ID0+IHtcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgKGdyb3VwLm5hbWUgJiYgZ3JvdXAubmFtZT8udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh0ZXJtKSkgfHxcbiAgICAgICAgICAgIChmbG93Lm5hbWUgJiYgZmxvdy5uYW1lPy50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRlcm0pKSB8fFxuICAgICAgICAgICAgKGZsb3cucGF0aE9yQ2hhbm5lbExhYmVsICYmIGZsb3cucGF0aE9yQ2hhbm5lbExhYmVsPy50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRlcm0pKSB8fFxuICAgICAgICAgICAgKGZsb3cuc2VsZWN0b3JzICYmIGZsb3cuc2VsZWN0b3JzPy5zb21lKHNlbGVjdG9yID0+IHRoaXMuc2VsZWN0b3JNYXRjaGVzKHNlbGVjdG9yLCB0ZXJtKSkpIHx8XG4gICAgICAgICAgICAoZmxvdy5iYWRnZXMgJiYgZmxvdy5iYWRnZXM/LnNvbWUoYmFkZ2VzID0+IGJhZGdlcy5sYWJlbD8udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh0ZXJtKSkpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB7IC4uLmdyb3VwLCBmbG93czogZmlsdGVyZWRGbG93cyB9O1xuICAgICAgfSlcbiAgICAgIC5maWx0ZXIoZ3JvdXAgPT4gZ3JvdXAuZmxvd3MubGVuZ3RoID4gMCk7XG4gIH1cblxuICBwdWJsaWMgcmVzZXRTZWFyY2hUZXJtKCkge1xuICAgIHRoaXMuc2VhcmNoQ29udHJvbC5zZXRWYWx1ZSgnJyk7XG4gICAgdGhpcy5hcHBseUZpbHRlcignJyk7XG4gIH1cblxuICBwcml2YXRlIHNlbGVjdG9yTWF0Y2hlcyhzZWxlY3RvcjogU2VsZWN0b3IsIHRlcm06IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHR5cGUgPSBzZWxlY3Rvci50eXBlO1xuXG4gICAgaWYgKHR5cGUgPT09ICdIVFRQJykge1xuICAgICAgY29uc3QgaHR0cFNlbGVjdG9yID0gc2VsZWN0b3IgYXMgSHR0cFNlbGVjdG9yO1xuICAgICAgaWYgKGh0dHBTZWxlY3Rvci5wYXRoPy50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRlcm0pKSByZXR1cm4gdHJ1ZTtcbiAgICAgIGlmIChodHRwU2VsZWN0b3IubWV0aG9kcz8uc29tZShtZXRob2QgPT4gbWV0aG9kLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGVybSkpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlID09PSAnQ0hBTk5FTCcpIHtcbiAgICAgIGNvbnN0IGNoYW5uZWxTZWxlY3RvciA9IHNlbGVjdG9yIGFzIENoYW5uZWxTZWxlY3RvcjtcbiAgICAgIGlmIChjaGFubmVsU2VsZWN0b3IuY2hhbm5lbD8udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh0ZXJtKSkgcmV0dXJuIHRydWU7XG4gICAgICBpZiAoY2hhbm5lbFNlbGVjdG9yLm9wZXJhdGlvbnM/LnNvbWUob3AgPT4gb3AudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh0ZXJtKSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyBzZWxlY3RGbG93KGdyb3VwSWQ6IHN0cmluZywgZmxvd0lkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBmbG93ID0gdGhpcy5mbG93c0dyb3Vwcy5maW5kKGZnID0+IGZnLl9pZCA9PT0gZ3JvdXBJZCk/LmZsb3dzLmZpbmQoZiA9PiBmLl9pZCA9PT0gZmxvd0lkKTtcbiAgICBpZiAoZmxvdykge1xuICAgICAgdGhpcy5zZWxlY3RlZEZsb3dJZENoYW5nZS5lbWl0KGZsb3cuX2lkKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb25BZGRGbG93KGZsb3dHcm91cDogRmxvd0dyb3VwVk0pOiB2b2lkIHtcbiAgICBsZXQgZGlhbG9nUmVzdWx0O1xuXG4gICAgc3dpdGNoICh0aGlzLmFwaVR5cGUpIHtcbiAgICAgIGNhc2UgJ01FU1NBR0UnOlxuICAgICAgICBkaWFsb2dSZXN1bHQgPSB0aGlzLm1hdERpYWxvZ1xuICAgICAgICAgIC5vcGVuPFxuICAgICAgICAgICAgR2lvUG9saWN5U3R1ZGlvRmxvd01lc3NhZ2VGb3JtRGlhbG9nQ29tcG9uZW50LFxuICAgICAgICAgICAgR2lvUG9saWN5U3R1ZGlvRmxvd01lc3NhZ2VGb3JtRGlhbG9nRGF0YSxcbiAgICAgICAgICAgIEdpb1BvbGljeVN0dWRpb0Zsb3dGb3JtRGlhbG9nUmVzdWx0XG4gICAgICAgICAgPihHaW9Qb2xpY3lTdHVkaW9GbG93TWVzc2FnZUZvcm1EaWFsb2dDb21wb25lbnQsIHtcbiAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgZmxvdzogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICBlbnRyeXBvaW50czogdGhpcy5lbnRyeXBvaW50cyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByb2xlOiAnYWxlcnRkaWFsb2cnLFxuICAgICAgICAgICAgaWQ6ICdnaW9Qc0Zsb3dGb3JtRGlhbG9nJyxcbiAgICAgICAgICAgIHdpZHRoOiBHSU9fRElBTE9HX1dJRFRILk1FRElVTSxcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5hZnRlckNsb3NlZCgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ1BST1hZJzpcbiAgICAgICAgZGlhbG9nUmVzdWx0ID0gdGhpcy5tYXREaWFsb2dcbiAgICAgICAgICAub3BlbjxHaW9Qb2xpY3lTdHVkaW9GbG93UHJveHlGb3JtRGlhbG9nQ29tcG9uZW50LCBHaW9Qb2xpY3lTdHVkaW9GbG93UHJveHlGb3JtRGlhbG9nRGF0YSwgR2lvUG9saWN5U3R1ZGlvRmxvd0Zvcm1EaWFsb2dSZXN1bHQ+KFxuICAgICAgICAgICAgR2lvUG9saWN5U3R1ZGlvRmxvd1Byb3h5Rm9ybURpYWxvZ0NvbXBvbmVudCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgIGZsb3c6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgcm9sZTogJ2FsZXJ0ZGlhbG9nJyxcbiAgICAgICAgICAgICAgaWQ6ICdnaW9Qc0Zsb3dGb3JtRGlhbG9nJyxcbiAgICAgICAgICAgICAgd2lkdGg6IEdJT19ESUFMT0dfV0lEVEguTUVESVVNLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICApXG4gICAgICAgICAgLmFmdGVyQ2xvc2VkKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnTkFUSVZFJzpcbiAgICAgICAgZGlhbG9nUmVzdWx0ID0gdGhpcy5tYXREaWFsb2dcbiAgICAgICAgICAub3BlbjxHaW9Qb2xpY3lTdHVkaW9GbG93TmF0aXZlRm9ybURpYWxvZ0NvbXBvbmVudCwgR2lvUG9saWN5U3R1ZGlvRmxvd05hdGl2ZUZvcm1EaWFsb2dEYXRhLCBHaW9Qb2xpY3lTdHVkaW9GbG93Rm9ybURpYWxvZ1Jlc3VsdD4oXG4gICAgICAgICAgICBHaW9Qb2xpY3lTdHVkaW9GbG93TmF0aXZlRm9ybURpYWxvZ0NvbXBvbmVudCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgIHBhcmVudEdyb3VwTmFtZTogZmxvd0dyb3VwLm5hbWUsXG4gICAgICAgICAgICAgICAgZmxvdzogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICByb2xlOiAnYWxlcnRkaWFsb2cnLFxuICAgICAgICAgICAgICBpZDogJ2dpb1BzRmxvd0Zvcm1EaWFsb2cnLFxuICAgICAgICAgICAgICB3aWR0aDogR0lPX0RJQUxPR19XSURUSC5NRURJVU0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIClcbiAgICAgICAgICAuYWZ0ZXJDbG9zZWQoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIEFQSSB0eXBlICR7dGhpcy5hcGlUeXBlfWApO1xuICAgIH1cblxuICAgIGRpYWxvZ1Jlc3VsdFxuICAgICAgLnBpcGUoXG4gICAgICAgIHRhcChjcmVhdGVkT3JFZGl0ZWQgPT4ge1xuICAgICAgICAgIGlmICghY3JlYXRlZE9yRWRpdGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGVkaXRlZEZsb3dzR3JvdXBzID0gY2xvbmVEZWVwKHRoaXMuZmxvd3NHcm91cHMpO1xuXG4gICAgICAgICAgY29uc3QgZmxvd3NHcm91cFRvRWRpdCA9IGVkaXRlZEZsb3dzR3JvdXBzLmZpbmQoZmcgPT4gZmcuX2lkID09PSBmbG93R3JvdXAuX2lkKTtcbiAgICAgICAgICBpZiAoIWZsb3dzR3JvdXBUb0VkaXQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmxvdyBncm91cCAke2Zsb3dHcm91cC5faWR9IG5vdCBmb3VuZGApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmbG93c0dyb3VwVG9FZGl0LmZsb3dzLnB1c2goY3JlYXRlZE9yRWRpdGVkKTtcblxuICAgICAgICAgIHRoaXMuZmxvd3NHcm91cHNDaGFuZ2UuZW1pdChlZGl0ZWRGbG93c0dyb3Vwcyk7XG4gICAgICAgICAgdGhpcy5zZWxlY3RlZEZsb3dJZENoYW5nZS5lbWl0KGNyZWF0ZWRPckVkaXRlZC5faWQpO1xuICAgICAgICB9KSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIHB1YmxpYyBvbkNvbmZpZ3VyZUV4ZWN1dGlvbihmbG93RXhlY3V0aW9uOiBGbG93RXhlY3V0aW9uKTogdm9pZCB7XG4gICAgY29uc3QgZGlhbG9nUmVzdWx0ID0gdGhpcy5tYXREaWFsb2dcbiAgICAgIC5vcGVuPEdpb1BvbGljeVN0dWRpb0Zsb3dFeGVjdXRpb25Gb3JtRGlhbG9nQ29tcG9uZW50LCBHaW9Qb2xpY3lTdHVkaW9GbG93RXhlY3V0aW9uRm9ybURpYWxvZ0RhdGEsIEZsb3dFeGVjdXRpb24gfCB1bmRlZmluZWQ+KFxuICAgICAgICBHaW9Qb2xpY3lTdHVkaW9GbG93RXhlY3V0aW9uRm9ybURpYWxvZ0NvbXBvbmVudCxcbiAgICAgICAge1xuICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIGZsb3dFeGVjdXRpb24sXG4gICAgICAgICAgICByZWFkT25seTogdGhpcy5yZWFkT25seSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJvbGU6ICdhbGVydGRpYWxvZycsXG4gICAgICAgICAgaWQ6ICdnaW9Qc0Zsb3dFeGVjdXRpb25Gb3JtRGlhbG9nJyxcbiAgICAgICAgICB3aWR0aDogR0lPX0RJQUxPR19XSURUSC5NRURJVU0sXG4gICAgICAgIH0sXG4gICAgICApXG4gICAgICAuYWZ0ZXJDbG9zZWQoKTtcblxuICAgIGRpYWxvZ1Jlc3VsdFxuICAgICAgLnBpcGUoXG4gICAgICAgIHRhcChlZGl0ZWQgPT4ge1xuICAgICAgICAgIGlmICghZWRpdGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuZmxvd0V4ZWN1dGlvbkNoYW5nZS5lbWl0KGVkaXRlZCk7XG4gICAgICAgIH0pLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgcHVibGljIG9uRGlzYWJsZUZsb3coZmxvd0lkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBmbG93VG9FZGl0ID0gZmxhdHRlbih0aGlzLmZsb3dzR3JvdXBzLm1hcChmbG93R3JvdXAgPT4gZmxvd0dyb3VwLmZsb3dzKSkuZmluZChmID0+IGYuX2lkID09PSBmbG93SWQpO1xuICAgIGlmICghZmxvd1RvRWRpdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGbG93ICR7Zmxvd0lkfSBub3QgZm91bmRgKTtcbiAgICB9XG4gICAgZmxvd1RvRWRpdC5lbmFibGVkID0gIWZsb3dUb0VkaXQuZW5hYmxlZDtcbiAgICBmbG93VG9FZGl0Ll9oYXNDaGFuZ2VkID0gdHJ1ZTtcbiAgICB0aGlzLmZsb3dzR3JvdXBzQ2hhbmdlLmVtaXQodGhpcy5mbG93c0dyb3Vwcyk7XG4gIH1cblxuICBwdWJsaWMgb25Ecm9wRmxvdyhldmVudDogQ2RrRHJhZ0Ryb3A8Rmxvd0dyb3VwTWVudVZNPik6IHZvaWQge1xuICAgIGlmIChldmVudC5wcmV2aW91c0NvbnRhaW5lciA9PT0gZXZlbnQuY29udGFpbmVyKSB7XG4gICAgICAvLyBNb3ZlIGluc2lkZSB0aGUgc2FtZSBncm91cFxuICAgICAgY29uc3QgZmxvd3NHcm91cFRvRWRpdCA9IHRoaXMuZmxvd3NHcm91cHMuZmluZChmZyA9PiBmZy5faWQgPT09IGV2ZW50LmNvbnRhaW5lci5kYXRhLl9pZCk7XG4gICAgICBpZiAoIWZsb3dzR3JvdXBUb0VkaXQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGbG93IGdyb3VwICR7ZXZlbnQuY29udGFpbmVyLmRhdGEuX2lkfSBub3QgZm91bmRgKTtcbiAgICAgIH1cbiAgICAgIG1vdmVJdGVtSW5BcnJheShmbG93c0dyb3VwVG9FZGl0LmZsb3dzLCBldmVudC5wcmV2aW91c0luZGV4LCBldmVudC5jdXJyZW50SW5kZXgpO1xuICAgICAgdGhpcy5mbG93c0dyb3Vwc0NoYW5nZS5lbWl0KHRoaXMuZmxvd3NHcm91cHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBNb3ZlIGZyb20gYSBncm91cCB0byBhbm90aGVyXG4gICAgICBjb25zdCBwcmV2aW91c0Zsb3dzR3JvdXBUb0VkaXQgPSB0aGlzLmZsb3dzR3JvdXBzLmZpbmQoZmcgPT4gZmcuX2lkID09PSBldmVudC5wcmV2aW91c0NvbnRhaW5lci5kYXRhLl9pZCk7XG4gICAgICBjb25zdCBmbG93c0dyb3VwVG9FZGl0ID0gdGhpcy5mbG93c0dyb3Vwcy5maW5kKGZnID0+IGZnLl9pZCA9PT0gZXZlbnQuY29udGFpbmVyLmRhdGEuX2lkKTtcbiAgICAgIGlmICghcHJldmlvdXNGbG93c0dyb3VwVG9FZGl0IHx8ICFmbG93c0dyb3VwVG9FZGl0KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRmxvdyBncm91cCAke2V2ZW50LnByZXZpb3VzQ29udGFpbmVyLmRhdGEuX2lkfSBvciAke2V2ZW50LmNvbnRhaW5lci5kYXRhLl9pZH0gbm90IGZvdW5kYCk7XG4gICAgICB9XG4gICAgICB0cmFuc2ZlckFycmF5SXRlbShwcmV2aW91c0Zsb3dzR3JvdXBUb0VkaXQuZmxvd3MsIGZsb3dzR3JvdXBUb0VkaXQuZmxvd3MsIGV2ZW50LnByZXZpb3VzSW5kZXgsIGV2ZW50LmN1cnJlbnRJbmRleCk7XG5cbiAgICAgIGZsb3dzR3JvdXBUb0VkaXQuZmxvd3NbZXZlbnQuY3VycmVudEluZGV4XS5faGFzQ2hhbmdlZCA9IHRydWU7XG4gICAgICBmbG93c0dyb3VwVG9FZGl0LmZsb3dzW2V2ZW50LmN1cnJlbnRJbmRleF0uX3BhcmVudEZsb3dHcm91cE5hbWUgPSBmbG93c0dyb3VwVG9FZGl0Lm5hbWU7XG4gICAgICB0aGlzLmZsb3dzR3JvdXBzQ2hhbmdlLmVtaXQodGhpcy5mbG93c0dyb3Vwcyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG9uRWRpdEZsb3coZmxvd0lkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBmbG93VG9FZGl0ID0gZmxhdHRlbih0aGlzLmZsb3dzR3JvdXBzLm1hcChmbG93R3JvdXAgPT4gZmxvd0dyb3VwLmZsb3dzKSkuZmluZChmID0+IGYuX2lkID09PSBmbG93SWQpO1xuXG4gICAgbGV0IGRpYWxvZ1Jlc3VsdDtcblxuICAgIHN3aXRjaCAodGhpcy5hcGlUeXBlKSB7XG4gICAgICBjYXNlICdNRVNTQUdFJzpcbiAgICAgICAgZGlhbG9nUmVzdWx0ID0gdGhpcy5tYXREaWFsb2dcbiAgICAgICAgICAub3BlbjxcbiAgICAgICAgICAgIEdpb1BvbGljeVN0dWRpb0Zsb3dNZXNzYWdlRm9ybURpYWxvZ0NvbXBvbmVudCxcbiAgICAgICAgICAgIEdpb1BvbGljeVN0dWRpb0Zsb3dNZXNzYWdlRm9ybURpYWxvZ0RhdGEsXG4gICAgICAgICAgICBHaW9Qb2xpY3lTdHVkaW9GbG93Rm9ybURpYWxvZ1Jlc3VsdFxuICAgICAgICAgID4oR2lvUG9saWN5U3R1ZGlvRmxvd01lc3NhZ2VGb3JtRGlhbG9nQ29tcG9uZW50LCB7XG4gICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgIGZsb3c6IGZsb3dUb0VkaXQsXG4gICAgICAgICAgICAgIGVudHJ5cG9pbnRzOiB0aGlzLmVudHJ5cG9pbnRzSW5mbyA/PyBbXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByb2xlOiAnYWxlcnRkaWFsb2cnLFxuICAgICAgICAgICAgaWQ6ICdnaW9Qc0Zsb3dNZXNzYWdlRm9ybURpYWxvZycsXG4gICAgICAgICAgICB3aWR0aDogR0lPX0RJQUxPR19XSURUSC5NRURJVU0sXG4gICAgICAgICAgfSlcbiAgICAgICAgICAuYWZ0ZXJDbG9zZWQoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdQUk9YWSc6XG4gICAgICAgIGRpYWxvZ1Jlc3VsdCA9IHRoaXMubWF0RGlhbG9nXG4gICAgICAgICAgLm9wZW48R2lvUG9saWN5U3R1ZGlvRmxvd1Byb3h5Rm9ybURpYWxvZ0NvbXBvbmVudCwgR2lvUG9saWN5U3R1ZGlvRmxvd1Byb3h5Rm9ybURpYWxvZ0RhdGEsIEdpb1BvbGljeVN0dWRpb0Zsb3dGb3JtRGlhbG9nUmVzdWx0PihcbiAgICAgICAgICAgIEdpb1BvbGljeVN0dWRpb0Zsb3dQcm94eUZvcm1EaWFsb2dDb21wb25lbnQsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICBmbG93OiBmbG93VG9FZGl0LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICByb2xlOiAnYWxlcnRkaWFsb2cnLFxuICAgICAgICAgICAgICBpZDogJ2dpb1BzRmxvd1Byb3h5Rm9ybURpYWxvZycsXG4gICAgICAgICAgICAgIHdpZHRoOiBHSU9fRElBTE9HX1dJRFRILk1FRElVTSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgKVxuICAgICAgICAgIC5hZnRlckNsb3NlZCgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ05BVElWRSc6XG4gICAgICAgIGRpYWxvZ1Jlc3VsdCA9IHRoaXMubWF0RGlhbG9nXG4gICAgICAgICAgLm9wZW48R2lvUG9saWN5U3R1ZGlvRmxvd05hdGl2ZUZvcm1EaWFsb2dDb21wb25lbnQsIEdpb1BvbGljeVN0dWRpb0Zsb3dOYXRpdmVGb3JtRGlhbG9nRGF0YSwgR2lvUG9saWN5U3R1ZGlvRmxvd0Zvcm1EaWFsb2dSZXN1bHQ+KFxuICAgICAgICAgICAgR2lvUG9saWN5U3R1ZGlvRmxvd05hdGl2ZUZvcm1EaWFsb2dDb21wb25lbnQsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICBwYXJlbnRHcm91cE5hbWU6IGZsb3dUb0VkaXQhLl9wYXJlbnRGbG93R3JvdXBOYW1lLFxuICAgICAgICAgICAgICAgIGZsb3c6IGZsb3dUb0VkaXQsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHJvbGU6ICdhbGVydGRpYWxvZycsXG4gICAgICAgICAgICAgIGlkOiAnZ2lvUHNGbG93TmF0aXZlRm9ybURpYWxvZycsXG4gICAgICAgICAgICAgIHdpZHRoOiBHSU9fRElBTE9HX1dJRFRILk1FRElVTSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgKVxuICAgICAgICAgIC5hZnRlckNsb3NlZCgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgQVBJIHR5cGUgJHt0aGlzLmFwaVR5cGV9YCk7XG4gICAgfVxuXG4gICAgZGlhbG9nUmVzdWx0XG4gICAgICAucGlwZShcbiAgICAgICAgdGFwKGVkaXRlZEZsb3cgPT4ge1xuICAgICAgICAgIGlmICghZWRpdGVkRmxvdykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmZsb3dzR3JvdXBzID0gdGhpcy5mbG93c0dyb3Vwcy5tYXAoZmcgPT4gKHtcbiAgICAgICAgICAgIC4uLmZnLFxuICAgICAgICAgICAgZmxvd3M6IGZnLmZsb3dzLm1hcChmID0+IChmLl9pZCA9PT0gZWRpdGVkRmxvdy5faWQgPyBlZGl0ZWRGbG93IDogZikpLFxuICAgICAgICAgIH0pKTtcbiAgICAgICAgICB0aGlzLmZsb3dzR3JvdXBzQ2hhbmdlLmVtaXQodGhpcy5mbG93c0dyb3Vwcyk7XG4gICAgICAgIH0pLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgcHVibGljIG9uRGVsZXRlRmxvdyhmbG93SWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGZsb3dUb0VkaXQgPSBmbGF0dGVuKHRoaXMuZmxvd3NHcm91cHMubWFwKGZsb3dHcm91cCA9PiBmbG93R3JvdXAuZmxvd3MpKS5maW5kKGYgPT4gZi5faWQgPT09IGZsb3dJZCk7XG4gICAgdGhpcy5kZWxldGVGbG93LmVtaXQoZmxvd1RvRWRpdCk7XG4gIH1cblxuICBwdWJsaWMgb25EdXBsaWNhdGVGbG93KGZsb3dHcm91cElkOiBzdHJpbmcsIGZsb3dJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgZmxvd3NHcm91cFRvRWRpdCA9IHRoaXMuZmxvd3NHcm91cHMuZmluZChmZyA9PiBmZy5faWQgPT09IGZsb3dHcm91cElkKTtcbiAgICBpZiAoIWZsb3dzR3JvdXBUb0VkaXQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmxvdyBncm91cCAke2Zsb3dHcm91cElkfSBub3QgZm91bmRgKTtcbiAgICB9XG4gICAgY29uc3QgZmxvd1RvRHVwbGljYXRlID0gZmxvd3NHcm91cFRvRWRpdC5mbG93cy5maW5kKGYgPT4gZi5faWQgPT09IGZsb3dJZCk7XG4gICAgaWYgKCFmbG93VG9EdXBsaWNhdGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmxvdyAke2Zsb3dJZH0gbm90IGZvdW5kYCk7XG4gICAgfVxuICAgIGNvbnN0IGR1cGxpY2F0ZWRGbG93ID0gY2xvbmVEZWVwKGZsb3dUb0R1cGxpY2F0ZSk7XG4gICAgZGVsZXRlIGR1cGxpY2F0ZWRGbG93LmlkO1xuXG4gICAgZHVwbGljYXRlZEZsb3cuX2lkID0gdW5pcXVlSWQoJ2Zsb3dfJyk7XG4gICAgZHVwbGljYXRlZEZsb3cubmFtZSA9IGAke2R1cGxpY2F0ZWRGbG93Lm5hbWV9IC0gQ29weWA7XG4gICAgZHVwbGljYXRlZEZsb3cuX2hhc0NoYW5nZWQgPSB0cnVlO1xuICAgIGNvbnN0IGluZGV4ID0gZmxvd3NHcm91cFRvRWRpdC5mbG93cy5pbmRleE9mKGZsb3dUb0R1cGxpY2F0ZSk7XG4gICAgZmxvd3NHcm91cFRvRWRpdC5mbG93cy5zcGxpY2UoaW5kZXggKyAxLCAwLCBkdXBsaWNhdGVkRmxvdyk7XG4gICAgdGhpcy5mbG93c0dyb3Vwc0NoYW5nZS5lbWl0KHRoaXMuZmxvd3NHcm91cHMpO1xuICAgIHRoaXMuc2VsZWN0ZWRGbG93SWRDaGFuZ2UuZW1pdChkdXBsaWNhdGVkRmxvdy5faWQpO1xuICB9XG59XG4iLCI8IS0tXG5cbiAgICBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEdyYXZpdGVlIHRlYW0gKGh0dHA6Ly9ncmF2aXRlZS5pbylcbiAgICBcbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgICBcbiAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4tLT5cblxuPGRpdiBjbGFzcz1cImhlYWRlclwiPlxuICA8ZGl2IGNsYXNzPVwiaGVhZGVyX19sYWJlbFwiPlxuICAgIEZsb3dzIDxtYXQtaWNvbiBzdmdJY29uPVwiZ2lvOmluZm9cIiBtYXRUb29sdGlwPVwiRmxvd3MgYWxsb3cgeW91IHRvIGFwcGx5IGRpZmZlcmVudCBwb2xpY2llcyBvbiB5b3VyIEFQSSBldmVudCBwaGFzZXNcIj48L21hdC1pY29uPlxuICA8L2Rpdj5cbiAgQGlmIChhcGlUeXBlICE9PSAnTkFUSVZFJykge1xuICAgIDxkaXYgY2xhc3M9XCJoZWFkZXJfX2NvbmZpZ0J0blwiPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImhlYWRlcl9fY29uZmlnQnRuX2VkaXRcIiBtYXQtc3Ryb2tlZC1idXR0b24gW2Rpc2FibGVkXT1cImxvYWRpbmdcIiAoY2xpY2spPVwib25Db25maWd1cmVFeGVjdXRpb24oZmxvd0V4ZWN1dGlvbilcIj5cbiAgICAgICAgPG1hdC1pY29uIFtzdmdJY29uXT1cInJlYWRPbmx5ID8gJ2dpbzpleWUtZW1wdHknIDogJ2dpbzpzZXR0aW5ncydcIj48L21hdC1pY29uPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIH1cbjwvZGl2PlxuPGRpdiBjbGFzcz1cInNlYXJjaEJhclwiICpuZ0lmPVwiIWxvYWRpbmdcIj5cbiAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwic2VhcmNoQmFyX19pbnB1dFwiPlxuICAgIDxtYXQtaWNvbiBtYXRQcmVmaXg+c2VhcmNoPC9tYXQtaWNvbj5cbiAgICA8aW5wdXQgbWF0SW5wdXQgcGxhY2Vob2xkZXI9XCJTZWFyY2ggYnkgbmFtZSwgcGF0aCwgb3IgZ3JvdXAuLi5cIiBbZm9ybUNvbnRyb2xdPVwic2VhcmNoQ29udHJvbFwiIC8+XG4gICAgPGJ1dHRvbiAqbmdJZj1cInNlYXJjaENvbnRyb2wudmFsdWVcIiBtYXRTdWZmaXggbWF0LWljb24tYnV0dG9uIGFyaWEtbGFiZWw9XCJDbGVhclwiIChjbGljayk9XCJyZXNldFNlYXJjaFRlcm0oKVwiPlxuICAgICAgPG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj5cbiAgICA8L2J1dHRvbj5cbiAgPC9tYXQtZm9ybS1maWVsZD5cbjwvZGl2PlxuXG48ZGl2IGNsYXNzPVwibGlzdFwiICpuZ0lmPVwiIWxvYWRpbmc7IGVsc2UgbG9hZGluZ0xpc3RcIiBjZGtEcm9wTGlzdEdyb3VwPlxuICA8ZGl2XG4gICAgKm5nRm9yPVwibGV0IGZsb3dzR3JvdXAgb2YgZmlsdGVyZWRGbG93R3JvdXBNZW51SXRlbXNcIlxuICAgIGNsYXNzPVwibGlzdF9fZmxvd3NHcm91cFwiXG4gICAgY2RrRHJvcExpc3RcbiAgICBbY2RrRHJvcExpc3REYXRhXT1cImZsb3dzR3JvdXBcIlxuICAgIFtjZGtEcm9wTGlzdEVudGVyUHJlZGljYXRlXT1cImVudGVyUHJlZGljYXRlXCJcbiAgICAoY2RrRHJvcExpc3REcm9wcGVkKT1cIm9uRHJvcEZsb3coJGV2ZW50KVwiXG4gID5cbiAgICA8ZGl2IGNsYXNzPVwibGlzdF9fZmxvd3NHcm91cF9faGVhZGVyXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibGlzdF9fZmxvd3NHcm91cF9faGVhZGVyX19sYWJlbFwiPlxuICAgICAgICA8c3Bhbj57eyAoZmxvd3NHcm91cC5faXNQbGFuID8gJ1BsYW46ICcgOiAnJykgKyBmbG93c0dyb3VwLm5hbWUgfX08L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJsaXN0X19mbG93c0dyb3VwX19oZWFkZXJfX2FkZEJ0blwiPlxuICAgICAgICBAaWYgKGFwaVR5cGUgPT09ICdOQVRJVkUnKSB7XG4gICAgICAgICAgPHNwYW4gW21hdFRvb2x0aXBEaXNhYmxlZF09XCJmbG93c0dyb3VwLmZsb3dzLmxlbmd0aCA8IDFcIiBtYXRUb29sdGlwPVwiT25seSBvbmUgZmxvdyBpcyBhbGxvd2VkIGZvciBhIG5hdGl2ZSBBUElcIj5cbiAgICAgICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiBbZGlzYWJsZWRdPVwicmVhZE9ubHkgfHwgZmxvd3NHcm91cC5mbG93cy5sZW5ndGggPiAwXCIgKGNsaWNrKT1cIm9uQWRkRmxvdyhmbG93c0dyb3VwKVwiPlxuICAgICAgICAgICAgICA8bWF0LWljb24gc3ZnSWNvbj1cImdpbzpwbHVzXCIgbWF0VG9vbHRpcD1cIk5ldyBmbG93XCI+PC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIFtkaXNhYmxlZF09XCJyZWFkT25seVwiIChjbGljayk9XCJvbkFkZEZsb3coZmxvd3NHcm91cClcIj5cbiAgICAgICAgICAgIDxtYXQtaWNvbiBzdmdJY29uPVwiZ2lvOnBsdXNcIiBtYXRUb29sdGlwPVwiTmV3IGZsb3dcIj48L21hdC1pY29uPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJsaXN0X19mbG93c0dyb3VwX19mbG93c1wiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImZsb3dzR3JvdXAuZmxvd3MubGVuZ3RoID4gMDsgZWxzZSBub0Zsb3dzXCI+XG4gICAgICAgIEBmb3IgKGZsb3cgb2YgZmxvd3NHcm91cC5mbG93czsgdHJhY2sgZmxvdy5faWQpIHtcbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cImxpc3RfX2Zsb3dzR3JvdXBfX2Zsb3dzX19mbG93XCJcbiAgICAgICAgICAgIFtjbGFzcy5zZWxlY3RlZF09XCJmbG93LnNlbGVjdGVkXCJcbiAgICAgICAgICAgIFtjbGFzcy5kaXNhYmxlZF09XCIhZmxvdy5lbmFibGVkXCJcbiAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RGbG93KGZsb3dzR3JvdXAuX2lkLCBmbG93Ll9pZClcIlxuICAgICAgICAgICAgKG1vdXNlb3V0KT1cImZsb3cubW91c2VPdmVyID0gZmFsc2VcIlxuICAgICAgICAgICAgKG1vdXNlb3Zlcik9XCJmbG93Lm1vdXNlT3ZlciA9IHRydWVcIlxuICAgICAgICAgICAgY2RrRHJhZ1xuICAgICAgICAgID5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaXN0X19mbG93c0dyb3VwX19mbG93c19fZmxvd19fbGVmdFwiPlxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZmxvdy5uYW1lXCIgY2xhc3M9XCJsaXN0X19mbG93c0dyb3VwX19mbG93c19fZmxvd19fbGVmdF9fbmFtZVwiIFthdHRyLnRpdGxlXT1cImZsb3cubmFtZVwiPlxuICAgICAgICAgICAgICAgIHt7IGZsb3cubmFtZSB9fVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgQGlmIChhcGlUeXBlICE9PSAnTkFUSVZFJykge1xuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaXN0X19mbG93c0dyb3VwX19mbG93c19fZmxvd19fbGVmdF9faW5mb3NcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaXN0X19mbG93c0dyb3VwX19mbG93c19fZmxvd19fbGVmdF9faW5mb3NfX2JhZGdlc1wiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBiYWRnZSBvZiBmbG93LmJhZGdlc1wiXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJsaXN0X19mbG93c0dyb3VwX19mbG93c19fZmxvd19fbGVmdF9faW5mb3NfX2JhZGdlc19fYmFkZ2VcIlxuICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImJhZGdlLmNsYXNzXCJcbiAgICAgICAgICAgICAgICAgICAgICA+e3sgYmFkZ2UubGFiZWwgfX08L3NwYW5cbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGlzdF9fZmxvd3NHcm91cF9fZmxvd3NfX2Zsb3dfX2xlZnRfX2luZm9zX19wYXRoT3JDaGFubmVsTGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJmbG93LnBhdGhPckNoYW5uZWxMYWJlbDsgZWxzZSBlbXB0eVBhdGhPckNoYW5uZWxMYWJlbFwiIFthdHRyLnRpdGxlXT1cImZsb3cucGF0aE9yQ2hhbm5lbExhYmVsXCI+e3tcbiAgICAgICAgICAgICAgICAgICAgICBmbG93LnBhdGhPckNoYW5uZWxMYWJlbFxuICAgICAgICAgICAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNlbXB0eVBhdGhPckNoYW5uZWxMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICA8ZW0+RW1wdHk8L2VtPlxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZmxvdy5oYXNDb25kaXRpb25cIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImxpc3RfX2Zsb3dzR3JvdXBfX2Zsb3dzX19mbG93X19sZWZ0X19pbmZvc19fY29uZGl0aW9uQmFkZ2UgZ2lvLWJhZGdlLW5ldXRyYWxcIlxuICAgICAgICAgICAgICAgICAgICBtYXRUb29sdGlwPVwiQ29uZGl0aW9uZWRcIlxuICAgICAgICAgICAgICAgICAgICA+PG1hdC1pY29uIHN2Z0ljb249XCJnaW86aWZcIj48L21hdC1pY29uXG4gICAgICAgICAgICAgICAgICA+PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaXN0X19mbG93c0dyb3VwX19mbG93c19fZmxvd19fcmlnaHRcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIGNsYXNzPVwibGlzdF9fZmxvd3NHcm91cF9fZmxvd3NfX2Zsb3dfX3JpZ2h0X19uYW1lX19tZW51XCJcbiAgICAgICAgICAgICAgICBtYXQtYnV0dG9uXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInJlYWRPbmx5XCJcbiAgICAgICAgICAgICAgICBbbWF0TWVudVRyaWdnZXJGb3JdPVwiZmxvd01lbnVcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uIHN2Z0ljb249XCJnaW86bW9yZS12ZXJ0aWNhbFwiPjwvbWF0LWljb24+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8bWF0LW1lbnUgI2Zsb3dNZW51PVwibWF0TWVudVwiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gW2Rpc2FibGVkXT1cInJlYWRPbmx5XCIgbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwib25EaXNhYmxlRmxvdyhmbG93Ll9pZClcIj5cbiAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBbc3ZnSWNvbl09XCJmbG93LmVuYWJsZWQgPyAnZ2lvOnByb2hpYml0aW9uJyA6ICdnaW86Y2hlY2stY2lyY2xlZC1vdXRsaW5lJ1wiPjwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICA8c3Bhbj57eyBmbG93LmVuYWJsZWQgPyAnRGlzYWJsZScgOiAnRW5hYmxlJyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cIm9uRWRpdEZsb3coZmxvdy5faWQpXCI+PG1hdC1pY29uIHN2Z0ljb249XCJnaW86ZWRpdC1wZW5jaWxcIj48L21hdC1pY29uPiBFZGl0PC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJvbkRlbGV0ZUZsb3coZmxvdy5faWQpXCI+PG1hdC1pY29uIHN2Z0ljb249XCJnaW86dHJhc2hcIj48L21hdC1pY29uPiBEZWxldGU8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICBAaWYgKGFwaVR5cGUgIT09ICdOQVRJVkUnKSB7XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cIm9uRHVwbGljYXRlRmxvdyhmbG93c0dyb3VwLl9pZCwgZmxvdy5faWQpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBzdmdJY29uPVwiZ2lvOmNvcHlcIj48L21hdC1pY29uPiBEdXBsaWNhdGVcbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9tYXQtbWVudT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjbm9GbG93cz5cbiAgICAgICAgPGRpdiBjbGFzcz1cImxpc3RfX2Zsb3dzR3JvdXBfX25vLWZsb3dzXCI+Tm8gZmxvd3MgeWV0PC9kaXY+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuXG48bmctdGVtcGxhdGUgI2xvYWRpbmdMaXN0PlxuICA8ZGl2IGNsYXNzPVwibG9hZGluZ0xpc3RcIj5cbiAgICA8Z2lvLWxvYWRlcj48L2dpby1sb2FkZXI+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
|