@stemy/ngx-utils 12.1.1 → 13.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/bundles/stemy-ngx-utils.umd.js +27 -30
- package/bundles/stemy-ngx-utils.umd.js.map +1 -1
- package/esm2015/ngx-utils/services/config.service.js +4 -4
- package/esm2015/ngx-utils/services/error-handler.service.js +2 -2
- package/esm2015/ngx-utils/services/static-language.service.js +17 -17
- package/esm2015/ngx-utils/services/storage.service.js +4 -4
- package/esm2020/ngx-utils/common-types.mjs +116 -0
- package/esm2020/ngx-utils/components/dynamic-table/dynamic-table.component.mjs +178 -0
- package/esm2020/ngx-utils/components/pagination-menu/pagination-menu.component.mjs +101 -0
- package/esm2020/ngx-utils/components/unordered-list/unordered-list.component.mjs +65 -0
- package/esm2020/ngx-utils/directives/async-method.base.mjs +68 -0
- package/esm2020/ngx-utils/directives/async-method.directive.mjs +28 -0
- package/esm2020/ngx-utils/directives/background.directive.mjs +51 -0
- package/esm2020/ngx-utils/directives/dynamic-table-template.directive.mjs +20 -0
- package/esm2020/ngx-utils/directives/global-template.directive.mjs +30 -0
- package/esm2020/ngx-utils/directives/icon.directive.mjs +67 -0
- package/esm2020/ngx-utils/directives/ngx-template-outlet.directive.mjs +90 -0
- package/esm2020/ngx-utils/directives/pagination-item.directive.mjs +33 -0
- package/esm2020/ngx-utils/directives/pagination.directive.mjs +83 -0
- package/esm2020/ngx-utils/directives/resource-if.directive.mjs +50 -0
- package/esm2020/ngx-utils/directives/sticky-class.directive.mjs +34 -0
- package/esm2020/ngx-utils/directives/sticky.directive.mjs +55 -0
- package/esm2020/ngx-utils/directives/unordered-list-item.directive.mjs +77 -0
- package/esm2020/ngx-utils/directives/unordered-list-template.directive.mjs +26 -0
- package/esm2020/ngx-utils/ngx-utils.module.mjs +321 -0
- package/esm2020/ngx-utils/pipes/chunk.pipe.mjs +25 -0
- package/esm2020/ngx-utils/pipes/entries.pipe.mjs +28 -0
- package/esm2020/ngx-utils/pipes/extra-item-properties.pipe.mjs +31 -0
- package/esm2020/ngx-utils/pipes/filter.pipe.mjs +42 -0
- package/esm2020/ngx-utils/pipes/find.pipe.mjs +29 -0
- package/esm2020/ngx-utils/pipes/format-number.pipe.mjs +21 -0
- package/esm2020/ngx-utils/pipes/get-offset.pipe.mjs +17 -0
- package/esm2020/ngx-utils/pipes/get-type.pipe.mjs +16 -0
- package/esm2020/ngx-utils/pipes/global-template.pipe.mjs +41 -0
- package/esm2020/ngx-utils/pipes/group-by.pipe.mjs +27 -0
- package/esm2020/ngx-utils/pipes/is-type.pipe.mjs +16 -0
- package/esm2020/ngx-utils/pipes/join.pipe.mjs +19 -0
- package/esm2020/ngx-utils/pipes/keys.pipe.mjs +22 -0
- package/esm2020/ngx-utils/pipes/map.pipe.mjs +29 -0
- package/esm2020/ngx-utils/pipes/max.pipe.mjs +26 -0
- package/esm2020/ngx-utils/pipes/min.pipe.mjs +26 -0
- package/esm2020/ngx-utils/pipes/reduce.pipe.mjs +30 -0
- package/esm2020/ngx-utils/pipes/remap.pipe.mjs +32 -0
- package/esm2020/ngx-utils/pipes/replace.pipe.mjs +16 -0
- package/esm2020/ngx-utils/pipes/reverse.pipe.mjs +24 -0
- package/esm2020/ngx-utils/pipes/round.pipe.mjs +21 -0
- package/esm2020/ngx-utils/pipes/safe-html.pipe.mjs +34 -0
- package/esm2020/ngx-utils/pipes/translate.pipe.mjs +86 -0
- package/esm2020/ngx-utils/pipes/values.pipe.mjs +22 -0
- package/esm2020/ngx-utils/plugins/resize-event.plugin.mjs +59 -0
- package/esm2020/ngx-utils/plugins/scroll-event.plugin.mjs +39 -0
- package/esm2020/ngx-utils/services/acl.service.mjs +81 -0
- package/esm2020/ngx-utils/services/api.service.mjs +38 -0
- package/esm2020/ngx-utils/services/auth.service.mjs +14 -0
- package/esm2020/ngx-utils/services/base-http.client.mjs +47 -0
- package/esm2020/ngx-utils/services/base-http.service.mjs +298 -0
- package/esm2020/ngx-utils/services/config.service.mjs +130 -0
- package/esm2020/ngx-utils/services/error-handler.service.mjs +49 -0
- package/esm2020/ngx-utils/services/events.service.mjs +26 -0
- package/esm2020/ngx-utils/services/formatter.service.mjs +47 -0
- package/esm2020/ngx-utils/services/global-template.service.mjs +37 -0
- package/esm2020/ngx-utils/services/icon.service.mjs +26 -0
- package/esm2020/ngx-utils/services/language.service.mjs +113 -0
- package/esm2020/ngx-utils/services/open-api.service.mjs +40 -0
- package/esm2020/ngx-utils/services/promise.service.mjs +55 -0
- package/esm2020/ngx-utils/services/state.service.mjs +173 -0
- package/esm2020/ngx-utils/services/static-language.service.mjs +166 -0
- package/esm2020/ngx-utils/services/storage.service.mjs +49 -0
- package/esm2020/ngx-utils/services/toaster.service.mjs +32 -0
- package/esm2020/ngx-utils/services/translated-url.serializer.mjs +73 -0
- package/esm2020/ngx-utils/services/universal.service.mjs +78 -0
- package/esm2020/ngx-utils/utils/ajax-request-handler.mjs +40 -0
- package/esm2020/ngx-utils/utils/array.utils.mjs +100 -0
- package/esm2020/ngx-utils/utils/auth.guard.mjs +181 -0
- package/esm2020/ngx-utils/utils/canvas.utils.mjs +388 -0
- package/esm2020/ngx-utils/utils/date.utils.mjs +28 -0
- package/esm2020/ngx-utils/utils/file.utils.mjs +90 -0
- package/esm2020/ngx-utils/utils/generic-value.mjs +20 -0
- package/esm2020/ngx-utils/utils/geometry.mjs +132 -0
- package/esm2020/ngx-utils/utils/initializer.mjs +20 -0
- package/esm2020/ngx-utils/utils/loader.utils.mjs +55 -0
- package/esm2020/ngx-utils/utils/math.utils.mjs +15 -0
- package/esm2020/ngx-utils/utils/object.utils.mjs +261 -0
- package/esm2020/ngx-utils/utils/observable.utils.mjs +63 -0
- package/esm2020/ngx-utils/utils/reflect.utils.mjs +33 -0
- package/esm2020/ngx-utils/utils/set.utils.mjs +20 -0
- package/esm2020/ngx-utils/utils/string.utils.mjs +28 -0
- package/esm2020/ngx-utils/utils/timer.utils.mjs +52 -0
- package/esm2020/ngx-utils/utils/unique.utils.mjs +24 -0
- package/esm2020/ngx-utils/utils/vector.mjs +77 -0
- package/esm2020/public_api.mjs +85 -0
- package/esm2020/stemy-ngx-utils.mjs +5 -0
- package/fesm2015/stemy-ngx-utils.js +23 -23
- package/fesm2015/stemy-ngx-utils.js.map +1 -1
- package/fesm2015/stemy-ngx-utils.mjs +5196 -0
- package/fesm2015/stemy-ngx-utils.mjs.map +1 -0
- package/fesm2020/stemy-ngx-utils.mjs +5127 -0
- package/fesm2020/stemy-ngx-utils.mjs.map +1 -0
- package/ngx-utils/components/dynamic-table/dynamic-table.component.d.ts +3 -0
- package/ngx-utils/components/pagination-menu/pagination-menu.component.d.ts +3 -0
- package/ngx-utils/components/unordered-list/unordered-list.component.d.ts +3 -0
- package/ngx-utils/directives/async-method.base.d.ts +3 -0
- package/ngx-utils/directives/async-method.directive.d.ts +3 -0
- package/ngx-utils/directives/background.directive.d.ts +3 -0
- package/ngx-utils/directives/dynamic-table-template.directive.d.ts +3 -0
- package/ngx-utils/directives/global-template.directive.d.ts +3 -0
- package/ngx-utils/directives/icon.directive.d.ts +3 -0
- package/ngx-utils/directives/ngx-template-outlet.directive.d.ts +3 -0
- package/ngx-utils/directives/pagination-item.directive.d.ts +3 -0
- package/ngx-utils/directives/pagination.directive.d.ts +3 -0
- package/ngx-utils/directives/resource-if.directive.d.ts +3 -0
- package/ngx-utils/directives/sticky-class.directive.d.ts +3 -0
- package/ngx-utils/directives/sticky.directive.d.ts +3 -0
- package/ngx-utils/directives/unordered-list-item.directive.d.ts +3 -0
- package/ngx-utils/directives/unordered-list-template.directive.d.ts +3 -0
- package/ngx-utils/pipes/chunk.pipe.d.ts +3 -0
- package/ngx-utils/pipes/entries.pipe.d.ts +3 -0
- package/ngx-utils/pipes/extra-item-properties.pipe.d.ts +3 -0
- package/ngx-utils/pipes/filter.pipe.d.ts +3 -0
- package/ngx-utils/pipes/find.pipe.d.ts +3 -0
- package/ngx-utils/pipes/format-number.pipe.d.ts +3 -0
- package/ngx-utils/pipes/get-offset.pipe.d.ts +3 -0
- package/ngx-utils/pipes/get-type.pipe.d.ts +3 -0
- package/ngx-utils/pipes/global-template.pipe.d.ts +3 -0
- package/ngx-utils/pipes/group-by.pipe.d.ts +3 -0
- package/ngx-utils/pipes/is-type.pipe.d.ts +3 -0
- package/ngx-utils/pipes/join.pipe.d.ts +3 -0
- package/ngx-utils/pipes/keys.pipe.d.ts +3 -0
- package/ngx-utils/pipes/map.pipe.d.ts +3 -0
- package/ngx-utils/pipes/max.pipe.d.ts +3 -0
- package/ngx-utils/pipes/min.pipe.d.ts +3 -0
- package/ngx-utils/pipes/reduce.pipe.d.ts +3 -0
- package/ngx-utils/pipes/remap.pipe.d.ts +3 -0
- package/ngx-utils/pipes/replace.pipe.d.ts +3 -0
- package/ngx-utils/pipes/reverse.pipe.d.ts +3 -0
- package/ngx-utils/pipes/round.pipe.d.ts +3 -0
- package/ngx-utils/pipes/safe-html.pipe.d.ts +3 -0
- package/ngx-utils/pipes/translate.pipe.d.ts +4 -0
- package/ngx-utils/pipes/values.pipe.d.ts +3 -0
- package/ngx-utils/plugins/resize-event.plugin.d.ts +4 -1
- package/ngx-utils/plugins/scroll-event.plugin.d.ts +4 -1
- package/ngx-utils/services/acl.service.d.ts +3 -0
- package/ngx-utils/services/api.service.d.ts +3 -0
- package/ngx-utils/services/base-http.client.d.ts +3 -0
- package/ngx-utils/services/base-http.service.d.ts +3 -0
- package/ngx-utils/services/config.service.d.ts +3 -0
- package/ngx-utils/services/error-handler.service.d.ts +3 -0
- package/ngx-utils/services/events.service.d.ts +3 -0
- package/ngx-utils/services/formatter.service.d.ts +3 -0
- package/ngx-utils/services/global-template.service.d.ts +3 -0
- package/ngx-utils/services/icon.service.d.ts +3 -0
- package/ngx-utils/services/language.service.d.ts +3 -0
- package/ngx-utils/services/open-api.service.d.ts +3 -0
- package/ngx-utils/services/promise.service.d.ts +3 -0
- package/ngx-utils/services/state.service.d.ts +3 -0
- package/ngx-utils/services/static-language.service.d.ts +4 -1
- package/ngx-utils/services/storage.service.d.ts +3 -0
- package/ngx-utils/services/toaster.service.d.ts +3 -0
- package/ngx-utils/services/translated-url.serializer.d.ts +3 -0
- package/ngx-utils/services/universal.service.d.ts +3 -0
- package/ngx-utils/utils/auth.guard.d.ts +3 -0
- package/package.json +38 -19
- package/public_api.d.ts +1 -0
- package/stemy-ngx-utils.d.ts +1 -2
- package/stemy-ngx-utils.metadata.json +1 -1
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
import { Inject, Injectable, Injector } from "@angular/core";
|
|
11
|
+
import { AUTH_SERVICE, FactoryDependencies } from "../common-types";
|
|
12
|
+
import { ReflectUtils } from "./reflect.utils";
|
|
13
|
+
import { ObjectUtils } from "./object.utils";
|
|
14
|
+
import { StateService } from "../services/state.service";
|
|
15
|
+
import * as i0 from "@angular/core";
|
|
16
|
+
import * as i1 from "../services/state.service";
|
|
17
|
+
export class AuthGuard {
|
|
18
|
+
constructor(injector, state, auth) {
|
|
19
|
+
this.injector = injector;
|
|
20
|
+
this.state = state;
|
|
21
|
+
this.auth = auth;
|
|
22
|
+
}
|
|
23
|
+
static guardAuthenticated(auth) {
|
|
24
|
+
return Promise.resolve(auth.isAuthenticated);
|
|
25
|
+
}
|
|
26
|
+
static guardNotAuthenticated(auth) {
|
|
27
|
+
return Promise.resolve(!auth.isAuthenticated);
|
|
28
|
+
}
|
|
29
|
+
static guardNothing() {
|
|
30
|
+
return Promise.resolve(true);
|
|
31
|
+
}
|
|
32
|
+
static guardAuthField(auth, expression = `auth.isAuthenticated`) {
|
|
33
|
+
// @dynamic
|
|
34
|
+
const lambda = () => {
|
|
35
|
+
return Promise.resolve(ObjectUtils.evaluate(expression, { auth }));
|
|
36
|
+
};
|
|
37
|
+
return lambda;
|
|
38
|
+
}
|
|
39
|
+
static guardStateField(state, expression = `state.data`) {
|
|
40
|
+
// @dynamic
|
|
41
|
+
const lambda = () => {
|
|
42
|
+
return Promise.resolve(ObjectUtils.evaluate(expression, { state }));
|
|
43
|
+
};
|
|
44
|
+
return lambda;
|
|
45
|
+
}
|
|
46
|
+
static guardAuthStateField(auth, state, expression = `auth.isAuthenticated`) {
|
|
47
|
+
// @dynamic
|
|
48
|
+
const lambda = () => {
|
|
49
|
+
return Promise.resolve(ObjectUtils.evaluate(expression, { auth, state }));
|
|
50
|
+
};
|
|
51
|
+
return lambda;
|
|
52
|
+
}
|
|
53
|
+
static wildRouteMatch(segments) {
|
|
54
|
+
return { consumed: segments };
|
|
55
|
+
}
|
|
56
|
+
static noRouteMatch() {
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
checkRouteMenu(route) {
|
|
60
|
+
if (!route.data || !route.data.name)
|
|
61
|
+
return Promise.resolve(false);
|
|
62
|
+
return this.checkRoute(route);
|
|
63
|
+
}
|
|
64
|
+
checkRoute(route, next) {
|
|
65
|
+
const routeData = route.data || {};
|
|
66
|
+
if (!routeData.guards)
|
|
67
|
+
return Promise.resolve(!route.canActivate || this.auth.isAuthenticated);
|
|
68
|
+
return new Promise(resolve => {
|
|
69
|
+
const guards = routeData.guards.map(g => {
|
|
70
|
+
const guard = ReflectUtils.resolve(g, this.injector);
|
|
71
|
+
return guard(this.auth, route, next);
|
|
72
|
+
});
|
|
73
|
+
Promise.all(guards).then(results => {
|
|
74
|
+
resolve(results.indexOf(false) < 0);
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
canActivate(next, state) {
|
|
79
|
+
const route = next.routeConfig;
|
|
80
|
+
return new Promise(resolve => {
|
|
81
|
+
this.auth.checkAuthenticated().then(() => {
|
|
82
|
+
this.checkRoute(route, next).then(hasRights => {
|
|
83
|
+
resolve(hasRights);
|
|
84
|
+
if (!hasRights) {
|
|
85
|
+
this.getReturnState(route).then(returnState => {
|
|
86
|
+
if (!returnState)
|
|
87
|
+
return;
|
|
88
|
+
this.state.navigate(returnState, { queryParams: next.queryParams });
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
getConfig(route, config, path) {
|
|
96
|
+
if (!config)
|
|
97
|
+
return null;
|
|
98
|
+
const match = config.findIndex(t => t == route);
|
|
99
|
+
if (match >= 0)
|
|
100
|
+
return config;
|
|
101
|
+
for (const subConfig of config) {
|
|
102
|
+
if (subConfig.path)
|
|
103
|
+
path.push(subConfig.path);
|
|
104
|
+
const loadedChildren = (subConfig["_loadedConfig"] || { routes: null }).routes;
|
|
105
|
+
const match = this.getConfig(route, subConfig.children || loadedChildren, path);
|
|
106
|
+
if (!match) {
|
|
107
|
+
if (subConfig.path)
|
|
108
|
+
path.length -= 1;
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
return match;
|
|
112
|
+
}
|
|
113
|
+
return null;
|
|
114
|
+
}
|
|
115
|
+
getReturnState(route) {
|
|
116
|
+
if (!route)
|
|
117
|
+
return Promise.resolve(null);
|
|
118
|
+
if (ObjectUtils.isObject(route.data) && ObjectUtils.isArray(route.data.returnState)) {
|
|
119
|
+
return Promise.resolve(route.data.returnState);
|
|
120
|
+
}
|
|
121
|
+
const path = [];
|
|
122
|
+
const config = this.getConfig(route, this.state.routerConfig, path);
|
|
123
|
+
return new Promise(resolve => {
|
|
124
|
+
this.getReturnStateRecursive(config).then(rs => {
|
|
125
|
+
if (!ObjectUtils.isArray(rs)) {
|
|
126
|
+
resolve(rs);
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
resolve(path.concat(rs));
|
|
130
|
+
});
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
getReturnStateRecursive(config, c = 0) {
|
|
134
|
+
if (!config || c >= config.length)
|
|
135
|
+
return Promise.resolve(null);
|
|
136
|
+
return new Promise(resolve => {
|
|
137
|
+
const route = config[c];
|
|
138
|
+
const check = !route.component ? Promise.resolve(false) : this.checkRoute(route);
|
|
139
|
+
check.then(res => {
|
|
140
|
+
if (res) {
|
|
141
|
+
resolve([route.path]);
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
this.getReturnStateRecursive(config, c + 1).then(resolve);
|
|
145
|
+
});
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
AuthGuard.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: AuthGuard, deps: [{ token: Injector }, { token: StateService }, { token: AUTH_SERVICE }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
150
|
+
AuthGuard.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: AuthGuard });
|
|
151
|
+
__decorate([
|
|
152
|
+
FactoryDependencies(AUTH_SERVICE),
|
|
153
|
+
__metadata("design:type", Function),
|
|
154
|
+
__metadata("design:paramtypes", [Object, String]),
|
|
155
|
+
__metadata("design:returntype", Function)
|
|
156
|
+
], AuthGuard, "guardAuthField", null);
|
|
157
|
+
__decorate([
|
|
158
|
+
FactoryDependencies(StateService),
|
|
159
|
+
__metadata("design:type", Function),
|
|
160
|
+
__metadata("design:paramtypes", [StateService, String]),
|
|
161
|
+
__metadata("design:returntype", Function)
|
|
162
|
+
], AuthGuard, "guardStateField", null);
|
|
163
|
+
__decorate([
|
|
164
|
+
FactoryDependencies(AUTH_SERVICE, StateService),
|
|
165
|
+
__metadata("design:type", Function),
|
|
166
|
+
__metadata("design:paramtypes", [Object, StateService, String]),
|
|
167
|
+
__metadata("design:returntype", Function)
|
|
168
|
+
], AuthGuard, "guardAuthStateField", null);
|
|
169
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: AuthGuard, decorators: [{
|
|
170
|
+
type: Injectable
|
|
171
|
+
}], ctorParameters: function () { return [{ type: i0.Injector, decorators: [{
|
|
172
|
+
type: Inject,
|
|
173
|
+
args: [Injector]
|
|
174
|
+
}] }, { type: i1.StateService, decorators: [{
|
|
175
|
+
type: Inject,
|
|
176
|
+
args: [StateService]
|
|
177
|
+
}] }, { type: undefined, decorators: [{
|
|
178
|
+
type: Inject,
|
|
179
|
+
args: [AUTH_SERVICE]
|
|
180
|
+
}] }]; } });
|
|
181
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5ndWFyZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9uZ3gtdXRpbHMvdXRpbHMvYXV0aC5ndWFyZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSxPQUFPLEVBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFM0QsT0FBTyxFQUFDLFlBQVksRUFBRSxtQkFBbUIsRUFBdUMsTUFBTSxpQkFBaUIsQ0FBQztBQUN4RyxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDN0MsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQzs7O0FBR3ZELE1BQU0sT0FBTyxTQUFTO0lBaURsQixZQUF1QyxRQUFrQixFQUNkLEtBQW1CLEVBQ25CLElBQWtCO1FBRnRCLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDZCxVQUFLLEdBQUwsS0FBSyxDQUFjO1FBQ25CLFNBQUksR0FBSixJQUFJLENBQWM7SUFDN0QsQ0FBQztJQWxERCxNQUFNLENBQUMsa0JBQWtCLENBQUMsSUFBa0I7UUFDeEMsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQsTUFBTSxDQUFDLHFCQUFxQixDQUFDLElBQWtCO1FBQzNDLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQsTUFBTSxDQUFDLFlBQVk7UUFDZixPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUdELE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBa0IsRUFBRSxhQUFxQixzQkFBc0I7UUFDakYsV0FBVztRQUNYLE1BQU0sTUFBTSxH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OzBCQUNmLE1BQU07MkJBQUMsWUFBWTs7MEJBQ25CLE1BQU07MkJBQUMsWUFBWSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SW5qZWN0LCBJbmplY3RhYmxlLCBJbmplY3Rvcn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHtBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LCBDYW5BY3RpdmF0ZSwgUm91dGVyU3RhdGVTbmFwc2hvdCwgVXJsU2VnbWVudH0gZnJvbSBcIkBhbmd1bGFyL3JvdXRlclwiO1xyXG5pbXBvcnQge0FVVEhfU0VSVklDRSwgRmFjdG9yeURlcGVuZGVuY2llcywgSUF1dGhTZXJ2aWNlLCBJUm91dGUsIFJvdXRlVmFsaWRhdG9yfSBmcm9tIFwiLi4vY29tbW9uLXR5cGVzXCI7XHJcbmltcG9ydCB7UmVmbGVjdFV0aWxzfSBmcm9tIFwiLi9yZWZsZWN0LnV0aWxzXCI7XHJcbmltcG9ydCB7T2JqZWN0VXRpbHN9IGZyb20gXCIuL29iamVjdC51dGlsc1wiO1xyXG5pbXBvcnQge1N0YXRlU2VydmljZX0gZnJvbSBcIi4uL3NlcnZpY2VzL3N0YXRlLnNlcnZpY2VcIjtcclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIEF1dGhHdWFyZCBpbXBsZW1lbnRzIENhbkFjdGl2YXRlIHtcclxuXHJcbiAgICBzdGF0aWMgZ3VhcmRBdXRoZW50aWNhdGVkKGF1dGg6IElBdXRoU2VydmljZSk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoYXV0aC5pc0F1dGhlbnRpY2F0ZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBndWFyZE5vdEF1dGhlbnRpY2F0ZWQoYXV0aDogSUF1dGhTZXJ2aWNlKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSghYXV0aC5pc0F1dGhlbnRpY2F0ZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBndWFyZE5vdGhpbmcoKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICBARmFjdG9yeURlcGVuZGVuY2llcyhBVVRIX1NFUlZJQ0UpXHJcbiAgICBzdGF0aWMgZ3VhcmRBdXRoRmllbGQoYXV0aDogSUF1dGhTZXJ2aWNlLCBleHByZXNzaW9uOiBzdHJpbmcgPSBgYXV0aC5pc0F1dGhlbnRpY2F0ZWRgKTogUm91dGVWYWxpZGF0b3Ige1xyXG4gICAgICAgIC8vIEBkeW5hbWljXHJcbiAgICAgICAgY29uc3QgbGFtYmRhID0gKCk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKE9iamVjdFV0aWxzLmV2YWx1YXRlKGV4cHJlc3Npb24sIHthdXRofSkpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgcmV0dXJuIGxhbWJkYTtcclxuICAgIH1cclxuXHJcbiAgICBARmFjdG9yeURlcGVuZGVuY2llcyhTdGF0ZVNlcnZpY2UpXHJcbiAgICBzdGF0aWMgZ3VhcmRTdGF0ZUZpZWxkKHN0YXRlOiBTdGF0ZVNlcnZpY2UsIGV4cHJlc3Npb246IHN0cmluZyA9IGBzdGF0ZS5kYXRhYCk6IFJvdXRlVmFsaWRhdG9yIHtcclxuICAgICAgICAvLyBAZHluYW1pY1xyXG4gICAgICAgIGNvbnN0IGxhbWJkYSA9ICgpOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShPYmplY3RVdGlscy5ldmFsdWF0ZShleHByZXNzaW9uLCB7c3RhdGV9KSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICByZXR1cm4gbGFtYmRhO1xyXG4gICAgfVxyXG5cclxuICAgIEBGYWN0b3J5RGVwZW5kZW5jaWVzKEFVVEhfU0VSVklDRSwgU3RhdGVTZXJ2aWNlKVxyXG4gICAgc3RhdGljIGd1YXJkQXV0aFN0YXRlRmllbGQoYXV0aDogSUF1dGhTZXJ2aWNlLCBzdGF0ZTogU3RhdGVTZXJ2aWNlLCBleHByZXNzaW9uOiBzdHJpbmcgPSBgYXV0aC5pc0F1dGhlbnRpY2F0ZWRgKTogUm91dGVWYWxpZGF0b3Ige1xyXG4gICAgICAgIC8vIEBkeW5hbWljXHJcbiAgICAgICAgY29uc3QgbGFtYmRhID0gKCk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKE9iamVjdFV0aWxzLmV2YWx1YXRlKGV4cHJlc3Npb24sIHthdXRoLCBzdGF0ZX0pKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJldHVybiBsYW1iZGE7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIHdpbGRSb3V0ZU1hdGNoKHNlZ21lbnRzOiBVcmxTZWdtZW50W10pIHtcclxuICAgICAgICByZXR1cm4ge2NvbnN1bWVkOiBzZWdtZW50c307XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIG5vUm91dGVNYXRjaCgpIHtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdHJ1Y3RvcihASW5qZWN0KEluamVjdG9yKSByZWFkb25seSBpbmplY3RvcjogSW5qZWN0b3IsXHJcbiAgICAgICAgICAgICAgICBASW5qZWN0KFN0YXRlU2VydmljZSkgcmVhZG9ubHkgc3RhdGU6IFN0YXRlU2VydmljZSxcclxuICAgICAgICAgICAgICAgIEBJbmplY3QoQVVUSF9TRVJWSUNFKSByZWFkb25seSBhdXRoOiBJQXV0aFNlcnZpY2UpIHtcclxuICAgIH1cclxuXHJcbiAgICBjaGVja1JvdXRlTWVudShyb3V0ZTogSVJvdXRlKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICAgICAgaWYgKCFyb3V0ZS5kYXRhIHx8ICFyb3V0ZS5kYXRhLm5hbWUpIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNoZWNrUm91dGUocm91dGUpO1xyXG4gICAgfVxyXG5cclxuICAgIGNoZWNrUm91dGUocm91dGU6IElSb3V0ZSwgbmV4dD86IEFjdGl2YXRlZFJvdXRlU25hcHNob3QpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgICAgICBjb25zdCByb3V0ZURhdGEgPSByb3V0ZS5kYXRhIHx8IHt9O1xyXG4gICAgICAgIGlmICghcm91dGVEYXRhLmd1YXJkcylcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSghcm91dGUuY2FuQWN0aXZhdGUgfHwgdGhpcy5hdXRoLmlzQXV0aGVudGljYXRlZCk7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPGJvb2xlYW4+KHJlc29sdmUgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBndWFyZHMgPSByb3V0ZURhdGEuZ3VhcmRzLm1hcChnID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGd1YXJkID0gUmVmbGVjdFV0aWxzLnJlc29sdmU8Um91dGVWYWxpZGF0b3I+KGcsIHRoaXMuaW5qZWN0b3IpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGd1YXJkKHRoaXMuYXV0aCwgcm91dGUsIG5leHQpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgUHJvbWlzZS5hbGwoZ3VhcmRzKS50aGVuKHJlc3VsdHMgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHRzLmluZGV4T2YoZmFsc2UpIDwgMCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGNhbkFjdGl2YXRlKG5leHQ6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QsIHN0YXRlOiBSb3V0ZXJTdGF0ZVNuYXBzaG90KTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICAgICAgY29uc3Qgcm91dGUgPSA8SVJvdXRlPm5leHQucm91dGVDb25maWc7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPGJvb2xlYW4+KHJlc29sdmUgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmF1dGguY2hlY2tBdXRoZW50aWNhdGVkKCkudGhlbigoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrUm91dGUocm91dGUsIG5leHQpLnRoZW4oaGFzUmlnaHRzID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGhhc1JpZ2h0cyk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFoYXNSaWdodHMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRSZXR1cm5TdGF0ZShyb3V0ZSkudGhlbihyZXR1cm5TdGF0ZSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJldHVyblN0YXRlKSByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlLm5hdmlnYXRlKHJldHVyblN0YXRlLCB7cXVlcnlQYXJhbXM6IG5leHQucXVlcnlQYXJhbXN9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGdldENvbmZpZyhyb3V0ZTogSVJvdXRlLCBjb25maWc6IElSb3V0ZVtdLCBwYXRoOiBzdHJpbmdbXSk6IElSb3V0ZVtdIHtcclxuICAgICAgICBpZiAoIWNvbmZpZykgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgY29uc3QgbWF0Y2ggPSBjb25maWcuZmluZEluZGV4KHQgPT4gdCA9PSByb3V0ZSk7XHJcbiAgICAgICAgaWYgKG1hdGNoID49IDApIHJldHVybiBjb25maWc7XHJcbiAgICAgICAgZm9yIChjb25zdCBzdWJDb25maWcgb2YgY29uZmlnKSB7XHJcbiAgICAgICAgICAgIGlmIChzdWJDb25maWcucGF0aClcclxuICAgICAgICAgICAgICAgIHBhdGgucHVzaChzdWJDb25maWcucGF0aCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGxvYWRlZENoaWxkcmVuID0gKHN1YkNvbmZpZ1tcIl9sb2FkZWRDb25maWdcIl0gfHwge3JvdXRlczogbnVsbH0pLnJvdXRlcztcclxuICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSB0aGlzLmdldENvbmZpZyhyb3V0ZSwgc3ViQ29uZmlnLmNoaWxkcmVuIHx8IGxvYWRlZENoaWxkcmVuLCBwYXRoKTtcclxuICAgICAgICAgICAgaWYgKCFtYXRjaCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHN1YkNvbmZpZy5wYXRoKVxyXG4gICAgICAgICAgICAgICAgICAgIHBhdGgubGVuZ3RoIC09IDE7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gbWF0Y2g7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFJldHVyblN0YXRlKHJvdXRlOiBJUm91dGUpOiBQcm9taXNlPHN0cmluZ1tdPiB7XHJcbiAgICAgICAgaWYgKCFyb3V0ZSkgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtcclxuICAgICAgICBpZiAoT2JqZWN0VXRpbHMuaXNPYmplY3Qocm91dGUuZGF0YSkgJiYgT2JqZWN0VXRpbHMuaXNBcnJheShyb3V0ZS5kYXRhLnJldHVyblN0YXRlKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJvdXRlLmRhdGEucmV0dXJuU3RhdGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBwYXRoID0gW107XHJcbiAgICAgICAgY29uc3QgY29uZmlnID0gdGhpcy5nZXRDb25maWcocm91dGUsIHRoaXMuc3RhdGUucm91dGVyQ29uZmlnLCBwYXRoKTtcclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8c3RyaW5nW10+KHJlc29sdmUgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmdldFJldHVyblN0YXRlUmVjdXJzaXZlKGNvbmZpZykudGhlbihycyA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIU9iamVjdFV0aWxzLmlzQXJyYXkocnMpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShycyk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZShwYXRoLmNvbmNhdChycykpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldFJldHVyblN0YXRlUmVjdXJzaXZlKGNvbmZpZzogSVJvdXRlW10sIGM6IG51bWJlciA9IDApOiBQcm9taXNlPHN0cmluZ1tdPiB7XHJcbiAgICAgICAgaWYgKCFjb25maWcgfHwgYyA+PSBjb25maWcubGVuZ3RoKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTxzdHJpbmdbXT4ocmVzb2x2ZSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJvdXRlID0gY29uZmlnW2NdO1xyXG4gICAgICAgICAgICBjb25zdCBjaGVjayA9ICFyb3V0ZS5jb21wb25lbnQgPyBQcm9taXNlLnJlc29sdmUoZmFsc2UpIDogdGhpcy5jaGVja1JvdXRlKHJvdXRlKTtcclxuICAgICAgICAgICAgY2hlY2sudGhlbihyZXMgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHJlcykge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoW3JvdXRlLnBhdGhdKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLmdldFJldHVyblN0YXRlUmVjdXJzaXZlKGNvbmZpZywgYyArIDEpLnRoZW4ocmVzb2x2ZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==
|