@sumaris-net/ngx-components 1.21.7 → 1.22.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/bundles/sumaris-net.ngx-components.umd.js +1305 -200
- package/bundles/sumaris-net.ngx-components.umd.js.map +1 -1
- package/bundles/sumaris-net.ngx-components.umd.min.js +2 -2
- package/bundles/sumaris-net.ngx-components.umd.min.js.map +1 -1
- package/doc/changelog.md +3 -0
- package/esm2015/public_api.js +8 -1
- package/esm2015/src/app/core/form/editor.class.js +7 -11
- package/esm2015/src/app/core/icon/icon.component.js +5 -2
- package/esm2015/src/app/core/menu/menu.component.js +2 -2
- package/esm2015/src/app/shared/pipes/date-diff-duration.pipe.js +9 -5
- package/esm2015/src/app/shared/types.js +1 -1
- package/esm2015/src/app/social/job/job.model.js +26 -0
- package/esm2015/src/app/social/job/job.module.js +25 -0
- package/esm2015/src/app/social/job/job.service.js +54 -0
- package/esm2015/src/app/social/job/progression/job-progression.component.js +200 -0
- package/esm2015/src/app/social/job/progression/job-progression.list.js +20 -0
- package/esm2015/src/app/social/message/message.module.js +25 -0
- package/esm2015/src/app/social/social.errors.js +5 -2
- package/esm2015/src/app/social/social.module.js +10 -15
- package/esm2015/src/app/social/user-event/notification/user-event-notification.component.js +89 -0
- package/esm2015/src/app/social/user-event/notification/user-event-notification.list.js +78 -0
- package/esm2015/src/app/social/user-event/testing/user-event.testing.service.js +73 -0
- package/esm2015/src/app/social/user-event/user-event.model.js +58 -2
- package/esm2015/src/app/social/user-event/user-event.module.js +33 -0
- package/esm2015/src/app/social/user-event/user-event.service.js +412 -173
- package/esm2015/src/app/social/user-event/user-events.table.js +18 -13
- package/esm2015/sumaris-net.ngx-components.js +9 -6
- package/fesm2015/sumaris-net.ngx-components.js +1122 -259
- package/fesm2015/sumaris-net.ngx-components.js.map +1 -1
- package/package.json +1 -1
- package/public_api.d.ts +7 -0
- package/src/app/core/icon/icon.component.d.ts +4 -4
- package/src/app/shared/material/badge/badge-icon.test.d.ts +1 -1
- package/src/app/shared/pipes/date-diff-duration.pipe.d.ts +6 -2
- package/src/app/shared/types.d.ts +4 -0
- package/src/app/social/job/job.model.d.ts +33 -0
- package/src/app/social/job/job.module.d.ts +2 -0
- package/src/app/social/job/job.service.d.ts +23 -0
- package/src/app/social/job/progression/job-progression.component.d.ts +44 -0
- package/src/app/social/job/progression/job-progression.list.d.ts +12 -0
- package/src/app/social/message/message.module.d.ts +2 -0
- package/src/app/social/social.errors.d.ts +3 -0
- package/src/app/social/social.module.d.ts +8 -0
- package/src/app/social/user-event/notification/user-event-notification.component.d.ts +22 -0
- package/src/app/social/user-event/notification/user-event-notification.list.d.ts +30 -0
- package/src/app/social/user-event/testing/user-event.testing.service.d.ts +35 -0
- package/src/app/social/user-event/user-event.model.d.ts +52 -8
- package/src/app/social/user-event/user-event.module.d.ts +2 -0
- package/src/app/social/user-event/user-event.service.d.ts +101 -51
- package/src/app/social/user-event/user-events.table.d.ts +6 -6
- package/src/assets/i18n/en-US.json +15 -2
- package/src/assets/i18n/en.json +16 -2
- package/src/assets/i18n/fr.json +15 -1
- package/src/theme/_ngx-components.scss +8 -0
- package/sumaris-net.ngx-components.d.ts +8 -5
- package/sumaris-net.ngx-components.metadata.json +1 -1
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
import { __awaiter
|
|
2
|
-
import { Inject, Injectable, Optional } from '@angular/core';
|
|
1
|
+
import { __awaiter } from "tslib";
|
|
2
|
+
import { Directive, Inject, Injectable, InjectionToken, Optional } from '@angular/core';
|
|
3
3
|
import { gql } from '@apollo/client/core';
|
|
4
4
|
import { SocialErrorCodes } from '../social.errors';
|
|
5
5
|
import { AccountService } from '../../core/services/account.service';
|
|
6
6
|
import { GraphqlService } from '../../core/graphql/graphql.service';
|
|
7
|
-
import { of } from 'rxjs';
|
|
8
|
-
import { UserEvent, UserEventTypes } from './user-event.model';
|
|
7
|
+
import { BehaviorSubject, merge, of, Subscription } from 'rxjs';
|
|
8
|
+
import { UserEvent, UserEventFilter, UserEventTypes } from './user-event.model';
|
|
9
9
|
import { UserEventFragments } from './user-event.fragments';
|
|
10
|
-
import { map } from 'rxjs/operators';
|
|
11
|
-
import { isEmptyArray,
|
|
10
|
+
import { distinctUntilChanged, map, mergeMap } from 'rxjs/operators';
|
|
11
|
+
import { isEmptyArray, isNotNil, toNumber } from '../../shared/functions';
|
|
12
12
|
import { Toasts } from '../../shared/toast/toasts';
|
|
13
13
|
import { ToastController } from '@ionic/angular';
|
|
14
14
|
import { TranslateService } from '@ngx-translate/core';
|
|
@@ -16,155 +16,249 @@ import { NetworkService } from '../../core/services/network.service';
|
|
|
16
16
|
import { BaseGraphqlService } from '../../core/services/base-graphql-service.class';
|
|
17
17
|
import { Entity, EntityUtils } from '../../core/services/model/entity.model';
|
|
18
18
|
import { Environment, ENVIRONMENT } from '../../../environments/environment.class';
|
|
19
|
-
import {
|
|
20
|
-
import
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
import * as i4 from "@ngx-translate/core";
|
|
26
|
-
import * as i5 from "@ionic/angular";
|
|
27
|
-
import * as i6 from "../../../environments/environment.class";
|
|
28
|
-
// @dynamic
|
|
29
|
-
let UserEventFilter = class UserEventFilter extends EntityFilter {
|
|
30
|
-
constructor() {
|
|
31
|
-
super(...arguments);
|
|
32
|
-
this.issuer = null;
|
|
33
|
-
this.recipient = null;
|
|
34
|
-
}
|
|
35
|
-
fromObject(source, opts) {
|
|
36
|
-
super.fromObject(source, opts);
|
|
37
|
-
this.issuer = source.issuer;
|
|
38
|
-
this.recipient = source.recipient;
|
|
39
|
-
}
|
|
40
|
-
buildFilter() {
|
|
41
|
-
const filterFns = super.buildFilter();
|
|
42
|
-
// issuer
|
|
43
|
-
if (this.issuer) {
|
|
44
|
-
filterFns.push(t => (t.issuer === this.issuer));
|
|
45
|
-
}
|
|
46
|
-
if (this.recipient) {
|
|
47
|
-
filterFns.push(t => (t.recipient === this.recipient));
|
|
48
|
-
}
|
|
49
|
-
return filterFns;
|
|
50
|
-
}
|
|
51
|
-
};
|
|
52
|
-
UserEventFilter = __decorate([
|
|
53
|
-
EntityClass({ typename: 'UserEventFilterVO' })
|
|
54
|
-
], UserEventFilter);
|
|
55
|
-
export { UserEventFilter };
|
|
56
|
-
const SaveQuery = gql `
|
|
57
|
-
mutation SaveUserEvent($data: UserEventVOInput){
|
|
58
|
-
data: saveUserEvent(userEvent: $data){
|
|
59
|
-
...UserEventFragment
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
${UserEventFragments.userEvent}
|
|
63
|
-
`;
|
|
64
|
-
const LoadAllQuery = gql `
|
|
65
|
-
query UserEvents($filter: UserEventFilterVOInput, $page: PageInput){
|
|
66
|
-
data: userEvents(filter: $filter, page: $page){
|
|
67
|
-
...LightUserEventFragment
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
${UserEventFragments.lightUserEvent}
|
|
71
|
-
`;
|
|
72
|
-
const DeleteByIdsMutation = gql `
|
|
73
|
-
mutation DeleteUserEvents($ids:[Int]){
|
|
74
|
-
deleteUserEvents(ids: $ids)
|
|
75
|
-
}
|
|
76
|
-
`;
|
|
77
|
-
const LoadAllWithContentQuery = gql `
|
|
78
|
-
query UserEventsWithContent($filter: UserEventFilterVOInput, $page: PageInput){
|
|
79
|
-
data: userEvents(filter: $filter, page: $page){
|
|
80
|
-
...UserEventFragment
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
${UserEventFragments.userEvent}
|
|
84
|
-
`;
|
|
85
|
-
export class UserEventService extends BaseGraphqlService {
|
|
86
|
-
constructor(graphql, accountService, network, translate, toastController, environment) {
|
|
19
|
+
import { DateUtils } from '../../shared/dates';
|
|
20
|
+
import * as momentImported from 'moment';
|
|
21
|
+
const moment = momentImported;
|
|
22
|
+
export const UserEventServiceToken = new InjectionToken('UserEventService');
|
|
23
|
+
export class AbstractUserEventService extends BaseGraphqlService {
|
|
24
|
+
constructor(graphql, accountService, network, translate, queries, mutations, subscriptions, environment) {
|
|
87
25
|
super(graphql, environment);
|
|
88
26
|
this.graphql = graphql;
|
|
89
27
|
this.accountService = accountService;
|
|
90
28
|
this.network = network;
|
|
91
29
|
this.translate = translate;
|
|
92
|
-
this.
|
|
30
|
+
this.queries = queries;
|
|
31
|
+
this.mutations = mutations;
|
|
32
|
+
this.subscriptions = subscriptions;
|
|
93
33
|
this.environment = environment;
|
|
94
|
-
this.
|
|
34
|
+
this.count$ = new BehaviorSubject(0);
|
|
35
|
+
this.listeners = [];
|
|
36
|
+
this._subscriptions = new Subscription();
|
|
37
|
+
this._logPrefix = '[user-event-service] ';
|
|
95
38
|
// For DEV only
|
|
96
|
-
this._debug = environment
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
39
|
+
this._debug = !(environment === null || environment === void 0 ? void 0 : environment.production);
|
|
40
|
+
}
|
|
41
|
+
get userEventCount() {
|
|
42
|
+
return this.count$.asObservable();
|
|
43
|
+
}
|
|
44
|
+
ngOnStart() {
|
|
45
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
46
|
+
// Update component when refresh is need (=login events)
|
|
47
|
+
this._subscriptions.add(merge(this.accountService.onLogin, this.accountService.onLogout)
|
|
48
|
+
.pipe(
|
|
49
|
+
// Wait account service ready (can be restarted)
|
|
50
|
+
mergeMap(() => this.accountService.ready()), map(() => this.accountService.isLogin()), distinctUntilChanged())
|
|
51
|
+
.subscribe(login => {
|
|
52
|
+
if (login) {
|
|
53
|
+
this.onLogin();
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
this.onLogout();
|
|
57
|
+
}
|
|
58
|
+
}));
|
|
59
|
+
// First attempt if account is ready
|
|
60
|
+
yield this.accountService.ready();
|
|
61
|
+
if (this.accountService.isLogin()) {
|
|
62
|
+
setTimeout(() => this.onLogin());
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
ngOnDestroy() {
|
|
67
|
+
this._subscriptions.unsubscribe();
|
|
68
|
+
}
|
|
108
69
|
watchAll(offset, size, sortBy, sortDirection, filter, options) {
|
|
109
70
|
return this.watchPage({ offset, size, sortBy, sortDirection }, filter, options);
|
|
110
71
|
}
|
|
111
72
|
watchPage(page, filter, options) {
|
|
73
|
+
var _a;
|
|
112
74
|
let now = this._debug && Date.now();
|
|
113
|
-
|
|
114
|
-
|
|
75
|
+
if (!filter) {
|
|
76
|
+
filter = this.defaultFilter();
|
|
77
|
+
}
|
|
78
|
+
console.debug(`${this._logPrefix}Loading user events...`, filter);
|
|
115
79
|
filter = this.asFilter(filter);
|
|
116
80
|
// Force recipient to current issuer, if not admin and not specified
|
|
117
|
-
if (
|
|
118
|
-
const recipient = this.
|
|
119
|
-
if (
|
|
81
|
+
if (isEmptyArray(filter === null || filter === void 0 ? void 0 : filter.recipients) || !this.accountService.isAdmin()) {
|
|
82
|
+
const recipient = this.defaultRecipient();
|
|
83
|
+
if (!((_a = filter === null || filter === void 0 ? void 0 : filter.recipients) === null || _a === void 0 ? void 0 : _a.includes(recipient))) {
|
|
120
84
|
console.warn('[user-events-service] Force user event filter.recipient=' + recipient);
|
|
121
|
-
filter.
|
|
85
|
+
filter.recipients = [recipient];
|
|
122
86
|
}
|
|
123
87
|
}
|
|
124
|
-
const withContent = options
|
|
88
|
+
const withContent = (options === null || options === void 0 ? void 0 : options.withContent) === true;
|
|
125
89
|
return this.mutableWatchQuery({
|
|
126
90
|
queryName: withContent ? 'LoadAllWithContent' : 'LoadAll',
|
|
127
|
-
query: withContent ?
|
|
91
|
+
query: withContent ? this.queries.loadAllWithContent : this.queries.loadAll,
|
|
128
92
|
variables: {
|
|
129
|
-
page: Object.assign(Object.assign({ sortBy: '
|
|
93
|
+
page: Object.assign(Object.assign({ sortBy: 'creationDate' }, page), {
|
|
94
|
+
// @ts-ignore
|
|
95
|
+
sortDirection: (page.sortDirection || 'desc').toUpperCase() }),
|
|
130
96
|
filter: filter && filter.asPodObject()
|
|
131
97
|
},
|
|
132
98
|
arrayFieldName: 'data',
|
|
133
99
|
error: { code: SocialErrorCodes.LOAD_USER_EVENTS_ERROR, message: 'SOCIAL.ERROR.LOAD_USER_EVENTS_ERROR' },
|
|
134
|
-
fetchPolicy: options
|
|
100
|
+
fetchPolicy: (options === null || options === void 0 ? void 0 : options.fetchPolicy) || 'cache-first'
|
|
135
101
|
})
|
|
136
102
|
.pipe(map(res => {
|
|
137
|
-
|
|
103
|
+
let data = ((res === null || res === void 0 ? void 0 : res.data) || []).map(value => this.processUserEvent(value, this));
|
|
138
104
|
if (now) {
|
|
139
|
-
console.debug(
|
|
105
|
+
console.debug(`${this._logPrefix}${data.length} user events loaded in ${Date.now() - now}ms`);
|
|
140
106
|
now = null;
|
|
141
107
|
}
|
|
108
|
+
// Must re-order because of listenChanges result will add new event at the end
|
|
109
|
+
data = EntityUtils.sort(data, page.sortBy, page.sortDirection);
|
|
142
110
|
return {
|
|
143
111
|
data,
|
|
144
|
-
total: res
|
|
112
|
+
total: toNumber(res === null || res === void 0 ? void 0 : res.total, data.length)
|
|
145
113
|
};
|
|
146
114
|
}));
|
|
147
115
|
}
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
116
|
+
add(entity) {
|
|
117
|
+
// TODO set an id !!!!!!!!!!!!!!!!!!!!!!!!!
|
|
118
|
+
entity = this.processUserEvent(entity);
|
|
119
|
+
const withContent = !!entity.content;
|
|
120
|
+
// Add user event locally
|
|
121
|
+
this.insertIntoMutableCachedQueries(this.graphql.cache, {
|
|
122
|
+
query: withContent ? this.queries.loadAllWithContent : this.queries.loadAll,
|
|
123
|
+
data: entity
|
|
124
|
+
});
|
|
125
|
+
// Update count
|
|
126
|
+
this.count$.next(this.count$.value + 1);
|
|
127
|
+
}
|
|
128
|
+
count(filter, options) {
|
|
129
|
+
var _a;
|
|
130
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
131
|
+
if (!((_a = this.queries) === null || _a === void 0 ? void 0 : _a.count)) {
|
|
132
|
+
console.warn(`${this._logPrefix}Query 'count' not provided, skip.`);
|
|
133
|
+
return undefined;
|
|
134
|
+
}
|
|
135
|
+
if (!filter)
|
|
136
|
+
filter = this.defaultFilter();
|
|
137
|
+
// Apply last reset date as start date
|
|
138
|
+
filter.startDate = this.resetCountDate;
|
|
139
|
+
filter = this.asFilter(filter);
|
|
140
|
+
if (this._debug)
|
|
141
|
+
console.debug(`${this._logPrefix}Counting user events with filter:`, filter);
|
|
142
|
+
const res = yield this.graphql.query({
|
|
143
|
+
query: this.queries.count,
|
|
144
|
+
variables: {
|
|
145
|
+
filter: filter.asPodObject()
|
|
146
|
+
},
|
|
147
|
+
error: { code: SocialErrorCodes.COUNT_USER_EVENT_ERROR, message: 'SOCIAL.ERROR.COUNT_USER_EVENT_ERROR' },
|
|
148
|
+
fetchPolicy: (options === null || options === void 0 ? void 0 : options.fetchPolicy) || 'network-only'
|
|
149
|
+
});
|
|
150
|
+
return res.total;
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
listenCountChanges(filter, options) {
|
|
154
|
+
var _a;
|
|
155
|
+
if (!((_a = this.subscriptions) === null || _a === void 0 ? void 0 : _a.listenCountChanges)) {
|
|
156
|
+
console.warn(`${this._logPrefix}Subscription query 'listenCountChanges' not provided, skip.`);
|
|
157
|
+
return of();
|
|
158
|
+
}
|
|
159
|
+
if (!filter)
|
|
160
|
+
filter = this.defaultFilter();
|
|
161
|
+
// Apply last reset date as start date
|
|
162
|
+
filter.startDate = this.resetCountDate;
|
|
163
|
+
filter = this.asFilter(filter);
|
|
164
|
+
if (this._debug)
|
|
165
|
+
console.debug(`${this._logPrefix}[WS] Listening count changes for user events with filter:`, filter);
|
|
166
|
+
return this.graphql.subscribe({
|
|
167
|
+
query: this.subscriptions.listenCountChanges,
|
|
168
|
+
fetchPolicy: options === null || options === void 0 ? void 0 : options.fetchPolicy,
|
|
169
|
+
variables: { filter: filter.asPodObject(), interval: toNumber(options === null || options === void 0 ? void 0 : options.interval, 10) },
|
|
170
|
+
error: {
|
|
171
|
+
code: SocialErrorCodes.SUBSCRIBE_USER_EVENTS_ERROR,
|
|
172
|
+
message: 'SOCIAL.ERROR.SUBSCRIBE_USER_EVENTS_ERROR'
|
|
173
|
+
}
|
|
174
|
+
}).pipe(map(({ total }) => {
|
|
175
|
+
if (total && this._debug)
|
|
176
|
+
console.debug(`${this._logPrefix}Received new user events count:`, total);
|
|
177
|
+
// update count
|
|
178
|
+
this.count$.next(total);
|
|
179
|
+
return total;
|
|
180
|
+
}));
|
|
181
|
+
}
|
|
182
|
+
listenChanges(filter, options) {
|
|
183
|
+
var _a;
|
|
184
|
+
if (!((_a = this.subscriptions) === null || _a === void 0 ? void 0 : _a.listenChanges)) {
|
|
185
|
+
console.warn(`${this._logPrefix}Subscription query 'listenChanges' not provided, skip.`);
|
|
186
|
+
return of();
|
|
187
|
+
}
|
|
188
|
+
if (!filter)
|
|
189
|
+
filter = this.defaultFilter();
|
|
190
|
+
filter = this.asFilter(filter);
|
|
191
|
+
const withContent = (options === null || options === void 0 ? void 0 : options.withContent) === true;
|
|
192
|
+
if (this._debug)
|
|
193
|
+
console.debug(`${this._logPrefix}[WS] Listening changes for user events with filter:`, filter);
|
|
194
|
+
return this.graphql.subscribe({
|
|
195
|
+
query: this.subscriptions.listenChanges,
|
|
196
|
+
fetchPolicy: options === null || options === void 0 ? void 0 : options.fetchPolicy,
|
|
197
|
+
variables: { filter: filter.asPodObject(), interval: toNumber(options === null || options === void 0 ? void 0 : options.interval, 10) },
|
|
198
|
+
error: {
|
|
199
|
+
code: SocialErrorCodes.SUBSCRIBE_USER_EVENTS_ERROR,
|
|
200
|
+
message: 'SOCIAL.ERROR.SUBSCRIBE_USER_EVENTS_ERROR'
|
|
201
|
+
}
|
|
202
|
+
}).pipe(map(({ data }) => {
|
|
203
|
+
if (data && this._debug)
|
|
204
|
+
console.debug(`${this._logPrefix}Received new user events:`, data);
|
|
205
|
+
const updatedData = data === null || data === void 0 ? void 0 : data.map(value => this.processUserEvent(value, this));
|
|
206
|
+
// Update cache
|
|
207
|
+
this.insertIntoMutableCachedQueries(this.graphql.cache, {
|
|
208
|
+
query: withContent ? this.queries.loadAllWithContent : this.queries.loadAll,
|
|
209
|
+
data: updatedData
|
|
210
|
+
});
|
|
211
|
+
return updatedData;
|
|
212
|
+
}));
|
|
213
|
+
}
|
|
214
|
+
delete(entity) {
|
|
215
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
216
|
+
if (!entity)
|
|
217
|
+
return; // skip
|
|
218
|
+
yield this.deleteAll([entity]);
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
deleteAll(entities, opts) {
|
|
222
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
223
|
+
const ids = entities && entities
|
|
224
|
+
.map(t => t.id);
|
|
225
|
+
if (isEmptyArray(ids))
|
|
226
|
+
return; // stop, if nothing else to do
|
|
227
|
+
const now = Date.now();
|
|
228
|
+
if (this._debug)
|
|
229
|
+
console.debug(`${this._logPrefix}Deleting events... ids:`, ids);
|
|
230
|
+
yield this.graphql.mutate({
|
|
231
|
+
mutation: this.mutations.deleteByIds,
|
|
232
|
+
variables: {
|
|
233
|
+
ids
|
|
234
|
+
},
|
|
235
|
+
update: (proxy) => {
|
|
236
|
+
// Remove from caches
|
|
237
|
+
this.removeFromMutableCachedQueriesByIds(proxy, {
|
|
238
|
+
query: this.queries.loadAll,
|
|
239
|
+
ids
|
|
240
|
+
});
|
|
241
|
+
this.removeFromMutableCachedQueriesByIds(proxy, {
|
|
242
|
+
query: this.queries.loadAllWithContent,
|
|
243
|
+
ids
|
|
244
|
+
});
|
|
245
|
+
if (this._debug)
|
|
246
|
+
console.debug(`${this._logPrefix}Events deleted in ${Date.now() - now}ms`);
|
|
247
|
+
}
|
|
248
|
+
});
|
|
249
|
+
});
|
|
151
250
|
}
|
|
152
|
-
/**
|
|
153
|
-
* Save a userEvent entity
|
|
154
|
-
*
|
|
155
|
-
* @param entity
|
|
156
|
-
*/
|
|
157
251
|
save(entity, options) {
|
|
158
252
|
return __awaiter(this, void 0, void 0, function* () {
|
|
159
253
|
this.fillDefaultProperties(entity);
|
|
160
254
|
// Transform into json
|
|
161
|
-
const
|
|
255
|
+
const withContent = !!entity.content;
|
|
162
256
|
const json = entity.asObject();
|
|
163
257
|
const now = Date.now();
|
|
164
258
|
if (this._debug)
|
|
165
|
-
console.debug(
|
|
259
|
+
console.debug(`${this._logPrefix}Saving user event...`, json);
|
|
166
260
|
yield this.graphql.mutate({
|
|
167
|
-
mutation:
|
|
261
|
+
mutation: this.mutations.save,
|
|
168
262
|
variables: {
|
|
169
263
|
data: json
|
|
170
264
|
},
|
|
@@ -174,17 +268,19 @@ export class UserEventService extends BaseGraphqlService {
|
|
|
174
268
|
const savedEntity = data && data.data;
|
|
175
269
|
if (savedEntity) {
|
|
176
270
|
if (this._debug)
|
|
177
|
-
console.debug(
|
|
271
|
+
console.debug(`${this._logPrefix}User event saved in ${Date.now() - now}ms`, entity);
|
|
178
272
|
this.copyIdAndUpdateDate(savedEntity, entity);
|
|
179
273
|
// Add to cache
|
|
180
|
-
if (
|
|
274
|
+
if (withContent) {
|
|
181
275
|
this.insertIntoMutableCachedQueries(proxy, {
|
|
182
|
-
query:
|
|
183
|
-
data:
|
|
276
|
+
query: this.queries.loadAllWithContent,
|
|
277
|
+
data: savedEntity
|
|
184
278
|
});
|
|
279
|
+
}
|
|
280
|
+
else {
|
|
185
281
|
this.insertIntoMutableCachedQueries(proxy, {
|
|
186
|
-
query:
|
|
187
|
-
data: savedEntity
|
|
282
|
+
query: this.queries.loadAll,
|
|
283
|
+
data: Object.assign(Object.assign({}, savedEntity), { content: null })
|
|
188
284
|
});
|
|
189
285
|
}
|
|
190
286
|
}
|
|
@@ -193,63 +289,207 @@ export class UserEventService extends BaseGraphqlService {
|
|
|
193
289
|
return entity;
|
|
194
290
|
});
|
|
195
291
|
}
|
|
196
|
-
|
|
197
|
-
* Save many trips
|
|
198
|
-
*
|
|
199
|
-
* @param entities
|
|
200
|
-
* @param opts
|
|
201
|
-
*/
|
|
202
|
-
deleteAll(entities, opts) {
|
|
292
|
+
saveAll(entities, opts) {
|
|
203
293
|
return __awaiter(this, void 0, void 0, function* () {
|
|
204
|
-
|
|
205
|
-
.map(
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
this.removeFromMutableCachedQueriesByIds(proxy, {
|
|
219
|
-
query: LoadAllQuery,
|
|
220
|
-
ids
|
|
221
|
-
});
|
|
222
|
-
this.removeFromMutableCachedQueriesByIds(proxy, {
|
|
223
|
-
query: LoadAllWithContentQuery,
|
|
224
|
-
ids
|
|
225
|
-
});
|
|
226
|
-
if (this._debug)
|
|
227
|
-
console.debug(`[user-event-service] Events deleted in ${Date.now() - now}ms`);
|
|
294
|
+
return Promise.all(entities
|
|
295
|
+
.map(entity => this.save(entity, opts)));
|
|
296
|
+
});
|
|
297
|
+
}
|
|
298
|
+
markAsRead(entities) {
|
|
299
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
300
|
+
const userEventWithoutReadListeners = [];
|
|
301
|
+
for (const entity of (entities || [])) {
|
|
302
|
+
// Get onRead listeners
|
|
303
|
+
const onReadListeners = (this.listeners || []).filter(listener => !!listener.onRead).filter(listener => listener.accept(entity));
|
|
304
|
+
if (onReadListeners.length) {
|
|
305
|
+
for (const listener of onReadListeners) {
|
|
306
|
+
yield listener.onRead(entity);
|
|
307
|
+
}
|
|
228
308
|
}
|
|
229
|
-
|
|
309
|
+
else {
|
|
310
|
+
// Add to this list for default operation
|
|
311
|
+
userEventWithoutReadListeners.push(entity);
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
// Use default
|
|
315
|
+
yield this.defaultMarkAsRead(userEventWithoutReadListeners);
|
|
230
316
|
});
|
|
231
317
|
}
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
318
|
+
registerListener(listener) {
|
|
319
|
+
if (!this.listeners)
|
|
320
|
+
this.listeners = [];
|
|
321
|
+
this.listeners.push(listener);
|
|
322
|
+
}
|
|
323
|
+
resetCount() {
|
|
324
|
+
this.count$.next(undefined);
|
|
325
|
+
this.resetCountDate = moment();
|
|
326
|
+
// restart listening count changes
|
|
327
|
+
this.startListenCountChanges();
|
|
328
|
+
}
|
|
329
|
+
/* -- protected methods -- */
|
|
330
|
+
onLogin() {
|
|
236
331
|
return __awaiter(this, void 0, void 0, function* () {
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
332
|
+
// Get first count
|
|
333
|
+
const count = yield this.count(undefined);
|
|
334
|
+
if (this._debug)
|
|
335
|
+
console.debug(`${this._logPrefix}Receiving user events count`, count);
|
|
336
|
+
// Update count
|
|
337
|
+
this.count$.next(count);
|
|
338
|
+
// Then listen changes
|
|
339
|
+
this.startListenCountChanges();
|
|
340
|
+
});
|
|
341
|
+
}
|
|
342
|
+
onLogout() {
|
|
343
|
+
this.stopListenCountChanges();
|
|
344
|
+
}
|
|
345
|
+
startListenCountChanges() {
|
|
346
|
+
this.stopListenCountChanges();
|
|
347
|
+
this._listenSubscription = this.listenCountChanges(undefined).subscribe();
|
|
348
|
+
}
|
|
349
|
+
stopListenCountChanges() {
|
|
350
|
+
var _a;
|
|
351
|
+
(_a = this._listenSubscription) === null || _a === void 0 ? void 0 : _a.unsubscribe();
|
|
352
|
+
this._listenSubscription = undefined;
|
|
353
|
+
}
|
|
354
|
+
processUserEvent(source, that) {
|
|
355
|
+
that = that || this;
|
|
356
|
+
// Convert json source to IUserEvent
|
|
357
|
+
let target = that.fromObject(source);
|
|
358
|
+
// Get listeners
|
|
359
|
+
const listeners = (that.listeners || []).filter(listener => listener.onReceived).filter(listener => listener.accept(target));
|
|
360
|
+
for (const listener of listeners) {
|
|
361
|
+
if (target) {
|
|
362
|
+
target = listener.onReceived(target);
|
|
363
|
+
}
|
|
364
|
+
else {
|
|
365
|
+
if (that._debug)
|
|
366
|
+
console.debug(`${that._logPrefix}Event has been rejected by a listener`, source);
|
|
367
|
+
break;
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
return target;
|
|
371
|
+
}
|
|
372
|
+
defaultMarkAsRead(userEvents) {
|
|
373
|
+
var _a;
|
|
374
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
375
|
+
if (!userEvents)
|
|
376
|
+
throw new Error(`${this._logPrefix}Invalid event to save`);
|
|
377
|
+
if (!userEvents.length)
|
|
378
|
+
return;
|
|
379
|
+
// set read date
|
|
380
|
+
userEvents.forEach(userEvent => userEvent.readDate = moment());
|
|
381
|
+
// split local/remote entities
|
|
382
|
+
const localEntities = userEvents.filter(userEvent => !userEvent.id || userEvent.id < 0);
|
|
383
|
+
const remoteEntities = userEvents.filter(userEvent => userEvent.id > 0);
|
|
384
|
+
// save local entities
|
|
385
|
+
if (localEntities.length) {
|
|
386
|
+
if (this._debug)
|
|
387
|
+
console.debug(`${this._logPrefix}Save local user event`);
|
|
388
|
+
// TODO !!!!!!!!!!!!!
|
|
389
|
+
}
|
|
390
|
+
// mark remote entities as read
|
|
391
|
+
if (remoteEntities.length) {
|
|
392
|
+
if (!((_a = this.mutations) === null || _a === void 0 ? void 0 : _a.markAsRead)) {
|
|
393
|
+
console.warn(`${this._logPrefix}Mutation query 'markAsRead' not provided, skip.`);
|
|
394
|
+
return;
|
|
395
|
+
}
|
|
396
|
+
// Collect ids
|
|
397
|
+
const ids = remoteEntities.map(value => value.id);
|
|
398
|
+
const now = Date.now();
|
|
399
|
+
if (this._debug)
|
|
400
|
+
console.debug(`${this._logPrefix}Mark user events as read...`, ids);
|
|
401
|
+
yield this.graphql.mutate({
|
|
402
|
+
mutation: this.mutations.markAsRead,
|
|
403
|
+
variables: {
|
|
404
|
+
ids
|
|
405
|
+
},
|
|
406
|
+
error: { code: SocialErrorCodes.SAVE_USER_EVENT_ERROR, message: 'SOCIAL.ERROR.SAVE_USER_EVENT_ERROR' },
|
|
407
|
+
});
|
|
408
|
+
if (this._debug)
|
|
409
|
+
console.debug(`${this._logPrefix}User events marked as read in ${Date.now() - now}ms`, ids);
|
|
410
|
+
}
|
|
240
411
|
});
|
|
241
412
|
}
|
|
242
|
-
|
|
243
|
-
//
|
|
244
|
-
|
|
245
|
-
|
|
413
|
+
defaultFilter() {
|
|
414
|
+
// By default
|
|
415
|
+
return {
|
|
416
|
+
recipients: [this.defaultRecipient()]
|
|
417
|
+
};
|
|
418
|
+
}
|
|
419
|
+
defaultRecipient() {
|
|
420
|
+
return this.accountService.person.pubkey;
|
|
421
|
+
}
|
|
422
|
+
fillDefaultProperties(entity) {
|
|
423
|
+
}
|
|
424
|
+
unreadEvents(events) {
|
|
425
|
+
// default calculation on unread events from a list
|
|
426
|
+
if (isEmptyArray(events))
|
|
427
|
+
return undefined;
|
|
428
|
+
const lastReadDate = events
|
|
429
|
+
.filter(event => isNotNil(event.readDate))
|
|
430
|
+
.reduce((lastDate, event) => DateUtils.max(lastDate, event.readDate), undefined);
|
|
431
|
+
return events
|
|
432
|
+
.filter(event => event.creationDate.isSameOrAfter(lastReadDate)).length;
|
|
433
|
+
}
|
|
434
|
+
copyIdAndUpdateDate(source, target) {
|
|
435
|
+
EntityUtils.copyIdAndUpdateDate(source, target);
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
AbstractUserEventService.decorators = [
|
|
439
|
+
{ type: Directive }
|
|
440
|
+
];
|
|
441
|
+
AbstractUserEventService.ctorParameters = () => [
|
|
442
|
+
{ type: GraphqlService },
|
|
443
|
+
{ type: AccountService },
|
|
444
|
+
{ type: NetworkService },
|
|
445
|
+
{ type: TranslateService },
|
|
446
|
+
{ type: undefined },
|
|
447
|
+
{ type: undefined },
|
|
448
|
+
{ type: undefined },
|
|
449
|
+
{ type: Environment, decorators: [{ type: Optional }, { type: Inject, args: [ENVIRONMENT,] }] }
|
|
450
|
+
];
|
|
451
|
+
const userEventQueries = {
|
|
452
|
+
loadAll: gql `
|
|
453
|
+
query UserEvents($filter: UserEventFilterVOInput, $page: PageInput){
|
|
454
|
+
data: userEvents(filter: $filter, page: $page){
|
|
455
|
+
...LightUserEventFragment
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
${UserEventFragments.lightUserEvent}
|
|
459
|
+
`,
|
|
460
|
+
loadAllWithContent: gql `
|
|
461
|
+
query UserEventsWithContent($filter: UserEventFilterVOInput, $page: PageInput){
|
|
462
|
+
data: userEvents(filter: $filter, page: $page){
|
|
463
|
+
...UserEventFragment
|
|
464
|
+
}
|
|
246
465
|
}
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
466
|
+
${UserEventFragments.userEvent}
|
|
467
|
+
`
|
|
468
|
+
};
|
|
469
|
+
const userEventMutations = {
|
|
470
|
+
deleteByIds: gql `
|
|
471
|
+
mutation DeleteUserEvents($ids:[Int]){
|
|
472
|
+
deleteUserEvents(ids: $ids)
|
|
250
473
|
}
|
|
251
|
-
|
|
252
|
-
|
|
474
|
+
`,
|
|
475
|
+
save: gql `
|
|
476
|
+
mutation SaveUserEvent($data: UserEventVOInput){
|
|
477
|
+
data: saveUserEvent(userEvent: $data){
|
|
478
|
+
...UserEventFragment
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
${UserEventFragments.userEvent}
|
|
482
|
+
`
|
|
483
|
+
};
|
|
484
|
+
export class UserEventService extends AbstractUserEventService {
|
|
485
|
+
constructor(graphql, accountService, network, translate, toastController, environment) {
|
|
486
|
+
super(graphql, accountService, network, translate, userEventQueries, userEventMutations, undefined, environment);
|
|
487
|
+
this.graphql = graphql;
|
|
488
|
+
this.accountService = accountService;
|
|
489
|
+
this.network = network;
|
|
490
|
+
this.translate = translate;
|
|
491
|
+
this.toastController = toastController;
|
|
492
|
+
this.environment = environment;
|
|
253
493
|
}
|
|
254
494
|
showToastErrorWithContext(opts) {
|
|
255
495
|
return __awaiter(this, void 0, void 0, function* () {
|
|
@@ -313,13 +553,16 @@ export class UserEventService extends BaseGraphqlService {
|
|
|
313
553
|
}
|
|
314
554
|
sendDataForDebug(data) {
|
|
315
555
|
const userEvent = new UserEvent();
|
|
316
|
-
userEvent.
|
|
556
|
+
userEvent.type = UserEventTypes.DEBUG_DATA;
|
|
317
557
|
userEvent.content = this.convertObjectToString(data);
|
|
318
558
|
return this.save(userEvent);
|
|
319
559
|
}
|
|
320
560
|
asFilter(filter) {
|
|
321
561
|
return UserEventFilter.fromObject(filter);
|
|
322
562
|
}
|
|
563
|
+
fromObject(source) {
|
|
564
|
+
return UserEvent.fromObject(source);
|
|
565
|
+
}
|
|
323
566
|
/* -- protected methods -- */
|
|
324
567
|
convertObjectToString(data) {
|
|
325
568
|
if (typeof data === 'string') {
|
|
@@ -348,13 +591,9 @@ export class UserEventService extends BaseGraphqlService {
|
|
|
348
591
|
// TODO: compute sign
|
|
349
592
|
console.warn('TODO: sign user event before sending');
|
|
350
593
|
}
|
|
351
|
-
copyIdAndUpdateDate(source, target) {
|
|
352
|
-
EntityUtils.copyIdAndUpdateDate(source, target);
|
|
353
|
-
}
|
|
354
594
|
}
|
|
355
|
-
UserEventService.ɵprov = i0.ɵɵdefineInjectable({ factory: function UserEventService_Factory() { return new UserEventService(i0.ɵɵinject(i1.GraphqlService), i0.ɵɵinject(i2.AccountService), i0.ɵɵinject(i3.NetworkService), i0.ɵɵinject(i4.TranslateService), i0.ɵɵinject(i5.ToastController), i0.ɵɵinject(i6.ENVIRONMENT, 8)); }, token: UserEventService, providedIn: "root" });
|
|
356
595
|
UserEventService.decorators = [
|
|
357
|
-
{ type: Injectable
|
|
596
|
+
{ type: Injectable }
|
|
358
597
|
];
|
|
359
598
|
UserEventService.ctorParameters = () => [
|
|
360
599
|
{ type: GraphqlService },
|
|
@@ -364,4 +603,4 @@ UserEventService.ctorParameters = () => [
|
|
|
364
603
|
{ type: ToastController },
|
|
365
604
|
{ type: Environment, decorators: [{ type: Optional }, { type: Inject, args: [ENVIRONMENT,] }] }
|
|
366
605
|
];
|
|
367
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1ldmVudC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9zb2NpYWwvdXNlci1ldmVudC91c2VyLWV2ZW50LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUMzRCxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDeEMsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDbEQsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLHFDQUFxQyxDQUFDO0FBQ25FLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxvQ0FBb0MsQ0FBQztBQUNsRSxPQUFPLEVBQWEsRUFBRSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQ3BDLE9BQU8sRUFBQyxTQUFTLEVBQW1CLGNBQWMsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBQzlFLE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBRzFELE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUNuQyxPQUFPLEVBQUMsWUFBWSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDbkYsT0FBTyxFQUFtQixNQUFNLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQztBQUVuRSxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDL0MsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDckQsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLHFDQUFxQyxDQUFDO0FBQ25FLE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLGdEQUFnRCxDQUFDO0FBQ2xGLE9BQU8sRUFBQyxNQUFNLEVBQUUs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VUFBVSxTQUFDLEVBQUMsVUFBVSxFQUFFLE1BQU0sRUFBQzs7O1lBMUZ4QixjQUFjO1lBRGQsY0FBYztZQWFkLGNBQWM7WUFEZCxnQkFBZ0I7WUFEaEIsZUFBZTtZQUtmLFdBQVcsdUJBd0ZkLFFBQVEsWUFBSSxNQUFNLFNBQUMsV0FBVyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SW5qZWN0LCBJbmplY3RhYmxlLCBPcHRpb25hbH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge2dxbH0gZnJvbSAnQGFwb2xsby9jbGllbnQvY29yZSc7XG5pbXBvcnQge1NvY2lhbEVycm9yQ29kZXN9IGZyb20gJy4uL3NvY2lhbC5lcnJvcnMnO1xuaW1wb3J0IHtBY2NvdW50U2VydmljZX0gZnJvbSAnLi4vLi4vY29yZS9zZXJ2aWNlcy9hY2NvdW50LnNlcnZpY2UnO1xuaW1wb3J0IHtHcmFwaHFsU2VydmljZX0gZnJvbSAnLi4vLi4vY29yZS9ncmFwaHFsL2dyYXBocWwuc2VydmljZSc7XG5pbXBvcnQge09ic2VydmFibGUsIG9mfSBmcm9tICdyeGpzJztcbmltcG9ydCB7VXNlckV2ZW50LCBVc2VyRXZlbnRBY3Rpb24sIFVzZXJFdmVudFR5cGVzfSBmcm9tICcuL3VzZXItZXZlbnQubW9kZWwnO1xuaW1wb3J0IHtVc2VyRXZlbnRGcmFnbWVudHN9IGZyb20gJy4vdXNlci1ldmVudC5mcmFnbWVudHMnO1xuaW1wb3J0IHtTb3J0RGlyZWN0aW9ufSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zb3J0JztcbmltcG9ydCB7RW50aXRpZXNTZXJ2aWNlV2F0Y2hPcHRpb25zLCBFbnRpdHlTZXJ2aWNlTG9hZE9wdGlvbnMsIEZpbHRlckZuLCBJRW50aXRpZXNTZXJ2aWNlLCBMb2FkUmVzdWx0LCBQYWdlfSBmcm9tICcuLi8uLi9zaGFyZWQvc2VydmljZXMvZW50aXR5LXNlcnZpY2UuY2xhc3MnO1xuaW1wb3J0IHttYXB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7aXNFbXB0eUFycmF5LCBpc05pbCwgaXNOaWxPckJsYW5rLCB0b051bWJlcn0gZnJvbSAnLi4vLi4vc2hhcmVkL2Z1bmN0aW9ucyc7XG5pbXBvcnQge1Nob3dUb2FzdE9wdGlvbnMsIFRvYXN0c30gZnJvbSAnLi4vLi4vc2hhcmVkL3RvYXN0L3RvYXN0cyc7XG5pbXBvcnQge092ZXJsYXlFdmVudERldGFpbH0gZnJvbSAnQGlvbmljL2NvcmUnO1xuaW1wb3J0IHtUb2FzdENvbnRyb2xsZXJ9IGZyb20gJ0Bpb25pYy9hbmd1bGFyJztcbmltcG9ydCB7VHJhbnNsYXRlU2VydmljZX0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQge05ldHdvcmtTZXJ2aWNlfSBmcm9tICcuLi8uLi9jb3JlL3NlcnZpY2VzL25ldHdvcmsuc2VydmljZSc7XG5pbXBvcnQge0Jhc2VHcmFwaHFsU2VydmljZX0gZnJvbSAnLi4vLi4vY29yZS9zZXJ2aWNlcy9iYXNlLWdyYXBocWwtc2VydmljZS5jbGFzcyc7XG5pbXBvcnQge0VudGl0eSwgRW50aXR5VXRpbHN9IGZyb20gJy4uLy4uL2NvcmUvc2VydmljZXMvbW9kZWwvZW50aXR5Lm1vZGVsJztcbmltcG9ydCB7RW52aXJvbm1lbnQsIEVOVklST05NRU5UfSBmcm9tICcuLi8uLi8uLi9lbnZpcm9ubWVudHMvZW52aXJvbm1lbnQuY2xhc3MnO1xuaW1wb3J0IHtFbnRpdHlGaWx0ZXJ9IGZyb20gJy4uLy4uL2NvcmUvc2VydmljZXMvbW9kZWwvZmlsdGVyLm1vZGVsJztcbmltcG9ydCB7RW50aXR5Q2xhc3N9IGZyb20gJy4uLy4uL2NvcmUvc2VydmljZXMvbW9kZWwvZW50aXR5LmRlY29yYXRvcnMnO1xuXG4vLyBAZHluYW1pY1xuQEVudGl0eUNsYXNzKHt0eXBlbmFtZTogJ1VzZXJFdmVudEZpbHRlclZPJ30pXG5leHBvcnQgY2xhc3MgVXNlckV2ZW50RmlsdGVyIGV4dGVuZHMgRW50aXR5RmlsdGVyPFVzZXJFdmVudEZpbHRlciwgVXNlckV2ZW50PiB7XG5cbiAgc3RhdGljIGZyb21PYmplY3Q6IChzb3VyY2U6IGFueSwgb3B0cz86IGFueSkgPT4gVXNlckV2ZW50RmlsdGVyO1xuXG4gIGlzc3Vlcjogc3RyaW5nID0gbnVsbDtcbiAgcmVjaXBpZW50OiBzdHJpbmcgPSBudWxsO1xuXG4gIGZyb21PYmplY3Qoc291cmNlOiBhbnksIG9wdHM/OiBhbnkpIHtcbiAgICBzdXBlci5mcm9tT2JqZWN0KHNvdXJjZSwgb3B0cyk7XG4gICAgdGhpcy5pc3N1ZXIgPSBzb3VyY2UuaXNzdWVyO1xuICAgIHRoaXMucmVjaXBpZW50ID0gc291cmNlLnJlY2lwaWVudDtcbiAgfVxuXG4gIHByb3RlY3RlZCBidWlsZEZpbHRlcigpOiBGaWx0ZXJGbjxVc2VyRXZlbnQ+W10ge1xuICAgIGNvbnN0IGZpbHRlckZucyA9IHN1cGVyLmJ1aWxkRmlsdGVyKCk7XG5cbiAgICAvLyBpc3N1ZXJcbiAgICBpZiAodGhpcy5pc3N1ZXIpIHtcbiAgICAgIGZpbHRlckZucy5wdXNoKHQgPT4gKHQuaXNzdWVyID09PSB0aGlzLmlzc3VlcikpO1xuICAgIH1cbiAgICBpZiAodGhpcy5yZWNpcGllbnQpIHtcbiAgICAgIGZpbHRlckZucy5wdXNoKHQgPT4gKHQucmVjaXBpZW50ID09PSB0aGlzLnJlY2lwaWVudCkpO1xuICAgIH1cblxuICAgIHJldHVybiBmaWx0ZXJGbnM7XG4gIH1cbn1cblxuY29uc3QgU2F2ZVF1ZXJ5OiBhbnkgPSBncWxgXG4gIG11dGF0aW9uIFNhdmVVc2VyRXZlbnQoJGRhdGE6IFVzZXJFdmVudFZPSW5wdXQpe1xuICAgIGRhdGE6IHNhdmVVc2VyRXZlbnQodXNlckV2ZW50OiAkZGF0YSl7XG4gICAgICAuLi5Vc2VyRXZlbnRGcmFnbWVudFxuICAgIH1cbiAgfVxuICAke1VzZXJFdmVudEZyYWdtZW50cy51c2VyRXZlbnR9XG5gO1xuXG5jb25zdCBMb2FkQWxsUXVlcnk6IGFueSA9IGdxbGBcbiAgcXVlcnkgVXNlckV2ZW50cygkZmlsdGVyOiBVc2VyRXZlbnRGaWx0ZXJWT0lucHV0LCAkcGFnZTogUGFnZUlucHV0KXtcbiAgICBkYXRhOiB1c2VyRXZlbnRzKGZpbHRlcjogJGZpbHRlciwgcGFnZTogJHBhZ2Upe1xuICAgICAgLi4uTGlnaHRVc2VyRXZlbnRGcmFnbWVudFxuICAgIH1cbiAgfVxuICAke1VzZXJFdmVudEZyYWdtZW50cy5saWdodFVzZXJFdmVudH1cbmA7XG5cbmNvbnN0IERlbGV0ZUJ5SWRzTXV0YXRpb246IGFueSA9IGdxbGBcbiAgbXV0YXRpb24gRGVsZXRlVXNlckV2ZW50cygkaWRzOltJbnRdKXtcbiAgICBkZWxldGVVc2VyRXZlbnRzKGlkczogJGlkcylcbiAgfVxuYDtcblxuY29uc3QgTG9hZEFsbFdpdGhDb250ZW50UXVlcnk6IGFueSA9IGdxbGBcbiAgcXVlcnkgVXNlckV2ZW50c1dpdGhDb250ZW50KCRmaWx0ZXI6IFVzZXJFdmVudEZpbHRlclZPSW5wdXQsICRwYWdlOiBQYWdlSW5wdXQpe1xuICAgIGRhdGE6IHVzZXJFdmVudHMoZmlsdGVyOiAkZmlsdGVyLCBwYWdlOiAkcGFnZSl7XG4gICAgICAuLi5Vc2VyRXZlbnRGcmFnbWVudFxuICAgIH1cbiAgfVxuICAke1VzZXJFdmVudEZyYWdtZW50cy51c2VyRXZlbnR9XG5gO1xuXG5leHBvcnQgZGVjbGFyZSBpbnRlcmZhY2UgVXNlckV2ZW50V2F0Y2hPcHRpb25zIGV4dGVuZHMgRW50aXRpZXNTZXJ2aWNlV2F0Y2hPcHRpb25zIHtcbiAgd2l0aENvbnRlbnQ/OiBib29sZWFuOyAvLyBEZWZhdWx0IHRvIGZhbHNlXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXNlckV2ZW50QWN0aW9uRGVmaW5pdGlvbiBleHRlbmRzIFVzZXJFdmVudEFjdGlvbjxhbnk+IHtcbiAgX190eXBlbmFtZTogc3RyaW5nO1xufVxuXG5ASW5qZWN0YWJsZSh7cHJvdmlkZWRJbjogJ3Jvb3QnfSlcbmV4cG9ydCBjbGFzcyBVc2VyRXZlbnRTZXJ2aWNlXG4gIGV4dGVuZHMgQmFzZUdyYXBocWxTZXJ2aWNlPFVzZXJFdmVudCwgVXNlckV2ZW50RmlsdGVyPlxuICBpbXBsZW1lbnRzIElFbnRpdGllc1NlcnZpY2U8VXNlckV2ZW50LCBVc2VyRXZlbnRGaWx0ZXIsIFVzZXJFdmVudFdhdGNoT3B0aW9ucz4ge1xuXG4gIHByaXZhdGUgX3VzZXJFdmVudEFjdGlvbnM6IFVzZXJFdmVudEFjdGlvbkRlZmluaXRpb25bXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBncmFwaHFsOiBHcmFwaHFsU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgYWNjb3VudFNlcnZpY2U6IEFjY291bnRTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBuZXR3b3JrOiBOZXR3b3JrU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCB0b2FzdENvbnRyb2xsZXI6IFRvYXN0Q29udHJvbGxlcixcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEVOVklST05NRU5UKSBwcm90ZWN0ZWQgZW52aXJvbm1lbnQ6IEVudmlyb25tZW50XG4gICkge1xuICAgIHN1cGVyKGdyYXBocWwsIGVudmlyb25tZW50KTtcblxuICAgIC8vIEZvciBERVYgb25seVxuICAgIHRoaXMuX2RlYnVnID0gZW52aXJvbm1lbnQgJiYgIWVudmlyb25tZW50LnByb2R1Y3Rpb247XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIG9mZnNldFxuICAgKiBAcGFyYW0gc2l6ZVxuICAgKiBAcGFyYW0gc29ydEJ5XG4gICAqIEBwYXJhbSBzb3J0RGlyZWN0aW9uXG4gICAqIEBwYXJhbSBmaWx0ZXJcbiAgICogQHBhcmFtIG9wdGlvbnNcbiAgICogQGRlcHJlY2F0ZWQgdXNlIHdhdGNoUGFnZSgpIGluc3RlYWRcbiAgICovXG4gIHdhdGNoQWxsKG9mZnNldDogbnVtYmVyLFxuICAgICAgICAgICBzaXplOiBudW1iZXIsXG4gICAgICAgICAgIHNvcnRCeT86IHN0cmluZyxcbiAgICAgICAgICAgc29ydERpcmVjdGlvbj86IFNvcnREaXJlY3Rpb24sXG4gICAgICAgICAgIGZpbHRlcj86IFVzZXJFdmVudEZpbHRlcixcbiAgICAgICAgICAgb3B0aW9ucz86IFVzZXJFdmVudFdhdGNoT3B0aW9ucyk6IE9ic2VydmFibGU8TG9hZFJlc3VsdDxVc2VyRXZlbnQ+PiB7XG4gICAgcmV0dXJuIHRoaXMud2F0Y2hQYWdlKDxQYWdlPntvZmZzZXQsIHNpemUsIHNvcnRCeSwgc29ydERpcmVjdGlvbn0sIGZpbHRlciwgb3B0aW9ucyk7XG4gIH1cblxuICB3YXRjaFBhZ2UocGFnZTogUGFnZSxcbiAgICAgICAgICAgIGZpbHRlcj86IFBhcnRpYWw8VXNlckV2ZW50RmlsdGVyPixcbiAgICAgICAgICAgIG9wdGlvbnM/OiBVc2VyRXZlbnRXYXRjaE9wdGlvbnMpOiBPYnNlcnZhYmxlPExvYWRSZXN1bHQ8VXNlckV2ZW50Pj4ge1xuXG4gICAgbGV0IG5vdyA9IHRoaXMuX2RlYnVnICYmIERhdGUubm93KCk7XG4gICAgLy9pZiAodGhpcy5fZGVidWcpXG4gICAgY29uc29sZS5kZWJ1ZygnW3VzZXItZXZlbnQtc2VydmljZV0gTG9hZGluZyB1c2VyIGV2ZW50cy4uLicsIGZpbHRlcik7XG5cbiAgICBmaWx0ZXIgPSB0aGlzLmFzRmlsdGVyKGZpbHRlcik7XG5cbiAgICAvLyBGb3JjZSByZWNpcGllbnQgdG8gY3VycmVudCBpc3N1ZXIsIGlmIG5vdCBhZG1pbiBhbmQgbm90IHNwZWNpZmllZFxuICAgIGlmIChpc05pbE9yQmxhbmsoZmlsdGVyLnJlY2lwaWVudCkgfHwgIXRoaXMuYWNjb3VudFNlcnZpY2UuaXNBZG1pbigpKSB7XG4gICAgICBjb25zdCByZWNpcGllbnQgPSB0aGlzLmFjY291bnRTZXJ2aWNlLmFjY291bnQucHVia2V5O1xuICAgICAgaWYgKHJlY2lwaWVudCAhPT0gZmlsdGVyLnJlY2lwaWVudCkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1t1c2VyLWV2ZW50cy1zZXJ2aWNlXSBGb3JjZSB1c2VyIGV2ZW50IGZpbHRlci5yZWNpcGllbnQ9JyArIHJlY2lwaWVudCk7XG4gICAgICAgIGZpbHRlci5yZWNpcGllbnQgPSByZWNpcGllbnQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgd2l0aENvbnRlbnQgPSBvcHRpb25zICYmIG9wdGlvbnMud2l0aENvbnRlbnQgPT09IHRydWU7XG5cbiAgICByZXR1cm4gdGhpcy5tdXRhYmxlV2F0Y2hRdWVyeTxMb2FkUmVzdWx0PGFueT4+KHtcbiAgICAgIHF1ZXJ5TmFtZTogd2l0aENvbnRlbnQgPyAnTG9hZEFsbFdpdGhDb250ZW50JyA6ICdMb2FkQWxsJyxcbiAgICAgIHF1ZXJ5OiB3aXRoQ29udGVudCA/IExvYWRBbGxXaXRoQ29udGVudFF1ZXJ5IDogTG9hZEFsbFF1ZXJ5LFxuICAgICAgdmFyaWFibGVzOiB7XG4gICAgICAgIHBhZ2U6IHtcbiAgICAgICAgICBzb3J0Qnk6ICd1cGRhdGVEYXRlJyxcbiAgICAgICAgICAuLi5wYWdlLFxuICAgICAgICAgIHNvcnREaXJlY3Rpb246IChwYWdlLnNvcnREaXJlY3Rpb24gfHwgJ0RFU0MnKS50b1VwcGVyQ2FzZSgpLFxuICAgICAgICB9LFxuICAgICAgICBmaWx0ZXI6IGZpbHRlciAmJiBmaWx0ZXIuYXNQb2RPYmplY3QoKVxuICAgICAgfSxcbiAgICAgIGFycmF5RmllbGROYW1lOiAnZGF0YScsXG4gICAgICBlcnJvcjoge2NvZGU6IFNvY2lhbEVycm9yQ29kZXMuTE9BRF9VU0VSX0VWRU5UU19FUlJPUiwgbWVzc2FnZTogJ1NPQ0lBTC5FUlJPUi5MT0FEX1VTRVJfRVZFTlRTX0VSUk9SJ30sXG4gICAgICBmZXRjaFBvbGljeTogb3B0aW9ucyAmJiBvcHRpb25zLmZldGNoUG9saWN5IHx8IHVuZGVmaW5lZFxuICAgIH0pXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKHJlcyA9PiB7XG4gICAgICAgICAgY29uc3QgZGF0YSA9IHJlcyAmJiAocmVzLmRhdGEgfHwgW10pLm1hcChVc2VyRXZlbnQuZnJvbU9iamVjdCk7XG5cbiAgICAgICAgICBpZiAobm93KSB7XG4gICAgICAgICAgICBjb25zb2xlLmRlYnVnKGBbdXNlci1ldmVudC1zZXJ2aWNlXSAke2RhdGEubGVuZ3RofSB1c2VyIGV2ZW50cyBsb2FkZWQgaW4gJHtEYXRlLm5vdygpIC0gbm93fW1zYCk7XG4gICAgICAgICAgICBub3cgPSBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgIHRvdGFsOiByZXMgJiYgdG9OdW1iZXIocmVzLnRvdGFsLCBkYXRhLmxlbmd0aClcbiAgICAgICAgICB9O1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgfVxuXG4gIHNhdmVBbGwoZGF0YTogVXNlckV2ZW50W10sIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPFVzZXJFdmVudFtdPiB7XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKGRhdGFcbiAgICAgIC5tYXAoZW50aXR5ID0+IHRoaXMuc2F2ZShlbnRpdHksIG9wdGlvbnMpKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogU2F2ZSBhIHVzZXJFdmVudCBlbnRpdHlcbiAgICpcbiAgICogQHBhcmFtIGVudGl0eVxuICAgKi9cbiAgYXN5bmMgc2F2ZShlbnRpdHk6IFVzZXJFdmVudCwgb3B0aW9ucz86IEVudGl0eVNlcnZpY2VMb2FkT3B0aW9ucyk6IFByb21pc2U8VXNlckV2ZW50PiB7XG5cbiAgICB0aGlzLmZpbGxEZWZhdWx0UHJvcGVydGllcyhlbnRpdHkpO1xuXG4gICAgLy8gVHJhbnNmb3JtIGludG8ganNvblxuICAgIGNvbnN0IGlzTmV3ID0gaXNOaWwoZW50aXR5LmlkKTtcbiAgICBjb25zdCBqc29uID0gZW50aXR5LmFzT2JqZWN0KCk7XG5cbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS5kZWJ1ZyhgW3VzZXItZXZlbnQtc2VydmljZV0gU2F2aW5nIHVzZXIgZXZlbnQuLi5gLCBqc29uKTtcblxuICAgIGF3YWl0IHRoaXMuZ3JhcGhxbC5tdXRhdGU8eyBkYXRhOiBhbnkgfT4oe1xuICAgICAgbXV0YXRpb246IFNhdmVRdWVyeSxcbiAgICAgIHZhcmlhYmxlczoge1xuICAgICAgICBkYXRhOiBqc29uXG4gICAgICB9LFxuICAgICAgZXJyb3I6IHsgY29kZTogU29jaWFsRXJyb3JDb2Rlcy5TQVZFX1VTRVJfRVZFTlRfRVJST1IsIG1lc3NhZ2U6ICdTT0NJQUwuRVJST1IuU0FWRV9VU0VSX0VWRU5UX0VSUk9SJyB9LFxuICAgICAgdXBkYXRlOiAocHJveHksIHtkYXRhfSkgPT4ge1xuICAgICAgICAvLyBVcGRhdGUgZW50aXR5XG4gICAgICAgIGNvbnN0IHNhdmVkRW50aXR5ID0gZGF0YSAmJiBkYXRhLmRhdGE7XG4gICAgICAgIGlmIChzYXZlZEVudGl0eSkge1xuICAgICAgICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS5kZWJ1ZyhgW3VzZXItZXZlbnQtc2VydmljZV0gVXNlciBldmVudCBzYXZlZCBpbiAke0RhdGUubm93KCkgLSBub3d9bXNgLCBlbnRpdHkpO1xuICAgICAgICAgIHRoaXMuY29weUlkQW5kVXBkYXRlRGF0ZShzYXZlZEVudGl0eSwgZW50aXR5KTtcblxuICAgICAgICAgIC8vIEFkZCB0byBjYWNoZVxuICAgICAgICAgIGlmIChpc05ldykge1xuICAgICAgICAgICAgdGhpcy5pbnNlcnRJbnRvTXV0YWJsZUNhY2hlZFF1ZXJpZXMocHJveHkse1xuICAgICAgICAgICAgICBxdWVyeTogTG9hZEFsbFF1ZXJ5LFxuICAgICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgLi4uc2F2ZWRFbnRpdHksXG4gICAgICAgICAgICAgICAgY29udGVudDogbnVsbFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuaW5zZXJ0SW50b011dGFibGVDYWNoZWRRdWVyaWVzKHByb3h5LHtcbiAgICAgICAgICAgICAgcXVlcnk6IExvYWRBbGxXaXRoQ29udGVudFF1ZXJ5LFxuICAgICAgICAgICAgICBkYXRhOiBzYXZlZEVudGl0eVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZW50aXR5O1xuICB9XG5cblxuXG4gIC8qKlxuICAgKiBTYXZlIG1hbnkgdHJpcHNcbiAgICpcbiAgICogQHBhcmFtIGVudGl0aWVzXG4gICAqIEBwYXJhbSBvcHRzXG4gICAqL1xuICBhc3luYyBkZWxldGVBbGwoZW50aXRpZXM6IFVzZXJFdmVudFtdLCBvcHRzPzoge1xuICAgIHRyYXNoPzogYm9vbGVhbjsgLy8gVHJ1ZSBieSBkZWZhdWx0XG4gIH0pOiBQcm9taXNlPGFueT4ge1xuXG4gICAgY29uc3QgaWRzID0gZW50aXRpZXMgJiYgZW50aXRpZXNcbiAgICAgIC5tYXAodCA9PiB0LmlkKTtcbiAgICBpZiAoaXNFbXB0eUFycmF5KGlkcykpIHJldHVybjsgLy8gc3RvcCwgaWYgbm90aGluZyBlbHNlIHRvIGRvXG5cbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS5kZWJ1ZygnW3VzZXItZXZlbnQtc2VydmljZV0gRGVsZXRpbmcgZXZlbnRzLi4uIGlkczonLCBpZHMpO1xuXG4gICAgYXdhaXQgdGhpcy5ncmFwaHFsLm11dGF0ZTxhbnk+KHtcbiAgICAgIG11dGF0aW9uOiBEZWxldGVCeUlkc011dGF0aW9uLFxuICAgICAgdmFyaWFibGVzOiB7XG4gICAgICAgIGlkc1xuICAgICAgfSxcbiAgICAgIHVwZGF0ZTogKHByb3h5KSA9PiB7XG4gICAgICAgIC8vIFJlbW92ZSBmcm9tIGNhY2hlc1xuICAgICAgICB0aGlzLnJlbW92ZUZyb21NdXRhYmxlQ2FjaGVkUXVlcmllc0J5SWRzKHByb3h5LCB7XG4gICAgICAgICAgcXVlcnk6IExvYWRBbGxRdWVyeSxcbiAgICAgICAgICBpZHNcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucmVtb3ZlRnJvbU11dGFibGVDYWNoZWRRdWVyaWVzQnlJZHMocHJveHksIHtcbiAgICAgICAgICBxdWVyeTogTG9hZEFsbFdpdGhDb250ZW50UXVlcnksXG4gICAgICAgICAgaWRzXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS5kZWJ1ZyhgW3VzZXItZXZlbnQtc2VydmljZV0gRXZlbnRzIGRlbGV0ZWQgaW4gJHtEYXRlLm5vdygpIC0gbm93fW1zYCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIHVzZXJFdmVudCBlbnRpdGllc1xuICAgKi9cbiAgYXN5bmMgZGVsZXRlKGRhdGE6IFVzZXJFdmVudCk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKCFkYXRhKSByZXR1cm47IC8vIHNraXBcbiAgICBhd2FpdCB0aGlzLmRlbGV0ZUFsbChbZGF0YV0pO1xuICB9XG5cbiAgbGlzdGVuQ2hhbmdlcyhpZDogbnVtYmVyLCBvcHRpb25zPzogYW55KTogT2JzZXJ2YWJsZTxVc2VyRXZlbnQgfCB1bmRlZmluZWQ+IHtcbiAgICAvLyBUT0RPXG4gICAgY29uc29sZS53YXJuKCdUT0RPOiBpbXBsZW1lbnQgbGlzdGVuIGNoYW5nZXMgb24gdXNlciBldmVudHMnKTtcbiAgICByZXR1cm4gb2YoKTtcbiAgfVxuXG4gIHJlZ2lzdGVyQWN0aW9uKGRlZmluaXRpb246IFVzZXJFdmVudEFjdGlvbkRlZmluaXRpb24pIHtcbiAgICBjb25zb2xlLmluZm8oYFt1c2VyLWV2ZW50LXNlcnZpY2VdIFJlZ2lzdGVyaW5nIGFjdGlvbiAke2RlZmluaXRpb24ubmFtZX0gZm9yICR7ZGVmaW5pdGlvbi5fX3R5cGVuYW1lfWApO1xuICAgIHRoaXMuX3VzZXJFdmVudEFjdGlvbnMucHVzaChkZWZpbml0aW9uKTtcbiAgfVxuXG4gIGdldEFjdGlvbnNCeVR5cGVuYW1lKHR5cGVuYW1lOiBzdHJpbmcpOiBVc2VyRXZlbnRBY3Rpb248YW55PltdIHtcbiAgICByZXR1cm4gdGhpcy5fdXNlckV2ZW50QWN0aW9ucy5maWx0ZXIoZGVmID0+IGRlZi5fX3R5cGVuYW1lID09PSB0eXBlbmFtZSk7XG4gIH1cblxuICBhc3luYyBzaG93VG9hc3RFcnJvcldpdGhDb250ZXh0KG9wdHM6IHtcbiAgICBlcnJvcj86IGFueTtcbiAgICBtZXNzYWdlPzogc3RyaW5nO1xuICAgIGNvbnRleHQ6IGFueSB8ICgoKSA9PiBhbnkpIHwgUHJvbWlzZTxhbnk+O30pIHtcblxuICAgIGxldCBtZXNzYWdlID0gb3B0cy5tZXNzYWdlIHx8IChvcHRzLmVycm9yICYmIG9wdHMuZXJyb3IubWVzc2FnZSB8fCBvcHRzLmVycm9yKTtcblxuICAgIC8vIE1ha2Ugc3VyZSBtZXNzYWdlIGEgc3RyaW5nXG4gICAgaWYgKCFtZXNzYWdlIHx8IHR5cGVvZiBtZXNzYWdlICE9PSAnc3RyaW5nJykge1xuICAgICAgbWVzc2FnZSA9ICdFUlJPUi5VTktOT1dOX1RFQ0hOSUNBTF9FUlJPUic7XG4gICAgfVxuXG4gICAgLy8gSWYgb2ZmbGluZSwgZGlzcGxheSBhIHNpbXBsZSBhbGVydFxuICAgIGlmICh0aGlzLm5ldHdvcmsub2ZmbGluZSkge1xuICAgICAgdGhpcy5zaG93VG9hc3Qoe21lc3NhZ2UsIHR5cGU6ICdlcnJvcid9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBUcmFuc2xhdGUgdGhlIG1lc3NhZ2UgKHRvIGJlIGFibGUgdG8gZXh0cmFjdCBkZXRhaWxzIGNvbnRlbnQpXG4gICAgbWVzc2FnZSA9IHRoaXMudHJhbnNsYXRlLmluc3RhbnQobWVzc2FnZSk7XG5cbiAgICAvLyBDbGVhbiBkZXRhaWxzIHBhcnRzXG4gICAgaWYgKG1lc3NhZ2UgJiYgbWVzc2FnZS5pbmRleE9mKCc8c21hbGw+JykgIT09IC0xKSB7XG4gICAgICBtZXNzYWdlID0gbWVzc2FnZS5zdWJzdHIoMCwgbWVzc2FnZS5pbmRleE9mKCc8c21hbGw+JykgLSAxKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLnNob3dUb2FzdCh7XG4gICAgICB0eXBlOiAnZXJyb3InLFxuICAgICAgZHVyYXRpb246IDE1MDAwLFxuICAgICAgbWVzc2FnZTogbWVzc2FnZSArICc8YnIvPjxici8+PGI+JyArIHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ0NPTkZJUk0uU0VORF9ERUJVR19EQVRBJykgKyAnPC9iPicsXG4gICAgICBidXR0b25zOiBbe1xuICAgICAgICBpY29uOiAnYnVnJyxcbiAgICAgICAgdGV4dDogdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnQ09NTU9OLkJUTl9TRU5EJyksXG4gICAgICAgIHJvbGU6ICdzZW5kJ1xuICAgICAgfV1cbiAgICB9KTtcbiAgICBpZiAoIXJlcyB8fCByZXMucm9sZSAhPT0gJ3NlbmQnKSByZXR1cm47XG5cbiAgICAvLyBTZW5kIGRlYnVnIGRhdGFcbiAgICB0cnkge1xuICAgICAgaWYgKHRoaXMuX2RlYnVnKSBjb25zb2xlLmRlYnVnKCdTZW5kaW5nIGRlYnVnIGRhdGEuLi4nKTtcblxuICAgICAgLy8gQ2FsbCBjb250ZW50IGZhY3RvcnlcbiAgICAgIGxldCBjb250ZXh0OiBhbnkgPSBvcHRzICYmIG9wdHMuY29udGV4dDtcbiAgICAgIGlmICh0eXBlb2YgY29udGV4dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBjb250ZXh0ID0gY29udGV4dCgpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbnRleHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgIGNvbnRleHQgPSBhd2FpdCBjb250ZXh0O1xuICAgICAgfVxuXG4gICAgICAvLyBTZW5kIHRoZSBtZXNzYWdlXG4gICAgICBjb25zdCB1c2VyRXZlbnQgPSBhd2FpdCB0aGlzLnNlbmREYXRhRm9yRGVidWcoe1xuICAgICAgICBtZXNzYWdlLFxuICAgICAgICBlcnJvcjogb3B0cy5lcnJvciB8fCB1bmRlZmluZWQsXG4gICAgICAgIGNvbnRleHQ6IHRoaXMuY29udmVydE9iamVjdFRvU3RyaW5nKGNvbnRleHQpXG4gICAgICB9KTtcblxuICAgICAgY29uc29sZS5pbmZvKCdEZWJ1ZyBkYXRhIHN1Y2Nlc3NmdWxseSBzZW50IHRvIGFkbWluJywgdXNlckV2ZW50KTtcbiAgICAgIHRoaXMuc2hvd1RvYXN0KHtcbiAgICAgICAgdHlwZTogJ2luZm8nLFxuICAgICAgICBtZXNzYWdlOiAnSU5GTy5ERUJVR19EQVRBX1NFTkQnLFxuICAgICAgICBzaG93Q2xvc2VCdXR0b246IHRydWVcbiAgICAgIH0pO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdFcnJvciB3aGlsZSBzZW5kaW5nIGRlYnVnIGRhdGE6JywgZXJyKTtcbiAgICB9XG4gIH1cblxuICBzZW5kRGF0YUZvckRlYnVnKGRhdGE6IGFueSk6IFByb21pc2U8VXNlckV2ZW50PiB7XG4gICAgY29uc3QgdXNlckV2ZW50ID0gbmV3IFVzZXJFdmVudCgpO1xuICAgIHVzZXJFdmVudC5ldmVudFR5cGUgPSBVc2VyRXZlbnRUeXBlcy5ERUJVR19EQVRBO1xuICAgIHVzZXJFdmVudC5jb250ZW50ID0gdGhpcy5jb252ZXJ0T2JqZWN0VG9TdHJpbmcoZGF0YSk7XG4gICAgcmV0dXJuIHRoaXMuc2F2ZSh1c2VyRXZlbnQpO1xuICB9XG5cbiAgYXNGaWx0ZXIoZmlsdGVyOiBQYXJ0aWFsPFVzZXJFdmVudEZpbHRlcj4pOiBVc2VyRXZlbnRGaWx0ZXIge1xuICAgIHJldHVybiBVc2VyRXZlbnRGaWx0ZXIuZnJvbU9iamVjdChmaWx0ZXIpO1xuICB9XG5cbiAgLyogLS0gcHJvdGVjdGVkIG1ldGhvZHMgLS0gKi9cblxuICBwcm90ZWN0ZWQgY29udmVydE9iamVjdFRvU3RyaW5nKGRhdGE6IGFueSk6IHN0cmluZyB7XG4gICAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJyl7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG4gICAgLy8gU2VyaWFsaXplIGNvbnRlbnQgaW50byBzdHJpbmdcbiAgICBlbHNlIGlmICh0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcpe1xuICAgICAgaWYgKGRhdGEgaW5zdGFuY2VvZiBFbnRpdHkpIHtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGRhdGEuYXNPYmplY3Qoe2tlZXBUeXBlbmFtZTogdHJ1ZSwga2VlcExvY2FsSWQ6IHRydWUsIG1pbmlmeTogZmFsc2V9KSk7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGRhdGEpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBzaG93VG9hc3Q8VD1hbnk+KG9wdHM6IFNob3dUb2FzdE9wdGlvbnMpOiBQcm9taXNlPE92ZXJsYXlFdmVudERldGFpbDxUPj4ge1xuICAgIGlmICghdGhpcy50b2FzdENvbnRyb2xsZXIpIHRocm93IG5ldyBFcnJvcignTWlzc2luZyB0b2FzdENvbnRyb2xsZXIgaW4gY29tcG9uZW50XFwncyBjb25zdHJ1Y3RvcicpO1xuICAgIHJldHVybiBhd2FpdCBUb2FzdHMuc2hvdyh0aGlzLnRvYXN0Q29udHJvbGxlciwgdGhpcy50cmFuc2xhdGUsIG9wdHMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGZpbGxEZWZhdWx0UHJvcGVydGllcyhlbnRpdHk6IFVzZXJFdmVudCkge1xuICAgIGVudGl0eS5pc3N1ZXIgPSB0aGlzLmFjY291bnRTZXJ2aWNlLmFjY291bnQucHVia2V5O1xuXG4gICAgLy8gVE9ETzogY29tcHV0ZSBoYXNoICh1c2luZyBjcnlwdG9TZXJ2aWNlKVxuICAgIC8vIFRPRE86IGNvbXB1dGUgc2lnblxuICAgIGNvbnNvbGUud2FybignVE9ETzogc2lnbiB1c2VyIGV2ZW50IGJlZm9yZSBzZW5kaW5nJyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY29weUlkQW5kVXBkYXRlRGF0ZShzb3VyY2U6IFVzZXJFdmVudCwgdGFyZ2V0OiBVc2VyRXZlbnQpIHtcbiAgICBFbnRpdHlVdGlscy5jb3B5SWRBbmRVcGRhdGVEYXRlKHNvdXJjZSwgdGFyZ2V0KTtcbiAgfVxufVxuIl19
|
|
606
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1ldmVudC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9zb2NpYWwvdXNlci1ldmVudC91c2VyLWV2ZW50LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQWEsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25HLE9BQU8sRUFBZSxHQUFHLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDckUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFjLEVBQUUsRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDNUUsT0FBTyxFQUFnQyxTQUFTLEVBQUUsZUFBZSxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzlHLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRzVELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckUsT0FBTyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDMUUsT0FBTyxFQUFvQixNQUFNLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUVyRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDakQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFDQUFxQyxDQUFD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TyxDQUFDLElBQUksQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7OztZQS9IRixVQUFVOzs7WUE5bEJGLGNBQWM7WUFEZCxjQUFjO1lBYWQsY0FBYztZQURkLGdCQUFnQjtZQURoQixlQUFlO1lBS2YsV0FBVyx1QkF5bEJmLFFBQVEsWUFBSSxNQUFNLFNBQUMsV0FBVyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgSW5qZWN0LCBJbmplY3RhYmxlLCBJbmplY3Rpb25Ub2tlbiwgT25EZXN0cm95LCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRmV0Y2hQb2xpY3ksIGdxbCB9IGZyb20gJ0BhcG9sbG8vY2xpZW50L2NvcmUnO1xuaW1wb3J0IHsgU29jaWFsRXJyb3JDb2RlcyB9IGZyb20gJy4uL3NvY2lhbC5lcnJvcnMnO1xuaW1wb3J0IHsgQWNjb3VudFNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL3NlcnZpY2VzL2FjY291bnQuc2VydmljZSc7XG5pbXBvcnQgeyBHcmFwaHFsU2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvZ3JhcGhxbC9ncmFwaHFsLnNlcnZpY2UnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBtZXJnZSwgT2JzZXJ2YWJsZSwgb2YsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgSVVzZXJFdmVudCwgSVVzZXJFdmVudEZpbHRlciwgVXNlckV2ZW50LCBVc2VyRXZlbnRGaWx0ZXIsIFVzZXJFdmVudFR5cGVzIH0gZnJvbSAnLi91c2VyLWV2ZW50Lm1vZGVsJztcbmltcG9ydCB7IFVzZXJFdmVudEZyYWdtZW50cyB9IGZyb20gJy4vdXNlci1ldmVudC5mcmFnbWVudHMnO1xuaW1wb3J0IHsgU29ydERpcmVjdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NvcnQnO1xuaW1wb3J0IHsgRW50aXRpZXNTZXJ2aWNlV2F0Y2hPcHRpb25zLCBFbnRpdHlTZXJ2aWNlTG9hZE9wdGlvbnMsIElFbnRpdGllc1NlcnZpY2UsIExvYWRSZXN1bHQsIFBhZ2UgfSBmcm9tICcuLi8uLi9zaGFyZWQvc2VydmljZXMvZW50aXR5LXNlcnZpY2UuY2xhc3MnO1xuaW1wb3J0IHsgZGlzdGluY3RVbnRpbENoYW5nZWQsIG1hcCwgbWVyZ2VNYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBpc0VtcHR5QXJyYXksIGlzTm90TmlsLCB0b051bWJlciB9IGZyb20gJy4uLy4uL3NoYXJlZC9mdW5jdGlvbnMnO1xuaW1wb3J0IHsgU2hvd1RvYXN0T3B0aW9ucywgVG9hc3RzIH0gZnJvbSAnLi4vLi4vc2hhcmVkL3RvYXN0L3RvYXN0cyc7XG5pbXBvcnQgeyBPdmVybGF5RXZlbnREZXRhaWwgfSBmcm9tICdAaW9uaWMvY29yZSc7XG5pbXBvcnQgeyBUb2FzdENvbnRyb2xsZXIgfSBmcm9tICdAaW9uaWMvYW5ndWxhcic7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBOZXR3b3JrU2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvc2VydmljZXMvbmV0d29yay5zZXJ2aWNlJztcbmltcG9ydCB7IEJhc2VHcmFwaHFsU2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvc2VydmljZXMvYmFzZS1ncmFwaHFsLXNlcnZpY2UuY2xhc3MnO1xuaW1wb3J0IHsgRW50aXR5LCBFbnRpdHlVdGlscyB9IGZyb20gJy4uLy4uL2NvcmUvc2VydmljZXMvbW9kZWwvZW50aXR5Lm1vZGVsJztcbmltcG9ydCB7IEVudmlyb25tZW50LCBFTlZJUk9OTUVOVCB9IGZyb20gJy4uLy4uLy4uL2Vudmlyb25tZW50cy9lbnZpcm9ubWVudC5jbGFzcyc7XG5pbXBvcnQgeyBEYXRlVXRpbHMgfSBmcm9tICcuLi8uLi9zaGFyZWQvZGF0ZXMnO1xuaW1wb3J0ICogYXMgbW9tZW50SW1wb3J0ZWQgZnJvbSAnbW9tZW50JztcbmltcG9ydCB7IE1vbWVudCB9IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgeyBJU3RhcnRhYmxlU2VydmljZSB9IGZyb20gJy4uLy4uL3NoYXJlZC9zZXJ2aWNlcy9zdGFydGFibGUtc2VydmljZS5jbGFzcyc7XG5cbmNvbnN0IG1vbWVudCA9IG1vbWVudEltcG9ydGVkO1xuXG5leHBvcnQgY29uc3QgVXNlckV2ZW50U2VydmljZVRva2VuID0gbmV3IEluamVjdGlvblRva2VuPElVc2VyRXZlbnRTZXJ2aWNlPGFueSwgYW55Pj4oJ1VzZXJFdmVudFNlcnZpY2UnKTtcblxuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIFVzZXJFdmVudFdhdGNoT3B0aW9ucyBleHRlbmRzIEVudGl0aWVzU2VydmljZVdhdGNoT3B0aW9ucyB7XG4gIHdpdGhDb250ZW50PzogYm9vbGVhbjsgLy8gRGVmYXVsdCB0byBmYWxzZVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElVc2VyRXZlbnRRdWVyaWVzIHtcbiAgbG9hZEFsbDogYW55O1xuICBsb2FkQWxsV2l0aENvbnRlbnQ6IGFueTtcbiAgY291bnQ/OiBhbnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVVzZXJFdmVudE11dGF0aW9ucyB7XG4gIHNhdmU6IGFueTtcbiAgbWFya0FzUmVhZD86IGFueTtcbiAgZGVsZXRlQnlJZHM6IGFueTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJVXNlckV2ZW50U3Vic2NyaXB0aW9ucyB7XG4gIGxpc3RlbkNoYW5nZXM6IGFueTtcbiAgbGlzdGVuQ291bnRDaGFuZ2VzPzogYW55O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElVc2VyRXZlbnRMaXN0ZW5lcjxFIGV4dGVuZHMgSVVzZXJFdmVudDxFPj4ge1xuICBhY2NlcHQ6IChFKSA9PiBib29sZWFuO1xuICBvblJlY2VpdmVkPzogKEUpID0+IEUgfCB1bmRlZmluZWQ7XG4gIG9uUmVhZD86IChFKSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZDtcbn1cblxuXG5leHBvcnQgaW50ZXJmYWNlIElVc2VyRXZlbnRTZXJ2aWNlPEUgZXh0ZW5kcyBJVXNlckV2ZW50PEU+LFxuICBGIGV4dGVuZHMgSVVzZXJFdmVudEZpbHRlcjxFPixcbiAgV08gZXh0ZW5kcyBVc2VyRXZlbnRXYXRjaE9wdGlvbnMgPSBVc2VyRXZlbnRXYXRjaE9wdGlvbnM+XG4gIGV4dGVuZHMgSUVudGl0aWVzU2VydmljZTxFLCBGLCBXTz4sIElTdGFydGFibGVTZXJ2aWNlIHtcblxuICB1c2VyRXZlbnRDb3VudDogT2JzZXJ2YWJsZTxudW1iZXI+O1xuXG4gIGFkZChlbnRpdHk6IEUpO1xuXG4gIGNvdW50KGZpbHRlcjogUGFydGlhbDxGPiwgb3B0aW9ucz86IHsgZmV0Y2hQb2xpY3k/OiBGZXRjaFBvbGljeTsgfSk6IFByb21pc2U8bnVtYmVyPjtcblxuICBsaXN0ZW5Db3VudENoYW5nZXMoZmlsdGVyOiBQYXJ0aWFsPEY+LCBvcHRpb25zPzogV08gJiB7IGludGVydmFsPzogbnVtYmVyOyBmZXRjaFBvbGljeT86IEZldGNoUG9saWN5OyB9KTogT2JzZXJ2YWJsZTxudW1iZXI+O1xuXG4gIGxpc3RlbkNoYW5nZXMoZmlsdGVyOiBQYXJ0aWFsPEY+LCBvcHRpb25zPzogV08gJiB7IGludGVydmFsPzogbnVtYmVyOyBmZXRjaFBvbGljeT86IEZldGNoUG9saWN5OyB9KTogT2JzZXJ2YWJsZTxFW10+O1xuXG4gIHNhdmUoZW50aXR5OiBFLCBvcHRpb25zPzogRW50aXR5U2VydmljZUxvYWRPcHRpb25zKTogUHJvbWlzZTxFPjtcblxuICBkZWxldGUoZW50aXR5OiBFKTogUHJvbWlzZTxhbnk+O1xuXG4gIG1hcmtBc1JlYWQoZW50aXRpZXM6IEVbXSk7XG5cbiAgcmVnaXN0ZXJMaXN0ZW5lcihsaXN0ZW5lcjogSVVzZXJFdmVudExpc3RlbmVyPEU+KTtcblxuICByZXNldENvdW50KCk7XG59XG5cbkBEaXJlY3RpdmUoKVxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VXNlckV2ZW50U2VydmljZTxFIGV4dGVuZHMgSVVzZXJFdmVudDxFLCBhbnk+LFxuICBGIGV4dGVuZHMgSVVzZXJFdmVudEZpbHRlcjxFLCBhbnk+LFxuICBXTyBleHRlbmRzIFVzZXJFdmVudFdhdGNoT3B0aW9ucyA9IFVzZXJFdmVudFdhdGNoT3B0aW9ucz5cbiAgZXh0ZW5kcyBCYXNlR3JhcGhxbFNlcnZpY2U8RSwgRj5cbiAgaW1wbGVtZW50cyBJVXNlckV2ZW50U2VydmljZTxFLCBGLCBXTz4sIE9uRGVzdHJveSB7XG5cbiAgcHJvdGVjdGVkIGNvdW50JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPigwKTtcbiAgcHJvdGVjdGVkIHJlc2V0Q291bnREYXRlOiBNb21lbnQ7XG4gIHByb3RlY3RlZCBsaXN0ZW5lcnM6IElVc2VyRXZlbnRMaXN0ZW5lcjxFPltdID0gW107XG4gIHByaXZhdGUgX3N1YnNjcmlwdGlvbnMgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gIHByaXZhdGUgX2xpc3RlblN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuXG4gIGdldCB1c2VyRXZlbnRDb3VudCgpOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xuICAgIHJldHVybiB0aGlzLmNvdW50JC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgZ3JhcGhxbDogR3JhcGhxbFNlcnZpY2UsXG4gICAgcHJvdGVjdGVkIGFjY291bnRTZXJ2aWNlOiBBY2NvdW50U2VydmljZSxcbiAgICBwcm90ZWN0ZWQgbmV0d29yazogTmV0d29ya1NlcnZpY2UsXG4gICAgcHJvdGVjdGVkIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgcXVlcmllczogSVVzZXJFdmVudFF1ZXJpZXMsXG4gICAgcHJvdGVjdGVkIG11dGF0aW9uczogSVVzZXJFdmVudE11dGF0aW9ucyxcbiAgICBwcm90ZWN0ZWQgc3Vic2NyaXB0aW9uczogSVVzZXJFdmVudFN1YnNjcmlwdGlvbnMsXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChFTlZJUk9OTUVOVCkgcHJvdGVjdGVkIGVudmlyb25tZW50OiBFbnZpcm9ubWVudFxuICApIHtcbiAgICBzdXBlcihncmFwaHFsLCBlbnZpcm9ubWVudCk7XG4gICAgdGhpcy5fbG9nUHJlZml4ID0gJ1t1c2VyLWV2ZW50LXNlcnZpY2VdICc7XG4gICAgLy8gRm9yIERFViBvbmx5XG4gICAgdGhpcy5fZGVidWcgPSAhZW52aXJvbm1lbnQ/LnByb2R1Y3Rpb247XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgbmdPblN0YXJ0KCk6IFByb21pc2U8dm9pZD4ge1xuXG4gICAgLy8gVXBkYXRlIGNvbXBvbmVudCB3aGVuIHJlZnJlc2ggaXMgbmVlZCAoPWxvZ2luIGV2ZW50cylcbiAgICB0aGlzLl9zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgIG1lcmdlKFxuICAgICAgICB0aGlzLmFjY291bnRTZXJ2aWNlLm9uTG9naW4sXG4gICAgICAgIHRoaXMuYWNjb3VudFNlcnZpY2Uub25Mb2dvdXRcbiAgICAgIClcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgLy8gV2FpdCBhY2NvdW50IHNlcnZpY2UgcmVhZHkgKGNhbiBiZSByZXN0YXJ0ZWQpXG4gICAgICAgICAgbWVyZ2VNYXAoKCkgPT4gdGhpcy5hY2NvdW50U2VydmljZS5yZWFkeSgpKSxcbiAgICAgICAgICBtYXAoKCkgPT4gdGhpcy5hY2NvdW50U2VydmljZS5pc0xvZ2luKCkpLFxuICAgICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKClcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKGxvZ2luID0+IHtcbiAgICAgICAgICBpZiAobG9naW4pIHtcbiAgICAgICAgICAgIHRoaXMub25Mb2dpbigpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm9uTG9nb3V0KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KSk7XG5cbiAgICAvLyBGaXJzdCBhdHRlbXB0IGlmIGFjY291bnQgaXMgcmVhZHlcbiAgICBhd2FpdCB0aGlzLmFjY291bnRTZXJ2aWNlLnJlYWR5KCk7XG4gICAgaWYgKHRoaXMuYWNjb3VudFNlcnZpY2UuaXNMb2dpbigpKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMub25Mb2dpbigpKTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLl9zdWJzY3JpcHRpb25zLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBhYnN0cmFjdCBhc0ZpbHRlcihmaWx0ZXI6IFBhcnRpYWw8Rj4pOiBGO1xuXG4gIGFic3RyYWN0IGZyb21PYmplY3Qoc291cmNlOiBhbnkpOiBFO1xuXG4gIHdhdGNoQWxsKG9mZnNldDogbnVtYmVyLCBzaXplOiBudW1iZXIsIHNvcnRCeT86IHN0cmluZywgc29ydERpcmVjdGlvbj86IFNvcnREaXJlY3Rpb24sIGZpbHRlcj86IFBhcnRpYWw8Rj4sIG9wdGlvbnM/OiBXTyk6IE9ic2VydmFibGU8TG9hZFJlc3VsdDxFPj4ge1xuICAgIHJldHVybiB0aGlzLndhdGNoUGFnZSg8UGFnZT57IG9mZnNldCwgc2l6ZSwgc29ydEJ5LCBzb3J0RGlyZWN0aW9uIH0sIGZpbHRlciwgb3B0aW9ucyk7XG4gIH1cblxuICB3YXRjaFBhZ2UocGFnZTogUGFnZSxcbiAgICAgICAgICAgIGZpbHRlcj86IFBhcnRpYWw8Rj4sXG4gICAgICAgICAgICBvcHRpb25zPzogV08pOiBPYnNlcnZhYmxlPExvYWRSZXN1bHQ8RT4+IHtcblxuICAgIGxldCBub3cgPSB0aGlzLl9kZWJ1ZyAmJiBEYXRlLm5vdygpO1xuICAgIGlmICghZmlsdGVyKSB7XG4gICAgICBmaWx0ZXIgPSB0aGlzLmRlZmF1bHRGaWx0ZXIoKTtcbiAgICB9XG4gICAgY29uc29sZS5kZWJ1ZyhgJHt0aGlzLl9sb2dQcmVmaXh9TG9hZGluZyB1c2VyIGV2ZW50cy4uLmAsIGZpbHRlcik7XG5cbiAgICBmaWx0ZXIgPSB0aGlzLmFzRmlsdGVyKGZpbHRlcik7XG5cbiAgICAvLyBGb3JjZSByZWNpcGllbnQgdG8gY3VycmVudCBpc3N1ZXIsIGlmIG5vdCBhZG1pbiBhbmQgbm90IHNwZWNpZmllZFxuICAgIGlmIChpc0VtcHR5QXJyYXkoZmlsdGVyPy5yZWNpcGllbnRzKSB8fCAhdGhpcy5hY2NvdW50U2VydmljZS5pc0FkbWluKCkpIHtcbiAgICAgIGNvbnN0IHJlY2lwaWVudCA9IHRoaXMuZGVmYXVsdFJlY2lwaWVudCgpO1xuICAgICAgaWYgKCFmaWx0ZXI/LnJlY2lwaWVudHM/LmluY2x1ZGVzKHJlY2lwaWVudCkpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbdXNlci1ldmVudHMtc2VydmljZV0gRm9yY2UgdXNlciBldmVudCBmaWx0ZXIucmVjaXBpZW50PScgKyByZWNpcGllbnQpO1xuICAgICAgICBmaWx0ZXIucmVjaXBpZW50cyA9IFtyZWNpcGllbnRdO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHdpdGhDb250ZW50ID0gb3B0aW9ucz8ud2l0aENvbnRlbnQgPT09IHRydWU7XG5cbiAgICByZXR1cm4gdGhpcy5tdXRhYmxlV2F0Y2hRdWVyeTxMb2FkUmVzdWx0PEU+LCB7IGZpbHRlcjogYW55LCBwYWdlOiBQYWdlIH0+KHtcbiAgICAgIHF1ZXJ5TmFtZTogd2l0aENvbnRlbnQgPyAnTG9hZEFsbFdpdGhDb250ZW50JyA6ICdMb2FkQWxsJyxcbiAgICAgIHF1ZXJ5OiB3aXRoQ29udGVudCA/IHRoaXMucXVlcmllcy5sb2FkQWxsV2l0aENvbnRlbnQgOiB0aGlzLnF1ZXJpZXMubG9hZEFsbCxcbiAgICAgIHZhcmlhYmxlczoge1xuICAgICAgICBwYWdlOiB7XG4gICAgICAgICAgc29ydEJ5OiAnY3JlYXRpb25EYXRlJyxcbiAgICAgICAgICAuLi5wYWdlLFxuICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICBzb3J0RGlyZWN0aW9uOiAocGFnZS5zb3J0RGlyZWN0aW9uIHx8ICdkZXNjJykudG9VcHBlckNhc2UoKVxuICAgICAgICB9LFxuICAgICAgICBmaWx0ZXI6IGZpbHRlciAmJiBmaWx0ZXIuYXNQb2RPYmplY3QoKVxuICAgICAgfSxcbiAgICAgIGFycmF5RmllbGROYW1lOiAnZGF0YScsXG4gICAgICBlcnJvcjogeyBjb2RlOiBTb2NpYWxFcnJvckNvZGVzLkxPQURfVVNFUl9FVkVOVFNfRVJST1IsIG1lc3NhZ2U6ICdTT0NJQUwuRVJST1IuTE9BRF9VU0VSX0VWRU5UU19FUlJPUicgfSxcbiAgICAgIGZldGNoUG9saWN5OiBvcHRpb25zPy5mZXRjaFBvbGljeSB8fCAnY2FjaGUtZmlyc3QnXG4gICAgfSlcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAocmVzID0+IHtcbiAgICAgICAgICBsZXQgZGF0YSA9IChyZXM/LmRhdGEgfHwgW10pLm1hcCh2YWx1ZSA9PiB0aGlzLnByb2Nlc3NVc2VyRXZlbnQodmFsdWUsIHRoaXMpKTtcblxuICAgICAgICAgIGlmIChub3cpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoYCR7dGhpcy5fbG9nUHJlZml4fSR7ZGF0YS5sZW5ndGh9IHVzZXIgZXZlbnRzIGxvYWRlZCBpbiAke0RhdGUubm93KCkgLSBub3d9bXNgKTtcbiAgICAgICAgICAgIG5vdyA9IG51bGw7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gTXVzdCByZS1vcmRlciBiZWNhdXNlIG9mIGxpc3RlbkNoYW5nZXMgcmVzdWx0IHdpbGwgYWRkIG5ldyBldmVudCBhdCB0aGUgZW5kXG4gICAgICAgICAgZGF0YSA9IEVudGl0eVV0aWxzLnNvcnQoZGF0YSwgcGFnZS5zb3J0QnksIHBhZ2Uuc29ydERpcmVjdGlvbik7XG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgIHRvdGFsOiB0b051bWJlcihyZXM/LnRvdGFsLCBkYXRhLmxlbmd0aClcbiAgICAgICAgICB9O1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgfVxuXG4gIGFkZChlbnRpdHk6IEUpIHtcblxuICAgIC8vIFRPRE8gc2V0IGFuIGlkICEhISEhISEhISEhISEhISEhISEhISEhISFcblxuICAgIGVudGl0eSA9IHRoaXMucHJvY2Vzc1VzZXJFdmVudChlbnRpdHkpO1xuXG4gICAgY29uc3Qgd2l0aENvbnRlbnQgPSAhIWVudGl0eS5jb250ZW50O1xuXG4gICAgLy8gQWRkIHVzZXIgZXZlbnQgbG9jYWxseVxuICAgIHRoaXMuaW5zZXJ0SW50b011dGFibGVDYWNoZWRRdWVyaWVzKFxuICAgICAgdGhpcy5ncmFwaHFsLmNhY2hlLFxuICAgICAge1xuICAgICAgICBxdWVyeTogd2l0aENvbnRlbnQgPyB0aGlzLnF1ZXJpZXMubG9hZEFsbFdpdGhDb250ZW50IDogdGhpcy5xdWVyaWVzLmxvYWRBbGwsXG4gICAgICAgIGRhdGE6IGVudGl0eVxuICAgICAgfVxuICAgICk7XG5cbiAgICAvLyBVcGRhdGUgY291bnRcbiAgICB0aGlzLmNvdW50JC5uZXh0KHRoaXMuY291bnQkLnZhbHVlICsgMSk7XG4gIH1cblxuICBhc3luYyBjb3VudChmaWx0ZXI6IFBhcnRpYWw8Rj4sIG9wdGlvbnM/OiB7IGZldGNoUG9saWN5PzogRmV0Y2hQb2xpY3k7IH0pOiBQcm9taXNlPG51bWJlcj4ge1xuXG4gICAgaWYgKCF0aGlzLnF1ZXJpZXM/LmNvdW50KSB7XG4gICAgICBjb25zb2xlLndhcm4oYCR7dGhpcy5fbG9nUHJlZml4fVF1ZXJ5ICdjb3VudCcgbm90IHByb3ZpZGVkLCBza2lwLmApO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAoIWZpbHRlcikgZmlsdGVyID0gdGhpcy5kZWZhdWx0RmlsdGVyKCk7XG4gICAgLy8gQXBwbHkgbGFzdCByZXNldCBkYXRlIGFzIHN0YXJ0IGRhdGVcbiAgICBmaWx0ZXIuc3RhcnREYXRlID0gdGhpcy5yZXNldENvdW50RGF0ZTtcbiAgICBmaWx0ZXIgPSB0aGlzLmFzRmlsdGVyKGZpbHRlcik7XG5cbiAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoYCR7dGhpcy5fbG9nUHJlZml4fUNvdW50aW5nIHVzZXIgZXZlbnRzIHdpdGggZmlsdGVyOmAsIGZpbHRlcik7XG5cbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmdyYXBocWwucXVlcnk8eyB0b3RhbDogbnVtYmVyOyB9Pih7XG4gICAgICBxdWVyeTogdGhpcy5xdWVyaWVzLmNvdW50LFxuICAgICAgdmFyaWFibGVzOiB7XG4gICAgICAgIGZpbHRlcjogZmlsdGVyLmFzUG9kT2JqZWN0KClcbiAgICAgIH0sXG4gICAgICBlcnJvcjogeyBjb2RlOiBTb2NpYWxFcnJvckNvZGVzLkNPVU5UX1VTRVJfRVZFTlRfRVJST1IsIG1lc3NhZ2U6ICdTT0NJQUwuRVJST1IuQ09VTlRfVVNFUl9FVkVOVF9FUlJPUicgfSxcbiAgICAgIGZldGNoUG9saWN5OiBvcHRpb25zPy5mZXRjaFBvbGljeSB8fCAnbmV0d29yay1vbmx5J1xuICAgIH0pO1xuICAgIHJldHVybiByZXMudG90YWw7XG4gIH1cblxuICBsaXN0ZW5Db3VudENoYW5nZXMoZmlsdGVyOiBQYXJ0aWFsPEY+LCBvcHRpb25zPzogV08gJiB7IGludGVydmFsPzogbnVtYmVyOyBmZXRjaFBvbGljeT86IEZldGNoUG9saWN5IH0pOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xuXG4gICAgaWYgKCF0aGlzLnN1YnNjcmlwdGlvbnM/Lmxpc3RlbkNvdW50Q2hhbmdlcykge1xuICAgICAgY29uc29sZS53YXJuKGAke3RoaXMuX2xvZ1ByZWZpeH1TdWJzY3JpcHRpb24gcXVlcnkgJ2xpc3RlbkNvdW50Q2hhbmdlcycgbm90IHByb3ZpZGVkLCBza2lwLmApO1xuICAgICAgcmV0dXJuIG9mKCk7XG4gICAgfVxuXG4gICAgaWYgKCFmaWx0ZXIpIGZpbHRlciA9IHRoaXMuZGVmYXVsdEZpbHRlcigpO1xuICAgIC8vIEFwcGx5IGxhc3QgcmVzZXQgZGF0ZSBhcyBzdGFydCBkYXRlXG4gICAgZmlsdGVyLnN0YXJ0RGF0ZSA9IHRoaXMucmVzZXRDb3VudERhdGVcbiAgICBmaWx0ZXIgPSB0aGlzLmFzRmlsdGVyKGZpbHRlcik7XG5cbiAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoYCR7dGhpcy5fbG9nUHJlZml4fVtXU10gTGlzdGVuaW5nIGNvdW50IGNoYW5nZXMgZm9yIHVzZXIgZXZlbnRzIHdpdGggZmlsdGVyOmAsIGZpbHRlcik7XG5cbiAgICByZXR1cm4gdGhpcy5ncmFwaHFsLnN1YnNjcmliZTx7IHRvdGFsOiBudW1iZXIgfSwgeyBmaWx0ZXI6IGFueSwgaW50ZXJ2YWw6IG51bWJlciB9Pih7XG4gICAgICBxdWVyeTogdGhpcy5zdWJzY3JpcHRpb25zLmxpc3RlbkNvdW50Q2hhbmdlcyxcbiAgICAgIGZldGNoUG9saWN5OiBvcHRpb25zPy5mZXRjaFBvbGljeSxcbiAgICAgIHZhcmlhYmxlczogeyBmaWx0ZXI6IGZpbHRlci5hc1BvZE9iamVjdCgpLCBpbnRlcnZhbDogdG9OdW1iZXIob3B0aW9ucz8uaW50ZXJ2YWwsIDEwKSB9LFxuICAgICAgZXJyb3I6IHtcbiAgICAgICAgY29kZTogU29jaWFsRXJyb3JDb2Rlcy5TVUJTQ1JJQkVfVVNFUl9FVkVOVFNfRVJST1IsXG4gICAgICAgIG1lc3NhZ2U6ICdTT0NJQUwuRVJST1IuU1VCU0NSSUJFX1VTRVJfRVZFTlRTX0VSUk9SJ1xuICAgICAgfVxuICAgIH0pLnBpcGUoXG4gICAgICBtYXAoKHsgdG90YWwgfSkgPT4ge1xuICAgICAgICAgIGlmICh0b3RhbCAmJiB0aGlzLl9kZWJ1ZykgY29uc29sZS5kZWJ1ZyhgJHt0aGlzLl9sb2dQcmVmaXh9UmVjZWl2ZWQgbmV3IHVzZXIgZXZlbnRzIGNvdW50OmAsIHRvdGFsKTtcbiAgICAgICAgICAvLyB1cGRhdGUgY291bnRcbiAgICAgICAgICB0aGlzLmNvdW50JC5uZXh0KHRvdGFsKTtcbiAgICAgICAgICByZXR1cm4gdG90YWw7XG4gICAgICAgIH1cbiAgICAgIClcbiAgICApO1xuXG4gIH1cblxuICBsaXN0ZW5DaGFuZ2VzKGZpbHRlcjogUGFydGlhbDxGPiwgb3B0aW9ucz86IFdPICYgeyBpbnRlcnZhbD86IG51bWJlcjsgZmV0Y2hQb2xpY3k/OiBGZXRjaFBvbGljeTsgfSk6IE9ic2VydmFibGU8RVtdPiB7XG5cbiAgICBpZiAoIXRoaXMuc3Vic2NyaXB0aW9ucz8ubGlzdGVuQ2hhbmdlcykge1xuICAgICAgY29uc29sZS53YXJuKGAke3RoaXMuX2xvZ1ByZWZpeH1TdWJzY3JpcHRpb24gcXVlcnkgJ2xpc3RlbkNoYW5nZXMnIG5vdCBwcm92aWRlZCwgc2tpcC5gKTtcbiAgICAgIHJldHVybiBvZigpO1xuICAgIH1cblxuICAgIGlmICghZmlsdGVyKSBmaWx0ZXIgPSB0aGlzLmRlZmF1bHRGaWx0ZXIoKTtcbiAgICBmaWx0ZXIgPSB0aGlzLmFzRmlsdGVyKGZpbHRlcik7XG5cbiAgICBjb25zdCB3aXRoQ29udGVudCA9IG9wdGlvbnM/LndpdGhDb250ZW50ID09PSB0cnVlO1xuXG4gICAgaWYgKHRoaXMuX2RlYnVnKSBjb25zb2xlLmRlYnVnKGAke3RoaXMuX2xvZ1ByZWZpeH1bV1NdIExpc3RlbmluZyBjaGFuZ2VzIGZvciB1c2VyIGV2ZW50cyB3aXRoIGZpbHRlcjpgLCBmaWx0ZXIpO1xuXG4gICAgcmV0dXJuIHRoaXMuZ3JhcGhxbC5zdWJzY3JpYmU8eyBkYXRhOiBhbnlbXSB9LCB7IGZpbHRlcjogYW55LCBpbnRlcnZhbDogbnVtYmVyIH0+KHtcbiAgICAgIHF1ZXJ5OiB0aGlzLnN1YnNjcmlwdGlvbnMubGlzdGVuQ2hhbmdlcyxcbiAgICAgIGZldGNoUG9saWN5OiBvcHRpb25zPy5mZXRjaFBvbGljeSxcbiAgICAgIHZhcmlhYmxlczogeyBmaWx0ZXI6IGZpbHRlci5hc1BvZE9iamVjdCgpLCBpbnRlcnZhbDogdG9OdW1iZXIob3B0aW9ucz8uaW50ZXJ2YWwsIDEwKSB9LFxuICAgICAgZXJyb3I6IHtcbiAgICAgICAgY29kZTogU29jaWFsRXJyb3JDb2Rlcy5TVUJTQ1JJQkVfVVNFUl9FVkVOVFNfRVJST1IsXG4gICAgICAgIG1lc3NhZ2U6ICdTT0NJQUwuRVJST1IuU1VCU0NSSUJFX1VTRVJfRVZFTlRTX0VSUk9SJ1xuICAgICAgfVxuICAgIH0pLnBpcGUoXG4gICAgICBtYXAoKHsgZGF0YSB9KSA9PiB7XG4gICAgICAgICAgaWYgKGRhdGEgJiYgdGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoYCR7dGhpcy5fbG9nUHJlZml4fVJlY2VpdmVkIG5ldyB1c2VyIGV2ZW50czpgLCBkYXRhKTtcbiAgICAgICAgICBjb25zdCB1cGRhdGVkRGF0YSA9IGRhdGE/Lm1hcCh2YWx1ZSA9PiB0aGlzLnByb2Nlc3NVc2VyRXZlbnQodmFsdWUsIHRoaXMpKTtcbiAgICAgICAgICAvLyBVcGRhdGUgY2FjaGVcbiAgICAgICAgICB0aGlzLmluc2VydEludG9NdXRhYmxlQ2FjaGVkUXVlcmllcyhcbiAgICAgICAgICAgIHRoaXMuZ3JhcGhxbC5jYWNoZSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgcXVlcnk6IHdpdGhDb250ZW50ID8gdGhpcy5xdWVyaWVzLmxvYWRBbGxXaXRoQ29udGVudCA6IHRoaXMucXVlcmllcy5sb2FkQWxsLFxuICAgICAgICAgICAgICBkYXRhOiB1cGRhdGVkRGF0YVxuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIHVwZGF0ZWREYXRhO1xuICAgICAgICB9XG4gICAgICApXG4gICAgKTtcblxuICB9XG5cbiAgYXN5bmMgZGVsZXRlKGVudGl0eTogRSk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKCFlbnRpdHkpIHJldHVybjsgLy8gc2tpcFxuICAgIGF3YWl0IHRoaXMuZGVsZXRlQWxsKFtlbnRpdHldKTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZUFsbChlbnRpdGllczogRVtdLCBvcHRzPzogYW55KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBpZHMgPSBlbnRpdGllcyAmJiBlbnRpdGllc1xuICAgICAgLm1hcCh0ID0+IHQuaWQpO1xuICAgIGlmIChpc0VtcHR5QXJyYXkoaWRzKSkgcmV0dXJuOyAvLyBzdG9wLCBpZiBub3RoaW5nIGVsc2UgdG8gZG9cblxuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgaWYgKHRoaXMuX2RlYnVnKSBjb25zb2xlLmRlYnVnKGAke3RoaXMuX2xvZ1ByZWZpeH1EZWxldGluZyBldmVudHMuLi4gaWRzOmAsIGlkcyk7XG5cbiAgICBhd2FpdCB0aGlzLmdyYXBocWwubXV0YXRlPGFueT4oe1xuICAgICAgbXV0YXRpb246IHRoaXMubXV0YXRpb25zLmRlbGV0ZUJ5SWRzLFxuICAgICAgdmFyaWFibGVzOiB7XG4gICAgICAgIGlkc1xuICAgICAgfSxcbiAgICAgIHVwZGF0ZTogKHByb3h5KSA9PiB7XG4gICAgICAgIC8vIFJlbW92ZSBmcm9tIGNhY2hlc1xuICAgICAgICB0aGlzLnJlbW92ZUZyb21NdXRhYmxlQ2FjaGVkUXVlcmllc0J5SWRzKHByb3h5LCB7XG4gICAgICAgICAgcXVlcnk6IHRoaXMucXVlcmllcy5sb2FkQWxsLFxuICAgICAgICAgIGlkc1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5yZW1vdmVGcm9tTXV0YWJsZUNhY2hlZFF1ZXJpZXNCeUlkcyhwcm94eSwge1xuICAgICAgICAgIHF1ZXJ5OiB0aGlzLnF1ZXJpZXMubG9hZEFsbFdpdGhDb250ZW50LFxuICAgICAgICAgIGlkc1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoYCR7dGhpcy5fbG9nUHJlZml4fUV2ZW50cyBkZWxldGVkIGluICR7RGF0ZS5ub3coKSAtIG5vd31tc2ApO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgc2F2ZShlbnRpdHk6IEUsIG9wdGlvbnM/OiBFbnRpdHlTZXJ2aWNlTG9hZE9wdGlvbnMpOiBQcm9taXNlPEU+IHtcbiAgICB0aGlzLmZpbGxEZWZhdWx0UHJvcGVydGllcyhlbnRpdHkpO1xuXG4gICAgLy8gVHJhbnNmb3JtIGludG8ganNvblxuICAgIGNvbnN0IHdpdGhDb250ZW50ID0gISFlbnRpdHkuY29udGVudDtcbiAgICBjb25zdCBqc29uID0gZW50aXR5LmFzT2JqZWN0KCk7XG5cbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS5kZWJ1ZyhgJHt0aGlzLl9sb2dQcmVmaXh9U2F2aW5nIHVzZXIgZXZlbnQuLi5gLCBqc29uKTtcblxuICAgIGF3YWl0IHRoaXMuZ3JhcGhxbC5tdXRhdGU8eyBkYXRhOiBhbnkgfT4oe1xuICAgICAgbXV0YXRpb246IHRoaXMubXV0YXRpb25zLnNhdmUsXG4gICAgICB2YXJpYWJsZXM6IHtcbiAgICAgICAgZGF0YToganNvblxuICAgICAgfSxcbiAgICAgIGVycm9yOiB7IGNvZGU6IFNvY2lhbEVycm9yQ29kZXMuU0FWRV9VU0VSX0VWRU5UX0VSUk9SLCBtZXNzYWdlOiAnU09DSUFMLkVSUk9SLlNBVkVfVVNFUl9FVkVOVF9FUlJPUicgfSxcbiAgICAgIHVwZGF0ZTogKHByb3h5LCB7IGRhdGEgfSkgPT4ge1xuICAgICAgICAvLyBVcGRhdGUgZW50aXR5XG4gICAgICAgIGNvbnN0IHNhdmVkRW50aXR5ID0gZGF0YSAmJiBkYXRhLmRhdGE7XG4gICAgICAgIGlmIChzYXZlZEVudGl0eSkge1xuICAgICAgICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS5kZWJ1ZyhgJHt0aGlzLl9sb2dQcmVmaXh9VXNlciBldmVudCBzYXZlZCBpbiAke0RhdGUubm93KCkgLSBub3d9bXNgLCBlbnRpdHkpO1xuICAgICAgICAgIHRoaXMuY29weUlkQW5kVXBkYXRlRGF0ZShzYXZlZEVudGl0eSwgZW50aXR5KTtcblxuICAgICAgICAgIC8vIEFkZCB0byBjYWNoZVxuICAgICAgICAgIGlmICh3aXRoQ29udGVudCkge1xuICAgICAgICAgICAgdGhpcy5pbnNlcnRJbnRvTXV0YWJsZUNhY2hlZFF1ZXJpZXMocHJveHksIHtcbiAgICAgICAgICAgICAgcXVlcnk6IHRoaXMucXVlcmllcy5sb2FkQWxsV2l0aENvbnRlbnQsXG4gICAgICAgICAgICAgIGRhdGE6IHNhdmVkRW50aXR5XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5pbnNlcnRJbnRvTXV0YWJsZUNhY2hlZFF1ZXJpZXMocHJveHksIHtcbiAgICAgICAgICAgICAgcXVlcnk6IHRoaXMucXVlcmllcy5sb2FkQWxsLFxuICAgICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgLi4uc2F2ZWRFbnRpdHksXG4gICAgICAgICAgICAgICAgY29udGVudDogbnVsbFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBlbnRpdHk7XG4gIH1cblxuICBhc3luYyBzYXZlQWxsKGVudGl0aWVzOiBFW10sIG9wdHM/OiBhbnkpOiBQcm9taXNlPEVbXT4ge1xuICAgIHJldHVybiBQcm9taXNlLmFsbChlbnRpdGllc1xuICAgICAgLm1hcChlbnRpdHkgPT4gdGhpcy5zYXZlKGVudGl0eSwgb3B0cykpXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIG1hcmtBc1JlYWQoZW50aXRpZXM6IEVbXSkge1xuXG4gICAgY29uc3QgdXNlckV2ZW50V2l0aG91dFJlYWRMaXN0ZW5lcnM6IEVbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgZW50aXR5IG9mIChlbnRpdGllcyB8fCBbXSkpIHtcbiAgICAgIC8vIEdldCBvblJlYWQgbGlzdGVuZXJzXG4gICAgICBjb25zdCBvblJlYWRMaXN0ZW5lcnMgPSAodGhpcy5saXN0ZW5lcnMgfHwgW10pLmZpbHRlcihsaXN0ZW5lciA9PiAhIWxpc3RlbmVyLm9uUmVhZCkuZmlsdGVyKGxpc3RlbmVyID0+IGxpc3RlbmVyLmFjY2VwdChlbnRpdHkpKTtcbiAgICAgIGlmIChvblJlYWRMaXN0ZW5lcnMubGVuZ3RoKSB7XG4gICAgICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2Ygb25SZWFkTGlzdGVuZXJzKSB7XG4gICAgICAgICAgYXdhaXQgbGlzdGVuZXIub25SZWFkKGVudGl0eSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEFkZCB0byB0aGlzIGxpc3QgZm9yIGRlZmF1bHQgb3BlcmF0aW9uXG4gICAgICAgIHVzZXJFdmVudFdpdGhvdXRSZWFkTGlzdGVuZXJzLnB1c2goZW50aXR5KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBVc2UgZGVmYXVsdFxuICAgIGF3YWl0IHRoaXMuZGVmYXVsdE1hcmtBc1JlYWQodXNlckV2ZW50V2l0aG91dFJlYWRMaXN0ZW5lcnMpO1xuICB9XG5cbiAgcmVnaXN0ZXJMaXN0ZW5lcihsaXN0ZW5lcjogSVVzZXJFdmVudExpc3RlbmVyPEU+KSB7XG4gICAgaWYgKCF0aGlzLmxpc3RlbmVycykgdGhpcy5saXN0ZW5lcnMgPSBbXTtcbiAgICB0aGlzLmxpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcbiAgfVxuXG4gIHJlc2V0Q291bnQoKSB7XG4gICAgdGhpcy5jb3VudCQubmV4dCh1bmRlZmluZWQpO1xuICAgIHRoaXMucmVzZXRDb3VudERhdGUgPSBtb21lbnQoKTtcbiAgICAvLyByZXN0YXJ0IGxpc3RlbmluZyBjb3VudCBjaGFuZ2VzXG4gICAgdGhpcy5zdGFydExpc3RlbkNvdW50Q2hhbmdlcygpO1xuICB9XG5cbiAgLyogLS0gcHJvdGVjdGVkIG1ldGhvZHMgLS0gKi9cblxuICBwcm90ZWN0ZWQgYXN5bmMgb25Mb2dpbigpIHtcbiAgICAvLyBHZXQgZmlyc3QgY291bnRcbiAgICBjb25zdCBjb3VudCA9IGF3YWl0IHRoaXMuY291bnQodW5kZWZpbmVkKTtcbiAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoYCR7dGhpcy5fbG9nUHJlZml4fVJlY2VpdmluZyB1c2VyIGV2ZW50cyBjb3VudGAsIGNvdW50KTtcbiAgICAvLyBVcGRhdGUgY291bnRcbiAgICB0aGlzLmNvdW50JC5uZXh0KGNvdW50KTtcblxuICAgIC8vIFRoZW4gbGlzdGVuIGNoYW5nZXNcbiAgICB0aGlzLnN0YXJ0TGlzdGVuQ291bnRDaGFuZ2VzKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25Mb2dvdXQoKSB7XG4gICAgdGhpcy5zdG9wTGlzdGVuQ291bnRDaGFuZ2VzKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc3RhcnRMaXN0ZW5Db3VudENoYW5nZXMoKSB7XG4gICAgdGhpcy5zdG9wTGlzdGVuQ291bnRDaGFuZ2VzKCk7XG4gICAgdGhpcy5fbGlzdGVuU3Vic2NyaXB0aW9uID0gdGhpcy5saXN0ZW5Db3VudENoYW5nZXModW5kZWZpbmVkKS5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzdG9wTGlzdGVuQ291bnRDaGFuZ2VzKCkge1xuICAgIHRoaXMuX2xpc3RlblN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLl9saXN0ZW5TdWJzY3JpcHRpb24gPSB1bmRlZmluZWQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgcHJvY2Vzc1VzZXJFdmVudChzb3VyY2U6IGFueSwgdGhhdD86IEFic3RyYWN0VXNlckV2ZW50U2VydmljZTxFLCBGPik6IEUge1xuICAgIHRoYXQgPSB0aGF0IHx8IHRoaXM7XG5cbiAgICAvLyBDb252ZXJ0IGpzb24gc291cmNlIHRvIElVc2VyRXZlbnRcbiAgICBsZXQgdGFyZ2V0ID0gdGhhdC5mcm9tT2JqZWN0KHNvdXJjZSk7XG5cbiAgICAvLyBHZXQgbGlzdGVuZXJzXG4gICAgY29uc3QgbGlzdGVuZXJzID0gKHRoYXQubGlzdGVuZXJzIHx8IFtdKS5maWx0ZXIobGlzdGVuZXIgPT4gbGlzdGVuZXIub25SZWNlaXZlZCkuZmlsdGVyKGxpc3RlbmVyID0+IGxpc3RlbmVyLmFjY2VwdCh0YXJnZXQpKTtcbiAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIGxpc3RlbmVycykge1xuICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICB0YXJnZXQgPSBsaXN0ZW5lci5vblJlY2VpdmVkKHRhcmdldCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodGhhdC5fZGVidWcpIGNvbnNvbGUuZGVidWcoYCR7dGhhdC5fbG9nUHJlZml4fUV2ZW50IGhhcyBiZWVuIHJlamVjdGVkIGJ5IGEgbGlzdGVuZXJgLCBzb3VyY2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGRlZmF1bHRNYXJrQXNSZWFkKHVzZXJFdmVudHM6IEVbXSkge1xuICAgIGlmICghdXNlckV2ZW50cykgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMuX2xvZ1ByZWZpeH1JbnZhbGlkIGV2ZW50IHRvIHNhdmVgKTtcbiAgICBpZiAoIXVzZXJFdmVudHMubGVuZ3RoKSByZXR1cm47XG5cbiAgICAvLyBzZXQgcmVhZCBkYXRlXG4gICAgdXNlckV2ZW50cy5mb3JFYWNoKHVzZXJFdmVudCA9PiB1c2VyRXZlbnQucmVhZERhdGUgPSBtb21lbnQoKSk7XG5cbiAgICAvLyBzcGxpdCBsb2NhbC9yZW1vdGUgZW50aXRpZXNcbiAgICBjb25zdCBsb2NhbEVudGl0aWVzID0gdXNlckV2ZW50cy5maWx0ZXIodXNlckV2ZW50ID0+ICF1c2VyRXZlbnQuaWQgfHwgdXNlckV2ZW50LmlkIDwgMCk7XG4gICAgY29uc3QgcmVtb3RlRW50aXRpZXMgPSB1c2VyRXZlbnRzLmZpbHRlcih1c2VyRXZlbnQgPT4gdXNlckV2ZW50LmlkID4gMCk7XG5cbiAgICAvLyBzYXZlIGxvY2FsIGVudGl0aWVzXG4gICAgaWYgKGxvY2FsRW50aXRpZXMubGVuZ3RoKSB7XG4gICAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoYCR7dGhpcy5fbG9nUHJlZml4fVNhdmUgbG9jYWwgdXNlciBldmVudGApO1xuICAgICAgLy8gVE9ETyAhISEhISEhISEhISEhXG4gICAgfVxuICAgIC8vIG1hcmsgcmVtb3RlIGVudGl0aWVzIGFzIHJlYWRcbiAgICBpZiAocmVtb3RlRW50aXRpZXMubGVuZ3RoKSB7XG4gICAgICBpZiAoIXRoaXMubXV0YXRpb25zPy5tYXJrQXNSZWFkKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgJHt0aGlzLl9sb2dQcmVmaXh9TXV0YXRpb24gcXVlcnkgJ21hcmtBc1JlYWQnIG5vdCBwcm92aWRlZCwgc2tpcC5gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBDb2xsZWN0IGlkc1xuICAgICAgY29uc3QgaWRzID0gcmVtb3RlRW50aXRpZXMubWFwKHZhbHVlID0+IHZhbHVlLmlkKTtcbiAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoYCR7dGhpcy5fbG9nUHJlZml4fU1hcmsgdXNlciBldmVudHMgYXMgcmVhZC4uLmAsIGlkcyk7XG5cbiAgICAgIGF3YWl0IHRoaXMuZ3JhcGhxbC5tdXRhdGU8eyBkYXRhOiBhbnkgfT4oe1xuICAgICAgICBtdXRhdGlvbjogdGhpcy5tdXRhdGlvbnMubWFya0FzUmVhZCxcbiAgICAgICAgdmFyaWFibGVzOiB7XG4gICAgICAgICAgaWRzXG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiB7IGNvZGU6IFNvY2lhbEVycm9yQ29kZXMuU0FWRV9VU0VSX0VWRU5UX0VSUk9SLCBtZXNzYWdlOiAnU09DSUFMLkVSUk9SLlNBVkVfVVNFUl9FVkVOVF9FUlJPUicgfSxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoYCR7dGhpcy5fbG9nUHJlZml4fVVzZXIgZXZlbnRzIG1hcmtlZCBhcyByZWFkIGluICR7RGF0ZS5ub3coKSAtIG5vd31tc2AsIGlkcyk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGRlZmF1bHRGaWx0ZXIoKTogRiB7XG4gICAgLy8gQnkgZGVmYXVsdFxuICAgIHJldHVybiA8Rj57XG4gICAgICByZWNpcGllbnRzOiBbdGhpcy5kZWZhdWx0UmVjaXBpZW50KCldXG4gICAgfTtcbiAgfVxuXG4gIHByb3RlY3RlZCBkZWZhdWx0UmVjaXBpZW50KCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuYWNjb3VudFNlcnZpY2UucGVyc29uLnB1YmtleTtcbiAgfVxuXG4gIHByb3RlY3RlZCBmaWxsRGVmYXVsdFByb3BlcnRpZXMoZW50aXR5OiBFKSB7XG4gIH1cblxuICBwcm90ZWN0ZWQgdW5yZWFkRXZlbnRzKGV2ZW50czogRVtdKTogbnVtYmVyIHtcbiAgICAvLyBkZWZhdWx0IGNhbGN1bGF0aW9uIG9uIHVucmVhZCBldmVudHMgZnJvbSBhIGxpc3RcbiAgICBpZiAoaXNFbXB0eUFycmF5KGV2ZW50cykpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgbGFzdFJlYWREYXRlID0gZXZlbnRzXG4gICAgICAuZmlsdGVyKGV2ZW50ID0+IGlzTm90TmlsKGV2ZW50LnJlYWREYXRlKSlcbiAgICAgIC5yZWR1Y2UoKGxhc3REYXRlLCBldmVudCkgPT4gRGF0ZVV0aWxzLm1heChsYXN0RGF0ZSwgZXZlbnQucmVhZERhdGUpLCB1bmRlZmluZWQgYXMgTW9tZW50KTtcbiAgICByZXR1cm4gZXZlbnRzXG4gICAgICAuZmlsdGVyKGV2ZW50ID0+IGV2ZW50LmNyZWF0aW9uRGF0ZS5pc1NhbWVPckFmdGVyKGxhc3RSZWFkRGF0ZSkpLmxlbmd0aDtcbiAgfVxuXG4gIHByb3RlY3RlZCBjb3B5SWRBbmRVcGRhdGVEYXRlKHNvdXJjZTogRSwgdGFyZ2V0OiBFKSB7XG4gICAgRW50aXR5VXRpbHMuY29weUlkQW5kVXBkYXRlRGF0ZShzb3VyY2UsIHRhcmdldCk7XG4gIH1cblxufVxuXG5cbmNvbnN0IHVzZXJFdmVudFF1ZXJpZXM6IElVc2VyRXZlbnRRdWVyaWVzID0ge1xuICBsb2FkQWxsOiBncWxgXG4gICAgcXVlcnkgVXNlckV2ZW50cygkZmlsdGVyOiBVc2VyRXZlbnRGaWx0ZXJWT0lucHV0LCAkcGFnZTogUGFnZUlucHV0KXtcbiAgICAgIGRhdGE6IHVzZXJFdmVudHMoZmlsdGVyOiAkZmlsdGVyLCBwYWdlOiAkcGFnZSl7XG4gICAgICAgIC4uLkxpZ2h0VXNlckV2ZW50RnJhZ21lbnRcbiAgICAgIH1cbiAgICB9XG4gICAgJHtVc2VyRXZlbnRGcmFnbWVudHMubGlnaHRVc2VyRXZlbnR9XG4gIGAsXG5cbiAgbG9hZEFsbFdpdGhDb250ZW50OiBncWxgXG4gICAgcXVlcnkgVXNlckV2ZW50c1dpdGhDb250ZW50KCRmaWx0ZXI6IFVzZXJFdmVudEZpbHRlclZPSW5wdXQsICRwYWdlOiBQYWdlSW5wdXQpe1xuICAgICAgZGF0YTogdXNlckV2ZW50cyhmaWx0ZXI6ICRmaWx0ZXIsIHBhZ2U6ICRwYWdlKXtcbiAgICAgICAgLi4uVXNlckV2ZW50RnJhZ21lbnRcbiAgICAgIH1cbiAgICB9XG4gICAgJHtVc2VyRXZlbnRGcmFnbWVudHMudXNlckV2ZW50fVxuICBgXG59O1xuXG5jb25zdCB1c2VyRXZlbnRNdXRhdGlvbnM6IElVc2VyRXZlbnRNdXRhdGlvbnMgPSB7XG4gIGRlbGV0ZUJ5SWRzOiBncWxgXG4gICAgbXV0YXRpb24gRGVsZXRlVXNlckV2ZW50cygkaWRzOltJbnRdKXtcbiAgICAgIGRlbGV0ZVVzZXJFdmVudHMoaWRzOiAkaWRzKVxuICAgIH1cbiAgYCxcblxuICBzYXZlOiBncWxgXG4gICAgbXV0YXRpb24gU2F2ZVVzZXJFdmVudCgkZGF0YTogVXNlckV2ZW50Vk9JbnB1dCl7XG4gICAgICBkYXRhOiBzYXZlVXNlckV2ZW50KHVzZXJFdmVudDogJGRhdGEpe1xuICAgICAgICAuLi5Vc2VyRXZlbnRGcmFnbWVudFxuICAgICAgfVxuICAgIH1cbiAgICAke1VzZXJFdmVudEZyYWdtZW50cy51c2VyRXZlbnR9XG4gIGBcbn07XG5cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFVzZXJFdmVudFNlcnZpY2VcbiAgZXh0ZW5kcyBBYnN0cmFjdFVzZXJFdmVudFNlcnZpY2U8VXNlckV2ZW50LCBVc2VyRXZlbnRGaWx0ZXI+IHtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgZ3JhcGhxbDogR3JhcGhxbFNlcnZpY2UsXG4gICAgcHJvdGVjdGVkIGFjY291bnRTZXJ2aWNlOiBBY2NvdW50U2VydmljZSxcbiAgICBwcm90ZWN0ZWQgbmV0d29yazogTmV0d29ya1NlcnZpY2UsXG4gICAgcHJvdGVjdGVkIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgdG9hc3RDb250cm9sbGVyOiBUb2FzdENvbnRyb2xsZXIsXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChFTlZJUk9OTUVOVCkgcHJvdGVjdGVkIGVudmlyb25tZW50OiBFbnZpcm9ubWVudFxuICApIHtcbiAgICBzdXBlcihncmFwaHFsLCBhY2NvdW50U2VydmljZSwgbmV0d29yaywgdHJhbnNsYXRlLCB1c2VyRXZlbnRRdWVyaWVzLCB1c2VyRXZlbnRNdXRhdGlvbnMsIHVuZGVmaW5lZCwgZW52aXJvbm1lbnQpO1xuICB9XG5cbiAgYXN5bmMgc2hvd1RvYXN0RXJyb3JXaXRoQ29udGV4dChvcHRzOiB7XG4gICAgZXJyb3I/OiBhbnk7XG4gICAgbWVzc2FnZT86IHN0cmluZztcbiAgICBjb250ZXh0OiBhbnkgfCAoKCkgPT4gYW55KSB8IFByb21pc2U8YW55PjtcbiAgfSkge1xuXG4gICAgbGV0IG1lc3NhZ2UgPSBvcHRzLm1lc3NhZ2UgfHwgKG9wdHMuZXJyb3IgJiYgb3B0cy5lcnJvci5tZXNzYWdlIHx8IG9wdHMuZXJyb3IpO1xuXG4gICAgLy8gTWFrZSBzdXJlIG1lc3NhZ2UgYSBzdHJpbmdcbiAgICBpZiAoIW1lc3NhZ2UgfHwgdHlwZW9mIG1lc3NhZ2UgIT09ICdzdHJpbmcnKSB7XG4gICAgICBtZXNzYWdlID0gJ0VSUk9SLlVOS05PV05fVEVDSE5JQ0FMX0VSUk9SJztcbiAgICB9XG5cbiAgICAvLyBJZiBvZmZsaW5lLCBkaXNwbGF5IGEgc2ltcGxlIGFsZXJ0XG4gICAgaWYgKHRoaXMubmV0d29yay5vZmZsaW5lKSB7XG4gICAgICB0aGlzLnNob3dUb2FzdCh7IG1lc3NhZ2UsIHR5cGU6ICdlcnJvcicgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gVHJhbnNsYXRlIHRoZSBtZXNzYWdlICh0byBiZSBhYmxlIHRvIGV4dHJhY3QgZGV0YWlscyBjb250ZW50KVxuICAgIG1lc3NhZ2UgPSB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KG1lc3NhZ2UpO1xuXG4gICAgLy8gQ2xlYW4gZGV0YWlscyBwYXJ0c1xuICAgIGlmIChtZXNzYWdlICYmIG1lc3NhZ2UuaW5kZXhPZignPHNtYWxsPicpICE9PSAtMSkge1xuICAgICAgbWVzc2FnZSA9IG1lc3NhZ2Uuc3Vic3RyKDAsIG1lc3NhZ2UuaW5kZXhPZignPHNtYWxsPicpIC0gMSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5zaG93VG9hc3Qoe1xuICAgICAgdHlwZTogJ2Vycm9yJyxcbiAgICAgIGR1cmF0aW9uOiAxNTAwMCxcbiAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UgKyAnPGJyLz48YnIvPjxiPicgKyB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdDT05GSVJNLlNFTkRfREVCVUdfREFUQScpICsgJzwvYj4nLFxuICAgICAgYnV0dG9uczogW3tcbiAgICAgICAgaWNvbjogJ2J1ZycsXG4gICAgICAgIHRleHQ6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ0NPTU1PTi5CVE5fU0VORCcpLFxuICAgICAgICByb2xlOiAnc2VuZCdcbiAgICAgIH1dXG4gICAgfSk7XG4gICAgaWYgKCFyZXMgfHwgcmVzLnJvbGUgIT09ICdzZW5kJykgcmV0dXJuO1xuXG4gICAgLy8gU2VuZCBkZWJ1ZyBkYXRhXG4gICAgdHJ5IHtcbiAgICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS5kZWJ1ZygnU2VuZGluZyBkZWJ1ZyBkYXRhLi4uJyk7XG5cbiAgICAgIC8vIENhbGwgY29udGVudCBmYWN0b3J5XG4gICAgICBsZXQgY29udGV4dDogYW55ID0gb3B0cyAmJiBvcHRzLmNvbnRleHQ7XG4gICAgICBpZiAodHlwZW9mIGNvbnRleHQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgY29udGV4dCA9IGNvbnRleHQoKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb250ZXh0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICBjb250ZXh0ID0gYXdhaXQgY29udGV4dDtcbiAgICAgIH1cblxuICAgICAgLy8gU2VuZCB0aGUgbWVzc2FnZVxuICAgICAgY29uc3QgdXNlckV2ZW50ID0gYXdhaXQgdGhpcy5zZW5kRGF0YUZvckRlYnVnKHtcbiAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgZXJyb3I6IG9wdHMuZXJyb3IgfHwgdW5kZWZpbmVkLFxuICAgICAgICBjb250ZXh0OiB0aGlzLmNvbnZlcnRPYmplY3RUb1N0cmluZyhjb250ZXh0KVxuICAgICAgfSk7XG5cbiAgICAgIGNvbnNvbGUuaW5mbygnRGVidWcgZGF0YSBzdWNjZXNzZnVsbHkgc2VudCB0byBhZG1pbicsIHVzZXJFdmVudCk7XG4gICAgICB0aGlzLnNob3dUb2FzdCh7XG4gICAgICAgIHR5cGU6ICdpbmZvJyxcbiAgICAgICAgbWVzc2FnZTogJ0lORk8uREVCVUdfREFUQV9TRU5EJyxcbiAgICAgICAgc2hvd0Nsb3NlQnV0dG9uOiB0cnVlXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHdoaWxlIHNlbmRpbmcgZGVidWcgZGF0YTonLCBlcnIpO1xuICAgIH1cbiAgfVxuXG4gIHNlbmREYXRhRm9yRGVidWcoZGF0YTogYW55KTogUHJvbWlzZTxVc2VyRXZlbnQ+IHtcbiAgICBjb25zdCB1c2VyRXZlbnQgPSBuZXcgVXNlckV2ZW50KCk7XG4gICAgdXNlckV2ZW50LnR5cGUgPSBVc2VyRXZlbnRUeXBlcy5ERUJVR19EQVRBO1xuICAgIHVzZXJFdmVudC5jb250ZW50ID0gdGhpcy5jb252ZXJ0T2JqZWN0VG9TdHJpbmcoZGF0YSk7XG4gICAgcmV0dXJuIHRoaXMuc2F2ZSh1c2VyRXZlbnQpO1xuICB9XG5cbiAgYXNGaWx0ZXIoZmlsdGVyOiBQYXJ0aWFsPFVzZXJFdmVudEZpbHRlcj4pOiBVc2VyRXZlbnRGaWx0ZXIge1xuICAgIHJldHVybiBVc2VyRXZlbnRGaWx0ZXIuZnJvbU9iamVjdChmaWx0ZXIpO1xuICB9XG5cbiAgZnJvbU9iamVjdChzb3VyY2U6IGFueSk6IFVzZXJFdmVudCB7XG4gICAgcmV0dXJuIFVzZXJFdmVudC5mcm9tT2JqZWN0KHNvdXJjZSk7XG4gIH1cblxuICAvKiAtLSBwcm90ZWN0ZWQgbWV0aG9kcyAtLSAqL1xuXG4gIHByb3RlY3RlZCBjb252ZXJ0T2JqZWN0VG9TdHJpbmcoZGF0YTogYW55KTogc3RyaW5nIHtcbiAgICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG4gICAgLy8gU2VyaWFsaXplIGNvbnRlbnQgaW50byBzdHJpbmdcbiAgICBlbHNlIGlmICh0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGlmIChkYXRhIGluc3RhbmNlb2YgRW50aXR5KSB7XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShkYXRhLmFzT2JqZWN0KHsga2VlcFR5cGVuYW1lOiB0cnVlLCBrZWVwTG9jYWxJZDogdHJ1ZSwgbWluaWZ5OiBmYWxzZSB9KSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoZGF0YSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIHNob3dUb2FzdDxUID0gYW55PihvcHRzOiBTaG93VG9hc3RPcHRpb25zKTogUHJvbWlzZTxPdmVybGF5RXZlbnREZXRhaWw8VD4+IHtcbiAgICBpZiAoIXRoaXMudG9hc3RDb250cm9sbGVyKSB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgdG9hc3RDb250cm9sbGVyIGluIGNvbXBvbmVudFxcJ3MgY29uc3RydWN0b3InKTtcbiAgICByZXR1cm4gYXdhaXQgVG9hc3RzLnNob3codGhpcy50b2FzdENvbnRyb2xsZXIsIHRoaXMudHJhbnNsYXRlLCBvcHRzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBmaWxsRGVmYXVsdFByb3BlcnRpZXMoZW50aXR5OiBVc2VyRXZlbnQpIHtcbiAgICBlbnRpdHkuaXNzdWVyID0gdGhpcy5hY2NvdW50U2VydmljZS5hY2NvdW50LnB1YmtleTtcblxuICAgIC8vIFRPRE86IGNvbXB1dGUgaGFzaCAodXNpbmcgY3J5cHRvU2VydmljZSlcbiAgICAvLyBUT0RPOiBjb21wdXRlIHNpZ25cbiAgICBjb25zb2xlLndhcm4oJ1RPRE86IHNpZ24gdXNlciBldmVudCBiZWZvcmUgc2VuZGluZycpO1xuICB9XG5cbn1cbiJdfQ==
|