text-to-map 1.1.45 → 1.1.47
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/LICENSE +21 -21
- package/README.md +69 -69
- package/dist/bin/address-points.d.ts +1 -1
- package/dist/bin/address-points.js +16 -16
- package/dist/bin/cities.d.ts +1 -1
- package/dist/bin/cities.js +10 -10
- package/dist/bin/clear-all.d.ts +1 -1
- package/dist/bin/clear-all.js +13 -13
- package/dist/bin/constants.d.ts +2 -2
- package/dist/bin/constants.js +4 -4
- package/dist/bin/generate-syntax-diagrams.d.ts +1 -1
- package/dist/bin/generate-syntax-diagrams.js +20 -20
- package/dist/bin/init-db.d.ts +1 -1
- package/dist/bin/init-db.js +8 -8
- package/dist/bin/knex.d.ts +1 -1
- package/dist/bin/knex.js +10 -10
- package/dist/bin/parse-ordinance.d.ts +1 -1
- package/dist/bin/parse-ordinance.js +74 -74
- package/dist/bin/polygons.d.ts +1 -1
- package/dist/bin/polygons.js +27 -27
- package/dist/bin/regions.d.ts +1 -1
- package/dist/bin/regions.js +10 -10
- package/dist/bin/schools.d.ts +1 -1
- package/dist/bin/schools.js +10 -10
- package/dist/bin/streets.d.ts +1 -1
- package/dist/bin/streets.js +19 -19
- package/dist/bin/sync-all.d.ts +1 -1
- package/dist/bin/sync-all.js +4 -4
- package/dist/db/address-points.d.ts +59 -59
- package/dist/db/address-points.js +401 -399
- package/dist/db/cities.d.ts +7 -7
- package/dist/db/cities.js +95 -95
- package/dist/db/db.d.ts +37 -37
- package/dist/db/db.js +191 -191
- package/dist/db/founders.d.ts +14 -14
- package/dist/db/founders.js +461 -461
- package/dist/db/meta.d.ts +4 -4
- package/dist/db/meta.js +26 -26
- package/dist/db/migrations/20230704125715_initial.js +304 -304
- package/dist/db/migrations/20230731232915_city_positions.js +13 -13
- package/dist/db/migrations/20240106224603_city_polygon.js +11 -11
- package/dist/db/migrations/20240320200534_district_polygon.js +11 -11
- package/dist/db/migrations/20250316162700_kindergartens.js +12 -12
- package/dist/db/regions.d.ts +31 -31
- package/dist/db/regions.js +81 -81
- package/dist/db/schools.d.ts +7 -7
- package/dist/db/schools.js +95 -95
- package/dist/db/street-sync.d.ts +6 -6
- package/dist/db/street-sync.js +22 -22
- package/dist/db/sync-log.d.ts +9 -9
- package/dist/db/sync-log.js +66 -66
- package/dist/db/types.d.ts +59 -59
- package/dist/db/types.js +26 -26
- package/dist/index.d.ts +23 -23
- package/dist/index.js +32 -32
- package/dist/open-data-sync/address-points.d.ts +2 -2
- package/dist/open-data-sync/address-points.js +68 -68
- package/dist/open-data-sync/cities.d.ts +2 -2
- package/dist/open-data-sync/cities.js +32 -32
- package/dist/open-data-sync/common.d.ts +2 -2
- package/dist/open-data-sync/common.js +22 -22
- package/dist/open-data-sync/regions.d.ts +2 -2
- package/dist/open-data-sync/regions.js +37 -37
- package/dist/open-data-sync/schools.d.ts +3 -3
- package/dist/open-data-sync/schools.js +207 -207
- package/dist/open-data-sync/streets.d.ts +2 -2
- package/dist/open-data-sync/streets.js +132 -132
- package/dist/smd-to-csv/json-to-csv.d.ts +1 -1
- package/dist/smd-to-csv/json-to-csv.js +154 -154
- package/dist/smd-to-csv/ordinance-to-csv-rules.d.ts +1 -1
- package/dist/smd-to-csv/ordinance-to-csv-rules.js +23 -23
- package/dist/smd-to-csv/txt-to-json.d.ts +1 -1
- package/dist/smd-to-csv/txt-to-json.js +92 -92
- package/dist/souradnice.csv +6260 -6260
- package/dist/street-markdown/municipality.d.ts +11 -11
- package/dist/street-markdown/municipality.js +116 -116
- package/dist/street-markdown/polygons.d.ts +7 -7
- package/dist/street-markdown/polygons.js +261 -261
- package/dist/street-markdown/roman-numerals.d.ts +1 -1
- package/dist/street-markdown/roman-numerals.js +68 -68
- package/dist/street-markdown/smd-line-parser.d.ts +4 -4
- package/dist/street-markdown/smd-line-parser.js +40 -40
- package/dist/street-markdown/smd-parser.d.ts +23 -23
- package/dist/street-markdown/smd-parser.js +393 -393
- package/dist/street-markdown/smd.d.ts +24 -24
- package/dist/street-markdown/smd.js +440 -440
- package/dist/street-markdown/token-definition.d.ts +25 -25
- package/dist/street-markdown/token-definition.js +168 -168
- package/dist/street-markdown/types.d.ts +148 -148
- package/dist/street-markdown/types.js +13 -13
- package/dist/utils/atom.d.ts +2 -2
- package/dist/utils/atom.js +57 -57
- package/dist/utils/helpers.d.ts +28 -28
- package/dist/utils/helpers.js +176 -176
- package/dist/utils/jtsk2wgs84.d.ts +17 -17
- package/dist/utils/jtsk2wgs84.js +82 -82
- package/package.json +109 -109
|
@@ -1,393 +1,393 @@
|
|
|
1
|
-
import { EmbeddedActionsParser, EOF } from "chevrotain";
|
|
2
|
-
import { splitStreetViaRomanNumerals } from "./roman-numerals";
|
|
3
|
-
import { AllType, AndAbove, AndBelow, DescriptiveType, EvenType, From, Hyphen, MainSeparator, MunicipalityPartName, Number, OddType, Separator, Slash, StreetName, To, Without, } from "./token-definition";
|
|
4
|
-
import { SeriesType } from "./types";
|
|
5
|
-
export class SmdParser extends EmbeddedActionsParser {
|
|
6
|
-
constructor(tokenVocabulary) {
|
|
7
|
-
super(tokenVocabulary);
|
|
8
|
-
this.street = this.RULE("street", () => {
|
|
9
|
-
let result;
|
|
10
|
-
this.OR([
|
|
11
|
-
{
|
|
12
|
-
ALT: () => {
|
|
13
|
-
result = this.SUBRULE(this.streetNameAndNumbersSpecs);
|
|
14
|
-
},
|
|
15
|
-
},
|
|
16
|
-
{
|
|
17
|
-
ALT: () => {
|
|
18
|
-
result = {
|
|
19
|
-
type: "street",
|
|
20
|
-
street: this.CONSUME(StreetName).image,
|
|
21
|
-
numberSpec: [],
|
|
22
|
-
};
|
|
23
|
-
},
|
|
24
|
-
},
|
|
25
|
-
{
|
|
26
|
-
ALT: () => {
|
|
27
|
-
result = this.SUBRULE(this.municipalityPartNameAndNumbersSpecs);
|
|
28
|
-
},
|
|
29
|
-
},
|
|
30
|
-
{
|
|
31
|
-
ALT: () => {
|
|
32
|
-
const municipalityPart = parseMunicipalityPartName(this.CONSUME(MunicipalityPartName).image);
|
|
33
|
-
result = {
|
|
34
|
-
type: "municipalityPart",
|
|
35
|
-
municipalityPart,
|
|
36
|
-
numberSpec: [],
|
|
37
|
-
};
|
|
38
|
-
},
|
|
39
|
-
},
|
|
40
|
-
]);
|
|
41
|
-
if (result.type === "street") {
|
|
42
|
-
return splitStreetViaRomanNumerals(result.street).map((street) => ({
|
|
43
|
-
type: "street",
|
|
44
|
-
street,
|
|
45
|
-
numberSpec: result.numberSpec,
|
|
46
|
-
}));
|
|
47
|
-
}
|
|
48
|
-
else {
|
|
49
|
-
return [result];
|
|
50
|
-
}
|
|
51
|
-
});
|
|
52
|
-
this.streetNameAndNumbersSpecs = this.RULE("streetNameAndNumbersSpecs", () => {
|
|
53
|
-
const street = this.CONSUME(StreetName).image;
|
|
54
|
-
this.OPTION(() => {
|
|
55
|
-
this.CONSUME(MainSeparator);
|
|
56
|
-
});
|
|
57
|
-
const numberSpec = this.SUBRULE(this.numberSpecs);
|
|
58
|
-
return { type: "street", street, numberSpec };
|
|
59
|
-
});
|
|
60
|
-
this.municipalityPartNameAndNumbersSpecs = this.RULE("municipalityPartNameAndNumbersSpecs", () => {
|
|
61
|
-
const municipalityPart = parseMunicipalityPartName(this.CONSUME(MunicipalityPartName).image);
|
|
62
|
-
this.OPTION(() => {
|
|
63
|
-
this.CONSUME(MainSeparator);
|
|
64
|
-
});
|
|
65
|
-
const numberSpec = this.SUBRULE(this.numberSpecs);
|
|
66
|
-
return {
|
|
67
|
-
type: "municipalityPart",
|
|
68
|
-
municipalityPart,
|
|
69
|
-
numberSpec,
|
|
70
|
-
};
|
|
71
|
-
});
|
|
72
|
-
this.numberSpecs = this.RULE("numberSpecs", () => {
|
|
73
|
-
const positiveResult = [];
|
|
74
|
-
let negativeResult;
|
|
75
|
-
this.OR([
|
|
76
|
-
{
|
|
77
|
-
GATE: () => this.LA(2).tokenType === Without,
|
|
78
|
-
ALT: () => {
|
|
79
|
-
const type = this.SUBRULE(this.seriesType);
|
|
80
|
-
this.CONSUME(Without);
|
|
81
|
-
this.OPTION(() => {
|
|
82
|
-
this.CONSUME(AllType);
|
|
83
|
-
});
|
|
84
|
-
const ranges = this.SUBRULE(this.rangeList);
|
|
85
|
-
return { negative: true, type, ranges };
|
|
86
|
-
},
|
|
87
|
-
},
|
|
88
|
-
{
|
|
89
|
-
ALT: () => {
|
|
90
|
-
this.CONSUME2(Without);
|
|
91
|
-
this.OR1([
|
|
92
|
-
{
|
|
93
|
-
GATE: this._gatePostfixTypeSeriesSpec,
|
|
94
|
-
ALT: () => {
|
|
95
|
-
const { type, ranges } = this.SUBRULE(this.postfixTypeSeriesSpec);
|
|
96
|
-
negativeResult = { negative: true, type, ranges };
|
|
97
|
-
},
|
|
98
|
-
},
|
|
99
|
-
{
|
|
100
|
-
ALT: () => {
|
|
101
|
-
const type = this.SUBRULE2(this.seriesType);
|
|
102
|
-
const ranges = this.SUBRULE2(this.rangeList);
|
|
103
|
-
negativeResult = { negative: true, type, ranges };
|
|
104
|
-
},
|
|
105
|
-
},
|
|
106
|
-
]);
|
|
107
|
-
},
|
|
108
|
-
},
|
|
109
|
-
{
|
|
110
|
-
ALT: () => {
|
|
111
|
-
this.AT_LEAST_ONE_SEP({
|
|
112
|
-
SEP: Separator,
|
|
113
|
-
DEF: () => {
|
|
114
|
-
positiveResult.push(this.SUBRULE(this.seriesSpecs));
|
|
115
|
-
},
|
|
116
|
-
});
|
|
117
|
-
},
|
|
118
|
-
},
|
|
119
|
-
]);
|
|
120
|
-
if (negativeResult) {
|
|
121
|
-
return negativeResult;
|
|
122
|
-
}
|
|
123
|
-
return positiveResult;
|
|
124
|
-
});
|
|
125
|
-
this.seriesSpecs = this.RULE("seriesSpecs", () => {
|
|
126
|
-
let ranges = [];
|
|
127
|
-
let type;
|
|
128
|
-
this.OR([
|
|
129
|
-
{
|
|
130
|
-
GATE: this._gatePostfixTypeSeriesSpec,
|
|
131
|
-
ALT: () => {
|
|
132
|
-
({ type, ranges } = this.SUBRULE(this.postfixTypeSeriesSpec));
|
|
133
|
-
},
|
|
134
|
-
},
|
|
135
|
-
{
|
|
136
|
-
ALT: () => {
|
|
137
|
-
type = this.SUBRULE(this.seriesType);
|
|
138
|
-
this.OPTION(() => {
|
|
139
|
-
ranges = this.SUBRULE(this.rangeList);
|
|
140
|
-
});
|
|
141
|
-
},
|
|
142
|
-
},
|
|
143
|
-
{
|
|
144
|
-
ALT: () => {
|
|
145
|
-
({ type, ranges } = this.SUBRULE2(this.fromAndAboveWithType));
|
|
146
|
-
},
|
|
147
|
-
},
|
|
148
|
-
{
|
|
149
|
-
ALT: () => {
|
|
150
|
-
({ type, ranges } = this.SUBRULE(this.toOrBelowWithType));
|
|
151
|
-
},
|
|
152
|
-
},
|
|
153
|
-
]);
|
|
154
|
-
return { type, ranges };
|
|
155
|
-
});
|
|
156
|
-
this._gatePostfixTypeSeriesSpec = () => {
|
|
157
|
-
let index = 2;
|
|
158
|
-
while (![Separator, EOF].includes(this.LA(index).tokenType)) {
|
|
159
|
-
if ([OddType, EvenType].includes(this.LA(index).tokenType)) {
|
|
160
|
-
return true;
|
|
161
|
-
}
|
|
162
|
-
index++;
|
|
163
|
-
}
|
|
164
|
-
return false;
|
|
165
|
-
};
|
|
166
|
-
this.postfixTypeSeriesSpec = this.RULE("postfixTypeSeriesSpec", () => {
|
|
167
|
-
this.CONSUME(AllType);
|
|
168
|
-
const ranges = [this.SUBRULE(this.rangeOrNumber)];
|
|
169
|
-
let type;
|
|
170
|
-
this.OR1([
|
|
171
|
-
{
|
|
172
|
-
ALT: () => {
|
|
173
|
-
this.CONSUME(OddType);
|
|
174
|
-
type = SeriesType.Odd;
|
|
175
|
-
},
|
|
176
|
-
},
|
|
177
|
-
{
|
|
178
|
-
ALT: () => {
|
|
179
|
-
this.CONSUME1(EvenType);
|
|
180
|
-
type = SeriesType.Even;
|
|
181
|
-
},
|
|
182
|
-
},
|
|
183
|
-
]);
|
|
184
|
-
return { type, ranges };
|
|
185
|
-
});
|
|
186
|
-
this.rangeList = this.RULE("rangeList", () => {
|
|
187
|
-
let ranges = [];
|
|
188
|
-
ranges.push(this.SUBRULE(this.rangeOrNumber));
|
|
189
|
-
this.MANY({
|
|
190
|
-
GATE: () => [Number, To, From].includes(this.LA(2).tokenType),
|
|
191
|
-
DEF: () => {
|
|
192
|
-
this.CONSUME(Separator);
|
|
193
|
-
ranges.push(this.SUBRULE2(this.rangeOrNumber));
|
|
194
|
-
},
|
|
195
|
-
});
|
|
196
|
-
return ranges;
|
|
197
|
-
});
|
|
198
|
-
this.seriesType = this.RULE("seriesType", () => {
|
|
199
|
-
let type;
|
|
200
|
-
this.OR([
|
|
201
|
-
{
|
|
202
|
-
ALT: () => {
|
|
203
|
-
this.CONSUME(OddType);
|
|
204
|
-
type = SeriesType.Odd;
|
|
205
|
-
},
|
|
206
|
-
},
|
|
207
|
-
{
|
|
208
|
-
ALT: () => {
|
|
209
|
-
this.CONSUME1(EvenType);
|
|
210
|
-
type = SeriesType.Even;
|
|
211
|
-
},
|
|
212
|
-
},
|
|
213
|
-
{
|
|
214
|
-
ALT: () => {
|
|
215
|
-
this.CONSUME2(AllType);
|
|
216
|
-
type = SeriesType.All;
|
|
217
|
-
},
|
|
218
|
-
},
|
|
219
|
-
{
|
|
220
|
-
ALT: () => {
|
|
221
|
-
this.CONSUME3(DescriptiveType);
|
|
222
|
-
type = SeriesType.Description;
|
|
223
|
-
},
|
|
224
|
-
},
|
|
225
|
-
]);
|
|
226
|
-
return type;
|
|
227
|
-
});
|
|
228
|
-
this.rangeOrNumber = this.RULE("rangeOrNumber", () => {
|
|
229
|
-
let result;
|
|
230
|
-
this.OR([
|
|
231
|
-
{
|
|
232
|
-
ALT: () => {
|
|
233
|
-
result = this.SUBRULE(this.range);
|
|
234
|
-
},
|
|
235
|
-
},
|
|
236
|
-
{
|
|
237
|
-
ALT: () => {
|
|
238
|
-
result = this.SUBRULE(this.fromAndAbove);
|
|
239
|
-
},
|
|
240
|
-
},
|
|
241
|
-
{
|
|
242
|
-
ALT: () => {
|
|
243
|
-
result = this.SUBRULE(this.toOrBelow);
|
|
244
|
-
},
|
|
245
|
-
},
|
|
246
|
-
{
|
|
247
|
-
ALT: () => {
|
|
248
|
-
result = this.SUBRULE(this.fullStreetNumber);
|
|
249
|
-
},
|
|
250
|
-
},
|
|
251
|
-
{
|
|
252
|
-
ALT: () => {
|
|
253
|
-
const n = parseRichNumber(this.CONSUME(Number).image);
|
|
254
|
-
result = { from: n, to: n };
|
|
255
|
-
},
|
|
256
|
-
},
|
|
257
|
-
]);
|
|
258
|
-
return result;
|
|
259
|
-
});
|
|
260
|
-
this.range = this.RULE("range", () => {
|
|
261
|
-
const from = parseRichNumber(this.CONSUME(Number).image);
|
|
262
|
-
this.OR([
|
|
263
|
-
{ ALT: () => this.CONSUME1(Hyphen) },
|
|
264
|
-
{ ALT: () => this.CONSUME2(MainSeparator) },
|
|
265
|
-
]);
|
|
266
|
-
this.OPTION(() => {
|
|
267
|
-
this.CONSUME(AllType);
|
|
268
|
-
});
|
|
269
|
-
const to = parseRichNumber(this.CONSUME3(Number).image);
|
|
270
|
-
return { from, to };
|
|
271
|
-
});
|
|
272
|
-
this.fromAndAbove = this.RULE("fromAndAbove", () => {
|
|
273
|
-
let from;
|
|
274
|
-
this.OR([
|
|
275
|
-
{
|
|
276
|
-
ALT: () => {
|
|
277
|
-
from = parseRichNumber(this.CONSUME(Number).image);
|
|
278
|
-
this.CONSUME(AndAbove);
|
|
279
|
-
},
|
|
280
|
-
},
|
|
281
|
-
{
|
|
282
|
-
ALT: () => {
|
|
283
|
-
this.CONSUME(From);
|
|
284
|
-
this.OPTION(() => {
|
|
285
|
-
this.CONSUME(AllType);
|
|
286
|
-
});
|
|
287
|
-
from = parseRichNumber(this.CONSUME2(Number).image);
|
|
288
|
-
this.OPTION2(() => {
|
|
289
|
-
this.CONSUME2(AndAbove);
|
|
290
|
-
});
|
|
291
|
-
},
|
|
292
|
-
},
|
|
293
|
-
]);
|
|
294
|
-
return { from };
|
|
295
|
-
});
|
|
296
|
-
this.fromAndAboveWithType = this.RULE("fromAndAboveWithType", () => {
|
|
297
|
-
let type = SeriesType.All;
|
|
298
|
-
this.CONSUME(From);
|
|
299
|
-
this.OPTION(() => {
|
|
300
|
-
this.OR([
|
|
301
|
-
{
|
|
302
|
-
ALT: () => {
|
|
303
|
-
type = SeriesType.All;
|
|
304
|
-
this.CONSUME(AllType);
|
|
305
|
-
},
|
|
306
|
-
},
|
|
307
|
-
{
|
|
308
|
-
ALT: () => {
|
|
309
|
-
type = SeriesType.Description;
|
|
310
|
-
this.CONSUME(DescriptiveType);
|
|
311
|
-
},
|
|
312
|
-
},
|
|
313
|
-
]);
|
|
314
|
-
});
|
|
315
|
-
const from = parseRichNumber(this.CONSUME(Number).image);
|
|
316
|
-
this.OPTION2(() => {
|
|
317
|
-
this.CONSUME(AndAbove);
|
|
318
|
-
});
|
|
319
|
-
return { type, ranges: [{ from }] };
|
|
320
|
-
});
|
|
321
|
-
this.toOrBelow = this.RULE("toOrBelow", () => {
|
|
322
|
-
let to;
|
|
323
|
-
this.OR([
|
|
324
|
-
{
|
|
325
|
-
ALT: () => {
|
|
326
|
-
to = parseRichNumber(this.CONSUME(Number).image);
|
|
327
|
-
this.CONSUME(AndBelow);
|
|
328
|
-
},
|
|
329
|
-
},
|
|
330
|
-
{
|
|
331
|
-
ALT: () => {
|
|
332
|
-
this.CONSUME2(To);
|
|
333
|
-
to = parseRichNumber(this.CONSUME2(Number).image);
|
|
334
|
-
},
|
|
335
|
-
},
|
|
336
|
-
]);
|
|
337
|
-
return { to };
|
|
338
|
-
});
|
|
339
|
-
this.toOrBelowWithType = this.RULE("toOrBelowWithType", () => {
|
|
340
|
-
let type = SeriesType.All;
|
|
341
|
-
this.CONSUME(To);
|
|
342
|
-
this.OPTION(() => {
|
|
343
|
-
this.OR([
|
|
344
|
-
{
|
|
345
|
-
ALT: () => {
|
|
346
|
-
type = SeriesType.All;
|
|
347
|
-
this.CONSUME(AllType);
|
|
348
|
-
},
|
|
349
|
-
},
|
|
350
|
-
{
|
|
351
|
-
ALT: () => {
|
|
352
|
-
type = SeriesType.Description;
|
|
353
|
-
this.CONSUME(DescriptiveType);
|
|
354
|
-
},
|
|
355
|
-
},
|
|
356
|
-
]);
|
|
357
|
-
});
|
|
358
|
-
const to = parseRichNumber(this.CONSUME(Number).image);
|
|
359
|
-
return { type, ranges: [{ to }] };
|
|
360
|
-
});
|
|
361
|
-
this.fullStreetNumber = this.RULE("fullStreetNumber", () => {
|
|
362
|
-
const descriptiveNumber = parseRichNumber(this.CONSUME(Number).image);
|
|
363
|
-
this.CONSUME(Slash);
|
|
364
|
-
const orientationNumber = parseRichNumber(this.CONSUME2(Number).image);
|
|
365
|
-
return {
|
|
366
|
-
descriptionNumber: descriptiveNumber,
|
|
367
|
-
orientationalNumber: orientationNumber,
|
|
368
|
-
};
|
|
369
|
-
});
|
|
370
|
-
this.performSelfAnalysis();
|
|
371
|
-
}
|
|
372
|
-
}
|
|
373
|
-
const numberWithCharacterPattern = /^(\d+)([a-z])$/;
|
|
374
|
-
export const parseRichNumber = (number) => {
|
|
375
|
-
if (numberWithCharacterPattern.test(number)) {
|
|
376
|
-
const match = numberWithCharacterPattern.exec(number);
|
|
377
|
-
return {
|
|
378
|
-
number: parseInt(match[1]),
|
|
379
|
-
letter: match[2],
|
|
380
|
-
};
|
|
381
|
-
}
|
|
382
|
-
else {
|
|
383
|
-
return {
|
|
384
|
-
number: parseInt(number),
|
|
385
|
-
};
|
|
386
|
-
}
|
|
387
|
-
};
|
|
388
|
-
const municipalityPartPattern = /^část (?<type>obce|města) (?<name>.+)$/;
|
|
389
|
-
export const parseMunicipalityPartName = (name) => {
|
|
390
|
-
const match = municipalityPartPattern.exec(name);
|
|
391
|
-
return match?.groups.name?.trim() ?? "";
|
|
392
|
-
};
|
|
393
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21kLXBhcnNlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdHJlZXQtbWFya2Rvd24vc21kLXBhcnNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsR0FBRyxFQUFtQixNQUFNLFlBQVksQ0FBQztBQUN6RSxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUUvRCxPQUFPLEVBQ0wsT0FBTyxFQUNQLFFBQVEsRUFDUixRQUFRLEVBQ1IsZUFBZSxFQUNmLFFBQVEsRUFDUixJQUFJLEVBQ0osTUFBTSxFQUNOLGFBQWEsRUFDYixvQkFBb0IsRUFDcEIsTUFBTSxFQUNOLE9BQU8sRUFDUCxTQUFTLEVBQ1QsS0FBSyxFQUNMLFVBQVUsRUFDVixFQUFFLEVBQ0YsT0FBTyxHQUNSLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFvRCxVQUFVLEVBQVcsTUFBTSxTQUFTLENBQUM7QUFFaEcsTUFBTSxPQUFPLFNBQVUsU0FBUSxxQkFBcUI7SUFDbEQsWUFBWSxlQUFnQztRQUMxQyxLQUFLLENBQUMsZUFBZSxDQUFDLENBQUM7UUFJbEIsV0FBTSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEdBQWMsRUFBRTtZQUNsRCxJQUFJLE1BQU0sQ0FBQztZQUNYLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQ047b0JBQ0UsR0FBRyxFQUFFLEdBQUcsRUFBRTt3QkFDUixNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQUMsQ0FBQztvQkFDeEQsQ0FBQztpQkFDRjtnQkFDRDtvQkFDRSxHQUFHLEVBQUUsR0FBRyxFQUFFO3dCQUNSLE1BQU0sR0FBRzs0QkFDUCxJQUFJLEVBQUUsUUFBUTs0QkFDZCxNQUFNLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxLQUFLOzRCQUN0QyxVQUFVLEVB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Q0gsQ0FBQyxDQUFDO0FBRUYsTUFBTSx1QkFBdUIsR0FBRyx3Q0FBd0MsQ0FBQztBQUV6RSxNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBRyxDQUFDLElBQVksRUFBVSxFQUFFO0lBQ2hFLE1BQU0sS0FBSyxHQUFHLHVCQUF1QixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNqRCxPQUFPLEtBQUssRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUMxQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbWJlZGRlZEFjdGlvbnNQYXJzZXIsIEVPRiwgVG9rZW5Wb2NhYnVsYXJ5IH0gZnJvbSBcImNoZXZyb3RhaW5cIjtcclxuaW1wb3J0IHsgc3BsaXRTdHJlZXRWaWFSb21hbk51bWVyYWxzIH0gZnJvbSBcIi4vcm9tYW4tbnVtZXJhbHNcIjtcclxuXHJcbmltcG9ydCB7XHJcbiAgQWxsVHlwZSxcclxuICBBbmRBYm92ZSxcclxuICBBbmRCZWxvdyxcclxuICBEZXNjcmlwdGl2ZVR5cGUsXHJcbiAgRXZlblR5cGUsXHJcbiAgRnJvbSxcclxuICBIeXBoZW4sXHJcbiAgTWFpblNlcGFyYXRvcixcclxuICBNdW5pY2lwYWxpdHlQYXJ0TmFtZSxcclxuICBOdW1iZXIsXHJcbiAgT2RkVHlwZSxcclxuICBTZXBhcmF0b3IsXHJcbiAgU2xhc2gsXHJcbiAgU3RyZWV0TmFtZSxcclxuICBUbyxcclxuICBXaXRob3V0LFxyXG59IGZyb20gXCIuL3Rva2VuLWRlZmluaXRpb25cIjtcclxuaW1wb3J0IHsgRnVsbFN0cmVldE51bWJlciwgTmVnYXRpdmVTZXJpZXNTcGVjLCBSaWNoTnVtYmVyLCBTZXJpZXNUeXBlLCBTbWRMaW5lIH0gZnJvbSBcIi4vdHlwZXNcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBTbWRQYXJzZXIgZXh0ZW5kcyBFbWJlZGRlZEFjdGlvbnNQYXJzZXIge1xyXG4gIGNvbnN0cnVjdG9yKHRva2VuVm9jYWJ1bGFyeTogVG9rZW5Wb2NhYnVsYXJ5KSB7XHJcbiAgICBzdXBlcih0b2tlblZvY2FidWxhcnkpO1xyXG4gICAgdGhpcy5wZXJmb3JtU2VsZkFuYWx5c2lzKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RyZWV0ID0gdGhpcy5SVUxFKFwic3RyZWV0XCIsICgpOiBTbWRMaW5lW10gPT4ge1xyXG4gICAgbGV0IHJlc3VsdDtcclxuICAgIHRoaXMuT1IoW1xyXG4gICAgICB7XHJcbiAgICAgICAgQUxUOiAoKSA9PiB7XHJcbiAgICAgICAgICByZXN1bHQgPSB0aGlzLlNVQlJVTEUodGhpcy5zdHJlZXROYW1lQW5kTnVtYmVyc1NwZWNzKTtcclxuICAgICAgICB9LFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgQUxUOiAoKSA9PiB7XHJcbiAgICAgICAgICByZXN1bHQgPSB7XHJcbiAgICAgICAgICAgIHR5cGU6IFwic3RyZWV0XCIsXHJcbiAgICAgICAgICAgIHN0cmVldDogdGhpcy5DT05TVU1FKFN0cmVldE5hbWUpLmltYWdlLFxyXG4gICAgICAgICAgICBudW1iZXJTcGVjOiBbXSxcclxuICAgICAgICAgIH0gYXMgU21kTGluZTtcclxuICAgICAgICB9LFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgQUxUOiAoKSA9PiB7XHJcbiAgICAgICAgICByZXN1bHQgPSB0aGlzLlNVQlJVTEUodGhpcy5tdW5pY2lwYWxpdHlQYXJ0TmFtZUFuZE51bWJlcnNTcGVjcyk7XHJcbiAgICAgICAgfSxcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIEFMVDogKCkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgbXVuaWNpcGFsaXR5UGFydCA9IHBhcnNlTXVuaWNpcGFsaXR5UGFydE5hbWUoXHJcbiAgICAgICAgICAgIHRoaXMuQ09OU1VNRShNdW5pY2lwYWxpdHlQYXJ0TmFtZSkuaW1hZ2VcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICByZXN1bHQgPSB7XHJcbiAgICAgICAgICAgIHR5cGU6IFwibXVuaWNpcGFsaXR5UGFydFwiLFxyXG4gICAgICAgICAgICBtdW5pY2lwYWxpdHlQYXJ0LFxyXG4gICAgICAgICAgICBudW1iZXJTcGVjOiBbXSxcclxuICAgICAgICAgIH0gYXMgU21kTGluZTtcclxuICAgICAgICB9LFxyXG4gICAgICB9LFxyXG4gICAgXSk7XHJcblxyXG4gICAgaWYgKHJlc3VsdC50eXBlID09PSBcInN0cmVldFwiKSB7XHJcbiAgICAgIHJldHVybiBzcGxpdFN0cmVldFZpYVJvbWFuTnVtZXJhbHMocmVzdWx0LnN0cmVldCkubWFwKChzdHJlZXQpID0+ICh7XHJcbiAgICAgICAgdHlwZTogXCJzdHJlZXRcIixcclxuICAgICAgICBzdHJlZXQsXHJcbiAgICAgICAgbnVtYmVyU3BlYzogcmVzdWx0Lm51bWJlclNwZWMsXHJcbiAgICAgIH0pKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBbcmVzdWx0XTtcclxuICAgIH1cclxuICB9KTtcclxuXHJcbiAgcHJpdmF0ZSBzdHJlZXROYW1lQW5kTnVtYmVyc1NwZWNzID0gdGhpcy5SVUxFKFxyXG4gICAgXCJzdHJlZXROYW1lQW5kTnVtYmVyc1NwZWNzXCIsXHJcbiAgICAoKSA9PiB7XHJcbiAgICAgIGNvbnN0IHN0cmVldCA9IHRoaXMuQ09OU1VNRShTdHJlZXROYW1lKS5pbWFnZTtcclxuICAgICAgdGhpcy5PUFRJT04oKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuQ09OU1VNRShNYWluU2VwYXJhdG9yKTtcclxuICAgICAgfSk7XHJcbiAgICAgIGNvbnN0IG51bWJlclNwZWMgPSB0aGlzLlNVQlJVTEUodGhpcy5udW1iZXJTcGVjcyk7XHJcbiAgICAgIHJldHVybiB7IHR5cGU6IFwic3RyZWV0XCIsIHN0cmVldCwgbnVtYmVyU3BlYyB9IGFzIFNtZExpbmU7XHJcbiAgICB9XHJcbiAgKTtcclxuXHJcbiAgcHJpdmF0ZSBtdW5pY2lwYWxpdHlQYXJ0TmFtZUFuZE51bWJlcnNTcGVjcyA9IHRoaXMuUlVMRShcclxuICAgIFwibXVuaWNpcGFsaXR5UGFydE5hbWVBbmROdW1iZXJzU3BlY3NcIixcclxuICAgICgpID0+IHtcclxuICAgICAgY29uc3QgbXVuaWNpcGFsaXR5UGFydCA9IHBhcnNlTXVuaWNpcGFsaXR5UGFydE5hbWUoXHJcbiAgICAgICAgdGhpcy5DT05TVU1FKE11bmljaXBhbGl0eVBhcnROYW1lKS5pbWFnZVxyXG4gICAgICApO1xyXG4gICAgICB0aGlzLk9QVElPTigoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5DT05TVU1FKE1haW5TZXBhcmF0b3IpO1xyXG4gICAgICB9KTtcclxuICAgICAgY29uc3QgbnVtYmVyU3BlYyA9IHRoaXMuU1VCUlVMRSh0aGlzLm51bWJlclNwZWNzKTtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICB0eXBlOiBcIm11bmljaXBhbGl0eVBhcnRcIixcclxuICAgICAgICBtdW5pY2lwYWxpdHlQYXJ0LFxyXG4gICAgICAgIG51bWJlclNwZWMsXHJcbiAgICAgIH0gYXMgU21kTGluZTtcclxuICAgIH1cclxuICApO1xyXG5cclxuICBwcml2YXRlIG51bWJlclNwZWNzID0gdGhpcy5SVUxFKFwibnVtYmVyU3BlY3NcIiwgKCkgPT4ge1xyXG4gICAgY29uc3QgcG9zaXRpdmVSZXN1bHQgPSBbXTtcclxuICAgIGxldCBuZWdhdGl2ZVJlc3VsdDogTmVnYXRpdmVTZXJpZXNTcGVjO1xyXG4gICAgdGhpcy5PUihbXHJcbiAgICAgIHtcclxuICAgICAgICBHQVRFOiAoKSA9PiB0aGlzLkxBKDIpLnRva2VuVHlwZSA9PT0gV2l0aG91dCxcclxuICAgICAgICBBTFQ6ICgpID0+IHtcclxuICAgICAgICAgIGNvbnN0IHR5cGUgPSB0aGlzLlNVQlJVTEUodGhpcy5zZXJpZXNUeXBlKTtcclxuICAgICAgICAgIHRoaXMuQ09OU1VNRShXaXRob3V0KTtcclxuICAgICAgICAgIHRoaXMuT1BUSU9OKCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5DT05TVU1FKEFsbFR5cGUpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICBjb25zdCByYW5nZXMgPSB0aGlzLlNVQlJVTEUodGhpcy5yYW5nZUxpc3QpO1xyXG4gICAgICAgICAgcmV0dXJuIHsgbmVnYXRpdmU6IHRydWUsIHR5cGUsIHJhbmdlcyB9O1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBBTFQ6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMuQ09OU1VNRTIoV2l0aG91dCk7XHJcbiAgICAgICAgICB0aGlzLk9SMShbXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBHQVRFOiB0aGlzLl9nYXRlUG9zdGZpeFR5cGVTZXJpZXNTcGVjLFxyXG4gICAgICAgICAgICAgIEFMVDogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgeyB0eXBlLCByYW5nZXMgfSA9IHRoaXMuU1VCUlVMRShcclxuICAgICAgICAgICAgICAgICAgdGhpcy5wb3N0Zml4VHlwZVNlcmllc1NwZWNcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICBuZWdhdGl2ZVJlc3VsdCA9IHsgbmVnYXRpdmU6IHRydWUsIHR5cGUsIHJhbmdlcyB9O1xyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBBTFQ6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHR5cGUgPSB0aGlzLlNVQlJVTEUyKHRoaXMuc2VyaWVzVHlwZSk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByYW5nZXMgPSB0aGlzLlNVQlJVTEUyKHRoaXMucmFuZ2VMaXN0KTtcclxuICAgICAgICAgICAgICAgIG5lZ2F0aXZlUmVzdWx0ID0geyBuZWdhdGl2ZTogdHJ1ZSwgdHlwZSwgcmFuZ2VzIH07XHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgIF0pO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBBTFQ6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMuQVRfTEVBU1RfT05FX1NFUCh7XHJcbiAgICAgICAgICAgIFNFUDogU2VwYXJhdG9yLFxyXG4gICAgICAgICAgICBERUY6ICgpID0+IHtcclxuICAgICAgICAgICAgICBwb3NpdGl2ZVJlc3VsdC5wdXNoKHRoaXMuU1VCUlVMRSh0aGlzLnNlcmllc1NwZWNzKSk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9LFxyXG4gICAgICB9LFxyXG4gICAgXSk7XHJcbiAgICBpZiAobmVnYXRpdmVSZXN1bHQpIHtcclxuICAgICAgcmV0dXJuIG5lZ2F0aXZlUmVzdWx0O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHBvc2l0aXZlUmVzdWx0O1xyXG4gIH0pO1xyXG5cclxuICBwcml2YXRlIHNlcmllc1NwZWNzID0gdGhpcy5SVUxFKFwic2VyaWVzU3BlY3NcIiwgKCkgPT4ge1xyXG4gICAgbGV0IHJhbmdlcyA9IFtdO1xyXG4gICAgbGV0IHR5cGU6IFNlcmllc1R5cGU7XHJcbiAgICB0aGlzLk9SKFtcclxuICAgICAge1xyXG4gICAgICAgIEdBVEU6IHRoaXMuX2dhdGVQb3N0Zml4VHlwZVNlcmllc1NwZWMsXHJcbiAgICAgICAgQUxUOiAoKSA9PiB7XHJcbiAgICAgICAgICAoeyB0eXBlLCByYW5nZXMgfSA9IHRoaXMuU1VCUlVMRSh0aGlzLnBvc3RmaXhUeXBlU2VyaWVzU3BlYykpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBBTFQ6ICgpID0+IHtcclxuICAgICAgICAgIHR5cGUgPSB0aGlzLlNVQlJVTEUodGhpcy5zZXJpZXNUeXBlKTtcclxuICAgICAgICAgIHRoaXMuT1BUSU9OKCgpID0+IHtcclxuICAgICAgICAgICAgcmFuZ2VzID0gdGhpcy5TVUJSVUxFKHRoaXMucmFuZ2VMaXN0KTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBBTFQ6ICgpID0+IHtcclxuICAgICAgICAgICh7IHR5cGUsIHJhbmdlcyB9ID0gdGhpcy5TVUJSVUxFMih0aGlzLmZyb21BbmRBYm92ZVdpdGhUeXBlKSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIEFMVDogKCkgPT4ge1xyXG4gICAgICAgICAgKHsgdHlwZSwgcmFuZ2VzIH0gPSB0aGlzLlNVQlJVTEUodGhpcy50b09yQmVsb3dXaXRoVHlwZSkpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0sXHJcbiAgICBdKTtcclxuXHJcbiAgICByZXR1cm4geyB0eXBlLCByYW5nZXMgfTtcclxuICB9KTtcclxuXHJcbiAgcHJpdmF0ZSBfZ2F0ZVBvc3RmaXhUeXBlU2VyaWVzU3BlYyA9ICgpOiBib29sZWFuID0+IHtcclxuICAgIGxldCBpbmRleCA9IDI7XHJcbiAgICB3aGlsZSAoIVtTZXBhcmF0b3IsIEVPRl0uaW5jbHVkZXModGhpcy5MQShpbmRleCkudG9rZW5UeXBlKSkge1xyXG4gICAgICBpZiAoW09kZFR5cGUsIEV2ZW5UeXBlXS5pbmNsdWRlcyh0aGlzLkxBKGluZGV4KS50b2tlblR5cGUpKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgaW5kZXgrKztcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9O1xyXG5cclxuICBwcml2YXRlIHBvc3RmaXhUeXBlU2VyaWVzU3BlYyA9IHRoaXMuUlVMRShcInBvc3RmaXhUeXBlU2VyaWVzU3BlY1wiLCAoKSA9PiB7XHJcbiAgICB0aGlzLkNPTlNVTUUoQWxsVHlwZSk7XHJcbiAgICBjb25zdCByYW5nZXMgPSBbdGhpcy5TVUJSVUxFKHRoaXMucmFuZ2VPck51bWJlcildO1xyXG4gICAgbGV0IHR5cGU6IFNlcmllc1R5cGU7XHJcbiAgICB0aGlzLk9SMShbXHJcbiAgICAgIHtcclxuICAgICAgICBBTFQ6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMuQ09OU1VNRShPZGRUeXBlKTtcclxuICAgICAgICAgIHR5cGUgPSBTZXJpZXNUeXBlLk9kZDtcclxuICAgICAgICB9LFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgQUxUOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLkNPTlNVTUUxKEV2ZW5UeXBlKTtcclxuICAgICAgICAgIHR5cGUgPSBTZXJpZXNUeXBlLkV2ZW47XHJcbiAgICAgICAgfSxcclxuICAgICAgfSxcclxuICAgIF0pO1xyXG4gICAgcmV0dXJuIHsgdHlwZSwgcmFuZ2VzIH07XHJcbiAgfSk7XHJcblxyXG4gIHByaXZhdGUgcmFuZ2VMaXN0ID0gdGhpcy5SVUxFKFwicmFuZ2VMaXN0XCIsICgpID0+IHtcclxuICAgIGxldCByYW5nZXMgPSBbXTtcclxuICAgIHJhbmdlcy5wdXNoKHRoaXMuU1VCUlVMRSh0aGlzLnJhbmdlT3JOdW1iZXIpKTtcclxuICAgIHRoaXMuTUFOWSh7XHJcbiAgICAgIEdBVEU6ICgpID0+IFtOdW1iZXIsIFRvLCBGcm9tXS5pbmNsdWRlcyh0aGlzLkxBKDIpLnRva2VuVHlwZSksXHJcbiAgICAgIERFRjogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuQ09OU1VNRShTZXBhcmF0b3IpO1xyXG4gICAgICAgIHJhbmdlcy5wdXNoKHRoaXMuU1VCUlVMRTIodGhpcy5yYW5nZU9yTnVtYmVyKSk7XHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuICAgIHJldHVybiByYW5nZXM7XHJcbiAgfSk7XHJcblxyXG4gIHByaXZhdGUgc2VyaWVzVHlwZSA9IHRoaXMuUlVMRShcInNlcmllc1R5cGVcIiwgKCkgPT4ge1xyXG4gICAgbGV0IHR5cGU6IFNlcmllc1R5cGU7XHJcbiAgICB0aGlzLk9SKFtcclxuICAgICAge1xyXG4gICAgICAgIEFMVDogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5DT05TVU1FKE9kZFR5cGUpO1xyXG4gICAgICAgICAgdHlwZSA9IFNlcmllc1R5cGUuT2RkO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBBTFQ6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMuQ09OU1VNRTEoRXZlblR5cGUpO1xyXG4gICAgICAgICAgdHlwZSA9IFNlcmllc1R5cGUuRXZlbjtcclxuICAgICAgICB9LFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgQUxUOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLkNPTlNVTUUyKEFsbFR5cGUpO1xyXG4gICAgICAgICAgdHlwZSA9IFNlcmllc1R5cGUuQWxsO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBBTFQ6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMuQ09OU1VNRTMoRGVzY3JpcHRpdmVUeXBlKTtcclxuICAgICAgICAgIHR5cGUgPSBTZXJpZXNUeXBlLkRlc2NyaXB0aW9uO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0sXHJcbiAgICBdKTtcclxuICAgIHJldHVybiB0eXBlO1xyXG4gIH0pO1xyXG5cclxuICBwcml2YXRlIHJhbmdlT3JOdW1iZXIgPSB0aGlzLlJVTEUoXCJyYW5nZU9yTnVtYmVyXCIsICgpID0+IHtcclxuICAgIGxldCByZXN1bHQ7XHJcbiAgICB0aGlzLk9SKFtcclxuICAgICAge1xyXG4gICAgICAgIEFMVDogKCkgPT4ge1xyXG4gICAgICAgICAgcmVzdWx0ID0gdGhpcy5TVUJSVUxFKHRoaXMucmFuZ2UpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBBTFQ6ICgpID0+IHtcclxuICAgICAgICAgIHJlc3VsdCA9IHRoaXMuU1VCUlVMRSh0aGlzLmZyb21BbmRBYm92ZSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIEFMVDogKCkgPT4ge1xyXG4gICAgICAgICAgcmVzdWx0ID0gdGhpcy5TVUJSVUxFKHRoaXMudG9PckJlbG93KTtcclxuICAgICAgICB9LFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgQUxUOiAoKSA9PiB7XHJcbiAgICAgICAgICByZXN1bHQgPSB0aGlzLlNVQlJVTEUodGhpcy5mdWxsU3RyZWV0TnVtYmVyKTtcclxuICAgICAgICB9LFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgQUxUOiAoKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBuID0gcGFyc2VSaWNoTnVtYmVyKHRoaXMuQ09OU1VNRShOdW1iZXIpLmltYWdlKTtcclxuICAgICAgICAgIHJlc3VsdCA9IHsgZnJvbTogbiwgdG86IG4gfTtcclxuICAgICAgICB9LFxyXG4gICAgICB9LFxyXG4gICAgXSk7XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH0pO1xyXG5cclxuICBwcml2YXRlIHJhbmdlID0gdGhpcy5SVUxFKFwicmFuZ2VcIiwgKCkgPT4ge1xyXG4gICAgY29uc3QgZnJvbSA9IHBhcnNlUmljaE51bWJlcih0aGlzLkNPTlNVTUUoTnVtYmVyKS5pbWFnZSk7XHJcbiAgICB0aGlzLk9SKFtcclxuICAgICAgeyBBTFQ6ICgpID0+IHRoaXMuQ09OU1VNRTEoSHlwaGVuKSB9LFxyXG4gICAgICB7IEFMVDogKCkgPT4gdGhpcy5DT05TVU1FMihNYWluU2VwYXJhdG9yKSB9LFxyXG4gICAgXSk7XHJcbiAgICB0aGlzLk9QVElPTigoKSA9PiB7XHJcbiAgICAgIHRoaXMuQ09OU1VNRShBbGxUeXBlKTtcclxuICAgIH0pO1xyXG4gICAgY29uc3QgdG8gPSBwYXJzZVJpY2hOdW1iZXIodGhpcy5DT05TVU1FMyhOdW1iZXIpLmltYWdlKTtcclxuICAgIHJldHVybiB7IGZyb20sIHRvIH07XHJcbiAgfSk7XHJcblxyXG4gIHByaXZhdGUgZnJvbUFuZEFib3ZlID0gdGhpcy5SVUxFKFwiZnJvbUFuZEFib3ZlXCIsICgpID0+IHtcclxuICAgIGxldCBmcm9tOiBSaWNoTnVtYmVyO1xyXG4gICAgdGhpcy5PUihbXHJcbiAgICAgIHtcclxuICAgICAgICBBTFQ6ICgpID0+IHtcclxuICAgICAgICAgIGZyb20gPSBwYXJzZVJpY2hOdW1iZXIodGhpcy5DT05TVU1FKE51bWJlcikuaW1hZ2UpO1xyXG4gICAgICAgICAgdGhpcy5DT05TVU1FKEFuZEFib3ZlKTtcclxuICAgICAgICB9LFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgQUxUOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLkNPTlNVTUUoRnJvbSk7XHJcbiAgICAgICAgICB0aGlzLk9QVElPTigoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuQ09OU1VNRShBbGxUeXBlKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgZnJvbSA9IHBhcnNlUmljaE51bWJlcih0aGlzLkNPTlNVTUUyKE51bWJlcikuaW1hZ2UpO1xyXG4gICAgICAgICAgdGhpcy5PUFRJT04yKCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5DT05TVU1FMihBbmRBYm92ZSk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9LFxyXG4gICAgICB9LFxyXG4gICAgXSk7XHJcblxyXG4gICAgcmV0dXJuIHsgZnJvbSB9O1xyXG4gIH0pO1xyXG5cclxuICBwcml2YXRlIGZyb21BbmRBYm92ZVdpdGhUeXBlID0gdGhpcy5SVUxFKFwiZnJvbUFuZEFib3ZlV2l0aFR5cGVcIiwgKCkgPT4ge1xyXG4gICAgbGV0IHR5cGUgPSBTZXJpZXNUeXBlLkFsbDtcclxuICAgIHRoaXMuQ09OU1VNRShGcm9tKTtcclxuICAgIHRoaXMuT1BUSU9OKCgpID0+IHtcclxuICAgICAgdGhpcy5PUihbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgQUxUOiAoKSA9PiB7XHJcbiAgICAgICAgICAgIHR5cGUgPSBTZXJpZXNUeXBlLkFsbDtcclxuICAgICAgICAgICAgdGhpcy5DT05TVU1FKEFsbFR5cGUpO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIEFMVDogKCkgPT4ge1xyXG4gICAgICAgICAgICB0eXBlID0gU2VyaWVzVHlwZS5EZXNjcmlwdGlvbjtcclxuICAgICAgICAgICAgdGhpcy5DT05TVU1FKERlc2NyaXB0aXZlVHlwZSk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIH0sXHJcbiAgICAgIF0pO1xyXG4gICAgfSk7XHJcbiAgICBjb25zdCBmcm9tID0gcGFyc2VSaWNoTnVtYmVyKHRoaXMuQ09OU1VNRShOdW1iZXIpLmltYWdlKTtcclxuICAgIHRoaXMuT1BUSU9OMigoKSA9PiB7XHJcbiAgICAgIHRoaXMuQ09OU1VNRShBbmRBYm92ZSk7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiB7IHR5cGUsIHJhbmdlczogW3sgZnJvbSB9XSB9O1xyXG4gIH0pO1xyXG5cclxuICBwcml2YXRlIHRvT3JCZWxvdyA9IHRoaXMuUlVMRShcInRvT3JCZWxvd1wiLCAoKSA9PiB7XHJcbiAgICBsZXQgdG86IFJpY2hOdW1iZXI7XHJcbiAgICB0aGlzLk9SKFtcclxuICAgICAge1xyXG4gICAgICAgIEFMVDogKCkgPT4ge1xyXG4gICAgICAgICAgdG8gPSBwYXJzZVJpY2hOdW1iZXIodGhpcy5DT05TVU1FKE51bWJlcikuaW1hZ2UpO1xyXG4gICAgICAgICAgdGhpcy5DT05TVU1FKEFuZEJlbG93KTtcclxuICAgICAgICB9LFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgQUxUOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLkNPTlNVTUUyKFRvKTtcclxuICAgICAgICAgIHRvID0gcGFyc2VSaWNoTnVtYmVyKHRoaXMuQ09OU1VNRTIoTnVtYmVyKS5pbWFnZSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgfSxcclxuICAgIF0pO1xyXG5cclxuICAgIHJldHVybiB7IHRvIH07XHJcbiAgfSk7XHJcblxyXG4gIHByaXZhdGUgdG9PckJlbG93V2l0aFR5cGUgPSB0aGlzLlJVTEUoXCJ0b09yQmVsb3dXaXRoVHlwZVwiLCAoKSA9PiB7XHJcbiAgICBsZXQgdHlwZSA9IFNlcmllc1R5cGUuQWxsO1xyXG4gICAgdGhpcy5DT05TVU1FKFRvKTtcclxuICAgIHRoaXMuT1BUSU9OKCgpID0+IHtcclxuICAgICAgdGhpcy5PUihbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgQUxUOiAoKSA9PiB7XHJcbiAgICAgICAgICAgIHR5cGUgPSBTZXJpZXNUeXBlLkFsbDtcclxuICAgICAgICAgICAgdGhpcy5DT05TVU1FKEFsbFR5cGUpO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIEFMVDogKCkgPT4ge1xyXG4gICAgICAgICAgICB0eXBlID0gU2VyaWVzVHlwZS5EZXNjcmlwdGlvbjtcclxuICAgICAgICAgICAgdGhpcy5DT05TVU1FKERlc2NyaXB0aXZlVHlwZSk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIH0sXHJcbiAgICAgIF0pO1xyXG4gICAgfSk7XHJcbiAgICBjb25zdCB0byA9IHBhcnNlUmljaE51bWJlcih0aGlzLkNPTlNVTUUoTnVtYmVyKS5pbWFnZSk7XHJcbiAgICByZXR1cm4geyB0eXBlLCByYW5nZXM6IFt7IHRvIH1dIH07XHJcbiAgfSk7XHJcblxyXG4gIHByaXZhdGUgZnVsbFN0cmVldE51bWJlciA9IHRoaXMuUlVMRShcclxuICAgIFwiZnVsbFN0cmVldE51bWJlclwiLFxyXG4gICAgKCk6IEZ1bGxTdHJlZXROdW1iZXIgPT4ge1xyXG4gICAgICBjb25zdCBkZXNjcmlwdGl2ZU51bWJlciA9IHBhcnNlUmljaE51bWJlcih0aGlzLkNPTlNVTUUoTnVtYmVyKS5pbWFnZSk7XHJcbiAgICAgIHRoaXMuQ09OU1VNRShTbGFzaCk7XHJcbiAgICAgIGNvbnN0IG9yaWVudGF0aW9uTnVtYmVyID0gcGFyc2VSaWNoTnVtYmVyKHRoaXMuQ09OU1VNRTIoTnVtYmVyKS5pbWFnZSk7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgZGVzY3JpcHRpb25OdW1iZXI6IGRlc2NyaXB0aXZlTnVtYmVyLFxyXG4gICAgICAgIG9yaWVudGF0aW9uYWxOdW1iZXI6IG9yaWVudGF0aW9uTnVtYmVyLFxyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gICk7XHJcbn1cclxuXHJcbmNvbnN0IG51bWJlcldpdGhDaGFyYWN0ZXJQYXR0ZXJuID0gL14oXFxkKykoW2Etel0pJC87XHJcblxyXG5leHBvcnQgY29uc3QgcGFyc2VSaWNoTnVtYmVyID0gKG51bWJlcjogc3RyaW5nKTogUmljaE51bWJlciA9PiB7XHJcbiAgaWYgKG51bWJlcldpdGhDaGFyYWN0ZXJQYXR0ZXJuLnRlc3QobnVtYmVyKSkge1xyXG4gICAgY29uc3QgbWF0Y2ggPSBudW1iZXJXaXRoQ2hhcmFjdGVyUGF0dGVybi5leGVjKG51bWJlcik7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBudW1iZXI6IHBhcnNlSW50KG1hdGNoWzFdKSxcclxuICAgICAgbGV0dGVyOiBtYXRjaFsyXSxcclxuICAgIH07XHJcbiAgfSBlbHNlIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIG51bWJlcjogcGFyc2VJbnQobnVtYmVyKSxcclxuICAgIH07XHJcbiAgfVxyXG59O1xyXG5cclxuY29uc3QgbXVuaWNpcGFsaXR5UGFydFBhdHRlcm4gPSAvXsSNw6FzdCAoPzx0eXBlPm9iY2V8bcSbc3RhKSAoPzxuYW1lPi4rKSQvO1xyXG5cclxuZXhwb3J0IGNvbnN0IHBhcnNlTXVuaWNpcGFsaXR5UGFydE5hbWUgPSAobmFtZTogc3RyaW5nKTogc3RyaW5nID0+IHtcclxuICBjb25zdCBtYXRjaCA9IG11bmljaXBhbGl0eVBhcnRQYXR0ZXJuLmV4ZWMobmFtZSk7XHJcbiAgcmV0dXJuIG1hdGNoPy5ncm91cHMubmFtZT8udHJpbSgpID8/IFwiXCI7XHJcbn07XHJcbiJdfQ==
|
|
1
|
+
import { EmbeddedActionsParser, EOF } from "chevrotain";
|
|
2
|
+
import { splitStreetViaRomanNumerals } from "./roman-numerals";
|
|
3
|
+
import { AllType, AndAbove, AndBelow, DescriptiveType, EvenType, From, Hyphen, MainSeparator, MunicipalityPartName, Number, OddType, Separator, Slash, StreetName, To, Without, } from "./token-definition";
|
|
4
|
+
import { SeriesType } from "./types";
|
|
5
|
+
export class SmdParser extends EmbeddedActionsParser {
|
|
6
|
+
constructor(tokenVocabulary) {
|
|
7
|
+
super(tokenVocabulary);
|
|
8
|
+
this.street = this.RULE("street", () => {
|
|
9
|
+
let result;
|
|
10
|
+
this.OR([
|
|
11
|
+
{
|
|
12
|
+
ALT: () => {
|
|
13
|
+
result = this.SUBRULE(this.streetNameAndNumbersSpecs);
|
|
14
|
+
},
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
ALT: () => {
|
|
18
|
+
result = {
|
|
19
|
+
type: "street",
|
|
20
|
+
street: this.CONSUME(StreetName).image,
|
|
21
|
+
numberSpec: [],
|
|
22
|
+
};
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
ALT: () => {
|
|
27
|
+
result = this.SUBRULE(this.municipalityPartNameAndNumbersSpecs);
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
ALT: () => {
|
|
32
|
+
const municipalityPart = parseMunicipalityPartName(this.CONSUME(MunicipalityPartName).image);
|
|
33
|
+
result = {
|
|
34
|
+
type: "municipalityPart",
|
|
35
|
+
municipalityPart,
|
|
36
|
+
numberSpec: [],
|
|
37
|
+
};
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
]);
|
|
41
|
+
if (result.type === "street") {
|
|
42
|
+
return splitStreetViaRomanNumerals(result.street).map((street) => ({
|
|
43
|
+
type: "street",
|
|
44
|
+
street,
|
|
45
|
+
numberSpec: result.numberSpec,
|
|
46
|
+
}));
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
return [result];
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
this.streetNameAndNumbersSpecs = this.RULE("streetNameAndNumbersSpecs", () => {
|
|
53
|
+
const street = this.CONSUME(StreetName).image;
|
|
54
|
+
this.OPTION(() => {
|
|
55
|
+
this.CONSUME(MainSeparator);
|
|
56
|
+
});
|
|
57
|
+
const numberSpec = this.SUBRULE(this.numberSpecs);
|
|
58
|
+
return { type: "street", street, numberSpec };
|
|
59
|
+
});
|
|
60
|
+
this.municipalityPartNameAndNumbersSpecs = this.RULE("municipalityPartNameAndNumbersSpecs", () => {
|
|
61
|
+
const municipalityPart = parseMunicipalityPartName(this.CONSUME(MunicipalityPartName).image);
|
|
62
|
+
this.OPTION(() => {
|
|
63
|
+
this.CONSUME(MainSeparator);
|
|
64
|
+
});
|
|
65
|
+
const numberSpec = this.SUBRULE(this.numberSpecs);
|
|
66
|
+
return {
|
|
67
|
+
type: "municipalityPart",
|
|
68
|
+
municipalityPart,
|
|
69
|
+
numberSpec,
|
|
70
|
+
};
|
|
71
|
+
});
|
|
72
|
+
this.numberSpecs = this.RULE("numberSpecs", () => {
|
|
73
|
+
const positiveResult = [];
|
|
74
|
+
let negativeResult;
|
|
75
|
+
this.OR([
|
|
76
|
+
{
|
|
77
|
+
GATE: () => this.LA(2).tokenType === Without,
|
|
78
|
+
ALT: () => {
|
|
79
|
+
const type = this.SUBRULE(this.seriesType);
|
|
80
|
+
this.CONSUME(Without);
|
|
81
|
+
this.OPTION(() => {
|
|
82
|
+
this.CONSUME(AllType);
|
|
83
|
+
});
|
|
84
|
+
const ranges = this.SUBRULE(this.rangeList);
|
|
85
|
+
return { negative: true, type, ranges };
|
|
86
|
+
},
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
ALT: () => {
|
|
90
|
+
this.CONSUME2(Without);
|
|
91
|
+
this.OR1([
|
|
92
|
+
{
|
|
93
|
+
GATE: this._gatePostfixTypeSeriesSpec,
|
|
94
|
+
ALT: () => {
|
|
95
|
+
const { type, ranges } = this.SUBRULE(this.postfixTypeSeriesSpec);
|
|
96
|
+
negativeResult = { negative: true, type, ranges };
|
|
97
|
+
},
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
ALT: () => {
|
|
101
|
+
const type = this.SUBRULE2(this.seriesType);
|
|
102
|
+
const ranges = this.SUBRULE2(this.rangeList);
|
|
103
|
+
negativeResult = { negative: true, type, ranges };
|
|
104
|
+
},
|
|
105
|
+
},
|
|
106
|
+
]);
|
|
107
|
+
},
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
ALT: () => {
|
|
111
|
+
this.AT_LEAST_ONE_SEP({
|
|
112
|
+
SEP: Separator,
|
|
113
|
+
DEF: () => {
|
|
114
|
+
positiveResult.push(this.SUBRULE(this.seriesSpecs));
|
|
115
|
+
},
|
|
116
|
+
});
|
|
117
|
+
},
|
|
118
|
+
},
|
|
119
|
+
]);
|
|
120
|
+
if (negativeResult) {
|
|
121
|
+
return negativeResult;
|
|
122
|
+
}
|
|
123
|
+
return positiveResult;
|
|
124
|
+
});
|
|
125
|
+
this.seriesSpecs = this.RULE("seriesSpecs", () => {
|
|
126
|
+
let ranges = [];
|
|
127
|
+
let type;
|
|
128
|
+
this.OR([
|
|
129
|
+
{
|
|
130
|
+
GATE: this._gatePostfixTypeSeriesSpec,
|
|
131
|
+
ALT: () => {
|
|
132
|
+
({ type, ranges } = this.SUBRULE(this.postfixTypeSeriesSpec));
|
|
133
|
+
},
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
ALT: () => {
|
|
137
|
+
type = this.SUBRULE(this.seriesType);
|
|
138
|
+
this.OPTION(() => {
|
|
139
|
+
ranges = this.SUBRULE(this.rangeList);
|
|
140
|
+
});
|
|
141
|
+
},
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
ALT: () => {
|
|
145
|
+
({ type, ranges } = this.SUBRULE2(this.fromAndAboveWithType));
|
|
146
|
+
},
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
ALT: () => {
|
|
150
|
+
({ type, ranges } = this.SUBRULE(this.toOrBelowWithType));
|
|
151
|
+
},
|
|
152
|
+
},
|
|
153
|
+
]);
|
|
154
|
+
return { type, ranges };
|
|
155
|
+
});
|
|
156
|
+
this._gatePostfixTypeSeriesSpec = () => {
|
|
157
|
+
let index = 2;
|
|
158
|
+
while (![Separator, EOF].includes(this.LA(index).tokenType)) {
|
|
159
|
+
if ([OddType, EvenType].includes(this.LA(index).tokenType)) {
|
|
160
|
+
return true;
|
|
161
|
+
}
|
|
162
|
+
index++;
|
|
163
|
+
}
|
|
164
|
+
return false;
|
|
165
|
+
};
|
|
166
|
+
this.postfixTypeSeriesSpec = this.RULE("postfixTypeSeriesSpec", () => {
|
|
167
|
+
this.CONSUME(AllType);
|
|
168
|
+
const ranges = [this.SUBRULE(this.rangeOrNumber)];
|
|
169
|
+
let type;
|
|
170
|
+
this.OR1([
|
|
171
|
+
{
|
|
172
|
+
ALT: () => {
|
|
173
|
+
this.CONSUME(OddType);
|
|
174
|
+
type = SeriesType.Odd;
|
|
175
|
+
},
|
|
176
|
+
},
|
|
177
|
+
{
|
|
178
|
+
ALT: () => {
|
|
179
|
+
this.CONSUME1(EvenType);
|
|
180
|
+
type = SeriesType.Even;
|
|
181
|
+
},
|
|
182
|
+
},
|
|
183
|
+
]);
|
|
184
|
+
return { type, ranges };
|
|
185
|
+
});
|
|
186
|
+
this.rangeList = this.RULE("rangeList", () => {
|
|
187
|
+
let ranges = [];
|
|
188
|
+
ranges.push(this.SUBRULE(this.rangeOrNumber));
|
|
189
|
+
this.MANY({
|
|
190
|
+
GATE: () => [Number, To, From].includes(this.LA(2).tokenType),
|
|
191
|
+
DEF: () => {
|
|
192
|
+
this.CONSUME(Separator);
|
|
193
|
+
ranges.push(this.SUBRULE2(this.rangeOrNumber));
|
|
194
|
+
},
|
|
195
|
+
});
|
|
196
|
+
return ranges;
|
|
197
|
+
});
|
|
198
|
+
this.seriesType = this.RULE("seriesType", () => {
|
|
199
|
+
let type;
|
|
200
|
+
this.OR([
|
|
201
|
+
{
|
|
202
|
+
ALT: () => {
|
|
203
|
+
this.CONSUME(OddType);
|
|
204
|
+
type = SeriesType.Odd;
|
|
205
|
+
},
|
|
206
|
+
},
|
|
207
|
+
{
|
|
208
|
+
ALT: () => {
|
|
209
|
+
this.CONSUME1(EvenType);
|
|
210
|
+
type = SeriesType.Even;
|
|
211
|
+
},
|
|
212
|
+
},
|
|
213
|
+
{
|
|
214
|
+
ALT: () => {
|
|
215
|
+
this.CONSUME2(AllType);
|
|
216
|
+
type = SeriesType.All;
|
|
217
|
+
},
|
|
218
|
+
},
|
|
219
|
+
{
|
|
220
|
+
ALT: () => {
|
|
221
|
+
this.CONSUME3(DescriptiveType);
|
|
222
|
+
type = SeriesType.Description;
|
|
223
|
+
},
|
|
224
|
+
},
|
|
225
|
+
]);
|
|
226
|
+
return type;
|
|
227
|
+
});
|
|
228
|
+
this.rangeOrNumber = this.RULE("rangeOrNumber", () => {
|
|
229
|
+
let result;
|
|
230
|
+
this.OR([
|
|
231
|
+
{
|
|
232
|
+
ALT: () => {
|
|
233
|
+
result = this.SUBRULE(this.range);
|
|
234
|
+
},
|
|
235
|
+
},
|
|
236
|
+
{
|
|
237
|
+
ALT: () => {
|
|
238
|
+
result = this.SUBRULE(this.fromAndAbove);
|
|
239
|
+
},
|
|
240
|
+
},
|
|
241
|
+
{
|
|
242
|
+
ALT: () => {
|
|
243
|
+
result = this.SUBRULE(this.toOrBelow);
|
|
244
|
+
},
|
|
245
|
+
},
|
|
246
|
+
{
|
|
247
|
+
ALT: () => {
|
|
248
|
+
result = this.SUBRULE(this.fullStreetNumber);
|
|
249
|
+
},
|
|
250
|
+
},
|
|
251
|
+
{
|
|
252
|
+
ALT: () => {
|
|
253
|
+
const n = parseRichNumber(this.CONSUME(Number).image);
|
|
254
|
+
result = { from: n, to: n };
|
|
255
|
+
},
|
|
256
|
+
},
|
|
257
|
+
]);
|
|
258
|
+
return result;
|
|
259
|
+
});
|
|
260
|
+
this.range = this.RULE("range", () => {
|
|
261
|
+
const from = parseRichNumber(this.CONSUME(Number).image);
|
|
262
|
+
this.OR([
|
|
263
|
+
{ ALT: () => this.CONSUME1(Hyphen) },
|
|
264
|
+
{ ALT: () => this.CONSUME2(MainSeparator) },
|
|
265
|
+
]);
|
|
266
|
+
this.OPTION(() => {
|
|
267
|
+
this.CONSUME(AllType);
|
|
268
|
+
});
|
|
269
|
+
const to = parseRichNumber(this.CONSUME3(Number).image);
|
|
270
|
+
return { from, to };
|
|
271
|
+
});
|
|
272
|
+
this.fromAndAbove = this.RULE("fromAndAbove", () => {
|
|
273
|
+
let from;
|
|
274
|
+
this.OR([
|
|
275
|
+
{
|
|
276
|
+
ALT: () => {
|
|
277
|
+
from = parseRichNumber(this.CONSUME(Number).image);
|
|
278
|
+
this.CONSUME(AndAbove);
|
|
279
|
+
},
|
|
280
|
+
},
|
|
281
|
+
{
|
|
282
|
+
ALT: () => {
|
|
283
|
+
this.CONSUME(From);
|
|
284
|
+
this.OPTION(() => {
|
|
285
|
+
this.CONSUME(AllType);
|
|
286
|
+
});
|
|
287
|
+
from = parseRichNumber(this.CONSUME2(Number).image);
|
|
288
|
+
this.OPTION2(() => {
|
|
289
|
+
this.CONSUME2(AndAbove);
|
|
290
|
+
});
|
|
291
|
+
},
|
|
292
|
+
},
|
|
293
|
+
]);
|
|
294
|
+
return { from };
|
|
295
|
+
});
|
|
296
|
+
this.fromAndAboveWithType = this.RULE("fromAndAboveWithType", () => {
|
|
297
|
+
let type = SeriesType.All;
|
|
298
|
+
this.CONSUME(From);
|
|
299
|
+
this.OPTION(() => {
|
|
300
|
+
this.OR([
|
|
301
|
+
{
|
|
302
|
+
ALT: () => {
|
|
303
|
+
type = SeriesType.All;
|
|
304
|
+
this.CONSUME(AllType);
|
|
305
|
+
},
|
|
306
|
+
},
|
|
307
|
+
{
|
|
308
|
+
ALT: () => {
|
|
309
|
+
type = SeriesType.Description;
|
|
310
|
+
this.CONSUME(DescriptiveType);
|
|
311
|
+
},
|
|
312
|
+
},
|
|
313
|
+
]);
|
|
314
|
+
});
|
|
315
|
+
const from = parseRichNumber(this.CONSUME(Number).image);
|
|
316
|
+
this.OPTION2(() => {
|
|
317
|
+
this.CONSUME(AndAbove);
|
|
318
|
+
});
|
|
319
|
+
return { type, ranges: [{ from }] };
|
|
320
|
+
});
|
|
321
|
+
this.toOrBelow = this.RULE("toOrBelow", () => {
|
|
322
|
+
let to;
|
|
323
|
+
this.OR([
|
|
324
|
+
{
|
|
325
|
+
ALT: () => {
|
|
326
|
+
to = parseRichNumber(this.CONSUME(Number).image);
|
|
327
|
+
this.CONSUME(AndBelow);
|
|
328
|
+
},
|
|
329
|
+
},
|
|
330
|
+
{
|
|
331
|
+
ALT: () => {
|
|
332
|
+
this.CONSUME2(To);
|
|
333
|
+
to = parseRichNumber(this.CONSUME2(Number).image);
|
|
334
|
+
},
|
|
335
|
+
},
|
|
336
|
+
]);
|
|
337
|
+
return { to };
|
|
338
|
+
});
|
|
339
|
+
this.toOrBelowWithType = this.RULE("toOrBelowWithType", () => {
|
|
340
|
+
let type = SeriesType.All;
|
|
341
|
+
this.CONSUME(To);
|
|
342
|
+
this.OPTION(() => {
|
|
343
|
+
this.OR([
|
|
344
|
+
{
|
|
345
|
+
ALT: () => {
|
|
346
|
+
type = SeriesType.All;
|
|
347
|
+
this.CONSUME(AllType);
|
|
348
|
+
},
|
|
349
|
+
},
|
|
350
|
+
{
|
|
351
|
+
ALT: () => {
|
|
352
|
+
type = SeriesType.Description;
|
|
353
|
+
this.CONSUME(DescriptiveType);
|
|
354
|
+
},
|
|
355
|
+
},
|
|
356
|
+
]);
|
|
357
|
+
});
|
|
358
|
+
const to = parseRichNumber(this.CONSUME(Number).image);
|
|
359
|
+
return { type, ranges: [{ to }] };
|
|
360
|
+
});
|
|
361
|
+
this.fullStreetNumber = this.RULE("fullStreetNumber", () => {
|
|
362
|
+
const descriptiveNumber = parseRichNumber(this.CONSUME(Number).image);
|
|
363
|
+
this.CONSUME(Slash);
|
|
364
|
+
const orientationNumber = parseRichNumber(this.CONSUME2(Number).image);
|
|
365
|
+
return {
|
|
366
|
+
descriptionNumber: descriptiveNumber,
|
|
367
|
+
orientationalNumber: orientationNumber,
|
|
368
|
+
};
|
|
369
|
+
});
|
|
370
|
+
this.performSelfAnalysis();
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
const numberWithCharacterPattern = /^(\d+)([a-z])$/;
|
|
374
|
+
export const parseRichNumber = (number) => {
|
|
375
|
+
if (numberWithCharacterPattern.test(number)) {
|
|
376
|
+
const match = numberWithCharacterPattern.exec(number);
|
|
377
|
+
return {
|
|
378
|
+
number: parseInt(match[1]),
|
|
379
|
+
letter: match[2],
|
|
380
|
+
};
|
|
381
|
+
}
|
|
382
|
+
else {
|
|
383
|
+
return {
|
|
384
|
+
number: parseInt(number),
|
|
385
|
+
};
|
|
386
|
+
}
|
|
387
|
+
};
|
|
388
|
+
const municipalityPartPattern = /^část (?<type>obce|města) (?<name>.+)$/;
|
|
389
|
+
export const parseMunicipalityPartName = (name) => {
|
|
390
|
+
const match = municipalityPartPattern.exec(name);
|
|
391
|
+
return match?.groups.name?.trim() ?? "";
|
|
392
|
+
};
|
|
393
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21kLXBhcnNlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdHJlZXQtbWFya2Rvd24vc21kLXBhcnNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsR0FBRyxFQUFtQixNQUFNLFlBQVksQ0FBQztBQUN6RSxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUUvRCxPQUFPLEVBQ0wsT0FBTyxFQUNQLFFBQVEsRUFDUixRQUFRLEVBQ1IsZUFBZSxFQUNmLFFBQVEsRUFDUixJQUFJLEVBQ0osTUFBTSxFQUNOLGFBQWEsRUFDYixvQkFBb0IsRUFDcEIsTUFBTSxFQUNOLE9BQU8sRUFDUCxTQUFTLEVBQ1QsS0FBSyxFQUNMLFVBQVUsRUFDVixFQUFFLEVBQ0YsT0FBTyxHQUNSLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFvRCxVQUFVLEVBQVcsTUFBTSxTQUFTLENBQUM7QUFFaEcsTUFBTSxPQUFPLFNBQVUsU0FBUSxxQkFBcUI7SUFDbEQsWUFBWSxlQUFnQztRQUMxQyxLQUFLLENBQUMsZUFBZSxDQUFDLENBQUM7UUFJbEIsV0FBTSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEdBQWMsRUFBRTtZQUNsRCxJQUFJLE1BQU0sQ0FBQztZQUNYLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQ047b0JBQ0UsR0FBRyxFQUFFLEdBQUcsRUFBRTt3QkFDUixNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQUMsQ0FBQztvQkFDeEQsQ0FBQztpQkFDRjtnQkFDRDtvQkFDRSxHQUFHLEVBQUUsR0FBRyxFQUFFO3dCQUNSLE1BQU0sR0FBRzs0QkFDUCxJQUFJLEVBQUUsUUFBUTs0QkFDZCxNQUFNLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxLQUFLOzRCQUN0QyxVQUFVLEVBQUUsRUFBRTt5QkFDSixDQUFDO29CQUNmLENBQUM7aUJBQ0Y7Z0JBQ0Q7b0JBQ0UsR0FBRyxFQUFFLEdBQUcsRUFBRTt3QkFDUixNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsbUNBQW1DLENBQUMsQ0FBQztvQkFDbEUsQ0FBQztpQkFDRjtnQkFDRDtvQkFDRSxHQUFHLEVBQUUsR0FBRyxFQUFFO3dCQUNSLE1BQU0sZ0JBQWdCLEdBQUcseUJBQXlCLENBQ2hELElBQUksQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxLQUFLLENBQ3pDLENBQUM7d0JBQ0YsTUFBTSxHQUFHOzRCQUNQLElBQUksRUFBRSxrQkFBa0I7NEJBQ3hCLGdCQUFnQjs0QkFDaEIsVUFBVSxFQUFFLEVBQUU7eUJBQ0osQ0FBQztvQkFDZixDQUFDO2lCQUNGO2FBQ0YsQ0FBQyxDQUFDO1lBRUgsSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRTtnQkFDNUIsT0FBTywyQkFBMkIsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO29CQUNqRSxJQUFJLEVBQUUsUUFBUTtvQkFDZCxNQUFNO29CQUNOLFVBQVUsRUFBRSxNQUFNLENBQUMsVUFBVTtpQkFDOUIsQ0FBQyxDQUFDLENBQUM7YUFDTDtpQkFBTTtnQkFDTCxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7YUFDakI7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVLLDhCQUF5QixHQUFHLElBQUksQ0FBQyxJQUFJLENBQzNDLDJCQUEyQixFQUMzQixHQUFHLEVBQUU7WUFDSCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLEtBQUssQ0FBQztZQUM5QyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRTtnQkFDZixJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQzlCLENBQUMsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDbEQsT0FBTyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBYSxDQUFDO1FBQzNELENBQUMsQ0FDRixDQUFDO1FBRU0sd0NBQW1DLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FDckQscUNBQXFDLEVBQ3JDLEdBQUcsRUFBRTtZQUNILE1BQU0sZ0JBQWdCLEdBQUcseUJBQXlCLENBQ2hELElBQUksQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxLQUFLLENBQ3pDLENBQUM7WUFDRixJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRTtnQkFDZixJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQzlCLENBQUMsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDbEQsT0FBTztnQkFDTCxJQUFJLEVBQUUsa0JBQWtCO2dCQUN4QixnQkFBZ0I7Z0JBQ2hCLFVBQVU7YUFDQSxDQUFDO1FBQ2YsQ0FBQyxDQUNGLENBQUM7UUFFTSxnQkFBVyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLEdBQUcsRUFBRTtZQUNsRCxNQUFNLGNBQWMsR0FBRyxFQUFFLENBQUM7WUFDMUIsSUFBSSxjQUFrQyxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQ047b0JBQ0UsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxLQUFLLE9BQU87b0JBQzVDLEdBQUcsRUFBRSxHQUFHLEVBQUU7d0JBQ1IsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7d0JBQzNDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7d0JBQ3RCLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFOzRCQUNmLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7d0JBQ3hCLENBQUMsQ0FBQyxDQUFDO3dCQUNILE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO3dCQUM1QyxPQUFPLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7b0JBQzFDLENBQUM7aUJBQ0Y7Z0JBQ0Q7b0JBQ0UsR0FBRyxFQUFFLEdBQUcsRUFBRTt3QkFDUixJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO3dCQUN2QixJQUFJLENBQUMsR0FBRyxDQUFDOzRCQUNQO2dDQUNFLElBQUksRUFBRSxJQUFJLENBQUMsMEJBQTBCO2dDQUNyQyxHQUFHLEVBQUUsR0FBRyxFQUFFO29DQUNSLE1BQU0sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FDbkMsSUFBSSxDQUFDLHFCQUFxQixDQUMzQixDQUFDO29DQUNGLGNBQWMsR0FBRyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDO2dDQUNwRCxDQUFDOzZCQUNGOzRCQUNEO2dDQUNFLEdBQUcsRUFBRSxHQUFHLEVBQUU7b0NBQ1IsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7b0NBQzVDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO29DQUM3QyxjQUFjLEdBQUcsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQztnQ0FDcEQsQ0FBQzs2QkFDRjt5QkFDRixDQUFDLENBQUM7b0JBQ0wsQ0FBQztpQkFDRjtnQkFDRDtvQkFDRSxHQUFHLEVBQUUsR0FBRyxFQUFFO3dCQUNSLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQzs0QkFDcEIsR0FBRyxFQUFFLFNBQVM7NEJBQ2QsR0FBRyxFQUFFLEdBQUcsRUFBRTtnQ0FDUixjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7NEJBQ3RELENBQUM7eUJBQ0YsQ0FBQyxDQUFDO29CQUNMLENBQUM7aUJBQ0Y7YUFDRixDQUFDLENBQUM7WUFDSCxJQUFJLGNBQWMsRUFBRTtnQkFDbEIsT0FBTyxjQUFjLENBQUM7YUFDdkI7WUFDRCxPQUFPLGNBQWMsQ0FBQztRQUN4QixDQUFDLENBQUMsQ0FBQztRQUVLLGdCQUFXLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsR0FBRyxFQUFFO1lBQ2xELElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQztZQUNoQixJQUFJLElBQWdCLENBQUM7WUFDckIsSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDTjtvQkFDRSxJQUFJLEVBQUUsSUFBSSxDQUFDLDBCQUEwQjtvQkFDckMsR0FBRyxFQUFFLEdBQUcsRUFBRTt3QkFDUixDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQztvQkFDaEUsQ0FBQztpQkFDRjtnQkFDRDtvQkFDRSxHQUFHLEVBQUUsR0FBRyxFQUFFO3dCQUNSLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQzt3QkFDckMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUU7NEJBQ2YsTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO3dCQUN4QyxDQUFDLENBQUMsQ0FBQztvQkFDTCxDQUFDO2lCQUNGO2dCQUNEO29CQUNFLEdBQUcsRUFBRSxHQUFHLEVBQUU7d0JBQ1IsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUM7b0JBQ2hFLENBQUM7aUJBQ0Y7Z0JBQ0Q7b0JBQ0UsR0FBRyxFQUFFLEdBQUcsRUFBRTt3QkFDUixDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQztvQkFDNUQsQ0FBQztpQkFDRjthQUNGLENBQUMsQ0FBQztZQUVILE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7UUFDMUIsQ0FBQyxDQUFDLENBQUM7UUFFSywrQkFBMEIsR0FBRyxHQUFZLEVBQUU7WUFDakQsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO1lBQ2QsT0FBTyxDQUFDLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLFNBQVMsQ0FBQyxFQUFFO2dCQUMzRCxJQUFJLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLFNBQVMsQ0FBQyxFQUFFO29CQUMxRCxPQUFPLElBQUksQ0FBQztpQkFDYjtnQkFDRCxLQUFLLEVBQUUsQ0FBQzthQUNUO1lBQ0QsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDLENBQUM7UUFFTSwwQkFBcUIsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLHVCQUF1QixFQUFFLEdBQUcsRUFBRTtZQUN0RSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3RCLE1BQU0sTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztZQUNsRCxJQUFJLElBQWdCLENBQUM7WUFDckIsSUFBSSxDQUFDLEdBQUcsQ0FBQztnQkFDUDtvQkFDRSxHQUFHLEVBQUUsR0FBRyxFQUFFO3dCQUNSLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7d0JBQ3RCLElBQUksR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDO29CQUN4QixDQUFDO2lCQUNGO2dCQUNEO29CQUNFLEdBQUcsRUFBRSxHQUFHLEVBQUU7d0JBQ1IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQzt3QkFDeEIsSUFBSSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUM7b0JBQ3pCLENBQUM7aUJBQ0Y7YUFDRixDQUFDLENBQUM7WUFDSCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDO1FBQzFCLENBQUMsQ0FBQyxDQUFDO1FBRUssY0FBUyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEdBQUcsRUFBRTtZQUM5QyxJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7WUFDaEIsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO1lBQzlDLElBQUksQ0FBQyxJQUFJLENBQUM7Z0JBQ1IsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7Z0JBQzdELEdBQUcsRUFBRSxHQUFHLEVBQUU7b0JBQ1IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztvQkFDeEIsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO2dCQUNqRCxDQUFDO2FBQ0YsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQyxDQUFDLENBQUM7UUFFSyxlQUFVLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsR0FBRyxFQUFFO1lBQ2hELElBQUksSUFBZ0IsQ0FBQztZQUNyQixJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUNOO29CQUNFLEdBQUcsRUFBRSxHQUFHLEVBQUU7d0JBQ1IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQzt3QkFDdEIsSUFBSSxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUM7b0JBQ3hCLENBQUM7aUJBQ0Y7Z0JBQ0Q7b0JBQ0UsR0FBRyxFQUFFLEdBQUcsRUFBRTt3QkFDUixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO3dCQUN4QixJQUFJLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQztvQkFDekIsQ0FBQztpQkFDRjtnQkFDRDtvQkFDRSxHQUFHLEVBQUUsR0FBRyxFQUFFO3dCQUNSLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7d0JBQ3ZCLElBQUksR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDO29CQUN4QixDQUFDO2lCQUNGO2dCQUNEO29CQUNFLEdBQUcsRUFBRSxHQUFHLEVBQUU7d0JBQ1IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsQ0FBQzt3QkFDL0IsSUFBSSxHQUFHLFVBQVUsQ0FBQyxXQUFXLENBQUM7b0JBQ2hDLENBQUM7aUJBQ0Y7YUFDRixDQUFDLENBQUM7WUFDSCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUMsQ0FBQyxDQUFDO1FBRUssa0JBQWEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxHQUFHLEVBQUU7WUFDdEQsSUFBSSxNQUFNLENBQUM7WUFDWCxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUNOO29CQUNFLEdBQUcsRUFBRSxHQUFHLEVBQUU7d0JBQ1IsTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUNwQyxDQUFDO2lCQUNGO2dCQUNEO29CQUNFLEdBQUcsRUFBRSxHQUFHLEVBQUU7d0JBQ1IsTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO29CQUMzQyxDQUFDO2lCQUNGO2dCQUNEO29CQUNFLEdBQUcsRUFBRSxHQUFHLEVBQUU7d0JBQ1IsTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO29CQUN4QyxDQUFDO2lCQUNGO2dCQUNEO29CQUNFLEdBQUcsRUFBRSxHQUFHLEVBQUU7d0JBQ1IsTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7b0JBQy9DLENBQUM7aUJBQ0Y7Z0JBQ0Q7b0JBQ0UsR0FBRyxFQUFFLEdBQUcsRUFBRTt3QkFDUixNQUFNLENBQUMsR0FBRyxlQUFlLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQzt3QkFDdEQsTUFBTSxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7b0JBQzlCLENBQUM7aUJBQ0Y7YUFDRixDQUFDLENBQUM7WUFDSCxPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDLENBQUMsQ0FBQztRQUVLLFVBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUU7WUFDdEMsTUFBTSxJQUFJLEdBQUcsZUFBZSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDekQsSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDTixFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFO2dCQUNwQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxFQUFFO2FBQzVDLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFO2dCQUNmLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDeEIsQ0FBQyxDQUFDLENBQUM7WUFDSCxNQUFNLEVBQUUsR0FBRyxlQUFlLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN4RCxPQUFPLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxDQUFDO1FBQ3RCLENBQUMsQ0FBQyxDQUFDO1FBRUssaUJBQVksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxHQUFHLEVBQUU7WUFDcEQsSUFBSSxJQUFnQixDQUFDO1lBQ3JCLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQ047b0JBQ0UsR0FBRyxFQUFFLEdBQUcsRUFBRTt3QkFDUixJQUFJLEdBQUcsZUFBZSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7d0JBQ25ELElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7b0JBQ3pCLENBQUM7aUJBQ0Y7Z0JBQ0Q7b0JBQ0UsR0FBRyxFQUFFLEdBQUcsRUFBRTt3QkFDUixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO3dCQUNuQixJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRTs0QkFDZixJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO3dCQUN4QixDQUFDLENBQUMsQ0FBQzt3QkFDSCxJQUFJLEdBQUcsZUFBZSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7d0JBQ3BELElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFOzRCQUNoQixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO3dCQUMxQixDQUFDLENBQUMsQ0FBQztvQkFDTCxDQUFDO2lCQUNGO2FBQ0YsQ0FBQyxDQUFDO1lBRUgsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDO1FBQ2xCLENBQUMsQ0FBQyxDQUFDO1FBRUsseUJBQW9CLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxHQUFHLEVBQUU7WUFDcEUsSUFBSSxJQUFJLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQztZQUMxQixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ25CLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFO2dCQUNmLElBQUksQ0FBQyxFQUFFLENBQUM7b0JBQ047d0JBQ0UsR0FBRyxFQUFFLEdBQUcsRUFBRTs0QkFDUixJQUFJLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQzs0QkFDdEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQzt3QkFDeEIsQ0FBQztxQkFDRjtvQkFDRDt3QkFDRSxHQUFHLEVBQUUsR0FBRyxFQUFFOzRCQUNSLElBQUksR0FBRyxVQUFVLENBQUMsV0FBVyxDQUFDOzRCQUM5QixJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDO3dCQUNoQyxDQUFDO3FCQUNGO2lCQUNGLENBQUMsQ0FBQztZQUNMLENBQUMsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxJQUFJLEdBQUcsZUFBZSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDekQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUU7Z0JBQ2hCLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDekIsQ0FBQyxDQUFDLENBQUM7WUFDSCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQ3RDLENBQUMsQ0FBQyxDQUFDO1FBRUssY0FBUyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEdBQUcsRUFBRTtZQUM5QyxJQUFJLEVBQWMsQ0FBQztZQUNuQixJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUNOO29CQUNFLEdBQUcsRUFBRSxHQUFHLEVBQUU7d0JBQ1IsRUFBRSxHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO3dCQUNqRCxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO29CQUN6QixDQUFDO2lCQUNGO2dCQUNEO29CQUNFLEdBQUcsRUFBRSxHQUFHLEVBQUU7d0JBQ1IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQzt3QkFDbEIsRUFBRSxHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUNwRCxDQUFDO2lCQUNGO2FBQ0YsQ0FBQyxDQUFDO1lBRUgsT0FBTyxFQUFFLEVBQUUsRUFBRSxDQUFDO1FBQ2hCLENBQUMsQ0FBQyxDQUFDO1FBRUssc0JBQWlCLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxHQUFHLEVBQUU7WUFDOUQsSUFBSSxJQUFJLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQztZQUMxQixJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ2pCLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFO2dCQUNmLElBQUksQ0FBQyxFQUFFLENBQUM7b0JBQ047d0JBQ0UsR0FBRyxFQUFFLEdBQUcsRUFBRTs0QkFDUixJQUFJLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQzs0QkFDdEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQzt3QkFDeEIsQ0FBQztxQkFDRjtvQkFDRDt3QkFDRSxHQUFHLEVBQUUsR0FBRyxFQUFFOzRCQUNSLElBQUksR0FBRyxVQUFVLENBQUMsV0FBVyxDQUFDOzRCQUM5QixJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDO3dCQUNoQyxDQUFDO3FCQUNGO2lCQUNGLENBQUMsQ0FBQztZQUNMLENBQUMsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxFQUFFLEdBQUcsZUFBZSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDdkQsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUNwQyxDQUFDLENBQUMsQ0FBQztRQUVLLHFCQUFnQixHQUFHLElBQUksQ0FBQyxJQUFJLENBQ2xDLGtCQUFrQixFQUNsQixHQUFxQixFQUFFO1lBQ3JCLE1BQU0saUJBQWlCLEdBQUcsZUFBZSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDdEUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNwQixNQUFNLGlCQUFpQixHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3ZFLE9BQU87Z0JBQ0wsaUJBQWlCLEVBQUUsaUJBQWlCO2dCQUNwQyxtQkFBbUIsRUFBRSxpQkFBaUI7YUFDdkMsQ0FBQztRQUNKLENBQUMsQ0FDRixDQUFDO1FBN1lBLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO0lBQzdCLENBQUM7Q0E2WUY7QUFFRCxNQUFNLDBCQUEwQixHQUFHLGdCQUFnQixDQUFDO0FBRXBELE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxDQUFDLE1BQWMsRUFBYyxFQUFFO0lBQzVELElBQUksMEJBQTBCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFO1FBQzNDLE1BQU0sS0FBSyxHQUFHLDBCQUEwQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN0RCxPQUFPO1lBQ0wsTUFBTSxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDMUIsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7U0FDakIsQ0FBQztLQUNIO1NBQU07UUFDTCxPQUFPO1lBQ0wsTUFBTSxFQUFFLFFBQVEsQ0FBQyxNQUFNLENBQUM7U0FDekIsQ0FBQztLQUNIO0FBQ0gsQ0FBQyxDQUFDO0FBRUYsTUFBTSx1QkFBdUIsR0FBRyx3Q0FBd0MsQ0FBQztBQUV6RSxNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBRyxDQUFDLElBQVksRUFBVSxFQUFFO0lBQ2hFLE1BQU0sS0FBSyxHQUFHLHVCQUF1QixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNqRCxPQUFPLEtBQUssRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUMxQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbWJlZGRlZEFjdGlvbnNQYXJzZXIsIEVPRiwgVG9rZW5Wb2NhYnVsYXJ5IH0gZnJvbSBcImNoZXZyb3RhaW5cIjtcbmltcG9ydCB7IHNwbGl0U3RyZWV0VmlhUm9tYW5OdW1lcmFscyB9IGZyb20gXCIuL3JvbWFuLW51bWVyYWxzXCI7XG5cbmltcG9ydCB7XG4gIEFsbFR5cGUsXG4gIEFuZEFib3ZlLFxuICBBbmRCZWxvdyxcbiAgRGVzY3JpcHRpdmVUeXBlLFxuICBFdmVuVHlwZSxcbiAgRnJvbSxcbiAgSHlwaGVuLFxuICBNYWluU2VwYXJhdG9yLFxuICBNdW5pY2lwYWxpdHlQYXJ0TmFtZSxcbiAgTnVtYmVyLFxuICBPZGRUeXBlLFxuICBTZXBhcmF0b3IsXG4gIFNsYXNoLFxuICBTdHJlZXROYW1lLFxuICBUbyxcbiAgV2l0aG91dCxcbn0gZnJvbSBcIi4vdG9rZW4tZGVmaW5pdGlvblwiO1xuaW1wb3J0IHsgRnVsbFN0cmVldE51bWJlciwgTmVnYXRpdmVTZXJpZXNTcGVjLCBSaWNoTnVtYmVyLCBTZXJpZXNUeXBlLCBTbWRMaW5lIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuZXhwb3J0IGNsYXNzIFNtZFBhcnNlciBleHRlbmRzIEVtYmVkZGVkQWN0aW9uc1BhcnNlciB7XG4gIGNvbnN0cnVjdG9yKHRva2VuVm9jYWJ1bGFyeTogVG9rZW5Wb2NhYnVsYXJ5KSB7XG4gICAgc3VwZXIodG9rZW5Wb2NhYnVsYXJ5KTtcbiAgICB0aGlzLnBlcmZvcm1TZWxmQW5hbHlzaXMoKTtcbiAgfVxuXG4gIHB1YmxpYyBzdHJlZXQgPSB0aGlzLlJVTEUoXCJzdHJlZXRcIiwgKCk6IFNtZExpbmVbXSA9PiB7XG4gICAgbGV0IHJlc3VsdDtcbiAgICB0aGlzLk9SKFtcbiAgICAgIHtcbiAgICAgICAgQUxUOiAoKSA9PiB7XG4gICAgICAgICAgcmVzdWx0ID0gdGhpcy5TVUJSVUxFKHRoaXMuc3RyZWV0TmFtZUFuZE51bWJlcnNTcGVjcyk7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBBTFQ6ICgpID0+IHtcbiAgICAgICAgICByZXN1bHQgPSB7XG4gICAgICAgICAgICB0eXBlOiBcInN0cmVldFwiLFxuICAgICAgICAgICAgc3RyZWV0OiB0aGlzLkNPTlNVTUUoU3RyZWV0TmFtZSkuaW1hZ2UsXG4gICAgICAgICAgICBudW1iZXJTcGVjOiBbXSxcbiAgICAgICAgICB9IGFzIFNtZExpbmU7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBBTFQ6ICgpID0+IHtcbiAgICAgICAgICByZXN1bHQgPSB0aGlzLlNVQlJVTEUodGhpcy5tdW5pY2lwYWxpdHlQYXJ0TmFtZUFuZE51bWJlcnNTcGVjcyk7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBBTFQ6ICgpID0+IHtcbiAgICAgICAgICBjb25zdCBtdW5pY2lwYWxpdHlQYXJ0ID0gcGFyc2VNdW5pY2lwYWxpdHlQYXJ0TmFtZShcbiAgICAgICAgICAgIHRoaXMuQ09OU1VNRShNdW5pY2lwYWxpdHlQYXJ0TmFtZSkuaW1hZ2VcbiAgICAgICAgICApO1xuICAgICAgICAgIHJlc3VsdCA9IHtcbiAgICAgICAgICAgIHR5cGU6IFwibXVuaWNpcGFsaXR5UGFydFwiLFxuICAgICAgICAgICAgbXVuaWNpcGFsaXR5UGFydCxcbiAgICAgICAgICAgIG51bWJlclNwZWM6IFtdLFxuICAgICAgICAgIH0gYXMgU21kTGluZTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgXSk7XG5cbiAgICBpZiAocmVzdWx0LnR5cGUgPT09IFwic3RyZWV0XCIpIHtcbiAgICAgIHJldHVybiBzcGxpdFN0cmVldFZpYVJvbWFuTnVtZXJhbHMocmVzdWx0LnN0cmVldCkubWFwKChzdHJlZXQpID0+ICh7XG4gICAgICAgIHR5cGU6IFwic3RyZWV0XCIsXG4gICAgICAgIHN0cmVldCxcbiAgICAgICAgbnVtYmVyU3BlYzogcmVzdWx0Lm51bWJlclNwZWMsXG4gICAgICB9KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBbcmVzdWx0XTtcbiAgICB9XG4gIH0pO1xuXG4gIHByaXZhdGUgc3RyZWV0TmFtZUFuZE51bWJlcnNTcGVjcyA9IHRoaXMuUlVMRShcbiAgICBcInN0cmVldE5hbWVBbmROdW1iZXJzU3BlY3NcIixcbiAgICAoKSA9PiB7XG4gICAgICBjb25zdCBzdHJlZXQgPSB0aGlzLkNPTlNVTUUoU3RyZWV0TmFtZSkuaW1hZ2U7XG4gICAgICB0aGlzLk9QVElPTigoKSA9PiB7XG4gICAgICAgIHRoaXMuQ09OU1VNRShNYWluU2VwYXJhdG9yKTtcbiAgICAgIH0pO1xuICAgICAgY29uc3QgbnVtYmVyU3BlYyA9IHRoaXMuU1VCUlVMRSh0aGlzLm51bWJlclNwZWNzKTtcbiAgICAgIHJldHVybiB7IHR5cGU6IFwic3RyZWV0XCIsIHN0cmVldCwgbnVtYmVyU3BlYyB9IGFzIFNtZExpbmU7XG4gICAgfVxuICApO1xuXG4gIHByaXZhdGUgbXVuaWNpcGFsaXR5UGFydE5hbWVBbmROdW1iZXJzU3BlY3MgPSB0aGlzLlJVTEUoXG4gICAgXCJtdW5pY2lwYWxpdHlQYXJ0TmFtZUFuZE51bWJlcnNTcGVjc1wiLFxuICAgICgpID0+IHtcbiAgICAgIGNvbnN0IG11bmljaXBhbGl0eVBhcnQgPSBwYXJzZU11bmljaXBhbGl0eVBhcnROYW1lKFxuICAgICAgICB0aGlzLkNPTlNVTUUoTXVuaWNpcGFsaXR5UGFydE5hbWUpLmltYWdlXG4gICAgICApO1xuICAgICAgdGhpcy5PUFRJT04oKCkgPT4ge1xuICAgICAgICB0aGlzLkNPTlNVTUUoTWFpblNlcGFyYXRvcik7XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IG51bWJlclNwZWMgPSB0aGlzLlNVQlJVTEUodGhpcy5udW1iZXJTcGVjcyk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBcIm11bmljaXBhbGl0eVBhcnRcIixcbiAgICAgICAgbXVuaWNpcGFsaXR5UGFydCxcbiAgICAgICAgbnVtYmVyU3BlYyxcbiAgICAgIH0gYXMgU21kTGluZTtcbiAgICB9XG4gICk7XG5cbiAgcHJpdmF0ZSBudW1iZXJTcGVjcyA9IHRoaXMuUlVMRShcIm51bWJlclNwZWNzXCIsICgpID0+IHtcbiAgICBjb25zdCBwb3NpdGl2ZVJlc3VsdCA9IFtdO1xuICAgIGxldCBuZWdhdGl2ZVJlc3VsdDogTmVnYXRpdmVTZXJpZXNTcGVjO1xuICAgIHRoaXMuT1IoW1xuICAgICAge1xuICAgICAgICBHQVRFOiAoKSA9PiB0aGlzLkxBKDIpLnRva2VuVHlwZSA9PT0gV2l0aG91dCxcbiAgICAgICAgQUxUOiAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgdHlwZSA9IHRoaXMuU1VCUlVMRSh0aGlzLnNlcmllc1R5cGUpO1xuICAgICAgICAgIHRoaXMuQ09OU1VNRShXaXRob3V0KTtcbiAgICAgICAgICB0aGlzLk9QVElPTigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLkNPTlNVTUUoQWxsVHlwZSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY29uc3QgcmFuZ2VzID0gdGhpcy5TVUJSVUxFKHRoaXMucmFuZ2VMaXN0KTtcbiAgICAgICAgICByZXR1cm4geyBuZWdhdGl2ZTogdHJ1ZSwgdHlwZSwgcmFuZ2VzIH07XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBBTFQ6ICgpID0+IHtcbiAgICAgICAgICB0aGlzLkNPTlNVTUUyKFdpdGhvdXQpO1xuICAgICAgICAgIHRoaXMuT1IxKFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgR0FURTogdGhpcy5fZ2F0ZVBvc3RmaXhUeXBlU2VyaWVzU3BlYyxcbiAgICAgICAgICAgICAgQUxUOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyB0eXBlLCByYW5nZXMgfSA9IHRoaXMuU1VCUlVMRShcbiAgICAgICAgICAgICAgICAgIHRoaXMucG9zdGZpeFR5cGVTZXJpZXNTcGVjXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBuZWdhdGl2ZVJlc3VsdCA9IHsgbmVnYXRpdmU6IHRydWUsIHR5cGUsIHJhbmdlcyB9O1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgQUxUOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdHlwZSA9IHRoaXMuU1VCUlVMRTIodGhpcy5zZXJpZXNUeXBlKTtcbiAgICAgICAgICAgICAgICBjb25zdCByYW5nZXMgPSB0aGlzLlNVQlJVTEUyKHRoaXMucmFuZ2VMaXN0KTtcbiAgICAgICAgICAgICAgICBuZWdhdGl2ZVJlc3VsdCA9IHsgbmVnYXRpdmU6IHRydWUsIHR5cGUsIHJhbmdlcyB9O1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdKTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIEFMVDogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuQVRfTEVBU1RfT05FX1NFUCh7XG4gICAgICAgICAgICBTRVA6IFNlcGFyYXRvcixcbiAgICAgICAgICAgIERFRjogKCkgPT4ge1xuICAgICAgICAgICAgICBwb3NpdGl2ZVJlc3VsdC5wdXNoKHRoaXMuU1VCUlVMRSh0aGlzLnNlcmllc1NwZWNzKSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICBdKTtcbiAgICBpZiAobmVnYXRpdmVSZXN1bHQpIHtcbiAgICAgIHJldHVybiBuZWdhdGl2ZVJlc3VsdDtcbiAgICB9XG4gICAgcmV0dXJuIHBvc2l0aXZlUmVzdWx0O1xuICB9KTtcblxuICBwcml2YXRlIHNlcmllc1NwZWNzID0gdGhpcy5SVUxFKFwic2VyaWVzU3BlY3NcIiwgKCkgPT4ge1xuICAgIGxldCByYW5nZXMgPSBbXTtcbiAgICBsZXQgdHlwZTogU2VyaWVzVHlwZTtcbiAgICB0aGlzLk9SKFtcbiAgICAgIHtcbiAgICAgICAgR0FURTogdGhpcy5fZ2F0ZVBvc3RmaXhUeXBlU2VyaWVzU3BlYyxcbiAgICAgICAgQUxUOiAoKSA9PiB7XG4gICAgICAgICAgKHsgdHlwZSwgcmFuZ2VzIH0gPSB0aGlzLlNVQlJVTEUodGhpcy5wb3N0Zml4VHlwZVNlcmllc1NwZWMpKTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIEFMVDogKCkgPT4ge1xuICAgICAgICAgIHR5cGUgPSB0aGlzLlNVQlJVTEUodGhpcy5zZXJpZXNUeXBlKTtcbiAgICAgICAgICB0aGlzLk9QVElPTigoKSA9PiB7XG4gICAgICAgICAgICByYW5nZXMgPSB0aGlzLlNVQlJVTEUodGhpcy5yYW5nZUxpc3QpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgQUxUOiAoKSA9PiB7XG4gICAgICAgICAgKHsgdHlwZSwgcmFuZ2VzIH0gPSB0aGlzLlNVQlJVTEUyKHRoaXMuZnJvbUFuZEFib3ZlV2l0aFR5cGUpKTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIEFMVDogKCkgPT4ge1xuICAgICAgICAgICh7IHR5cGUsIHJhbmdlcyB9ID0gdGhpcy5TVUJSVUxFKHRoaXMudG9PckJlbG93V2l0aFR5cGUpKTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgXSk7XG5cbiAgICByZXR1cm4geyB0eXBlLCByYW5nZXMgfTtcbiAgfSk7XG5cbiAgcHJpdmF0ZSBfZ2F0ZVBvc3RmaXhUeXBlU2VyaWVzU3BlYyA9ICgpOiBib29sZWFuID0+IHtcbiAgICBsZXQgaW5kZXggPSAyO1xuICAgIHdoaWxlICghW1NlcGFyYXRvciwgRU9GXS5pbmNsdWRlcyh0aGlzLkxBKGluZGV4KS50b2tlblR5cGUpKSB7XG4gICAgICBpZiAoW09kZFR5cGUsIEV2ZW5UeXBlXS5pbmNsdWRlcyh0aGlzLkxBKGluZGV4KS50b2tlblR5cGUpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgaW5kZXgrKztcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuXG4gIHByaXZhdGUgcG9zdGZpeFR5cGVTZXJpZXNTcGVjID0gdGhpcy5SVUxFKFwicG9zdGZpeFR5cGVTZXJpZXNTcGVjXCIsICgpID0+IHtcbiAgICB0aGlzLkNPTlNVTUUoQWxsVHlwZSk7XG4gICAgY29uc3QgcmFuZ2VzID0gW3RoaXMuU1VCUlVMRSh0aGlzLnJhbmdlT3JOdW1iZXIpXTtcbiAgICBsZXQgdHlwZTogU2VyaWVzVHlwZTtcbiAgICB0aGlzLk9SMShbXG4gICAgICB7XG4gICAgICAgIEFMVDogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuQ09OU1VNRShPZGRUeXBlKTtcbiAgICAgICAgICB0eXBlID0gU2VyaWVzVHlwZS5PZGQ7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBBTFQ6ICgpID0+IHtcbiAgICAgICAgICB0aGlzLkNPTlNVTUUxKEV2ZW5UeXBlKTtcbiAgICAgICAgICB0eXBlID0gU2VyaWVzVHlwZS5FdmVuO1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICBdKTtcbiAgICByZXR1cm4geyB0eXBlLCByYW5nZXMgfTtcbiAgfSk7XG5cbiAgcHJpdmF0ZSByYW5nZUxpc3QgPSB0aGlzLlJVTEUoXCJyYW5nZUxpc3RcIiwgKCkgPT4ge1xuICAgIGxldCByYW5nZXMgPSBbXTtcbiAgICByYW5nZXMucHVzaCh0aGlzLlNVQlJVTEUodGhpcy5yYW5nZU9yTnVtYmVyKSk7XG4gICAgdGhpcy5NQU5ZKHtcbiAgICAgIEdBVEU6ICgpID0+IFtOdW1iZXIsIFRvLCBGcm9tXS5pbmNsdWRlcyh0aGlzLkxBKDIpLnRva2VuVHlwZSksXG4gICAgICBERUY6ICgpID0+IHtcbiAgICAgICAgdGhpcy5DT05TVU1FKFNlcGFyYXRvcik7XG4gICAgICAgIHJhbmdlcy5wdXNoKHRoaXMuU1VCUlVMRTIodGhpcy5yYW5nZU9yTnVtYmVyKSk7XG4gICAgICB9LFxuICAgIH0pO1xuICAgIHJldHVybiByYW5nZXM7XG4gIH0pO1xuXG4gIHByaXZhdGUgc2VyaWVzVHlwZSA9IHRoaXMuUlVMRShcInNlcmllc1R5cGVcIiwgKCkgPT4ge1xuICAgIGxldCB0eXBlOiBTZXJpZXNUeXBlO1xuICAgIHRoaXMuT1IoW1xuICAgICAge1xuICAgICAgICBBTFQ6ICgpID0+IHtcbiAgICAgICAgICB0aGlzLkNPTlNVTUUoT2RkVHlwZSk7XG4gICAgICAgICAgdHlwZSA9IFNlcmllc1R5cGUuT2RkO1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgQUxUOiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5DT05TVU1FMShFdmVuVHlwZSk7XG4gICAgICAgICAgdHlwZSA9IFNlcmllc1R5cGUuRXZlbjtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIEFMVDogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuQ09OU1VNRTIoQWxsVHlwZSk7XG4gICAgICAgICAgdHlwZSA9IFNlcmllc1R5cGUuQWxsO1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgQUxUOiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5DT05TVU1FMyhEZXNjcmlwdGl2ZVR5cGUpO1xuICAgICAgICAgIHR5cGUgPSBTZXJpZXNUeXBlLkRlc2NyaXB0aW9uO1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICBdKTtcbiAgICByZXR1cm4gdHlwZTtcbiAgfSk7XG5cbiAgcHJpdmF0ZSByYW5nZU9yTnVtYmVyID0gdGhpcy5SVUxFKFwicmFuZ2VPck51bWJlclwiLCAoKSA9PiB7XG4gICAgbGV0IHJlc3VsdDtcbiAgICB0aGlzLk9SKFtcbiAgICAgIHtcbiAgICAgICAgQUxUOiAoKSA9PiB7XG4gICAgICAgICAgcmVzdWx0ID0gdGhpcy5TVUJSVUxFKHRoaXMucmFuZ2UpO1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgQUxUOiAoKSA9PiB7XG4gICAgICAgICAgcmVzdWx0ID0gdGhpcy5TVUJSVUxFKHRoaXMuZnJvbUFuZEFib3ZlKTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIEFMVDogKCkgPT4ge1xuICAgICAgICAgIHJlc3VsdCA9IHRoaXMuU1VCUlVMRSh0aGlzLnRvT3JCZWxvdyk7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBBTFQ6ICgpID0+IHtcbiAgICAgICAgICByZXN1bHQgPSB0aGlzLlNVQlJVTEUodGhpcy5mdWxsU3RyZWV0TnVtYmVyKTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIEFMVDogKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IG4gPSBwYXJzZVJpY2hOdW1iZXIodGhpcy5DT05TVU1FKE51bWJlcikuaW1hZ2UpO1xuICAgICAgICAgIHJlc3VsdCA9IHsgZnJvbTogbiwgdG86IG4gfTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgXSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSk7XG5cbiAgcHJpdmF0ZSByYW5nZSA9IHRoaXMuUlVMRShcInJhbmdlXCIsICgpID0+IHtcbiAgICBjb25zdCBmcm9tID0gcGFyc2VSaWNoTnVtYmVyKHRoaXMuQ09OU1VNRShOdW1iZXIpLmltYWdlKTtcbiAgICB0aGlzLk9SKFtcbiAgICAgIHsgQUxUOiAoKSA9PiB0aGlzLkNPTlNVTUUxKEh5cGhlbikgfSxcbiAgICAgIHsgQUxUOiAoKSA9PiB0aGlzLkNPTlNVTUUyKE1haW5TZXBhcmF0b3IpIH0sXG4gICAgXSk7XG4gICAgdGhpcy5PUFRJT04oKCkgPT4ge1xuICAgICAgdGhpcy5DT05TVU1FKEFsbFR5cGUpO1xuICAgIH0pO1xuICAgIGNvbnN0IHRvID0gcGFyc2VSaWNoTnVtYmVyKHRoaXMuQ09OU1VNRTMoTnVtYmVyKS5pbWFnZSk7XG4gICAgcmV0dXJuIHsgZnJvbSwgdG8gfTtcbiAgfSk7XG5cbiAgcHJpdmF0ZSBmcm9tQW5kQWJvdmUgPSB0aGlzLlJVTEUoXCJmcm9tQW5kQWJvdmVcIiwgKCkgPT4ge1xuICAgIGxldCBmcm9tOiBSaWNoTnVtYmVyO1xuICAgIHRoaXMuT1IoW1xuICAgICAge1xuICAgICAgICBBTFQ6ICgpID0+IHtcbiAgICAgICAgICBmcm9tID0gcGFyc2VSaWNoTnVtYmVyKHRoaXMuQ09OU1VNRShOdW1iZXIpLmltYWdlKTtcbiAgICAgICAgICB0aGlzLkNPTlNVTUUoQW5kQWJvdmUpO1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgQUxUOiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5DT05TVU1FKEZyb20pO1xuICAgICAgICAgIHRoaXMuT1BUSU9OKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuQ09OU1VNRShBbGxUeXBlKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBmcm9tID0gcGFyc2VSaWNoTnVtYmVyKHRoaXMuQ09OU1VNRTIoTnVtYmVyKS5pbWFnZSk7XG4gICAgICAgICAgdGhpcy5PUFRJT04yKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuQ09OU1VNRTIoQW5kQWJvdmUpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICBdKTtcblxuICAgIHJldHVybiB7IGZyb20gfTtcbiAgfSk7XG5cbiAgcHJpdmF0ZSBmcm9tQW5kQWJvdmVXaXRoVHlwZSA9IHRoaXMuUlVMRShcImZyb21BbmRBYm92ZVdpdGhUeXBlXCIsICgpID0+IHtcbiAgICBsZXQgdHlwZSA9IFNlcmllc1R5cGUuQWxsO1xuICAgIHRoaXMuQ09OU1VNRShGcm9tKTtcbiAgICB0aGlzLk9QVElPTigoKSA9PiB7XG4gICAgICB0aGlzLk9SKFtcbiAgICAgICAge1xuICAgICAgICAgIEFMVDogKCkgPT4ge1xuICAgICAgICAgICAgdHlwZSA9IFNlcmllc1R5cGUuQWxsO1xuICAgICAgICAgICAgdGhpcy5DT05TVU1FKEFsbFR5cGUpO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBBTFQ6ICgpID0+IHtcbiAgICAgICAgICAgIHR5cGUgPSBTZXJpZXNUeXBlLkRlc2NyaXB0aW9uO1xuICAgICAgICAgICAgdGhpcy5DT05TVU1FKERlc2NyaXB0aXZlVHlwZSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIF0pO1xuICAgIH0pO1xuICAgIGNvbnN0IGZyb20gPSBwYXJzZVJpY2hOdW1iZXIodGhpcy5DT05TVU1FKE51bWJlcikuaW1hZ2UpO1xuICAgIHRoaXMuT1BUSU9OMigoKSA9PiB7XG4gICAgICB0aGlzLkNPTlNVTUUoQW5kQWJvdmUpO1xuICAgIH0pO1xuICAgIHJldHVybiB7IHR5cGUsIHJhbmdlczogW3sgZnJvbSB9XSB9O1xuICB9KTtcblxuICBwcml2YXRlIHRvT3JCZWxvdyA9IHRoaXMuUlVMRShcInRvT3JCZWxvd1wiLCAoKSA9PiB7XG4gICAgbGV0IHRvOiBSaWNoTnVtYmVyO1xuICAgIHRoaXMuT1IoW1xuICAgICAge1xuICAgICAgICBBTFQ6ICgpID0+IHtcbiAgICAgICAgICB0byA9IHBhcnNlUmljaE51bWJlcih0aGlzLkNPTlNVTUUoTnVtYmVyKS5pbWFnZSk7XG4gICAgICAgICAgdGhpcy5DT05TVU1FKEFuZEJlbG93KTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIEFMVDogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuQ09OU1VNRTIoVG8pO1xuICAgICAgICAgIHRvID0gcGFyc2VSaWNoTnVtYmVyKHRoaXMuQ09OU1VNRTIoTnVtYmVyKS5pbWFnZSk7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIF0pO1xuXG4gICAgcmV0dXJuIHsgdG8gfTtcbiAgfSk7XG5cbiAgcHJpdmF0ZSB0b09yQmVsb3dXaXRoVHlwZSA9IHRoaXMuUlVMRShcInRvT3JCZWxvd1dpdGhUeXBlXCIsICgpID0+IHtcbiAgICBsZXQgdHlwZSA9IFNlcmllc1R5cGUuQWxsO1xuICAgIHRoaXMuQ09OU1VNRShUbyk7XG4gICAgdGhpcy5PUFRJT04oKCkgPT4ge1xuICAgICAgdGhpcy5PUihbXG4gICAgICAgIHtcbiAgICAgICAgICBBTFQ6ICgpID0+IHtcbiAgICAgICAgICAgIHR5cGUgPSBTZXJpZXNUeXBlLkFsbDtcbiAgICAgICAgICAgIHRoaXMuQ09OU1VNRShBbGxUeXBlKTtcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgQUxUOiAoKSA9PiB7XG4gICAgICAgICAgICB0eXBlID0gU2VyaWVzVHlwZS5EZXNjcmlwdGlvbjtcbiAgICAgICAgICAgIHRoaXMuQ09OU1VNRShEZXNjcmlwdGl2ZVR5cGUpO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdKTtcbiAgICB9KTtcbiAgICBjb25zdCB0byA9IHBhcnNlUmljaE51bWJlcih0aGlzLkNPTlNVTUUoTnVtYmVyKS5pbWFnZSk7XG4gICAgcmV0dXJuIHsgdHlwZSwgcmFuZ2VzOiBbeyB0byB9XSB9O1xuICB9KTtcblxuICBwcml2YXRlIGZ1bGxTdHJlZXROdW1iZXIgPSB0aGlzLlJVTEUoXG4gICAgXCJmdWxsU3RyZWV0TnVtYmVyXCIsXG4gICAgKCk6IEZ1bGxTdHJlZXROdW1iZXIgPT4ge1xuICAgICAgY29uc3QgZGVzY3JpcHRpdmVOdW1iZXIgPSBwYXJzZVJpY2hOdW1iZXIodGhpcy5DT05TVU1FKE51bWJlcikuaW1hZ2UpO1xuICAgICAgdGhpcy5DT05TVU1FKFNsYXNoKTtcbiAgICAgIGNvbnN0IG9yaWVudGF0aW9uTnVtYmVyID0gcGFyc2VSaWNoTnVtYmVyKHRoaXMuQ09OU1VNRTIoTnVtYmVyKS5pbWFnZSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBkZXNjcmlwdGlvbk51bWJlcjogZGVzY3JpcHRpdmVOdW1iZXIsXG4gICAgICAgIG9yaWVudGF0aW9uYWxOdW1iZXI6IG9yaWVudGF0aW9uTnVtYmVyLFxuICAgICAgfTtcbiAgICB9XG4gICk7XG59XG5cbmNvbnN0IG51bWJlcldpdGhDaGFyYWN0ZXJQYXR0ZXJuID0gL14oXFxkKykoW2Etel0pJC87XG5cbmV4cG9ydCBjb25zdCBwYXJzZVJpY2hOdW1iZXIgPSAobnVtYmVyOiBzdHJpbmcpOiBSaWNoTnVtYmVyID0+IHtcbiAgaWYgKG51bWJlcldpdGhDaGFyYWN0ZXJQYXR0ZXJuLnRlc3QobnVtYmVyKSkge1xuICAgIGNvbnN0IG1hdGNoID0gbnVtYmVyV2l0aENoYXJhY3RlclBhdHRlcm4uZXhlYyhudW1iZXIpO1xuICAgIHJldHVybiB7XG4gICAgICBudW1iZXI6IHBhcnNlSW50KG1hdGNoWzFdKSxcbiAgICAgIGxldHRlcjogbWF0Y2hbMl0sXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4ge1xuICAgICAgbnVtYmVyOiBwYXJzZUludChudW1iZXIpLFxuICAgIH07XG4gIH1cbn07XG5cbmNvbnN0IG11bmljaXBhbGl0eVBhcnRQYXR0ZXJuID0gL17EjcOhc3QgKD88dHlwZT5vYmNlfG3Em3N0YSkgKD88bmFtZT4uKykkLztcblxuZXhwb3J0IGNvbnN0IHBhcnNlTXVuaWNpcGFsaXR5UGFydE5hbWUgPSAobmFtZTogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgY29uc3QgbWF0Y2ggPSBtdW5pY2lwYWxpdHlQYXJ0UGF0dGVybi5leGVjKG5hbWUpO1xuICByZXR1cm4gbWF0Y2g/Lmdyb3Vwcy5uYW1lPy50cmltKCkgPz8gXCJcIjtcbn07XG4iXX0=
|