text-to-map 1.1.29 → 1.1.31
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/dist/bin/clear-all.js +8 -19
- package/dist/bin/init-db.js +5 -16
- package/dist/bin/knex.js +6 -17
- package/dist/bin/parse-ordinance.js +60 -71
- package/dist/bin/polygons.js +22 -33
- package/dist/db/address-points.js +43 -54
- package/dist/db/cities.js +25 -31
- package/dist/db/db.js +24 -33
- package/dist/db/founders.js +101 -89
- package/dist/db/meta.js +12 -21
- package/dist/db/migrations/20230704125715_initial.js +291 -304
- package/dist/db/migrations/20230731232915_city_positions.js +9 -22
- package/dist/db/migrations/20240106224603_city_polygon.js +7 -20
- package/dist/db/migrations/20240320200534_district_polygon.js +7 -20
- package/dist/db/migrations/20240729211323_ordinance_city.js +11 -0
- package/dist/db/regions.js +20 -29
- package/dist/db/schools.d.ts +1 -1
- package/dist/db/schools.js +18 -24
- package/dist/db/street-sync.js +13 -22
- package/dist/db/sync-log.js +25 -34
- package/dist/index.js +10 -21
- package/dist/open-data-sync/address-points.js +21 -30
- package/dist/open-data-sync/cities.js +10 -19
- package/dist/open-data-sync/common.js +8 -17
- package/dist/open-data-sync/regions.js +13 -22
- package/dist/open-data-sync/schools.js +20 -29
- package/dist/open-data-sync/streets.js +29 -35
- package/dist/smd-to-csv/ordinance-to-csv-rules.js +4 -13
- package/dist/smd-to-csv/txt-to-json.js +59 -70
- package/dist/street-markdown/municipality.js +26 -29
- package/dist/street-markdown/polygons.d.ts +4 -4
- package/dist/street-markdown/polygons.js +123 -70
- package/dist/street-markdown/smd-line-parser.js +6 -9
- package/dist/street-markdown/smd-parser.js +2 -3
- package/dist/street-markdown/smd.d.ts +7 -1
- package/dist/street-markdown/smd.js +180 -154
- package/dist/street-markdown/types.d.ts +19 -12
- package/dist/street-markdown/types.js +1 -1
- package/dist/utils/atom.js +9 -18
- package/dist/utils/helpers.d.ts +1 -1
- package/dist/utils/helpers.js +10 -5
- package/package.json +5 -1
|
@@ -1,12 +1,3 @@
|
|
|
1
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
-
});
|
|
9
|
-
};
|
|
10
1
|
import { AddressPointType, createSingleLineAddress } from "czech-address";
|
|
11
2
|
import { SeriesType, isNegativeSeriesSpec, isRange, isSeriesSpecArray, } from "../street-markdown/types";
|
|
12
3
|
import { findClosestString } from "../utils/helpers";
|
|
@@ -58,15 +49,15 @@ const columnNames = [
|
|
|
58
49
|
"wgs84_latitude",
|
|
59
50
|
"wgs84_longitude",
|
|
60
51
|
];
|
|
61
|
-
export const commitAddressPoints = (buffer) =>
|
|
52
|
+
export const commitAddressPoints = async (buffer) => {
|
|
62
53
|
if (buffer.length === 0) {
|
|
63
54
|
return 0;
|
|
64
55
|
}
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
56
|
+
await insertCities(buffer);
|
|
57
|
+
await insertDistricts(buffer);
|
|
58
|
+
await insertMunicipalityParts(buffer);
|
|
59
|
+
await insertStreets(buffer);
|
|
60
|
+
await insertPragueDistricts(buffer);
|
|
70
61
|
const params = [];
|
|
71
62
|
buffer.forEach((data) => {
|
|
72
63
|
let latOrNull, lonOrNull;
|
|
@@ -80,42 +71,42 @@ export const commitAddressPoints = (buffer) => __awaiter(void 0, void 0, void 0,
|
|
|
80
71
|
});
|
|
81
72
|
const placeHolders = generate2DPlaceholders(columnNames.length, buffer.length);
|
|
82
73
|
const knex = getKnexDb();
|
|
83
|
-
|
|
74
|
+
await rawQuery(`INSERT ${isMysql(knex) ? "IGNORE" : ""} INTO address_point (${columnNames.join(",")}) VALUES ${placeHolders} ${!isMysql(knex) ? "ON CONFLICT (id) DO NOTHING" : ""}`, params);
|
|
84
75
|
return buffer.length;
|
|
85
|
-
}
|
|
86
|
-
export const insertCities = (buffer) =>
|
|
87
|
-
return
|
|
88
|
-
}
|
|
89
|
-
export const insertDistricts = (buffer) =>
|
|
90
|
-
return
|
|
76
|
+
};
|
|
77
|
+
export const insertCities = async (buffer) => {
|
|
78
|
+
return await insertMultipleRows(extractKeyValuesPairs(buffer, Column.cityCode, [Column.cityName]), "city", ["code", "name"]);
|
|
79
|
+
};
|
|
80
|
+
export const insertDistricts = async (buffer) => {
|
|
81
|
+
return await insertMultipleRows(extractKeyValuesPairs(buffer, Column.districtCode, [
|
|
91
82
|
Column.cityCode,
|
|
92
83
|
Column.districtName,
|
|
93
84
|
]), "city_district", ["code", "city_code", "name"]);
|
|
94
|
-
}
|
|
95
|
-
export const insertMunicipalityParts = (buffer) =>
|
|
96
|
-
return
|
|
85
|
+
};
|
|
86
|
+
export const insertMunicipalityParts = async (buffer) => {
|
|
87
|
+
return await insertMultipleRows(extractKeyValuesPairs(buffer, Column.municipalityPartCode, [
|
|
97
88
|
Column.municipalityPartName,
|
|
98
89
|
Column.cityCode,
|
|
99
90
|
]), "municipality_part", ["code", "name", "city_code"]);
|
|
100
|
-
}
|
|
101
|
-
export const insertPragueDistricts = (buffer) =>
|
|
102
|
-
return
|
|
91
|
+
};
|
|
92
|
+
export const insertPragueDistricts = async (buffer) => {
|
|
93
|
+
return await insertMultipleRows(extractKeyValuesPairs(buffer, Column.pragueDistrictCode, [
|
|
103
94
|
Column.pragueDistrictName,
|
|
104
95
|
]), "prague_district", ["code", "name"]);
|
|
105
|
-
}
|
|
106
|
-
export const insertStreets = (buffer) =>
|
|
107
|
-
return
|
|
96
|
+
};
|
|
97
|
+
export const insertStreets = async (buffer) => {
|
|
98
|
+
return await insertMultipleRows(extractKeyValuesPairs(buffer, Column.streetCode, [
|
|
108
99
|
Column.cityCode,
|
|
109
100
|
Column.streetName,
|
|
110
101
|
]), "street", ["code", "city_code", "name"]);
|
|
111
|
-
}
|
|
112
|
-
export const areAddressPointsSynced = () =>
|
|
113
|
-
const result =
|
|
102
|
+
};
|
|
103
|
+
export const areAddressPointsSynced = async () => {
|
|
104
|
+
const result = await getKnexDb()
|
|
114
105
|
.count("*", { as: "countAll" })
|
|
115
106
|
.from("address_point")
|
|
116
107
|
.first();
|
|
117
108
|
return Number(result.countAll) >= 2900000; // total is almost 3 million
|
|
118
|
-
}
|
|
109
|
+
};
|
|
119
110
|
const addressPointSelect = `
|
|
120
111
|
SELECT a.id, s.name AS street_name, o.name AS object_type_name, a.descriptive_number,
|
|
121
112
|
a.orientational_number, a.orientational_number_letter, c.name AS city_name,
|
|
@@ -128,22 +119,22 @@ const addressPointSelect = `
|
|
|
128
119
|
LEFT JOIN city_district d ON a.city_district_code = d.code
|
|
129
120
|
LEFT JOIN prague_district p ON a.prague_district_code = p.code
|
|
130
121
|
LEFT JOIN municipality_part m ON a.municipality_part_code = m.code`;
|
|
131
|
-
export const getAddressPointById = (addressPointId) =>
|
|
132
|
-
const row =
|
|
122
|
+
export const getAddressPointById = async (addressPointId) => {
|
|
123
|
+
const row = await rawQuery(`${addressPointSelect}
|
|
133
124
|
WHERE a.id = ?`, [addressPointId]);
|
|
134
125
|
if (row.length === 0) {
|
|
135
126
|
return null;
|
|
136
127
|
}
|
|
137
128
|
return rowToAddressPoint(row[0]);
|
|
138
|
-
}
|
|
129
|
+
};
|
|
139
130
|
let lastFounder = null;
|
|
140
131
|
let allStreets = [];
|
|
141
|
-
export const checkStreetExists = (streetName, founder) =>
|
|
132
|
+
export const checkStreetExists = async (streetName, founder) => {
|
|
142
133
|
const knex = getKnexDb();
|
|
143
134
|
const errors = [];
|
|
144
135
|
// we check the whole city
|
|
145
|
-
const cityCode =
|
|
146
|
-
const rowList =
|
|
136
|
+
const cityCode = await getFounderCityCode(founder);
|
|
137
|
+
const rowList = await rawQuery(`SELECT name AS street_name
|
|
147
138
|
FROM street
|
|
148
139
|
WHERE city_code = ? AND name = ? ${isSqlite(knex) ? "COLLATE NOCASE" : ""}`, [cityCode, streetName]);
|
|
149
140
|
if (rowList.length > 0) {
|
|
@@ -156,7 +147,7 @@ export const checkStreetExists = (streetName, founder) => __awaiter(void 0, void
|
|
|
156
147
|
return { exists: true, errors };
|
|
157
148
|
}
|
|
158
149
|
if (lastFounder !== founder) {
|
|
159
|
-
allStreets =
|
|
150
|
+
allStreets = await getAllStreets(cityCode);
|
|
160
151
|
lastFounder = founder;
|
|
161
152
|
}
|
|
162
153
|
const match = allStreets.find((s) => s.toLocaleLowerCase("cs-CZ") === streetName.toLocaleLowerCase("cs-CZ"));
|
|
@@ -178,16 +169,16 @@ export const checkStreetExists = (streetName, founder) => __awaiter(void 0, void
|
|
|
178
169
|
});
|
|
179
170
|
}
|
|
180
171
|
return { exists: false, errors };
|
|
181
|
-
}
|
|
182
|
-
const getAllStreets = (cityCode) =>
|
|
172
|
+
};
|
|
173
|
+
const getAllStreets = async (cityCode) => {
|
|
183
174
|
const knex = getKnexDb();
|
|
184
|
-
return
|
|
185
|
-
}
|
|
186
|
-
export const findAddressPoints = (params) =>
|
|
175
|
+
return await knex.pluck("name").from("street").where("city_code", cityCode);
|
|
176
|
+
};
|
|
177
|
+
export const findAddressPoints = async (params) => {
|
|
187
178
|
const queryParams = getQueryParams(params);
|
|
188
179
|
const streetJoinCondition = getStreetJoinCondition(params);
|
|
189
180
|
const whereCondition = getWhereCondition(params);
|
|
190
|
-
const queryResult =
|
|
181
|
+
const queryResult = await rawQuery(`SELECT a.id, s.name AS street_name, o.name AS object_type_name, a.descriptive_number,
|
|
191
182
|
a.orientational_number, a.orientational_number_letter, c.name AS city_name,
|
|
192
183
|
d.name AS district_name, m.name AS municipality_part_name, p.name AS prague_district_name,
|
|
193
184
|
a.postal_code, a.wgs84_latitude, a.wgs84_longitude
|
|
@@ -200,7 +191,7 @@ export const findAddressPoints = (params) => __awaiter(void 0, void 0, void 0, f
|
|
|
200
191
|
LEFT JOIN prague_district p ON a.prague_district_code = p.code
|
|
201
192
|
WHERE ${whereCondition}`, queryParams);
|
|
202
193
|
return filterAddressPoints(queryResult.map(rowToAddressPoint), params);
|
|
203
|
-
}
|
|
194
|
+
};
|
|
204
195
|
export const filterAddressPoints = (addressPoints, params) => {
|
|
205
196
|
if (params.type === "wholeMunicipality" ||
|
|
206
197
|
params.type === "wholeMunicipalityNoStreetName" ||
|
|
@@ -229,11 +220,10 @@ const filterAddressPointsByRanges = (addressPoints, seriesSpec) => {
|
|
|
229
220
|
const result = [];
|
|
230
221
|
seriesSpec.ranges.forEach((range) => {
|
|
231
222
|
result.push(...addressPoints.filter((addressPoint) => {
|
|
232
|
-
var _a;
|
|
233
223
|
if (isRange(range)) {
|
|
234
224
|
const number = getNumberByType(seriesSpec.type, addressPoint);
|
|
235
225
|
return (isInRange(number, seriesSpec.type !== SeriesType.Description
|
|
236
|
-
?
|
|
226
|
+
? addressPoint.orientationalNumberLetter ?? null
|
|
237
227
|
: null, range) && fitsType(number, seriesSpec.type));
|
|
238
228
|
}
|
|
239
229
|
else {
|
|
@@ -309,10 +299,9 @@ export const equalsFullStreetNumber = (fullStreetNumber, addressPoint) => {
|
|
|
309
299
|
addressPoint.orientationalNumberLetter));
|
|
310
300
|
};
|
|
311
301
|
const getNumberByType = (type, addressPoint) => {
|
|
312
|
-
var _a;
|
|
313
302
|
return type === SeriesType.Description
|
|
314
303
|
? addressPoint.houseNumber
|
|
315
|
-
:
|
|
304
|
+
: addressPoint.orientationalNumber ?? null;
|
|
316
305
|
};
|
|
317
306
|
const getMunicipalityWhere = (alias, municipality) => {
|
|
318
307
|
return municipality.type === MunicipalityType.City
|
|
@@ -351,4 +340,4 @@ const rowToAddressPoint = (row) => {
|
|
|
351
340
|
point.address = createSingleLineAddress(point);
|
|
352
341
|
return point;
|
|
353
342
|
};
|
|
354
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkcmVzcy1wb2ludHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZGIvYWRkcmVzcy1wb2ludHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLGdCQUFnQixFQUFFLHVCQUF1QixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFFLE9BQU8sRUFLTCxVQUFVLEVBR1Ysb0JBQW9CLEVBQ3BCLE9BQU8sRUFDUCxpQkFBaUIsR0FDbEIsTUFBTSwwQkFBMEIsQ0FBQztBQUNsQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNyRCxPQUFPLFVBQVUsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QyxPQUFPLEVBQ0wscUJBQXFCLEVBQ3JCLHNCQUFzQixFQUN0QixTQUFTLEVBQ1Qsa0JBQWtCLEVBQ2xCLE9BQU8sRUFDUCxRQUFRLEVBQ1IsY0FBYyxFQUNkLFFBQVEsR0FDVCxNQUFNLE1BQU0sQ0FBQztBQUNkLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNoRCxPQUFPLEVBQXlCLGdCQUFnQixFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRWxFLE1BQU0sZUFBZSxHQUFHLE1BQU0sQ0FBQztBQUMvQixNQUFNLGdCQUFnQixHQUFHLE9BQU8sQ0FBQztBQUVqQyxNQUFNLFdBQVcsR0FBRztJQUNsQixDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUM7SUFDcEIsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUM7Q0FDdEIsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLE1BQU0sR0FBRztJQUNwQixPQUFPLEVBQUUsQ0FBQztJQUNWLFFBQVEsRUFBRSxDQUFDO0lBQ1gsUUFBUSxFQUFFLENBQUM7SUFDWCxZQUFZLEVBQUUsQ0FBQztJQUNmLFlBQVksRUFBRSxDQUFDO0lBQ2Ysa0JBQWtCLEVBQUUsQ0FBQztJQUNyQixrQkFBa0IsRUFBRSxDQUFDO0lBQ3JCLG9CQUFvQixF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Q3BDO0lBQ0QsSUFBSSxHQUFHLENBQUMsb0JBQW9CLEtBQUssSUFBSSxFQUFFO1FBQ3JDLEtBQUssQ0FBQyxjQUFjLEdBQUcsR0FBRyxDQUFDLG9CQUFvQixDQUFDO0tBQ2pEO0lBQ0QsS0FBSyxDQUFDLE9BQU8sR0FBRyx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMvQyxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFkZHJlc3NQb2ludFR5cGUsIGNyZWF0ZVNpbmdsZUxpbmVBZGRyZXNzIH0gZnJvbSBcImN6ZWNoLWFkZHJlc3NcIjtcclxuaW1wb3J0IHtcclxuICBBZGRyZXNzUG9pbnQsXHJcbiAgRnVsbFN0cmVldE51bWJlcixcclxuICBSYW5nZVNwZWMsXHJcbiAgU2VyaWVzU3BlYyxcclxuICBTZXJpZXNUeXBlLFxyXG4gIFNtZEVycm9yLFxyXG4gIFNtZExpbmUsXHJcbiAgaXNOZWdhdGl2ZVNlcmllc1NwZWMsXHJcbiAgaXNSYW5nZSxcclxuICBpc1Nlcmllc1NwZWNBcnJheSxcclxufSBmcm9tIFwiLi4vc3RyZWV0LW1hcmtkb3duL3R5cGVzXCI7XHJcbmltcG9ydCB7IGZpbmRDbG9zZXN0U3RyaW5nIH0gZnJvbSBcIi4uL3V0aWxzL2hlbHBlcnNcIjtcclxuaW1wb3J0IGp0c2syd2dzODQgZnJvbSBcIi4uL3V0aWxzL2p0c2syd2dzODRcIjtcclxuaW1wb3J0IHtcclxuICBleHRyYWN0S2V5VmFsdWVzUGFpcnMsXHJcbiAgZ2VuZXJhdGUyRFBsYWNlaG9sZGVycyxcclxuICBnZXRLbmV4RGIsXHJcbiAgaW5zZXJ0TXVsdGlwbGVSb3dzLFxyXG4gIGlzTXlzcWwsXHJcbiAgaXNTcWxpdGUsXHJcbiAgbm9uRW1wdHlPck51bGwsXHJcbiAgcmF3UXVlcnksXHJcbn0gZnJvbSBcIi4vZGJcIjtcclxuaW1wb3J0IHsgZ2V0Rm91bmRlckNpdHlDb2RlIH0gZnJvbSBcIi4vZm91bmRlcnNcIjtcclxuaW1wb3J0IHsgRm91bmRlciwgTXVuaWNpcGFsaXR5LCBNdW5pY2lwYWxpdHlUeXBlIH0gZnJvbSBcIi4vdHlwZXNcIjtcclxuXHJcbmNvbnN0IERlc2NyaXB0aXZlVHlwZSA9IFwixI0ucC5cIjtcclxuY29uc3QgUmVnaXN0cmF0aW9uVHlwZSA9IFwixI0uZXYuXCI7XHJcblxyXG5jb25zdCBPYmplY3RUeXBlcyA9IHtcclxuICBbRGVzY3JpcHRpdmVUeXBlXTogMSxcclxuICBbUmVnaXN0cmF0aW9uVHlwZV06IDIsXHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgQ29sdW1uID0ge1xyXG4gIGFkbUNvZGU6IDAsXHJcbiAgY2l0eUNvZGU6IDEsXHJcbiAgY2l0eU5hbWU6IDIsXHJcbiAgZGlzdHJpY3RDb2RlOiAzLFxyXG4gIGRpc3RyaWN0TmFtZTogNCxcclxuICBwcmFndWVEaXN0cmljdENvZGU6IDUsXHJcbiAgcHJhZ3VlRGlzdHJpY3ROYW1lOiA2LFxyXG4gIG11bmljaXBhbGl0eVBhcnRDb2RlOiA3LFxyXG4gIG11bmljaXBhbGl0eVBhcnROYW1lOiA4LFxyXG4gIHN0cmVldENvZGU6IDksXHJcbiAgc3RyZWV0TmFtZTogMTAsXHJcbiAgb2JqZWN0VHlwZTogMTEsXHJcbiAgaG91c2VOdW1iZXI6IDEyLFxyXG4gIG9yaWVudGF0aW9uYWxOdW1iZXI6IDEzLFxyXG4gIG9yaWVudGF0aW9uYWxOdW1iZXJMZXR0ZXI6IDE0LFxyXG4gIHBvc3RhbENvZGU6IDE1LFxyXG4gIHlDb29yZGluYXRlOiAxNixcclxuICB4Q29vcmRpbmF0ZTogMTcsXHJcbiAgdmFsaWRGcm9tOiAxOCxcclxufTtcclxuXHJcbmNvbnN0IGNvbHVtbk5hbWVzID0gW1xyXG4gIFwiaWRcIixcclxuICBcInN0cmVldF9jb2RlXCIsXHJcbiAgXCJvYmplY3RfdHlwZV9pZFwiLFxyXG4gIFwiZGVzY3JpcHRpdmVfbnVtYmVyXCIsXHJcbiAgXCJvcmllbnRhdGlvbmFsX251bWJlclwiLFxyXG4gIFwib3JpZW50YXRpb25hbF9udW1iZXJfbGV0dGVyXCIsXHJcbiAgXCJjaXR5X2NvZGVcIixcclxuICBcImNpdHlfZGlzdHJpY3RfY29kZVwiLFxyXG4gIFwibXVuaWNpcGFsaXR5X3BhcnRfY29kZVwiLFxyXG4gIFwicHJhZ3VlX2Rpc3RyaWN0X2NvZGVcIixcclxuICBcInBvc3RhbF9jb2RlXCIsXHJcbiAgXCJqdHNrX3hcIixcclxuICBcImp0c2tfeVwiLFxyXG4gIFwid2dzODRfbGF0aXR1ZGVcIixcclxuICBcIndnczg0X2xvbmdpdHVkZVwiLFxyXG5dO1xyXG5cclxuZXhwb3J0IGNvbnN0IGNvbW1pdEFkZHJlc3NQb2ludHMgPSBhc3luYyAoXHJcbiAgYnVmZmVyOiBzdHJpbmdbXVtdXHJcbik6IFByb21pc2U8bnVtYmVyPiA9PiB7XHJcbiAgaWYgKGJ1ZmZlci5sZW5ndGggPT09IDApIHtcclxuICAgIHJldHVybiAwO1xyXG4gIH1cclxuICBhd2FpdCBpbnNlcnRDaXRpZXMoYnVmZmVyKTtcclxuICBhd2FpdCBpbnNlcnREaXN0cmljdHMoYnVmZmVyKTtcclxuICBhd2FpdCBpbnNlcnRNdW5pY2lwYWxpdHlQYXJ0cyhidWZmZXIpO1xyXG4gIGF3YWl0IGluc2VydFN0cmVldHMoYnVmZmVyKTtcclxuICBhd2FpdCBpbnNlcnRQcmFndWVEaXN0cmljdHMoYnVmZmVyKTtcclxuXHJcbiAgY29uc3QgcGFyYW1zOiAoc3RyaW5nIHwgbnVsbClbXSA9IFtdO1xyXG4gIGJ1ZmZlci5mb3JFYWNoKChkYXRhKSA9PiB7XHJcbiAgICBsZXQgbGF0T3JOdWxsOiBzdHJpbmcsIGxvbk9yTnVsbDogc3RyaW5nO1xyXG4gICAgbGF0T3JOdWxsID0gbnVsbDtcclxuICAgIGxvbk9yTnVsbCA9IG51bGw7XHJcbiAgICBpZiAoZGF0YVtDb2x1bW4ueENvb3JkaW5hdGVdICYmIGRhdGFbQ29sdW1uLnlDb29yZGluYXRlXSkge1xyXG4gICAgICBjb25zdCB7IGxhdCwgbG9uIH0gPSBqdHNrMndnczg0KFxyXG4gICAgICAgIHBhcnNlRmxvYXQoZGF0YVtDb2x1bW4ueENvb3JkaW5hdGVdKSxcclxuICAgICAgICBwYXJzZUZsb2F0KGRhdGFbQ29sdW1uLnlDb29yZGluYXRlXSlcclxuICAgICAgKTtcclxuICAgICAgW2xhdE9yTnVsbCwgbG9uT3JOdWxsXSA9IFtsYXQudG9TdHJpbmcoKSwgbG9uLnRvU3RyaW5nKCldO1xyXG4gICAgfVxyXG4gICAgcGFyYW1zLnB1c2goXHJcbiAgICAgIGRhdGFbQ29sdW1uLmFkbUNvZGVdLFxyXG4gICAgICBub25FbXB0eU9yTnVsbChkYXRhW0NvbHVtbi5zdHJlZXRDb2RlXSksXHJcbiAgICAgIE9iamVjdFR5cGVzW2RhdGFbQ29sdW1uLm9iamVjdFR5cGVdXSxcclxuICAgICAgbm9uRW1wdHlPck51bGwoZGF0YVtDb2x1bW4uaG91c2VOdW1iZXJdKSxcclxuICAgICAgbm9uRW1wdHlPck51bGwoZGF0YVtDb2x1bW4ub3JpZW50YXRpb25hbE51bWJlcl0pLFxyXG4gICAgICBub25FbXB0eU9yTnVsbChkYXRhW0NvbHVtbi5vcmllbnRhdGlvbmFsTnVtYmVyTGV0dGVyXSksXHJcbiAgICAgIGRhdGFbQ29sdW1uLmNpdHlDb2RlXSxcclxuICAgICAgbm9uRW1wdHlPck51bGwoZGF0YVtDb2x1bW4uZGlzdHJpY3RDb2RlXSksXHJcbiAgICAgIG5vbkVtcHR5T3JOdWxsKGRhdGFbQ29sdW1uLm11bmljaXBhbGl0eVBhcnRDb2RlXSksXHJcbiAgICAgIG5vbkVtcHR5T3JOdWxsKGRhdGFbQ29sdW1uLnByYWd1ZURpc3RyaWN0Q29kZV0pLFxyXG4gICAgICBkYXRhW0NvbHVtbi5wb3N0YWxDb2RlXSxcclxuICAgICAgbm9uRW1wdHlPck51bGwoZGF0YVtDb2x1bW4ueENvb3JkaW5hdGVdKSxcclxuICAgICAgbm9uRW1wdHlPck51bGwoZGF0YVtDb2x1bW4ueUNvb3JkaW5hdGVdKSxcclxuICAgICAgbGF0T3JOdWxsLFxyXG4gICAgICBsb25Pck51bGxcclxuICAgICk7XHJcbiAgfSk7XHJcblxyXG4gIGNvbnN0IHBsYWNlSG9sZGVycyA9IGdlbmVyYXRlMkRQbGFjZWhvbGRlcnMoXHJcbiAgICBjb2x1bW5OYW1lcy5sZW5ndGgsXHJcbiAgICBidWZmZXIubGVuZ3RoXHJcbiAgKTtcclxuXHJcbiAgY29uc3Qga25leCA9IGdldEtuZXhEYigpO1xyXG4gIGF3YWl0IHJhd1F1ZXJ5KFxyXG4gICAgYElOU0VSVCAke1xyXG4gICAgICBpc015c3FsKGtuZXgpID8gXCJJR05PUkVcIiA6IFwiXCJcclxuICAgIH0gSU5UTyBhZGRyZXNzX3BvaW50ICgke2NvbHVtbk5hbWVzLmpvaW4oXCIsXCIpfSkgVkFMVUVTICR7cGxhY2VIb2xkZXJzfSAke1xyXG4gICAgICAhaXNNeXNxbChrbmV4KSA/IFwiT04gQ09ORkxJQ1QgKGlkKSBETyBOT1RISU5HXCIgOiBcIlwiXHJcbiAgICB9YCxcclxuICAgIHBhcmFtc1xyXG4gICk7XHJcblxyXG4gIHJldHVybiBidWZmZXIubGVuZ3RoO1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IGluc2VydENpdGllcyA9IGFzeW5jIChidWZmZXI6IHN0cmluZ1tdW10pOiBQcm9taXNlPG51bWJlcj4gPT4ge1xyXG4gIHJldHVybiBhd2FpdCBpbnNlcnRNdWx0aXBsZVJvd3MoXHJcbiAgICBleHRyYWN0S2V5VmFsdWVzUGFpcnMoYnVmZmVyLCBDb2x1bW4uY2l0eUNvZGUsIFtDb2x1bW4uY2l0eU5hbWVdKSxcclxuICAgIFwiY2l0eVwiLFxyXG4gICAgW1wiY29kZVwiLCBcIm5hbWVcIl1cclxuICApO1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IGluc2VydERpc3RyaWN0cyA9IGFzeW5jIChidWZmZXI6IHN0cmluZ1tdW10pOiBQcm9taXNlPG51bWJlcj4gPT4ge1xyXG4gIHJldHVybiBhd2FpdCBpbnNlcnRNdWx0aXBsZVJvd3MoXHJcbiAgICBleHRyYWN0S2V5VmFsdWVzUGFpcnMoYnVmZmVyLCBDb2x1bW4uZGlzdHJpY3RDb2RlLCBbXHJcbiAgICAgIENvbHVtbi5jaXR5Q29kZSxcclxuICAgICAgQ29sdW1uLmRpc3RyaWN0TmFtZSxcclxuICAgIF0pLFxyXG4gICAgXCJjaXR5X2Rpc3RyaWN0XCIsXHJcbiAgICBbXCJjb2RlXCIsIFwiY2l0eV9jb2RlXCIsIFwibmFtZVwiXVxyXG4gICk7XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgaW5zZXJ0TXVuaWNpcGFsaXR5UGFydHMgPSBhc3luYyAoXHJcbiAgYnVmZmVyOiBzdHJpbmdbXVtdXHJcbik6IFByb21pc2U8bnVtYmVyPiA9PiB7XHJcbiAgcmV0dXJuIGF3YWl0IGluc2VydE11bHRpcGxlUm93cyhcclxuICAgIGV4dHJhY3RLZXlWYWx1ZXNQYWlycyhidWZmZXIsIENvbHVtbi5tdW5pY2lwYWxpdHlQYXJ0Q29kZSwgW1xyXG4gICAgICBDb2x1bW4ubXVuaWNpcGFsaXR5UGFydE5hbWUsXHJcbiAgICAgIENvbHVtbi5jaXR5Q29kZSxcclxuICAgIF0pLFxyXG4gICAgXCJtdW5pY2lwYWxpdHlfcGFydFwiLFxyXG4gICAgW1wiY29kZVwiLCBcIm5hbWVcIiwgXCJjaXR5X2NvZGVcIl1cclxuICApO1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IGluc2VydFByYWd1ZURpc3RyaWN0cyA9IGFzeW5jIChcclxuICBidWZmZXI6IHN0cmluZ1tdW11cclxuKTogUHJvbWlzZTxudW1iZXI+ID0+IHtcclxuICByZXR1cm4gYXdhaXQgaW5zZXJ0TXVsdGlwbGVSb3dzKFxyXG4gICAgZXh0cmFjdEtleVZhbHVlc1BhaXJzKGJ1ZmZlciwgQ29sdW1uLnByYWd1ZURpc3RyaWN0Q29kZSwgW1xyXG4gICAgICBDb2x1bW4ucHJhZ3VlRGlzdHJpY3ROYW1lLFxyXG4gICAgXSksXHJcbiAgICBcInByYWd1ZV9kaXN0cmljdFwiLFxyXG4gICAgW1wiY29kZVwiLCBcIm5hbWVcIl1cclxuICApO1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IGluc2VydFN0cmVldHMgPSBhc3luYyAoYnVmZmVyOiBzdHJpbmdbXVtdKTogUHJvbWlzZTxudW1iZXI+ID0+IHtcclxuICByZXR1cm4gYXdhaXQgaW5zZXJ0TXVsdGlwbGVSb3dzKFxyXG4gICAgZXh0cmFjdEtleVZhbHVlc1BhaXJzKGJ1ZmZlciwgQ29sdW1uLnN0cmVldENvZGUsIFtcclxuICAgICAgQ29sdW1uLmNpdHlDb2RlLFxyXG4gICAgICBDb2x1bW4uc3RyZWV0TmFtZSxcclxuICAgIF0pLFxyXG4gICAgXCJzdHJlZXRcIixcclxuICAgIFtcImNvZGVcIiwgXCJjaXR5X2NvZGVcIiwgXCJuYW1lXCJdXHJcbiAgKTtcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBhcmVBZGRyZXNzUG9pbnRzU3luY2VkID0gYXN5bmMgKCk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xyXG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdldEtuZXhEYigpXHJcbiAgICAuY291bnQoXCIqXCIsIHsgYXM6IFwiY291bnRBbGxcIiB9KVxyXG4gICAgLmZyb20oXCJhZGRyZXNzX3BvaW50XCIpXHJcbiAgICAuZmlyc3QoKTtcclxuICByZXR1cm4gTnVtYmVyKHJlc3VsdC5jb3VudEFsbCkgPj0gMjkwMDAwMDsgLy8gdG90YWwgaXMgYWxtb3N0IDMgbWlsbGlvblxyXG59O1xyXG5cclxuY29uc3QgYWRkcmVzc1BvaW50U2VsZWN0ID0gYFxyXG4gIFNFTEVDVCBhLmlkLCBzLm5hbWUgQVMgc3RyZWV0X25hbWUsIG8ubmFtZSBBUyBvYmplY3RfdHlwZV9uYW1lLCBhLmRlc2NyaXB0aXZlX251bWJlcixcclxuICAgICAgICBhLm9yaWVudGF0aW9uYWxfbnVtYmVyLCBhLm9yaWVudGF0aW9uYWxfbnVtYmVyX2xldHRlciwgYy5uYW1lIEFTIGNpdHlfbmFtZSxcclxuICAgICAgICBtLm5hbWUgQVMgbXVuaWNpcGFsaXR5X3BhcnRfbmFtZSwgcC5uYW1lIEFTIHByYWd1ZV9kaXN0cmljdF9uYW1lLFxyXG4gICAgICAgIGQubmFtZSBBUyBkaXN0cmljdF9uYW1lLCBhLnBvc3RhbF9jb2RlLCBhLndnczg0X2xhdGl0dWRlLCBhLndnczg0X2xvbmdpdHVkZVxyXG4gIEZST00gYWRkcmVzc19wb2ludCBhXHJcbiAgTEVGVCBKT0lOIHN0cmVldCBzIE9OIGEuc3RyZWV0X2NvZGUgPSBzLmNvZGVcclxuICBJTk5FUiBKT0lOIG9iamVjdF90eXBlIG8gT04gby5pZCA9IGEub2JqZWN0X3R5cGVfaWRcclxuICBJTk5FUiBKT0lOIGNpdHkgYyBPTiBjLmNvZGUgPSBhLmNpdHlfY29kZVxyXG4gIExFRlQgSk9JTiBjaXR5X2Rpc3RyaWN0IGQgT04gYS5jaXR5X2Rpc3RyaWN0X2NvZGUgPSBkLmNvZGVcclxuICBMRUZUIEpPSU4gcHJhZ3VlX2Rpc3RyaWN0IHAgT04gYS5wcmFndWVfZGlzdHJpY3RfY29kZSA9IHAuY29kZVxyXG4gIExFRlQgSk9JTiBtdW5pY2lwYWxpdHlfcGFydCBtIE9OIGEubXVuaWNpcGFsaXR5X3BhcnRfY29kZSA9IG0uY29kZWA7XHJcblxyXG5leHBvcnQgY29uc3QgZ2V0QWRkcmVzc1BvaW50QnlJZCA9IGFzeW5jIChcclxuICBhZGRyZXNzUG9pbnRJZDogbnVtYmVyXHJcbik6IFByb21pc2U8QWRkcmVzc1BvaW50IHwgbnVsbD4gPT4ge1xyXG4gIGNvbnN0IHJvdyA9IGF3YWl0IHJhd1F1ZXJ5KFxyXG4gICAgYCR7YWRkcmVzc1BvaW50U2VsZWN0fVxyXG4gICAgICBXSEVSRSBhLmlkID0gP2AsXHJcbiAgICBbYWRkcmVzc1BvaW50SWRdXHJcbiAgKTtcclxuICBpZiAocm93Lmxlbmd0aCA9PT0gMCkge1xyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG4gIHJldHVybiByb3dUb0FkZHJlc3NQb2ludChyb3dbMF0pO1xyXG59O1xyXG5cclxubGV0IGxhc3RGb3VuZGVyOiBGb3VuZGVyIHwgbnVsbCA9IG51bGw7XHJcbmxldCBhbGxTdHJlZXRzOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuZXhwb3J0IGNvbnN0IGNoZWNrU3RyZWV0RXhpc3RzID0gYXN5bmMgKFxyXG4gIHN0cmVldE5hbWU6IHN0cmluZyxcclxuICBmb3VuZGVyOiBGb3VuZGVyXHJcbik6IFByb21pc2U8eyBleGlzdHM6IGJvb2xlYW47IGVycm9yczogU21kRXJyb3JbXSB9PiA9PiB7XHJcbiAgY29uc3Qga25leCA9IGdldEtuZXhEYigpO1xyXG4gIGNvbnN0IGVycm9yczogU21kRXJyb3JbXSA9IFtdO1xyXG5cclxuICAvLyB3ZSBjaGVjayB0aGUgd2hvbGUgY2l0eVxyXG4gIGNvbnN0IGNpdHlDb2RlID0gYXdhaXQgZ2V0Rm91bmRlckNpdHlDb2RlKGZvdW5kZXIpO1xyXG4gIGNvbnN0IHJvd0xpc3QgPSBhd2FpdCByYXdRdWVyeShcclxuICAgIGBTRUxFQ1QgbmFtZSBBUyBzdHJlZXRfbmFtZVxyXG4gICAgRlJPTSBzdHJlZXRcclxuICAgIFdIRVJFIGNpdHlfY29kZSA9ID8gQU5EIG5hbWUgPSA/ICAke1xyXG4gICAgICBpc1NxbGl0ZShrbmV4KSA/IFwiQ09MTEFURSBOT0NBU0VcIiA6IFwiXCJcclxuICAgIH1gLFxyXG4gICAgW2NpdHlDb2RlLCBzdHJlZXROYW1lXVxyXG4gICk7XHJcblxyXG4gIGlmIChyb3dMaXN0Lmxlbmd0aCA+IDApIHtcclxuICAgIGNvbnN0IHJvdyA9IHJvd0xpc3RbMF07XHJcbiAgICBpZiAocm93LnN0cmVldF9uYW1lICE9PSBzdHJlZXROYW1lKSB7XHJcbiAgICAgIC8vIGVycm9ycy5wdXNoKFxyXG4gICAgICAvLyAgIGBTdHJlZXQgJyR7c3RyZWV0TmFtZX0nIGhhcyB3cm9uZyBjYXNlLCBjb3JyZWN0IGNhc2U6ICcke3Jvdy5zdHJlZXRfbmFtZX0nLmBcclxuICAgICAgLy8gKTtcclxuICAgIH1cclxuICAgIHJldHVybiB7IGV4aXN0czogdHJ1ZSwgZXJyb3JzIH07XHJcbiAgfVxyXG5cclxuICBpZiAobGFzdEZvdW5kZXIgIT09IGZvdW5kZXIpIHtcclxuICAgIGFsbFN0cmVldHMgPSBhd2FpdCBnZXRBbGxTdHJlZXRzKGNpdHlDb2RlKTtcclxuICAgIGxhc3RGb3VuZGVyID0gZm91bmRlcjtcclxuICB9XHJcblxyXG4gIGNvbnN0IG1hdGNoID0gYWxsU3RyZWV0cy5maW5kKFxyXG4gICAgKHMpID0+XHJcbiAgICAgIHMudG9Mb2NhbGVMb3dlckNhc2UoXCJjcy1DWlwiKSA9PT0gc3RyZWV0TmFtZS50b0xvY2FsZUxvd2VyQ2FzZShcImNzLUNaXCIpXHJcbiAgKTtcclxuICBsZXQgZXhpc3RzID0gZmFsc2U7XHJcbiAgaWYgKG1hdGNoKSB7XHJcbiAgICBleGlzdHMgPSB0cnVlO1xyXG4gICAgaWYgKHN0cmVldE5hbWUgIT09IG1hdGNoKSB7XHJcbiAgICAgIC8vIGVycm9ycy5wdXNoKFxyXG4gICAgICAvLyAgIGBTdHJlZXQgJyR7c3RyZWV0TmFtZX0nIGhhcyB3cm9uZyBjYXNlLCBjb3JyZWN0IGNhc2U6ICcke21hdGNofScuYFxyXG4gICAgICAvLyApO1xyXG4gICAgfVxyXG4gIH0gZWxzZSB7XHJcbiAgICBjb25zdCBjbG9zZXN0ID0gZmluZENsb3Nlc3RTdHJpbmcoc3RyZWV0TmFtZSwgYWxsU3RyZWV0cyk7XHJcbiAgICBlcnJvcnMucHVzaCh7XHJcbiAgICAgIG1lc3NhZ2U6IGBVbGljZSAnJHtzdHJlZXROYW1lfScgdiB0w6l0byBvYmNpIG5lZXhpc3R1amUsIG15c2xlbGkganN0ZSAnJHtjbG9zZXN0fSc/YCxcclxuICAgICAgc3RhcnRPZmZzZXQ6IDAsXHJcbiAgICAgIGVuZE9mZnNldDogc3RyZWV0TmFtZS5sZW5ndGggKyAxLFxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIHJldHVybiB7IGV4aXN0czogZmFsc2UsIGVycm9ycyB9O1xyXG59O1xyXG5cclxuY29uc3QgZ2V0QWxsU3RyZWV0cyA9IGFzeW5jIChjaXR5Q29kZTogbnVtYmVyKTogUHJvbWlzZTxzdHJpbmdbXT4gPT4ge1xyXG4gIGNvbnN0IGtuZXggPSBnZXRLbmV4RGIoKTtcclxuICByZXR1cm4gYXdhaXQga25leC5wbHVjayhcIm5hbWVcIikuZnJvbShcInN0cmVldFwiKS53aGVyZShcImNpdHlfY29kZVwiLCBjaXR5Q29kZSk7XHJcbn07XHJcblxyXG5leHBvcnQgdHlwZSBGaW5kQWRkcmVzc1BvaW50c1BhcmFtcyA9XHJcbiAgfCB7XHJcbiAgICAgIHR5cGU6IFwic21kTGluZVwiO1xyXG4gICAgICBzbWRMaW5lOiBTbWRMaW5lO1xyXG4gICAgICBtdW5pY2lwYWxpdHk6IE11bmljaXBhbGl0eTtcclxuICAgICAgbXVuaWNpcGFsaXR5UGFydENvZGU/OiBudW1iZXI7XHJcbiAgICB9XHJcbiAgfCB7XHJcbiAgICAgIHR5cGU6IFwid2hvbGVNdW5pY2lwYWxpdHlQYXJ0XCI7XHJcbiAgICAgIG11bmljaXBhbGl0eVBhcnRDb2RlOiBudW1iZXI7XHJcbiAgICB9XHJcbiAgfCB7XHJcbiAgICAgIHR5cGU6IFwid2hvbGVNdW5pY2lwYWxpdHlcIjtcclxuICAgICAgbXVuaWNpcGFsaXR5OiBNdW5pY2lwYWxpdHk7XHJcbiAgICB9XHJcbiAgfCB7XHJcbiAgICAgIHR5cGU6IFwid2hvbGVNdW5pY2lwYWxpdHlOb1N0cmVldE5hbWVcIjtcclxuICAgICAgbXVuaWNpcGFsaXR5OiBNdW5pY2lwYWxpdHk7XHJcbiAgICB9O1xyXG5cclxuZXhwb3J0IGNvbnN0IGZpbmRBZGRyZXNzUG9pbnRzID0gYXN5bmMgKFxyXG4gIHBhcmFtczogRmluZEFkZHJlc3NQb2ludHNQYXJhbXNcclxuKTogUHJvbWlzZTxBZGRyZXNzUG9pbnRbXT4gPT4ge1xyXG4gIGNvbnN0IHF1ZXJ5UGFyYW1zID0gZ2V0UXVlcnlQYXJhbXMocGFyYW1zKTtcclxuICBjb25zdCBzdHJlZXRKb2luQ29uZGl0aW9uID0gZ2V0U3RyZWV0Sm9pbkNvbmRpdGlvbihwYXJhbXMpO1xyXG5cclxuICBjb25zdCB3aGVyZUNvbmRpdGlvbiA9IGdldFdoZXJlQ29uZGl0aW9uKHBhcmFtcyk7XHJcblxyXG4gIGNvbnN0IHF1ZXJ5UmVzdWx0ID0gYXdhaXQgcmF3UXVlcnkoXHJcbiAgICBgU0VMRUNUIGEuaWQsIHMubmFtZSBBUyBzdHJlZXRfbmFtZSwgby5uYW1lIEFTIG9iamVjdF90eXBlX25hbWUsIGEuZGVzY3JpcHRpdmVfbnVtYmVyLFxyXG4gICAgICBhLm9yaWVudGF0aW9uYWxfbnVtYmVyLCBhLm9yaWVudGF0aW9uYWxfbnVtYmVyX2xldHRlciwgYy5uYW1lIEFTIGNpdHlfbmFtZSxcclxuICAgICAgZC5uYW1lIEFTIGRpc3RyaWN0X25hbWUsIG0ubmFtZSBBUyBtdW5pY2lwYWxpdHlfcGFydF9uYW1lLCBwLm5hbWUgQVMgcHJhZ3VlX2Rpc3RyaWN0X25hbWUsXHJcbiAgICAgIGEucG9zdGFsX2NvZGUsIGEud2dzODRfbGF0aXR1ZGUsIGEud2dzODRfbG9uZ2l0dWRlXHJcbiAgICBGUk9NIGFkZHJlc3NfcG9pbnQgYVxyXG4gICAgJHtzdHJlZXRKb2luQ29uZGl0aW9ufVxyXG4gICAgSU5ORVIgSk9JTiBvYmplY3RfdHlwZSBvIE9OIG8uaWQgPSBhLm9iamVjdF90eXBlX2lkXHJcbiAgICBJTk5FUiBKT0lOIGNpdHkgYyBPTiBjLmNvZGUgPSBhLmNpdHlfY29kZVxyXG4gICAgTEVGVCBKT0lOIGNpdHlfZGlzdHJpY3QgZCBPTiBhLmNpdHlfZGlzdHJpY3RfY29kZSA9IGQuY29kZVxyXG4gICAgTEVGVCBKT0lOIG11bmljaXBhbGl0eV9wYXJ0IG0gT04gYS5tdW5pY2lwYWxpdHlfcGFydF9jb2RlID0gbS5jb2RlXHJcbiAgICBMRUZUIEpPSU4gcHJhZ3VlX2Rpc3RyaWN0IHAgT04gYS5wcmFndWVfZGlzdHJpY3RfY29kZSA9IHAuY29kZVxyXG4gICAgV0hFUkUgJHt3aGVyZUNvbmRpdGlvbn1gLFxyXG4gICAgcXVlcnlQYXJhbXNcclxuICApO1xyXG5cclxuICByZXR1cm4gZmlsdGVyQWRkcmVzc1BvaW50cyhxdWVyeVJlc3VsdC5tYXAocm93VG9BZGRyZXNzUG9pbnQpLCBwYXJhbXMpO1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IGZpbHRlckFkZHJlc3NQb2ludHMgPSAoXHJcbiAgYWRkcmVzc1BvaW50czogQWRkcmVzc1BvaW50W10sXHJcbiAgcGFyYW1zOiBGaW5kQWRkcmVzc1BvaW50c1BhcmFtc1xyXG4pOiBBZGRyZXNzUG9pbnRbXSA9PiB7XHJcbiAgaWYgKFxyXG4gICAgcGFyYW1zLnR5cGUgPT09IFwid2hvbGVNdW5pY2lwYWxpdHlcIiB8fFxyXG4gICAgcGFyYW1zLnR5cGUgPT09IFwid2hvbGVNdW5pY2lwYWxpdHlOb1N0cmVldE5hbWVcIiB8fFxyXG4gICAgcGFyYW1zLnR5cGUgPT09IFwid2hvbGVNdW5pY2lwYWxpdHlQYXJ0XCJcclxuICApIHtcclxuICAgIHJldHVybiBhZGRyZXNzUG9pbnRzO1xyXG4gIH1cclxuXHJcbiAgY29uc3QgcmVzdWx0OiBBZGRyZXNzUG9pbnRbXSA9IFtdO1xyXG4gIGNvbnN0IG51bWJlclNwZWMgPSBwYXJhbXMuc21kTGluZS5udW1iZXJTcGVjO1xyXG4gIGlmIChpc1Nlcmllc1NwZWNBcnJheShudW1iZXJTcGVjKSkge1xyXG4gICAgbnVtYmVyU3BlYy5mb3JFYWNoKChzZXJpZXNTcGVjKSA9PiB7XHJcbiAgICAgIHJlc3VsdC5wdXNoKC4uLmZpbHRlckFkZHJlc3NQb2ludHNCeVJhbmdlcyhhZGRyZXNzUG9pbnRzLCBzZXJpZXNTcGVjKSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyB3aGVuIG5vIG51bWJlciBzcGVjcyBhcmUgcHJlc2VudCwgd2UgdGFrZSBldmVyeXRoaW5nXHJcbiAgICBpZiAobnVtYmVyU3BlYy5sZW5ndGggPT09IDApIHtcclxuICAgICAgcmVzdWx0LnB1c2goLi4uYWRkcmVzc1BvaW50cyk7XHJcbiAgICB9XHJcbiAgfSBlbHNlIGlmIChpc05lZ2F0aXZlU2VyaWVzU3BlYyhudW1iZXJTcGVjKSkge1xyXG4gICAgLy8gbmVnYXRpdmUgbnVtYmVyIHNwZWMgKGUuZy4gb2RkIG51bWJlcnMgZXhjZXB0IDEzLTE3KVxyXG4gICAgY29uc3QgdG9FeGNsdWRlID0gZmlsdGVyQWRkcmVzc1BvaW50c0J5UmFuZ2VzKGFkZHJlc3NQb2ludHMsIG51bWJlclNwZWMpO1xyXG4gICAgcmVzdWx0LnB1c2goXHJcbiAgICAgIC4uLmFkZHJlc3NQb2ludHMuZmlsdGVyKFxyXG4gICAgICAgIChhZGRyZXNzUG9pbnQpID0+ICF0b0V4Y2x1ZGUuaW5jbHVkZXMoYWRkcmVzc1BvaW50KVxyXG4gICAgICApXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHJlc3VsdDtcclxufTtcclxuXHJcbmNvbnN0IGZpbHRlckFkZHJlc3NQb2ludHNCeVJhbmdlcyA9IChcclxuICBhZGRyZXNzUG9pbnRzOiBBZGRyZXNzUG9pbnRbXSxcclxuICBzZXJpZXNTcGVjOiBTZXJpZXNTcGVjXHJcbik6IEFkZHJlc3NQb2ludFtdID0+IHtcclxuICBjb25zdCByZXN1bHQ6IEFkZHJlc3NQb2ludFtdID0gW107XHJcbiAgc2VyaWVzU3BlYy5yYW5nZXMuZm9yRWFjaCgocmFuZ2UpID0+IHtcclxuICAgIHJlc3VsdC5wdXNoKFxyXG4gICAgICAuLi5hZGRyZXNzUG9pbnRzLmZpbHRlcigoYWRkcmVzc1BvaW50KSA9PiB7XHJcbiAgICAgICAgaWYgKGlzUmFuZ2UocmFuZ2UpKSB7XHJcbiAgICAgICAgICBjb25zdCBudW1iZXIgPSBnZXROdW1iZXJCeVR5cGUoc2VyaWVzU3BlYy50eXBlLCBhZGRyZXNzUG9pbnQpO1xyXG4gICAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgaXNJblJhbmdlKFxyXG4gICAgICAgICAgICAgIG51bWJlcixcclxuICAgICAgICAgICAgICBzZXJpZXNTcGVjLnR5cGUgIT09IFNlcmllc1R5cGUuRGVzY3JpcHRpb25cclxuICAgICAgICAgICAgICAgID8gYWRkcmVzc1BvaW50Lm9yaWVudGF0aW9uYWxOdW1iZXJMZXR0ZXIgPz8gbnVsbFxyXG4gICAgICAgICAgICAgICAgOiBudWxsLFxyXG4gICAgICAgICAgICAgIHJhbmdlXHJcbiAgICAgICAgICAgICkgJiYgZml0c1R5cGUobnVtYmVyLCBzZXJpZXNTcGVjLnR5cGUpXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjb25zdCBmdWxsU3RyZWV0TnVtYmVyOiBGdWxsU3RyZWV0TnVtYmVyID0gcmFuZ2U7XHJcbiAgICAgICAgICByZXR1cm4gZXF1YWxzRnVsbFN0cmVldE51bWJlcihmdWxsU3RyZWV0TnVtYmVyLCBhZGRyZXNzUG9pbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfSk7XHJcblxyXG4gIC8vIHdoZW4gbm8gc2VyaWVzIHNwZWNzIGFyZSBwcmVzZW50LCB3ZSB0YWtlIGV2ZXJ5dGhpbmcgdGhhdCBmaXRzIHRoZSB0eXBlXHJcbiAgaWYgKHNlcmllc1NwZWMucmFuZ2VzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgcmVzdWx0LnB1c2goXHJcbiAgICAgIC4uLmFkZHJlc3NQb2ludHMuZmlsdGVyKChhZGRyZXNzUG9pbnQpID0+XHJcbiAgICAgICAgZml0c1R5cGUoXHJcbiAgICAgICAgICBnZXROdW1iZXJCeVR5cGUoc2VyaWVzU3BlYy50eXBlLCBhZGRyZXNzUG9pbnQpLFxyXG4gICAgICAgICAgc2VyaWVzU3BlYy50eXBlXHJcbiAgICAgICAgKVxyXG4gICAgICApXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHJlc3VsdDtcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBnZXRRdWVyeVBhcmFtcyA9IChcclxuICBwYXJhbXM6IEZpbmRBZGRyZXNzUG9pbnRzUGFyYW1zXHJcbik6IChzdHJpbmcgfCBudW1iZXIpW10gPT4ge1xyXG4gIGlmIChwYXJhbXMudHlwZSA9PT0gXCJzbWRMaW5lXCIgJiYgcGFyYW1zLnNtZExpbmUudHlwZSA9PT0gXCJzdHJlZXRcIikge1xyXG4gICAgcmV0dXJuIFtwYXJhbXMuc21kTGluZS5zdHJlZXQsIHBhcmFtcy5tdW5pY2lwYWxpdHkuY29kZV07XHJcbiAgfVxyXG5cclxuICBpZiAoXHJcbiAgICAocGFyYW1zLnR5cGUgPT09IFwic21kTGluZVwiICYmIHBhcmFtcy5zbWRMaW5lLnR5cGUgPT09IFwibXVuaWNpcGFsaXR5UGFydFwiKSB8fFxyXG4gICAgcGFyYW1zLnR5cGUgPT09IFwid2hvbGVNdW5pY2lwYWxpdHlQYXJ0XCJcclxuICApIHtcclxuICAgIHJldHVybiBbcGFyYW1zLm11bmljaXBhbGl0eVBhcnRDb2RlXTtcclxuICB9XHJcblxyXG4gIHJldHVybiBbcGFyYW1zLm11bmljaXBhbGl0eS5jb2RlXTtcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBnZXRTdHJlZXRKb2luQ29uZGl0aW9uID0gKFxyXG4gIHBhcmFtczogRmluZEFkZHJlc3NQb2ludHNQYXJhbXNcclxuKTogc3RyaW5nID0+IHtcclxuICBpZiAocGFyYW1zLnR5cGUgPT09IFwic21kTGluZVwiICYmIHBhcmFtcy5zbWRMaW5lLnR5cGUgPT09IFwic3RyZWV0XCIpIHtcclxuICAgIHJldHVybiBgSk9JTiBzdHJlZXQgcyBPTiBhLnN0cmVldF9jb2RlID0gcy5jb2RlIEFORCBzLm5hbWUgPSA/ICR7XHJcbiAgICAgIGlzU3FsaXRlKGdldEtuZXhEYigpKSA/IFwiQ09MTEFURSBOT0NBU0VcIiA6IFwiXCJcclxuICAgIH1gO1xyXG4gIH1cclxuICByZXR1cm4gXCJMRUZUIEpPSU4gc3RyZWV0IHMgT04gYS5zdHJlZXRfY29kZSA9IHMuY29kZVwiO1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IGdldFdoZXJlQ29uZGl0aW9uID0gKHBhcmFtczogRmluZEFkZHJlc3NQb2ludHNQYXJhbXMpOiBzdHJpbmcgPT4ge1xyXG4gIGlmIChcclxuICAgIChwYXJhbXMudHlwZSA9PT0gXCJzbWRMaW5lXCIgJiYgcGFyYW1zLnNtZExpbmUudHlwZSA9PT0gXCJtdW5pY2lwYWxpdHlQYXJ0XCIpIHx8XHJcbiAgICBwYXJhbXMudHlwZSA9PT0gXCJ3aG9sZU11bmljaXBhbGl0eVBhcnRcIlxyXG4gICkge1xyXG4gICAgcmV0dXJuIFwiYS5tdW5pY2lwYWxpdHlfcGFydF9jb2RlID0gP1wiO1xyXG4gIH1cclxuXHJcbiAgaWYgKHBhcmFtcy50eXBlID09PSBcIndob2xlTXVuaWNpcGFsaXR5Tm9TdHJlZXROYW1lXCIpIHtcclxuICAgIHJldHVybiBgJHtnZXRNdW5pY2lwYWxpdHlXaGVyZShcclxuICAgICAgXCJhXCIsXHJcbiAgICAgIHBhcmFtcy5tdW5pY2lwYWxpdHlcclxuICAgICl9IEFORCBhLnN0cmVldF9jb2RlIElTIE5VTExgO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGdldE11bmljaXBhbGl0eVdoZXJlKFwiYVwiLCBwYXJhbXMubXVuaWNpcGFsaXR5KTtcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBpc0luUmFuZ2UgPSAoXHJcbiAgbnVtYmVyOiBudW1iZXIgfCBudWxsLFxyXG4gIGxldHRlcjogc3RyaW5nIHwgbnVsbCxcclxuICByYW5nZTogUmFuZ2VTcGVjXHJcbik6IGJvb2xlYW4gPT4ge1xyXG4gIGlmIChudW1iZXIgPT09IG51bGwpIHtcclxuICAgIHJldHVybiAhcmFuZ2UuZnJvbSAmJiAhcmFuZ2UudG87XHJcbiAgfVxyXG5cclxuICAvLyBleHBsYWluZXI6IGVpdGhlciB0aGUgbG93ZXIgYm91bmQgaXMgbm90IHNldCwgb3IgaXQgaXMgbG93ZXIgdGhhbiB0aGUgbnVtYmVyXHJcbiAgLy8gaWYgaXQncyBlcXVhbCB0byB0aGUgbnVtYmVyLCB3ZSBhbHNvIGhhdmUgdG8gY2hlY2sgdGhlIGxldHRlciAtIGlmIGl0J3Mgbm90IHNldCwgd2UgZG9uJ3QgY2FyZVxyXG4gIC8vIGlmIGZyb20ubGV0dGVyIGlzIHNldCwgd2UgbmVlZCB0byBoYXZlIGEgbGV0dGVyIHNldCBhbmQgaXQgaGFzIHRvIGJlIGdyZWF0ZXIgb3IgZXF1YWw6XHJcbiAgLy8gbnVtYmVyIHdpdGhvdXQgbGV0dGVyIGNvdW50cyBsb3dlciB0aGFuIG51bWJlciB3aXRoIGxldHRlciAnYScgKGUuZy4gMjMgPCAyM2EpXHJcbiAgY29uc3Qgc2F0aXNmaWVzRnJvbSA9XHJcbiAgICAhcmFuZ2UuZnJvbSB8fFxyXG4gICAgbnVtYmVyID4gcmFuZ2UuZnJvbS5udW1iZXIgfHxcclxuICAgIChudW1iZXIgPT09IHJhbmdlLmZyb20ubnVtYmVyICYmXHJcbiAgICAgICghcmFuZ2UuZnJvbS5sZXR0ZXIgfHwgKCEhbGV0dGVyICYmIGxldHRlciA+PSByYW5nZS5mcm9tLmxldHRlcikpKTtcclxuXHJcbiAgY29uc3Qgc2F0aXNmaWVzVG8gPVxyXG4gICAgIXJhbmdlLnRvIHx8XHJcbiAgICBudW1iZXIgPCByYW5nZS50by5udW1iZXIgfHxcclxuICAgIChudW1iZXIgPT09IHJhbmdlLnRvLm51bWJlciAmJlxyXG4gICAgICAoIWxldHRlciB8fFxyXG4gICAgICAgICghIXJhbmdlLnRvLmxldHRlciAmJiAhIWxldHRlciAmJiBsZXR0ZXIgPD0gcmFuZ2UudG8ubGV0dGVyKSkpO1xyXG5cclxuICByZXR1cm4gc2F0aXNmaWVzRnJvbSAmJiBzYXRpc2ZpZXNUbztcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBmaXRzVHlwZSA9IChudW1iZXI6IG51bWJlciB8IG51bGwsIHR5cGU6IFNlcmllc1R5cGUpOiBib29sZWFuID0+IHtcclxuICByZXR1cm4gKFxyXG4gICAgdHlwZSA9PT0gU2VyaWVzVHlwZS5EZXNjcmlwdGlvbiB8fFxyXG4gICAgdHlwZSA9PT0gU2VyaWVzVHlwZS5BbGwgfHxcclxuICAgICh0eXBlID09PSBTZXJpZXNUeXBlLk9kZCAmJiBudW1iZXIgJSAyID09PSAxKSB8fFxyXG4gICAgKHR5cGUgPT09IFNlcmllc1R5cGUuRXZlbiAmJiBudW1iZXIgJSAyID09PSAwKVxyXG4gICk7XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgZXF1YWxzRnVsbFN0cmVldE51bWJlciA9IChcclxuICBmdWxsU3RyZWV0TnVtYmVyOiBGdWxsU3RyZWV0TnVtYmVyLFxyXG4gIGFkZHJlc3NQb2ludDogQWRkcmVzc1BvaW50XHJcbik6IGJvb2xlYW4gPT4ge1xyXG4gIHJldHVybiAoXHJcbiAgICBmdWxsU3RyZWV0TnVtYmVyLmRlc2NyaXB0aW9uTnVtYmVyLm51bWJlciA9PT0gYWRkcmVzc1BvaW50LmhvdXNlTnVtYmVyICYmXHJcbiAgICBmdWxsU3RyZWV0TnVtYmVyLm9yaWVudGF0aW9uYWxOdW1iZXIubnVtYmVyID09PVxyXG4gICAgICBhZGRyZXNzUG9pbnQub3JpZW50YXRpb25hbE51bWJlciAmJlxyXG4gICAgKCghZnVsbFN0cmVldE51bWJlci5vcmllbnRhdGlvbmFsTnVtYmVyLmxldHRlciAmJlxyXG4gICAgICAhYWRkcmVzc1BvaW50Lm9yaWVudGF0aW9uYWxOdW1iZXJMZXR0ZXIpIHx8XHJcbiAgICAgIGZ1bGxTdHJlZXROdW1iZXIub3JpZW50YXRpb25hbE51bWJlci5sZXR0ZXIgPT09XHJcbiAgICAgICAgYWRkcmVzc1BvaW50Lm9yaWVudGF0aW9uYWxOdW1iZXJMZXR0ZXIpXHJcbiAgKTtcclxufTtcclxuXHJcbmNvbnN0IGdldE51bWJlckJ5VHlwZSA9IChcclxuICB0eXBlOiBTZXJpZXNUeXBlLFxyXG4gIGFkZHJlc3NQb2ludDogQWRkcmVzc1BvaW50XHJcbik6IG51bWJlciB8IG51bGwgPT4ge1xyXG4gIHJldHVybiB0eXBlID09PSBTZXJpZXNUeXBlLkRlc2NyaXB0aW9uXHJcbiAgICA/IGFkZHJlc3NQb2ludC5ob3VzZU51bWJlclxyXG4gICAgOiBhZGRyZXNzUG9pbnQub3JpZW50YXRpb25hbE51bWJlciA/PyBudWxsO1xyXG59O1xyXG5cclxuY29uc3QgZ2V0TXVuaWNpcGFsaXR5V2hlcmUgPSAoXHJcbiAgYWxpYXM6IHN0cmluZyxcclxuICBtdW5pY2lwYWxpdHk6IE11bmljaXBhbGl0eVxyXG4pOiBzdHJpbmcgPT4ge1xyXG4gIHJldHVybiBtdW5pY2lwYWxpdHkudHlwZSA9PT0gTXVuaWNpcGFsaXR5VHlwZS5DaXR5XHJcbiAgICA/IGAke2FsaWFzfS5jaXR5X2NvZGUgPSA/YFxyXG4gICAgOiBgJHthbGlhc30uY2l0eV9kaXN0cmljdF9jb2RlID0gP2A7XHJcbn07XHJcblxyXG5jb25zdCByb3dUb0FkZHJlc3NQb2ludCA9IChyb3c6IGFueSk6IEFkZHJlc3NQb2ludCA9PiB7XHJcbiAgY29uc3QgcG9pbnQ6IEFkZHJlc3NQb2ludCA9IHtcclxuICAgIGlkOiByb3cuaWQsXHJcbiAgICBhZGRyZXNzOiBcIlwiLFxyXG4gICAgdHlwZTpcclxuICAgICAgcm93Lm9iamVjdF90eXBlX25hbWUgPT09IERlc2NyaXB0aXZlVHlwZVxyXG4gICAgICAgID8gQWRkcmVzc1BvaW50VHlwZS5EZXNjcmlwdGlvblxyXG4gICAgICAgIDogQWRkcmVzc1BvaW50VHlwZS5SZWdpc3RyYXRpb24sXHJcbiAgICBob3VzZU51bWJlcjogcm93LmRlc2NyaXB0aXZlX251bWJlcixcclxuICAgIGNpdHk6IHJvdy5jaXR5X25hbWUsXHJcbiAgICBtdW5pY2lwYWxpdHlQYXJ0OiByb3cubXVuaWNpcGFsaXR5X3BhcnRfbmFtZSxcclxuICAgIHBvc3RhbENvZGU6IHJvdy5wb3N0YWxfY29kZSxcclxuICAgIGxhdDogcm93Lndnczg0X2xhdGl0dWRlLFxyXG4gICAgbG5nOiByb3cud2dzODRfbG9uZ2l0dWRlLFxyXG4gIH07XHJcbiAgaWYgKHJvdy5zdHJlZXRfbmFtZSAhPT0gbnVsbCkge1xyXG4gICAgcG9pbnQuc3RyZWV0ID0gcm93LnN0cmVldF9uYW1lO1xyXG4gIH1cclxuICBpZiAocm93Lm9yaWVudGF0aW9uYWxfbnVtYmVyICE9PSBudWxsKSB7XHJcbiAgICBwb2ludC5vcmllbnRhdGlvbmFsTnVtYmVyID0gcm93Lm9yaWVudGF0aW9uYWxfbnVtYmVyO1xyXG4gIH1cclxuICBpZiAocm93Lm9yaWVudGF0aW9uYWxfbnVtYmVyX2xldHRlciAhPT0gbnVsbCkge1xyXG4gICAgcG9pbnQub3JpZW50YXRpb25hbE51bWJlckxldHRlciA9IHJvdy5vcmllbnRhdGlvbmFsX251bWJlcl9sZXR0ZXI7XHJcbiAgfVxyXG4gIGlmIChyb3cuZGlzdHJpY3RfbmFtZSAhPT0gbnVsbCkge1xyXG4gICAgcG9pbnQuZGlzdHJpY3QgPSByb3cuZGlzdHJpY3RfbmFtZTtcclxuICB9XHJcbiAgaWYgKHJvdy5wcmFndWVfZGlzdHJpY3RfbmFtZSAhPT0gbnVsbCkge1xyXG4gICAgcG9pbnQucHJhZ3VlRGlzdHJpY3QgPSByb3cucHJhZ3VlX2Rpc3RyaWN0X25hbWU7XHJcbiAgfVxyXG4gIHBvaW50LmFkZHJlc3MgPSBjcmVhdGVTaW5nbGVMaW5lQWRkcmVzcyhwb2ludCk7XHJcbiAgcmV0dXJuIHBvaW50O1xyXG59O1xyXG4iXX0=
|
|
343
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkcmVzcy1wb2ludHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZGIvYWRkcmVzcy1wb2ludHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGdCQUFnQixFQUFFLHVCQUF1QixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFFLE9BQU8sRUFLTCxVQUFVLEVBR1Ysb0JBQW9CLEVBQ3BCLE9BQU8sRUFDUCxpQkFBaUIsR0FDbEIsTUFBTSwwQkFBMEIsQ0FBQztBQUNsQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNyRCxPQUFPLFVBQVUsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QyxPQUFPLEVBQ0wscUJBQXFCLEVBQ3JCLHNCQUFzQixFQUN0QixTQUFTLEVBQ1Qsa0JBQWtCLEVBQ2xCLE9BQU8sRUFDUCxRQUFRLEVBQ1IsY0FBYyxFQUNkLFFBQVEsR0FDVCxNQUFNLE1BQU0sQ0FBQztBQUNkLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNoRCxPQUFPLEVBQXlCLGdCQUFnQixFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRWxFLE1BQU0sZUFBZSxHQUFHLE1BQU0sQ0FBQztBQUMvQixNQUFNLGdCQUFnQixHQUFHLE9BQU8sQ0FBQztBQUVqQyxNQUFNLFdBQVcsR0FBRztJQUNsQixDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUM7SUFDcEIsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUM7Q0FDdEIsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLE1BQU0sR0FBRztJQUNwQixPQUFPLEVBQUUsQ0FBQztJQUNWLFFBQVEsRUFBRSxDQUFDO0lBQ1gsUUFBUSxFQUFFLENBQUM7SUFDWCxZQUFZLEVBQUUsQ0FBQztJQUNmLFlBQVksRUFBRSxDQUFDO0lBQ2Ysa0JBQWtCLEVBQUUsQ0FBQztJQUNyQixrQkFBa0IsRUFBRSxDQUFDO0lBQ3JCLG9CQUFvQixFQUFFLENBQUM7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LG9CQUFvQixLQUFLLElBQUksRUFBRTtRQUNyQyxLQUFLLENBQUMsY0FBYyxHQUFHLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQztLQUNqRDtJQUNELEtBQUssQ0FBQyxPQUFPLEdBQUcsdUJBQXVCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDL0MsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZGRyZXNzUG9pbnRUeXBlLCBjcmVhdGVTaW5nbGVMaW5lQWRkcmVzcyB9IGZyb20gXCJjemVjaC1hZGRyZXNzXCI7XHJcbmltcG9ydCB7XHJcbiAgQWRkcmVzc1BvaW50LFxyXG4gIEZ1bGxTdHJlZXROdW1iZXIsXHJcbiAgUmFuZ2VTcGVjLFxyXG4gIFNlcmllc1NwZWMsXHJcbiAgU2VyaWVzVHlwZSxcclxuICBTbWRFcnJvcixcclxuICBTbWRMaW5lLFxyXG4gIGlzTmVnYXRpdmVTZXJpZXNTcGVjLFxyXG4gIGlzUmFuZ2UsXHJcbiAgaXNTZXJpZXNTcGVjQXJyYXksXHJcbn0gZnJvbSBcIi4uL3N0cmVldC1tYXJrZG93bi90eXBlc1wiO1xyXG5pbXBvcnQgeyBmaW5kQ2xvc2VzdFN0cmluZyB9IGZyb20gXCIuLi91dGlscy9oZWxwZXJzXCI7XHJcbmltcG9ydCBqdHNrMndnczg0IGZyb20gXCIuLi91dGlscy9qdHNrMndnczg0XCI7XHJcbmltcG9ydCB7XHJcbiAgZXh0cmFjdEtleVZhbHVlc1BhaXJzLFxyXG4gIGdlbmVyYXRlMkRQbGFjZWhvbGRlcnMsXHJcbiAgZ2V0S25leERiLFxyXG4gIGluc2VydE11bHRpcGxlUm93cyxcclxuICBpc015c3FsLFxyXG4gIGlzU3FsaXRlLFxyXG4gIG5vbkVtcHR5T3JOdWxsLFxyXG4gIHJhd1F1ZXJ5LFxyXG59IGZyb20gXCIuL2RiXCI7XHJcbmltcG9ydCB7IGdldEZvdW5kZXJDaXR5Q29kZSB9IGZyb20gXCIuL2ZvdW5kZXJzXCI7XHJcbmltcG9ydCB7IEZvdW5kZXIsIE11bmljaXBhbGl0eSwgTXVuaWNpcGFsaXR5VHlwZSB9IGZyb20gXCIuL3R5cGVzXCI7XHJcblxyXG5jb25zdCBEZXNjcmlwdGl2ZVR5cGUgPSBcIsSNLnAuXCI7XHJcbmNvbnN0IFJlZ2lzdHJhdGlvblR5cGUgPSBcIsSNLmV2LlwiO1xyXG5cclxuY29uc3QgT2JqZWN0VHlwZXMgPSB7XHJcbiAgW0Rlc2NyaXB0aXZlVHlwZV06IDEsXHJcbiAgW1JlZ2lzdHJhdGlvblR5cGVdOiAyLFxyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IENvbHVtbiA9IHtcclxuICBhZG1Db2RlOiAwLFxyXG4gIGNpdHlDb2RlOiAxLFxyXG4gIGNpdHlOYW1lOiAyLFxyXG4gIGRpc3RyaWN0Q29kZTogMyxcclxuICBkaXN0cmljdE5hbWU6IDQsXHJcbiAgcHJhZ3VlRGlzdHJpY3RDb2RlOiA1LFxyXG4gIHByYWd1ZURpc3RyaWN0TmFtZTogNixcclxuICBtdW5pY2lwYWxpdHlQYXJ0Q29kZTogNyxcclxuICBtdW5pY2lwYWxpdHlQYXJ0TmFtZTogOCxcclxuICBzdHJlZXRDb2RlOiA5LFxyXG4gIHN0cmVldE5hbWU6IDEwLFxyXG4gIG9iamVjdFR5cGU6IDExLFxyXG4gIGhvdXNlTnVtYmVyOiAxMixcclxuICBvcmllbnRhdGlvbmFsTnVtYmVyOiAxMyxcclxuICBvcmllbnRhdGlvbmFsTnVtYmVyTGV0dGVyOiAxNCxcclxuICBwb3N0YWxDb2RlOiAxNSxcclxuICB5Q29vcmRpbmF0ZTogMTYsXHJcbiAgeENvb3JkaW5hdGU6IDE3LFxyXG4gIHZhbGlkRnJvbTogMTgsXHJcbn07XHJcblxyXG5jb25zdCBjb2x1bW5OYW1lcyA9IFtcclxuICBcImlkXCIsXHJcbiAgXCJzdHJlZXRfY29kZVwiLFxyXG4gIFwib2JqZWN0X3R5cGVfaWRcIixcclxuICBcImRlc2NyaXB0aXZlX251bWJlclwiLFxyXG4gIFwib3JpZW50YXRpb25hbF9udW1iZXJcIixcclxuICBcIm9yaWVudGF0aW9uYWxfbnVtYmVyX2xldHRlclwiLFxyXG4gIFwiY2l0eV9jb2RlXCIsXHJcbiAgXCJjaXR5X2Rpc3RyaWN0X2NvZGVcIixcclxuICBcIm11bmljaXBhbGl0eV9wYXJ0X2NvZGVcIixcclxuICBcInByYWd1ZV9kaXN0cmljdF9jb2RlXCIsXHJcbiAgXCJwb3N0YWxfY29kZVwiLFxyXG4gIFwianRza194XCIsXHJcbiAgXCJqdHNrX3lcIixcclxuICBcIndnczg0X2xhdGl0dWRlXCIsXHJcbiAgXCJ3Z3M4NF9sb25naXR1ZGVcIixcclxuXTtcclxuXHJcbmV4cG9ydCBjb25zdCBjb21taXRBZGRyZXNzUG9pbnRzID0gYXN5bmMgKFxyXG4gIGJ1ZmZlcjogc3RyaW5nW11bXVxyXG4pOiBQcm9taXNlPG51bWJlcj4gPT4ge1xyXG4gIGlmIChidWZmZXIubGVuZ3RoID09PSAwKSB7XHJcbiAgICByZXR1cm4gMDtcclxuICB9XHJcbiAgYXdhaXQgaW5zZXJ0Q2l0aWVzKGJ1ZmZlcik7XHJcbiAgYXdhaXQgaW5zZXJ0RGlzdHJpY3RzKGJ1ZmZlcik7XHJcbiAgYXdhaXQgaW5zZXJ0TXVuaWNpcGFsaXR5UGFydHMoYnVmZmVyKTtcclxuICBhd2FpdCBpbnNlcnRTdHJlZXRzKGJ1ZmZlcik7XHJcbiAgYXdhaXQgaW5zZXJ0UHJhZ3VlRGlzdHJpY3RzKGJ1ZmZlcik7XHJcblxyXG4gIGNvbnN0IHBhcmFtczogKHN0cmluZyB8IG51bGwpW10gPSBbXTtcclxuICBidWZmZXIuZm9yRWFjaCgoZGF0YSkgPT4ge1xyXG4gICAgbGV0IGxhdE9yTnVsbDogc3RyaW5nLCBsb25Pck51bGw6IHN0cmluZztcclxuICAgIGxhdE9yTnVsbCA9IG51bGw7XHJcbiAgICBsb25Pck51bGwgPSBudWxsO1xyXG4gICAgaWYgKGRhdGFbQ29sdW1uLnhDb29yZGluYXRlXSAmJiBkYXRhW0NvbHVtbi55Q29vcmRpbmF0ZV0pIHtcclxuICAgICAgY29uc3QgeyBsYXQsIGxvbiB9ID0ganRzazJ3Z3M4NChcclxuICAgICAgICBwYXJzZUZsb2F0KGRhdGFbQ29sdW1uLnhDb29yZGluYXRlXSksXHJcbiAgICAgICAgcGFyc2VGbG9hdChkYXRhW0NvbHVtbi55Q29vcmRpbmF0ZV0pXHJcbiAgICAgICk7XHJcbiAgICAgIFtsYXRPck51bGwsIGxvbk9yTnVsbF0gPSBbbGF0LnRvU3RyaW5nKCksIGxvbi50b1N0cmluZygpXTtcclxuICAgIH1cclxuICAgIHBhcmFtcy5wdXNoKFxyXG4gICAgICBkYXRhW0NvbHVtbi5hZG1Db2RlXSxcclxuICAgICAgbm9uRW1wdHlPck51bGwoZGF0YVtDb2x1bW4uc3RyZWV0Q29kZV0pLFxyXG4gICAgICBPYmplY3RUeXBlc1tkYXRhW0NvbHVtbi5vYmplY3RUeXBlXV0sXHJcbiAgICAgIG5vbkVtcHR5T3JOdWxsKGRhdGFbQ29sdW1uLmhvdXNlTnVtYmVyXSksXHJcbiAgICAgIG5vbkVtcHR5T3JOdWxsKGRhdGFbQ29sdW1uLm9yaWVudGF0aW9uYWxOdW1iZXJdKSxcclxuICAgICAgbm9uRW1wdHlPck51bGwoZGF0YVtDb2x1bW4ub3JpZW50YXRpb25hbE51bWJlckxldHRlcl0pLFxyXG4gICAgICBkYXRhW0NvbHVtbi5jaXR5Q29kZV0sXHJcbiAgICAgIG5vbkVtcHR5T3JOdWxsKGRhdGFbQ29sdW1uLmRpc3RyaWN0Q29kZV0pLFxyXG4gICAgICBub25FbXB0eU9yTnVsbChkYXRhW0NvbHVtbi5tdW5pY2lwYWxpdHlQYXJ0Q29kZV0pLFxyXG4gICAgICBub25FbXB0eU9yTnVsbChkYXRhW0NvbHVtbi5wcmFndWVEaXN0cmljdENvZGVdKSxcclxuICAgICAgZGF0YVtDb2x1bW4ucG9zdGFsQ29kZV0sXHJcbiAgICAgIG5vbkVtcHR5T3JOdWxsKGRhdGFbQ29sdW1uLnhDb29yZGluYXRlXSksXHJcbiAgICAgIG5vbkVtcHR5T3JOdWxsKGRhdGFbQ29sdW1uLnlDb29yZGluYXRlXSksXHJcbiAgICAgIGxhdE9yTnVsbCxcclxuICAgICAgbG9uT3JOdWxsXHJcbiAgICApO1xyXG4gIH0pO1xyXG5cclxuICBjb25zdCBwbGFjZUhvbGRlcnMgPSBnZW5lcmF0ZTJEUGxhY2Vob2xkZXJzKFxyXG4gICAgY29sdW1uTmFtZXMubGVuZ3RoLFxyXG4gICAgYnVmZmVyLmxlbmd0aFxyXG4gICk7XHJcblxyXG4gIGNvbnN0IGtuZXggPSBnZXRLbmV4RGIoKTtcclxuICBhd2FpdCByYXdRdWVyeShcclxuICAgIGBJTlNFUlQgJHtcclxuICAgICAgaXNNeXNxbChrbmV4KSA/IFwiSUdOT1JFXCIgOiBcIlwiXHJcbiAgICB9IElOVE8gYWRkcmVzc19wb2ludCAoJHtjb2x1bW5OYW1lcy5qb2luKFwiLFwiKX0pIFZBTFVFUyAke3BsYWNlSG9sZGVyc30gJHtcclxuICAgICAgIWlzTXlzcWwoa25leCkgPyBcIk9OIENPTkZMSUNUIChpZCkgRE8gTk9USElOR1wiIDogXCJcIlxyXG4gICAgfWAsXHJcbiAgICBwYXJhbXNcclxuICApO1xyXG5cclxuICByZXR1cm4gYnVmZmVyLmxlbmd0aDtcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBpbnNlcnRDaXRpZXMgPSBhc3luYyAoYnVmZmVyOiBzdHJpbmdbXVtdKTogUHJvbWlzZTxudW1iZXI+ID0+IHtcclxuICByZXR1cm4gYXdhaXQgaW5zZXJ0TXVsdGlwbGVSb3dzKFxyXG4gICAgZXh0cmFjdEtleVZhbHVlc1BhaXJzKGJ1ZmZlciwgQ29sdW1uLmNpdHlDb2RlLCBbQ29sdW1uLmNpdHlOYW1lXSksXHJcbiAgICBcImNpdHlcIixcclxuICAgIFtcImNvZGVcIiwgXCJuYW1lXCJdXHJcbiAgKTtcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBpbnNlcnREaXN0cmljdHMgPSBhc3luYyAoYnVmZmVyOiBzdHJpbmdbXVtdKTogUHJvbWlzZTxudW1iZXI+ID0+IHtcclxuICByZXR1cm4gYXdhaXQgaW5zZXJ0TXVsdGlwbGVSb3dzKFxyXG4gICAgZXh0cmFjdEtleVZhbHVlc1BhaXJzKGJ1ZmZlciwgQ29sdW1uLmRpc3RyaWN0Q29kZSwgW1xyXG4gICAgICBDb2x1bW4uY2l0eUNvZGUsXHJcbiAgICAgIENvbHVtbi5kaXN0cmljdE5hbWUsXHJcbiAgICBdKSxcclxuICAgIFwiY2l0eV9kaXN0cmljdFwiLFxyXG4gICAgW1wiY29kZVwiLCBcImNpdHlfY29kZVwiLCBcIm5hbWVcIl1cclxuICApO1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IGluc2VydE11bmljaXBhbGl0eVBhcnRzID0gYXN5bmMgKFxyXG4gIGJ1ZmZlcjogc3RyaW5nW11bXVxyXG4pOiBQcm9taXNlPG51bWJlcj4gPT4ge1xyXG4gIHJldHVybiBhd2FpdCBpbnNlcnRNdWx0aXBsZVJvd3MoXHJcbiAgICBleHRyYWN0S2V5VmFsdWVzUGFpcnMoYnVmZmVyLCBDb2x1bW4ubXVuaWNpcGFsaXR5UGFydENvZGUsIFtcclxuICAgICAgQ29sdW1uLm11bmljaXBhbGl0eVBhcnROYW1lLFxyXG4gICAgICBDb2x1bW4uY2l0eUNvZGUsXHJcbiAgICBdKSxcclxuICAgIFwibXVuaWNpcGFsaXR5X3BhcnRcIixcclxuICAgIFtcImNvZGVcIiwgXCJuYW1lXCIsIFwiY2l0eV9jb2RlXCJdXHJcbiAgKTtcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBpbnNlcnRQcmFndWVEaXN0cmljdHMgPSBhc3luYyAoXHJcbiAgYnVmZmVyOiBzdHJpbmdbXVtdXHJcbik6IFByb21pc2U8bnVtYmVyPiA9PiB7XHJcbiAgcmV0dXJuIGF3YWl0IGluc2VydE11bHRpcGxlUm93cyhcclxuICAgIGV4dHJhY3RLZXlWYWx1ZXNQYWlycyhidWZmZXIsIENvbHVtbi5wcmFndWVEaXN0cmljdENvZGUsIFtcclxuICAgICAgQ29sdW1uLnByYWd1ZURpc3RyaWN0TmFtZSxcclxuICAgIF0pLFxyXG4gICAgXCJwcmFndWVfZGlzdHJpY3RcIixcclxuICAgIFtcImNvZGVcIiwgXCJuYW1lXCJdXHJcbiAgKTtcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBpbnNlcnRTdHJlZXRzID0gYXN5bmMgKGJ1ZmZlcjogc3RyaW5nW11bXSk6IFByb21pc2U8bnVtYmVyPiA9PiB7XHJcbiAgcmV0dXJuIGF3YWl0IGluc2VydE11bHRpcGxlUm93cyhcclxuICAgIGV4dHJhY3RLZXlWYWx1ZXNQYWlycyhidWZmZXIsIENvbHVtbi5zdHJlZXRDb2RlLCBbXHJcbiAgICAgIENvbHVtbi5jaXR5Q29kZSxcclxuICAgICAgQ29sdW1uLnN0cmVldE5hbWUsXHJcbiAgICBdKSxcclxuICAgIFwic3RyZWV0XCIsXHJcbiAgICBbXCJjb2RlXCIsIFwiY2l0eV9jb2RlXCIsIFwibmFtZVwiXVxyXG4gICk7XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgYXJlQWRkcmVzc1BvaW50c1N5bmNlZCA9IGFzeW5jICgpOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcclxuICBjb25zdCByZXN1bHQgPSBhd2FpdCBnZXRLbmV4RGIoKVxyXG4gICAgLmNvdW50KFwiKlwiLCB7IGFzOiBcImNvdW50QWxsXCIgfSlcclxuICAgIC5mcm9tKFwiYWRkcmVzc19wb2ludFwiKVxyXG4gICAgLmZpcnN0KCk7XHJcbiAgcmV0dXJuIE51bWJlcihyZXN1bHQuY291bnRBbGwpID49IDI5MDAwMDA7IC8vIHRvdGFsIGlzIGFsbW9zdCAzIG1pbGxpb25cclxufTtcclxuXHJcbmNvbnN0IGFkZHJlc3NQb2ludFNlbGVjdCA9IGBcclxuICBTRUxFQ1QgYS5pZCwgcy5uYW1lIEFTIHN0cmVldF9uYW1lLCBvLm5hbWUgQVMgb2JqZWN0X3R5cGVfbmFtZSwgYS5kZXNjcmlwdGl2ZV9udW1iZXIsXHJcbiAgICAgICAgYS5vcmllbnRhdGlvbmFsX251bWJlciwgYS5vcmllbnRhdGlvbmFsX251bWJlcl9sZXR0ZXIsIGMubmFtZSBBUyBjaXR5X25hbWUsXHJcbiAgICAgICAgbS5uYW1lIEFTIG11bmljaXBhbGl0eV9wYXJ0X25hbWUsIHAubmFtZSBBUyBwcmFndWVfZGlzdHJpY3RfbmFtZSxcclxuICAgICAgICBkLm5hbWUgQVMgZGlzdHJpY3RfbmFtZSwgYS5wb3N0YWxfY29kZSwgYS53Z3M4NF9sYXRpdHVkZSwgYS53Z3M4NF9sb25naXR1ZGVcclxuICBGUk9NIGFkZHJlc3NfcG9pbnQgYVxyXG4gIExFRlQgSk9JTiBzdHJlZXQgcyBPTiBhLnN0cmVldF9jb2RlID0gcy5jb2RlXHJcbiAgSU5ORVIgSk9JTiBvYmplY3RfdHlwZSBvIE9OIG8uaWQgPSBhLm9iamVjdF90eXBlX2lkXHJcbiAgSU5ORVIgSk9JTiBjaXR5IGMgT04gYy5jb2RlID0gYS5jaXR5X2NvZGVcclxuICBMRUZUIEpPSU4gY2l0eV9kaXN0cmljdCBkIE9OIGEuY2l0eV9kaXN0cmljdF9jb2RlID0gZC5jb2RlXHJcbiAgTEVGVCBKT0lOIHByYWd1ZV9kaXN0cmljdCBwIE9OIGEucHJhZ3VlX2Rpc3RyaWN0X2NvZGUgPSBwLmNvZGVcclxuICBMRUZUIEpPSU4gbXVuaWNpcGFsaXR5X3BhcnQgbSBPTiBhLm11bmljaXBhbGl0eV9wYXJ0X2NvZGUgPSBtLmNvZGVgO1xyXG5cclxuZXhwb3J0IGNvbnN0IGdldEFkZHJlc3NQb2ludEJ5SWQgPSBhc3luYyAoXHJcbiAgYWRkcmVzc1BvaW50SWQ6IG51bWJlclxyXG4pOiBQcm9taXNlPEFkZHJlc3NQb2ludCB8IG51bGw+ID0+IHtcclxuICBjb25zdCByb3cgPSBhd2FpdCByYXdRdWVyeShcclxuICAgIGAke2FkZHJlc3NQb2ludFNlbGVjdH1cclxuICAgICAgV0hFUkUgYS5pZCA9ID9gLFxyXG4gICAgW2FkZHJlc3NQb2ludElkXVxyXG4gICk7XHJcbiAgaWYgKHJvdy5sZW5ndGggPT09IDApIHtcclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuICByZXR1cm4gcm93VG9BZGRyZXNzUG9pbnQocm93WzBdKTtcclxufTtcclxuXHJcbmxldCBsYXN0Rm91bmRlcjogRm91bmRlciB8IG51bGwgPSBudWxsO1xyXG5sZXQgYWxsU3RyZWV0czogc3RyaW5nW10gPSBbXTtcclxuXHJcbmV4cG9ydCBjb25zdCBjaGVja1N0cmVldEV4aXN0cyA9IGFzeW5jIChcclxuICBzdHJlZXROYW1lOiBzdHJpbmcsXHJcbiAgZm91bmRlcjogRm91bmRlclxyXG4pOiBQcm9taXNlPHsgZXhpc3RzOiBib29sZWFuOyBlcnJvcnM6IFNtZEVycm9yW10gfT4gPT4ge1xyXG4gIGNvbnN0IGtuZXggPSBnZXRLbmV4RGIoKTtcclxuICBjb25zdCBlcnJvcnM6IFNtZEVycm9yW10gPSBbXTtcclxuXHJcbiAgLy8gd2UgY2hlY2sgdGhlIHdob2xlIGNpdHlcclxuICBjb25zdCBjaXR5Q29kZSA9IGF3YWl0IGdldEZvdW5kZXJDaXR5Q29kZShmb3VuZGVyKTtcclxuICBjb25zdCByb3dMaXN0ID0gYXdhaXQgcmF3UXVlcnkoXHJcbiAgICBgU0VMRUNUIG5hbWUgQVMgc3RyZWV0X25hbWVcclxuICAgIEZST00gc3RyZWV0XHJcbiAgICBXSEVSRSBjaXR5X2NvZGUgPSA/IEFORCBuYW1lID0gPyAgJHtcclxuICAgICAgaXNTcWxpdGUoa25leCkgPyBcIkNPTExBVEUgTk9DQVNFXCIgOiBcIlwiXHJcbiAgICB9YCxcclxuICAgIFtjaXR5Q29kZSwgc3RyZWV0TmFtZV1cclxuICApO1xyXG5cclxuICBpZiAocm93TGlzdC5sZW5ndGggPiAwKSB7XHJcbiAgICBjb25zdCByb3cgPSByb3dMaXN0WzBdO1xyXG4gICAgaWYgKHJvdy5zdHJlZXRfbmFtZSAhPT0gc3RyZWV0TmFtZSkge1xyXG4gICAgICAvLyBlcnJvcnMucHVzaChcclxuICAgICAgLy8gICBgU3RyZWV0ICcke3N0cmVldE5hbWV9JyBoYXMgd3JvbmcgY2FzZSwgY29ycmVjdCBjYXNlOiAnJHtyb3cuc3RyZWV0X25hbWV9Jy5gXHJcbiAgICAgIC8vICk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4geyBleGlzdHM6IHRydWUsIGVycm9ycyB9O1xyXG4gIH1cclxuXHJcbiAgaWYgKGxhc3RGb3VuZGVyICE9PSBmb3VuZGVyKSB7XHJcbiAgICBhbGxTdHJlZXRzID0gYXdhaXQgZ2V0QWxsU3RyZWV0cyhjaXR5Q29kZSk7XHJcbiAgICBsYXN0Rm91bmRlciA9IGZvdW5kZXI7XHJcbiAgfVxyXG5cclxuICBjb25zdCBtYXRjaCA9IGFsbFN0cmVldHMuZmluZChcclxuICAgIChzKSA9PlxyXG4gICAgICBzLnRvTG9jYWxlTG93ZXJDYXNlKFwiY3MtQ1pcIikgPT09IHN0cmVldE5hbWUudG9Mb2NhbGVMb3dlckNhc2UoXCJjcy1DWlwiKVxyXG4gICk7XHJcbiAgbGV0IGV4aXN0cyA9IGZhbHNlO1xyXG4gIGlmIChtYXRjaCkge1xyXG4gICAgZXhpc3RzID0gdHJ1ZTtcclxuICAgIGlmIChzdHJlZXROYW1lICE9PSBtYXRjaCkge1xyXG4gICAgICAvLyBlcnJvcnMucHVzaChcclxuICAgICAgLy8gICBgU3RyZWV0ICcke3N0cmVldE5hbWV9JyBoYXMgd3JvbmcgY2FzZSwgY29ycmVjdCBjYXNlOiAnJHttYXRjaH0nLmBcclxuICAgICAgLy8gKTtcclxuICAgIH1cclxuICB9IGVsc2Uge1xyXG4gICAgY29uc3QgY2xvc2VzdCA9IGZpbmRDbG9zZXN0U3RyaW5nKHN0cmVldE5hbWUsIGFsbFN0cmVldHMpO1xyXG4gICAgZXJyb3JzLnB1c2goe1xyXG4gICAgICBtZXNzYWdlOiBgVWxpY2UgJyR7c3RyZWV0TmFtZX0nIHYgdMOpdG8gb2JjaSBuZWV4aXN0dWplLCBteXNsZWxpIGpzdGUgJyR7Y2xvc2VzdH0nP2AsXHJcbiAgICAgIHN0YXJ0T2Zmc2V0OiAwLFxyXG4gICAgICBlbmRPZmZzZXQ6IHN0cmVldE5hbWUubGVuZ3RoICsgMSxcclxuICAgIH0pO1xyXG4gIH1cclxuICByZXR1cm4geyBleGlzdHM6IGZhbHNlLCBlcnJvcnMgfTtcclxufTtcclxuXHJcbmNvbnN0IGdldEFsbFN0cmVldHMgPSBhc3luYyAoY2l0eUNvZGU6IG51bWJlcik6IFByb21pc2U8c3RyaW5nW10+ID0+IHtcclxuICBjb25zdCBrbmV4ID0gZ2V0S25leERiKCk7XHJcbiAgcmV0dXJuIGF3YWl0IGtuZXgucGx1Y2soXCJuYW1lXCIpLmZyb20oXCJzdHJlZXRcIikud2hlcmUoXCJjaXR5X2NvZGVcIiwgY2l0eUNvZGUpO1xyXG59O1xyXG5cclxuZXhwb3J0IHR5cGUgRmluZEFkZHJlc3NQb2ludHNQYXJhbXMgPVxyXG4gIHwge1xyXG4gICAgICB0eXBlOiBcInNtZExpbmVcIjtcclxuICAgICAgc21kTGluZTogU21kTGluZTtcclxuICAgICAgbXVuaWNpcGFsaXR5OiBNdW5pY2lwYWxpdHk7XHJcbiAgICAgIG11bmljaXBhbGl0eVBhcnRDb2RlPzogbnVtYmVyO1xyXG4gICAgfVxyXG4gIHwge1xyXG4gICAgICB0eXBlOiBcIndob2xlTXVuaWNpcGFsaXR5UGFydFwiO1xyXG4gICAgICBtdW5pY2lwYWxpdHlQYXJ0Q29kZTogbnVtYmVyO1xyXG4gICAgfVxyXG4gIHwge1xyXG4gICAgICB0eXBlOiBcIndob2xlTXVuaWNpcGFsaXR5XCI7XHJcbiAgICAgIG11bmljaXBhbGl0eTogTXVuaWNpcGFsaXR5O1xyXG4gICAgfVxyXG4gIHwge1xyXG4gICAgICB0eXBlOiBcIndob2xlTXVuaWNpcGFsaXR5Tm9TdHJlZXROYW1lXCI7XHJcbiAgICAgIG11bmljaXBhbGl0eTogTXVuaWNpcGFsaXR5O1xyXG4gICAgfTtcclxuXHJcbmV4cG9ydCBjb25zdCBmaW5kQWRkcmVzc1BvaW50cyA9IGFzeW5jIChcclxuICBwYXJhbXM6IEZpbmRBZGRyZXNzUG9pbnRzUGFyYW1zXHJcbik6IFByb21pc2U8QWRkcmVzc1BvaW50W10+ID0+IHtcclxuICBjb25zdCBxdWVyeVBhcmFtcyA9IGdldFF1ZXJ5UGFyYW1zKHBhcmFtcyk7XHJcbiAgY29uc3Qgc3RyZWV0Sm9pbkNvbmRpdGlvbiA9IGdldFN0cmVldEpvaW5Db25kaXRpb24ocGFyYW1zKTtcclxuXHJcbiAgY29uc3Qgd2hlcmVDb25kaXRpb24gPSBnZXRXaGVyZUNvbmRpdGlvbihwYXJhbXMpO1xyXG5cclxuICBjb25zdCBxdWVyeVJlc3VsdCA9IGF3YWl0IHJhd1F1ZXJ5KFxyXG4gICAgYFNFTEVDVCBhLmlkLCBzLm5hbWUgQVMgc3RyZWV0X25hbWUsIG8ubmFtZSBBUyBvYmplY3RfdHlwZV9uYW1lLCBhLmRlc2NyaXB0aXZlX251bWJlcixcclxuICAgICAgYS5vcmllbnRhdGlvbmFsX251bWJlciwgYS5vcmllbnRhdGlvbmFsX251bWJlcl9sZXR0ZXIsIGMubmFtZSBBUyBjaXR5X25hbWUsXHJcbiAgICAgIGQubmFtZSBBUyBkaXN0cmljdF9uYW1lLCBtLm5hbWUgQVMgbXVuaWNpcGFsaXR5X3BhcnRfbmFtZSwgcC5uYW1lIEFTIHByYWd1ZV9kaXN0cmljdF9uYW1lLFxyXG4gICAgICBhLnBvc3RhbF9jb2RlLCBhLndnczg0X2xhdGl0dWRlLCBhLndnczg0X2xvbmdpdHVkZVxyXG4gICAgRlJPTSBhZGRyZXNzX3BvaW50IGFcclxuICAgICR7c3RyZWV0Sm9pbkNvbmRpdGlvbn1cclxuICAgIElOTkVSIEpPSU4gb2JqZWN0X3R5cGUgbyBPTiBvLmlkID0gYS5vYmplY3RfdHlwZV9pZFxyXG4gICAgSU5ORVIgSk9JTiBjaXR5IGMgT04gYy5jb2RlID0gYS5jaXR5X2NvZGVcclxuICAgIExFRlQgSk9JTiBjaXR5X2Rpc3RyaWN0IGQgT04gYS5jaXR5X2Rpc3RyaWN0X2NvZGUgPSBkLmNvZGVcclxuICAgIExFRlQgSk9JTiBtdW5pY2lwYWxpdHlfcGFydCBtIE9OIGEubXVuaWNpcGFsaXR5X3BhcnRfY29kZSA9IG0uY29kZVxyXG4gICAgTEVGVCBKT0lOIHByYWd1ZV9kaXN0cmljdCBwIE9OIGEucHJhZ3VlX2Rpc3RyaWN0X2NvZGUgPSBwLmNvZGVcclxuICAgIFdIRVJFICR7d2hlcmVDb25kaXRpb259YCxcclxuICAgIHF1ZXJ5UGFyYW1zXHJcbiAgKTtcclxuXHJcbiAgcmV0dXJuIGZpbHRlckFkZHJlc3NQb2ludHMocXVlcnlSZXN1bHQubWFwKHJvd1RvQWRkcmVzc1BvaW50KSwgcGFyYW1zKTtcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBmaWx0ZXJBZGRyZXNzUG9pbnRzID0gKFxyXG4gIGFkZHJlc3NQb2ludHM6IEFkZHJlc3NQb2ludFtdLFxyXG4gIHBhcmFtczogRmluZEFkZHJlc3NQb2ludHNQYXJhbXNcclxuKTogQWRkcmVzc1BvaW50W10gPT4ge1xyXG4gIGlmIChcclxuICAgIHBhcmFtcy50eXBlID09PSBcIndob2xlTXVuaWNpcGFsaXR5XCIgfHxcclxuICAgIHBhcmFtcy50eXBlID09PSBcIndob2xlTXVuaWNpcGFsaXR5Tm9TdHJlZXROYW1lXCIgfHxcclxuICAgIHBhcmFtcy50eXBlID09PSBcIndob2xlTXVuaWNpcGFsaXR5UGFydFwiXHJcbiAgKSB7XHJcbiAgICByZXR1cm4gYWRkcmVzc1BvaW50cztcclxuICB9XHJcblxyXG4gIGNvbnN0IHJlc3VsdDogQWRkcmVzc1BvaW50W10gPSBbXTtcclxuICBjb25zdCBudW1iZXJTcGVjID0gcGFyYW1zLnNtZExpbmUubnVtYmVyU3BlYztcclxuICBpZiAoaXNTZXJpZXNTcGVjQXJyYXkobnVtYmVyU3BlYykpIHtcclxuICAgIG51bWJlclNwZWMuZm9yRWFjaCgoc2VyaWVzU3BlYykgPT4ge1xyXG4gICAgICByZXN1bHQucHVzaCguLi5maWx0ZXJBZGRyZXNzUG9pbnRzQnlSYW5nZXMoYWRkcmVzc1BvaW50cywgc2VyaWVzU3BlYykpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gd2hlbiBubyBudW1iZXIgc3BlY3MgYXJlIHByZXNlbnQsIHdlIHRha2UgZXZlcnl0aGluZ1xyXG4gICAgaWYgKG51bWJlclNwZWMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHJlc3VsdC5wdXNoKC4uLmFkZHJlc3NQb2ludHMpO1xyXG4gICAgfVxyXG4gIH0gZWxzZSBpZiAoaXNOZWdhdGl2ZVNlcmllc1NwZWMobnVtYmVyU3BlYykpIHtcclxuICAgIC8vIG5lZ2F0aXZlIG51bWJlciBzcGVjIChlLmcuIG9kZCBudW1iZXJzIGV4Y2VwdCAxMy0xNylcclxuICAgIGNvbnN0IHRvRXhjbHVkZSA9IGZpbHRlckFkZHJlc3NQb2ludHNCeVJhbmdlcyhhZGRyZXNzUG9pbnRzLCBudW1iZXJTcGVjKTtcclxuICAgIHJlc3VsdC5wdXNoKFxyXG4gICAgICAuLi5hZGRyZXNzUG9pbnRzLmZpbHRlcihcclxuICAgICAgICAoYWRkcmVzc1BvaW50KSA9PiAhdG9FeGNsdWRlLmluY2x1ZGVzKGFkZHJlc3NQb2ludClcclxuICAgICAgKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHJldHVybiByZXN1bHQ7XHJcbn07XHJcblxyXG5jb25zdCBmaWx0ZXJBZGRyZXNzUG9pbnRzQnlSYW5nZXMgPSAoXHJcbiAgYWRkcmVzc1BvaW50czogQWRkcmVzc1BvaW50W10sXHJcbiAgc2VyaWVzU3BlYzogU2VyaWVzU3BlY1xyXG4pOiBBZGRyZXNzUG9pbnRbXSA9PiB7XHJcbiAgY29uc3QgcmVzdWx0OiBBZGRyZXNzUG9pbnRbXSA9IFtdO1xyXG4gIHNlcmllc1NwZWMucmFuZ2VzLmZvckVhY2goKHJhbmdlKSA9PiB7XHJcbiAgICByZXN1bHQucHVzaChcclxuICAgICAgLi4uYWRkcmVzc1BvaW50cy5maWx0ZXIoKGFkZHJlc3NQb2ludCkgPT4ge1xyXG4gICAgICAgIGlmIChpc1JhbmdlKHJhbmdlKSkge1xyXG4gICAgICAgICAgY29uc3QgbnVtYmVyID0gZ2V0TnVtYmVyQnlUeXBlKHNlcmllc1NwZWMudHlwZSwgYWRkcmVzc1BvaW50KTtcclxuICAgICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgIGlzSW5SYW5nZShcclxuICAgICAgICAgICAgICBudW1iZXIsXHJcbiAgICAgICAgICAgICAgc2VyaWVzU3BlYy50eXBlICE9PSBTZXJpZXNUeXBlLkRlc2NyaXB0aW9uXHJcbiAgICAgICAgICAgICAgICA/IGFkZHJlc3NQb2ludC5vcmllbnRhdGlvbmFsTnVtYmVyTGV0dGVyID8/IG51bGxcclxuICAgICAgICAgICAgICAgIDogbnVsbCxcclxuICAgICAgICAgICAgICByYW5nZVxyXG4gICAgICAgICAgICApICYmIGZpdHNUeXBlKG51bWJlciwgc2VyaWVzU3BlYy50eXBlKVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgY29uc3QgZnVsbFN0cmVldE51bWJlcjogRnVsbFN0cmVldE51bWJlciA9IHJhbmdlO1xyXG4gICAgICAgICAgcmV0dXJuIGVxdWFsc0Z1bGxTdHJlZXROdW1iZXIoZnVsbFN0cmVldE51bWJlciwgYWRkcmVzc1BvaW50KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH0pO1xyXG5cclxuICAvLyB3aGVuIG5vIHNlcmllcyBzcGVjcyBhcmUgcHJlc2VudCwgd2UgdGFrZSBldmVyeXRoaW5nIHRoYXQgZml0cyB0aGUgdHlwZVxyXG4gIGlmIChzZXJpZXNTcGVjLnJhbmdlcy5sZW5ndGggPT09IDApIHtcclxuICAgIHJlc3VsdC5wdXNoKFxyXG4gICAgICAuLi5hZGRyZXNzUG9pbnRzLmZpbHRlcigoYWRkcmVzc1BvaW50KSA9PlxyXG4gICAgICAgIGZpdHNUeXBlKFxyXG4gICAgICAgICAgZ2V0TnVtYmVyQnlUeXBlKHNlcmllc1NwZWMudHlwZSwgYWRkcmVzc1BvaW50KSxcclxuICAgICAgICAgIHNlcmllc1NwZWMudHlwZVxyXG4gICAgICAgIClcclxuICAgICAgKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHJldHVybiByZXN1bHQ7XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgZ2V0UXVlcnlQYXJhbXMgPSAoXHJcbiAgcGFyYW1zOiBGaW5kQWRkcmVzc1BvaW50c1BhcmFtc1xyXG4pOiAoc3RyaW5nIHwgbnVtYmVyKVtdID0+IHtcclxuICBpZiAocGFyYW1zLnR5cGUgPT09IFwic21kTGluZVwiICYmIHBhcmFtcy5zbWRMaW5lLnR5cGUgPT09IFwic3RyZWV0XCIpIHtcclxuICAgIHJldHVybiBbcGFyYW1zLnNtZExpbmUuc3RyZWV0LCBwYXJhbXMubXVuaWNpcGFsaXR5LmNvZGVdO1xyXG4gIH1cclxuXHJcbiAgaWYgKFxyXG4gICAgKHBhcmFtcy50eXBlID09PSBcInNtZExpbmVcIiAmJiBwYXJhbXMuc21kTGluZS50eXBlID09PSBcIm11bmljaXBhbGl0eVBhcnRcIikgfHxcclxuICAgIHBhcmFtcy50eXBlID09PSBcIndob2xlTXVuaWNpcGFsaXR5UGFydFwiXHJcbiAgKSB7XHJcbiAgICByZXR1cm4gW3BhcmFtcy5tdW5pY2lwYWxpdHlQYXJ0Q29kZV07XHJcbiAgfVxyXG5cclxuICByZXR1cm4gW3BhcmFtcy5tdW5pY2lwYWxpdHkuY29kZV07XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgZ2V0U3RyZWV0Sm9pbkNvbmRpdGlvbiA9IChcclxuICBwYXJhbXM6IEZpbmRBZGRyZXNzUG9pbnRzUGFyYW1zXHJcbik6IHN0cmluZyA9PiB7XHJcbiAgaWYgKHBhcmFtcy50eXBlID09PSBcInNtZExpbmVcIiAmJiBwYXJhbXMuc21kTGluZS50eXBlID09PSBcInN0cmVldFwiKSB7XHJcbiAgICByZXR1cm4gYEpPSU4gc3RyZWV0IHMgT04gYS5zdHJlZXRfY29kZSA9IHMuY29kZSBBTkQgcy5uYW1lID0gPyAke1xyXG4gICAgICBpc1NxbGl0ZShnZXRLbmV4RGIoKSkgPyBcIkNPTExBVEUgTk9DQVNFXCIgOiBcIlwiXHJcbiAgICB9YDtcclxuICB9XHJcbiAgcmV0dXJuIFwiTEVGVCBKT0lOIHN0cmVldCBzIE9OIGEuc3RyZWV0X2NvZGUgPSBzLmNvZGVcIjtcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBnZXRXaGVyZUNvbmRpdGlvbiA9IChwYXJhbXM6IEZpbmRBZGRyZXNzUG9pbnRzUGFyYW1zKTogc3RyaW5nID0+IHtcclxuICBpZiAoXHJcbiAgICAocGFyYW1zLnR5cGUgPT09IFwic21kTGluZVwiICYmIHBhcmFtcy5zbWRMaW5lLnR5cGUgPT09IFwibXVuaWNpcGFsaXR5UGFydFwiKSB8fFxyXG4gICAgcGFyYW1zLnR5cGUgPT09IFwid2hvbGVNdW5pY2lwYWxpdHlQYXJ0XCJcclxuICApIHtcclxuICAgIHJldHVybiBcImEubXVuaWNpcGFsaXR5X3BhcnRfY29kZSA9ID9cIjtcclxuICB9XHJcblxyXG4gIGlmIChwYXJhbXMudHlwZSA9PT0gXCJ3aG9sZU11bmljaXBhbGl0eU5vU3RyZWV0TmFtZVwiKSB7XHJcbiAgICByZXR1cm4gYCR7Z2V0TXVuaWNpcGFsaXR5V2hlcmUoXHJcbiAgICAgIFwiYVwiLFxyXG4gICAgICBwYXJhbXMubXVuaWNpcGFsaXR5XHJcbiAgICApfSBBTkQgYS5zdHJlZXRfY29kZSBJUyBOVUxMYDtcclxuICB9XHJcblxyXG4gIHJldHVybiBnZXRNdW5pY2lwYWxpdHlXaGVyZShcImFcIiwgcGFyYW1zLm11bmljaXBhbGl0eSk7XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgaXNJblJhbmdlID0gKFxyXG4gIG51bWJlcjogbnVtYmVyIHwgbnVsbCxcclxuICBsZXR0ZXI6IHN0cmluZyB8IG51bGwsXHJcbiAgcmFuZ2U6IFJhbmdlU3BlY1xyXG4pOiBib29sZWFuID0+IHtcclxuICBpZiAobnVtYmVyID09PSBudWxsKSB7XHJcbiAgICByZXR1cm4gIXJhbmdlLmZyb20gJiYgIXJhbmdlLnRvO1xyXG4gIH1cclxuXHJcbiAgLy8gZXhwbGFpbmVyOiBlaXRoZXIgdGhlIGxvd2VyIGJvdW5kIGlzIG5vdCBzZXQsIG9yIGl0IGlzIGxvd2VyIHRoYW4gdGhlIG51bWJlclxyXG4gIC8vIGlmIGl0J3MgZXF1YWwgdG8gdGhlIG51bWJlciwgd2UgYWxzbyBoYXZlIHRvIGNoZWNrIHRoZSBsZXR0ZXIgLSBpZiBpdCdzIG5vdCBzZXQsIHdlIGRvbid0IGNhcmVcclxuICAvLyBpZiBmcm9tLmxldHRlciBpcyBzZXQsIHdlIG5lZWQgdG8gaGF2ZSBhIGxldHRlciBzZXQgYW5kIGl0IGhhcyB0byBiZSBncmVhdGVyIG9yIGVxdWFsOlxyXG4gIC8vIG51bWJlciB3aXRob3V0IGxldHRlciBjb3VudHMgbG93ZXIgdGhhbiBudW1iZXIgd2l0aCBsZXR0ZXIgJ2EnIChlLmcuIDIzIDwgMjNhKVxyXG4gIGNvbnN0IHNhdGlzZmllc0Zyb20gPVxyXG4gICAgIXJhbmdlLmZyb20gfHxcclxuICAgIG51bWJlciA+IHJhbmdlLmZyb20ubnVtYmVyIHx8XHJcbiAgICAobnVtYmVyID09PSByYW5nZS5mcm9tLm51bWJlciAmJlxyXG4gICAgICAoIXJhbmdlLmZyb20ubGV0dGVyIHx8ICghIWxldHRlciAmJiBsZXR0ZXIgPj0gcmFuZ2UuZnJvbS5sZXR0ZXIpKSk7XHJcblxyXG4gIGNvbnN0IHNhdGlzZmllc1RvID1cclxuICAgICFyYW5nZS50byB8fFxyXG4gICAgbnVtYmVyIDwgcmFuZ2UudG8ubnVtYmVyIHx8XHJcbiAgICAobnVtYmVyID09PSByYW5nZS50by5udW1iZXIgJiZcclxuICAgICAgKCFsZXR0ZXIgfHxcclxuICAgICAgICAoISFyYW5nZS50by5sZXR0ZXIgJiYgISFsZXR0ZXIgJiYgbGV0dGVyIDw9IHJhbmdlLnRvLmxldHRlcikpKTtcclxuXHJcbiAgcmV0dXJuIHNhdGlzZmllc0Zyb20gJiYgc2F0aXNmaWVzVG87XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgZml0c1R5cGUgPSAobnVtYmVyOiBudW1iZXIgfCBudWxsLCB0eXBlOiBTZXJpZXNUeXBlKTogYm9vbGVhbiA9PiB7XHJcbiAgcmV0dXJuIChcclxuICAgIHR5cGUgPT09IFNlcmllc1R5cGUuRGVzY3JpcHRpb24gfHxcclxuICAgIHR5cGUgPT09IFNlcmllc1R5cGUuQWxsIHx8XHJcbiAgICAodHlwZSA9PT0gU2VyaWVzVHlwZS5PZGQgJiYgbnVtYmVyICUgMiA9PT0gMSkgfHxcclxuICAgICh0eXBlID09PSBTZXJpZXNUeXBlLkV2ZW4gJiYgbnVtYmVyICUgMiA9PT0gMClcclxuICApO1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IGVxdWFsc0Z1bGxTdHJlZXROdW1iZXIgPSAoXHJcbiAgZnVsbFN0cmVldE51bWJlcjogRnVsbFN0cmVldE51bWJlcixcclxuICBhZGRyZXNzUG9pbnQ6IEFkZHJlc3NQb2ludFxyXG4pOiBib29sZWFuID0+IHtcclxuICByZXR1cm4gKFxyXG4gICAgZnVsbFN0cmVldE51bWJlci5kZXNjcmlwdGlvbk51bWJlci5udW1iZXIgPT09IGFkZHJlc3NQb2ludC5ob3VzZU51bWJlciAmJlxyXG4gICAgZnVsbFN0cmVldE51bWJlci5vcmllbnRhdGlvbmFsTnVtYmVyLm51bWJlciA9PT1cclxuICAgICAgYWRkcmVzc1BvaW50Lm9yaWVudGF0aW9uYWxOdW1iZXIgJiZcclxuICAgICgoIWZ1bGxTdHJlZXROdW1iZXIub3JpZW50YXRpb25hbE51bWJlci5sZXR0ZXIgJiZcclxuICAgICAgIWFkZHJlc3NQb2ludC5vcmllbnRhdGlvbmFsTnVtYmVyTGV0dGVyKSB8fFxyXG4gICAgICBmdWxsU3RyZWV0TnVtYmVyLm9yaWVudGF0aW9uYWxOdW1iZXIubGV0dGVyID09PVxyXG4gICAgICAgIGFkZHJlc3NQb2ludC5vcmllbnRhdGlvbmFsTnVtYmVyTGV0dGVyKVxyXG4gICk7XHJcbn07XHJcblxyXG5jb25zdCBnZXROdW1iZXJCeVR5cGUgPSAoXHJcbiAgdHlwZTogU2VyaWVzVHlwZSxcclxuICBhZGRyZXNzUG9pbnQ6IEFkZHJlc3NQb2ludFxyXG4pOiBudW1iZXIgfCBudWxsID0+IHtcclxuICByZXR1cm4gdHlwZSA9PT0gU2VyaWVzVHlwZS5EZXNjcmlwdGlvblxyXG4gICAgPyBhZGRyZXNzUG9pbnQuaG91c2VOdW1iZXJcclxuICAgIDogYWRkcmVzc1BvaW50Lm9yaWVudGF0aW9uYWxOdW1iZXIgPz8gbnVsbDtcclxufTtcclxuXHJcbmNvbnN0IGdldE11bmljaXBhbGl0eVdoZXJlID0gKFxyXG4gIGFsaWFzOiBzdHJpbmcsXHJcbiAgbXVuaWNpcGFsaXR5OiBNdW5pY2lwYWxpdHlcclxuKTogc3RyaW5nID0+IHtcclxuICByZXR1cm4gbXVuaWNpcGFsaXR5LnR5cGUgPT09IE11bmljaXBhbGl0eVR5cGUuQ2l0eVxyXG4gICAgPyBgJHthbGlhc30uY2l0eV9jb2RlID0gP2BcclxuICAgIDogYCR7YWxpYXN9LmNpdHlfZGlzdHJpY3RfY29kZSA9ID9gO1xyXG59O1xyXG5cclxuY29uc3Qgcm93VG9BZGRyZXNzUG9pbnQgPSAocm93OiBhbnkpOiBBZGRyZXNzUG9pbnQgPT4ge1xyXG4gIGNvbnN0IHBvaW50OiBBZGRyZXNzUG9pbnQgPSB7XHJcbiAgICBpZDogcm93LmlkLFxyXG4gICAgYWRkcmVzczogXCJcIixcclxuICAgIHR5cGU6XHJcbiAgICAgIHJvdy5vYmplY3RfdHlwZV9uYW1lID09PSBEZXNjcmlwdGl2ZVR5cGVcclxuICAgICAgICA/IEFkZHJlc3NQb2ludFR5cGUuRGVzY3JpcHRpb25cclxuICAgICAgICA6IEFkZHJlc3NQb2ludFR5cGUuUmVnaXN0cmF0aW9uLFxyXG4gICAgaG91c2VOdW1iZXI6IHJvdy5kZXNjcmlwdGl2ZV9udW1iZXIsXHJcbiAgICBjaXR5OiByb3cuY2l0eV9uYW1lLFxyXG4gICAgbXVuaWNpcGFsaXR5UGFydDogcm93Lm11bmljaXBhbGl0eV9wYXJ0X25hbWUsXHJcbiAgICBwb3N0YWxDb2RlOiByb3cucG9zdGFsX2NvZGUsXHJcbiAgICBsYXQ6IHJvdy53Z3M4NF9sYXRpdHVkZSxcclxuICAgIGxuZzogcm93Lndnczg0X2xvbmdpdHVkZSxcclxuICB9O1xyXG4gIGlmIChyb3cuc3RyZWV0X25hbWUgIT09IG51bGwpIHtcclxuICAgIHBvaW50LnN0cmVldCA9IHJvdy5zdHJlZXRfbmFtZTtcclxuICB9XHJcbiAgaWYgKHJvdy5vcmllbnRhdGlvbmFsX251bWJlciAhPT0gbnVsbCkge1xyXG4gICAgcG9pbnQub3JpZW50YXRpb25hbE51bWJlciA9IHJvdy5vcmllbnRhdGlvbmFsX251bWJlcjtcclxuICB9XHJcbiAgaWYgKHJvdy5vcmllbnRhdGlvbmFsX251bWJlcl9sZXR0ZXIgIT09IG51bGwpIHtcclxuICAgIHBvaW50Lm9yaWVudGF0aW9uYWxOdW1iZXJMZXR0ZXIgPSByb3cub3JpZW50YXRpb25hbF9udW1iZXJfbGV0dGVyO1xyXG4gIH1cclxuICBpZiAocm93LmRpc3RyaWN0X25hbWUgIT09IG51bGwpIHtcclxuICAgIHBvaW50LmRpc3RyaWN0ID0gcm93LmRpc3RyaWN0X25hbWU7XHJcbiAgfVxyXG4gIGlmIChyb3cucHJhZ3VlX2Rpc3RyaWN0X25hbWUgIT09IG51bGwpIHtcclxuICAgIHBvaW50LnByYWd1ZURpc3RyaWN0ID0gcm93LnByYWd1ZV9kaXN0cmljdF9uYW1lO1xyXG4gIH1cclxuICBwb2ludC5hZGRyZXNzID0gY3JlYXRlU2luZ2xlTGluZUFkZHJlc3MocG9pbnQpO1xyXG4gIHJldHVybiBwb2ludDtcclxufTtcclxuIl19
|
package/dist/db/cities.js
CHANGED
|
@@ -1,12 +1,3 @@
|
|
|
1
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
-
});
|
|
9
|
-
};
|
|
10
1
|
import chunk from "lodash/chunk";
|
|
11
2
|
import { extractKeyValuesPairs, getKnexDb, insertMultipleRows, rawQuery, } from "./db";
|
|
12
3
|
const citiesColumn = {
|
|
@@ -20,11 +11,11 @@ const citiesColumn = {
|
|
|
20
11
|
latitude: 7,
|
|
21
12
|
longitude: 8,
|
|
22
13
|
};
|
|
23
|
-
export const insertCityPositions = (data) =>
|
|
14
|
+
export const insertCityPositions = async (data) => {
|
|
24
15
|
let changes = 0;
|
|
25
16
|
// cities are most likely already inserted, but in case they're not,
|
|
26
17
|
// we need to insert them before updating them with region data
|
|
27
|
-
changes +=
|
|
18
|
+
changes += await insertCities(data);
|
|
28
19
|
const prev = changes;
|
|
29
20
|
for (const arrayChunk of chunk(data, 1000)) {
|
|
30
21
|
const queries = [];
|
|
@@ -35,30 +26,33 @@ export const insertCityPositions = (data) => __awaiter(void 0, void 0, void 0, f
|
|
|
35
26
|
row[citiesColumn.cityCode],
|
|
36
27
|
]));
|
|
37
28
|
}
|
|
38
|
-
|
|
29
|
+
await Promise.all(queries);
|
|
39
30
|
changes += queries.length;
|
|
40
31
|
console.log(`Done ${changes - prev} / ${data.length} rows...`);
|
|
41
32
|
}
|
|
42
33
|
return changes;
|
|
43
|
-
}
|
|
44
|
-
export const insertCities = (buffer) =>
|
|
45
|
-
return
|
|
34
|
+
};
|
|
35
|
+
export const insertCities = async (buffer) => {
|
|
36
|
+
return await insertMultipleRows(extractKeyValuesPairs(buffer, citiesColumn.cityCode, [
|
|
46
37
|
citiesColumn.cityName,
|
|
47
38
|
]), "city", ["code", "name"]);
|
|
48
|
-
}
|
|
49
|
-
export const setCityPolygonGeojson = (code, polygon, districtsPolygon) =>
|
|
50
|
-
|
|
39
|
+
};
|
|
40
|
+
export const setCityPolygonGeojson = async (code, polygon, districtsPolygon) => {
|
|
41
|
+
await getKnexDb()
|
|
51
42
|
.from("city")
|
|
52
|
-
.update(
|
|
53
|
-
|
|
54
|
-
|
|
43
|
+
.update({
|
|
44
|
+
polygon_geojson: JSON.stringify(polygon),
|
|
45
|
+
...(districtsPolygon
|
|
46
|
+
? { districts_polygon_geojson: JSON.stringify(districtsPolygon) }
|
|
47
|
+
: {}),
|
|
48
|
+
})
|
|
55
49
|
.where({ code });
|
|
56
|
-
}
|
|
57
|
-
export const getCityPolygons = (cityCodes) =>
|
|
50
|
+
};
|
|
51
|
+
export const getCityPolygons = async (cityCodes) => {
|
|
58
52
|
if (cityCodes.size === 0) {
|
|
59
53
|
return {};
|
|
60
54
|
}
|
|
61
|
-
const cityRows =
|
|
55
|
+
const cityRows = await getKnexDb()
|
|
62
56
|
.from("city")
|
|
63
57
|
.select("code", "polygon_geojson")
|
|
64
58
|
.whereIn("code", Array.from(cityCodes));
|
|
@@ -66,17 +60,17 @@ export const getCityPolygons = (cityCodes) => __awaiter(void 0, void 0, void 0,
|
|
|
66
60
|
acc[row.code] = JSON.parse(row.polygon_geojson);
|
|
67
61
|
return acc;
|
|
68
62
|
}, {});
|
|
69
|
-
}
|
|
70
|
-
export const getDistrictPolygons = (districtCodes) =>
|
|
63
|
+
};
|
|
64
|
+
export const getDistrictPolygons = async (districtCodes) => {
|
|
71
65
|
if (districtCodes.size === 0) {
|
|
72
66
|
return {};
|
|
73
67
|
}
|
|
74
|
-
const cityCodes = (
|
|
68
|
+
const cityCodes = (await getKnexDb()
|
|
75
69
|
.from("city_district")
|
|
76
70
|
.select("city_code")
|
|
77
71
|
.whereIn("code", Array.from(districtCodes))
|
|
78
72
|
.groupBy("city_code")).map((row) => row.city_code);
|
|
79
|
-
const cityRows =
|
|
73
|
+
const cityRows = await getKnexDb()
|
|
80
74
|
.from("city")
|
|
81
75
|
.select("code", "districts_polygon_geojson")
|
|
82
76
|
.whereIn("code", cityCodes);
|
|
@@ -89,7 +83,7 @@ export const getDistrictPolygons = (districtCodes) => __awaiter(void 0, void 0,
|
|
|
89
83
|
districtPolygons[feature.properties.KOD] = {
|
|
90
84
|
type: "FeatureCollection",
|
|
91
85
|
features: [
|
|
92
|
-
|
|
86
|
+
{ ...feature, properties: { code: feature.properties.KOD } },
|
|
93
87
|
],
|
|
94
88
|
};
|
|
95
89
|
}
|
|
@@ -97,5 +91,5 @@ export const getDistrictPolygons = (districtCodes) => __awaiter(void 0, void 0,
|
|
|
97
91
|
}
|
|
98
92
|
}
|
|
99
93
|
return districtPolygons;
|
|
100
|
-
}
|
|
101
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
94
|
+
};
|
|
95
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2l0aWVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RiL2NpdGllcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssTUFBTSxjQUFjLENBQUM7QUFDakMsT0FBTyxFQUNMLHFCQUFxQixFQUNyQixTQUFTLEVBQ1Qsa0JBQWtCLEVBQ2xCLFFBQVEsR0FDVCxNQUFNLE1BQU0sQ0FBQztBQUlkLE1BQU0sWUFBWSxHQUFHO0lBQ25CLFFBQVEsRUFBRSxDQUFDO0lBQ1gsUUFBUSxFQUFFLENBQUM7SUFDWCxVQUFVLEVBQUUsQ0FBQztJQUNiLFVBQVUsRUFBRSxDQUFDO0lBQ2IsVUFBVSxFQUFFLENBQUM7SUFDYixVQUFVLEVBQUUsQ0FBQztJQUNiLFVBQVUsRUFBRSxDQUFDO0lBQ2IsUUFBUSxFQUFFLENBQUM7SUFDWCxTQUFTLEVBQUUsQ0FBQztDQUNiLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxLQUFLLEVBQ3RDLElBQWdCLEVBQ0MsRUFBRTtJQUNuQixJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUM7SUFFaEIsb0VBQW9FO0lBQ3BFLCtEQUErRDtJQUMvRCxPQUFPLElBQUksTUFBTSxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDcEMsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDO0lBRXJCLEtBQUssTUFBTSxVQUFVLElBQUksS0FBSyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRTtRQUMxQyxNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDbkIsS0FBSyxNQUFNLEdBQUcsSUFBSSxVQUFVLEVBQUU7WUFDNUIsT0FBTyxDQUFDLElBQUksQ0FDVixRQUFRLENBQ04sd0VBQXdFLEVBQ3hFO2dCQUNFLEdBQUcsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDO2dCQUMxQixHQUFHLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQztnQkFDM0IsR0FBRyxDQUFDLFlBQVksQ0FBQyxRQUFR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MkJBQTJCLENBQUM7U0FDM0MsT0FBTyxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQztJQUU5QixNQUFNLGdCQUFnQixHQUFvQixFQUFFLENBQUM7SUFDN0MsS0FBSyxNQUFNLEdBQUcsSUFBSSxRQUFRLEVBQUU7UUFDMUIsSUFBSSxHQUFHLENBQUMseUJBQXlCLEVBQUU7WUFDakMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FDekIsR0FBRyxDQUFDLHlCQUF5QixDQUNlLENBQUM7WUFDL0MsS0FBSyxNQUFNLE9BQU8sSUFBSSxRQUFRLENBQUMsUUFBUSxFQUFFO2dCQUN2QyxJQUFJLGFBQWEsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTtvQkFDckQsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsR0FBRzt3QkFDekMsSUFBSSxFQUFFLG1CQUFtQjt3QkFDekIsUUFBUSxFQUFFOzRCQUNSLEVBQUUsR0FBRyxPQUFPLEVBQUUsVUFBVSxFQUFFLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLEVBQUU7eUJBQzdEO3FCQUNGLENBQUM7aUJBQ0g7YUFDRjtTQUNGO0tBQ0Y7SUFFRCxPQUFPLGdCQUFnQixDQUFDO0FBQzFCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjaHVuayBmcm9tIFwibG9kYXNoL2NodW5rXCI7XHJcbmltcG9ydCB7XHJcbiAgZXh0cmFjdEtleVZhbHVlc1BhaXJzLFxyXG4gIGdldEtuZXhEYixcclxuICBpbnNlcnRNdWx0aXBsZVJvd3MsXHJcbiAgcmF3UXVlcnksXHJcbn0gZnJvbSBcIi4vZGJcIjtcclxuaW1wb3J0IHsgRmVhdHVyZUNvbGxlY3Rpb24sIE11bHRpUG9seWdvbiwgUG9seWdvbiB9IGZyb20gXCJAdHVyZi9oZWxwZXJzXCI7XHJcbmltcG9ydCB7IFBvbHlnb25zQnlDb2RlcyB9IGZyb20gXCIuL3R5cGVzXCI7XHJcblxyXG5jb25zdCBjaXRpZXNDb2x1bW4gPSB7XHJcbiAgY2l0eU5hbWU6IDAsXHJcbiAgY2l0eUNvZGU6IDEsXHJcbiAgY291bnR5TmFtZTogMixcclxuICBjb3VudHlDb2RlOiAzLFxyXG4gIHJlZ2lvbk5hbWU6IDQsXHJcbiAgcmVnaW9uQ29kZTogNSxcclxuICBwb3N0YWxDb2RlOiA2LFxyXG4gIGxhdGl0dWRlOiA3LFxyXG4gIGxvbmdpdHVkZTogOCxcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBpbnNlcnRDaXR5UG9zaXRpb25zID0gYXN5bmMgKFxyXG4gIGRhdGE6IHN0cmluZ1tdW11cclxuKTogUHJvbWlzZTxudW1iZXI+ID0+IHtcclxuICBsZXQgY2hhbmdlcyA9IDA7XHJcblxyXG4gIC8vIGNpdGllcyBhcmUgbW9zdCBsaWtlbHkgYWxyZWFkeSBpbnNlcnRlZCwgYnV0IGluIGNhc2UgdGhleSdyZSBub3QsXHJcbiAgLy8gd2UgbmVlZCB0byBpbnNlcnQgdGhlbSBiZWZvcmUgdXBkYXRpbmcgdGhlbSB3aXRoIHJlZ2lvbiBkYXRhXHJcbiAgY2hhbmdlcyArPSBhd2FpdCBpbnNlcnRDaXRpZXMoZGF0YSk7XHJcbiAgY29uc3QgcHJldiA9IGNoYW5nZXM7XHJcblxyXG4gIGZvciAoY29uc3QgYXJyYXlDaHVuayBvZiBjaHVuayhkYXRhLCAxMDAwKSkge1xyXG4gICAgY29uc3QgcXVlcmllcyA9IFtdO1xyXG4gICAgZm9yIChjb25zdCByb3cgb2YgYXJyYXlDaHVuaykge1xyXG4gICAgICBxdWVyaWVzLnB1c2goXHJcbiAgICAgICAgcmF3UXVlcnkoXHJcbiAgICAgICAgICBgVVBEQVRFIGNpdHkgU0VUIHdnczg0X2xhdGl0dWRlID0gPywgd2dzODRfbG9uZ2l0dWRlID0gPyBXSEVSRSBjb2RlID0gP2AsXHJcbiAgICAgICAgICBbXHJcbiAgICAgICAgICAgIHJvd1tjaXRpZXNDb2x1bW4ubGF0aXR1ZGVdLFxyXG4gICAgICAgICAgICByb3dbY2l0aWVzQ29sdW1uLmxvbmdpdHVkZV0sXHJcbiAgICAgICAgICAgIHJvd1tjaXRpZXNDb2x1bW4uY2l0eUNvZGVdLFxyXG4gICAgICAgICAgXVxyXG4gICAgICAgIClcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIGF3YWl0IFByb21pc2UuYWxsKHF1ZXJpZXMpO1xyXG4gICAgY2hhbmdlcyArPSBxdWVyaWVzLmxlbmd0aDtcclxuICAgIGNvbnNvbGUubG9nKGBEb25lICR7Y2hhbmdlcyAtIHByZXZ9IC8gJHtkYXRhLmxlbmd0aH0gcm93cy4uLmApO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGNoYW5nZXM7XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgaW5zZXJ0Q2l0aWVzID0gYXN5bmMgKGJ1ZmZlcjogc3RyaW5nW11bXSk6IFByb21pc2U8bnVtYmVyPiA9PiB7XHJcbiAgcmV0dXJuIGF3YWl0IGluc2VydE11bHRpcGxlUm93cyhcclxuICAgIGV4dHJhY3RLZXlWYWx1ZXNQYWlycyhidWZmZXIsIGNpdGllc0NvbHVtbi5jaXR5Q29kZSwgW1xyXG4gICAgICBjaXRpZXNDb2x1bW4uY2l0eU5hbWUsXHJcbiAgICBdKSxcclxuICAgIFwiY2l0eVwiLFxyXG4gICAgW1wiY29kZVwiLCBcIm5hbWVcIl1cclxuICApO1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IHNldENpdHlQb2x5Z29uR2VvanNvbiA9IGFzeW5jIChcclxuICBjb2RlOiBzdHJpbmcsXHJcbiAgcG9seWdvbjogRmVhdHVyZUNvbGxlY3Rpb24sXHJcbiAgZGlzdHJpY3RzUG9seWdvbj86IEZlYXR1cmVDb2xsZWN0aW9uXHJcbik6IFByb21pc2U8dm9pZD4gPT4ge1xyXG4gIGF3YWl0IGdldEtuZXhEYigpXHJcbiAgICAuZnJvbShcImNpdHlcIilcclxuICAgIC51cGRhdGUoe1xyXG4gICAgICBwb2x5Z29uX2dlb2pzb246IEpTT04uc3RyaW5naWZ5KHBvbHlnb24pLFxyXG4gICAgICAuLi4oZGlzdHJpY3RzUG9seWdvblxyXG4gICAgICAgID8geyBkaXN0cmljdHNfcG9seWdvbl9nZW9qc29uOiBKU09OLnN0cmluZ2lmeShkaXN0cmljdHNQb2x5Z29uKSB9XHJcbiAgICAgICAgOiB7fSksXHJcbiAgICB9KVxyXG4gICAgLndoZXJlKHsgY29kZSB9KTtcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBnZXRDaXR5UG9seWdvbnMgPSBhc3luYyAoXHJcbiAgY2l0eUNvZGVzOiBTZXQ8bnVtYmVyPlxyXG4pOiBQcm9taXNlPFBvbHlnb25zQnlDb2Rlcz4gPT4ge1xyXG4gIGlmIChjaXR5Q29kZXMuc2l6ZSA9PT0gMCkge1xyXG4gICAgcmV0dXJuIHt9O1xyXG4gIH1cclxuICBjb25zdCBjaXR5Um93cyA9IGF3YWl0IGdldEtuZXhEYigpXHJcbiAgICAuZnJvbShcImNpdHlcIilcclxuICAgIC5zZWxlY3QoXCJjb2RlXCIsIFwicG9seWdvbl9nZW9qc29uXCIpXHJcbiAgICAud2hlcmVJbihcImNvZGVcIiwgQXJyYXkuZnJvbShjaXR5Q29kZXMpKTtcclxuXHJcbiAgcmV0dXJuIGNpdHlSb3dzLnJlZHVjZSgoYWNjLCByb3cpID0+IHtcclxuICAgIGFjY1tyb3cuY29kZV0gPSBKU09OLnBhcnNlKHJvdy5wb2x5Z29uX2dlb2pzb24pO1xyXG4gICAgcmV0dXJuIGFjYztcclxuICB9LCB7fSk7XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgZ2V0RGlzdHJpY3RQb2x5Z29ucyA9IGFzeW5jIChcclxuICBkaXN0cmljdENvZGVzOiBTZXQ8bnVtYmVyPlxyXG4pOiBQcm9taXNlPFBvbHlnb25zQnlDb2Rlcz4gPT4ge1xyXG4gIGlmIChkaXN0cmljdENvZGVzLnNpemUgPT09IDApIHtcclxuICAgIHJldHVybiB7fTtcclxuICB9XHJcbiAgY29uc3QgY2l0eUNvZGVzID0gKFxyXG4gICAgYXdhaXQgZ2V0S25leERiKClcclxuICAgICAgLmZyb20oXCJjaXR5X2Rpc3RyaWN0XCIpXHJcbiAgICAgIC5zZWxlY3QoXCJjaXR5X2NvZGVcIilcclxuICAgICAgLndoZXJlSW4oXCJjb2RlXCIsIEFycmF5LmZyb20oZGlzdHJpY3RDb2RlcykpXHJcbiAgICAgIC5ncm91cEJ5KFwiY2l0eV9jb2RlXCIpXHJcbiAgKS5tYXAoKHJvdykgPT4gcm93LmNpdHlfY29kZSk7XHJcblxyXG4gIGNvbnN0IGNpdHlSb3dzID0gYXdhaXQgZ2V0S25leERiKClcclxuICAgIC5mcm9tKFwiY2l0eVwiKVxyXG4gICAgLnNlbGVjdChcImNvZGVcIiwgXCJkaXN0cmljdHNfcG9seWdvbl9nZW9qc29uXCIpXHJcbiAgICAud2hlcmVJbihcImNvZGVcIiwgY2l0eUNvZGVzKTtcclxuXHJcbiAgY29uc3QgZGlzdHJpY3RQb2x5Z29uczogUG9seWdvbnNCeUNvZGVzID0ge307XHJcbiAgZm9yIChjb25zdCByb3cgb2YgY2l0eVJvd3MpIHtcclxuICAgIGlmIChyb3cuZGlzdHJpY3RzX3BvbHlnb25fZ2VvanNvbikge1xyXG4gICAgICBjb25zdCBwb2x5Z29ucyA9IEpTT04ucGFyc2UoXHJcbiAgICAgICAgcm93LmRpc3RyaWN0c19wb2x5Z29uX2dlb2pzb25cclxuICAgICAgKSBhcyBGZWF0dXJlQ29sbGVjdGlvbjxQb2x5Z29uIHwgTXVsdGlQb2x5Z29uPjtcclxuICAgICAgZm9yIChjb25zdCBmZWF0dXJlIG9mIHBvbHlnb25zLmZlYXR1cmVzKSB7XHJcbiAgICAgICAgaWYgKGRpc3RyaWN0Q29kZXMuaGFzKE51bWJlcihmZWF0dXJlLnByb3BlcnRpZXMuS09EKSkpIHtcclxuICAgICAgICAgIGRpc3RyaWN0UG9seWdvbnNbZmVhdHVyZS5wcm9wZXJ0aWVzLktPRF0gPSB7XHJcbiAgICAgICAgICAgIHR5cGU6IFwiRmVhdHVyZUNvbGxlY3Rpb25cIixcclxuICAgICAgICAgICAgZmVhdHVyZXM6IFtcclxuICAgICAgICAgICAgICB7IC4uLmZlYXR1cmUsIHByb3BlcnRpZXM6IHsgY29kZTogZmVhdHVyZS5wcm9wZXJ0aWVzLktPRCB9IH0sXHJcbiAgICAgICAgICAgIF0sXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGRpc3RyaWN0UG9seWdvbnM7XHJcbn07XHJcbiJdfQ==
|