bx-rest 1.5.0 → 1.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +177 -0
- package/README.en.md +116 -5
- package/README.md +117 -5
- package/esm2022/functions/errors.mjs +17 -5
- package/esm2022/functions/mapResult.mjs +4 -2
- package/esm2022/functions/uniqueElementCode.mjs +24 -0
- package/esm2022/map/disk.mjs +13 -0
- package/esm2022/map/im/recent.mjs +1 -9
- package/esm2022/map/task.mjs +11 -5
- package/esm2022/map/tasks/task.mjs +3 -3
- package/esm2022/map/tasks.mjs +4 -3
- package/esm2022/map/user.mjs +5 -4
- package/esm2022/public-api.mjs +2 -2
- package/esm2022/request-navvy/bizproc.mjs +19 -10
- package/esm2022/request-navvy/calendar/event.mjs +1 -9
- package/esm2022/request-navvy/disk/operation.mjs +3 -10
- package/esm2022/request-navvy/pull/config.mjs +1 -3
- package/esm2022/request-navvy/socialnetwork/api/livefeed.mjs +1 -5
- package/esm2022/request-navvy/task/operation/elapseditem.mjs +14 -71
- package/esm2022/request-navvy/tasks/task.mjs +1 -119
- package/esm2022/rest/map.mjs +3 -3
- package/esm2022/rest/navvy.mjs +66 -64
- package/esm2022/services/base.mjs +7 -7
- package/esm2022/services/context.mjs +59 -0
- package/esm2022/services/http/HttpBX.mjs +55 -20
- package/esm2022/services/http/authRefresh.mjs +25 -23
- package/esm2022/services/http/http.mjs +14 -69
- package/esm2022/services/http/middleware.mjs +149 -0
- package/esm2022/services/http/sessionKey.mjs +16 -5
- package/esm2022/services/http/transport.mjs +5 -0
- package/esm2022/services/navvy/extends/navvy-pag-base.mjs +63 -9
- package/esm2022/services/navvy/navvy-alternative-pagination-navigation.mjs +21 -71
- package/esm2022/services/navvy/navvy-pag-nav-result-key-object.mjs +10 -49
- package/esm2022/services/navvy/navvy-pag-nav-result-key.mjs +14 -73
- package/esm2022/services/navvy/navvy-pag-nav-tasks.mjs +4 -76
- package/esm2022/services/navvy/navvy-pag-nav-with-useless-key.mjs +10 -76
- package/esm2022/services/navvy/navvy-pag.mjs +7 -65
- package/esm2022/services/navvy/navvy-support.mjs +2 -15
- package/esm2022/services/navvy.mjs +18 -31
- package/esm2022/typification/rest/calendar/event/get.mjs +1 -1
- package/esm2022/typification/rest/settings.mjs +1 -1
- package/esm2022/typification/rest/tasks/task/get.mjs +1 -1
- package/esm2022/typification/rest/user/user.mjs +1 -1
- package/esm2022/typification/settings.mjs +1 -1
- package/fesm2022/bx-rest.mjs +860 -2038
- package/fesm2022/bx-rest.mjs.map +1 -1
- package/functions/errors.d.ts +9 -0
- package/functions/uniqueElementCode.d.ts +12 -0
- package/map/disk.d.ts +10 -0
- package/map/task.d.ts +3 -3
- package/map/tasks/task.d.ts +1 -1
- package/map/tasks.d.ts +1 -1
- package/package.json +5 -2
- package/public-api.d.ts +7 -3
- package/request-navvy/pull/config.d.ts +0 -2
- package/rest/map.d.ts +2 -2
- package/rest/navvy.d.ts +9 -0
- package/services/context.d.ts +43 -0
- package/services/http/HttpBX.d.ts +10 -0
- package/services/http/authRefresh.d.ts +5 -1
- package/services/http/http.d.ts +12 -9
- package/services/http/middleware.d.ts +31 -0
- package/services/http/sessionKey.d.ts +10 -0
- package/services/http/transport.d.ts +28 -0
- package/services/navvy/extends/navvy-pag-base.d.ts +16 -2
- package/services/navvy/navvy-alternative-pagination-navigation.d.ts +5 -2
- package/services/navvy/navvy-pag-nav-result-key-object.d.ts +0 -2
- package/services/navvy/navvy-pag-nav-result-key.d.ts +1 -4
- package/services/navvy/navvy-pag-nav-tasks.d.ts +2 -9
- package/services/navvy/navvy-pag-nav-with-useless-key.d.ts +0 -2
- package/services/navvy/navvy-pag.d.ts +0 -2
- package/services/navvy/navvy-support.d.ts +0 -10
- package/services/navvy.d.ts +1 -0
- package/typification/rest/calendar/event/get.d.ts +1 -1
- package/typification/rest/settings.d.ts +1 -0
- package/typification/rest/user/user.d.ts +3 -3
- package/typification/settings.d.ts +34 -0
- package/esm2022/functions/errorHandler.mjs +0 -34
- package/esm2022/request/app.mjs +0 -13
- package/esm2022/request/bizproc/activity.mjs +0 -3
- package/esm2022/request/bizproc/event.mjs +0 -3
- package/esm2022/request/bizproc/robot.mjs +0 -3
- package/esm2022/request/bizproc/task.mjs +0 -3
- package/esm2022/request/bizproc/workflow/instance.mjs +0 -3
- package/esm2022/request/bizproc/workflow/template.mjs +0 -3
- package/esm2022/request/bizproc/workflow.mjs +0 -18
- package/esm2022/request/bizproc.mjs +0 -15
- package/esm2022/request/department.mjs +0 -26
- package/esm2022/request/disk/attachedObject.mjs +0 -14
- package/esm2022/request/disk/file.mjs +0 -18
- package/esm2022/request/disk/folder.mjs +0 -117
- package/esm2022/request/disk.mjs +0 -11
- package/esm2022/request/lists/element.mjs +0 -18
- package/esm2022/request/lists/field.mjs +0 -35
- package/esm2022/request/lists.mjs +0 -86
- package/esm2022/request/log/blogcomment.mjs +0 -3
- package/esm2022/request/log/blogpost.mjs +0 -18
- package/esm2022/request/log.mjs +0 -9
- package/esm2022/request/pull/application/config.mjs +0 -11
- package/esm2022/request/pull/channel/public.mjs +0 -18
- package/esm2022/request/pull/config.mjs +0 -13
- package/esm2022/request/pull.mjs +0 -11
- package/esm2022/request/server.mjs +0 -14
- package/esm2022/request/socialnetwork/api/contentview.mjs +0 -14
- package/esm2022/request/socialnetwork/api/livefeed/blogpost/important.mjs +0 -14
- package/esm2022/request/socialnetwork/api/livefeed/blogpost.mjs +0 -7
- package/esm2022/request/socialnetwork/api/livefeed.mjs +0 -7
- package/esm2022/request/socialnetwork/api.mjs +0 -9
- package/esm2022/request/socialnetwork.mjs +0 -8
- package/esm2022/request/sonet_group.mjs +0 -24
- package/esm2022/request/task/commentitem.mjs +0 -32
- package/esm2022/request/task/elapseditem.mjs +0 -40
- package/esm2022/request/task/item/userfield.mjs +0 -14
- package/esm2022/request/task/item.mjs +0 -7
- package/esm2022/request/task/planner.mjs +0 -11
- package/esm2022/request/task.mjs +0 -13
- package/esm2022/request/tasks/task/result.mjs +0 -22
- package/esm2022/request/tasks/task.mjs +0 -110
- package/esm2022/request/tasks.mjs +0 -7
- package/esm2022/request/user/userfield.mjs +0 -14
- package/esm2022/request/user.mjs +0 -40
- package/esm2022/rest/base.mjs +0 -39
- package/esm2022/services/http/HttpData.mjs +0 -77
- package/esm2022/services/http/base/base.mjs +0 -4
- package/esm2022/services/http/httpNavvy.mjs +0 -14
- package/esm2022/typification/base/answers.mjs +0 -438
- package/esm2022/typification/base/params.mjs +0 -525
- package/esm2022/typification/base/workpiece/methods-list.mjs +0 -2
- package/esm2022/typification/base/workpiece/methods.mjs +0 -2
- package/functions/errorHandler.d.ts +0 -10
- package/request/app.d.ts +0 -8
- package/request/bizproc/activity.d.ts +0 -2
- package/request/bizproc/event.d.ts +0 -2
- package/request/bizproc/robot.d.ts +0 -2
- package/request/bizproc/task.d.ts +0 -2
- package/request/bizproc/workflow/instance.d.ts +0 -2
- package/request/bizproc/workflow/template.d.ts +0 -2
- package/request/bizproc/workflow.d.ts +0 -13
- package/request/bizproc.d.ts +0 -12
- package/request/department.d.ts +0 -18
- package/request/disk/attachedObject.d.ts +0 -8
- package/request/disk/file.d.ts +0 -10
- package/request/disk/folder.d.ts +0 -96
- package/request/disk.d.ts +0 -8
- package/request/lists/element.d.ts +0 -11
- package/request/lists/field.d.ts +0 -11
- package/request/lists.d.ts +0 -31
- package/request/log/blogcomment.d.ts +0 -2
- package/request/log/blogpost.d.ts +0 -11
- package/request/log.d.ts +0 -6
- package/request/pull/application/config.d.ts +0 -5
- package/request/pull/channel/public.d.ts +0 -5
- package/request/pull/config.d.ts +0 -7
- package/request/pull.d.ts +0 -8
- package/request/server.d.ts +0 -7
- package/request/socialnetwork/api/contentview.d.ts +0 -6
- package/request/socialnetwork/api/livefeed/blogpost/important.d.ts +0 -6
- package/request/socialnetwork/api/livefeed/blogpost.d.ts +0 -4
- package/request/socialnetwork/api/livefeed.d.ts +0 -4
- package/request/socialnetwork/api.d.ts +0 -6
- package/request/socialnetwork.d.ts +0 -4
- package/request/sonet_group.d.ts +0 -8
- package/request/task/commentitem.d.ts +0 -23
- package/request/task/elapseditem.d.ts +0 -26
- package/request/task/item/userfield.d.ts +0 -6
- package/request/task/item.d.ts +0 -4
- package/request/task/planner.d.ts +0 -4
- package/request/task.d.ts +0 -10
- package/request/tasks/task/result.d.ts +0 -13
- package/request/tasks/task.d.ts +0 -37
- package/request/tasks.d.ts +0 -4
- package/request/user/userfield.d.ts +0 -8
- package/request/user.d.ts +0 -24
- package/rest/base.d.ts +0 -33
- package/services/http/HttpData.d.ts +0 -7
- package/services/http/base/base.d.ts +0 -7
- package/services/http/httpNavvy.d.ts +0 -10
- package/typification/base/answers.d.ts +0 -12
- package/typification/base/params.d.ts +0 -16
- package/typification/base/workpiece/methods-list.d.ts +0 -247
- package/typification/base/workpiece/methods.d.ts +0 -20
|
@@ -145,8 +145,12 @@ function parseDateWithFormat(val, format) {
|
|
|
145
145
|
if (month < 1 || month > 12 || day < 1 || day > 31 || hour > 23 || minute > 59 || second > 59) {
|
|
146
146
|
return null;
|
|
147
147
|
}
|
|
148
|
+
return buildDate(year, month, day, hour, minute, second);
|
|
149
|
+
}
|
|
150
|
+
/** Собирает дату, отбрасывая несуществующие дни месяца: new Date() превратил бы 31 февраля в 3 марта. */
|
|
151
|
+
function buildDate(year, month, day, hour, minute, second) {
|
|
148
152
|
const date = new Date(year, month - 1, day, hour, minute, second);
|
|
149
|
-
return isNaN(date.getTime()) ? null : date;
|
|
153
|
+
return (isNaN(date.getTime()) || date.getMonth() !== month - 1 || date.getDate() !== day) ? null : date;
|
|
150
154
|
}
|
|
151
155
|
/**
|
|
152
156
|
* Последний резервный разбор — без знания конкретного формата. Работает только для чисто
|
|
@@ -189,8 +193,7 @@ function parseDateHeuristically(val) {
|
|
|
189
193
|
if (hour > 23 || minute > 59 || second > 59) {
|
|
190
194
|
return null;
|
|
191
195
|
}
|
|
192
|
-
|
|
193
|
-
return isNaN(date.getTime()) ? null : date;
|
|
196
|
+
return buildDate(year, month, day, hour, minute, second);
|
|
194
197
|
}
|
|
195
198
|
/**
|
|
196
199
|
* Преобразует значение в дату.
|
|
@@ -340,9 +343,6 @@ export async function getBase64FileLikeStr(file) {
|
|
|
340
343
|
return undefined;
|
|
341
344
|
}
|
|
342
345
|
export function prepareBaseAddress(url, add = '') {
|
|
343
|
-
// if (url.search('https://') !== 0 && url.search('http://')) {
|
|
344
|
-
// url = 'https://' + url
|
|
345
|
-
// }
|
|
346
346
|
if (add && add.length > 0) {
|
|
347
347
|
if (url.lastIndexOf('/') !== (url.length - 1)) {
|
|
348
348
|
url = url + '/';
|
|
@@ -354,4 +354,4 @@ export function prepareBaseAddress(url, add = '') {
|
|
|
354
354
|
}
|
|
355
355
|
return url;
|
|
356
356
|
}
|
|
357
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2J4LXJlc3Qvc3JjL3NlcnZpY2VzL2Jhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFBO0FBRXREOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLEtBQUssQ0FBQyxHQUFRLEVBQUUsVUFBVSxHQUFHLEtBQUs7SUFDaEQsSUFBSSxHQUFHLEtBQUssSUFBSSxJQUFJLEdBQUcsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUN0QyxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQ2YsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQkFBa0IsR0FBRyxnQ0FBZ0MsQ0FBQyxDQUFBO1FBQ3hFLENBQUM7UUFDRCxPQUFPLEVBQUUsQ0FBQTtJQUNYLENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQTtBQUNwQixDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsS0FBSyxDQUFDLEdBQVEsRUFBRSxVQUFVLEdBQUcsSUFBSSxFQUFFLFFBQVEsR0FBRyxDQUFDO0lBQzdELE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUUxQixJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQ2xCLE1BQU0sS0FBSyxHQUFHLElBQUksVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBRWpDLElBQUksVUFBVTtZQUFFLE1BQU0sS0FBSyxDQUFBO1FBRTNCLGtEQUFrRDtRQUNsRCxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFBO1FBQy9CLE9BQU8sUUFBUSxDQUFBO0lBQ2pCLENBQUM7SUFFRCxPQUFPLE1BQU0sQ0FBQTtBQUNmLENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sT0FBTyxVQUFXLFNBQVEsS0FBSztJQUNuQyxZQUE0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RSxLQUFLLENBQUMsQ0FBQyxDQUFDO1NBQ2QsQ0FBQTtJQUNILENBQUM7SUFDRCxPQUFPLFNBQVMsQ0FBQTtBQUNsQixDQUFDO0FBRUQsTUFBTSxVQUFVLGtCQUFrQixDQUFDLEdBQVcsRUFBRSxNQUEwQixFQUFFO0lBQzFFLCtEQUErRDtJQUMvRCwyQkFBMkI7SUFDM0IsSUFBSTtJQUVKLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDMUIsSUFBSSxHQUFHLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQzlDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFBO1FBQ2pCLENBQUM7UUFFRCxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQTtJQUNqQixDQUFDO0lBRUQsSUFBSSxHQUFHLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzlDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFBO0lBQ2pCLENBQUM7SUFFRCxPQUFPLEdBQUcsQ0FBQTtBQUNaLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0b0xvY2FsQXRvbSB9IGZyb20gJy4uL2Z1bmN0aW9ucy90b0xvY2FsQXRvbSdcclxuXHJcbi8qKlxyXG4gKiDQn9GA0LXQvtCx0YDQsNC30YPQtdGCINC30L3QsNGH0LXQvdC40LUg0LIg0YHRgtGA0L7QutGDXHJcbiAqXHJcbiAqIEBwYXJhbSB2YWxcclxuICogQHBhcmFtIHRocm93RXJyb3JcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiB0b1N0cih2YWw6IGFueSwgdGhyb3dFcnJvciA9IGZhbHNlKTogc3RyaW5nIHtcclxuICBpZiAodmFsID09PSBudWxsIHx8IHZhbCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICBpZiAodGhyb3dFcnJvcikge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdmFsdWU6ICR7dmFsfSBjYW5ub3QgYmUgY29udmVydGVkIHRvIHN0cmluZ2ApXHJcbiAgICB9XHJcbiAgICByZXR1cm4gJydcclxuICB9XHJcbiAgcmV0dXJuIFN0cmluZyh2YWwpXHJcbn1cclxuXHJcbi8qKlxyXG4gKiDQn9GA0LXQvtCx0YDQsNC30YPQtdGCINC30L3QsNGH0LXQvdC40LUg0LIg0YfQuNGB0LvQvlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHRvTnVtKHZhbDogYW55LCB0aHJvd0Vycm9yID0gdHJ1ZSwgZGVmVmFsdWUgPSAwKTogbnVtYmVyIHtcclxuICBjb25zdCByZXN1bHQgPSBOdW1iZXIodmFsKVxyXG5cclxuICBpZiAoaXNOYU4ocmVzdWx0KSkge1xyXG4gICAgY29uc3QgZXJyb3IgPSBuZXcgVG9OdW1FcnJvcih2YWwpXHJcblxyXG4gICAgaWYgKHRocm93RXJyb3IpIHRocm93IGVycm9yXHJcblxyXG4gICAgLy8g0JXRgdC70Lgg0L7RiNC40LHQutCwINC90LUg0L/RgNC+0LHRgNCw0YHRi9Cy0LDQtdGC0YHRjyDigJQg0L/RgNC+0YHRgtC+INC70L7Qs9C40YDRg9C10LxcclxuICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IudG9TdHJpbmcoKSlcclxuICAgIHJldHVybiBkZWZWYWx1ZVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHJlc3VsdFxyXG59XHJcblxyXG4vKipcclxuICog0JrQsNGB0YLQvtC80L3Ri9C5INGC0LjQvyDQvtGI0LjQsdC60Lgg0LTQu9GPINGH0LjRgdC70L7QstGL0YUg0L/RgNC10L7QsdGA0LDQt9C+0LLQsNC90LjQuVxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFRvTnVtRXJyb3IgZXh0ZW5kcyBFcnJvciB7XHJcbiAgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IHZhbHVlOiBhbnkpIHtcclxuICAgIGNvbnN0IHZhbHVlVHlwZSA9IHR5cGVvZiB2YWx1ZVxyXG4gICAgY29uc3QgZm9ybWF0dGVkVmFsdWUgPVxyXG4gICAgICB2YWx1ZVR5cGUgPT09ICdvYmplY3QnID8gSlNPTi5zdHJpbmdpZnkodmFsdWUpIDogU3RyaW5nKHZhbHVlKVxyXG4gICAgY29uc3QgbWVzc2FnZSA9IGBJbnZhbGlkIHZhbHVlIHBhc3NlZCB0byB0b051bSgpOiAke2Zvcm1hdHRlZFZhbHVlfSAodHlwZTogJHt2YWx1ZVR5cGV9KWBcclxuICAgIHN1cGVyKG1lc3NhZ2UpXHJcbiAgICB0aGlzLm5hbWUgPSAnVG9OdW1FcnJvcidcclxuXHJcbiAgICAvLyDRgdC+0YXRgNCw0L3Rj9C10Lwg0YHRgtC10Log0LLRi9C30L7QstCwICjQvtGC0YTQuNC70YzRgtGA0L7QstCw0LIg0YHQsNC8INC60L7QvdGB0YLRgNGD0LrRgtC+0YApXHJcbiAgICBpZiAodGhpcy5zdGFjaykge1xyXG4gICAgICBjb25zdCBzdGFja0xpbmVzID0gdGhpcy5zdGFjay5zcGxpdCgnXFxuJylcclxuICAgICAgLy8g0KPQtNCw0LvRj9C10Lwg0YHRgtGA0L7QutGDINC60L7QvdGB0YLRgNGD0LrRgtC+0YDQsCAo0YfRgtC+0LHRiyDRgdGC0LXQuiDQvdCw0YfQuNC90LDQu9GB0Y8g0YEg0LzQtdGB0YLQsCDQstGL0LfQvtCy0LAgdG9OdW0pXHJcbiAgICAgIHRoaXMuc3RhY2sgPSBbc3RhY2tMaW5lc1swXSwgLi4uc3RhY2tMaW5lcy5zbGljZSgyKV0uam9pbignXFxuJylcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG92ZXJyaWRlIHRvU3RyaW5nKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gW1xyXG4gICAgICBg4p2MIFske3RoaXMubmFtZX1dICR7dGhpcy5tZXNzYWdlfWAsXHJcbiAgICAgIHRoaXMuc3RhY2sgPyBgICAgU3RhY2sgdHJhY2U6XFxuJHt0aGlzLnN0YWNrfWAgOiAnJyxcclxuICAgIF0uam9pbignXFxuJylcclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiDQntC/0YbQuNC4INC00LvRjyB0b0RhdGUoKS4g0J7RgdGC0LDQstC70LXQvdGLINC00LvRjyDQvtCx0YDQsNGC0L3QvtC5INGB0L7QstC80LXRgdGC0LjQvNC+0YHRgtC4INGB0LjQs9C90LDRgtGD0YDRiyDigJQg0YDQsNC90LXQtSDQv9GA0L7QsdGA0LDRgdGL0LLQsNC70LjRgdGMXHJcbiAqINCyIGx1eG9uICjQt9C+0L3QsC/Qu9C+0LrQsNC70YwpLiDQoNCw0LfQsdC+0YAg0LTQsNGC0Ysg0YLQtdC/0LXRgNGMINC90LUg0LfQsNCy0LjRgdC40YIg0L7RgiDQstC90LXRiNC90LjRhSDQsdC40LHQu9C40L7RgtC10Log0Lgg0L/QvtC00LTQtdGA0LbQuNCy0LDQtdGCXHJcbiAqINGC0L7Qu9GM0LrQviDRhNC40LrRgdC40YDQvtCy0LDQvdC90YvQtSDRh9C40YHQu9C+0LLRi9C1INGC0L7QutC10L3RiyAo0YHQvC4gcGFyc2VEYXRlV2l0aEZvcm1hdCksINC/0L7RjdGC0L7QvNGDINC+0L/RhtC40Lgg0YHQtdC50YfQsNGBINC90LUg0LjRgdC/0L7Qu9GM0LfRg9GO0YLRgdGPLlxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBUb0RhdGVPcHRpb25zIHtcclxuICB6b25lPzogc3RyaW5nXHJcbiAgbG9jYWxlPzogc3RyaW5nXHJcbn1cclxuXHJcbi8qKiDQodC+0L7RgtCy0LXRgtGB0YLQstC40LUg0YLQvtC60LXQvdC+0LIg0YTQvtGA0LzQsNGC0LAg0YDQtdCz0YPQu9GP0YDQvdGL0Lwg0LPRgNGD0L/Qv9Cw0Lwg0LfQsNGF0LLQsNGC0LAuINCf0L7RgNGP0LTQvtC6INCy0LDQttC10L06INC00LvQuNC90L3Ri9C1INGC0L7QutC10L3RiyDQv9GA0L7QstC10YDRj9GO0YLRgdGPINGA0LDQvdGM0YjQtSDQutC+0YDQvtGC0LrQuNGFICovXHJcbmNvbnN0IERBVEVfRk9STUFUX1RPS0VOUzogW3N0cmluZywgc3RyaW5nXVtdID0gW1xyXG4gIFsneXl5eScsICcoPzx5eXl5PlxcXFxkezR9KSddLFxyXG4gIFsneXknLCAnKD88eXk+XFxcXGR7Mn0pJ10sXHJcbiAgWydNTScsICcoPzxNTT5cXFxcZHsyfSknXSxcclxuICBbJ00nLCAnKD88TT5cXFxcZHsxLDJ9KSddLFxyXG4gIFsnZGQnLCAnKD88ZGQ+XFxcXGR7Mn0pJ10sXHJcbiAgWydkJywgJyg/PGQ+XFxcXGR7MSwyfSknXSxcclxuICBbJ0hIJywgJyg/PEhIPlxcXFxkezJ9KSddLFxyXG4gIFsnSCcsICcoPzxIPlxcXFxkezEsMn0pJ10sXHJcbiAgWydtbScsICcoPzxtbT5cXFxcZHsyfSknXSxcclxuICBbJ20nLCAnKD88bT5cXFxcZHsxLDJ9KSddLFxyXG4gIFsnc3MnLCAnKD88c3M+XFxcXGR7Mn0pJ10sXHJcbiAgWydzJywgJyg/PHM+XFxcXGR7MSwyfSknXSxcclxuXVxyXG5cclxuY29uc3QgREFURV9GT1JNQVRfVE9LRU5fUkVHRVggPSBuZXcgUmVnRXhwKERBVEVfRk9STUFUX1RPS0VOUy5tYXAoKFt0b2tlbl0pID0+IHRva2VuKS5qb2luKCd8JyksICdnJylcclxuXHJcbmNvbnN0IFRJTUVfT05MWV9UT0tFTlMgPSBuZXcgU2V0KFsnSEgnLCAnSCcsICdtbScsICdtJywgJ3NzJywgJ3MnXSlcclxuXHJcbi8qKlxyXG4gKiDQktGL0LLQvtC00LjRgiDRhNC+0YDQvNCw0YIgXCLRgtC+0LvRjNC60L4g0LTQsNGC0LBcIiDQuNC3INGE0L7RgNC80LDRgtCwINC00LDRgtGLLdC4LdCy0YDQtdC80LXQvdC4IOKAlCDQvtGC0YDQtdC30LDQtdGCINCy0YDQtdC80Y8g0Lgg0YDQsNC30LTQtdC70LjRgtC10LvRjCDQv9C10YDQtdC0XHJcbiAqINC90LjQvCAo0L3QsNC/0YDQuNC80LXRgCwgYCdkZC5NTS55eXl5IEhIOm1tOnNzJ2Ag4oaSIGAnZGQuTU0ueXl5eSdgKS4g0J/QvtGA0Y/QtNC+0Log0LTQtdC90Ywv0LzQtdGB0Y/Rhi/Qs9C+0LQg0YMg0L/QvtC70LXQuVxyXG4gKiBcItC00LDRgtCwXCIg0LggXCLQtNCw0YLQsC3QstGA0LXQvNGPXCIg0L3QsCDQvtC00L3QvtC8INC/0L7RgNGC0LDQu9C1IEJpdHJpeDI0INCy0YHQtdCz0LTQsCDRgdC+0LPQu9Cw0YHQvtCy0LDQvSDigJQg0YDQsNC30LvQuNGH0LDQtdGC0YHRjyDRgtC+0LvRjNC60L5cclxuICog0L3QsNC70LjRh9C40LUgYEhIOm1tOnNzYCwg0L/QvtGN0YLQvtC80YMg0L3QtdGCINGB0LzRi9GB0LvQsCDQt9Cw0YHRgtCw0LLQu9GP0YLRjCDQstGL0LfRi9Cy0LDRjtGJ0LXQs9C+INC/0LXRgNC10LTQsNCy0LDRgtGMINC+0LHQsCDRhNC+0YDQvNCw0YLQsCDQuFxyXG4gKiDQtNC10YDQttCw0YLRjCDQuNGFINCyINGB0LjQvdGF0YDQvtC90LUg0LLRgNGD0YfQvdGD0Y4uXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZGVyaXZlRGF0ZU9ubHlGb3JtYXQoZGF0ZVRpbWVGb3JtYXQ6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgREFURV9GT1JNQVRfVE9LRU5fUkVHRVgubGFzdEluZGV4ID0gMFxyXG4gIGxldCBtYXRjaDogUmVnRXhwRXhlY0FycmF5IHwgbnVsbFxyXG5cclxuICB3aGlsZSAoKG1hdGNoID0gREFURV9GT1JNQVRfVE9LRU5fUkVHRVguZXhlYyhkYXRlVGltZUZvcm1hdCkpICE9PSBudWxsKSB7XHJcbiAgICBpZiAoVElNRV9PTkxZX1RPS0VOUy5oYXMobWF0Y2hbMF0pKSB7XHJcbiAgICAgIC8vINCe0YLRgNC10LfQsNC10Lwg0LvRjtCx0L7QuSDRgNCw0LfQtNC10LvQuNGC0LXQu9GMINC/0LXRgNC10LQg0LLRgNC10LzQtdC90LXQvCwg0LLQutC70Y7Rh9Cw0Y8g0LHRg9C60LLQtdC90L3Ri9C5ICjQvdCw0L/RgNC40LzQtdGAICdUJyDQsiBJU08t0YHRgtC40LvQtVxyXG4gICAgICAvLyAnZGQuTU0ueXl5eVRISDptbTpzcycpLCDQsCDQvdC1INGC0L7Qu9GM0LrQviDQv9GD0L3QutGC0YPQsNGG0LjRjiDigJQg0L7RgdGC0LDQvdCw0LLQu9C40LLQsNC10LzRgdGPINC90LAg0L/QvtGB0LvQtdC00L3QtdC8INGB0LjQvNCy0L7Qu9C1LFxyXG4gICAgICAvLyDQutC+0YLQvtGA0YvQuSDRgNC10LDQu9GM0L3QviDQvtGC0L3QvtGB0LjRgtGB0Y8g0Log0YLQvtC60LXQvdCw0Lwg0LTQsNGC0YsgKHkvTS9kKS5cclxuICAgICAgY29uc3QgZGF0ZVBhcnQgPSBkYXRlVGltZUZvcm1hdC5zbGljZSgwLCBtYXRjaC5pbmRleCkucmVwbGFjZSgvW155TWRdKyQvLCAnJylcclxuICAgICAgcmV0dXJuIGRhdGVQYXJ0IHx8IGRhdGVUaW1lRm9ybWF0XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXR1cm4gZGF0ZVRpbWVGb3JtYXRcclxufVxyXG5cclxuZnVuY3Rpb24gZXNjYXBlUmVnRXhwKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcclxuICByZXR1cm4gc3RyLnJlcGxhY2UoL1suKis/XiR7fSgpfFtcXF1cXFxcXS9nLCAnXFxcXCQmJylcclxufVxyXG5cclxuLyoqXHJcbiAqINCk0L7RgNC80LDRgtGLINC00LDRgiwg0LrQvtGC0L7RgNGL0LUgQml0cml4MjQg0YDQtdCw0LvRjNC90L4g0L/RgNC40YHRi9C70LDQtdGCINCyINGA0LDQt9C90YvRhSDQvNC10YLQvtC00LDRhSBSRVNUINC4INC90LAg0YDQsNC30L3Ri9GFXHJcbiAqINC/0L7RgNGC0LDQu9Cw0YUg4oCUINGE0L7RgNC80LDRgiDQtNCw0YLRiy/QstGA0LXQvNC10L3QuCDQsiDQvtGC0LLQtdGC0LUg0LfQsNCy0LjRgdC40YIg0L7RgiDQvdCw0YHRgtGA0L7QtdC6INC/0L7RgNGC0LDQu9CwICjQndCw0YHRgtGA0L7QudC60Lgg4oaSINGE0L7RgNC80LDRglxyXG4gKiDQtNCw0YLRiyDQuCDQstGA0LXQvNC10L3QuCksINC/0L7RjdGC0L7QvNGDINC+0LTQuNC9INC30LDRhdCw0YDQtNC60L7QttC10L3QvdGL0Lkg0YjQsNCx0LvQvtC9INC90LUg0YPQvdC40LLQtdGA0YHQsNC70LXQvS4g0JXRgdC70Lgg0Y/QstC90YvQuSBgZm9ybWF0YCxcclxuICog0L/QtdGA0LXQtNCw0L3QvdGL0Lkg0LIgdG9EYXRlKCksINC90LUg0YHQvtCy0L/QsNC7INGB0L4g0LfQvdCw0YfQtdC90LjQtdC8LCDQv9C10YDQtdC0INGC0LXQvCDQutCw0Log0YHRh9C40YLQsNGC0Ywg0YHRgtGA0L7QutGDINC90LXQstCw0LvQuNC00L3QvtC5LFxyXG4gKiDQv9GA0L7QsdGD0LXQvCDRjdGC0Lgg0LLQsNGA0LjQsNC90YLRiyDQv9C+INC+0YfQtdGA0LXQtNC4IOKAlCDQvtC90Lgg0L3QtSDQv9C10YDQtdGB0LXQutCw0Y7RgtGB0Y8g0L/QviDRgNCw0LfQtNC10LvQuNGC0LXQu9GP0Lwv0L/QvtGA0Y/QtNC60YMg0YLQvtC60LXQvdC+0LIsXHJcbiAqINGC0LDQuiDRh9GC0L4g0LvQvtC20L3Ri9GFINGB0L7QstC/0LDQtNC10L3QuNC5INC90LUg0LHRg9C00LXRgi5cclxuICovXHJcbmNvbnN0IEZBTExCQUNLX0RBVEVfRk9STUFUUyA9IFtcclxuICAnZGQuTU0ueXl5eSBISDptbTpzcycsXHJcbiAgJ3l5eXktTU0tZGQgSEg6bW06c3MnLFxyXG4gICdkZC5NTS55eXl5JyxcclxuICAneXl5eS1NTS1kZCcsXHJcbl1cclxuXHJcbi8qKlxyXG4gKiDQoNCw0LfQsdC40YDQsNC10YIg0YHRgtGA0L7QutGDINC00LDRgtGLINC/0L4g0L/RgNC+0YHRgtC+0LzRgyDRiNCw0LHQu9C+0L3RgyAoeXl5eSwgTU0sIGRkLCBISCwgbW0sIHNzINC4INC40YUg0L7QtNC90L7QsdGD0LrQstC10L3QvdGL0LVcclxuICog0LLQsNGA0LjQsNC90YLRiywg0L3QsNC/0YDQuNC80LXRgCAnZGQuTU0ueXl5eSBISDptbTpzcycpLiDQoNCw0LfQtNC10LvQuNGC0LXQu9C4INC80LXQttC00YMg0YLQvtC60LXQvdCw0LzQuCDQsdC10YDRg9GC0YHRjyDQuNC3INGI0LDQsdC70L7QvdCwXHJcbiAqINC60LDQuiDQtdGB0YLRjC4g0J3QtSDQv9C+0LTQtNC10YDQttC40LLQsNC10YIg0LvQvtC60LDQu9C4LCDQvdCw0LfQstCw0L3QuNGPINC80LXRgdGP0YbQtdCyINC4INGH0LDRgdC+0LLRi9C1INC/0L7Rj9GB0LAg4oCUINC00LvRjyBSRVNULdC+0YLQstC10YLQvtCyXHJcbiAqIEJpdHJpeDI0INC+0L3QuCDQvdC1INGC0YDQtdCx0YPRjtGC0YHRjywg0LfQvdCw0YfQtdC90LjRjyDQstGB0LXQs9C00LAg0L/RgNC40YXQvtC00Y/RgiDQsiDRhNC40LrRgdC40YDQvtCy0LDQvdC90L7QvCDRh9C40YHQu9C+0LLQvtC8INCy0LjQtNC1LlxyXG4gKi9cclxuZnVuY3Rpb24gcGFyc2VEYXRlV2l0aEZvcm1hdCh2YWw6IHN0cmluZywgZm9ybWF0OiBzdHJpbmcpOiBEYXRlIHwgbnVsbCB7XHJcbiAgY29uc3QgdG9rZW5NYXAgPSBuZXcgTWFwKERBVEVfRk9STUFUX1RPS0VOUylcclxuICBsZXQgcGF0dGVybiA9ICcnXHJcbiAgbGV0IGxhc3RJbmRleCA9IDBcclxuICBsZXQgbWF0Y2g6IFJlZ0V4cEV4ZWNBcnJheSB8IG51bGxcclxuXHJcbiAgREFURV9GT1JNQVRfVE9LRU5fUkVHRVgubGFzdEluZGV4ID0gMFxyXG4gIHdoaWxlICgobWF0Y2ggPSBEQVRFX0ZPUk1BVF9UT0tFTl9SRUdFWC5leGVjKGZvcm1hdCkpICE9PSBudWxsKSB7XHJcbiAgICBwYXR0ZXJuICs9IGVzY2FwZVJlZ0V4cChmb3JtYXQuc2xpY2UobGFzdEluZGV4LCBtYXRjaC5pbmRleCkpXHJcbiAgICBwYXR0ZXJuICs9IHRva2VuTWFwLmdldChtYXRjaFswXSlcclxuICAgIGxhc3RJbmRleCA9IG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoXHJcbiAgfVxyXG4gIHBhdHRlcm4gKz0gZXNjYXBlUmVnRXhwKGZvcm1hdC5zbGljZShsYXN0SW5kZXgpKVxyXG5cclxuICBjb25zdCByZXN1bHQgPSBuZXcgUmVnRXhwKGBeJHtwYXR0ZXJufSRgKS5leGVjKHZhbClcclxuICBpZiAoIXJlc3VsdD8uZ3JvdXBzKSB7XHJcbiAgICByZXR1cm4gbnVsbFxyXG4gIH1cclxuXHJcbiAgY29uc3QgZyA9IHJlc3VsdC5ncm91cHNcclxuICBjb25zdCB5ZWFyID0gZ1sneXl5eSddID8gTnVtYmVyKGdbJ3l5eXknXSkgOiBnWyd5eSddID8gMjAwMCArIE51bWJlcihnWyd5eSddKSA6IG5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKVxyXG4gIGNvbnN0IG1vbnRoID0gTnVtYmVyKGdbJ01NJ10gPz8gZ1snTSddID8/IDEpXHJcbiAgY29uc3QgZGF5ID0gTnVtYmVyKGdbJ2RkJ10gPz8gZ1snZCddID8/IDEpXHJcbiAgY29uc3QgaG91ciA9IE51bWJlcihnWydISCddID8/IGdbJ0gnXSA/PyAwKVxyXG4gIGNvbnN0IG1pbnV0ZSA9IE51bWJlcihnWydtbSddID8/IGdbJ20nXSA/PyAwKVxyXG4gIGNvbnN0IHNlY29uZCA9IE51bWJlcihnWydzcyddID8/IGdbJ3MnXSA/PyAwKVxyXG5cclxuICAvLyDQotC+0LrQtdC90Ysg4oCUINGN0YLQviDQv9GA0L7RgdGC0L4gXCJOINGG0LjRhNGAXCIsINCx0LXQtyDQv9GA0L7QstC10YDQutC4INC00LjQsNC/0LDQt9C+0L3QsCAocmVnZXgg0L3QtSDQvtGC0LvQuNGH0LjRgiBcIjEzXCIg0LzQtdGB0Y/RhtCwINC+0YJcclxuICAvLyBcIjEzXCIg0LTQvdGPKS4g0JHQtdC3INGN0YLQvtC5INC/0YDQvtCy0LXRgNC60LggbmV3IERhdGUoKSDQvNC+0LvRh9CwIFwi0L/QtdGA0LXQutCw0YLRi9Cy0LDQtdGCXCIg0L/QtdGA0LXQv9C+0LvQvdC10L3QuNC1INC90LAg0YHQvtGB0LXQtNC90LjQuVxyXG4gIC8vINC80LXRgdGP0YYv0LPQvtC0ICjQvdCw0L/RgNC40LzQtdGALCDQvNC10YHRj9GGPTEzIOKGkiDRj9C90LLQsNGA0Ywg0YHQu9C10LTRg9GO0YnQtdCz0L4g0LPQvtC00LApINCy0LzQtdGB0YLQviDRgtC+0LPQviwg0YfRgtC+0LHRiyDRgdGH0LjRgtCw0YLRjFxyXG4gIC8vINGB0YLRgNC+0LrRgyDQvdC10LLQsNC70LjQtNC90L7QuS5cclxuICBpZiAobW9udGggPCAxIHx8IG1vbnRoID4gMTIgfHwgZGF5IDwgMSB8fCBkYXkgPiAzMSB8fCBob3VyID4gMjMgfHwgbWludXRlID4gNTkgfHwgc2Vjb25kID4gNTkpIHtcclxuICAgIHJldHVybiBudWxsXHJcbiAgfVxyXG5cclxuICBjb25zdCBkYXRlID0gbmV3IERhdGUoeWVhciwgbW9udGggLSAxLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kKVxyXG4gIHJldHVybiBpc05hTihkYXRlLmdldFRpbWUoKSkgPyBudWxsIDogZGF0ZVxyXG59XHJcblxyXG4vKipcclxuICog0J/QvtGB0LvQtdC00L3QuNC5INGA0LXQt9C10YDQstC90YvQuSDRgNCw0LfQsdC+0YAg4oCUINCx0LXQtyDQt9C90LDQvdC40Y8g0LrQvtC90LrRgNC10YLQvdC+0LPQviDRhNC+0YDQvNCw0YLQsC4g0KDQsNCx0L7RgtCw0LXRgiDRgtC+0LvRjNC60L4g0LTQu9GPINGH0LjRgdGC0L5cclxuICog0YfQuNGB0LvQvtCy0YvRhSDQtNCw0YIgKNC90LjQutCw0LrQuNGFINC90LDQt9Cy0LDQvdC40Lkg0LzQtdGB0Y/RhtC10LIv0LTQvdC10Lkg4oCUINC00LvRjyDRjdGC0L7Qs9C+INC90YPQttC90YsgbG9jYWxlLdGC0LDQsdC70LjRhtGLLCDQsCDRjdGC0L4g0LrQsNC6XHJcbiAqINGA0LDQtyDRgtC+0YIg0LLQtdGBLCDRgNCw0LTQuCDRg9GF0L7QtNCwINC+0YIg0LrQvtGC0L7RgNC+0LPQviBsdXhvbiDQsdGL0Lsg0YPQsdGA0LDQvSDQuNC3INC30LDQstC40YHQuNC80L7RgdGC0LXQuSkuXHJcbiAqXHJcbiAqINCY0LTQtdGPOiDQs9C+0LQg4oCUINC10LTQuNC90YHRgtCy0LXQvdC90YvQuSDRgdC10LPQvNC10L3RgiDQtNC70LjQvdC+0Lkg0YDQvtCy0L3QviA0INGG0LjRhNGA0YssINC/0L7RjdGC0L7QvNGDINC10LPQviDQv9C+0LfQuNGG0LjRjyAo0L/QtdGA0LLRi9C5INC40LvQuFxyXG4gKiDQv9C+0YHQu9C10LTQvdC40Lkg0LjQtyDRgtGA0ZHRhSDRgdC10LPQvNC10L3RgtC+0LIg0LTQsNGC0YspINC+0LTQvdC+0LfQvdCw0YfQvdC+INC+0L/QvtC30L3QsNGR0YLRgdGPINC/0YDQuCDQu9GO0LHQvtC8INGA0LDQt9C00LXQu9C40YLQtdC70LUgKGAuYCwgYC1gLFxyXG4gKiBgL2AsINC/0YDQvtCx0LXQuy4uLikuINCc0LXRgdGP0YYg0L/QviDQstGB0LXQvCDRgNCw0YHQv9GA0L7RgdGC0YDQsNC90ZHQvdC90YvQvCDQsiDQvNC40YDQtSDRgdC+0LPQu9Cw0YjQtdC90LjRj9C8IChJU08gYHl5eXktTU0tZGRgINC4XHJcbiAqINC10LLRgNC+0L/QtdC50YHQutC+0LUgYGRkLk1NLnl5eXlgKSDRgdGC0L7QuNGCINC80LXQttC00YMg0LPQvtC00L7QvCDQuCDQtNC90ZHQvCwg0L/QvtGN0YLQvtC80YMg0LHQtdGA0ZHRgtGB0Y8g0LrQsNC6INGB0YDQtdC00L3QuNC5INGB0LXQs9C80LXQvdGCLlxyXG4gKiDQktGA0LXQvNGPLCDQtdGB0LvQuCDQtdGB0YLRjCwg0LLRgdC10LPQtNCwINC40LTRkdGCINC60LDQuiBgSEg6bW06c3NgIOKAlCDRjdGC0L7RgiDQv9C+0YDRj9C00L7QuiDRg9C90LjQstC10YDRgdCw0LvQtdC9LlxyXG4gKlxyXG4gKiDQndC1INGA0LXRiNCw0LXRgiDQuCDQvdC1INC/0YvRgtCw0LXRgtGB0Y8g0YDQtdGI0LjRgtGMINC90LXQvtC00L3QvtC30L3QsNGH0L3QvtGB0YLRjCDQtNC10L3RjC/QvNC10YHRj9GGINCyINGH0LjRgdGC0L4g0YfQuNGB0LvQvtCy0YvRhSDRhNC+0YDQvNCw0YLQsNGFINCy0LjQtNCwXHJcbiAqIGBNTS9kZC95eXl5YCAo0KHQqNCQKSwg0LPQtNC1INC+0LHQsCDRgdC10LPQvNC10L3RgtCwINC80L7Qs9GD0YIg0LHRi9GC0Ywg4omkMTIg4oCUINGD0LPQsNC00YvQstCw0YLRjCDRjdGC0L4g0LHQtdC3INC30L3QsNC90LjRjyDQu9C+0LrQsNC70LhcclxuICog0LfQvdCw0YfQuNC70L4g0LHRiyDQuNC90L7Qs9C00LAg0LzQvtC70YfQsCDQv9GD0YLQsNGC0Ywg0LTQtdC90Ywg0YEg0LzQtdGB0Y/RhtC10LwsINGH0YLQviDRhdGD0LbQtSDRj9Cy0L3QvtC5INC+0YjQuNCx0LrQuC5cclxuICovXHJcbmZ1bmN0aW9uIHBhcnNlRGF0ZUhldXJpc3RpY2FsbHkodmFsOiBzdHJpbmcpOiBEYXRlIHwgbnVsbCB7XHJcbiAgY29uc3QgcGFydHMgPSB2YWwubWF0Y2goL1xcZCsvZylcclxuICBpZiAoIXBhcnRzIHx8IHBhcnRzLmxlbmd0aCA8IDMgfHwgcGFydHMubGVuZ3RoID4gNikge1xyXG4gICAgcmV0dXJuIG51bGxcclxuICB9XHJcblxyXG4gIGNvbnN0IFtkMCwgZDEsIGQyLCAuLi50aW1lUGFydHNdID0gcGFydHNcclxuICBjb25zdCBkYXRlUGFydHMgPSBbZDAsIGQxLCBkMl1cclxuICBjb25zdCB5ZWFySWR4ID0gZGF0ZVBhcnRzLmZpbmRJbmRleChwID0+IHAubGVuZ3RoID09PSA0KVxyXG4gIC8vINCT0L7QtCDQtNC+0LvQttC10L0g0LHRi9GC0Ywg0L7QtNC90L7Qt9C90LDRh9C90L4g0L3QsNC50LTQtdC9ICjRgNC+0LLQvdC+IDQg0YbQuNGE0YDRiykg0Lgg0YHRgtC+0Y/RgtGMINGBINC60YDQsNGPLCDQsCDQvdC1INCyINGB0LXRgNC10LTQuNC90LUg4oCUXHJcbiAgLy8g0LjQvdCw0YfQtSDQv9C+0LfQuNGG0LjRjyDQvNC10YHRj9GG0LAv0LTQvdGPINC90LUg0L7Qv9GA0LXQtNC10LvQuNGC0Ywg0LHQtdC30L7Qv9Cw0YHQvdC+LlxyXG4gIGlmICh5ZWFySWR4ICE9PSAwICYmIHllYXJJZHggIT09IDIpIHtcclxuICAgIHJldHVybiBudWxsXHJcbiAgfVxyXG5cclxuICBjb25zdCB5ZWFyID0gTnVtYmVyKGRhdGVQYXJ0c1t5ZWFySWR4XSlcclxuICBjb25zdCBtb250aCA9IE51bWJlcihkYXRlUGFydHNbMV0pXHJcbiAgY29uc3QgZGF5ID0gTnVtYmVyKGRhdGVQYXJ0c1t5ZWFySWR4ID09PSAwID8gMiA6IDBdKVxyXG4gIGlmIChtb250aCA8IDEgfHwgbW9udGggPiAxMiB8fCBkYXkgPCAxIHx8IGRheSA+IDMxKSB7XHJcbiAgICByZXR1cm4gbnVsbFxyXG4gIH1cclxuXHJcbiAgY29uc3QgW2hoLCBtbSwgc3NdID0gdGltZVBhcnRzXHJcbiAgY29uc3QgaG91ciA9IGhoICE9PSB1bmRlZmluZWQgPyBOdW1iZXIoaGgpIDogMFxyXG4gIGNvbnN0IG1pbnV0ZSA9IG1tICE9PSB1bmRlZmluZWQgPyBOdW1iZXIobW0pIDogMFxyXG4gIGNvbnN0IHNlY29uZCA9IHNzICE9PSB1bmRlZmluZWQgPyBOdW1iZXIoc3MpIDogMFxyXG4gIGlmIChob3VyID4gMjMgfHwgbWludXRlID4gNTkgfHwgc2Vjb25kID4gNTkpIHtcclxuICAgIHJldHVybiBudWxsXHJcbiAgfVxyXG5cclxuICBjb25zdCBkYXRlID0gbmV3IERhdGUoeWVhciwgbW9udGggLSAxLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kKVxyXG4gIHJldHVybiBpc05hTihkYXRlLmdldFRpbWUoKSkgPyBudWxsIDogZGF0ZVxyXG59XHJcblxyXG4vKipcclxuICog0J/RgNC10L7QsdGA0LDQt9GD0LXRgiDQt9C90LDRh9C10L3QuNC1INCyINC00LDRgtGDLlxyXG4gKlxyXG4gKiDQldGB0LvQuCDQv9C10YDQtdC00LDQvSBgZm9ybWF0YCwg0L3QviDQt9C90LDRh9C10L3QuNC1INC10LzRgyDQvdC1INGB0L7QvtGC0LLQtdGC0YHRgtCy0YPQtdGCICjRgdC8LiBGQUxMQkFDS19EQVRFX0ZPUk1BVFMg4oCUXHJcbiAqINCw0LrRgtGD0LDQu9GM0L3QviDQtNC70Y8g0L/QvtC70LXQuSwg0LPQtNC1IEJpdHJpeDI0INC+0YLQtNCw0ZHRgiDQtNCw0YLRgyDQsiDRhNC+0YDQvNCw0YLQtSwg0L3QsNGB0YLRgNC+0LXQvdC90L7QvCDQvdCwINC/0L7RgNGC0LDQu9C1LCDQsCDQvdC1INCyXHJcbiAqINGC0L7QvCwg0YfRgtC+INC30LDRhdCw0YDQtNC60L7QttC10L0g0LIg0LzQsNC/0L/QtdGA0LUpLCDQv9C10YDQtdC0INGC0LXQvCDQutCw0Log0YHRh9C40YLQsNGC0Ywg0LfQvdCw0YfQtdC90LjQtSDQvdC10LLQsNC70LjQtNC90YvQvCwg0LTQtdC70LDRjtGC0YHRjyDQtdGJ0ZFcclxuICog0LTQstC1INC/0L7Qv9GL0YLQutC4OiDQtNGA0YPQs9C40LUg0YDQsNGB0L/RgNC+0YHRgtGA0LDQvdGR0L3QvdGL0LUg0YTQvtGA0LzQsNGC0YsgQml0cml4MjQsINCwINC30LDRgtC10Lwg4oCUINC/0L7Qt9C40YbQuNC+0L3QvdCw0Y8g0Y3QstGA0LjRgdGC0LjQutCwXHJcbiAqICjRgdC8LiBwYXJzZURhdGVIZXVyaXN0aWNhbGx5KSwg0LrQvtGC0L7RgNCw0Y8g0YDQsNGB0L/QvtC30L3QsNGR0YIg0L/RgNCw0LrRgtC40YfQtdGB0LrQuCDQu9GO0LHQvtC5INGH0LjRgdGC0L4g0YfQuNGB0LvQvtCy0L7QuSDRhNC+0YDQvNCw0YJcclxuICog0LTQsNGC0Ysg0L3QtdC30LDQstC40YHQuNC80L4g0L7RgiDRgNCw0LfQtNC10LvQuNGC0LXQu9GPLiDQldGB0LvQuCDQv9GA0LjQu9C+0LbQtdC90LjRjiDRgtC+0YfQvdC+INC40LfQstC10YHRgtC10L0g0YTQvtGA0LzQsNGCINC60L7QvdC60YDQtdGC0L3QvtCz0L4g0L/QvtGA0YLQsNC70LAsXHJcbiAqINC10LPQviDRgdGC0L7QuNGCINC/0LXRgNC10LTQsNCy0LDRgtGMINGP0LLQvdGL0LwgYGZvcm1hdGAg4oCUINGN0YLQviDQstGB0LXQs9C00LAg0L/RgNC40L7RgNC40YLQtdGC0L3QtdC1INGD0LPQsNC00YvQstCw0L3QuNGPLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHRvRGF0ZSh2YWw6IG51bWJlciB8IHN0cmluZyB8IERhdGUsIGZvcm1hdD86IHN0cmluZywgb3B0PzogVG9EYXRlT3B0aW9ucywgdGhyb3dFcnJvciA9IHRydWUpOiBEYXRlIHtcclxuICBpZiAodmFsIGluc3RhbmNlb2YgRGF0ZSkge1xyXG4gICAgcmV0dXJuIHZhbFxyXG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcclxuICAgIGlmIChmb3JtYXQpIHtcclxuICAgICAgY29uc3QgcGFyc2VkID0gcGFyc2VEYXRlV2l0aEZvcm1hdCh2YWwsIGZvcm1hdClcclxuICAgICAgaWYgKHBhcnNlZCkge1xyXG4gICAgICAgIHJldHVybiBwYXJzZWRcclxuICAgICAgfVxyXG5cclxuICAgICAgZm9yIChjb25zdCBmYWxsYmFja0Zvcm1hdCBvZiBGQUxMQkFDS19EQVRFX0ZPUk1BVFMpIHtcclxuICAgICAgICBpZiAoZmFsbGJhY2tGb3JtYXQgPT09IGZvcm1hdCkgY29udGludWVcclxuICAgICAgICBjb25zdCBmYWxsYmFja1BhcnNlZCA9IHBhcnNlRGF0ZVdpdGhGb3JtYXQodmFsLCBmYWxsYmFja0Zvcm1hdClcclxuICAgICAgICBpZiAoZmFsbGJhY2tQYXJzZWQpIHtcclxuICAgICAgICAgIHJldHVybiBmYWxsYmFja1BhcnNlZFxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgaGV1cmlzdGljUGFyc2VkID0gcGFyc2VEYXRlSGV1cmlzdGljYWxseSh2YWwpXHJcbiAgICAgIGlmIChoZXVyaXN0aWNQYXJzZWQpIHtcclxuICAgICAgICByZXR1cm4gaGV1cmlzdGljUGFyc2VkXHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBuZXcgRGF0ZSh2YWwpXHJcbiAgICB9XHJcbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykge1xyXG4gICAgcmV0dXJuIG5ldyBEYXRlKHZhbClcclxuICB9XHJcblxyXG4gIGlmICh0aHJvd0Vycm9yKSB7XHJcbiAgICBjb25zb2xlLmVycm9yKCdXcm9uZyBkYXRlIGZvcm1hdCcsIHZhbCwgZm9ybWF0KVxyXG4gICAgdGhyb3cgbmV3IEVycm9yKCdXcm9uZyBkYXRlIGZvcm1hdCcpXHJcbiAgfVxyXG5cclxuICByZXR1cm4gbmV3IERhdGUoKVxyXG59XHJcblxyXG4vKipcclxuICog0J/RgNC10L7QsdGA0LDQt9GD0LXRgiDQtNCw0YLRgyDQsiDRgdGC0YDQvtC60YMg0YEg0YPRh9C10YLQvtC8INCy0YDQtdC80LXQvdC90L7QuSDQt9C+0L3Ri1xyXG4gKlxyXG4gKiDQpNC+0YDQvNCw0YLQuNGA0L7QstCw0L3QuNC1INC00LXQu9C10LPQuNGA0L7QstCw0L3QviB0b0xvY2FsQXRvbSgpIOKAlCDRgNCw0L3RjNGI0LUg0LfQtNC10YHRjCDQsdGL0LvQsCDQstGC0L7RgNCw0Y8sXHJcbiAqINC90LXQt9Cw0LLQuNGB0LjQvNCw0Y8g0LrQvtC/0LjRjyDRgtC+0Lkg0LbQtSDRhNC+0YDQvNGD0LvRiyAocGFkZGluZCArINGB0LzQtdGJ0LXQvdC40LUg0YLQsNC50LzQt9C+0L3RiyksINC60L7RgtC+0YDQsNGPXHJcbiAqINC80L7Qs9C70LAg0YDQsNC30L7QudGC0LjRgdGMINGBIHRvTG9jYWxBdG9tKCkg0L/RgNC4INC/0YDQsNCy0LrQtSDQvtC00L3QvtC5INC40Lcg0L3QuNGFINC4INC90LUg0LTRgNGD0LPQvtC5LlxyXG4gKlxyXG4gKiBAcGFyYW0gZGF0ZVxyXG4gKiBAcGFyYW0gdGhyb3dFcnJvclxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHRvSVNPU3RyaW5nV2l0aFRpbWV6b25lKGRhdGU6IERhdGUsIHRocm93RXJyb3IgPSB0cnVlKTogc3RyaW5nIHtcclxuICBpZiAoIShkYXRlIGluc3RhbmNlb2YgRGF0ZSkpIHtcclxuICAgIGlmICh0aHJvd0Vycm9yKSB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdmFsdWU6IG5vdCBhIHZhbGlkIERhdGUgb2JqZWN0JylcclxuICAgIHJldHVybiAnJ1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHRvTG9jYWxBdG9tKGRhdGUpXHJcbn1cclxuXHJcbi8qKlxyXG4gKiDQn9GA0LXQvtCx0YDQsNC30YPQtdGCINC30L3QsNGH0LXQvdC40LUg0LIg0LHRg9C70LXQstC+INC30L3QsNGH0LXQvdC40LVcclxuICpcclxuICogQHBhcmFtIHZhbFxyXG4gKiBAcGFyYW0gdGhyb3dFcnJvclxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHRvQm9vbCh2YWw6IGFueSwgdGhyb3dFcnJvciA9IHRydWUpOiBib29sZWFuIHtcclxuICBzd2l0Y2ggKHR5cGVvZiB2YWwpIHtcclxuICAgIGNhc2UgJ3N0cmluZyc6XHJcbiAgICAgIHZhbCA9IHZhbC50b0xvd2VyQ2FzZSgpXHJcbiAgICAgIGlmICh2YWwgPT09ICduJyB8fCB2YWwgPT09ICd5JykgeyAvLyDQsdC40YLRgNC40LrRgdC+0LLRi9C1INC/0L7QvdGP0YLQuNGPINC+IGJvb2xcclxuICAgICAgICByZXR1cm4gdmFsID09PSAneSdcclxuICAgICAgfSBlbHNlIGlmICh2YWwgPT09ICd0cnVlJyB8fCB2YWwgPT09ICdmYWxzZScpIHsgLy8g0LHQuNGC0YDQuNC60YHQvtCy0YvQtSDQv9C+0L3Rj9GC0LjRjyDQviBib29sXHJcbiAgICAgICAgcmV0dXJuIHZhbCA9PT0gJ3RydWUnXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYgKHRocm93RXJyb3IpIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB2YWx1ZTogY2Fubm90IGJlIGNvbnZlcnRlZCB0byBib29sZWFuJylcclxuICAgICAgICByZXR1cm4gZmFsc2VcclxuICAgICAgfVxyXG4gICAgZGVmYXVsdDpcclxuICAgICAgcmV0dXJuIEJvb2xlYW4odmFsKVxyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqINCf0YDQtdC+0LHRgNCw0LfRg9C10YIg0LHRg9C70LXQstC+INC30L3QsNGH0LXQvdC40LUg0LIgJ1knINC40LvQuCAnTidcclxuICpcclxuICogQHBhcmFtIHZhbFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHRvQlhZb3JOKHZhbDogYm9vbGVhbik6IHN0cmluZyB7XHJcbiAgcmV0dXJuIHZhbCA/ICdZJyA6ICdOJ1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0QmFzZVVybEh0dHBzKHVybDogc3RyaW5nLCBjb21wb25lbnQgPSBmYWxzZSk6IHN0cmluZyB7XHJcbiAgaWYgKGNvbXBvbmVudCkge1xyXG4gICAgcmV0dXJuIGVuY29kZVVSSShjcm9wVXJsKHVybCkgKyAnLycpXHJcbiAgfSBlbHNlIHtcclxuICAgIHJldHVybiBlbmNvZGVVUkkoJ2h0dHBzOi8vJyArIGNyb3BVcmwodXJsKSArICcvJylcclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiDQntCx0YDQtdC30LDQtdGCIFVSTCAo0YPQtNCw0LvRj9C10YIg0L/RgNC+0YLQvtC60L7QuylcclxuICpcclxuICogQHBhcmFtIHVybFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGNyb3BVcmwodXJsOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gIHVybCA9IHVybCA/IHVybC5yZXBsYWNlKCdodHRwczovLycsICcnKSA6ICcnXHJcbiAgdXJsID0gdXJsID8gdXJsLnJlcGxhY2UoJ2h0dHA6Ly8nLCAnJykgOiAnJ1xyXG4gIHVybCA9IHVybCA/IHVybC5yZXBsYWNlKCdodHRwczonLCAnJykgOiAnJ1xyXG4gIHVybCA9IHVybCA/IHVybC5yZXBsYWNlKCdodHRwOicsICcnKSA6ICcnXHJcbiAgcmV0dXJuIHVybFxyXG59XHJcblxyXG4vKipcclxuICog0J/RgNC10L7QsdGA0LDQt9GD0LXRgiDRhNCw0LnQuyDQsiBiYXNlNjRcclxuICpcclxuICogQHBhcmFtIGZpbGVcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRCYXNlNjRGaWxlKGZpbGU6IEZpbGUpOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpXHJcbiAgICByZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlKVxyXG4gICAgcmVhZGVyLm9ubG9hZCA9ICgpID0+IHJlc29sdmUocmVhZGVyLnJlc3VsdCBhcyBzdHJpbmcpXHJcbiAgICByZWFkZXIub25lcnJvciA9IGVycm9yID0+IHJlamVjdChlcnJvcilcclxuICB9KVxyXG59XHJcblxyXG4vKipcclxuICog0J/QvtC70YPRh9C40YLRjCDRhNCw0LnQuyDQsiDRhNC+0YDQvNCw0YLQtSBiYXNlNjQg0YEg0YDQsNC30LHQuNCy0LrQvtC5INC90LAg0LfQsNCz0L7Qu9C+0LLQvtC6INC4INC00LDQvdC90YvQtVxyXG4gKlxyXG4gKiBAcGFyYW0gZmlsZVxyXG4gKi9cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEJhc2U2NEZpbGVMaWtlU3RyKGZpbGU6IEZpbGUpOiBQcm9taXNlPHtcclxuICBoZWFkZXI6IHN0cmluZyxcclxuICB2YWw6IHN0cmluZ1xyXG59IHwgdW5kZWZpbmVkPiB7XHJcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZ2V0QmFzZTY0RmlsZShmaWxlKVxyXG4gIGlmICh0eXBlb2YgcmVzdWx0ID09PSAnc3RyaW5nJykge1xyXG4gICAgY29uc3Qgc3BsaXQgPSByZXN1bHQuc3BsaXQoJywnKVxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgaGVhZGVyOiBzcGxpdFswXSxcclxuICAgICAgdmFsOiBzcGxpdFsxXVxyXG4gICAgfVxyXG4gIH1cclxuICByZXR1cm4gdW5kZWZpbmVkXHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBwcmVwYXJlQmFzZUFkZHJlc3ModXJsOiBzdHJpbmcsIGFkZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gJycpIHtcclxuICAvLyBpZiAodXJsLnNlYXJjaCgnaHR0cHM6Ly8nKSAhPT0gMCAmJiB1cmwuc2VhcmNoKCdodHRwOi8vJykpIHtcclxuICAvLyAgIHVybCA9ICdodHRwczovLycgKyB1cmxcclxuICAvLyB9XHJcblxyXG4gIGlmIChhZGQgJiYgYWRkLmxlbmd0aCA+IDApIHtcclxuICAgIGlmICh1cmwubGFzdEluZGV4T2YoJy8nKSAhPT0gKHVybC5sZW5ndGggLSAxKSkge1xyXG4gICAgICB1cmwgPSB1cmwgKyAnLydcclxuICAgIH1cclxuXHJcbiAgICB1cmwgPSB1cmwgKyBhZGRcclxuICB9XHJcblxyXG4gIGlmICh1cmwubGFzdEluZGV4T2YoJy8nKSAhPT0gKHVybC5sZW5ndGggLSAxKSkge1xyXG4gICAgdXJsID0gdXJsICsgJy8nXHJcbiAgfVxyXG5cclxuICByZXR1cm4gdXJsXHJcbn0iXX0=
|
|
357
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2J4LXJlc3Qvc3JjL3NlcnZpY2VzL2Jhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFBO0FBRXREOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLEtBQUssQ0FBQyxHQUFRLEVBQUUsVUFBVSxHQUFHLEtBQUs7SUFDaEQsSUFBSSxHQUFHLEtBQUssSUFBSSxJQUFJLEdBQUcsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUN0QyxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQ2YsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQkFBa0IsR0FBRyxnQ0FBZ0MsQ0FBQyxDQUFBO1FBQ3hFLENBQUM7UUFDRCxPQUFPLEVBQUUsQ0FBQTtJQUNYLENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQTtBQUNwQixDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsS0FBSyxDQUFDLEdBQVEsRUFBRSxVQUFVLEdBQUcsSUFBSSxFQUFFLFFBQVEsR0FBRyxDQUFDO0lBQzdELE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUUxQixJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQ2xCLE1BQU0sS0FBSyxHQUFHLElBQUksVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBRWpDLElBQUksVUFBVTtZQUFFLE1BQU0sS0FBSyxDQUFBO1FBRTNCLGtEQUFrRDtRQUNsRCxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFBO1FBQy9CLE9BQU8sUUFBUSxDQUFBO0lBQ2pCLENBQUM7SUFFRCxPQUFPLE1BQU0sQ0FBQTtBQUNmLENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sT0FBTyxVQUFXLFNBQVEsS0FBSztJQUNuQyxZQUE0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QTtJQUN4QyxJQUFJLE9BQU8sTUFBTSxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQy9CLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDL0IsT0FBTztZQUNMLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ2hCLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO1NBQ2QsQ0FBQTtJQUNILENBQUM7SUFDRCxPQUFPLFNBQVMsQ0FBQTtBQUNsQixDQUFDO0FBRUQsTUFBTSxVQUFVLGtCQUFrQixDQUFDLEdBQVcsRUFBRSxNQUEwQixFQUFFO0lBQzFFLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDMUIsSUFBSSxHQUFHLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQzlDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFBO1FBQ2pCLENBQUM7UUFFRCxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQTtJQUNqQixDQUFDO0lBRUQsSUFBSSxHQUFHLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzlDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFBO0lBQ2pCLENBQUM7SUFFRCxPQUFPLEdBQUcsQ0FBQTtBQUNaLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0b0xvY2FsQXRvbSB9IGZyb20gJy4uL2Z1bmN0aW9ucy90b0xvY2FsQXRvbSdcclxuXHJcbi8qKlxyXG4gKiDQn9GA0LXQvtCx0YDQsNC30YPQtdGCINC30L3QsNGH0LXQvdC40LUg0LIg0YHRgtGA0L7QutGDXHJcbiAqXHJcbiAqIEBwYXJhbSB2YWxcclxuICogQHBhcmFtIHRocm93RXJyb3JcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiB0b1N0cih2YWw6IGFueSwgdGhyb3dFcnJvciA9IGZhbHNlKTogc3RyaW5nIHtcclxuICBpZiAodmFsID09PSBudWxsIHx8IHZhbCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICBpZiAodGhyb3dFcnJvcikge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdmFsdWU6ICR7dmFsfSBjYW5ub3QgYmUgY29udmVydGVkIHRvIHN0cmluZ2ApXHJcbiAgICB9XHJcbiAgICByZXR1cm4gJydcclxuICB9XHJcbiAgcmV0dXJuIFN0cmluZyh2YWwpXHJcbn1cclxuXHJcbi8qKlxyXG4gKiDQn9GA0LXQvtCx0YDQsNC30YPQtdGCINC30L3QsNGH0LXQvdC40LUg0LIg0YfQuNGB0LvQvlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHRvTnVtKHZhbDogYW55LCB0aHJvd0Vycm9yID0gdHJ1ZSwgZGVmVmFsdWUgPSAwKTogbnVtYmVyIHtcclxuICBjb25zdCByZXN1bHQgPSBOdW1iZXIodmFsKVxyXG5cclxuICBpZiAoaXNOYU4ocmVzdWx0KSkge1xyXG4gICAgY29uc3QgZXJyb3IgPSBuZXcgVG9OdW1FcnJvcih2YWwpXHJcblxyXG4gICAgaWYgKHRocm93RXJyb3IpIHRocm93IGVycm9yXHJcblxyXG4gICAgLy8g0JXRgdC70Lgg0L7RiNC40LHQutCwINC90LUg0L/RgNC+0LHRgNCw0YHRi9Cy0LDQtdGC0YHRjyDigJQg0L/RgNC+0YHRgtC+INC70L7Qs9C40YDRg9C10LxcclxuICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IudG9TdHJpbmcoKSlcclxuICAgIHJldHVybiBkZWZWYWx1ZVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHJlc3VsdFxyXG59XHJcblxyXG4vKipcclxuICog0JrQsNGB0YLQvtC80L3Ri9C5INGC0LjQvyDQvtGI0LjQsdC60Lgg0LTQu9GPINGH0LjRgdC70L7QstGL0YUg0L/RgNC10L7QsdGA0LDQt9C+0LLQsNC90LjQuVxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFRvTnVtRXJyb3IgZXh0ZW5kcyBFcnJvciB7XHJcbiAgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IHZhbHVlOiBhbnkpIHtcclxuICAgIGNvbnN0IHZhbHVlVHlwZSA9IHR5cGVvZiB2YWx1ZVxyXG4gICAgY29uc3QgZm9ybWF0dGVkVmFsdWUgPVxyXG4gICAgICB2YWx1ZVR5cGUgPT09ICdvYmplY3QnID8gSlNPTi5zdHJpbmdpZnkodmFsdWUpIDogU3RyaW5nKHZhbHVlKVxyXG4gICAgY29uc3QgbWVzc2FnZSA9IGBJbnZhbGlkIHZhbHVlIHBhc3NlZCB0byB0b051bSgpOiAke2Zvcm1hdHRlZFZhbHVlfSAodHlwZTogJHt2YWx1ZVR5cGV9KWBcclxuICAgIHN1cGVyKG1lc3NhZ2UpXHJcbiAgICB0aGlzLm5hbWUgPSAnVG9OdW1FcnJvcidcclxuXHJcbiAgICAvLyDRgdC+0YXRgNCw0L3Rj9C10Lwg0YHRgtC10Log0LLRi9C30L7QstCwICjQvtGC0YTQuNC70YzRgtGA0L7QstCw0LIg0YHQsNC8INC60L7QvdGB0YLRgNGD0LrRgtC+0YApXHJcbiAgICBpZiAodGhpcy5zdGFjaykge1xyXG4gICAgICBjb25zdCBzdGFja0xpbmVzID0gdGhpcy5zdGFjay5zcGxpdCgnXFxuJylcclxuICAgICAgLy8g0KPQtNCw0LvRj9C10Lwg0YHRgtGA0L7QutGDINC60L7QvdGB0YLRgNGD0LrRgtC+0YDQsCAo0YfRgtC+0LHRiyDRgdGC0LXQuiDQvdCw0YfQuNC90LDQu9GB0Y8g0YEg0LzQtdGB0YLQsCDQstGL0LfQvtCy0LAgdG9OdW0pXHJcbiAgICAgIHRoaXMuc3RhY2sgPSBbc3RhY2tMaW5lc1swXSwgLi4uc3RhY2tMaW5lcy5zbGljZSgyKV0uam9pbignXFxuJylcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG92ZXJyaWRlIHRvU3RyaW5nKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gW1xyXG4gICAgICBg4p2MIFske3RoaXMubmFtZX1dICR7dGhpcy5tZXNzYWdlfWAsXHJcbiAgICAgIHRoaXMuc3RhY2sgPyBgICAgU3RhY2sgdHJhY2U6XFxuJHt0aGlzLnN0YWNrfWAgOiAnJyxcclxuICAgIF0uam9pbignXFxuJylcclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiDQntC/0YbQuNC4INC00LvRjyB0b0RhdGUoKS4g0J7RgdGC0LDQstC70LXQvdGLINC00LvRjyDQvtCx0YDQsNGC0L3QvtC5INGB0L7QstC80LXRgdGC0LjQvNC+0YHRgtC4INGB0LjQs9C90LDRgtGD0YDRiyDigJQg0YDQsNC90LXQtSDQv9GA0L7QsdGA0LDRgdGL0LLQsNC70LjRgdGMXHJcbiAqINCyIGx1eG9uICjQt9C+0L3QsC/Qu9C+0LrQsNC70YwpLiDQoNCw0LfQsdC+0YAg0LTQsNGC0Ysg0YLQtdC/0LXRgNGMINC90LUg0LfQsNCy0LjRgdC40YIg0L7RgiDQstC90LXRiNC90LjRhSDQsdC40LHQu9C40L7RgtC10Log0Lgg0L/QvtC00LTQtdGA0LbQuNCy0LDQtdGCXHJcbiAqINGC0L7Qu9GM0LrQviDRhNC40LrRgdC40YDQvtCy0LDQvdC90YvQtSDRh9C40YHQu9C+0LLRi9C1INGC0L7QutC10L3RiyAo0YHQvC4gcGFyc2VEYXRlV2l0aEZvcm1hdCksINC/0L7RjdGC0L7QvNGDINC+0L/RhtC40Lgg0YHQtdC50YfQsNGBINC90LUg0LjRgdC/0L7Qu9GM0LfRg9GO0YLRgdGPLlxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBUb0RhdGVPcHRpb25zIHtcclxuICB6b25lPzogc3RyaW5nXHJcbiAgbG9jYWxlPzogc3RyaW5nXHJcbn1cclxuXHJcbi8qKiDQodC+0L7RgtCy0LXRgtGB0YLQstC40LUg0YLQvtC60LXQvdC+0LIg0YTQvtGA0LzQsNGC0LAg0YDQtdCz0YPQu9GP0YDQvdGL0Lwg0LPRgNGD0L/Qv9Cw0Lwg0LfQsNGF0LLQsNGC0LAuINCf0L7RgNGP0LTQvtC6INCy0LDQttC10L06INC00LvQuNC90L3Ri9C1INGC0L7QutC10L3RiyDQv9GA0L7QstC10YDRj9GO0YLRgdGPINGA0LDQvdGM0YjQtSDQutC+0YDQvtGC0LrQuNGFICovXHJcbmNvbnN0IERBVEVfRk9STUFUX1RPS0VOUzogW3N0cmluZywgc3RyaW5nXVtdID0gW1xyXG4gIFsneXl5eScsICcoPzx5eXl5PlxcXFxkezR9KSddLFxyXG4gIFsneXknLCAnKD88eXk+XFxcXGR7Mn0pJ10sXHJcbiAgWydNTScsICcoPzxNTT5cXFxcZHsyfSknXSxcclxuICBbJ00nLCAnKD88TT5cXFxcZHsxLDJ9KSddLFxyXG4gIFsnZGQnLCAnKD88ZGQ+XFxcXGR7Mn0pJ10sXHJcbiAgWydkJywgJyg/PGQ+XFxcXGR7MSwyfSknXSxcclxuICBbJ0hIJywgJyg/PEhIPlxcXFxkezJ9KSddLFxyXG4gIFsnSCcsICcoPzxIPlxcXFxkezEsMn0pJ10sXHJcbiAgWydtbScsICcoPzxtbT5cXFxcZHsyfSknXSxcclxuICBbJ20nLCAnKD88bT5cXFxcZHsxLDJ9KSddLFxyXG4gIFsnc3MnLCAnKD88c3M+XFxcXGR7Mn0pJ10sXHJcbiAgWydzJywgJyg/PHM+XFxcXGR7MSwyfSknXSxcclxuXVxyXG5cclxuY29uc3QgREFURV9GT1JNQVRfVE9LRU5fUkVHRVggPSBuZXcgUmVnRXhwKERBVEVfRk9STUFUX1RPS0VOUy5tYXAoKFt0b2tlbl0pID0+IHRva2VuKS5qb2luKCd8JyksICdnJylcclxuXHJcbmNvbnN0IFRJTUVfT05MWV9UT0tFTlMgPSBuZXcgU2V0KFsnSEgnLCAnSCcsICdtbScsICdtJywgJ3NzJywgJ3MnXSlcclxuXHJcbi8qKlxyXG4gKiDQktGL0LLQvtC00LjRgiDRhNC+0YDQvNCw0YIgXCLRgtC+0LvRjNC60L4g0LTQsNGC0LBcIiDQuNC3INGE0L7RgNC80LDRgtCwINC00LDRgtGLLdC4LdCy0YDQtdC80LXQvdC4IOKAlCDQvtGC0YDQtdC30LDQtdGCINCy0YDQtdC80Y8g0Lgg0YDQsNC30LTQtdC70LjRgtC10LvRjCDQv9C10YDQtdC0XHJcbiAqINC90LjQvCAo0L3QsNC/0YDQuNC80LXRgCwgYCdkZC5NTS55eXl5IEhIOm1tOnNzJ2Ag4oaSIGAnZGQuTU0ueXl5eSdgKS4g0J/QvtGA0Y/QtNC+0Log0LTQtdC90Ywv0LzQtdGB0Y/Rhi/Qs9C+0LQg0YMg0L/QvtC70LXQuVxyXG4gKiBcItC00LDRgtCwXCIg0LggXCLQtNCw0YLQsC3QstGA0LXQvNGPXCIg0L3QsCDQvtC00L3QvtC8INC/0L7RgNGC0LDQu9C1IEJpdHJpeDI0INCy0YHQtdCz0LTQsCDRgdC+0LPQu9Cw0YHQvtCy0LDQvSDigJQg0YDQsNC30LvQuNGH0LDQtdGC0YHRjyDRgtC+0LvRjNC60L5cclxuICog0L3QsNC70LjRh9C40LUgYEhIOm1tOnNzYCwg0L/QvtGN0YLQvtC80YMg0L3QtdGCINGB0LzRi9GB0LvQsCDQt9Cw0YHRgtCw0LLQu9GP0YLRjCDQstGL0LfRi9Cy0LDRjtGJ0LXQs9C+INC/0LXRgNC10LTQsNCy0LDRgtGMINC+0LHQsCDRhNC+0YDQvNCw0YLQsCDQuFxyXG4gKiDQtNC10YDQttCw0YLRjCDQuNGFINCyINGB0LjQvdGF0YDQvtC90LUg0LLRgNGD0YfQvdGD0Y4uXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZGVyaXZlRGF0ZU9ubHlGb3JtYXQoZGF0ZVRpbWVGb3JtYXQ6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgREFURV9GT1JNQVRfVE9LRU5fUkVHRVgubGFzdEluZGV4ID0gMFxyXG4gIGxldCBtYXRjaDogUmVnRXhwRXhlY0FycmF5IHwgbnVsbFxyXG5cclxuICB3aGlsZSAoKG1hdGNoID0gREFURV9GT1JNQVRfVE9LRU5fUkVHRVguZXhlYyhkYXRlVGltZUZvcm1hdCkpICE9PSBudWxsKSB7XHJcbiAgICBpZiAoVElNRV9PTkxZX1RPS0VOUy5oYXMobWF0Y2hbMF0pKSB7XHJcbiAgICAgIC8vINCe0YLRgNC10LfQsNC10Lwg0LvRjtCx0L7QuSDRgNCw0LfQtNC10LvQuNGC0LXQu9GMINC/0LXRgNC10LQg0LLRgNC10LzQtdC90LXQvCwg0LLQutC70Y7Rh9Cw0Y8g0LHRg9C60LLQtdC90L3Ri9C5ICjQvdCw0L/RgNC40LzQtdGAICdUJyDQsiBJU08t0YHRgtC40LvQtVxyXG4gICAgICAvLyAnZGQuTU0ueXl5eVRISDptbTpzcycpLCDQsCDQvdC1INGC0L7Qu9GM0LrQviDQv9GD0L3QutGC0YPQsNGG0LjRjiDigJQg0L7RgdGC0LDQvdCw0LLQu9C40LLQsNC10LzRgdGPINC90LAg0L/QvtGB0LvQtdC00L3QtdC8INGB0LjQvNCy0L7Qu9C1LFxyXG4gICAgICAvLyDQutC+0YLQvtGA0YvQuSDRgNC10LDQu9GM0L3QviDQvtGC0L3QvtGB0LjRgtGB0Y8g0Log0YLQvtC60LXQvdCw0Lwg0LTQsNGC0YsgKHkvTS9kKS5cclxuICAgICAgY29uc3QgZGF0ZVBhcnQgPSBkYXRlVGltZUZvcm1hdC5zbGljZSgwLCBtYXRjaC5pbmRleCkucmVwbGFjZSgvW155TWRdKyQvLCAnJylcclxuICAgICAgcmV0dXJuIGRhdGVQYXJ0IHx8IGRhdGVUaW1lRm9ybWF0XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXR1cm4gZGF0ZVRpbWVGb3JtYXRcclxufVxyXG5cclxuZnVuY3Rpb24gZXNjYXBlUmVnRXhwKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcclxuICByZXR1cm4gc3RyLnJlcGxhY2UoL1suKis/XiR7fSgpfFtcXF1cXFxcXS9nLCAnXFxcXCQmJylcclxufVxyXG5cclxuLyoqXHJcbiAqINCk0L7RgNC80LDRgtGLINC00LDRgiwg0LrQvtGC0L7RgNGL0LUgQml0cml4MjQg0YDQtdCw0LvRjNC90L4g0L/RgNC40YHRi9C70LDQtdGCINCyINGA0LDQt9C90YvRhSDQvNC10YLQvtC00LDRhSBSRVNUINC4INC90LAg0YDQsNC30L3Ri9GFXHJcbiAqINC/0L7RgNGC0LDQu9Cw0YUg4oCUINGE0L7RgNC80LDRgiDQtNCw0YLRiy/QstGA0LXQvNC10L3QuCDQsiDQvtGC0LLQtdGC0LUg0LfQsNCy0LjRgdC40YIg0L7RgiDQvdCw0YHRgtGA0L7QtdC6INC/0L7RgNGC0LDQu9CwICjQndCw0YHRgtGA0L7QudC60Lgg4oaSINGE0L7RgNC80LDRglxyXG4gKiDQtNCw0YLRiyDQuCDQstGA0LXQvNC10L3QuCksINC/0L7RjdGC0L7QvNGDINC+0LTQuNC9INC30LDRhdCw0YDQtNC60L7QttC10L3QvdGL0Lkg0YjQsNCx0LvQvtC9INC90LUg0YPQvdC40LLQtdGA0YHQsNC70LXQvS4g0JXRgdC70Lgg0Y/QstC90YvQuSBgZm9ybWF0YCxcclxuICog0L/QtdGA0LXQtNCw0L3QvdGL0Lkg0LIgdG9EYXRlKCksINC90LUg0YHQvtCy0L/QsNC7INGB0L4g0LfQvdCw0YfQtdC90LjQtdC8LCDQv9C10YDQtdC0INGC0LXQvCDQutCw0Log0YHRh9C40YLQsNGC0Ywg0YHRgtGA0L7QutGDINC90LXQstCw0LvQuNC00L3QvtC5LFxyXG4gKiDQv9GA0L7QsdGD0LXQvCDRjdGC0Lgg0LLQsNGA0LjQsNC90YLRiyDQv9C+INC+0YfQtdGA0LXQtNC4IOKAlCDQvtC90Lgg0L3QtSDQv9C10YDQtdGB0LXQutCw0Y7RgtGB0Y8g0L/QviDRgNCw0LfQtNC10LvQuNGC0LXQu9GP0Lwv0L/QvtGA0Y/QtNC60YMg0YLQvtC60LXQvdC+0LIsXHJcbiAqINGC0LDQuiDRh9GC0L4g0LvQvtC20L3Ri9GFINGB0L7QstC/0LDQtNC10L3QuNC5INC90LUg0LHRg9C00LXRgi5cclxuICovXHJcbmNvbnN0IEZBTExCQUNLX0RBVEVfRk9STUFUUyA9IFtcclxuICAnZGQuTU0ueXl5eSBISDptbTpzcycsXHJcbiAgJ3l5eXktTU0tZGQgSEg6bW06c3MnLFxyXG4gICdkZC5NTS55eXl5JyxcclxuICAneXl5eS1NTS1kZCcsXHJcbl1cclxuXHJcbi8qKlxyXG4gKiDQoNCw0LfQsdC40YDQsNC10YIg0YHRgtGA0L7QutGDINC00LDRgtGLINC/0L4g0L/RgNC+0YHRgtC+0LzRgyDRiNCw0LHQu9C+0L3RgyAoeXl5eSwgTU0sIGRkLCBISCwgbW0sIHNzINC4INC40YUg0L7QtNC90L7QsdGD0LrQstC10L3QvdGL0LVcclxuICog0LLQsNGA0LjQsNC90YLRiywg0L3QsNC/0YDQuNC80LXRgCAnZGQuTU0ueXl5eSBISDptbTpzcycpLiDQoNCw0LfQtNC10LvQuNGC0LXQu9C4INC80LXQttC00YMg0YLQvtC60LXQvdCw0LzQuCDQsdC10YDRg9GC0YHRjyDQuNC3INGI0LDQsdC70L7QvdCwXHJcbiAqINC60LDQuiDQtdGB0YLRjC4g0J3QtSDQv9C+0LTQtNC10YDQttC40LLQsNC10YIg0LvQvtC60LDQu9C4LCDQvdCw0LfQstCw0L3QuNGPINC80LXRgdGP0YbQtdCyINC4INGH0LDRgdC+0LLRi9C1INC/0L7Rj9GB0LAg4oCUINC00LvRjyBSRVNULdC+0YLQstC10YLQvtCyXHJcbiAqIEJpdHJpeDI0INC+0L3QuCDQvdC1INGC0YDQtdCx0YPRjtGC0YHRjywg0LfQvdCw0YfQtdC90LjRjyDQstGB0LXQs9C00LAg0L/RgNC40YXQvtC00Y/RgiDQsiDRhNC40LrRgdC40YDQvtCy0LDQvdC90L7QvCDRh9C40YHQu9C+0LLQvtC8INCy0LjQtNC1LlxyXG4gKi9cclxuZnVuY3Rpb24gcGFyc2VEYXRlV2l0aEZvcm1hdCh2YWw6IHN0cmluZywgZm9ybWF0OiBzdHJpbmcpOiBEYXRlIHwgbnVsbCB7XHJcbiAgY29uc3QgdG9rZW5NYXAgPSBuZXcgTWFwKERBVEVfRk9STUFUX1RPS0VOUylcclxuICBsZXQgcGF0dGVybiA9ICcnXHJcbiAgbGV0IGxhc3RJbmRleCA9IDBcclxuICBsZXQgbWF0Y2g6IFJlZ0V4cEV4ZWNBcnJheSB8IG51bGxcclxuXHJcbiAgREFURV9GT1JNQVRfVE9LRU5fUkVHRVgubGFzdEluZGV4ID0gMFxyXG4gIHdoaWxlICgobWF0Y2ggPSBEQVRFX0ZPUk1BVF9UT0tFTl9SRUdFWC5leGVjKGZvcm1hdCkpICE9PSBudWxsKSB7XHJcbiAgICBwYXR0ZXJuICs9IGVzY2FwZVJlZ0V4cChmb3JtYXQuc2xpY2UobGFzdEluZGV4LCBtYXRjaC5pbmRleCkpXHJcbiAgICBwYXR0ZXJuICs9IHRva2VuTWFwLmdldChtYXRjaFswXSlcclxuICAgIGxhc3RJbmRleCA9IG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoXHJcbiAgfVxyXG4gIHBhdHRlcm4gKz0gZXNjYXBlUmVnRXhwKGZvcm1hdC5zbGljZShsYXN0SW5kZXgpKVxyXG5cclxuICBjb25zdCByZXN1bHQgPSBuZXcgUmVnRXhwKGBeJHtwYXR0ZXJufSRgKS5leGVjKHZhbClcclxuICBpZiAoIXJlc3VsdD8uZ3JvdXBzKSB7XHJcbiAgICByZXR1cm4gbnVsbFxyXG4gIH1cclxuXHJcbiAgY29uc3QgZyA9IHJlc3VsdC5ncm91cHNcclxuICBjb25zdCB5ZWFyID0gZ1sneXl5eSddID8gTnVtYmVyKGdbJ3l5eXknXSkgOiBnWyd5eSddID8gMjAwMCArIE51bWJlcihnWyd5eSddKSA6IG5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKVxyXG4gIGNvbnN0IG1vbnRoID0gTnVtYmVyKGdbJ01NJ10gPz8gZ1snTSddID8/IDEpXHJcbiAgY29uc3QgZGF5ID0gTnVtYmVyKGdbJ2RkJ10gPz8gZ1snZCddID8/IDEpXHJcbiAgY29uc3QgaG91ciA9IE51bWJlcihnWydISCddID8/IGdbJ0gnXSA/PyAwKVxyXG4gIGNvbnN0IG1pbnV0ZSA9IE51bWJlcihnWydtbSddID8/IGdbJ20nXSA/PyAwKVxyXG4gIGNvbnN0IHNlY29uZCA9IE51bWJlcihnWydzcyddID8/IGdbJ3MnXSA/PyAwKVxyXG5cclxuICAvLyDQotC+0LrQtdC90Ysg4oCUINGN0YLQviDQv9GA0L7RgdGC0L4gXCJOINGG0LjRhNGAXCIsINCx0LXQtyDQv9GA0L7QstC10YDQutC4INC00LjQsNC/0LDQt9C+0L3QsCAocmVnZXgg0L3QtSDQvtGC0LvQuNGH0LjRgiBcIjEzXCIg0LzQtdGB0Y/RhtCwINC+0YJcclxuICAvLyBcIjEzXCIg0LTQvdGPKS4g0JHQtdC3INGN0YLQvtC5INC/0YDQvtCy0LXRgNC60LggbmV3IERhdGUoKSDQvNC+0LvRh9CwIFwi0L/QtdGA0LXQutCw0YLRi9Cy0LDQtdGCXCIg0L/QtdGA0LXQv9C+0LvQvdC10L3QuNC1INC90LAg0YHQvtGB0LXQtNC90LjQuVxyXG4gIC8vINC80LXRgdGP0YYv0LPQvtC0ICjQvdCw0L/RgNC40LzQtdGALCDQvNC10YHRj9GGPTEzIOKGkiDRj9C90LLQsNGA0Ywg0YHQu9C10LTRg9GO0YnQtdCz0L4g0LPQvtC00LApINCy0LzQtdGB0YLQviDRgtC+0LPQviwg0YfRgtC+0LHRiyDRgdGH0LjRgtCw0YLRjFxyXG4gIC8vINGB0YLRgNC+0LrRgyDQvdC10LLQsNC70LjQtNC90L7QuS5cclxuICBpZiAobW9udGggPCAxIHx8IG1vbnRoID4gMTIgfHwgZGF5IDwgMSB8fCBkYXkgPiAzMSB8fCBob3VyID4gMjMgfHwgbWludXRlID4gNTkgfHwgc2Vjb25kID4gNTkpIHtcclxuICAgIHJldHVybiBudWxsXHJcbiAgfVxyXG5cclxuICByZXR1cm4gYnVpbGREYXRlKHllYXIsIG1vbnRoLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kKVxyXG59XHJcblxyXG4vKiog0KHQvtCx0LjRgNCw0LXRgiDQtNCw0YLRgywg0L7RgtCx0YDQsNGB0YvQstCw0Y8g0L3QtdGB0YPRidC10YHRgtCy0YPRjtGJ0LjQtSDQtNC90Lgg0LzQtdGB0Y/RhtCwOiBuZXcgRGF0ZSgpINC/0YDQtdCy0YDQsNGC0LjQuyDQsdGLIDMxINGE0LXQstGA0LDQu9GPINCyIDMg0LzQsNGA0YLQsC4gKi9cclxuZnVuY3Rpb24gYnVpbGREYXRlKHllYXI6IG51bWJlciwgbW9udGg6IG51bWJlciwgZGF5OiBudW1iZXIsIGhvdXI6IG51bWJlciwgbWludXRlOiBudW1iZXIsIHNlY29uZDogbnVtYmVyKTogRGF0ZSB8IG51bGwge1xyXG4gIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCAtIDEsIGRheSwgaG91ciwgbWludXRlLCBzZWNvbmQpXHJcbiAgcmV0dXJuIChpc05hTihkYXRlLmdldFRpbWUoKSkgfHwgZGF0ZS5nZXRNb250aCgpICE9PSBtb250aCAtIDEgfHwgZGF0ZS5nZXREYXRlKCkgIT09IGRheSkgPyBudWxsIDogZGF0ZVxyXG59XHJcblxyXG4vKipcclxuICog0J/QvtGB0LvQtdC00L3QuNC5INGA0LXQt9C10YDQstC90YvQuSDRgNCw0LfQsdC+0YAg4oCUINCx0LXQtyDQt9C90LDQvdC40Y8g0LrQvtC90LrRgNC10YLQvdC+0LPQviDRhNC+0YDQvNCw0YLQsC4g0KDQsNCx0L7RgtCw0LXRgiDRgtC+0LvRjNC60L4g0LTQu9GPINGH0LjRgdGC0L5cclxuICog0YfQuNGB0LvQvtCy0YvRhSDQtNCw0YIgKNC90LjQutCw0LrQuNGFINC90LDQt9Cy0LDQvdC40Lkg0LzQtdGB0Y/RhtC10LIv0LTQvdC10Lkg4oCUINC00LvRjyDRjdGC0L7Qs9C+INC90YPQttC90YsgbG9jYWxlLdGC0LDQsdC70LjRhtGLLCDQsCDRjdGC0L4g0LrQsNC6XHJcbiAqINGA0LDQtyDRgtC+0YIg0LLQtdGBLCDRgNCw0LTQuCDRg9GF0L7QtNCwINC+0YIg0LrQvtGC0L7RgNC+0LPQviBsdXhvbiDQsdGL0Lsg0YPQsdGA0LDQvSDQuNC3INC30LDQstC40YHQuNC80L7RgdGC0LXQuSkuXHJcbiAqXHJcbiAqINCY0LTQtdGPOiDQs9C+0LQg4oCUINC10LTQuNC90YHRgtCy0LXQvdC90YvQuSDRgdC10LPQvNC10L3RgiDQtNC70LjQvdC+0Lkg0YDQvtCy0L3QviA0INGG0LjRhNGA0YssINC/0L7RjdGC0L7QvNGDINC10LPQviDQv9C+0LfQuNGG0LjRjyAo0L/QtdGA0LLRi9C5INC40LvQuFxyXG4gKiDQv9C+0YHQu9C10LTQvdC40Lkg0LjQtyDRgtGA0ZHRhSDRgdC10LPQvNC10L3RgtC+0LIg0LTQsNGC0YspINC+0LTQvdC+0LfQvdCw0YfQvdC+INC+0L/QvtC30L3QsNGR0YLRgdGPINC/0YDQuCDQu9GO0LHQvtC8INGA0LDQt9C00LXQu9C40YLQtdC70LUgKGAuYCwgYC1gLFxyXG4gKiBgL2AsINC/0YDQvtCx0LXQuy4uLikuINCc0LXRgdGP0YYg0L/QviDQstGB0LXQvCDRgNCw0YHQv9GA0L7RgdGC0YDQsNC90ZHQvdC90YvQvCDQsiDQvNC40YDQtSDRgdC+0LPQu9Cw0YjQtdC90LjRj9C8IChJU08gYHl5eXktTU0tZGRgINC4XHJcbiAqINC10LLRgNC+0L/QtdC50YHQutC+0LUgYGRkLk1NLnl5eXlgKSDRgdGC0L7QuNGCINC80LXQttC00YMg0LPQvtC00L7QvCDQuCDQtNC90ZHQvCwg0L/QvtGN0YLQvtC80YMg0LHQtdGA0ZHRgtGB0Y8g0LrQsNC6INGB0YDQtdC00L3QuNC5INGB0LXQs9C80LXQvdGCLlxyXG4gKiDQktGA0LXQvNGPLCDQtdGB0LvQuCDQtdGB0YLRjCwg0LLRgdC10LPQtNCwINC40LTRkdGCINC60LDQuiBgSEg6bW06c3NgIOKAlCDRjdGC0L7RgiDQv9C+0YDRj9C00L7QuiDRg9C90LjQstC10YDRgdCw0LvQtdC9LlxyXG4gKlxyXG4gKiDQndC1INGA0LXRiNCw0LXRgiDQuCDQvdC1INC/0YvRgtCw0LXRgtGB0Y8g0YDQtdGI0LjRgtGMINC90LXQvtC00L3QvtC30L3QsNGH0L3QvtGB0YLRjCDQtNC10L3RjC/QvNC10YHRj9GGINCyINGH0LjRgdGC0L4g0YfQuNGB0LvQvtCy0YvRhSDRhNC+0YDQvNCw0YLQsNGFINCy0LjQtNCwXHJcbiAqIGBNTS9kZC95eXl5YCAo0KHQqNCQKSwg0LPQtNC1INC+0LHQsCDRgdC10LPQvNC10L3RgtCwINC80L7Qs9GD0YIg0LHRi9GC0Ywg4omkMTIg4oCUINGD0LPQsNC00YvQstCw0YLRjCDRjdGC0L4g0LHQtdC3INC30L3QsNC90LjRjyDQu9C+0LrQsNC70LhcclxuICog0LfQvdCw0YfQuNC70L4g0LHRiyDQuNC90L7Qs9C00LAg0LzQvtC70YfQsCDQv9GD0YLQsNGC0Ywg0LTQtdC90Ywg0YEg0LzQtdGB0Y/RhtC10LwsINGH0YLQviDRhdGD0LbQtSDRj9Cy0L3QvtC5INC+0YjQuNCx0LrQuC5cclxuICovXHJcbmZ1bmN0aW9uIHBhcnNlRGF0ZUhldXJpc3RpY2FsbHkodmFsOiBzdHJpbmcpOiBEYXRlIHwgbnVsbCB7XHJcbiAgY29uc3QgcGFydHMgPSB2YWwubWF0Y2goL1xcZCsvZylcclxuICBpZiAoIXBhcnRzIHx8IHBhcnRzLmxlbmd0aCA8IDMgfHwgcGFydHMubGVuZ3RoID4gNikge1xyXG4gICAgcmV0dXJuIG51bGxcclxuICB9XHJcblxyXG4gIGNvbnN0IFtkMCwgZDEsIGQyLCAuLi50aW1lUGFydHNdID0gcGFydHNcclxuICBjb25zdCBkYXRlUGFydHMgPSBbZDAsIGQxLCBkMl1cclxuICBjb25zdCB5ZWFySWR4ID0gZGF0ZVBhcnRzLmZpbmRJbmRleChwID0+IHAubGVuZ3RoID09PSA0KVxyXG4gIC8vINCT0L7QtCDQtNC+0LvQttC10L0g0LHRi9GC0Ywg0L7QtNC90L7Qt9C90LDRh9C90L4g0L3QsNC50LTQtdC9ICjRgNC+0LLQvdC+IDQg0YbQuNGE0YDRiykg0Lgg0YHRgtC+0Y/RgtGMINGBINC60YDQsNGPLCDQsCDQvdC1INCyINGB0LXRgNC10LTQuNC90LUg4oCUXHJcbiAgLy8g0LjQvdCw0YfQtSDQv9C+0LfQuNGG0LjRjyDQvNC10YHRj9GG0LAv0LTQvdGPINC90LUg0L7Qv9GA0LXQtNC10LvQuNGC0Ywg0LHQtdC30L7Qv9Cw0YHQvdC+LlxyXG4gIGlmICh5ZWFySWR4ICE9PSAwICYmIHllYXJJZHggIT09IDIpIHtcclxuICAgIHJldHVybiBudWxsXHJcbiAgfVxyXG5cclxuICBjb25zdCB5ZWFyID0gTnVtYmVyKGRhdGVQYXJ0c1t5ZWFySWR4XSlcclxuICBjb25zdCBtb250aCA9IE51bWJlcihkYXRlUGFydHNbMV0pXHJcbiAgY29uc3QgZGF5ID0gTnVtYmVyKGRhdGVQYXJ0c1t5ZWFySWR4ID09PSAwID8gMiA6IDBdKVxyXG4gIGlmIChtb250aCA8IDEgfHwgbW9udGggPiAxMiB8fCBkYXkgPCAxIHx8IGRheSA+IDMxKSB7XHJcbiAgICByZXR1cm4gbnVsbFxyXG4gIH1cclxuXHJcbiAgY29uc3QgW2hoLCBtbSwgc3NdID0gdGltZVBhcnRzXHJcbiAgY29uc3QgaG91ciA9IGhoICE9PSB1bmRlZmluZWQgPyBOdW1iZXIoaGgpIDogMFxyXG4gIGNvbnN0IG1pbnV0ZSA9IG1tICE9PSB1bmRlZmluZWQgPyBOdW1iZXIobW0pIDogMFxyXG4gIGNvbnN0IHNlY29uZCA9IHNzICE9PSB1bmRlZmluZWQgPyBOdW1iZXIoc3MpIDogMFxyXG4gIGlmIChob3VyID4gMjMgfHwgbWludXRlID4gNTkgfHwgc2Vjb25kID4gNTkpIHtcclxuICAgIHJldHVybiBudWxsXHJcbiAgfVxyXG5cclxuICByZXR1cm4gYnVpbGREYXRlKHllYXIsIG1vbnRoLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kKVxyXG59XHJcblxyXG4vKipcclxuICog0J/RgNC10L7QsdGA0LDQt9GD0LXRgiDQt9C90LDRh9C10L3QuNC1INCyINC00LDRgtGDLlxyXG4gKlxyXG4gKiDQldGB0LvQuCDQv9C10YDQtdC00LDQvSBgZm9ybWF0YCwg0L3QviDQt9C90LDRh9C10L3QuNC1INC10LzRgyDQvdC1INGB0L7QvtGC0LLQtdGC0YHRgtCy0YPQtdGCICjRgdC8LiBGQUxMQkFDS19EQVRFX0ZPUk1BVFMg4oCUXHJcbiAqINCw0LrRgtGD0LDQu9GM0L3QviDQtNC70Y8g0L/QvtC70LXQuSwg0LPQtNC1IEJpdHJpeDI0INC+0YLQtNCw0ZHRgiDQtNCw0YLRgyDQsiDRhNC+0YDQvNCw0YLQtSwg0L3QsNGB0YLRgNC+0LXQvdC90L7QvCDQvdCwINC/0L7RgNGC0LDQu9C1LCDQsCDQvdC1INCyXHJcbiAqINGC0L7QvCwg0YfRgtC+INC30LDRhdCw0YDQtNC60L7QttC10L0g0LIg0LzQsNC/0L/QtdGA0LUpLCDQv9C10YDQtdC0INGC0LXQvCDQutCw0Log0YHRh9C40YLQsNGC0Ywg0LfQvdCw0YfQtdC90LjQtSDQvdC10LLQsNC70LjQtNC90YvQvCwg0LTQtdC70LDRjtGC0YHRjyDQtdGJ0ZFcclxuICog0LTQstC1INC/0L7Qv9GL0YLQutC4OiDQtNGA0YPQs9C40LUg0YDQsNGB0L/RgNC+0YHRgtGA0LDQvdGR0L3QvdGL0LUg0YTQvtGA0LzQsNGC0YsgQml0cml4MjQsINCwINC30LDRgtC10Lwg4oCUINC/0L7Qt9C40YbQuNC+0L3QvdCw0Y8g0Y3QstGA0LjRgdGC0LjQutCwXHJcbiAqICjRgdC8LiBwYXJzZURhdGVIZXVyaXN0aWNhbGx5KSwg0LrQvtGC0L7RgNCw0Y8g0YDQsNGB0L/QvtC30L3QsNGR0YIg0L/RgNCw0LrRgtC40YfQtdGB0LrQuCDQu9GO0LHQvtC5INGH0LjRgdGC0L4g0YfQuNGB0LvQvtCy0L7QuSDRhNC+0YDQvNCw0YJcclxuICog0LTQsNGC0Ysg0L3QtdC30LDQstC40YHQuNC80L4g0L7RgiDRgNCw0LfQtNC10LvQuNGC0LXQu9GPLiDQldGB0LvQuCDQv9GA0LjQu9C+0LbQtdC90LjRjiDRgtC+0YfQvdC+INC40LfQstC10YHRgtC10L0g0YTQvtGA0LzQsNGCINC60L7QvdC60YDQtdGC0L3QvtCz0L4g0L/QvtGA0YLQsNC70LAsXHJcbiAqINC10LPQviDRgdGC0L7QuNGCINC/0LXRgNC10LTQsNCy0LDRgtGMINGP0LLQvdGL0LwgYGZvcm1hdGAg4oCUINGN0YLQviDQstGB0LXQs9C00LAg0L/RgNC40L7RgNC40YLQtdGC0L3QtdC1INGD0LPQsNC00YvQstCw0L3QuNGPLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHRvRGF0ZSh2YWw6IG51bWJlciB8IHN0cmluZyB8IERhdGUsIGZvcm1hdD86IHN0cmluZywgb3B0PzogVG9EYXRlT3B0aW9ucywgdGhyb3dFcnJvciA9IHRydWUpOiBEYXRlIHtcclxuICBpZiAodmFsIGluc3RhbmNlb2YgRGF0ZSkge1xyXG4gICAgcmV0dXJuIHZhbFxyXG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcclxuICAgIGlmIChmb3JtYXQpIHtcclxuICAgICAgY29uc3QgcGFyc2VkID0gcGFyc2VEYXRlV2l0aEZvcm1hdCh2YWwsIGZvcm1hdClcclxuICAgICAgaWYgKHBhcnNlZCkge1xyXG4gICAgICAgIHJldHVybiBwYXJzZWRcclxuICAgICAgfVxyXG5cclxuICAgICAgZm9yIChjb25zdCBmYWxsYmFja0Zvcm1hdCBvZiBGQUxMQkFDS19EQVRFX0ZPUk1BVFMpIHtcclxuICAgICAgICBpZiAoZmFsbGJhY2tGb3JtYXQgPT09IGZvcm1hdCkgY29udGludWVcclxuICAgICAgICBjb25zdCBmYWxsYmFja1BhcnNlZCA9IHBhcnNlRGF0ZVdpdGhGb3JtYXQodmFsLCBmYWxsYmFja0Zvcm1hdClcclxuICAgICAgICBpZiAoZmFsbGJhY2tQYXJzZWQpIHtcclxuICAgICAgICAgIHJldHVybiBmYWxsYmFja1BhcnNlZFxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgaGV1cmlzdGljUGFyc2VkID0gcGFyc2VEYXRlSGV1cmlzdGljYWxseSh2YWwpXHJcbiAgICAgIGlmIChoZXVyaXN0aWNQYXJzZWQpIHtcclxuICAgICAgICByZXR1cm4gaGV1cmlzdGljUGFyc2VkXHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBuZXcgRGF0ZSh2YWwpXHJcbiAgICB9XHJcbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykge1xyXG4gICAgcmV0dXJuIG5ldyBEYXRlKHZhbClcclxuICB9XHJcblxyXG4gIGlmICh0aHJvd0Vycm9yKSB7XHJcbiAgICBjb25zb2xlLmVycm9yKCdXcm9uZyBkYXRlIGZvcm1hdCcsIHZhbCwgZm9ybWF0KVxyXG4gICAgdGhyb3cgbmV3IEVycm9yKCdXcm9uZyBkYXRlIGZvcm1hdCcpXHJcbiAgfVxyXG5cclxuICByZXR1cm4gbmV3IERhdGUoKVxyXG59XHJcblxyXG4vKipcclxuICog0J/RgNC10L7QsdGA0LDQt9GD0LXRgiDQtNCw0YLRgyDQsiDRgdGC0YDQvtC60YMg0YEg0YPRh9C10YLQvtC8INCy0YDQtdC80LXQvdC90L7QuSDQt9C+0L3Ri1xyXG4gKlxyXG4gKiDQpNC+0YDQvNCw0YLQuNGA0L7QstCw0L3QuNC1INC00LXQu9C10LPQuNGA0L7QstCw0L3QviB0b0xvY2FsQXRvbSgpIOKAlCDRgNCw0L3RjNGI0LUg0LfQtNC10YHRjCDQsdGL0LvQsCDQstGC0L7RgNCw0Y8sXHJcbiAqINC90LXQt9Cw0LLQuNGB0LjQvNCw0Y8g0LrQvtC/0LjRjyDRgtC+0Lkg0LbQtSDRhNC+0YDQvNGD0LvRiyAocGFkZGluZCArINGB0LzQtdGJ0LXQvdC40LUg0YLQsNC50LzQt9C+0L3RiyksINC60L7RgtC+0YDQsNGPXHJcbiAqINC80L7Qs9C70LAg0YDQsNC30L7QudGC0LjRgdGMINGBIHRvTG9jYWxBdG9tKCkg0L/RgNC4INC/0YDQsNCy0LrQtSDQvtC00L3QvtC5INC40Lcg0L3QuNGFINC4INC90LUg0LTRgNGD0LPQvtC5LlxyXG4gKlxyXG4gKiBAcGFyYW0gZGF0ZVxyXG4gKiBAcGFyYW0gdGhyb3dFcnJvclxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHRvSVNPU3RyaW5nV2l0aFRpbWV6b25lKGRhdGU6IERhdGUsIHRocm93RXJyb3IgPSB0cnVlKTogc3RyaW5nIHtcclxuICBpZiAoIShkYXRlIGluc3RhbmNlb2YgRGF0ZSkpIHtcclxuICAgIGlmICh0aHJvd0Vycm9yKSB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdmFsdWU6IG5vdCBhIHZhbGlkIERhdGUgb2JqZWN0JylcclxuICAgIHJldHVybiAnJ1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHRvTG9jYWxBdG9tKGRhdGUpXHJcbn1cclxuXHJcbi8qKlxyXG4gKiDQn9GA0LXQvtCx0YDQsNC30YPQtdGCINC30L3QsNGH0LXQvdC40LUg0LIg0LHRg9C70LXQstC+INC30L3QsNGH0LXQvdC40LVcclxuICpcclxuICogQHBhcmFtIHZhbFxyXG4gKiBAcGFyYW0gdGhyb3dFcnJvclxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHRvQm9vbCh2YWw6IGFueSwgdGhyb3dFcnJvciA9IHRydWUpOiBib29sZWFuIHtcclxuICBzd2l0Y2ggKHR5cGVvZiB2YWwpIHtcclxuICAgIGNhc2UgJ3N0cmluZyc6XHJcbiAgICAgIHZhbCA9IHZhbC50b0xvd2VyQ2FzZSgpXHJcbiAgICAgIGlmICh2YWwgPT09ICduJyB8fCB2YWwgPT09ICd5JykgeyAvLyDQsdC40YLRgNC40LrRgdC+0LLRi9C1INC/0L7QvdGP0YLQuNGPINC+IGJvb2xcclxuICAgICAgICByZXR1cm4gdmFsID09PSAneSdcclxuICAgICAgfSBlbHNlIGlmICh2YWwgPT09ICd0cnVlJyB8fCB2YWwgPT09ICdmYWxzZScpIHsgLy8g0LHQuNGC0YDQuNC60YHQvtCy0YvQtSDQv9C+0L3Rj9GC0LjRjyDQviBib29sXHJcbiAgICAgICAgcmV0dXJuIHZhbCA9PT0gJ3RydWUnXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYgKHRocm93RXJyb3IpIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB2YWx1ZTogY2Fubm90IGJlIGNvbnZlcnRlZCB0byBib29sZWFuJylcclxuICAgICAgICByZXR1cm4gZmFsc2VcclxuICAgICAgfVxyXG4gICAgZGVmYXVsdDpcclxuICAgICAgcmV0dXJuIEJvb2xlYW4odmFsKVxyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqINCf0YDQtdC+0LHRgNCw0LfRg9C10YIg0LHRg9C70LXQstC+INC30L3QsNGH0LXQvdC40LUg0LIgJ1knINC40LvQuCAnTidcclxuICpcclxuICogQHBhcmFtIHZhbFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHRvQlhZb3JOKHZhbDogYm9vbGVhbik6IHN0cmluZyB7XHJcbiAgcmV0dXJuIHZhbCA/ICdZJyA6ICdOJ1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0QmFzZVVybEh0dHBzKHVybDogc3RyaW5nLCBjb21wb25lbnQgPSBmYWxzZSk6IHN0cmluZyB7XHJcbiAgaWYgKGNvbXBvbmVudCkge1xyXG4gICAgcmV0dXJuIGVuY29kZVVSSShjcm9wVXJsKHVybCkgKyAnLycpXHJcbiAgfSBlbHNlIHtcclxuICAgIHJldHVybiBlbmNvZGVVUkkoJ2h0dHBzOi8vJyArIGNyb3BVcmwodXJsKSArICcvJylcclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiDQntCx0YDQtdC30LDQtdGCIFVSTCAo0YPQtNCw0LvRj9C10YIg0L/RgNC+0YLQvtC60L7QuylcclxuICpcclxuICogQHBhcmFtIHVybFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGNyb3BVcmwodXJsOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gIHVybCA9IHVybCA/IHVybC5yZXBsYWNlKCdodHRwczovLycsICcnKSA6ICcnXHJcbiAgdXJsID0gdXJsID8gdXJsLnJlcGxhY2UoJ2h0dHA6Ly8nLCAnJykgOiAnJ1xyXG4gIHVybCA9IHVybCA/IHVybC5yZXBsYWNlKCdodHRwczonLCAnJykgOiAnJ1xyXG4gIHVybCA9IHVybCA/IHVybC5yZXBsYWNlKCdodHRwOicsICcnKSA6ICcnXHJcbiAgcmV0dXJuIHVybFxyXG59XHJcblxyXG4vKipcclxuICog0J/RgNC10L7QsdGA0LDQt9GD0LXRgiDRhNCw0LnQuyDQsiBiYXNlNjRcclxuICpcclxuICogQHBhcmFtIGZpbGVcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRCYXNlNjRGaWxlKGZpbGU6IEZpbGUpOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpXHJcbiAgICByZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlKVxyXG4gICAgcmVhZGVyLm9ubG9hZCA9ICgpID0+IHJlc29sdmUocmVhZGVyLnJlc3VsdCBhcyBzdHJpbmcpXHJcbiAgICByZWFkZXIub25lcnJvciA9IGVycm9yID0+IHJlamVjdChlcnJvcilcclxuICB9KVxyXG59XHJcblxyXG4vKipcclxuICog0J/QvtC70YPRh9C40YLRjCDRhNCw0LnQuyDQsiDRhNC+0YDQvNCw0YLQtSBiYXNlNjQg0YEg0YDQsNC30LHQuNCy0LrQvtC5INC90LAg0LfQsNCz0L7Qu9C+0LLQvtC6INC4INC00LDQvdC90YvQtVxyXG4gKlxyXG4gKiBAcGFyYW0gZmlsZVxyXG4gKi9cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEJhc2U2NEZpbGVMaWtlU3RyKGZpbGU6IEZpbGUpOiBQcm9taXNlPHtcclxuICBoZWFkZXI6IHN0cmluZyxcclxuICB2YWw6IHN0cmluZ1xyXG59IHwgdW5kZWZpbmVkPiB7XHJcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZ2V0QmFzZTY0RmlsZShmaWxlKVxyXG4gIGlmICh0eXBlb2YgcmVzdWx0ID09PSAnc3RyaW5nJykge1xyXG4gICAgY29uc3Qgc3BsaXQgPSByZXN1bHQuc3BsaXQoJywnKVxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgaGVhZGVyOiBzcGxpdFswXSxcclxuICAgICAgdmFsOiBzcGxpdFsxXVxyXG4gICAgfVxyXG4gIH1cclxuICByZXR1cm4gdW5kZWZpbmVkXHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBwcmVwYXJlQmFzZUFkZHJlc3ModXJsOiBzdHJpbmcsIGFkZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gJycpIHtcclxuICBpZiAoYWRkICYmIGFkZC5sZW5ndGggPiAwKSB7XHJcbiAgICBpZiAodXJsLmxhc3RJbmRleE9mKCcvJykgIT09ICh1cmwubGVuZ3RoIC0gMSkpIHtcclxuICAgICAgdXJsID0gdXJsICsgJy8nXHJcbiAgICB9XHJcblxyXG4gICAgdXJsID0gdXJsICsgYWRkXHJcbiAgfVxyXG5cclxuICBpZiAodXJsLmxhc3RJbmRleE9mKCcvJykgIT09ICh1cmwubGVuZ3RoIC0gMSkpIHtcclxuICAgIHVybCA9IHVybCArICcvJ1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHVybFxyXG59Il19
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { BXRestSettings } from '../settings';
|
|
2
|
+
/**
|
|
3
|
+
* Контекст клиента: его настройки, экземпляр axios и общее состояние
|
|
4
|
+
* продления авторизации и очереди `throttle`.
|
|
5
|
+
*
|
|
6
|
+
* Объекты библиотеки запоминают контекст в момент создания
|
|
7
|
+
* (`currentContext()`), поэтому все запросы клиента `new BXRestNavvy(settings)`
|
|
8
|
+
* идут с его настройками, а не с глобальными. Внутренняя деталь библиотеки.
|
|
9
|
+
*/
|
|
10
|
+
export class BXRestContext {
|
|
11
|
+
constructor(own) {
|
|
12
|
+
this.own = own;
|
|
13
|
+
/** Сколько продлений уже завершилось успешно. */
|
|
14
|
+
this.refreshCount = 0;
|
|
15
|
+
/** Очередь `throttle`: когда можно отправить следующий запрос клиента (мс, Date.now()). */
|
|
16
|
+
this.throttleNextSlot = 0;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Свои настройки клиента, а без них — глобальные `BXRestSettings.value`,
|
|
20
|
+
* прочитанные в момент обращения: `BXRestSettings.update()` заменяет объект.
|
|
21
|
+
*/
|
|
22
|
+
get settings() {
|
|
23
|
+
return this.own ?? BXRestSettings.value;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Контекст глобальных настроек. С ним работают `new BXRestNavvy()` без
|
|
28
|
+
* аргумента и объекты, созданные приложением напрямую (`new Navvy()`,
|
|
29
|
+
* `new BXRestRequest()`).
|
|
30
|
+
*/
|
|
31
|
+
export const globalContext = /* @__PURE__ */ new BXRestContext();
|
|
32
|
+
let current = globalContext;
|
|
33
|
+
export function currentContext() {
|
|
34
|
+
return current;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Делает `ctx` текущим и возвращает прежний контекст. Вызывающий обязан
|
|
38
|
+
* вернуть его через `restoreContext()` в `finally`: иначе после исключения
|
|
39
|
+
* чужие настройки достанутся объектам, созданным позже.
|
|
40
|
+
*/
|
|
41
|
+
export function enterContext(ctx) {
|
|
42
|
+
const previous = current;
|
|
43
|
+
current = ctx;
|
|
44
|
+
return previous;
|
|
45
|
+
}
|
|
46
|
+
export function restoreContext(previous) {
|
|
47
|
+
current = previous;
|
|
48
|
+
}
|
|
49
|
+
/** Создаёт объекты в контексте `ctx` и возвращает прежний контекст, даже при исключении. */
|
|
50
|
+
export function runInContext(ctx, build) {
|
|
51
|
+
const previous = enterContext(ctx);
|
|
52
|
+
try {
|
|
53
|
+
return build();
|
|
54
|
+
}
|
|
55
|
+
finally {
|
|
56
|
+
restoreContext(previous);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2J4LXJlc3Qvc3JjL3NlcnZpY2VzL2NvbnRleHQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQUk1Qzs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxPQUFPLGFBQWE7SUFVeEIsWUFBNkIsR0FBcUI7UUFBckIsUUFBRyxHQUFILEdBQUcsQ0FBa0I7UUFQbEQsaURBQWlEO1FBQ2pELGlCQUFZLEdBQUcsQ0FBQyxDQUFBO1FBR2hCLDJGQUEyRjtRQUMzRixxQkFBZ0IsR0FBRyxDQUFDLENBQUE7SUFFaUMsQ0FBQztJQUV0RDs7O09BR0c7SUFDSCxJQUFJLFFBQVE7UUFDVixPQUFPLElBQUksQ0FBQyxHQUFHLElBQUksY0FBYyxDQUFDLEtBQUssQ0FBQTtJQUN6QyxDQUFDO0NBQ0Y7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLGVBQWUsQ0FBQyxJQUFJLGFBQWEsRUFBRSxDQUFBO0FBRWhFLElBQUksT0FBTyxHQUFHLGFBQWEsQ0FBQTtBQUUzQixNQUFNLFVBQVUsY0FBYztJQUM1QixPQUFPLE9BQU8sQ0FBQTtBQUNoQixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxZQUFZLENBQUMsR0FBa0I7SUFDN0MsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFBO0lBQ3hCLE9BQU8sR0FBRyxHQUFHLENBQUE7SUFDYixPQUFPLFFBQVEsQ0FBQTtBQUNqQixDQUFDO0FBRUQsTUFBTSxVQUFVLGNBQWMsQ0FBQyxRQUF1QjtJQUNwRCxPQUFPLEdBQUcsUUFBUSxDQUFBO0FBQ3BCLENBQUM7QUFFRCw0RkFBNEY7QUFDNUYsTUFBTSxVQUFVLFlBQVksQ0FBSSxHQUFrQixFQUFFLEtBQWM7SUFDaEUsTUFBTSxRQUFRLEdBQUcsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQ2xDLElBQUksQ0FBQztRQUNILE9BQU8sS0FBSyxFQUFFLENBQUE7SUFDaEIsQ0FBQztZQUFTLENBQUM7UUFDVCxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUE7SUFDMUIsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCWFJlc3RTZXR0aW5ncyB9IGZyb20gJy4uL3NldHRpbmdzJ1xyXG5pbXBvcnQgeyBpQlhSZXN0U2V0dGluZ3MgfSBmcm9tICcuLi90eXBpZmljYXRpb24vc2V0dGluZ3MnXHJcbmltcG9ydCB0eXBlIHsgQXhpb3NJbnN0YW5jZSB9IGZyb20gJ2F4aW9zJ1xyXG5cclxuLyoqXHJcbiAqINCa0L7QvdGC0LXQutGB0YIg0LrQu9C40LXQvdGC0LA6INC10LPQviDQvdCw0YHRgtGA0L7QudC60LgsINGN0LrQt9C10LzQv9C70Y/RgCBheGlvcyDQuCDQvtCx0YnQtdC1INGB0L7RgdGC0L7Rj9C90LjQtVxyXG4gKiDQv9GA0L7QtNC70LXQvdC40Y8g0LDQstGC0L7RgNC40LfQsNGG0LjQuCDQuCDQvtGH0LXRgNC10LTQuCBgdGhyb3R0bGVgLlxyXG4gKlxyXG4gKiDQntCx0YrQtdC60YLRiyDQsdC40LHQu9C40L7RgtC10LrQuCDQt9Cw0L/QvtC80LjQvdCw0Y7RgiDQutC+0L3RgtC10LrRgdGCINCyINC80L7QvNC10L3RgiDRgdC+0LfQtNCw0L3QuNGPXHJcbiAqIChgY3VycmVudENvbnRleHQoKWApLCDQv9C+0Y3RgtC+0LzRgyDQstGB0LUg0LfQsNC/0YDQvtGB0Ysg0LrQu9C40LXQvdGC0LAgYG5ldyBCWFJlc3ROYXZ2eShzZXR0aW5ncylgXHJcbiAqINC40LTRg9GCINGBINC10LPQviDQvdCw0YHRgtGA0L7QudC60LDQvNC4LCDQsCDQvdC1INGBINCz0LvQvtCx0LDQu9GM0L3Ri9C80LguINCS0L3Rg9GC0YDQtdC90L3Rj9GPINC00LXRgtCw0LvRjCDQsdC40LHQu9C40L7RgtC10LrQuC5cclxuICovXHJcbmV4cG9ydCBjbGFzcyBCWFJlc3RDb250ZXh0IHtcclxuICAvKiog0JjQtNGD0YnQtdC1INGB0LXQudGH0LDRgSDQv9GA0L7QtNC70LXQvdC40LUg0LDQstGC0L7RgNC40LfQsNGG0LjQuCwg0LXQs9C+INC20LTRg9GCINCy0YHQtSDRg9C/0LDQstGI0LjQtSDQt9Cw0L/RgNC+0YHRiyDQutC70LjQtdC90YLQsC4gKi9cclxuICBwZW5kaW5nUmVmcmVzaDogUHJvbWlzZTx2b2lkPiB8IHVuZGVmaW5lZFxyXG4gIC8qKiDQodC60L7Qu9GM0LrQviDQv9GA0L7QtNC70LXQvdC40Lkg0YPQttC1INC30LDQstC10YDRiNC40LvQvtGB0Ywg0YPRgdC/0LXRiNC90L4uICovXHJcbiAgcmVmcmVzaENvdW50ID0gMFxyXG4gIC8qKiDQrdC60LfQtdC80L/Qu9GP0YAgYXhpb3Mg0LrQu9C40LXQvdGC0LA6INC+0LTQuNC9INC90LAg0LrQvtC90YLQtdC60YHRgiwg0YHQvtC30LTQsNGR0YLRgdGPINC/0YDQuCDQv9C10YDQstC+0Lwg0LfQsNC/0YDQvtGB0LUuICovXHJcbiAgYXhpb3M6IEF4aW9zSW5zdGFuY2UgfCB1bmRlZmluZWRcclxuICAvKiog0J7Rh9C10YDQtdC00YwgYHRocm90dGxlYDog0LrQvtCz0LTQsCDQvNC+0LbQvdC+INC+0YLQv9GA0LDQstC40YLRjCDRgdC70LXQtNGD0Y7RidC40Lkg0LfQsNC/0YDQvtGBINC60LvQuNC10L3RgtCwICjQvNGBLCBEYXRlLm5vdygpKS4gKi9cclxuICB0aHJvdHRsZU5leHRTbG90ID0gMFxyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IG93bj86IGlCWFJlc3RTZXR0aW5ncykge31cclxuXHJcbiAgLyoqXHJcbiAgICog0KHQstC+0Lgg0L3QsNGB0YLRgNC+0LnQutC4INC60LvQuNC10L3RgtCwLCDQsCDQsdC10Lcg0L3QuNGFIOKAlCDQs9C70L7QsdCw0LvRjNC90YvQtSBgQlhSZXN0U2V0dGluZ3MudmFsdWVgLFxyXG4gICAqINC/0YDQvtGH0LjRgtCw0L3QvdGL0LUg0LIg0LzQvtC80LXQvdGCINC+0LHRgNCw0YnQtdC90LjRjzogYEJYUmVzdFNldHRpbmdzLnVwZGF0ZSgpYCDQt9Cw0LzQtdC90Y/QtdGCINC+0LHRitC10LrRgi5cclxuICAgKi9cclxuICBnZXQgc2V0dGluZ3MoKTogaUJYUmVzdFNldHRpbmdzIHtcclxuICAgIHJldHVybiB0aGlzLm93biA/PyBCWFJlc3RTZXR0aW5ncy52YWx1ZVxyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqINCa0L7QvdGC0LXQutGB0YIg0LPQu9C+0LHQsNC70YzQvdGL0YUg0L3QsNGB0YLRgNC+0LXQui4g0KEg0L3QuNC8INGA0LDQsdC+0YLQsNGO0YIgYG5ldyBCWFJlc3ROYXZ2eSgpYCDQsdC10LdcclxuICog0LDRgNCz0YPQvNC10L3RgtCwINC4INC+0LHRitC10LrRgtGLLCDRgdC+0LfQtNCw0L3QvdGL0LUg0L/RgNC40LvQvtC20LXQvdC40LXQvCDQvdCw0L/RgNGP0LzRg9GOIChgbmV3IE5hdnZ5KClgLFxyXG4gKiBgbmV3IEJYUmVzdFJlcXVlc3QoKWApLlxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGdsb2JhbENvbnRleHQgPSAvKiBAX19QVVJFX18gKi8gbmV3IEJYUmVzdENvbnRleHQoKVxyXG5cclxubGV0IGN1cnJlbnQgPSBnbG9iYWxDb250ZXh0XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY3VycmVudENvbnRleHQoKTogQlhSZXN0Q29udGV4dCB7XHJcbiAgcmV0dXJuIGN1cnJlbnRcclxufVxyXG5cclxuLyoqXHJcbiAqINCU0LXQu9Cw0LXRgiBgY3R4YCDRgtC10LrRg9GJ0LjQvCDQuCDQstC+0LfQstGA0LDRidCw0LXRgiDQv9GA0LXQttC90LjQuSDQutC+0L3RgtC10LrRgdGCLiDQktGL0LfRi9Cy0LDRjtGJ0LjQuSDQvtCx0Y/Qt9Cw0L1cclxuICog0LLQtdGA0L3Rg9GC0Ywg0LXQs9C+INGH0LXRgNC10LcgYHJlc3RvcmVDb250ZXh0KClgINCyIGBmaW5hbGx5YDog0LjQvdCw0YfQtSDQv9C+0YHQu9C1INC40YHQutC70Y7Rh9C10L3QuNGPXHJcbiAqINGH0YPQttC40LUg0L3QsNGB0YLRgNC+0LnQutC4INC00L7RgdGC0LDQvdGD0YLRgdGPINC+0LHRitC10LrRgtCw0LwsINGB0L7Qt9C00LDQvdC90YvQvCDQv9C+0LfQttC1LlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGVudGVyQ29udGV4dChjdHg6IEJYUmVzdENvbnRleHQpOiBCWFJlc3RDb250ZXh0IHtcclxuICBjb25zdCBwcmV2aW91cyA9IGN1cnJlbnRcclxuICBjdXJyZW50ID0gY3R4XHJcbiAgcmV0dXJuIHByZXZpb3VzXHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiByZXN0b3JlQ29udGV4dChwcmV2aW91czogQlhSZXN0Q29udGV4dCk6IHZvaWQge1xyXG4gIGN1cnJlbnQgPSBwcmV2aW91c1xyXG59XHJcblxyXG4vKiog0KHQvtC30LTQsNGR0YIg0L7QsdGK0LXQutGC0Ysg0LIg0LrQvtC90YLQtdC60YHRgtC1IGBjdHhgINC4INCy0L7Qt9Cy0YDQsNGJ0LDQtdGCINC/0YDQtdC20L3QuNC5INC60L7QvdGC0LXQutGB0YIsINC00LDQttC1INC/0YDQuCDQuNGB0LrQu9GO0YfQtdC90LjQuC4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHJ1bkluQ29udGV4dDxUPihjdHg6IEJYUmVzdENvbnRleHQsIGJ1aWxkOiAoKSA9PiBUKTogVCB7XHJcbiAgY29uc3QgcHJldmlvdXMgPSBlbnRlckNvbnRleHQoY3R4KVxyXG4gIHRyeSB7XHJcbiAgICByZXR1cm4gYnVpbGQoKVxyXG4gIH0gZmluYWxseSB7XHJcbiAgICByZXN0b3JlQ29udGV4dChwcmV2aW91cylcclxuICB9XHJcbn1cclxuIl19
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { throwError, forkJoin,
|
|
1
|
+
import { Observable, throwError, forkJoin, defer } from 'rxjs';
|
|
2
2
|
import clone from 'just-clone';
|
|
3
3
|
import { HttpServices } from './http';
|
|
4
4
|
import flatten from 'just-flatten-it';
|
|
@@ -7,6 +7,8 @@ import { switchMap } from 'rxjs/operators';
|
|
|
7
7
|
import { prepareBaseAddress } from '../base';
|
|
8
8
|
import { serializeBitrixParams as stringifyBitrixParams } from '../../functions/serializeBitrixParams';
|
|
9
9
|
import { withAuthRefresh } from './authRefresh';
|
|
10
|
+
import { composeMiddleware } from './transport';
|
|
11
|
+
import { builtInMiddleware } from './middleware';
|
|
10
12
|
export class HttpBXServices extends HttpServices {
|
|
11
13
|
/**
|
|
12
14
|
* Не считайте этот метод образцом/финальным API.
|
|
@@ -71,8 +73,8 @@ export class HttpBXServices extends HttpServices {
|
|
|
71
73
|
get(name, params = {}, headers) {
|
|
72
74
|
return this.httpGet(this.getNameMethod(name), params, undefined, headers);
|
|
73
75
|
}
|
|
74
|
-
// settings
|
|
75
|
-
//
|
|
76
|
+
// settings не используется и оставлен ради прежней сигнатуры: headers
|
|
77
|
+
// остаётся четвёртым параметром у httpPost и httpGet.
|
|
76
78
|
httpPost(url, params = {}, settings, headers) {
|
|
77
79
|
// defer() откладывает всё содержимое (в том числе чтение BXRestSettings
|
|
78
80
|
// через this.session.*) до реальной подписки — иначе даже с "живым"
|
|
@@ -103,19 +105,19 @@ export class HttpBXServices extends HttpServices {
|
|
|
103
105
|
return throwError(() => this.session.getBaseUrlError('post'));
|
|
104
106
|
}
|
|
105
107
|
const fullUrl = prepareBaseAddress(baseUrl) + url;
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
}
|
|
113
|
-
return from(this.axiosInstance.post(fullUrl, paramsClone, {
|
|
108
|
+
// sessid — тело x-www-form-urlencoded, остальные ключи — JSON
|
|
109
|
+
const urlencoded = key === 'sessid';
|
|
110
|
+
return this.send({
|
|
111
|
+
method: 'POST',
|
|
112
|
+
url: fullUrl,
|
|
113
|
+
data: urlencoded ? this.serializeBitrixParams(paramsClone) : paramsClone,
|
|
114
114
|
withCredentials: this.session.getWithCredentials(),
|
|
115
|
-
headers: this.buildHeaders(headers, {
|
|
116
|
-
|
|
115
|
+
headers: this.buildHeaders(headers, {
|
|
116
|
+
'Content-Type': urlencoded ? 'application/x-www-form-urlencoded' : 'application/json'
|
|
117
|
+
}),
|
|
118
|
+
});
|
|
117
119
|
}));
|
|
118
|
-
}));
|
|
120
|
+
}), this.session.ctx);
|
|
119
121
|
}
|
|
120
122
|
httpGet(url, params = {}, settings, headers) {
|
|
121
123
|
// Та же причина, что и у httpPost выше: откладываем чтение BXRestSettings
|
|
@@ -125,26 +127,59 @@ export class HttpBXServices extends HttpServices {
|
|
|
125
127
|
// авторизации — как в httpPost.
|
|
126
128
|
return withAuthRefresh(defer(() => {
|
|
127
129
|
const paramsClone = clone(params);
|
|
130
|
+
const key = this.session.getKeyAuth();
|
|
128
131
|
const auth = this.session.getAuthParams();
|
|
129
132
|
const checkIsOn = this.session.getCheckAuthParamsIsOn();
|
|
130
133
|
if (checkIsOn) {
|
|
131
134
|
if (!auth) {
|
|
132
135
|
return throwError(() => this.session.getAuthError('get'));
|
|
133
136
|
}
|
|
134
|
-
|
|
137
|
+
if (key !== 'OAuth2') {
|
|
138
|
+
paramsClone[key] = auth;
|
|
139
|
+
}
|
|
135
140
|
}
|
|
136
141
|
return this.session.getBaseUrl().pipe(switchMap((baseUrl) => {
|
|
137
142
|
if (!baseUrl) {
|
|
138
143
|
return throwError(() => this.session.getBaseUrlError('get'));
|
|
139
144
|
}
|
|
140
145
|
const fullUrl = prepareBaseAddress(baseUrl) + url;
|
|
141
|
-
const queryString =
|
|
146
|
+
const queryString = this.serializeBitrixParams(paramsClone);
|
|
142
147
|
const finalUrl = `${fullUrl}?${queryString}`;
|
|
143
|
-
return
|
|
148
|
+
return this.send({
|
|
149
|
+
method: 'GET',
|
|
150
|
+
url: finalUrl,
|
|
151
|
+
withCredentials: this.session.getWithCredentials(),
|
|
144
152
|
headers: this.buildHeaders(headers),
|
|
145
|
-
})
|
|
153
|
+
});
|
|
146
154
|
}));
|
|
147
|
-
}));
|
|
155
|
+
}), this.session.ctx);
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Отправка через шаги из настроек: `retryOnQueryLimit`, `throttle`,
|
|
159
|
+
* `timeout`, затем `middleware`; последним идёт axios клиента. Настройки
|
|
160
|
+
* читаются при подписке. Отписка отменяет HTTP-запрос (AbortSignal).
|
|
161
|
+
* Ошибка транспорта уходит дальше как есть: у axios в ней весь запрос,
|
|
162
|
+
* вместе с токеном и секретом вебхука (см. README, «Обработка ошибок»).
|
|
163
|
+
*/
|
|
164
|
+
send(config) {
|
|
165
|
+
return new Observable(subscriber => {
|
|
166
|
+
const controller = new AbortController();
|
|
167
|
+
const ctx = this.session.ctx;
|
|
168
|
+
const send = composeMiddleware([...builtInMiddleware(ctx.settings, ctx), ...this.session.getMiddleware()], request => this.axiosSend(request));
|
|
169
|
+
send({ ...config, signal: controller.signal }).then(data => {
|
|
170
|
+
subscriber.next(data);
|
|
171
|
+
subscriber.complete();
|
|
172
|
+
}, (error) => subscriber.error(error));
|
|
173
|
+
return () => controller.abort();
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
/** Транспорт по умолчанию: axios клиента, как и раньше через post()/get(). */
|
|
177
|
+
axiosSend(config) {
|
|
178
|
+
const options = { headers: config.headers, withCredentials: config.withCredentials, signal: config.signal };
|
|
179
|
+
const request = (config.method === 'GET')
|
|
180
|
+
? this.axiosInstance.get(config.url, options)
|
|
181
|
+
: this.axiosInstance.post(config.url, config.data, options);
|
|
182
|
+
return request.then(response => response.data);
|
|
148
183
|
}
|
|
149
184
|
/**
|
|
150
185
|
* Заголовки запроса: `BXRestSettings.headers`, поверх них — заголовки
|
|
@@ -162,4 +197,4 @@ export class HttpBXServices extends HttpServices {
|
|
|
162
197
|
return arr.join('.');
|
|
163
198
|
}
|
|
164
199
|
}
|
|
165
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSHR0cEJYLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYngtcmVzdC9zcmMvc2VydmljZXMvaHR0cC9IdHRwQlgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFjLFVBQVUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQTtBQUNwRSxPQUFPLEtBQUssTUFBTSxZQUFZLENBQUE7QUFDOUIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLFFBQVEsQ0FBQTtBQUtyQyxPQUFPLE9BQU8sTUFBTSxpQkFBaUIsQ0FBQTtBQUNyQyxPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQTtBQUMxRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFDMUMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sU0FBUyxDQUFBO0FBQzVDLE9BQU8sRUFBRSxxQkFBcUIsSUFBSSxxQkFBcUIsRUFBRSxNQUFNLHVDQUF1QyxDQUFBO0FBRXRHLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFFL0MsTUFBTSxPQUFPLGNBQWUsU0FBUSxZQUFZO0lBRTlDOzs7O09BSUc7SUFDSCxNQUFNLENBQU8sS0FBeUQ7UUFFcEUsSUFBSSxZQUFZLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBUyxJQUFJLENBQUMsWUFBWSxDQUFJLEtBQUssQ0FBQyxDQUFDLENBQUE7UUFDdEUsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFBLENBQUMsbUJBQW1CO1FBQ25DLElBQUksUUFBUSxHQUFHLEVBQUUsQ0FBQSxDQUFDLDJDQUEyQztRQUM3RCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENB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OUQsQ0FBQztnQkFFRCxNQUFNLE9BQU8sR0FBRyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsR0FBRyxHQUFHLENBQUE7Z0JBQ2pELE1BQU0sV0FBVyxHQUFHLElBQUksZUFBZSxDQUFDLFdBQVcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFBO2dCQUMvRCxNQUFNLFFBQVEsR0FBRyxHQUFHLE9BQU8sSUFBSSxXQUFXLEVBQUUsQ0FBQTtnQkFFNUMsT0FBTyxJQUFJLENBQ1QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUksUUFBUSxFQUFFO29CQUNsQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUM7aUJBQ3BDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FDckMsQ0FBQTtZQUNILENBQUMsQ0FBQyxDQUNILENBQUE7UUFDSCxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ0wsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ssWUFBWSxDQUFDLE9BQWdDLEVBQUUsV0FBbUMsRUFBRTtRQUMxRixPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxFQUFFLEdBQUcsT0FBTyxFQUFFLEdBQUcsUUFBUSxFQUFFLENBQUE7SUFDbEUsQ0FBQztJQUVELHFCQUFxQixDQUFDLE1BQWU7UUFDbkMsT0FBTyxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUN0QyxDQUFDO0lBRUQsYUFBYSxDQUFDLEdBQWE7UUFDekIsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQ3RCLENBQUM7Q0FFRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9ic2VydmFibGUsIHRocm93RXJyb3IsIGZvcmtKb2luLCBmcm9tLCBkZWZlciB9IGZyb20gJ3J4anMnXHJcbmltcG9ydCBjbG9uZSBmcm9tICdqdXN0LWNsb25lJ1xyXG5pbXBvcnQgeyBIdHRwU2VydmljZXMgfSBmcm9tICcuL2h0dHAnXHJcbmltcG9ydCB7XHJcbiAgaUJhdGNoUmVxdWVzdEFuc3dlciwgaUJhdGNoUmVxdWVzdFBhcmFtLCBpQmF0Y2hSZXF1ZXN0UGFyYW1BcnIsIGlCYXRjaFJlcXVlc3RQYXJhbUh0dHAsIGtleUJhdGNoLFxyXG59IGZyb20gJy4uLy4uL3R5cGlmaWNhdGlvbi9yZXN0L2JhdGNoL2JhdGNoUmVxdWVzdFBhcmFtJ1xyXG5pbXBvcnQgeyBpQlhSZXN0QW5zd2VyIH0gZnJvbSAnLi4vLi4vdHlwaWZpY2F0aW9uL3Jlc3QvYmFzZS9hbnN3ZXInXHJcbmltcG9ydCBmbGF0dGVuIGZyb20gJ2p1c3QtZmxhdHRlbi1pdCdcclxuaW1wb3J0IHsgaW5zdGFuY2VPZmlCWFJlc3RBbnN3ZXJTdWNjZXNzIH0gZnJvbSAnLi4vLi4vZnVuY3Rpb25zL21hcFJlc3VsdCdcclxuaW1wb3J0IHsgc3dpdGNoTWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnXHJcbmltcG9ydCB7IHByZXBhcmVCYXNlQWRkcmVzcyB9IGZyb20gJy4uL2Jhc2UnXHJcbmltcG9ydCB7IHNlcmlhbGl6ZUJpdHJpeFBhcmFtcyBhcyBzdHJpbmdpZnlCaXRyaXhQYXJhbXMgfSBmcm9tICcuLi8uLi9mdW5jdGlvbnMvc2VyaWFsaXplQml0cml4UGFyYW1zJ1xyXG5pbXBvcnQgeyBpSHR0cFBhcmFtU2V0dGluZ3MgfSBmcm9tICcuLi8uLi90eXBpZmljYXRpb24vcmVzdC9zZXR0aW5ncydcclxuaW1wb3J0IHsgd2l0aEF1dGhSZWZyZXNoIH0gZnJvbSAnLi9hdXRoUmVmcmVzaCdcclxuXHJcbmV4cG9ydCBjbGFzcyBIdHRwQlhTZXJ2aWNlcyBleHRlbmRzIEh0dHBTZXJ2aWNlcyB7XHJcblxyXG4gIC8qKlxyXG4gICAqINCd0LUg0YHRh9C40YLQsNC50YLQtSDRjdGC0L7RgiDQvNC10YLQvtC0INC+0LHRgNCw0LfRhtC+0Lwv0YTQuNC90LDQu9GM0L3Ri9C8IEFQSS5cclxuICAgKiBUT0RPOiDQo9C00LDQu9C40YLRjCDQtNCw0L3QvdGL0Lkg0LzQtdGC0L7QtCDQv9C+0YHQu9C1INGA0LXQsNC70LjQt9Cw0YbQuNC4INC10LPQviDQsiDRgNCw0LfQtNC10LvQtSBOYXZ2eVxyXG4gICAqIEBwYXJhbSBwYXJhbVxyXG4gICAqL1xyXG4gIGJyYW5jaDxULCBBPihwYXJhbTogaUJhdGNoUmVxdWVzdFBhcmFtQXJyPFQ+IHwgaUJhdGNoUmVxdWVzdFBhcmFtPFQ+W10pXHJcbiAgICA6IE9ic2VydmFibGU8aUJhdGNoUmVxdWVzdEFuc3dlcjxBPltdIHwgdW5kZWZpbmVkPiB7XHJcbiAgICBsZXQgcHJlcGFyZVBhcmFtID0gT2JqZWN0LmVudHJpZXM8c3RyaW5nPih0aGlzLnByZXBhcmVCYXRjaDxUPihwYXJhbSkpXHJcbiAgICBjb25zdCBzaXplID0gNTAgLy8g0LHQvtC70YzRiNC1INC90LUg0L7RgtC00LDRgdGCXHJcbiAgICBsZXQgc3ViYXJyYXkgPSBbXSAvL9C80LDRgdGB0LjQsiDQsiDQutC+0YLQvtGA0YvQuSDQsdGD0LTQtdGCINCy0YvQstC10LTQtdC9INGA0LXQt9GD0LvRjNGC0LDRgi5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTWF0aC5jZWlsKHByZXBhcmVQYXJhbS5sZW5ndGggLyBzaXplKTsgaSsrKSB7XHJcbiAgICAgIHN1YmFycmF5W2ldID0gcHJlcGFyZVBhcmFtLnNsaWNlKChpICogc2l6ZSksIChpICogc2l6ZSkgKyBzaXplKVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmb3JrSm9pbihcclxuICAgICAgc3ViYXJyYXkubWFwKGkgPT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBQb3N0KCdiYXRjaC5qc29uJywge1xyXG4gICAgICAgICAgaGFsdDogMCxcclxuICAgICAgICAgIGNtZDogT2JqZWN0LmFzc2lnbih7fSwgLi4uaS5tYXAoeCA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB7W3hbMF1dOiB4WzFdfVxyXG4gICAgICAgICAgfSkpXHJcbiAgICAgICAgfSlcclxuICAgICAgfSlcclxuICAgICkgYXMgT2JzZXJ2YWJsZTxpQmF0Y2hSZXF1ZXN0QW5zd2VyPEE+W10+XHJcbiAgfVxyXG5cclxuICBwcmVwYXJlQmF0Y2g8VD4ocGFyYW06IGlCYXRjaFJlcXVlc3RQYXJhbUFycjxUPiB8IGlCYXRjaFJlcXVlc3RQYXJhbTxUPltdKTogaUJhdGNoUmVxdWVzdFBhcmFtSHR0cCB7XHJcbiAgICBsZXQgcmVzOiBpQmF0Y2hSZXF1ZXN0UGFyYW1IdHRwID0gT2JqZWN0LmtleXMocGFyYW0pLnJlZHVjZShcclxuICAgICAgKG9iaiwga2V5KSA9PiB7XHJcbiAgICAgICAgb2JqW2tleV0gPSAnJ1xyXG4gICAgICAgIHJldHVybiBvYmpcclxuICAgICAgfSxcclxuICAgICAge30gYXMgaUJhdGNoUmVxdWVzdFBhcmFtSHR0cFxyXG4gICAgKVxyXG4gICAgZm9yIChsZXQga2V5IGluIHBhcmFtKSB7XHJcbiAgICAgIGlmICh0eXBlb2Yga2V5ID09PSAnc3RyaW5nJyB8fCB0eXBlb2Yga2V5ID09PSAnbnVtYmVyJyAmJiBwYXJhbVtrZXldLnBhcmFtKSB7XHJcbiAgICAgICAgcmVzW2tleV0gPSBwYXJhbVtrZXldLm5hbWUgKyAnPycgKyBzdHJpbmdpZnlCaXRyaXhQYXJhbXMocGFyYW1ba2V5XS5wYXJhbSlcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc1xyXG4gIH1cclxuXHJcbiAgbWFwQnJhbmNoUmVzdWx0PFQ+KHJlczogaUJhdGNoUmVxdWVzdEFuc3dlcjxUPltdKSB7XHJcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihbXSwgLi4ucmVzLm1hcChpID0+XHJcbiAgICAgIChpbnN0YW5jZU9maUJYUmVzdEFuc3dlclN1Y2Nlc3MoaSkgJiYgaW5zdGFuY2VPZmlCWFJlc3RBbnN3ZXJTdWNjZXNzKGkucmVzdWx0KSkgPyBpLnJlc3VsdC5yZXN1bHQgOiB1bmRlZmluZWQpXHJcbiAgICApIGFzIFJlY29yZDxrZXlCYXRjaCwgVD5cclxuICB9XHJcblxyXG4gIG1hcEJyYW5jaFJlc3VsdFdpdGhvdXRLZXk8VD4ocmVzOiBpQmF0Y2hSZXF1ZXN0QW5zd2VyPFQ+W10pOiBUW10ge1xyXG4gICAgcmV0dXJuIGZsYXR0ZW48VD4oT2JqZWN0LmFzc2lnbihbXSwgLi4ucmVzLm1hcChpID0+XHJcbiAgICAgIChpbnN0YW5jZU9maUJYUmVzdEFuc3dlclN1Y2Nlc3MoaSkgJiYgaW5zdGFuY2VPZmlCWFJlc3RBbnN3ZXJTdWNjZXNzKGkucmVzdWx0KSlcclxuICAgICAgICA/IGkucmVzdWx0LnJlc3VsdFxyXG4gICAgICAgIDogdW5kZWZpbmVkKSlcclxuICAgIClcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqINCe0YHQvdC+0LLQvdC+0Lkg0LzQtdGC0L7QtCDQtNC70Y8g0LfQsNC/0YDQvtGB0L7QslxyXG4gICAqXHJcbiAgICogQHBhcmFtIG5hbWVcclxuICAgKiBAcGFyYW0gcGFyYW1zXHJcbiAgICogQHBhcmFtIHJlc3RBcGlcclxuICAgKiBAcGFyYW0gaGVhZGVycyDQt9Cw0LPQvtC70L7QstC60Lgg0YLQvtC70YzQutC+INC00LvRjyDRjdGC0L7Qs9C+INC30LDQv9GA0L7RgdCwLCDQv9C+0LLQtdGA0YUgYEJYUmVzdFNldHRpbmdzLmhlYWRlcnNgXHJcbiAgICovXHJcbiAgcG9zdDxUPihuYW1lOiBzdHJpbmdbXSwgcGFyYW1zOiBhbnkgPSB7fSwgcmVzdEFwaSA9IGZhbHNlLCBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPikge1xyXG4gICAgY29uc3QgbWV0aG9kID0gdGhpcy5nZXROYW1lTWV0aG9kKG5hbWUpXHJcbiAgICByZXR1cm4gdGhpcy5odHRwUG9zdDxpQlhSZXN0QW5zd2VyPFQ+PihyZXN0QXBpID8gYGFwaS8ke21ldGhvZH1gIDogbWV0aG9kLCBwYXJhbXMsIHVuZGVmaW5lZCwgaGVhZGVycylcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqINCS0YLQvtGA0L7RgdGC0LXQv9C10L3QvdGL0Lkg0LzQtdGC0L7QtCDQtNC70Y8g0LfQsNC/0YDQvtGB0L7Qsi4g0J/QviDQstC+0LfQvNC+0LbQvdC+0YHRgtC4INC70YPRh9GI0LUg0L3QtSDQuNGB0L/QvtC70YzQt9C+0LLQsNGC0YxcclxuICAgKlxyXG4gICAqIEBwYXJhbSBuYW1lXHJcbiAgICogQHBhcmFtIHBhcmFtc1xyXG4gICAqIEBwYXJhbSBoZWFkZXJzINC30LDQs9C+0LvQvtCy0LrQuCDRgtC+0LvRjNC60L4g0LTQu9GPINGN0YLQvtCz0L4g0LfQsNC/0YDQvtGB0LAsINC/0L7QstC10YDRhSBgQlhSZXN0U2V0dGluZ3MuaGVhZGVyc2BcclxuICAgKi9cclxuICBnZXQ8VD4obmFtZTogc3RyaW5nW10sIHBhcmFtczogYW55ID0ge30sIGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KSB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwR2V0PGlCWFJlc3RBbnN3ZXI8VD4+KHRoaXMuZ2V0TmFtZU1ldGhvZChuYW1lKSwgcGFyYW1zLCB1bmRlZmluZWQsIGhlYWRlcnMpXHJcbiAgfVxyXG5cclxuICAvLyBzZXR0aW5ncyDigJQg0YLQvtC70YzQutC+INC00LvRjyDRgdC+0LLQvNC10YHRgtC40LzQvtGB0YLQuCDRgdC40LPQvdCw0YLRg9GA0Ysg0YEgSHR0cFNlcnZpY2VzOiDQt9C00LXRgdGMINGC0LXQu9C+XHJcbiAgLy8g0YPRhdC+0LTQuNGCIEpTT04t0L7QvC91cmxlbmNvZGVkLCDQuCDQv9C10YDQtdGB0YfRkdGCINC00LDRgiDQuNC3IGlIdHRwUGFyYW1TZXR0aW5ncyDQvdC1INC90YPQttC10L0uXHJcbiAgb3ZlcnJpZGUgaHR0cFBvc3Q8VD4oXHJcbiAgICB1cmw6IHN0cmluZyxcclxuICAgIHBhcmFtczogYW55ID0ge30sXHJcbiAgICBzZXR0aW5ncz86IGlIdHRwUGFyYW1TZXR0aW5ncyxcclxuICAgIGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XHJcbiAgKTogT2JzZXJ2YWJsZTxUIHwgdW5kZWZpbmVkPiB7XHJcbiAgICAvLyBkZWZlcigpINC+0YLQutC70LDQtNGL0LLQsNC10YIg0LLRgdGRINGB0L7QtNC10YDQttC40LzQvtC1ICjQsiDRgtC+0Lwg0YfQuNGB0LvQtSDRh9GC0LXQvdC40LUgQlhSZXN0U2V0dGluZ3NcclxuICAgIC8vINGH0LXRgNC10LcgdGhpcy5zZXNzaW9uLiopINC00L4g0YDQtdCw0LvRjNC90L7QuSDQv9C+0LTQv9C40YHQutC4IOKAlCDQuNC90LDRh9C1INC00LDQttC1INGBIFwi0LbQuNCy0YvQvFwiXHJcbiAgICAvLyDQs9C10YLRgtC10YDQvtC8INCyIFNlc3Npb25LZXlTZXJ2aWNlcyDQvdCw0YHRgtGA0L7QudC60Lgg0YfQuNGC0LDQu9C40YHRjCDQsdGLINCyINC80L7QvNC10L3RgiDQstGL0LfQvtCy0LBcclxuICAgIC8vIC5yZXMoKSwg0LAg0L3QtSDQsiDQvNC+0LzQtdC90YIgc3Vic2NyaWJlKCkvZmlyc3RWYWx1ZUZyb20oKSwg0YfRgtC+INC4INC+0LHQtdGJ0LDQvdC+XHJcbiAgICAvLyDQsiBSRUFETUUg0LrQsNC6INC/0L7QstC10LTQtdC90LjQtSBcItC70LXQvdC40LLQvtCz0L5cIiBSRVNULdCy0YvQt9C+0LLQsC5cclxuICAgIC8vXHJcbiAgICAvLyB3aXRoQXV0aFJlZnJlc2goKSDQv9C+0LLRgtC+0YDRj9C10YIg0LfQsNC/0YDQvtGBINC/0L7RgdC70LUgQlhSZXN0U2V0dGluZ3MuYXV0aC5yZWZyZXNoIOKAlFxyXG4gICAgLy8g0L/QvtCy0YLQvtGA0L3QvtC5INC/0L7QtNC/0LjRgdC60L7QuSDQvdCwINGN0YLQvtGCINC20LUgZGVmZXIoKSwg0L/QvtGN0YLQvtC80YMg0L/QvtCy0YLQvtGAINC30LDQvdC+0LLQviDRh9C40YLQsNC10YJcclxuICAgIC8vINGC0L7QutC10L0sINCw0LTRgNC10YEg0Lgg0LfQsNCz0L7Qu9C+0LLQutC4LiDQp9C10YDQtdC3IGh0dHBQb3N0L2h0dHBHZXQg0LjQtNGD0YIg0LLRgdC1INC30LDQv9GA0L7RgdGLXHJcbiAgICAvLyDQsdC40LHQu9C40L7RgtC10LrQuCAocG9zdC9nZXQsIGJhdGNoLCDQstGB0LUg0LLQuNC00YsgTmF2dnkt0LfQsNC/0YDQvtGB0L7QsiksINGC0LDQuiDRh9GC0L4g0L/QvtCy0YLQvtGAXHJcbiAgICAvLyDQstGB0YLRgNC+0LXQvSDRgtC+0LvRjNC60L4g0LfQtNC10YHRjC5cclxuICAgIHJldHVybiB3aXRoQXV0aFJlZnJlc2goZGVmZXIoKCkgPT4ge1xyXG4gICAgICBjb25zdCBwYXJhbXNDbG9uZSA9IGNsb25lKHBhcmFtcylcclxuICAgICAgY29uc3Qga2V5ID0gdGhpcy5zZXNzaW9uLmdldEtleUF1dGgoKVxyXG4gICAgICBjb25zdCBhdXRoID0gdGhpcy5zZXNzaW9uLmdldEF1dGhQYXJhbXMoKVxyXG4gICAgICBjb25zdCBjaGVja0lzT24gPSB0aGlzLnNlc3Npb24uZ2V0Q2hlY2tBdXRoUGFyYW1zSXNPbigpXHJcblxyXG4gICAgICBpZiAoY2hlY2tJc09uKSB7XHJcbiAgICAgICAgaWYgKCFhdXRoKSB7XHJcbiAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiB0aGlzLnNlc3Npb24uZ2V0QXV0aEVycm9yKCdwb3N0JykpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoa2V5ICE9PSAnT0F1dGgyJykge1xyXG4gICAgICAgICAgcGFyYW1zQ2xvbmVba2V5XSA9IGF1dGhcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiB0aGlzLnNlc3Npb24uZ2V0QmFzZVVybCgpLnBpcGUoXHJcbiAgICAgICAgc3dpdGNoTWFwKChiYXNlVXJsKSA9PiB7XHJcbiAgICAgICAgICBpZiAoIWJhc2VVcmwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gdGhpcy5zZXNzaW9uLmdldEJhc2VVcmxFcnJvcigncG9zdCcpKVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGNvbnN0IGZ1bGxVcmwgPSBwcmVwYXJlQmFzZUFkZHJlc3MoYmFzZVVybCkgKyB1cmxcclxuXHJcbiAgICAgICAgICBpZiAoa2V5ID09PSAnc2Vzc2lkJykge1xyXG4gICAgICAgICAgICAvLyDQn9GA0LXQvtCx0YDQsNC30YPQtdC8INC/0LDRgNCw0LzQtdGC0YDRiyDQsiDRhNC+0YDQvNCw0YIgeC13d3ctZm9ybS11cmxlbmNvZGVkXHJcbiAgICAgICAgICAgIGNvbnN0IGJvZHlTdHJpbmcgPSB0aGlzLnNlcmlhbGl6ZUJpdHJpeFBhcmFtcyhwYXJhbXNDbG9uZSlcclxuICAgICAgICAgICAgcmV0dXJuIGZyb20oXHJcbiAgICAgICAgICAgICAgdGhpcy5heGlvc0luc3RhbmNlLnBvc3Q8VD4oZnVsbFVybCwgYm9keVN0cmluZywge1xyXG4gICAgICAgICAgICAgICAgaGVhZGVyczogdGhpcy5idWlsZEhlYWRlcnMoaGVhZGVycywgeydDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJ30pLFxyXG4gICAgICAgICAgICAgIH0pLnRoZW4oKHJlc3BvbnNlKSA9PiByZXNwb25zZS5kYXRhKVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgcmV0dXJuIGZyb20oXHJcbiAgICAgICAgICAgIHRoaXMuYXhpb3NJbnN0YW5jZS5wb3N0PFQ+KGZ1bGxVcmwsIHBhcmFtc0Nsb25lLFxyXG4gICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5zZXNzaW9uLmdldFdpdGhDcmVkZW50aWFscygpLFxyXG4gICAgICAgICAgICAgICAgaGVhZGVyczogdGhpcy5idWlsZEhlYWRlcnMoaGVhZGVycywgeydDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbid9KSxcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICkudGhlbigocmVzcG9uc2UpID0+IHJlc3BvbnNlLmRhdGEpXHJcbiAgICAgICAgICApXHJcbiAgICAgICAgfSlcclxuICAgICAgKVxyXG4gICAgfSkpXHJcbiAgfVxyXG5cclxuICBvdmVycmlkZSBodHRwR2V0PFQ+KFxyXG4gICAgdXJsOiBzdHJpbmcsXHJcbiAgICBwYXJhbXM6IGFueSA9IHt9LFxyXG4gICAgc2V0dGluZ3M/OiBpSHR0cFBhcmFtU2V0dGluZ3MsXHJcbiAgICBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxyXG4gICk6IE9ic2VydmFibGU8VCB8IHVuZGVmaW5lZD4ge1xyXG4gICAgLy8g0KLQsCDQttC1INC/0YDQuNGH0LjQvdCwLCDRh9GC0L4g0Lgg0YMgaHR0cFBvc3Qg0LLRi9GI0LU6INC+0YLQutC70LDQtNGL0LLQsNC10Lwg0YfRgtC10L3QuNC1IEJYUmVzdFNldHRpbmdzXHJcbiAgICAvLyDQtNC+INC/0L7QtNC/0LjRgdC60LgsINGH0YLQvtCx0YsgYGdldCgpYCDQstGR0Lsg0YHQtdCx0Y8g0YLQsNC6INC20LUgXCLQu9C10L3QuNCy0L5cIiwg0LrQsNC6INC4IGBwb3N0KClgXHJcbiAgICAvLyAo0YHQuNC80LzQtdGC0YDQuNGPLCDQutC+0YLQvtGA0L7QuSDQvdC1INCx0YvQu9C+INC00L4g0Y3RgtC+0LPQviDigJQgR0VUINGA0LXQt9C+0LvQstC40Lsg0L3QsNGB0YLRgNC+0LnQutC4INCyINC80L7QvNC10L3RglxyXG4gICAgLy8g0LLRi9C30L7QstCwLCDQsCDQvdC1INCyINC80L7QvNC10L3RgiBzdWJzY3JpYmUoKSkuINCf0L7QstGC0L7RgCDQv9C+0YHQu9C1INC/0YDQvtC00LvQtdC90LjRj1xyXG4gICAgLy8g0LDQstGC0L7RgNC40LfQsNGG0LjQuCDigJQg0LrQsNC6INCyIGh0dHBQb3N0LlxyXG4gICAgcmV0dXJuIHdpdGhBdXRoUmVmcmVzaChkZWZlcigoKSA9PiB7XHJcbiAgICAgIGNvbnN0IHBhcmFtc0Nsb25lID0gY2xvbmUocGFyYW1zKVxyXG4gICAgICBjb25zdCBhdXRoID0gdGhpcy5zZXNzaW9uLmdldEF1dGhQYXJhbXMoKVxyXG4gICAgICBjb25zdCBjaGVja0lzT24gPSB0aGlzLnNlc3Npb24uZ2V0Q2hlY2tBdXRoUGFyYW1zSXNPbigpXHJcblxyXG4gICAgICBpZiAoY2hlY2tJc09uKSB7XHJcbiAgICAgICAgaWYgKCFhdXRoKSB7XHJcbiAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiB0aGlzLnNlc3Npb24uZ2V0QXV0aEVycm9yKCdnZXQnKSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHBhcmFtc0Nsb25lW3RoaXMuc2Vzc2lvbi5nZXRLZXlBdXRoKCldID0gYXV0aFxyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gdGhpcy5zZXNzaW9uLmdldEJhc2VVcmwoKS5waXBlKFxyXG4gICAgICAgIHN3aXRjaE1hcCgoYmFzZVVybCkgPT4ge1xyXG4gICAgICAgICAgaWYgKCFiYXNlVXJsKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IHRoaXMuc2Vzc2lvbi5nZXRCYXNlVXJsRXJyb3IoJ2dldCcpKVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGNvbnN0IGZ1bGxVcmwgPSBwcmVwYXJlQmFzZUFkZHJlc3MoYmFzZVVybCkgKyB1cmxcclxuICAgICAgICAgIGNvbnN0IHF1ZXJ5U3RyaW5nID0gbmV3IFVSTFNlYXJjaFBhcmFtcyhwYXJhbXNDbG9uZSkudG9TdHJpbmcoKVxyXG4gICAgICAgICAgY29uc3QgZmluYWxVcmwgPSBgJHtmdWxsVXJsfT8ke3F1ZXJ5U3RyaW5nfWBcclxuXHJcbiAgICAgICAgICByZXR1cm4gZnJvbShcclxuICAgICAgICAgICAgdGhpcy5heGlvc0luc3RhbmNlLmdldDxUPihmaW5hbFVybCwge1xyXG4gICAgICAgICAgICAgIGhlYWRlcnM6IHRoaXMuYnVpbGRIZWFkZXJzKGhlYWRlcnMpLFxyXG4gICAgICAgICAgICB9KS50aGVuKChyZXNwb25zZSkgPT4gcmVzcG9uc2UuZGF0YSlcclxuICAgICAgICAgIClcclxuICAgICAgICB9KVxyXG4gICAgICApXHJcbiAgICB9KSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqINCX0LDQs9C+0LvQvtCy0LrQuCDQt9Cw0L/RgNC+0YHQsDogYEJYUmVzdFNldHRpbmdzLmhlYWRlcnNgLCDQv9C+0LLQtdGA0YUg0L3QuNGFIOKAlCDQt9Cw0LPQvtC70L7QstC60LhcclxuICAgKiDQutC+0L3QutGA0LXRgtC90L7Qs9C+INC30LDQv9GA0L7RgdCwLCDQv9C+0LLQtdGA0YUg0LLRgdC10LPQviDigJQgYHJlcXVpcmVkYC4g0JIgYHJlcXVpcmVkYCDQuNC00ZHRglxyXG4gICAqIGBDb250ZW50LVR5cGVgOiDQvtGCINC90LXQs9C+INC30LDQstC40YHQuNGCLCDQutCw0Log0YHQtdGA0LLQtdGAINGA0LDQt9Cx0LXRgNGR0YIg0YLQtdC70L4sINC/0L7RjdGC0L7QvNGDXHJcbiAgICog0L/QvtC70YzQt9C+0LLQsNGC0LXQu9GM0YHQutC40LUg0LfQsNCz0L7Qu9C+0LLQutC4INC10LPQviDQvdC1INC/0LXRgNC10LHQuNCy0LDRjtGCLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgYnVpbGRIZWFkZXJzKGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LCByZXF1aXJlZDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9KSB7XHJcbiAgICByZXR1cm4geyAuLi50aGlzLnNlc3Npb24uZ2V0SGVhZGVycygpLCAuLi5oZWFkZXJzLCAuLi5yZXF1aXJlZCB9XHJcbiAgfVxyXG5cclxuICBzZXJpYWxpemVCaXRyaXhQYXJhbXMocGFyYW1zOiB1bmtub3duKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBzdHJpbmdpZnlCaXRyaXhQYXJhbXMocGFyYW1zKVxyXG4gIH1cclxuXHJcbiAgZ2V0TmFtZU1ldGhvZChhcnI6IHN0cmluZ1tdKSB7XHJcbiAgICByZXR1cm4gYXJyLmpvaW4oJy4nKVxyXG4gIH1cclxuXHJcbn1cclxuXHJcbiJdfQ==
|
|
200
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSHR0cEJYLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYngtcmVzdC9zcmMvc2VydmljZXMvaHR0cC9IdHRwQlgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQTtBQUM5RCxPQUFPLEtBQUssTUFBTSxZQUFZLENBQUE7QUFDOUIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLFFBQVEsQ0FBQTtBQUtyQyxPQUFPLE9BQU8sTUFBTSxpQkFBaUIsQ0FBQTtBQUNyQyxPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQTtBQUMxRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFDMUMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sU0FBUyxDQUFBO0FBQzVDLE9BQU8sRUFBRSxxQkFBcUIsSUFBSSxxQkFBcUIsRUFBRSxNQUFNLHVDQUF1QyxDQUFBO0FBRXRHLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFDL0MsT0FBTyxFQUF1QixpQkFBaUIsRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQUNwRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxjQUFjLENBQUE7QUFFaEQsTUFBTSxPQUFPLGNBQWUsU0FBUSxZQUFZO0lBRTlDOzs7O09BSUc7SUFDSCxNQUFNLENBQU8sS0FBeUQ7UUFFcEUsSUFBSSxZQUFZLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBUyxJQUFJLENBQUMsWUFBWSxDQUFJLEtBQUssQ0FBQyxDQUFDLENBQUE7UUFDdEUsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFBLENBQUMsbUJBQW1CO1FBQ25DLElBQUksUUFBUSxHQUFHLEVBQUUsQ0FBQSxDQUFDLDJDQUEyQztRQUM3RCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMs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QUMsTUFBTSxDQUFDLENBQUE7SUFDdEMsQ0FBQztJQUVELGFBQWEsQ0FBQyxHQUFhO1FBQ3pCLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUN0QixDQUFDO0NBRUYiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPYnNlcnZhYmxlLCB0aHJvd0Vycm9yLCBmb3JrSm9pbiwgZGVmZXIgfSBmcm9tICdyeGpzJ1xyXG5pbXBvcnQgY2xvbmUgZnJvbSAnanVzdC1jbG9uZSdcclxuaW1wb3J0IHsgSHR0cFNlcnZpY2VzIH0gZnJvbSAnLi9odHRwJ1xyXG5pbXBvcnQge1xyXG4gIGlCYXRjaFJlcXVlc3RBbnN3ZXIsIGlCYXRjaFJlcXVlc3RQYXJhbSwgaUJhdGNoUmVxdWVzdFBhcmFtQXJyLCBpQmF0Y2hSZXF1ZXN0UGFyYW1IdHRwLCBrZXlCYXRjaCxcclxufSBmcm9tICcuLi8uLi90eXBpZmljYXRpb24vcmVzdC9iYXRjaC9iYXRjaFJlcXVlc3RQYXJhbSdcclxuaW1wb3J0IHsgaUJYUmVzdEFuc3dlciB9IGZyb20gJy4uLy4uL3R5cGlmaWNhdGlvbi9yZXN0L2Jhc2UvYW5zd2VyJ1xyXG5pbXBvcnQgZmxhdHRlbiBmcm9tICdqdXN0LWZsYXR0ZW4taXQnXHJcbmltcG9ydCB7IGluc3RhbmNlT2ZpQlhSZXN0QW5zd2VyU3VjY2VzcyB9IGZyb20gJy4uLy4uL2Z1bmN0aW9ucy9tYXBSZXN1bHQnXHJcbmltcG9ydCB7IHN3aXRjaE1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJ1xyXG5pbXBvcnQgeyBwcmVwYXJlQmFzZUFkZHJlc3MgfSBmcm9tICcuLi9iYXNlJ1xyXG5pbXBvcnQgeyBzZXJpYWxpemVCaXRyaXhQYXJhbXMgYXMgc3RyaW5naWZ5Qml0cml4UGFyYW1zIH0gZnJvbSAnLi4vLi4vZnVuY3Rpb25zL3NlcmlhbGl6ZUJpdHJpeFBhcmFtcydcclxuaW1wb3J0IHsgaUh0dHBQYXJhbVNldHRpbmdzIH0gZnJvbSAnLi4vLi4vdHlwaWZpY2F0aW9uL3Jlc3Qvc2V0dGluZ3MnXHJcbmltcG9ydCB7IHdpdGhBdXRoUmVmcmVzaCB9IGZyb20gJy4vYXV0aFJlZnJlc2gnXHJcbmltcG9ydCB7IEJYUmVzdFJlcXVlc3RDb25maWcsIGNvbXBvc2VNaWRkbGV3YXJlIH0gZnJvbSAnLi90cmFuc3BvcnQnXHJcbmltcG9ydCB7IGJ1aWx0SW5NaWRkbGV3YXJlIH0gZnJvbSAnLi9taWRkbGV3YXJlJ1xyXG5cclxuZXhwb3J0IGNsYXNzIEh0dHBCWFNlcnZpY2VzIGV4dGVuZHMgSHR0cFNlcnZpY2VzIHtcclxuXHJcbiAgLyoqXHJcbiAgICog0J3QtSDRgdGH0LjRgtCw0LnRgtC1INGN0YLQvtGCINC80LXRgtC+0LQg0L7QsdGA0LDQt9GG0L7QvC/RhNC40L3QsNC70YzQvdGL0LwgQVBJLlxyXG4gICAqIFRPRE86INCj0LTQsNC70LjRgtGMINC00LDQvdC90YvQuSDQvNC10YLQvtC0INC/0L7RgdC70LUg0YDQtdCw0LvQuNC30LDRhtC40Lgg0LXQs9C+INCyINGA0LDQt9C00LXQu9C1IE5hdnZ5XHJcbiAgICogQHBhcmFtIHBhcmFtXHJcbiAgICovXHJcbiAgYnJhbmNoPFQsIEE+KHBhcmFtOiBpQmF0Y2hSZXF1ZXN0UGFyYW1BcnI8VD4gfCBpQmF0Y2hSZXF1ZXN0UGFyYW08VD5bXSlcclxuICAgIDogT2JzZXJ2YWJsZTxpQmF0Y2hSZXF1ZXN0QW5zd2VyPEE+W10gfCB1bmRlZmluZWQ+IHtcclxuICAgIGxldCBwcmVwYXJlUGFyYW0gPSBPYmplY3QuZW50cmllczxzdHJpbmc+KHRoaXMucHJlcGFyZUJhdGNoPFQ+KHBhcmFtKSlcclxuICAgIGNvbnN0IHNpemUgPSA1MCAvLyDQsdC+0LvRjNGI0LUg0L3QtSDQvtGC0LTQsNGB0YJcclxuICAgIGxldCBzdWJhcnJheSA9IFtdIC8v0LzQsNGB0YHQuNCyINCyINC60L7RgtC+0YDRi9C5INCx0YPQtNC10YIg0LLRi9Cy0LXQtNC10L0g0YDQtdC30YPQu9GM0YLQsNGCLlxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBNYXRoLmNlaWwocHJlcGFyZVBhcmFtLmxlbmd0aCAvIHNpemUpOyBpKyspIHtcclxuICAgICAgc3ViYXJyYXlbaV0gPSBwcmVwYXJlUGFyYW0uc2xpY2UoKGkgKiBzaXplKSwgKGkgKiBzaXplKSArIHNpemUpXHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZvcmtKb2luKFxyXG4gICAgICBzdWJhcnJheS5tYXAoaSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cFBvc3QoJ2JhdGNoLmpzb24nLCB7XHJcbiAgICAgICAgICBoYWx0OiAwLFxyXG4gICAgICAgICAgY21kOiBPYmplY3QuYXNzaWduKHt9LCAuLi5pLm1hcCh4ID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHtbeFswXV06IHhbMV19XHJcbiAgICAgICAgICB9KSlcclxuICAgICAgICB9KVxyXG4gICAgICB9KVxyXG4gICAgKSBhcyBPYnNlcnZhYmxlPGlCYXRjaFJlcXVlc3RBbnN3ZXI8QT5bXT5cclxuICB9XHJcblxyXG4gIHByZXBhcmVCYXRjaDxUPihwYXJhbTogaUJhdGNoUmVxdWVzdFBhcmFtQXJyPFQ+IHwgaUJhdGNoUmVxdWVzdFBhcmFtPFQ+W10pOiBpQmF0Y2hSZXF1ZXN0UGFyYW1IdHRwIHtcclxuICAgIGxldCByZXM6IGlCYXRjaFJlcXVlc3RQYXJhbUh0dHAgPSBPYmplY3Qua2V5cyhwYXJhbSkucmVkdWNlKFxyXG4gICAgICAob2JqLCBrZXkpID0+IHtcclxuICAgICAgICBvYmpba2V5XSA9ICcnXHJcbiAgICAgICAgcmV0dXJuIG9ialxyXG4gICAgICB9LFxyXG4gICAgICB7fSBhcyBpQmF0Y2hSZXF1ZXN0UGFyYW1IdHRwXHJcbiAgICApXHJcbiAgICBmb3IgKGxldCBrZXkgaW4gcGFyYW0pIHtcclxuICAgICAgaWYgKHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBrZXkgPT09ICdudW1iZXInICYmIHBhcmFtW2tleV0ucGFyYW0pIHtcclxuICAgICAgICByZXNba2V5XSA9IHBhcmFtW2tleV0ubmFtZSArICc/JyArIHN0cmluZ2lmeUJpdHJpeFBhcmFtcyhwYXJhbVtrZXldLnBhcmFtKVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzXHJcbiAgfVxyXG5cclxuICBtYXBCcmFuY2hSZXN1bHQ8VD4ocmVzOiBpQmF0Y2hSZXF1ZXN0QW5zd2VyPFQ+W10pIHtcclxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKFtdLCAuLi5yZXMubWFwKGkgPT5cclxuICAgICAgKGluc3RhbmNlT2ZpQlhSZXN0QW5zd2VyU3VjY2VzcyhpKSAmJiBpbnN0YW5jZU9maUJYUmVzdEFuc3dlclN1Y2Nlc3MoaS5yZXN1bHQpKSA/IGkucmVzdWx0LnJlc3VsdCA6IHVuZGVmaW5lZClcclxuICAgICkgYXMgUmVjb3JkPGtleUJhdGNoLCBUPlxyXG4gIH1cclxuXHJcbiAgbWFwQnJhbmNoUmVzdWx0V2l0aG91dEtleTxUPihyZXM6IGlCYXRjaFJlcXVlc3RBbnN3ZXI8VD5bXSk6IFRbXSB7XHJcbiAgICByZXR1cm4gZmxhdHRlbjxUPihPYmplY3QuYXNzaWduKFtdLCAuLi5yZXMubWFwKGkgPT5cclxuICAgICAgKGluc3RhbmNlT2ZpQlhSZXN0QW5zd2VyU3VjY2VzcyhpKSAmJiBpbnN0YW5jZU9maUJYUmVzdEFuc3dlclN1Y2Nlc3MoaS5yZXN1bHQpKVxyXG4gICAgICAgID8gaS5yZXN1bHQucmVzdWx0XHJcbiAgICAgICAgOiB1bmRlZmluZWQpKVxyXG4gICAgKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICog0J7RgdC90L7QstC90L7QuSDQvNC10YLQvtC0INC00LvRjyDQt9Cw0L/RgNC+0YHQvtCyXHJcbiAgICpcclxuICAgKiBAcGFyYW0gbmFtZVxyXG4gICAqIEBwYXJhbSBwYXJhbXNcclxuICAgKiBAcGFyYW0gcmVzdEFwaVxyXG4gICAqIEBwYXJhbSBoZWFkZXJzINC30LDQs9C+0LvQvtCy0LrQuCDRgtC+0LvRjNC60L4g0LTQu9GPINGN0YLQvtCz0L4g0LfQsNC/0YDQvtGB0LAsINC/0L7QstC10YDRhSBgQlhSZXN0U2V0dGluZ3MuaGVhZGVyc2BcclxuICAgKi9cclxuICBwb3N0PFQ+KG5hbWU6IHN0cmluZ1tdLCBwYXJhbXM6IGFueSA9IHt9LCByZXN0QXBpID0gZmFsc2UsIGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KSB7XHJcbiAgICBjb25zdCBtZXRob2QgPSB0aGlzLmdldE5hbWVNZXRob2QobmFtZSlcclxuICAgIHJldHVybiB0aGlzLmh0dHBQb3N0PGlCWFJlc3RBbnN3ZXI8VD4+KHJlc3RBcGkgPyBgYXBpLyR7bWV0aG9kfWAgOiBtZXRob2QsIHBhcmFtcywgdW5kZWZpbmVkLCBoZWFkZXJzKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICog0JLRgtC+0YDQvtGB0YLQtdC/0LXQvdC90YvQuSDQvNC10YLQvtC0INC00LvRjyDQt9Cw0L/RgNC+0YHQvtCyLiDQn9C+INCy0L7Qt9C80L7QttC90L7RgdGC0Lgg0LvRg9GH0YjQtSDQvdC1INC40YHQv9C+0LvRjNC30L7QstCw0YLRjFxyXG4gICAqXHJcbiAgICogQHBhcmFtIG5hbWVcclxuICAgKiBAcGFyYW0gcGFyYW1zXHJcbiAgICogQHBhcmFtIGhlYWRlcnMg0LfQsNCz0L7Qu9C+0LLQutC4INGC0L7Qu9GM0LrQviDQtNC70Y8g0Y3RgtC+0LPQviDQt9Cw0L/RgNC+0YHQsCwg0L/QvtCy0LXRgNGFIGBCWFJlc3RTZXR0aW5ncy5oZWFkZXJzYFxyXG4gICAqL1xyXG4gIGdldDxUPihuYW1lOiBzdHJpbmdbXSwgcGFyYW1zOiBhbnkgPSB7fSwgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pIHtcclxuICAgIHJldHVybiB0aGlzLmh0dHBHZXQ8aUJYUmVzdEFuc3dlcjxUPj4odGhpcy5nZXROYW1lTWV0aG9kKG5hbWUpLCBwYXJhbXMsIHVuZGVmaW5lZCwgaGVhZGVycylcclxuICB9XHJcblxyXG4gIC8vIHNldHRpbmdzINC90LUg0LjRgdC/0L7Qu9GM0LfRg9C10YLRgdGPINC4INC+0YHRgtCw0LLQu9C10L0g0YDQsNC00Lgg0L/RgNC10LbQvdC10Lkg0YHQuNCz0L3QsNGC0YPRgNGLOiBoZWFkZXJzXHJcbiAgLy8g0L7RgdGC0LDRkdGC0YHRjyDRh9C10YLQstGR0YDRgtGL0Lwg0L/QsNGA0LDQvNC10YLRgNC+0Lwg0YMgaHR0cFBvc3Qg0LggaHR0cEdldC5cclxuICBodHRwUG9zdDxUPihcclxuICAgIHVybDogc3RyaW5nLFxyXG4gICAgcGFyYW1zOiBhbnkgPSB7fSxcclxuICAgIHNldHRpbmdzPzogaUh0dHBQYXJhbVNldHRpbmdzLFxyXG4gICAgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cclxuICApOiBPYnNlcnZhYmxlPFQgfCB1bmRlZmluZWQ+IHtcclxuICAgIC8vIGRlZmVyKCkg0L7RgtC60LvQsNC00YvQstCw0LXRgiDQstGB0ZEg0YHQvtC00LXRgNC20LjQvNC+0LUgKNCyINGC0L7QvCDRh9C40YHQu9C1INGH0YLQtdC90LjQtSBCWFJlc3RTZXR0aW5nc1xyXG4gICAgLy8g0YfQtdGA0LXQtyB0aGlzLnNlc3Npb24uKikg0LTQviDRgNC10LDQu9GM0L3QvtC5INC/0L7QtNC/0LjRgdC60Lgg4oCUINC40L3QsNGH0LUg0LTQsNC20LUg0YEgXCLQttC40LLRi9C8XCJcclxuICAgIC8vINCz0LXRgtGC0LXRgNC+0Lwg0LIgU2Vzc2lvbktleVNlcnZpY2VzINC90LDRgdGC0YDQvtC50LrQuCDRh9C40YLQsNC70LjRgdGMINCx0Ysg0LIg0LzQvtC80LXQvdGCINCy0YvQt9C+0LLQsFxyXG4gICAgLy8gLnJlcygpLCDQsCDQvdC1INCyINC80L7QvNC10L3RgiBzdWJzY3JpYmUoKS9maXJzdFZhbHVlRnJvbSgpLCDRh9GC0L4g0Lgg0L7QsdC10YnQsNC90L5cclxuICAgIC8vINCyIFJFQURNRSDQutCw0Log0L/QvtCy0LXQtNC10L3QuNC1IFwi0LvQtdC90LjQstC+0LPQvlwiIFJFU1Qt0LLRi9C30L7QstCwLlxyXG4gICAgLy9cclxuICAgIC8vIHdpdGhBdXRoUmVmcmVzaCgpINC/0L7QstGC0L7RgNGP0LXRgiDQt9Cw0L/RgNC+0YEg0L/QvtGB0LvQtSBCWFJlc3RTZXR0aW5ncy5hdXRoLnJlZnJlc2gg4oCUXHJcbiAgICAvLyDQv9C+0LLRgtC+0YDQvdC+0Lkg0L/QvtC00L/QuNGB0LrQvtC5INC90LAg0Y3RgtC+0YIg0LbQtSBkZWZlcigpLCDQv9C+0Y3RgtC+0LzRgyDQv9C+0LLRgtC+0YAg0LfQsNC90L7QstC+INGH0LjRgtCw0LXRglxyXG4gICAgLy8g0YLQvtC60LXQvSwg0LDQtNGA0LXRgSDQuCDQt9Cw0LPQvtC70L7QstC60LguINCn0LXRgNC10LcgaHR0cFBvc3QvaHR0cEdldCDQuNC00YPRgiDQstGB0LUg0LfQsNC/0YDQvtGB0YtcclxuICAgIC8vINCx0LjQsdC70LjQvtGC0LXQutC4IChwb3N0L2dldCwgYmF0Y2gsINCy0YHQtSDQstC40LTRiyBOYXZ2eS3Qt9Cw0L/RgNC+0YHQvtCyKSwg0YLQsNC6INGH0YLQviDQv9C+0LLRgtC+0YBcclxuICAgIC8vINCy0YHRgtGA0L7QtdC9INGC0L7Qu9GM0LrQviDQt9C00LXRgdGMLlxyXG4gICAgcmV0dXJuIHdpdGhBdXRoUmVmcmVzaChkZWZlcigoKSA9PiB7XHJcbiAgICAgIGNvbnN0IHBhcmFtc0Nsb25lID0gY2xvbmUocGFyYW1zKVxyXG4gICAgICBjb25zdCBrZXkgPSB0aGlzLnNlc3Npb24uZ2V0S2V5QXV0aCgpXHJcbiAgICAgIGNvbnN0IGF1dGggPSB0aGlzLnNlc3Npb24uZ2V0QXV0aFBhcmFtcygpXHJcbiAgICAgIGNvbnN0IGNoZWNrSXNPbiA9IHRoaXMuc2Vzc2lvbi5nZXRDaGVja0F1dGhQYXJhbXNJc09uKClcclxuXHJcbiAgICAgIGlmIChjaGVja0lzT24pIHtcclxuICAgICAgICBpZiAoIWF1dGgpIHtcclxuICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IHRoaXMuc2Vzc2lvbi5nZXRBdXRoRXJyb3IoJ3Bvc3QnKSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChrZXkgIT09ICdPQXV0aDInKSB7XHJcbiAgICAgICAgICBwYXJhbXNDbG9uZVtrZXldID0gYXV0aFxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIHRoaXMuc2Vzc2lvbi5nZXRCYXNlVXJsKCkucGlwZShcclxuICAgICAgICBzd2l0Y2hNYXAoKGJhc2VVcmwpID0+IHtcclxuICAgICAgICAgIGlmICghYmFzZVVybCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiB0aGlzLnNlc3Npb24uZ2V0QmFzZVVybEVycm9yKCdwb3N0JykpXHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgY29uc3QgZnVsbFVybCA9IHByZXBhcmVCYXNlQWRkcmVzcyhiYXNlVXJsKSArIHVybFxyXG4gICAgICAgICAgLy8gc2Vzc2lkIOKAlCDRgtC10LvQviB4LXd3dy1mb3JtLXVybGVuY29kZWQsINC+0YHRgtCw0LvRjNC90YvQtSDQutC70Y7Rh9C4IOKAlCBKU09OXHJcbiAgICAgICAgICBjb25zdCB1cmxlbmNvZGVkID0ga2V5ID09PSAnc2Vzc2lkJ1xyXG5cclxuICAgICAgICAgIHJldHVybiB0aGlzLnNlbmQ8VD4oe1xyXG4gICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcclxuICAgICAgICAgICAgdXJsOiBmdWxsVXJsLFxyXG4gICAgICAgICAgICBkYXRhOiB1cmxlbmNvZGVkID8gdGhpcy5zZXJpYWxpemVCaXRyaXhQYXJhbXMocGFyYW1zQ2xvbmUpIDogcGFyYW1zQ2xvbmUsXHJcbiAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5zZXNzaW9uLmdldFdpdGhDcmVkZW50aWFscygpLFxyXG4gICAgICAgICAgICBoZWFkZXJzOiB0aGlzLmJ1aWxkSGVhZGVycyhoZWFkZXJzLCB7XHJcbiAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6IHVybGVuY29kZWQgPyAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyA6ICdhcHBsaWNhdGlvbi9qc29uJ1xyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgfSlcclxuICAgICAgKVxyXG4gICAgfSksIHRoaXMuc2Vzc2lvbi5jdHgpXHJcbiAgfVxyXG5cclxuICBodHRwR2V0PFQ+KFxyXG4gICAgdXJsOiBzdHJpbmcsXHJcbiAgICBwYXJhbXM6IGFueSA9IHt9LFxyXG4gICAgc2V0dGluZ3M/OiBpSHR0cFBhcmFtU2V0dGluZ3MsXHJcbiAgICBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxyXG4gICk6IE9ic2VydmFibGU8VCB8IHVuZGVmaW5lZD4ge1xyXG4gICAgLy8g0KLQsCDQttC1INC/0YDQuNGH0LjQvdCwLCDRh9GC0L4g0Lgg0YMgaHR0cFBvc3Qg0LLRi9GI0LU6INC+0YLQutC70LDQtNGL0LLQsNC10Lwg0YfRgtC10L3QuNC1IEJYUmVzdFNldHRpbmdzXHJcbiAgICAvLyDQtNC+INC/0L7QtNC/0LjRgdC60LgsINGH0YLQvtCx0YsgYGdldCgpYCDQstGR0Lsg0YHQtdCx0Y8g0YLQsNC6INC20LUgXCLQu9C10L3QuNCy0L5cIiwg0LrQsNC6INC4IGBwb3N0KClgXHJcbiAgICAvLyAo0YHQuNC80LzQtdGC0YDQuNGPLCDQutC+0YLQvtGA0L7QuSDQvdC1INCx0YvQu9C+INC00L4g0Y3RgtC+0LPQviDigJQgR0VUINGA0LXQt9C+0LvQstC40Lsg0L3QsNGB0YLRgNC+0LnQutC4INCyINC80L7QvNC10L3RglxyXG4gICAgLy8g0LLRi9C30L7QstCwLCDQsCDQvdC1INCyINC80L7QvNC10L3RgiBzdWJzY3JpYmUoKSkuINCf0L7QstGC0L7RgCDQv9C+0YHQu9C1INC/0YDQvtC00LvQtdC90LjRj1xyXG4gICAgLy8g0LDQstGC0L7RgNC40LfQsNGG0LjQuCDigJQg0LrQsNC6INCyIGh0dHBQb3N0LlxyXG4gICAgcmV0dXJuIHdpdGhBdXRoUmVmcmVzaChkZWZlcigoKSA9PiB7XHJcbiAgICAgIGNvbnN0IHBhcmFtc0Nsb25lID0gY2xvbmUocGFyYW1zKVxyXG4gICAgICBjb25zdCBrZXkgPSB0aGlzLnNlc3Npb24uZ2V0S2V5QXV0aCgpXHJcbiAgICAgIGNvbnN0IGF1dGggPSB0aGlzLnNlc3Npb24uZ2V0QXV0aFBhcmFtcygpXHJcbiAgICAgIGNvbnN0IGNoZWNrSXNPbiA9IHRoaXMuc2Vzc2lvbi5nZXRDaGVja0F1dGhQYXJhbXNJc09uKClcclxuXHJcbiAgICAgIGlmIChjaGVja0lzT24pIHtcclxuICAgICAgICBpZiAoIWF1dGgpIHtcclxuICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IHRoaXMuc2Vzc2lvbi5nZXRBdXRoRXJyb3IoJ2dldCcpKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGtleSAhPT0gJ09BdXRoMicpIHtcclxuICAgICAgICAgIHBhcmFtc0Nsb25lW2tleV0gPSBhdXRoXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gdGhpcy5zZXNzaW9uLmdldEJhc2VVcmwoKS5waXBlKFxyXG4gICAgICAgIHN3aXRjaE1hcCgoYmFzZVVybCkgPT4ge1xyXG4gICAgICAgICAgaWYgKCFiYXNlVXJsKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IHRoaXMuc2Vzc2lvbi5nZXRCYXNlVXJsRXJyb3IoJ2dldCcpKVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGNvbnN0IGZ1bGxVcmwgPSBwcmVwYXJlQmFzZUFkZHJlc3MoYmFzZVVybCkgKyB1cmxcclxuICAgICAgICAgIGNvbnN0IHF1ZXJ5U3RyaW5nID0gdGhpcy5zZXJpYWxpemVCaXRyaXhQYXJhbXMocGFyYW1zQ2xvbmUpXHJcbiAgICAgICAgICBjb25zdCBmaW5hbFVybCA9IGAke2Z1bGxVcmx9PyR7cXVlcnlTdHJpbmd9YFxyXG5cclxuICAgICAgICAgIHJldHVybiB0aGlzLnNlbmQ8VD4oe1xyXG4gICAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxyXG4gICAgICAgICAgICB1cmw6IGZpbmFsVXJsLFxyXG4gICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuc2Vzc2lvbi5nZXRXaXRoQ3JlZGVudGlhbHMoKSxcclxuICAgICAgICAgICAgaGVhZGVyczogdGhpcy5idWlsZEhlYWRlcnMoaGVhZGVycyksXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH0pXHJcbiAgICAgIClcclxuICAgIH0pLCB0aGlzLnNlc3Npb24uY3R4KVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICog0J7RgtC/0YDQsNCy0LrQsCDRh9C10YDQtdC3INGI0LDQs9C4INC40Lcg0L3QsNGB0YLRgNC+0LXQujogYHJldHJ5T25RdWVyeUxpbWl0YCwgYHRocm90dGxlYCxcclxuICAgKiBgdGltZW91dGAsINC30LDRgtC10LwgYG1pZGRsZXdhcmVgOyDQv9C+0YHQu9C10LTQvdC40Lwg0LjQtNGR0YIgYXhpb3Mg0LrQu9C40LXQvdGC0LAuINCd0LDRgdGC0YDQvtC50LrQuFxyXG4gICAqINGH0LjRgtCw0Y7RgtGB0Y8g0L/RgNC4INC/0L7QtNC/0LjRgdC60LUuINCe0YLQv9C40YHQutCwINC+0YLQvNC10L3Rj9C10YIgSFRUUC3Qt9Cw0L/RgNC+0YEgKEFib3J0U2lnbmFsKS5cclxuICAgKiDQntGI0LjQsdC60LAg0YLRgNCw0L3RgdC/0L7RgNGC0LAg0YPRhdC+0LTQuNGCINC00LDQu9GM0YjQtSDQutCw0Log0LXRgdGC0Yw6INGDIGF4aW9zINCyINC90LXQuSDQstC10YHRjCDQt9Cw0L/RgNC+0YEsXHJcbiAgICog0LLQvNC10YHRgtC1INGBINGC0L7QutC10L3QvtC8INC4INGB0LXQutGA0LXRgtC+0Lwg0LLQtdCx0YXRg9C60LAgKNGB0LwuIFJFQURNRSwgwqvQntCx0YDQsNCx0L7RgtC60LAg0L7RiNC40LHQvtC6wrspLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgc2VuZDxUPihjb25maWc6IEJYUmVzdFJlcXVlc3RDb25maWcpOiBPYnNlcnZhYmxlPFQgfCB1bmRlZmluZWQ+IHtcclxuICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZTxUIHwgdW5kZWZpbmVkPihzdWJzY3JpYmVyID0+IHtcclxuICAgICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKVxyXG4gICAgICBjb25zdCBjdHggPSB0aGlzLnNlc3Npb24uY3R4XHJcbiAgICAgIGNvbnN0IHNlbmQgPSBjb21wb3NlTWlkZGxld2FyZShcclxuICAgICAgICBbLi4uYnVpbHRJbk1pZGRsZXdhcmUoY3R4LnNldHRpbmdzLCBjdHgpLCAuLi50aGlzLnNlc3Npb24uZ2V0TWlkZGxld2FyZSgpXSxcclxuICAgICAgICByZXF1ZXN0ID0+IHRoaXMuYXhpb3NTZW5kKHJlcXVlc3QpXHJcbiAgICAgIClcclxuICAgICAgc2VuZCh7IC4uLmNvbmZpZywgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCB9KS50aGVuKFxyXG4gICAgICAgIGRhdGEgPT4ge1xyXG4gICAgICAgICAgc3Vic2NyaWJlci5uZXh0KGRhdGEgYXMgVCB8IHVuZGVmaW5lZClcclxuICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgKGVycm9yOiB1bmtub3duKSA9PiBzdWJzY3JpYmVyLmVycm9yKGVycm9yKVxyXG4gICAgICApXHJcbiAgICAgIHJldHVybiAoKSA9PiBjb250cm9sbGVyLmFib3J0KClcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICAvKiog0KLRgNCw0L3RgdC/0L7RgNGCINC/0L4g0YPQvNC+0LvRh9Cw0L3QuNGOOiBheGlvcyDQutC70LjQtdC90YLQsCwg0LrQsNC6INC4INGA0LDQvdGM0YjQtSDRh9C10YDQtdC3IHBvc3QoKS9nZXQoKS4gKi9cclxuICBwcml2YXRlIGF4aW9zU2VuZChjb25maWc6IEJYUmVzdFJlcXVlc3RDb25maWcpOiBQcm9taXNlPHVua25vd24+IHtcclxuICAgIGNvbnN0IG9wdGlvbnMgPSB7IGhlYWRlcnM6IGNvbmZpZy5oZWFkZXJzLCB3aXRoQ3JlZGVudGlhbHM6IGNvbmZpZy53aXRoQ3JlZGVudGlhbHMsIHNpZ25hbDogY29uZmlnLnNpZ25hbCB9XHJcbiAgICBjb25zdCByZXF1ZXN0ID0gKGNvbmZpZy5tZXRob2QgPT09ICdHRVQnKVxyXG4gICAgICA/IHRoaXMuYXhpb3NJbnN0YW5jZS5nZXQoY29uZmlnLnVybCwgb3B0aW9ucylcclxuICAgICAgOiB0aGlzLmF4aW9zSW5zdGFuY2UucG9zdChjb25maWcudXJsLCBjb25maWcuZGF0YSwgb3B0aW9ucylcclxuICAgIHJldHVybiByZXF1ZXN0LnRoZW4ocmVzcG9uc2UgPT4gcmVzcG9uc2UuZGF0YSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqINCX0LDQs9C+0LvQvtCy0LrQuCDQt9Cw0L/RgNC+0YHQsDogYEJYUmVzdFNldHRpbmdzLmhlYWRlcnNgLCDQv9C+0LLQtdGA0YUg0L3QuNGFIOKAlCDQt9Cw0LPQvtC70L7QstC60LhcclxuICAgKiDQutC+0L3QutGA0LXRgtC90L7Qs9C+INC30LDQv9GA0L7RgdCwLCDQv9C+0LLQtdGA0YUg0LLRgdC10LPQviDigJQgYHJlcXVpcmVkYC4g0JIgYHJlcXVpcmVkYCDQuNC00ZHRglxyXG4gICAqIGBDb250ZW50LVR5cGVgOiDQvtGCINC90LXQs9C+INC30LDQstC40YHQuNGCLCDQutCw0Log0YHQtdGA0LLQtdGAINGA0LDQt9Cx0LXRgNGR0YIg0YLQtdC70L4sINC/0L7RjdGC0L7QvNGDXHJcbiAgICog0L/QvtC70YzQt9C+0LLQsNGC0LXQu9GM0YHQutC40LUg0LfQsNCz0L7Qu9C+0LLQutC4INC10LPQviDQvdC1INC/0LXRgNC10LHQuNCy0LDRjtGCLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgYnVpbGRIZWFkZXJzKGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LCByZXF1aXJlZDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9KSB7XHJcbiAgICByZXR1cm4geyAuLi50aGlzLnNlc3Npb24uZ2V0SGVhZGVycygpLCAuLi5oZWFkZXJzLCAuLi5yZXF1aXJlZCB9XHJcbiAgfVxyXG5cclxuICBzZXJpYWxpemVCaXRyaXhQYXJhbXMocGFyYW1zOiB1bmtub3duKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBzdHJpbmdpZnlCaXRyaXhQYXJhbXMocGFyYW1zKVxyXG4gIH1cclxuXHJcbiAgZ2V0TmFtZU1ldGhvZChhcnI6IHN0cmluZ1tdKSB7XHJcbiAgICByZXR1cm4gYXJyLmpvaW4oJy4nKVxyXG4gIH1cclxuXHJcbn1cclxuXHJcbiJdfQ==
|