@coolon/angular-ui-powerups 0.0.67 → 0.0.69
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/coolon-angular-ui-powerups.umd.js +2723 -2285
- package/bundles/coolon-angular-ui-powerups.umd.js.map +1 -1
- package/bundles/coolon-angular-ui-powerups.umd.min.js +1 -1
- package/bundles/coolon-angular-ui-powerups.umd.min.js.map +1 -1
- package/coolon-angular-ui-powerups.d.ts +24 -22
- package/coolon-angular-ui-powerups.metadata.json +1 -1
- package/esm2015/coolon-angular-ui-powerups.js +24 -22
- package/esm2015/index.js +2 -2
- package/esm2015/lib/angular-ui-powerups.module.js +6 -3
- package/esm2015/lib/components/index.js +2 -1
- package/esm2015/lib/components/noop/noop.component.js +19 -0
- package/esm2015/lib/interaction/components/alert-dialog/alert-dialog.component.js +2 -2
- package/esm2015/lib/interaction/components/confirm-then-dialog/confirm-then-dialog.component.js +2 -2
- package/esm2015/lib/interaction/components/confirmation-dialog/confirmation-dialog.component.js +2 -2
- package/esm2015/lib/interaction/components/interaction-outlet/interaction-outlet.component.js +19 -0
- package/esm2015/lib/interaction/guards/interaction-guard.service.js +85 -0
- package/esm2015/lib/interaction/index.js +3 -2
- package/esm2015/lib/interaction/interaction.module.js +8 -3
- package/esm2015/lib/interaction/services/dialog-interaction.service.js +30 -5
- package/esm2015/lib/place/components/abstract-place-navigation.component.js +5 -5
- package/esm2015/lib/place/components/list-place-nav/list-place-nav.component.js +2 -2
- package/esm2015/lib/place/components/place-outlet/place-outlet.component.js +60 -66
- package/esm2015/lib/place/components/tabbed-place-navigation/tabbed-place-navigation.component.js +2 -2
- package/esm2015/lib/place/index.js +9 -8
- package/esm2015/lib/place/navigation-session.js +147 -0
- package/esm2015/lib/place/place-component.js +18 -14
- package/esm2015/lib/place/place-definition.js +207 -5
- package/esm2015/lib/place/place-history.js +3 -2
- package/esm2015/lib/place/place-router.js +184 -89
- package/esm2015/lib/place/route/formatter.js +63 -0
- package/esm2015/lib/place/route/guards/leave-place.guard.js +193 -0
- package/esm2015/lib/place/route/guards/place-route.guard.js +243 -0
- package/esm2015/lib/place/route/parameter-decorators.js +35 -18
- package/esm2015/lib/place/route/parameter-definition.class.js +123 -67
- package/esm2015/lib/place/route/parameter-sanitiser.js +4 -3
- package/esm2015/lib/place/route/parameter-snapshot.js +11 -388
- package/esm2015/lib/place/route/visit-sanitiser.js +88 -0
- package/esm2015/lib/place/visit.js +107 -8
- package/esm2015/public_api.js +4 -4
- package/esm5/coolon-angular-ui-powerups.js +24 -22
- package/esm5/index.js +2 -2
- package/esm5/lib/angular-ui-powerups.module.js +6 -3
- package/esm5/lib/components/index.js +2 -1
- package/esm5/lib/components/noop/noop.component.js +21 -0
- package/esm5/lib/interaction/components/alert-dialog/alert-dialog.component.js +2 -2
- package/esm5/lib/interaction/components/confirm-then-dialog/confirm-then-dialog.component.js +2 -2
- package/esm5/lib/interaction/components/confirmation-dialog/confirmation-dialog.component.js +2 -2
- package/esm5/lib/interaction/components/interaction-outlet/interaction-outlet.component.js +21 -0
- package/esm5/lib/interaction/guards/interaction-guard.service.js +94 -0
- package/esm5/lib/interaction/index.js +3 -2
- package/esm5/lib/interaction/interaction.module.js +8 -3
- package/esm5/lib/interaction/services/dialog-interaction.service.js +28 -5
- package/esm5/lib/place/components/abstract-place-navigation.component.js +5 -5
- package/esm5/lib/place/components/list-place-nav/list-place-nav.component.js +2 -2
- package/esm5/lib/place/components/place-outlet/place-outlet.component.js +70 -82
- package/esm5/lib/place/components/tabbed-place-navigation/tabbed-place-navigation.component.js +2 -2
- package/esm5/lib/place/index.js +9 -8
- package/esm5/lib/place/navigation-session.js +193 -0
- package/esm5/lib/place/place-component.js +19 -15
- package/esm5/lib/place/place-definition.js +263 -5
- package/esm5/lib/place/place-history.js +7 -3
- package/esm5/lib/place/place-router.js +241 -108
- package/esm5/lib/place/route/formatter.js +96 -0
- package/esm5/lib/place/route/guards/leave-place.guard.js +152 -0
- package/esm5/lib/place/route/guards/place-route.guard.js +273 -0
- package/esm5/lib/place/route/parameter-decorators.js +35 -18
- package/esm5/lib/place/route/parameter-definition.class.js +179 -76
- package/esm5/lib/place/route/parameter-sanitiser.js +4 -3
- package/esm5/lib/place/route/parameter-snapshot.js +11 -480
- package/esm5/lib/place/route/visit-sanitiser.js +99 -0
- package/esm5/lib/place/visit.js +160 -8
- package/esm5/public_api.js +4 -4
- package/fesm2015/coolon-angular-ui-powerups.js +1452 -1108
- package/fesm2015/coolon-angular-ui-powerups.js.map +1 -1
- package/fesm5/coolon-angular-ui-powerups.js +2715 -2281
- package/fesm5/coolon-angular-ui-powerups.js.map +1 -1
- package/lib/components/index.d.ts +1 -0
- package/lib/components/noop/noop.component.d.ts +3 -0
- package/lib/interaction/components/interaction-outlet/interaction-outlet.component.d.ts +3 -0
- package/lib/interaction/guards/interaction-guard.service.d.ts +13 -0
- package/lib/interaction/index.d.ts +2 -1
- package/lib/interaction/services/dialog-interaction.service.d.ts +5 -1
- package/lib/place/components/place-outlet/place-outlet.component.d.ts +12 -12
- package/lib/place/index.d.ts +5 -4
- package/lib/place/navigation-session.d.ts +26 -0
- package/lib/place/place-component.d.ts +3 -3
- package/lib/place/place-definition.d.ts +30 -3
- package/lib/place/place-history.d.ts +3 -3
- package/lib/place/place-router.d.ts +25 -19
- package/lib/place/route/{parameter-type.d.ts → formatter.d.ts} +5 -5
- package/lib/place/{guards → route/guards}/leave-place.guard.d.ts +3 -3
- package/lib/place/route/guards/place-route.guard.d.ts +27 -0
- package/lib/place/route/parameter-decorators.d.ts +14 -6
- package/lib/place/route/parameter-definition.class.d.ts +21 -17
- package/lib/place/route/parameter-sanitiser.d.ts +3 -2
- package/lib/place/route/parameter-snapshot.d.ts +4 -26
- package/lib/place/route/visit-sanitiser.d.ts +12 -0
- package/lib/place/visit.d.ts +24 -3
- package/package.json +1 -1
- package/schematics/place-routes/place-class-scanner.d.ts +2 -2
- package/schematics/place-routes/place-class-scanner.js +7 -7
- package/schematics/place-routes/place-class-scanner.js.map +1 -1
- package/schematics/place-routes/place-def.d.ts +3 -2
- package/schematics/place-routes/place-def.js +21 -12
- package/schematics/place-routes/place-def.js.map +1 -1
- package/schematics/place-routes/templates/place-destinations.ts.template +5 -3
- package/schematics/place-routes/templates/place-routes.ts.template +10 -1
- package/schematics/place-routes/templates/place-visits.ts.template +21 -0
- package/esm2015/lib/interaction/guards/close-interaction.guard.js +0 -62
- package/esm2015/lib/place/guards/leave-place.guard.js +0 -194
- package/esm2015/lib/place/guards/place-route.guard.js +0 -74
- package/esm2015/lib/place/route/parameter-type.js +0 -61
- package/esm2015/lib/place/route/route-parameter-value.js +0 -230
- package/esm5/lib/interaction/guards/close-interaction.guard.js +0 -66
- package/esm5/lib/place/guards/leave-place.guard.js +0 -159
- package/esm5/lib/place/guards/place-route.guard.js +0 -78
- package/esm5/lib/place/route/parameter-type.js +0 -94
- package/esm5/lib/place/route/route-parameter-value.js +0 -316
- package/lib/interaction/guards/close-interaction.guard.d.ts +0 -12
- package/lib/place/guards/place-route.guard.d.ts +0 -10
- package/lib/place/route/route-parameter-value.d.ts +0 -42
|
@@ -2,7 +2,12 @@
|
|
|
2
2
|
* @fileoverview added by tsickle
|
|
3
3
|
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
|
|
4
4
|
*/
|
|
5
|
+
import * as tslib_1 from "tslib";
|
|
6
|
+
import { assert } from '@coolon/pectin';
|
|
7
|
+
import { Opts } from '@coolon/typescript-utilities';
|
|
8
|
+
import { Memoize } from '@typescript-plus/fast-memoize-decorator/dist/src';
|
|
5
9
|
import _ from 'lodash';
|
|
10
|
+
import { ParameterDefinition } from './route/parameter-definition.class';
|
|
6
11
|
export class PlaceDefinition {
|
|
7
12
|
/**
|
|
8
13
|
* @param {?} component
|
|
@@ -25,8 +30,49 @@ export class PlaceDefinition {
|
|
|
25
30
|
/**
|
|
26
31
|
* @return {?}
|
|
27
32
|
*/
|
|
28
|
-
|
|
29
|
-
return this.
|
|
33
|
+
hasRouteId() {
|
|
34
|
+
return !!this.getRouteIdParameterDef();
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* @return {?}
|
|
38
|
+
*/
|
|
39
|
+
getRouteIdParameterDef() {
|
|
40
|
+
return this.routeParameters.find((/**
|
|
41
|
+
* @param {?} p
|
|
42
|
+
* @return {?}
|
|
43
|
+
*/
|
|
44
|
+
p => p.isRouteId));
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* @param {?=} includeRouteId
|
|
48
|
+
* @return {?}
|
|
49
|
+
*/
|
|
50
|
+
getRouteParameterDefs(includeRouteId = false) {
|
|
51
|
+
return this.getVisitParameterDefs({ includeRouteId, includeRouteParameters: true });
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* @param {?=} include
|
|
55
|
+
* @return {?}
|
|
56
|
+
*/
|
|
57
|
+
getVisitParameterDefs(include) {
|
|
58
|
+
/** @type {?} */
|
|
59
|
+
const opts = Opts.get(include);
|
|
60
|
+
// includes
|
|
61
|
+
/** @type {?} */
|
|
62
|
+
const includeRouteId = !include || opts.getOptional('includeRouteId', false);
|
|
63
|
+
/** @type {?} */
|
|
64
|
+
const includeRouteParameters = !include || opts.getOptional('includeRouteParameters', false);
|
|
65
|
+
/** @type {?} */
|
|
66
|
+
const includeNonRouteParameters = !include || opts.getOptional('includeNonRouteParameters', false);
|
|
67
|
+
return this.routeParameters.filter((/**
|
|
68
|
+
* @param {?} p
|
|
69
|
+
* @return {?}
|
|
70
|
+
*/
|
|
71
|
+
p => {
|
|
72
|
+
return (includeRouteId && p.isRouteId)
|
|
73
|
+
|| (includeRouteParameters && p.isRouteParameter && !p.isRouteId) // route id is included in the line above
|
|
74
|
+
|| (includeNonRouteParameters && !p.isRouteParameter);
|
|
75
|
+
}));
|
|
30
76
|
}
|
|
31
77
|
/**
|
|
32
78
|
* @template T
|
|
@@ -34,7 +80,7 @@ export class PlaceDefinition {
|
|
|
34
80
|
* @param {?=} defaultValue
|
|
35
81
|
* @return {?}
|
|
36
82
|
*/
|
|
37
|
-
|
|
83
|
+
getPlaceData(key, defaultValue) {
|
|
38
84
|
return this.data ?
|
|
39
85
|
_.isNil(this.data[key]) ? defaultValue : this.data[key] :
|
|
40
86
|
defaultValue;
|
|
@@ -45,7 +91,7 @@ export class PlaceDefinition {
|
|
|
45
91
|
* @param {?=} defaultValue
|
|
46
92
|
* @return {?}
|
|
47
93
|
*/
|
|
48
|
-
|
|
94
|
+
searchPlaceData(keys, defaultValue) {
|
|
49
95
|
if (this.data) {
|
|
50
96
|
/** @type {?} */
|
|
51
97
|
const found = keys.find((/**
|
|
@@ -59,7 +105,148 @@ export class PlaceDefinition {
|
|
|
59
105
|
return defaultValue;
|
|
60
106
|
}
|
|
61
107
|
}
|
|
108
|
+
/**
|
|
109
|
+
* @param {?} visit
|
|
110
|
+
* @return {?}
|
|
111
|
+
*/
|
|
112
|
+
getRouteIdFrom(visit) {
|
|
113
|
+
/** @type {?} */
|
|
114
|
+
const routeIdParameterDef = this.getRouteIdParameterDef();
|
|
115
|
+
return routeIdParameterDef ? visit.getParameter(routeIdParameterDef.name) : null;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Returns angular router commands that specify the route id and any route parameters. The result does
|
|
119
|
+
* not include any path information.
|
|
120
|
+
* @param {?} visit
|
|
121
|
+
* @return {?}
|
|
122
|
+
*/
|
|
123
|
+
// getFormattedRouterCommands(visit: Visit): any[] {
|
|
124
|
+
// return this.hasRouteId() ?
|
|
125
|
+
// [this.getFormattedRouteId(visit), this.getFormattedRouteParameters(visit)] :
|
|
126
|
+
// [this.getFormattedRouteParameters(visit)];
|
|
127
|
+
// }
|
|
128
|
+
getFormattedRouteId(visit) {
|
|
129
|
+
return visit.hasRouteId() ? this.getRouteIdParameterDef().urlFormat.format(visit.getRouteId()) : null;
|
|
130
|
+
}
|
|
131
|
+
// @Trace()
|
|
132
|
+
/**
|
|
133
|
+
* @param {?} visit
|
|
134
|
+
* @param {?=} includeRouteId
|
|
135
|
+
* @return {?}
|
|
136
|
+
*/
|
|
137
|
+
getFormattedRouteParameters(visit, includeRouteId = false) {
|
|
138
|
+
/** @type {?} */
|
|
139
|
+
const result = {};
|
|
140
|
+
this.getVisitParameterDefs({
|
|
141
|
+
includeRouteId, includeRouteParameters: true
|
|
142
|
+
}).forEach((/**
|
|
143
|
+
* @param {?} def
|
|
144
|
+
* @return {?}
|
|
145
|
+
*/
|
|
146
|
+
def => {
|
|
147
|
+
/** @type {?} */
|
|
148
|
+
const value = visit.getParameter(def.name);
|
|
149
|
+
if (!def.isEmptyValue(value)) {
|
|
150
|
+
if (def.isArray) {
|
|
151
|
+
assert.isArray(value);
|
|
152
|
+
result[def.name] = value.map((/**
|
|
153
|
+
* @param {?} v
|
|
154
|
+
* @return {?}
|
|
155
|
+
*/
|
|
156
|
+
v => def.urlFormat.format(v)));
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
assert.isFalsey(Array.isArray(value));
|
|
160
|
+
result[def.name] = def.urlFormat.format(value);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}));
|
|
164
|
+
return result;
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* @param {?} visit
|
|
168
|
+
* @return {?}
|
|
169
|
+
*/
|
|
170
|
+
getNonRouteParameters(visit) {
|
|
171
|
+
/** @type {?} */
|
|
172
|
+
const result = {};
|
|
173
|
+
this.getVisitParameterDefs({ includeNonRouteParameters: true }).forEach((/**
|
|
174
|
+
* @param {?} def
|
|
175
|
+
* @return {?}
|
|
176
|
+
*/
|
|
177
|
+
def => {
|
|
178
|
+
/** @type {?} */
|
|
179
|
+
const value = visit.getParameter(def.name);
|
|
180
|
+
if (!def.isEmptyValue(value)) {
|
|
181
|
+
result[def.name] = value;
|
|
182
|
+
}
|
|
183
|
+
}));
|
|
184
|
+
return result;
|
|
185
|
+
}
|
|
186
|
+
// @Trace()
|
|
187
|
+
/**
|
|
188
|
+
* @param {?} params
|
|
189
|
+
* @return {?}
|
|
190
|
+
*/
|
|
191
|
+
parseRouteParams(params) {
|
|
192
|
+
/** @type {?} */
|
|
193
|
+
const result = {};
|
|
194
|
+
this.getVisitParameterDefs({
|
|
195
|
+
includeRouteId: true,
|
|
196
|
+
includeRouteParameters: true,
|
|
197
|
+
includeNonRouteParameters: false
|
|
198
|
+
}).forEach((/**
|
|
199
|
+
* @param {?} def
|
|
200
|
+
* @return {?}
|
|
201
|
+
*/
|
|
202
|
+
def => {
|
|
203
|
+
// params will return null for non existent names
|
|
204
|
+
if (params.has(def.name)) {
|
|
205
|
+
if (def.isArray) {
|
|
206
|
+
/** @type {?} */
|
|
207
|
+
const values = params.getAll(def.name);
|
|
208
|
+
result[def.name] = values.map((/**
|
|
209
|
+
* @param {?} v
|
|
210
|
+
* @return {?}
|
|
211
|
+
*/
|
|
212
|
+
v => def.urlFormat.parse(v)));
|
|
213
|
+
}
|
|
214
|
+
else {
|
|
215
|
+
/** @type {?} */
|
|
216
|
+
const value = def.urlFormat.parse(params.get(def.name));
|
|
217
|
+
// because our id routes redirect if the id isn't pressent we always have a id
|
|
218
|
+
// parameter in our params. This will bugger our remember and defaultvalue sanitisation
|
|
219
|
+
// as it'll see that the id is present (event thought its null). The sanitisation can't
|
|
220
|
+
// check for null as that's a valid value for the id.
|
|
221
|
+
/** @type {?} */
|
|
222
|
+
const isEmptyRouteId = def.isRouteId && def.isEmptyValue(value);
|
|
223
|
+
if (!isEmptyRouteId) {
|
|
224
|
+
result[def.name] = value;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}));
|
|
229
|
+
return result;
|
|
230
|
+
}
|
|
62
231
|
}
|
|
232
|
+
tslib_1.__decorate([
|
|
233
|
+
Memoize(),
|
|
234
|
+
tslib_1.__metadata("design:type", Function),
|
|
235
|
+
tslib_1.__metadata("design:paramtypes", []),
|
|
236
|
+
tslib_1.__metadata("design:returntype", ParameterDefinition)
|
|
237
|
+
], PlaceDefinition.prototype, "getRouteIdParameterDef", null);
|
|
238
|
+
tslib_1.__decorate([
|
|
239
|
+
Memoize(),
|
|
240
|
+
tslib_1.__metadata("design:type", Function),
|
|
241
|
+
tslib_1.__metadata("design:paramtypes", [Object]),
|
|
242
|
+
tslib_1.__metadata("design:returntype", Array)
|
|
243
|
+
], PlaceDefinition.prototype, "getRouteParameterDefs", null);
|
|
244
|
+
tslib_1.__decorate([
|
|
245
|
+
Memoize(),
|
|
246
|
+
tslib_1.__metadata("design:type", Function),
|
|
247
|
+
tslib_1.__metadata("design:paramtypes", [Object]),
|
|
248
|
+
tslib_1.__metadata("design:returntype", Array)
|
|
249
|
+
], PlaceDefinition.prototype, "getVisitParameterDefs", null);
|
|
63
250
|
if (false) {
|
|
64
251
|
/** @type {?} */
|
|
65
252
|
PlaceDefinition.prototype.component;
|
|
@@ -76,4 +263,19 @@ if (false) {
|
|
|
76
263
|
/** @type {?} */
|
|
77
264
|
PlaceDefinition.prototype.children;
|
|
78
265
|
}
|
|
79
|
-
|
|
266
|
+
(function (PlaceDefinition) {
|
|
267
|
+
/**
|
|
268
|
+
* @record
|
|
269
|
+
*/
|
|
270
|
+
function ParameterOptions() { }
|
|
271
|
+
PlaceDefinition.ParameterOptions = ParameterOptions;
|
|
272
|
+
if (false) {
|
|
273
|
+
/** @type {?|undefined} */
|
|
274
|
+
ParameterOptions.prototype.includeRouteId;
|
|
275
|
+
/** @type {?|undefined} */
|
|
276
|
+
ParameterOptions.prototype.includeRouteParameters;
|
|
277
|
+
/** @type {?|undefined} */
|
|
278
|
+
ParameterOptions.prototype.includeNonRouteParameters;
|
|
279
|
+
}
|
|
280
|
+
})(PlaceDefinition || (PlaceDefinition = {}));
|
|
281
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxhY2UtZGVmaW5pdGlvbi5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0Bjb29sb24vYW5ndWxhci11aS1wb3dlcnVwcy8iLCJzb3VyY2VzIjpbImxpYi9wbGFjZS9wbGFjZS1kZWZpbml0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQ0EsT0FBTyxFQUFFLE1BQU0sRUFBd0IsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5RCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDcEQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGtEQUFrRCxDQUFDO0FBQzNFLE9BQU8sQ0FBQyxNQUFNLFFBQVEsQ0FBQztBQUV2QixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUd6RSxNQUFNLE9BQU8sZUFBZTs7Ozs7Ozs7OztJQUUxQixZQUFxQixTQUF3QyxFQUN4QyxJQUFZLEVBQ1osWUFBcUIsRUFDckIsS0FBYSxFQUNiLElBQTRCLEVBQzVCLGVBQTJDLEVBQzNDLFFBQTJCO1FBTjNCLGNBQVMsR0FBVCxTQUFTLENBQStCO1FBQ3hDLFNBQUksR0FBSixJQUFJLENBQVE7UUFDWixpQkFBWSxHQUFaLFlBQVksQ0FBUztRQUNyQixVQUFLLEdBQUwsS0FBSyxDQUFRO1FBQ2IsU0FBSSxHQUFKLElBQUksQ0FBd0I7UUFDNUIsb0JBQWUsR0FBZixlQUFlLENBQTRCO1FBQzNDLGFBQVEsR0FBUixRQUFRLENBQW1CO0lBQ2hELENBQUM7Ozs7SUFFRCxVQUFVO1FBQ1IsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7SUFDekMsQ0FBQzs7OztJQUdELHNCQUFzQjtRQUNwQixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSTs7OztRQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBQyxDQUFDO0lBQ3JELENBQUM7Ozs7O0lBR0QscUJBQXFCLENBQUMsY0FBYyxHQUFHLEtB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b0NBQWlEOztJQUNqRCwrQkFBcUI7O0lBQ3JCLHVDQUE4Qjs7SUFDOUIsZ0NBQXNCOztJQUN0QiwrQkFBcUM7O0lBQ3JDLDBDQUFvRDs7SUFDcEQsbUNBQW9DOztBQStIbEQsV0FBaUIsZUFBZTs7OztJQUM5QiwrQkFJQzs7OztRQUhDLDBDQUF5Qjs7UUFDekIsa0RBQWlDOztRQUNqQyxxREFBb0M7O0FBRXhDLENBQUMsRUFOZ0IsZUFBZSxLQUFmLGVBQWUsUUFNL0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQYXJhbU1hcCB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBhc3NlcnQsIENvbnN0cnVjdGFibGUsIFRyYWNlIH0gZnJvbSAnQGNvb2xvbi9wZWN0aW4nO1xuaW1wb3J0IHsgT3B0cyB9IGZyb20gJ0Bjb29sb24vdHlwZXNjcmlwdC11dGlsaXRpZXMnO1xuaW1wb3J0IHsgTWVtb2l6ZSB9IGZyb20gJ0B0eXBlc2NyaXB0LXBsdXMvZmFzdC1tZW1vaXplLWRlY29yYXRvci9kaXN0L3NyYyc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgUGxhY2VDb21wb25lbnQgfSBmcm9tICcuL3BsYWNlLWNvbXBvbmVudCc7XG5pbXBvcnQgeyBQYXJhbWV0ZXJEZWZpbml0aW9uIH0gZnJvbSAnLi9yb3V0ZS9wYXJhbWV0ZXItZGVmaW5pdGlvbi5jbGFzcyc7XG5pbXBvcnQgeyBWaXNpdCB9IGZyb20gJy4vdmlzaXQnO1xuXG5leHBvcnQgY2xhc3MgUGxhY2VEZWZpbml0aW9uIHtcblxuICBjb25zdHJ1Y3RvcihyZWFkb25seSBjb21wb25lbnQ6IENvbnN0cnVjdGFibGU8UGxhY2VDb21wb25lbnQ+LFxuICAgICAgICAgICAgICByZWFkb25seSBwYXRoOiBzdHJpbmcsXG4gICAgICAgICAgICAgIHJlYWRvbmx5IGF1dGhlbnRpY2F0ZTogYm9vbGVhbixcbiAgICAgICAgICAgICAgcmVhZG9ubHkgb3JkZXI6IG51bWJlcixcbiAgICAgICAgICAgICAgcmVhZG9ubHkgZGF0YTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSxcbiAgICAgICAgICAgICAgcmVhZG9ubHkgcm91dGVQYXJhbWV0ZXJzOiBQYXJhbWV0ZXJEZWZpbml0aW9uPGFueT5bXSxcbiAgICAgICAgICAgICAgcmVhZG9ubHkgY2hpbGRyZW46IFBsYWNlRGVmaW5pdGlvbltdKSB7XG4gIH1cblxuICBoYXNSb3V0ZUlkKCkge1xuICAgIHJldHVybiAhIXRoaXMuZ2V0Um91dGVJZFBhcmFtZXRlckRlZigpO1xuICB9XG5cbiAgQE1lbW9pemUoKVxuICBnZXRSb3V0ZUlkUGFyYW1ldGVyRGVmKCk6IFBhcmFtZXRlckRlZmluaXRpb248YW55PiB7XG4gICAgcmV0dXJuIHRoaXMucm91dGVQYXJhbWV0ZXJzLmZpbmQocCA9PiBwLmlzUm91dGVJZCk7XG4gIH1cblxuICBATWVtb2l6ZSgpXG4gIGdldFJvdXRlUGFyYW1ldGVyRGVmcyhpbmNsdWRlUm91dGVJZCA9IGZhbHNlKTogUGFyYW1ldGVyRGVmaW5pdGlvbjxhbnk+W10ge1xuICAgIHJldHVybiB0aGlzLmdldFZpc2l0UGFyYW1ldGVyRGVmcyh7IGluY2x1ZGVSb3V0ZUlkLCBpbmNsdWRlUm91dGVQYXJhbWV0ZXJzOiB0cnVlIH0pO1xuICB9XG5cbiAgQE1lbW9pemUoKVxuICBnZXRWaXNpdFBhcmFtZXRlckRlZnMoaW5jbHVkZT86IFBsYWNlRGVmaW5pdGlvbi5QYXJhbWV0ZXJPcHRpb25zKTogUGFyYW1ldGVyRGVmaW5pdGlvbjxhbnk+W10ge1xuICAgIGNvbnN0IG9wdHMgPSBPcHRzLmdldChpbmNsdWRlKTtcbiAgICAvLyBpbmNsdWRlc1xuICAgIGNvbnN0IGluY2x1ZGVSb3V0ZUlkID0gIWluY2x1ZGUgfHwgb3B0cy5nZXRPcHRpb25hbCgnaW5jbHVkZVJvdXRlSWQnLCBmYWxzZSk7XG4gICAgY29uc3QgaW5jbHVkZVJvdXRlUGFyYW1ldGVycyA9ICFpbmNsdWRlIHx8IG9wdHMuZ2V0T3B0aW9uYWwoJ2luY2x1ZGVSb3V0ZVBhcmFtZXRlcnMnLCBmYWxzZSk7XG4gICAgY29uc3QgaW5jbHVkZU5vblJvdXRlUGFyYW1ldGVycyA9ICFpbmNsdWRlIHx8IG9wdHMuZ2V0T3B0aW9uYWwoJ2luY2x1ZGVOb25Sb3V0ZVBhcmFtZXRlcnMnLCBmYWxzZSk7XG4gICAgcmV0dXJuIHRoaXMucm91dGVQYXJhbWV0ZXJzLmZpbHRlcihwID0+IHtcbiAgICAgIHJldHVybiAoaW5jbHVkZVJvdXRlSWQgJiYgcC5pc1JvdXRlSWQpXG4gICAgICAgIHx8IChpbmNsdWRlUm91dGVQYXJhbWV0ZXJzICYmIHAuaXNSb3V0ZVBhcmFtZXRlciAmJiAhcC5pc1JvdXRlSWQpIC8vIHJvdXRlIGlkIGlzIGluY2x1ZGVkIGluIHRoZSBsaW5lIGFib3ZlXG4gICAgICAgIHx8IChpbmNsdWRlTm9uUm91dGVQYXJhbWV0ZXJzICYmICFwLmlzUm91dGVQYXJhbWV0ZXIpO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0UGxhY2VEYXRhPFQ+KGtleTogc3RyaW5nLCBkZWZhdWx0VmFsdWU/OiBUKTogVCB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YSA/XG4gICAgICBfLmlzTmlsKHRoaXMuZGF0YVtrZXldKSA/IGRlZmF1bHRWYWx1ZSA6IHRoaXMuZGF0YVtrZXldIDpcbiAgICAgIGRlZmF1bHRWYWx1ZTtcbiAgfVxuXG4gIHNlYXJjaFBsYWNlRGF0YTxUPihrZXlzOiBzdHJpbmdbXSwgZGVmYXVsdFZhbHVlPzogVCk6IFQge1xuICAgIGlmICh0aGlzLmRhdGEpIHtcbiAgICAgIGNvbnN0IGZvdW5kID0ga2V5cy5maW5kKGtleSA9PiAhXy5pc05pbCh0aGlzLmRhdGFba2V5XSkpO1xuICAgICAgcmV0dXJuIGZvdW5kID8gdGhpcy5kYXRhW2ZvdW5kXSA6IGRlZmF1bHRWYWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgICB9XG4gIH1cblxuICBnZXRSb3V0ZUlkRnJvbSh2aXNpdDogVmlzaXQpIHtcbiAgICBjb25zdCByb3V0ZUlkUGFyYW1ldGVyRGVmID0gdGhpcy5nZXRSb3V0ZUlkUGFyYW1ldGVyRGVmKCk7XG4gICAgcmV0dXJuIHJvdXRlSWRQYXJhbWV0ZXJEZWYgPyB2aXNpdC5nZXRQYXJhbWV0ZXIocm91dGVJZFBhcmFtZXRlckRlZi5uYW1lKSA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbmd1bGFyIHJvdXRlciBjb21tYW5kcyB0aGF0IHNwZWNpZnkgdGhlIHJvdXRlIGlkIGFuZCBhbnkgcm91dGUgcGFyYW1ldGVycy4gIFRoZSByZXN1bHQgZG9lc1xuICAgKiBub3QgaW5jbHVkZSBhbnkgcGF0aCBpbmZvcm1hdGlvbi5cbiAgICovXG4gIC8vIGdldEZvcm1hdHRlZFJvdXRlckNvbW1hbmRzKHZpc2l0OiBWaXNpdCk6IGFueVtdIHtcbiAgLy8gICByZXR1cm4gdGhpcy5oYXNSb3V0ZUlkKCkgP1xuICAvLyAgICAgW3RoaXMuZ2V0Rm9ybWF0dGVkUm91dGVJZCh2aXNpdCksIHRoaXMuZ2V0Rm9ybWF0dGVkUm91dGVQYXJhbWV0ZXJzKHZpc2l0KV0gOlxuICAvLyAgICAgW3RoaXMuZ2V0Rm9ybWF0dGVkUm91dGVQYXJhbWV0ZXJzKHZpc2l0KV07XG4gIC8vIH1cblxuICBnZXRGb3JtYXR0ZWRSb3V0ZUlkKHZpc2l0OiBWaXNpdCk6IGFueSB7XG4gICAgcmV0dXJuIHZpc2l0Lmhhc1JvdXRlSWQoKSA/IHRoaXMuZ2V0Um91dGVJZFBhcmFtZXRlckRlZigpLnVybEZvcm1hdC5mb3JtYXQodmlzaXQuZ2V0Um91dGVJZCgpKSA6IG51bGw7XG4gIH1cblxuICAvLyBAVHJhY2UoKVxuICBnZXRGb3JtYXR0ZWRSb3V0ZVBhcmFtZXRlcnModmlzaXQ6IFZpc2l0LCBpbmNsdWRlUm91dGVJZCA9IGZhbHNlKTogeyBbcDogc3RyaW5nXTogc3RyaW5nIH0ge1xuICAgIGNvbnN0IHJlc3VsdDogeyBbcDogc3RyaW5nXTogc3RyaW5nIH0gPSB7fTtcbiAgICB0aGlzLmdldFZpc2l0UGFyYW1ldGVyRGVmcyh7XG4gICAgICBpbmNsdWRlUm91dGVJZCwgaW5jbHVkZVJvdXRlUGFyYW1ldGVyczogdHJ1ZVxuICAgIH0pLmZvckVhY2goZGVmID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gdmlzaXQuZ2V0UGFyYW1ldGVyKGRlZi5uYW1lKTtcbiAgICAgIGlmICghZGVmLmlzRW1wdHlWYWx1ZSh2YWx1ZSkpIHtcbiAgICAgICAgaWYgKGRlZi5pc0FycmF5KSB7XG4gICAgICAgICAgYXNzZXJ0LmlzQXJyYXkodmFsdWUpO1xuICAgICAgICAgIHJlc3VsdFtkZWYubmFtZV0gPSB2YWx1ZS5tYXAodiA9PiBkZWYudXJsRm9ybWF0LmZvcm1hdCh2KSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXNzZXJ0LmlzRmFsc2V5KEFycmF5LmlzQXJyYXkodmFsdWUpKTtcbiAgICAgICAgICByZXN1bHRbZGVmLm5hbWVdID0gZGVmLnVybEZvcm1hdC5mb3JtYXQodmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGdldE5vblJvdXRlUGFyYW1ldGVycyh2aXNpdDogVmlzaXQpOiB7IFtwOiBzdHJpbmddOiBzdHJpbmcgfSB7XG4gICAgY29uc3QgcmVzdWx0OiB7IFtwOiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9O1xuICAgIHRoaXMuZ2V0VmlzaXRQYXJhbWV0ZXJEZWZzKHsgaW5jbHVkZU5vblJvdXRlUGFyYW1ldGVyczogdHJ1ZSB9KS5mb3JFYWNoKGRlZiA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHZpc2l0LmdldFBhcmFtZXRlcihkZWYubmFtZSk7XG4gICAgICBpZiAoIWRlZi5pc0VtcHR5VmFsdWUodmFsdWUpKSB7XG4gICAgICAgICAgcmVzdWx0W2RlZi5uYW1lXSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvLyBAVHJhY2UoKVxuICBwYXJzZVJvdXRlUGFyYW1zKHBhcmFtczogUGFyYW1NYXApOiB7IFtwOiBzdHJpbmddOiBhbnkgfSB7XG4gICAgY29uc3QgcmVzdWx0OiB7IFtwOiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuICAgIHRoaXMuZ2V0VmlzaXRQYXJhbWV0ZXJEZWZzKHtcbiAgICAgIGluY2x1ZGVSb3V0ZUlkOiB0cnVlLFxuICAgICAgaW5jbHVkZVJvdXRlUGFyYW1ldGVyczogdHJ1ZSxcbiAgICAgIGluY2x1ZGVOb25Sb3V0ZVBhcmFtZXRlcnM6IGZhbHNlXG4gICAgfSkuZm9yRWFjaChkZWYgPT4ge1xuICAgICAgLy8gcGFyYW1zIHdpbGwgcmV0dXJuIG51bGwgZm9yIG5vbiBleGlzdGVudCBuYW1lc1xuICAgICAgaWYgKHBhcmFtcy5oYXMoZGVmLm5hbWUpKSB7XG4gICAgICAgIGlmIChkZWYuaXNBcnJheSkge1xuICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IHBhcmFtcy5nZXRBbGwoZGVmLm5hbWUpO1xuICAgICAgICAgIHJlc3VsdFtkZWYubmFtZV0gPSB2YWx1ZXMubWFwKHYgPT4gZGVmLnVybEZvcm1hdC5wYXJzZSh2KSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBkZWYudXJsRm9ybWF0LnBhcnNlKHBhcmFtcy5nZXQoZGVmLm5hbWUpKTtcbiAgICAgICAgICAvLyBiZWNhdXNlIG91ciBpZCByb3V0ZXMgcmVkaXJlY3QgaWYgdGhlIGlkIGlzbid0IHByZXNzZW50IHdlIGFsd2F5cyBoYXZlIGEgaWRcbiAgICAgICAgICAvLyBwYXJhbWV0ZXIgaW4gb3VyIHBhcmFtcy4gIFRoaXMgd2lsbCBidWdnZXIgb3VyIHJlbWVtYmVyIGFuZCBkZWZhdWx0dmFsdWUgc2FuaXRpc2F0aW9uXG4gICAgICAgICAgLy8gYXMgaXQnbGwgc2VlIHRoYXQgdGhlIGlkIGlzIHByZXNlbnQgKGV2ZW50IHRob3VnaHQgaXRzIG51bGwpLiAgVGhlIHNhbml0aXNhdGlvbiBjYW4ndFxuICAgICAgICAgIC8vIGNoZWNrIGZvciBudWxsIGFzIHRoYXQncyBhIHZhbGlkIHZhbHVlIGZvciB0aGUgaWQuXG4gICAgICAgICAgY29uc3QgaXNFbXB0eVJvdXRlSWQgPSBkZWYuaXNSb3V0ZUlkICYmIGRlZi5pc0VtcHR5VmFsdWUodmFsdWUpO1xuICAgICAgICAgIGlmICghaXNFbXB0eVJvdXRlSWQpIHtcbiAgICAgICAgICAgIHJlc3VsdFtkZWYubmFtZV0gPSB2YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBQbGFjZURlZmluaXRpb24ge1xuICBleHBvcnQgaW50ZXJmYWNlIFBhcmFtZXRlck9wdGlvbnMge1xuICAgIGluY2x1ZGVSb3V0ZUlkPzogYm9vbGVhbjtcbiAgICBpbmNsdWRlUm91dGVQYXJhbWV0ZXJzPzogYm9vbGVhbjtcbiAgICBpbmNsdWRlTm9uUm91dGVQYXJhbWV0ZXJzPzogYm9vbGVhbjtcbiAgfVxufVxuIl19
|
|
@@ -15,6 +15,7 @@ export class PlaceHistory {
|
|
|
15
15
|
this.router = router;
|
|
16
16
|
this._history = new Map();
|
|
17
17
|
}
|
|
18
|
+
// @Trace()
|
|
18
19
|
/**
|
|
19
20
|
* @param {?} state
|
|
20
21
|
* @return {?}
|
|
@@ -24,7 +25,7 @@ export class PlaceHistory {
|
|
|
24
25
|
const history = this.getHistory(state.placeDefinition);
|
|
25
26
|
/** @type {?} */
|
|
26
27
|
const previousState = _.last(history);
|
|
27
|
-
if (!previousState || state.
|
|
28
|
+
if (!previousState || state.hasChangedFrom(previousState)) {
|
|
28
29
|
history.unshift(state); // LIFO
|
|
29
30
|
this.setHistory(state.placeDefinition, history.slice(0, 3)); // limit our history to 4 visits
|
|
30
31
|
}
|
|
@@ -74,4 +75,4 @@ if (false) {
|
|
|
74
75
|
*/
|
|
75
76
|
PlaceHistory.prototype.router;
|
|
76
77
|
}
|
|
77
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
78
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxhY2UtaGlzdG9yeS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0Bjb29sb24vYW5ndWxhci11aS1wb3dlcnVwcy8iLCJzb3VyY2VzIjpbImxpYi9wbGFjZS9wbGFjZS1oaXN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUV6QyxPQUFPLENBQUMsTUFBTSxRQUFRLENBQUM7OztBQU92QixNQUFNLE9BQU8sWUFBWTs7OztJQUl2QixZQUE2QixNQUFjO1FBQWQsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUZuQyxhQUFRLEdBQUcsSUFBSSxHQUFHLEVBQTRCLENBQUM7SUFHdkQsQ0FBQzs7Ozs7O0lBR0QsR0FBRyxDQUFDLEtBQVk7O2NBQ1IsT0FBTyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQzs7Y0FDaEQsYUFBYSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxhQUFhLElBQUksS0FBSyxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsRUFBRTtZQUN6RCxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTztZQUMvQixJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxlQUFlLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdDQUFnQztTQUM5RjtJQUNILENBQUM7Ozs7O0lBRUQsVUFBVSxDQUFDLFFBQXlCOztZQUM5QixPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDO1FBQ3pDLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDWixPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQ2IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7U0FDcEM7UUFDRCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDOzs7Ozs7O0lBRU8sVUFBVSxDQUFDLFFBQXlCLEVBQUUsT0FBZ0I7UUFDNUQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7OztZQS9CRixVQUFVLFNBQUM7Z0JBQ1YsVUFBVSxFQUFFLE1BQU07YUFDbkI7Ozs7WUFSUSxNQUFNOzs7Ozs7OztJQVdiLGdDQUF1RDs7Ozs7SUFFM0MsOEJBQStCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IFRyYWNlIH0gZnJvbSAnQGNvb2xvbi9wZWN0aW4nO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IFBsYWNlRGVmaW5pdGlvbiB9IGZyb20gJy4vcGxhY2UtZGVmaW5pdGlvbic7XG5pbXBvcnQgeyBWaXNpdCB9IGZyb20gJy4vdmlzaXQnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBQbGFjZUhpc3Rvcnkge1xuXG4gIHByaXZhdGUgX2hpc3RvcnkgPSBuZXcgTWFwPFBsYWNlRGVmaW5pdGlvbiwgVmlzaXRbXT4oKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHJvdXRlcjogUm91dGVyKSB7XG4gIH1cblxuICAvLyBAVHJhY2UoKVxuICBhZGQoc3RhdGU6IFZpc2l0KSB7XG4gICAgY29uc3QgaGlzdG9yeSA9IHRoaXMuZ2V0SGlzdG9yeShzdGF0ZS5wbGFjZURlZmluaXRpb24pO1xuICAgIGNvbnN0IHByZXZpb3VzU3RhdGUgPSBfLmxhc3QoaGlzdG9yeSk7XG4gICAgaWYgKCFwcmV2aW91c1N0YXRlIHx8IHN0YXRlLmhhc0NoYW5nZWRGcm9tKHByZXZpb3VzU3RhdGUpKSB7XG4gICAgICBoaXN0b3J5LnVuc2hpZnQoc3RhdGUpOyAvLyBMSUZPXG4gICAgICB0aGlzLnNldEhpc3Rvcnkoc3RhdGUucGxhY2VEZWZpbml0aW9uLCBoaXN0b3J5LnNsaWNlKDAsIDMpKTsgLy8gbGltaXQgb3VyIGhpc3RvcnkgdG8gNCB2aXNpdHNcbiAgICB9XG4gIH1cblxuICBnZXRIaXN0b3J5KHBsYWNlRGVmOiBQbGFjZURlZmluaXRpb24pOiBWaXNpdFtdIHtcbiAgICBsZXQgaGlzdG9yeSA9IHRoaXMuX2hpc3RvcnkuZ2V0KHBsYWNlRGVmKTtcbiAgICBpZiAoIWhpc3RvcnkpIHtcbiAgICAgIGhpc3RvcnkgPSBbXTtcbiAgICAgIHRoaXMuc2V0SGlzdG9yeShwbGFjZURlZiwgaGlzdG9yeSk7XG4gICAgfVxuICAgIHJldHVybiBoaXN0b3J5O1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRIaXN0b3J5KHBsYWNlRGVmOiBQbGFjZURlZmluaXRpb24sIGhpc3Rvcnk6IFZpc2l0W10pIHtcbiAgICB0aGlzLl9oaXN0b3J5LnNldChwbGFjZURlZiwgaGlzdG9yeSk7XG4gIH1cblxuLy8gcHJldmlvdXNWaXNpdCgpOiBWaXNpdCB7XG4gIC8vICAgcmV0dXJuIF8ubGFzdCh0aGlzLl9oaXN0b3J5KTtcbiAgLy8gfVxuICAvL1xuICAvLyB3aXRoUHJldmlvdXNWaXNpdDxSPihjYWxsYmFjazoocHJldmlvdXNWaXNpdDpWaXNpdCk9PlIsIGRlZmF1bHRWYWx1ZTpSID0gbnVsbCk6UntcbiAgLy8gICBjb25zdCB2aXNpdCA9IHRoaXMucHJldmlvdXNWaXNpdCgpO1xuICAvLyAgIHJldHVybiB2aXNpdCA/IGNhbGxiYWNrKHZpc2l0KSA6IGRlZmF1bHRWYWx1ZTtcbiAgLy8gfVxuICAvL1xuICAvLyBwcmV2aW91c1Zpc2l0VG8ocGxhY2U6IFBsYWNlKTogVmlzaXQge1xuICAvLyAgIHJldHVybiBuZXcgVmlzaXRIaXN0b3J5LlF1ZXJ5KHRoaXMuX2hpc3RvcnkpLnRvKHBsYWNlKS5sYXN0KCk7XG4gIC8vIH1cbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBWaXNpdEhpc3Rvcnkge1xuXG4gIC8vIGV4cG9ydCBjbGFzcyBRdWVyeSB7XG4gIC8vICAgcHJpdmF0ZSBfaGlzdG9yeTogVmlzaXQuU3RhdGVbXTtcbiAgLy8gICBwcml2YXRlIF9wbGFjZXM6IFBsYWNlW107XG4gIC8vICAgcHJpdmF0ZSBfcHJlZGljYXRlOiAodmlzaXQ6IGFueSkgPT4gYm9vbGVhbjtcbiAgLy8gICBwcml2YXRlIF9saW1pdDogbnVtYmVyO1xuICAvL1xuICAvLyAgIGNvbnN0cnVjdG9yKGhpc3RvcnksIGxpbWl0ID0gaGlzdG9yeS5sZW5ndGgpIHtcbiAgLy8gICAgIHRoaXMuX2hpc3RvcnkgPSBoaXN0b3J5O1xuICAvLyAgICAgdGhpcy5fcGxhY2VzID0gW107XG4gIC8vICAgICB0aGlzLl9wcmVkaWNhdGUgPSAodmlzaXQgPT4gdHJ1ZSk7XG4gIC8vICAgICB0aGlzLl9saW1pdCA9IGxpbWl0O1xuICAvLyAgIH1cbiAgLy9cbiAgLy8gICB0byguLi5wbGFjZXM6UGxhY2VbXSk6dGhpcyB7XG4gIC8vICAgICB0aGlzLl9wbGFjZXMgPSBwbGFjZXM7XG4gIC8vICAgICByZXR1cm4gdGhpcztcbiAgLy8gICB9XG4gIC8vXG4gIC8vICAgd2l0aChwYXJhbWV0ZXJzOiB7IFtwYXJhbWV0ZXI6IHN0cmluZ106IGFueSB9KTogdGhpcyB7XG4gIC8vICAgICB0aGlzLm1hdGNoaW5nKHN0YXRlID0+IHtcbiAgLy8gICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHBhcmFtZXRlcnMpLnJlZHVjZSgoYWNjLCBrZXkpID0+IHtcbiAgLy8gICAgICAgICBjb25zdCBtYXRjaFZhbHVlID0gcGFyYW1ldGVyc1trZXldO1xuICAvLyAgICAgICAgIGNvbnN0IHZpc2l0VmFsdWUgPSBzdGF0ZS5nZXQoa2V5KTtcbiAgLy8gICAgICAgICBjb25zdCBtYXRjaGVkID0gbWF0Y2hWYWx1ZSA9PT0gJyonID8gIV8uaXNOaWwodmlzaXRWYWx1ZSkgOiB2aXNpdFZhbHVlID09IG1hdGNoVmFsdWU7XG4gIC8vICAgICAgICAgLy8gTG9nZ2VyLmdldCh0aGlzKS5pbmZvKGBtYXRjaGVkPSR7bWF0Y2hlZH1gLCBwYXJhbWV0ZXJzLCB2aXNpdFZhbHVlKTtcbiAgLy8gICAgICAgICByZXR1cm4gYWNjICYmIG1hdGNoZWQ7XG4gIC8vICAgICAgIH0sIHRydWUpO1xuICAvLyAgICAgfSk7XG4gIC8vICAgICByZXR1cm4gdGhpcztcbiAgLy8gICB9XG4gIC8vXG4gIC8vICAgbGFzdCgpOiBWaXNpdC5TdGF0ZSB7XG4gIC8vICAgICByZXR1cm4gXy5maW5kTGFzdCh0aGlzLl9oaXN0b3J5LCB2aXNpdCA9PiB0aGlzLl9tYXRjaGVzKHZpc2l0KSlcbiAgLy8gICB9XG4gIC8vXG4gIC8vICAgLy8gQHRyYWNlXG4gIC8vICAgYWxsVGhhdE1hdGNoKCk6IFZpc2l0LlN0YXRlW10ge1xuICAvLyAgICAgcmV0dXJuIF8uZmlsdGVyKHRoaXMuX2hpc3RvcnksIHZpc2l0ID0+IHRoaXMuX21hdGNoZXModmlzaXQpKS5zbGljZSgtdGhpcy5fbGltaXQpO1xuICAvLyAgIH1cbiAgLy9cbiAgLy8gICAvLyBAdHJhY2VcbiAgLy8gICBtb3N0UmVjZW50VmFsdWVPZjxUPWFueT4ocGFyYW06IHN0cmluZywgZGVmYXVsdFZhbHVlOiBUID0gbnVsbCk6IFQge1xuICAvLyAgICAgY29uc3QgbGFzdFN0YXRlV2l0aFBhcmFtID0gXy5maW5kTGFzdCh0aGlzLmFsbFRoYXRNYXRjaCgpLCBzdGF0ZSA9PiAhXy5pc05pbChzdGF0ZS5nZXQocGFyYW0pKSk7XG4gIC8vICAgICByZXR1cm4gXy5pc05pbChsYXN0U3RhdGVXaXRoUGFyYW0pID8gZGVmYXVsdFZhbHVlIDogbGFzdFN0YXRlV2l0aFBhcmFtLmdldChwYXJhbSk7XG4gIC8vICAgfVxuICAvL1xuICAvLyAgIGxpbWl0KGxpbWl0OiBudW1iZXIpOiB0aGlzIHtcbiAgLy8gICAgIHRoaXMuX2xpbWl0ID0gbGltaXQ7XG4gIC8vICAgICByZXR1cm4gdGhpcztcbiAgLy8gICB9XG4gIC8vXG4gIC8vICAgbWF0Y2hpbmcocHJlZGljYXRlOiAodmlzaXQ6IFZpc2l0LlN0YXRlKSA9PiBib29sZWFuKTogdGhpcyB7XG4gIC8vICAgICB0aGlzLl9wcmVkaWNhdGUgPSBwcmVkaWNhdGU7XG4gIC8vICAgICByZXR1cm4gdGhpcztcbiAgLy8gICB9XG4gIC8vXG4gIC8vICAgX21hdGNoZXModmlzaXQ6IFZpc2l0LlN0YXRlKSB7XG4gIC8vICAgICByZXR1cm4gdGhpcy5faXNQbGFjZU1hdGNoKHZpc2l0KSAmJiB0aGlzLl9wcmVkaWNhdGUodmlzaXQpO1xuICAvLyAgIH1cbiAgLy9cbiAgLy8gICBfaXNQbGFjZU1hdGNoKHZpc2l0OiBWaXNpdC5TdGF0ZSkge1xuICAvLyAgICAgcmV0dXJuIHRoaXMuX3BsYWNlcy5sZW5ndGggPCAxIHx8IHRoaXMuX3BsYWNlcy5pbmNsdWRlcyh2aXNpdC5wbGFjZSlcbiAgLy8gICB9XG4gIC8vXG4gIC8vIH1cblxufVxuIl19
|