@smarterplan/ngx-smarterplan-core 1.4.21 → 1.4.22
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/README.md +24 -24
- package/esm2022/lib/components/csv-export/csv-export.component.mjs +3 -3
- package/esm2022/lib/components/loader/loader.component.mjs +3 -3
- package/esm2022/lib/components/menu-bar/avatar/avatar.component.mjs +1 -1
- package/esm2022/lib/components/menu-bar/menu-bar.component.mjs +3 -3
- package/esm2022/lib/components/menu-bar/navigation-bar/navigation-bar.component.mjs +3 -3
- package/esm2022/lib/components/modal-switch-visit/modal-switch-visit.component.mjs +3 -3
- package/esm2022/lib/components/search-bar/search-bar.component.mjs +3 -3
- package/esm2022/lib/components/splat-viewer/splat-viewer.component.mjs +361 -0
- package/esm2022/lib/components/support-modal/support-modal.component.mjs +3 -3
- package/esm2022/lib/config.mjs +1 -1
- package/esm2022/lib/helpers.service.mjs +1 -1
- package/esm2022/lib/matterport-extensions/nest-thermostat/CanvasImage.mjs +1 -1
- package/esm2022/lib/matterport-extensions/nest-thermostat/CanvasRenderer.mjs +1 -1
- package/esm2022/lib/matterport-extensions/nest-thermostat/NestThermostat.mjs +1 -1
- package/esm2022/lib/matterport-extensions/nest-thermostat/PlaneRenderer.mjs +1 -1
- package/esm2022/lib/matterport-extensions/scene-component/SceneComponent.mjs +1 -1
- package/esm2022/lib/matterport-extensions/security-camera/SecurityCamera.mjs +22 -22
- package/esm2022/lib/matterport-extensions/tv-player/TvPlayer.mjs +1 -1
- package/esm2022/lib/matterport-extensions/view-frustum-mesh/ViewFrustumMesh.mjs +22 -22
- package/esm2022/lib/mattertagData.mjs +1 -1
- package/esm2022/lib/ngx-smarterplan-core.module.mjs +9 -4
- package/esm2022/lib/ngx-smarterplan-core.service.mjs +1 -1
- package/esm2022/lib/pipes/duration-to-string.pipe.mjs +1 -1
- package/esm2022/lib/pipes/format-date-number-to-digits.pipe.mjs +1 -1
- package/esm2022/lib/pipes/hashtag-from-id.pipe.mjs +1 -1
- package/esm2022/lib/pipes/safe-url.pipe.mjs +1 -1
- package/esm2022/lib/pipes/time-date-to-local-string.pipe.mjs +1 -1
- package/esm2022/lib/pipes/username-from-id.pipe.mjs +1 -1
- package/esm2022/lib/services/amplify-cache.service.mjs +1 -1
- package/esm2022/lib/services/base-tab.service.mjs +1 -1
- package/esm2022/lib/services/baseVisibility.service.mjs +1 -1
- package/esm2022/lib/services/content.service.mjs +1 -1
- package/esm2022/lib/services/filter.service.mjs +1 -1
- package/esm2022/lib/services/intervention.service.mjs +1 -1
- package/esm2022/lib/services/locale.service.mjs +1 -1
- package/esm2022/lib/services/matterport-import.service.mjs +1 -1
- package/esm2022/lib/services/matterport-measurement.service.mjs +1 -1
- package/esm2022/lib/services/matterport-navigation.service.mjs +1 -1
- package/esm2022/lib/services/matterport-pointer.service.mjs +6 -6
- package/esm2022/lib/services/matterport-tag-copy.service.mjs +1 -1
- package/esm2022/lib/services/matterport-tag.service.mjs +12 -7
- package/esm2022/lib/services/matterport.service.mjs +17 -17
- package/esm2022/lib/services/models/affectation.service.mjs +1 -1
- package/esm2022/lib/services/models/base-object.service.mjs +1 -1
- package/esm2022/lib/services/models/capture.service.mjs +1 -1
- package/esm2022/lib/services/models/comment.service.mjs +1 -1
- package/esm2022/lib/services/models/domain.service.mjs +1 -1
- package/esm2022/lib/services/models/equipment.service.mjs +1 -1
- package/esm2022/lib/services/models/event.service.mjs +1 -1
- package/esm2022/lib/services/models/feature.service.mjs +1 -1
- package/esm2022/lib/services/models/hashtag.service.mjs +1 -1
- package/esm2022/lib/services/models/layer.service.mjs +1 -1
- package/esm2022/lib/services/models/measurement.service.mjs +1 -1
- package/esm2022/lib/services/models/mission.service.mjs +1 -1
- package/esm2022/lib/services/models/navigation.service.mjs +1 -1
- package/esm2022/lib/services/models/node.service.mjs +1 -1
- package/esm2022/lib/services/models/object3D.service.mjs +1 -1
- package/esm2022/lib/services/models/operation.service.mjs +1 -1
- package/esm2022/lib/services/models/organisation.service.mjs +1 -1
- package/esm2022/lib/services/models/plan.service.mjs +1 -1
- package/esm2022/lib/services/models/poi.service.mjs +27 -27
- package/esm2022/lib/services/models/profile.service.mjs +1 -1
- package/esm2022/lib/services/models/property.service.mjs +1 -1
- package/esm2022/lib/services/models/space.service.mjs +1 -1
- package/esm2022/lib/services/models/template.service.mjs +1 -1
- package/esm2022/lib/services/models/ticket.service.mjs +1 -1
- package/esm2022/lib/services/models/visit.service.mjs +1 -1
- package/esm2022/lib/services/models/zone.service.mjs +1 -1
- package/esm2022/lib/services/navigator.service.mjs +1 -1
- package/esm2022/lib/services/obj-to-glb.mjs +649 -0
- package/esm2022/lib/services/s3.service.mjs +43 -3
- package/esm2022/lib/services/search.service.mjs +1 -1
- package/esm2022/lib/services/support.service.mjs +1 -1
- package/esm2022/lib/services/sweep-locator.service.mjs +1 -1
- package/esm2022/lib/services/tag.service.mjs +16 -16
- package/esm2022/lib/services/threejs-import.service.mjs +6 -4
- package/esm2022/lib/services/threejs.service.mjs +867 -95
- package/esm2022/lib/services/user.service.mjs +1 -1
- package/esm2022/lib/services/utils/matterport-transform.util.mjs +1 -1
- package/esm2022/lib/services/validators.service.mjs +1 -1
- package/esm2022/lib/services/viewer.service.mjs +189 -7
- package/esm2022/lib/services/zone-drawer.service.mjs +1 -1
- package/esm2022/lib/services/zoneChange.service.mjs +1 -1
- package/esm2022/lib/tokens/matterport-sdk-key.token.mjs +1 -1
- package/esm2022/lib/validators/email.directive.mjs +1 -1
- package/esm2022/lib/validators/no-empty.directive.mjs +1 -1
- package/esm2022/lib/validators/number.directive.mjs +1 -1
- package/esm2022/lib/validators/text.directive.mjs +1 -1
- package/esm2022/public-api.mjs +3 -1
- package/fesm2022/smarterplan-ngx-smarterplan-core.mjs +2239 -233
- package/fesm2022/smarterplan-ngx-smarterplan-core.mjs.map +1 -1
- package/lib/components/splat-viewer/splat-viewer.component.d.ts +98 -0
- package/lib/ngx-smarterplan-core.module.d.ts +7 -6
- package/lib/services/matterport-tag.service.d.ts +5 -5
- package/lib/services/obj-to-glb.d.ts +66 -0
- package/lib/services/s3.service.d.ts +7 -0
- package/lib/services/threejs.service.d.ts +336 -16
- package/lib/services/viewer.service.d.ts +110 -8
- package/package.json +1 -1
- package/public-api.d.ts +2 -0
- package/src/assets/viewers/splat/chunk-BYLI4YBI.js +17037 -0
- package/src/assets/viewers/splat/chunk-LDV6YPMG.js +1 -0
- package/src/assets/viewers/splat/chunk-WZ5Z4TU3.js +105719 -0
- package/src/assets/viewers/splat/convert-4DRLH77X.js +1 -0
- package/src/assets/viewers/splat/convert.html +11 -0
- package/src/assets/viewers/splat/converter-SLBB5MHG.js +1 -0
- package/src/assets/viewers/splat/index.html +90 -0
- package/src/assets/viewers/splat/spz-DEYRea_v-QE6YSGIB.js +5292 -0
- package/src/assets/viewers/splat/viewer-W4X3FWQJ.js +2704 -0
- package/src/assets/viewers/splat/viewer.css +1096 -0
- package/src/assets/viewers/splat/webp.wasm +0 -0
- package/src/assets/viewers/splat/worker.mjs +1383 -0
- package/src/assets/vs-app.json +67 -67
|
@@ -2337,4 +2337,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
2337
2337
|
type: Injectable,
|
|
2338
2338
|
args: [{ providedIn: 'root' }]
|
|
2339
2339
|
}], ctorParameters: () => [{ type: i1.NavigationService }, { type: i2.BaseUserService }, { type: i3.PoiService }, { type: i4.TicketsService }, { type: i5.EquipmentService }, { type: i6.Object3DService }, { type: i7.FeatureService }, { type: i8.MeasurementService }, { type: i9.CommentService }, { type: i10.HashtagService }, { type: i11.MissionService }, { type: i12.OperationService }, { type: i13.DomainService }, { type: i14.TranslateService }, { type: i15.ZoneService }] });
|
|
2340
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0dGVycG9ydC10YWctY29weS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWNvcmUvc3JjL2xpYi9zZXJ2aWNlcy9tYXR0ZXJwb3J0LXRhZy1jb3B5LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBaUJ2QyxPQUFPLEVBQUUsWUFBWSxFQUFFLHVCQUF1QixFQUFFLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQyxDQUFDLHlHQUF5RztBQUM5TCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbEQsT0FBTyxFQUFFLEdBQUcsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNwRCxPQUFPLEVBQ0gscUJBQXFCLEVBQUUsMEJBQTBCLEVBQUUsOEJBQThCLEVBQUUsUUFBUSxFQUMzRixpQ0FBaUMsRUFDcEMsTUFBTSxtQ0FBbUMsQ0FBQztBQUMzQyxPQUFPLEVBQTJDLFdBQVcsRUFBRSxPQUFPLEVBQWEsUUFBUSxFQUErQyxNQUFNLGtCQUFrQixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7OztBQXlCbks7d0VBQ3dFO0FBQ3hFLFNBQVMsY0FBYyxDQUFDLEdBQVk7SUFDaEMsSUFBSSxHQUFHLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDakMsTUFBTSxNQUFNLEdBQUcsR0FBVSxDQUFDO1FBQzFCLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDM0QsT0FBTyxNQUFNLENBQUMsTUFBTTtpQkFDZixHQUFHLENBQUMsQ0FBQyxDQUFN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Q0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2pILENBQUM7UUFFRCxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDckIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsbUNBQW1DLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUM3RixPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO3dHQTFqRlEsd0JBQXdCOzRHQUF4Qix3QkFBd0IsY0FEWCxNQUFNOzs0RkFDbkIsd0JBQXdCO2tCQURwQyxVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcclxuaW1wb3J0IHsgUE9JIH0gZnJvbSAnLi4vdHlwZXMuc2VydmljZSc7XHJcbmltcG9ydCB7IE5hdmlnYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9tb2RlbHMvbmF2aWdhdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgUG9pU2VydmljZSB9IGZyb20gJy4vbW9kZWxzL3BvaS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVGlja2V0c1NlcnZpY2UgfSBmcm9tICcuL21vZGVscy90aWNrZXQuc2VydmljZSc7XHJcbmltcG9ydCB7IEVxdWlwbWVudFNlcnZpY2UgfSBmcm9tICcuL21vZGVscy9lcXVpcG1lbnQuc2VydmljZSc7XHJcbmltcG9ydCB7IE9iamVjdDNEU2VydmljZSB9IGZyb20gJy4vbW9kZWxzL29iamVjdDNELnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBGZWF0dXJlU2VydmljZSB9IGZyb20gJy4vbW9kZWxzL2ZlYXR1cmUuc2VydmljZSc7XHJcbmltcG9ydCB7IE1lYXN1cmVtZW50U2VydmljZSB9IGZyb20gJy4vbW9kZWxzL21lYXN1cmVtZW50LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDb21tZW50U2VydmljZSB9IGZyb20gJy4vbW9kZWxzL2NvbW1lbnQuc2VydmljZSc7XHJcbmltcG9ydCB7IEhhc2h0YWdTZXJ2aWNlIH0gZnJvbSAnLi9tb2RlbHMvaGFzaHRhZy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTWlzc2lvblNlcnZpY2UgfSBmcm9tICcuL21vZGVscy9taXNzaW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBPcGVyYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9tb2RlbHMvb3BlcmF0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBEb21haW5TZXJ2aWNlIH0gZnJvbSAnLi9tb2RlbHMvZG9tYWluLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBab25lU2VydmljZSB9IGZyb20gJy4vbW9kZWxzL3pvbmUuc2VydmljZSc7XHJcbmltcG9ydCB7IEJhc2VVc2VyU2VydmljZSB9IGZyb20gJy4vdXNlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgY29weUZpbGVJblMzLCBjb3B5RmlsZUluUzNWaWFEb3dubG9hZCwgZ2V0U2lnbmVkRmlsZSB9IGZyb20gJy4vczMuc2VydmljZSc7IC8vIHNlZSBzMy5zZXJ2aWNlLnRzOiBuZWl0aGVyIG11c3Qgc3dhbGxvdyBlcnJvcnMgKG5lZWRlZCB0byBkZXRlY3QgTm9TdWNoS2V5IC8gc2lnbmF0dXJlIG1pc21hdGNoIGJlbG93KVxyXG5pbXBvcnQgeyBkb3dubG9hZEJsb2IgfSBmcm9tICcuLi9oZWxwZXJzLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBBUEksIGdyYXBocWxPcGVyYXRpb24gfSBmcm9tICdhd3MtYW1wbGlmeSc7XHJcbmltcG9ydCB7XHJcbiAgICBjb21wdXRlUmlnaWRUcmFuc2Zvcm0sIGFwcGx5UmlnaWRUcmFuc2Zvcm1Ub1BvaW50LCBhcHBseVJpZ2lkVHJhbnNmb3JtVG9EaXJlY3Rpb24sIGRpc3RhbmNlLFxyXG4gICAgYXBwbHlSaWdpZFRyYW5zZm9ybVRvWVJvdGF0aW9uRGVnLCBSaWdpZFRyYW5zZm9ybSwgVmVjM1xyXG59IGZyb20gJy4vdXRpbHMvbWF0dGVycG9ydC10cmFuc2Zvcm0udXRpbCc7XHJcbmltcG9ydCB7IE9iamVjdDNELCBGZWF0dXJlLCBNZWFzdXJlbWVudCwgQ29tbWVudCwgQ29tbWVudFR5cGUsIFBvaVR5cGUsIEVxdWlwbWVudCwgU3BNb2R1bGUsIFRpY2tldCwgSGFzaHRhZywgTWlzc2lvbiwgT3BlcmF0aW9uLCBEb21haW4gfSBmcm9tICcuLi90eXBlcy5zZXJ2aWNlJztcclxuXHJcbi8qKiBQcm9ncmVzcyBzbmFwc2hvdCBlbWl0dGVkIGR1cmluZyBjb3B5VGFnc0Zyb21WaXNpdCgpLCBzbyB0aGUgVUkgY2FuIHNob3cgYSBsaXZlIHN0YXR1cy4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBDb3B5UHJvZ3Jlc3Mge1xyXG4gICAgcGhhc2U6ICdjb2xsZWN0aW5nJyB8ICd0aWNrZXRzJyB8ICdlcXVpcG1lbnRzJyB8ICdwb2lzJyB8ICdvYmplY3RzM2QnIHwgJ2ZlYXR1cmVzJyB8ICdtZWFzdXJlbWVudHMnIHwgJ3JlY2FsaWJyYXRpbmcnIHwgJ2RvbmUnO1xyXG4gICAgcHJvY2Vzc2VkSW5QaGFzZTogbnVtYmVyO1xyXG4gICAgdG90YWxJblBoYXNlOiBudW1iZXI7XHJcbiAgICBwcm9jZXNzZWRPdmVyYWxsOiBudW1iZXI7XHJcbiAgICB0b3RhbE92ZXJhbGw6IG51bWJlcjtcclxuICAgIHBlcmNlbnQ6IG51bWJlcjtcclxuICAgIGVycm9yQ291bnQ6IG51bWJlcjtcclxuICAgIC8qKiBJdGVtcyB0aGF0IGFscmVhZHkgZXhpc3RlZCBpbiB0aGUgdGFyZ2V0IHNwYWNlIGFuZCBoYWQgbWlzc2luZyBpZGVudGl0eSBmaWVsZHNcclxuICAgICAqICBmaWxsZWQgaW4sIHJhdGhlciB0aGFuIGJlaW5nIG5ld2x5IGNyZWF0ZWQg4oCUIHNlZSBoZWFsRXF1aXBtZW50SWRlbnRpdHkoKSBhbmQgaXRzXHJcbiAgICAgKiAgdGlja2V0L2ZlYXR1cmUgZXF1aXZhbGVudHMuICovXHJcbiAgICBoZWFsZWRDb3VudDogbnVtYmVyO1xyXG59XHJcblxyXG4vKiogQSBzaW5nbGUgbGluZSBpbiB0aGUgY29weSBsb2cg4oCUIGEgc3RlcCBzdGF0dXMgKHVwZGF0ZWQgaW4gcGxhY2UpLCBvciBhbiBlcnJvciAvIGhlYWxlZFxyXG4gKiAgaXRlbSBub3RpY2UgKGFwcGVuZGVkIG9uY2UsIHBlcm1hbmVudCkuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgQ29weUxvZ0VudHJ5IHtcclxuICAgIGlkOiBzdHJpbmc7ICAgICAgIC8vIHN0YWJsZSBpZCBmb3Igc3RlcCBsaW5lcyAoc28gdGhleSB1cGRhdGUgaW4gcGxhY2UpLCB1bmlxdWUgZm9yIGVycm9yL2hlYWxlZCBsaW5lc1xyXG4gICAgdHlwZTogJ3N0ZXAnIHwgJ2Vycm9yJyB8ICdoZWFsZWQnO1xyXG4gICAgdGV4dDogc3RyaW5nO1xyXG59XHJcblxyXG4vKiogU2FmZWx5IGV4dHJhY3RzIGEgcmVhZGFibGUgbWVzc2FnZSBmcm9tIGFuIHVua25vd24gY2F0Y2ggdmFsdWUsIGluY2x1ZGluZyBBbXBsaWZ5J3NcclxuICogIEdyYXBoUUwgZXJyb3Igc2hhcGUgKHsgZGF0YSwgZXJyb3JzOiBbeyBlcnJvclR5cGUsIG1lc3NhZ2UgfV0gfSkuICovXHJcbmZ1bmN0aW9uIHRvRXJyb3JNZXNzYWdlKGVycjogdW5rbm93bik6IHN0cmluZyB7XHJcbiAgICBpZiAoZXJyICYmIHR5cGVvZiBlcnIgPT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgY29uc3QgYW55RXJyID0gZXJyIGFzIGFueTtcclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShhbnlFcnIuZXJyb3JzKSAmJiBhbnlFcnIuZXJyb3JzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIGFueUVyci5lcnJvcnNcclxuICAgICAgICAgICAgICAgIC5tYXAoKGU6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRpdGxlID0gZS5lcnJvclR5cGUgPyBgJHtlLmVycm9yVHlwZX06IGAgOiAnJztcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYCR7dGl0bGV9JHtlLm1lc3NhZ2UgfHwgJ1Vua25vd24gZXJyb3InfWA7XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgLmpvaW4oJyB8ICcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZXJyIGluc3RhbmNlb2YgRXJyb3IpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGVyci5tZXNzYWdlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICh0eXBlb2YgZXJyID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgIHJldHVybiBlcnI7XHJcbiAgICB9XHJcbiAgICB0cnkge1xyXG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShlcnIpO1xyXG4gICAgfSBjYXRjaCB7XHJcbiAgICAgICAgcmV0dXJuIFN0cmluZyhlcnIpO1xyXG4gICAgfVxyXG59XHJcblxyXG4vKiogVGhyb3duIHdoZW4gdGhlIHJlZmVyZW5jZWQgUzMgc291cmNlIGZpbGUgZG9lc24ndCBleGlzdCAob3JwaGFuZWQgREIgcmVmZXJlbmNlIOKAlFxyXG4gKiAgZS5nLiB0aGUgZmlsZSB3YXMgZGVsZXRlZCBvciByZW5hbWVkIG9uIFMzIHdpdGhvdXQgdXBkYXRpbmcgdGhlIGRhdGFiYXNlKS5cclxuICogIEtlcHQgZGlzdGluY3QgZnJvbSBvdGhlciBjb3B5IGZhaWx1cmVzIHNvIHRoZSBjYWxsaW5nIGxvb3AgY2FuIGxvZyBhIGNsZWFyLFxyXG4gKiAgc3BlY2lmaWMgbWVzc2FnZSBhbmQgc2tpcCB0aGUgd2hvbGUgaXRlbSBpbnN0ZWFkIG9mIGEgZ2VuZXJpYyBlcnJvci4gKi9cclxuY2xhc3MgTWlzc2luZ1MzRmlsZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xyXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IHNvdXJjZUtleTogc3RyaW5nLCBwdWJsaWMgcmVhZG9ubHkgY29udGV4dExhYmVsOiBzdHJpbmcpIHtcclxuICAgICAgICBzdXBlcihgU291cmNlIGZpbGUgbWlzc2luZyBvbiBTMzogXCIke3NvdXJjZUtleX1cIiAoJHtjb250ZXh0TGFiZWx9KWApO1xyXG4gICAgICAgIHRoaXMubmFtZSA9ICdNaXNzaW5nUzNGaWxlRXJyb3InO1xyXG4gICAgfVxyXG59XHJcblxyXG4vKiogS2luZCBvZiByZWNvcmQgYSBQT0kncyBlbGVtZW50SUQgcG9pbnRzIGF0IChhIG1lYXN1cmVtZW50IFBPSSBwb2ludHMgYXQgYSBDb21tZW50KS4gKi9cclxudHlwZSBUYWdFbGVtZW50VHlwZSA9ICd0aWNrZXQnIHwgJ2VxdWlwbWVudCcgfCAnb2JqZWN0M0QnIHwgJ2ZlYXR1cmUnIHwgJ2NvbW1lbnQnO1xyXG5cclxuLyoqIFdoYXQgcmVjYWxpYnJhdGlvbiBuZWVkcyB0byBrbm93IGFib3V0IGEgdGFnJ3MgZWxlbWVudC4gKi9cclxuaW50ZXJmYWNlIFRhZ0VsZW1lbnQge1xyXG4gICAgbmFtZTogc3RyaW5nO1xyXG4gICAgaWRlbnRpdHk6IEFycmF5PHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ+O1xyXG4gICAgLyoqIHNwYWNlIChsb2NhdGlvbikgdGhlIGVsZW1lbnQgYmVsb25ncyB0byAqL1xyXG4gICAgc3BhY2VJZD86IHN0cmluZyB8IG51bGw7XHJcbiAgICAvKiogZnJlZSB0ZXh0IHNob3duIGluIHRoZSB0YWcgcHJldmlldyAodGlja2V0IGRlc2NyaXB0aW9uLCAuLi4pICovXHJcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZztcclxuICAgIC8qKiBTMyB2YWx1ZSBvZiB0aGUgZWxlbWVudCdzIHBpY3R1cmUgKGEgbWVhc3VyZW1lbnQncyBzY3JlZW5zaG90KSAqL1xyXG4gICAgaW1hZ2VLZXk/OiBzdHJpbmc7XHJcbn1cclxuXHJcbi8qKiBBIHRhZyBsaXN0ZWQgZm9yIHJlY2FsaWJyYXRpb24sIHdpdGggd2hhdCB0aGUgVUkgbmVlZHMgdG8gaWRlbnRpZnkgaXQuICovXHJcbmV4cG9ydCB0eXBlIFJlY2FsaWJyYXRpb25UYWcgPSBQT0kgJiB7XHJcbiAgICBlbGVtZW50TmFtZTogc3RyaW5nO1xyXG4gICAgZWxlbWVudERlc2NyaXB0aW9uPzogc3RyaW5nO1xyXG4gICAgLyoqIHBhc3MgdG8gZ2V0VGFnSW1hZ2VVcmwoKSB0byBnZXQgYSBkaXNwbGF5YWJsZSAoc2lnbmVkKSBVUkwgKi9cclxuICAgIGVsZW1lbnRJbWFnZUtleT86IHN0cmluZztcclxuICAgIC8qKiBmbG9vciB6b25lIChsYXllciBGTE9PUikgb2YgdGhlIHRhZydzIHN3ZWVwIGluIHRoZSB0YXJnZXQgc3BhY2UgKi9cclxuICAgIGZsb29yTmFtZT86IHN0cmluZztcclxuICAgIC8qKiBtb3N0IHNwZWNpZmljIG90aGVyIHpvbmUgb2YgdGhlIHRhZydzIHN3ZWVwIGluIHRoZSB0YXJnZXQgc3BhY2UgKi9cclxuICAgIHpvbmVOYW1lPzogc3RyaW5nO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIFdoaWNoIHRhZ3Mgb2YgYSBzcGFjZSAobG9jYXRpb24pIGEgcmVjYWxpYnJhdGlvbiBsaXN0cy4gQSB0YWcgYmVsb25ncyB0byBhIGxvY2F0aW9uICh0aGVcclxuICogc3BhY2Ugb2YgdGhlIGVsZW1lbnQgaXQgcG9pbnRzIGF0OyBhIHN0YW5kYWxvbmUgdGFnIGJlbG9uZ3MgdG8gZXZlcnkgbG9jYXRpb24gc2hvd2luZyBpdClcclxuICogYW5kIGlzIGRpc3BsYXllZCBpbiBvbmUgb3Igc2V2ZXJhbCB2aXJ0dWFsIHZpc2l0cyBvZiB0aGF0IGxvY2F0aW9uLiBUYWdzIG9mIGFub3RoZXJcclxuICogbG9jYXRpb24gYXJlIG5ldmVyIGxpc3RlZCwgZXZlbiB3aGVuIGJvdGggbG9jYXRpb25zIHVzZSB0aGUgc2FtZSB2aXNpdC5cclxuICogIC0gU1BBQ0U6IGV2ZXJ5IHRhZyBvZiB0aGUgbG9jYXRpb24sIHdoaWNoZXZlciBvZiBpdHMgdmlzaXRzIGl0IHNpdHMgaW47XHJcbiAqICAtIFZJU0lUOiB0aGUgdGFncyBvZiB0aGUgbG9jYXRpb24gcGxhY2VkIG9uIHRoZSBzd2VlcHMgb2YgdGhlIHNlbGVjdGVkIHZpc2l0LlxyXG4gKi9cclxuZXhwb3J0IHR5cGUgUmVjYWxpYnJhdGlvblRhZ1Njb3BlID0gJ1NQQUNFJyB8ICdWSVNJVCc7XHJcblxyXG4vKiogQm90aCBsaXN0cyBnZXRSZWNhbGlicmF0aW9uVGFnU2V0cygpIG9mZmVycywgc2VlIHRoZXJlLiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFJlY2FsaWJyYXRpb25UYWdTZXRzIHtcclxuICAgIHNwYWNlOiBSZWNhbGlicmF0aW9uVGFnW107XHJcbiAgICB2aXNpdDogUmVjYWxpYnJhdGlvblRhZ1tdO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFJlY2FsaWJyYXRpb25UYWdPcHRpb25zIHtcclxuICAgIC8qKiBOb2RlIG9mIHRoZSBzZWxlY3RlZCB0YXJnZXQgdmlzaXQgKHZpc2l0Lm5vZGUuaWQpOiBkcml2ZXMgdGhlIFZJU0lUIGxpc3QuICovXHJcbiAgICB0YXJnZXROb2RlSWQ/OiBzdHJpbmcgfCBudWxsO1xyXG4gICAgLyoqIE9ubHkga2VlcCB0aGUgdGFncyB0aGF0IGFsc28gZXhpc3QgaW4gdGhlIHNvdXJjZSBsb2NhdGlvbiAoaWdub3JlZCB3aGVuIHNvdXJjZSA9IHRhcmdldCkuICovXHJcbiAgICBvbmx5VGFnc0luU291cmNlPzogYm9vbGVhbjtcclxufVxyXG5cclxuLyoqIE91dGNvbWUgb2YgcmVjYWxpYnJhdGVUYWdzRnJvbVZpc2l0KCk6IGhvdyBtYW55IG9mIHRoZSBzZWxlY3RlZCB0YWdzIHdlcmUgbW92ZWQuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgUmVjYWxpYnJhdGlvblJlc3VsdCB7XHJcbiAgICB1cGRhdGVkOiBudW1iZXI7XHJcbiAgICAvKiogc2VsZWN0ZWQgdGFncyBub3QgZm91bmQgYW55bW9yZSwgb3Igd2l0aG91dCBhIHBvc2l0aW9uIHRvIG1vdmUgKi9cclxuICAgIHNraXBwZWQ6IG51bWJlcjtcclxuICAgIGZhaWxlZDogbnVtYmVyO1xyXG59XHJcblxyXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxyXG5leHBvcnQgY2xhc3MgTWF0dGVycG9ydFRhZ0NvcHlTZXJ2aWNlIHtcclxuXHJcbiAgICAvLyBFbWl0cyBwcm9ncmVzcyB1cGRhdGVzIGR1cmluZyBjb3B5VGFnc0Zyb21WaXNpdCgpOyBudWxsIHdoZW4gaWRsZVxyXG4gICAgcHVibGljIGNvcHlQcm9ncmVzcyQ6IEJlaGF2aW9yU3ViamVjdDxDb3B5UHJvZ3Jlc3MgfCBudWxsPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Q29weVByb2dyZXNzIHwgbnVsbD4obnVsbCk7XHJcblxyXG4gICAgLy8gRW1pdHMgdGhlIGFjY3VtdWxhdGVkIGxvZyBsaW5lcyBkdXJpbmcgY29weVRhZ3NGcm9tVmlzaXQoKTsgW10gd2hlbiBpZGxlXHJcbiAgICBwdWJsaWMgY29weUxvZyQ6IEJlaGF2aW9yU3ViamVjdDxDb3B5TG9nRW50cnlbXT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PENvcHlMb2dFbnRyeVtdPihbXSk7XHJcblxyXG4gICAgcHJpdmF0ZSBzcE1vZHVsZTogU3BNb2R1bGU7XHJcbiAgICBwcml2YXRlIGxvZzogQ29weUxvZ0VudHJ5W10gPSBbXTtcclxuICAgIC8qKiBVbmlxdWUtaWQgc2VxdWVuY2Ugc2hhcmVkIGJ5IGV2ZXJ5IHBlcm1hbmVudCAobm9uLXN0ZXApIGxvZyBsaW5lIOKAlCBlcnJvcnMgYW5kIGhlYWxlZC1pdGVtIG5vdGljZXMgYWxpa2UuICovXHJcbiAgICBwcml2YXRlIGxvZ1NlcSA9IDA7XHJcblxyXG4gICAgLy8gLS0tLSBQZXItcnVuIHJlbWFwcGluZyBzdGF0ZSAocmVzZXQgYnkgcmVzZXRSdW5TdGF0ZSgpIGF0IHRoZSBzdGFydCBvZiBldmVyeSBjb3B5KSAtLS0tXHJcblxyXG4gICAgLyoqIHNvdXJjZSBlbGVtZW50IGlkIC0+IGlkIG9mIGl0cyBjb3B5IGluIHRoZSB0YXJnZXQgc3BhY2UuICovXHJcbiAgICBwcml2YXRlIGVsZW1lbnRJZHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcclxuXHJcbiAgICAvKiogc291cmNlIENvbW1lbnQgaWQgLT4gaWQgb2YgaXRzIGNvcHkuIE5lZWRlZCB0byByZW1hcCBQT0kudGFnSW1hZ2VJRCwgd2hpY2ggaXMgYVxyXG4gICAgICogIHJlZmVyZW5jZSB0byBhIENvbW1lbnQgcmVjb3JkIChzZWUgdGhlIHNjaGVtYTogXCJjb25uZWN0aW9uIHRvIGNvbW1lbnQuaWRcIikuICovXHJcbiAgICBwcml2YXRlIGNvbW1lbnRJZHM6IE1hcDxzdHJpbmcsIHN0cmluZz4gPSBuZXcgTWFwKCk7XHJcblxyXG4gICAgLy8gSGFzaHRhZ3MgYXJlIHNwYWNlLXNjb3BlZCByZWNvcmRzLCBzbyB0aGVpciBpZHMgY2FuIG5ldmVyIGJlIGNhcnJpZWQgb3ZlciBhcy1pczogdGhleVxyXG4gICAgLy8gYXJlIG1hdGNoZWQgYnkgTkFNRSBhZ2FpbnN0IHRoZSB0YXJnZXQgc3BhY2UsIGFuZCB0aGUgbWlzc2luZyBvbmVzIGFyZSBjcmVhdGVkIHRoZXJlLlxyXG4gICAgLy8gVGhhdCBjcmVhdGlvbiBpcyBkZWxpYmVyYXRlbHkgbGF6eSDigJQgc2VlIHJlc29sdmVIYXNodGFnSWRzKCkg4oCUIGFuZCBhdWRpdGVkLCBzbyBhblxyXG4gICAgLy8gaW50ZXJydXB0ZWQgY29weSBjYW5ub3QgbGVhdmUga2V5d29yZHMgYmVoaW5kIHRoYXQgbm8gUE9JIHJlZmVyZW5jZXMuXHJcblxyXG4gICAgLyoqIHNvdXJjZSBIYXNodGFnIGlkIC0+IGl0cyBuYW1lLiAqL1xyXG4gICAgcHJpdmF0ZSBzb3VyY2VIYXNodGFnTmFtZXM6IE1hcDxzdHJpbmcsIHN0cmluZz4gPSBuZXcgTWFwKCk7XHJcblxyXG4gICAgLyoqIG5vcm1hbGlzZWQgaGFzaHRhZyBuYW1lIC0+IGl0cyBpZCBpbiB0aGUgVEFSR0VUIHNwYWNlIChwcmUtZXhpc3Rpbmcgb3IganVzdCBjcmVhdGVkKS4gKi9cclxuICAgIHByaXZhdGUgdGFyZ2V0SGFzaHRhZ0lkc0J5TmFtZTogTWFwPHN0cmluZywgc3RyaW5nPiA9IG5ldyBNYXAoKTtcclxuXHJcbiAgICAvKiogaWRzIG9mIHRoZSBoYXNodGFncyB0aGlzIHJ1biBjcmVhdGVkIGluIHRoZSB0YXJnZXQgc3BhY2UuICovXHJcbiAgICBwcml2YXRlIGNyZWF0ZWRIYXNodGFnSWRzOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcclxuXHJcbiAgICAvKiogaWRzIG9mIHRoZSBoYXNodGFncyBhY3R1YWxseSBwZXJzaXN0ZWQgb24gYSBzdWNjZXNzZnVsbHkgY3JlYXRlZCBmZWF0dXJlLiBBbnl0aGluZyBpblxyXG4gICAgICogIGNyZWF0ZWRIYXNodGFnSWRzIGJ1dCBhYnNlbnQgaGVyZSBpcyBhbiBvcnBoYW4gYW5kIGlzIGRlbGV0ZWQgYXQgdGhlIGVuZCBvZiB0aGUgcnVuLiAqL1xyXG4gICAgcHJpdmF0ZSB1c2VkSGFzaHRhZ0lkczogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XHJcblxyXG4gICAgLyoqIHNvdXJjZSBpZHMgb2YgdGhlIGVsZW1lbnRzIHdob3NlIFBPSXMgd2VyZSBhbHJlYWR5IGNyZWF0ZWQgYnkgYW4gZWxlbWVudCBwaGFzZS5cclxuICAgICAqICBHdWFyZHMgdGhlIHN0YW5kYWxvbmUgUE9JIHBoYXNlIGFnYWluc3QgY3JlYXRpbmcgYSBzZWNvbmQsIGltcG92ZXJpc2hlZCBjb3B5LiAqL1xyXG4gICAgcHJpdmF0ZSBoYW5kbGVkRWxlbWVudElkczogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XHJcblxyXG4gICAgLy8gQ29tbWVudCBhdXRob3JzaGlwOiBgQ29tbWVudC5vd25lcklEYCBpcyBhIGZvcmVpZ24ga2V5IHRvIGEgTWlzc2lvbiwgYW5kIGEgTWlzc2lvbiBpc1xyXG4gICAgLy8gc2NvcGVkIHRvIE9ORSBzcGFjZSAodXNlcklEICsgc3BhY2VJRCkuIEEgc291cmNlIGNvbW1lbnQncyBvd25lcklEIHRoZXJlZm9yZSBwb2ludHMgYXRcclxuICAgIC8vIG5vYm9keSBpbiB0aGUgdGFyZ2V0IHNwYWNlLCBzbyBpdCBoYXMgdG8gYmUgdHJhbnNsYXRlZCB0byB0aGUgTWlzc2lvbiBvZiB0aGUgU0FNRSB1c2VyXHJcbiAgICAvLyB0aGVyZSDigJQgc2VlIHJlc29sdmVDb21tZW50T3duZXJJRCgpLlxyXG5cclxuICAgIC8qKiBzb3VyY2UgTWlzc2lvbiBpZCAtPiBpdHMgdXNlcklELiAqL1xyXG4gICAgcHJpdmF0ZSBzb3VyY2VNaXNzaW9uVXNlcklkczogTWFwPHN0cmluZywgc3RyaW5nPiA9IG5ldyBNYXAoKTtcclxuXHJcbiAgICAvKiogdXNlcklEIC0+IHRoYXQgdXNlcidzIE1pc3Npb24gaWQgaW4gdGhlIFRBUkdFVCBzcGFjZSAob25seSBzZXQgd2hlbiB0aGV5IGhhdmUgb25lKS4gKi9cclxuICAgIHByaXZhdGUgdGFyZ2V0TWlzc2lvbklkc0J5VXNlcklkOiBNYXA8c3RyaW5nLCBzdHJpbmc+ID0gbmV3IE1hcCgpO1xyXG5cclxuICAgIC8vIERvbWFpbiAoZXF1aXBtZW50L3RpY2tldC9mZWF0dXJlL1BPSSBjYXRlZ29yeSkgcmVzb2x1dGlvbiBtaXJyb3JzIHRoZSBleGFjdCBydWxlIHRoZVxyXG4gICAgLy8gZWRpdCBmb3JtcyB1c2UgdG8gcG9wdWxhdGUgdGhlaXIgb3duIGNhdGVnb3J5IGRyb3Bkb3duIOKAlFxyXG4gICAgLy8gRG9tYWluU2VydmljZS5nZXREb21haW5zRm9yT3JnRm9yVHlwZSh0eXBlLCBtaXNzaW9uLm9yZ2FuaXNhdGlvbklELFxyXG4gICAgLy8gbWlzc2lvbi5vcmRlcmVkT3JnYW5pc2F0aW9uSUQpIOKAlCBrZXllZCB0byB0aGUgT1BFUkFUT1IncyBvd24gTWlzc2lvbiBvbiBlYWNoIHNwYWNlLFxyXG4gICAgLy8gTk9UIHRvIHRoZSBTcGFjZSdzIG93biBvcmdhbmlzYXRpb25JRC4gVHdvIHNwYWNlcyBpbiBkaWZmZXJlbnQgb3JnYW5pc2F0aW9ucyBjYW5cclxuICAgIC8vIHN0aWxsIHNoYXJlIGEgZG9tYWluIHRocm91Z2ggdGhhdCBNaXNzaW9uIGxpbmsgKGFuIG9wZXJhdG9yIHdob3NlIG1pc3Npb24gb24gdGhlXHJcbiAgICAvLyB0YXJnZXQgc3BhY2UgY2FycmllcyBhbiBgb3JkZXJlZE9yZ2FuaXNhdGlvbklEYCBtYXRjaGluZyB0aGUgZG9tYWluJ3Mgb3duXHJcbiAgICAvLyBvcmdhbmlzYXRpb25JRCBzZWVzIOKAlCBhbmQgY2FuIHJldXNlIOKAlCBpdCBkaXJlY3RseSkuIFNlZSByZXNvbHZlRG9tYWluSUQoKS5cclxuXHJcbiAgICAvKiogaWQgLT4gRG9tYWluLCBmb3IgZXZlcnkgZG9tYWluIHZpc2libGUgZnJvbSBFSVRIRVIgc3BhY2UncyBvcGVyYXRvciBtaXNzaW9uIChpdHNcclxuICAgICAqICBvcmdhbmlzYXRpb25JRCwgaXRzIG9yZGVyZWRPcmdhbmlzYXRpb25JRCwgb3IgZ2VuZXJpYy9uby1vcmdhbmlzYXRpb24gZG9tYWlucykg4oCUIGFcclxuICAgICAqICBzdXBlcnNldCBjb3ZlcmluZyB3aGF0ZXZlciBhIHNvdXJjZSBvYmplY3QncyBkb21haW5JRCBjb3VsZCBwb2ludCBhdC4gKi9cclxuICAgIHByaXZhdGUgZG9tYWluc0J5SWQ6IE1hcDxzdHJpbmcsIERvbWFpbj4gPSBuZXcgTWFwKCk7XHJcblxyXG4gICAgLyoqIG9yZ2FuaXNhdGlvbklEcyB0aGUgVEFSR0VUIG9wZXJhdG9yJ3MgbWlzc2lvbiBjYW4gc2VlIGRvbWFpbnMgZnJvbS4gQSBkb21haW4gd2hvc2VcclxuICAgICAqICBvd24gb3JnYW5pc2F0aW9uSUQgaXMgaW4gdGhpcyBzZXQgKG9yIGhhcyBub25lIGF0IGFsbCkgaXMgYWxyZWFkeSBkaXJlY3RseVxyXG4gICAgICogIHNlbGVjdGFibGUgaW4gdGhlIHRhcmdldCBzcGFjZSdzIG93biBkcm9wZG93biwgc28gaXRzIGlkIGlzIHJldXNlZCB1bmNoYW5nZWQuICovXHJcbiAgICBwcml2YXRlIHRhcmdldFZpc2libGVEb21haW5PcmdJZHM6IFNldDxzdHJpbmc+ID0gbmV3IFNldCgpO1xyXG5cclxuICAgIC8qKiBgJHt0eXBlfTo6JHtub3JtYWxpc2VkIG5hbWV9YCAtPiB0aGF0IGRvbWFpbidzIGlkLCBhbW9uZyBkb21haW5zIHZpc2libGUgdG8gdGhlXHJcbiAgICAgKiAgVEFSR0VUIG9wZXJhdG9yIOKAlCB1c2VkIHRvIGZpbmQgYW4gZXF1aXZhbGVudCB3aGVuIHRoZSBleGFjdCBpZCBpc24ndCByZXVzYWJsZS4gKi9cclxuICAgIHByaXZhdGUgdGFyZ2V0RG9tYWluSWRzQnlUeXBlQW5kTmFtZTogTWFwPHN0cmluZywgc3RyaW5nPiA9IG5ldyBNYXAoKTtcclxuXHJcbiAgICAvKiogVGFyZ2V0IHNwYWNlIGlkIG9mIHRoZSBydW4gaW4gcHJvZ3Jlc3Mg4oCUIHVzZWQgdG8gcmUtaG9tZSBjb3BpZWQgdGFnIGljb25zLiAqL1xyXG4gICAgcHJpdmF0ZSB0YXJnZXRTcGFjZUlkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBwcml2YXRlIG5hdmlnYXRpb25TZXJ2aWNlOiBOYXZpZ2F0aW9uU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIHVzZXJTZXJ2aWNlOiBCYXNlVXNlclNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBwb2lTZXJ2aWNlOiBQb2lTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgdGlja2V0U2VydmljZTogVGlja2V0c1NlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBlcXVpcG1lbnRTZXJ2aWNlOiBFcXVpcG1lbnRTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgb2JqZWN0M0RTZXJ2aWNlOiBPYmplY3QzRFNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBmZWF0dXJlU2VydmljZTogRmVhdHVyZVNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBtZWFzdXJlbWVudFNlcnZpY2U6IE1lYXN1cmVtZW50U2VydmljZSxcclxuICAgICAgICBwcml2YXRlIGNvbW1lbnRTZXJ2aWNlOiBDb21tZW50U2VydmljZSxcclxuICAgICAgICBwcml2YXRlIGhhc2h0YWdTZXJ2aWNlOiBIYXNodGFnU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIG1pc3Npb25TZXJ2aWNlOiBNaXNzaW9uU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIG9wZXJhdGlvblNlcnZpY2U6IE9wZXJhdGlvblNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBkb21haW5TZXJ2aWNlOiBEb21haW5TZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgem9uZVNlcnZpY2U6IFpvbmVTZXJ2aWNlXHJcbiAgICApIHtcclxuICAgICAgICB0aGlzLnNwTW9kdWxlID0gdXNlclNlcnZpY2UuZ2V0U3BNb2R1bGUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvL1xyXG4gICAgLy8gLS0tLS0tLS0tLSBQdWJsaWMgQVBJIC0tLS0tLS0tLS1cclxuICAgIC8vXHJcblxyXG4gICAgYXN5bmMgY29weVRhZ3NGcm9tVmlzaXQoXHJcbiAgICAgICAgc291cmNlU3BhY2VJZDogc3RyaW5nLFxyXG4gICAgICAgIHRhcmdldFNwYWNlSWQ6IHN0cmluZyxcclxuICAgICAgICBsYW5kbWFya1NvdXJjZUE6IFZlYzMsIGxhbmRtYXJrVGFyZ2V0QTogVmVjMyxcclxuICAgICAgICBsYW5kbWFya1NvdXJjZUI6IFZlYzMsIGxhbmRtYXJrVGFyZ2V0QjogVmVjM1xyXG4gICAgKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICAgICAgbGV0IGVycm9yQ291bnQgPSAwO1xyXG4gICAgICAgIGxldCBoZWFsZWRDb3VudCA9IDA7XHJcbiAgICAgICAgLy8gaXRlbXMgc2tpcHBlZCBiZWNhdXNlIGFuIGVxdWl2YWxlbnQgYWxyZWFkeSBleGlzdHMgaW4gdGhlIHRhcmdldCAoZWFybGllciBydW4pXHJcbiAgICAgICAgbGV0IGFscmVhZHlQcmVzZW50Q291bnQgPSAwO1xyXG4gICAgICAgIHRoaXMucmVzZXRMb2coKTtcclxuICAgICAgICB0aGlzLnJlc2V0UnVuU3RhdGUodGFyZ2V0U3BhY2VJZCk7XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBDb3B5aW5nIFRhZ3MgZnJvbSBzb3VyY2UgJHtzb3VyY2VTcGFjZUlkfSB0byB0YXJnZXQgJHt0YXJnZXRTcGFjZUlkfWApO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5zZXRTdGVwUHJvZ3Jlc3MoJ2NvbGxlY3RpbmcnLCAnY29sbGVjdGluZycsIDApO1xyXG4gICAgICAgICAgICB0aGlzLmNvcHlQcm9ncmVzcyQubmV4dCh7XHJcbiAgICAgICAgICAgICAgICBwaGFzZTogJ2NvbGxlY3RpbmcnLFxyXG4gICAgICAgICAgICAgICAgcHJvY2Vzc2VkSW5QaGFzZTogMCwgdG90YWxJblBoYXNlOiAwLFxyXG4gICAgICAgICAgICAgICAgcHJvY2Vzc2VkT3ZlcmFsbDogMCwgdG90YWxPdmVyYWxsOiAwLFxyXG4gICAgICAgICAgICAgICAgcGVyY2VudDogMCwgZXJyb3JDb3VudDogMCwgaGVhbGVkQ291bnQ6IDBcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCB0YXJnZXRNaXNzaW9uID0gdGhpcy51c2VyU2VydmljZS5jdXJyZW50TWlzc2lvbih0YXJnZXRTcGFjZUlkKTtcclxuICAgICAgICAgICAgY29uc3QgdGFyZ2V0TWlzc2lvbklkID0gdGFyZ2V0TWlzc2lvbiA/IHRhcmdldE1pc3Npb24uaWQgOiBudWxsO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgdHJhbnNmb3JtOiBSaWdpZFRyYW5zZm9ybSA9IGNvbXB1dGVSaWdpZFRyYW5zZm9ybShcclxuICAgICAgICAgICAgICAgIGxhbmRtYXJrU291cmNlQSwgbGFuZG1hcmtUYXJnZXRBLFxyXG4gICAgICAgICAgICAgICAgbGFuZG1hcmtTb3VyY2VCLCBsYW5kbWFya1RhcmdldEJcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coJ1JpZ2lkIHRyYW5zZm9ybSBjb21wdXRlZDonLCB7XHJcbiAgICAgICAgICAgICAgICByb3RhdGlvbllEZWc6IHRyYW5zZm9ybS5yb3RhdGlvbllSYWQgKiAoMTgwIC8gTWF0aC5QSSksXHJcbiAgICAgICAgICAgICAgICByZWZTb3VyY2U6IHRyYW5zZm9ybS5yZWZTb3VyY2UsXHJcbiAgICAgICAgICAgICAgICByZWZUYXJnZXQ6IHRyYW5zZm9ybS5yZWZUYXJnZXRcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBzb3VyY2VTd2VlcElkcyA9IGF3YWl0IHRoaXMubmF2aWdhdGlvblNlcnZpY2UuZ2V0QWxsb3dlZFN3ZWVwc0lEc0ZvclVzZXJJblNwYWNlKHNvdXJjZVNwYWNlSWQpO1xyXG4gICAgICAgICAgICBjb25zdCB0YXJnZXRTd2VlcElkcyA9IGF3YWl0IHRoaXMubmF2aWdhdGlvblNlcnZpY2UuZ2V0QWxsb3dlZFN3ZWVwc0lEc0ZvclVzZXJJblNwYWNlKHRhcmdldFNwYWNlSWQpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5zZXRTdGVwUHJvZ3Jlc3MoJ2NvbGxlY3RpbmcnLCAnY29sbGVjdGluZycsIDMwKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IFtzb3VyY2VOYXZQb3NpdGlvbnMsIHRhcmdldE5hdlBvc2l0aW9uc10gPSBhd2FpdCBQcm9taXNlLmFsbChbXHJcbiAgICAgICAgICAgICAgICB0aGlzLmJ1aWxkTmF2aWdhdGlvblBvc2l0aW9uTWFwKHNvdXJjZVNwYWNlSWQsIHNvdXJjZVN3ZWVwSWRzKSxcclxuICAgICAgICAgICAgICAgIHRoaXMuYnVpbGROYXZpZ2F0aW9uUG9zaXRpb25NYXAodGFyZ2V0U3BhY2VJZCwgdGFyZ2V0U3dlZXBJZHMpXHJcbiAgICAgICAgICAgIF0pO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgZWxlbWVudElkcyA9IHRoaXMuZWxlbWVudElkcztcclxuXHJcbiAgICAgICAgICAgIGxldCBzb3VyY2VUaWNrZXRzOiBUaWNrZXRbXSA9IFtdO1xyXG4gICAgICAgICAgICBsZXQgc291cmNlRXF1aXBtZW50czogRXF1aXBtZW50W10gPSBbXTtcclxuICAgICAgICAgICAgbGV0IHRhcmdldFRpY2tldHM6IFRpY2tldFtdID0gW107XHJcbiAgICAgICAgICAgIGxldCB0YXJnZXRFcXVpcG1lbnRzOiBFcXVpcG1lbnRbXSA9IFtdO1xyXG4gICAgICAgICAgICBsZXQgc291cmNlTWVhc3VyZW1lbnRzOiBNZWFzdXJlbWVudFtdID0gW107XHJcbiAgICAgICAgICAgIGxldCB0YXJnZXRNZWFzdXJlbWVudHM6IE1lYXN1cmVtZW50W10gPSBbXTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNwTW9kdWxlID09IFNwTW9kdWxlLklNTU8pIHtcclxuICAgICAgICAgICAgICAgIHNvdXJjZVRpY2tldHMgPSBhd2FpdCB0aGlzLnRpY2tldFNlcnZpY2UuZ2V0VGlja2V0c0J5U3BhY2Uoc291cmNlU3BhY2VJZCk7XHJcbiAgICAgICAgICAgICAgICBzb3VyY2VFcXVpcG1lbnRzID0gYXdhaXQgdGhpcy5lcXVpcG1lbnRTZXJ2aWNlLmdldEVxdWlwbWVudHNGb3JTcGFjZShzb3VyY2VTcGFjZUlkKTtcclxuICAgICAgICAgICAgICAgIHRhcmdldFRpY2tldHMgPSBhd2FpdCB0aGlzLnRpY2tldFNlcnZpY2UuZ2V0VGlja2V0c0J5U3BhY2UodGFyZ2V0U3BhY2VJZCk7XHJcbiAgICAgICAgICAgICAgICB0YXJnZXRFcXVpcG1lbnRzID0gYXdhaXQgdGhpcy5lcXVpcG1lbnRTZXJ2aWNlLmdldEVxdWlwbWVudHNGb3JTcGFjZSh0YXJnZXRTcGFjZUlkKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5zZXRTdGVwUHJvZ3Jlc3MoJ2NvbGxlY3RpbmcnLCAnY29sbGVjdGluZycsIDU1KTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZU9iamVjdHMzRCA9IGF3YWl0IHRoaXMub2JqZWN0M0RTZXJ2aWNlLmdldE9iamVjdHMzREJ5U3BhY2Uoc291cmNlU3BhY2VJZCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldE9iamVjdHMzRCA9IGF3YWl0IHRoaXMub2JqZWN0M0RTZXJ2aWNlLmdldE9iamVjdHMzREJ5U3BhY2UodGFyZ2V0U3BhY2VJZCk7XHJcblxyXG4gICAgICAgICAgICAvLyBQYWdpbmF0ZWQ6IGEgc3BhY2Ugcm91dGluZWx5IGhvbGRzIG1vcmUgdGhhbiB0aGUgMTAwIGZlYXR1cmVzIGEgc2luZ2xlIEFwcFN5bmNcclxuICAgICAgICAgICAgLy8gcGFnZSByZXR1cm5zLCBhbmQgdGhlIHRhaWwgd2FzIHNpbGVudGx5IGRyb3BwZWQuXHJcbiAgICAgICAgICAgIC8vXHJcbiAgICAgICAgICAgIC8vIFRoZSBzb3VyY2UgbGlzdCBrZWVwcyB0aGUgaGlzdG9yaWNhbCBcInNraXAgd2hhdCB0aGUgb3BlcmF0b3IgYXJjaGl2ZWRcIiBydWxlLCBzb1xyXG4gICAgICAgICAgICAvLyB0aGUgc2V0IG9mIGNvcGllZCBmZWF0dXJlcyBkb2VzIG5vdCBjaGFuZ2Ug4oCUIGJ1dCB0aGUgY2hlY2sgaXMgbm93IG51bGwtc2FmZTpcclxuICAgICAgICAgICAgLy8gRmVhdHVyZVNlcnZpY2UuaXNBcmNoaXZlZCgpIGRlcmVmZXJlbmNlcyBjdXJyZW50TWlzc2lvbihzcGFjZUlEKS5pZCBhbmQgdGhyZXcgYVxyXG4gICAgICAgICAgICAvLyBUeXBlRXJyb3Igd2hlbiB0aGUgb3BlcmF0b3IgaGFkIG5vIG1pc3Npb24gb24gdGhlIHNvdXJjZSBzcGFjZSAodGhlIGNvbW1vbiBjYXNlXHJcbiAgICAgICAgICAgIC8vIGZvciBhbiBhcmNoaXZlZCB2MSBzcGFjZSksIGFib3J0aW5nIHRoZSB3aG9sZSBjb3B5LlxyXG4gICAgICAgICAgICAvLyBUaGUgdGFyZ2V0IGxpc3QgaXMgTk9UIGZpbHRlcmVkOiBpdCBvbmx5IGZlZWRzIGR1cGxpY2F0ZSBkZXRlY3Rpb24sIGFuZCBhblxyXG4gICAgICAgICAgICAvLyBhcmNoaXZlZCBmZWF0dXJlIGlzIHN0aWxsIGEgZmVhdHVyZSB0aGF0IGV4aXN0cyB0aGVyZS5cclxuICAgICAgICAgICAgY29uc3Qgc291cmNlRmVhdHVyZXMgPSAoYXdhaXQgdGhpcy5mZWF0dXJlU2VydmljZS5nZXRBbGxGZWF0dXJlc0J5U3BhY2VSYXcoc291cmNlU3BhY2VJZCkpXHJcbiAgICAgICAgICAgICAgICAuZmlsdGVyKGZlYXR1cmUgPT4gIXRoaXMuaXNBcmNoaXZlZEZvck9wZXJhdG9yKGZlYXR1cmUsIHNvdXJjZVNwYWNlSWQpKTtcclxuICAgICAgICAgICAgY29uc3QgdGFyZ2V0RmVhdHVyZXMgPSBhd2FpdCB0aGlzLmZlYXR1cmVTZXJ2aWNlLmdldEFsbEZlYXR1cmVzQnlTcGFjZVJhdyh0YXJnZXRTcGFjZUlkKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuc2V0U3RlcFByb2dyZXNzKCdjb2xsZWN0aW5nJywgJ2NvbGxlY3RpbmcnLCA3NSk7XHJcblxyXG4gICAgICAgICAgICAvLyBLZXl3b3JkczogaW5kZXggYm90aCB2b2NhYnVsYXJpZXMgbm93IChyZWFkLW9ubHkpLiBUaGUga2V5d29yZHMgdGhlIHRhcmdldCBzcGFjZVxyXG4gICAgICAgICAgICAvLyBpcyBtaXNzaW5nIGFyZSBjcmVhdGVkIGxhdGVyLCBQT0kgYnkgUE9JLCBvbmx5IGZvciB0aG9zZSBhY3R1YWxseSB1c2VkLlxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmxvYWRIYXNodGFnSW5kZXgoc291cmNlU3BhY2VJZCwgdGFyZ2V0U3BhY2VJZCk7XHJcblxyXG4gICAgICAgICAgICAvLyBNaXNzaW9uczogaW5kZXggYm90aCBzcGFjZXMgbm93IChyZWFkLW9ubHkpLCBzbyBjb3BpZWQgY29tbWVudHMgY2FuIGNyZWRpdFxyXG4gICAgICAgICAgICAvLyB0aGVpciByZWFsIGF1dGhvciBpbnN0ZWFkIG9mIHdob2V2ZXIgaXMgcnVubmluZyB0aGUgY29weS5cclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5sb2FkTWlzc2lvbkluZGV4KHNvdXJjZVNwYWNlSWQsIHRhcmdldFNwYWNlSWQpO1xyXG5cclxuICAgICAgICAgICAgLy8gRG9tYWluczogaW5kZXggZXZlcnkgZG9tYWluIGVpdGhlciBvcGVyYXRvcidzIG1pc3Npb24gY2FuIHNlZSAocmVhZC1vbmx5KSwgc29cclxuICAgICAgICAgICAgLy8gYSBjYXRlZ29yeSBzdXJ2aXZlcyBhIGNvcHkgYWNyb3NzIHR3byBESUZGRVJFTlQgb3JnYW5pc2F0aW9ucyB3aGVuZXZlciBpdFxyXG4gICAgICAgICAgICAvLyBnZW51aW5lbHkgd291bGQgYmUgc2VsZWN0YWJsZSBpbiB0aGUgdGFyZ2V0IHNwYWNlJ3Mgb3duIGRyb3Bkb3duIOKAlCBzZWVcclxuICAgICAgICAgICAgLy8gbG9hZERvbWFpbkluZGV4KCkgZm9yIHdoeSB0aGlzIGlzIGtleWVkIHRvIE1pc3Npb24sIG5vdCB0byB0aGUgU3BhY2UgaXRzZWxmLlxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmxvYWREb21haW5JbmRleChzb3VyY2VTcGFjZUlkLCB0YXJnZXRTcGFjZUlkKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNwTW9kdWxlID09IFNwTW9kdWxlLklNTU8pIHtcclxuICAgICAgICAgICAgICAgIHNvdXJjZU1lYXN1cmVtZW50cyA9IChhd2FpdCB0aGlzLm1lYXN1cmVtZW50U2VydmljZS5nZXRNZWFzdXJlbWVudHNGb3JTcGFjZUZvclVzZXIoc291cmNlU3BhY2VJZCkpXHJcbiAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihtID0+IChtLm51bWJlclBvaW50cyA/PyAwKSA+IDApXHJcbiAgICAgICAgICAgICAgICB0YXJnZXRNZWFzdXJlbWVudHMgPSAoYXdhaXQgdGhpcy5tZWFzdXJlbWVudFNlcnZpY2UuZ2V0TWVhc3VyZW1lbnRzRm9yU3BhY2VGb3JVc2VyKHRhcmdldFNwYWNlSWQpKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5zZXRTdGVwUHJvZ3Jlc3MoJ2NvbGxlY3RpbmcnLCAnY29sbGVjdGluZycsIDkwKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZVBvaXNBbGwgPSBhd2FpdCB0aGlzLnBvaVNlcnZpY2UuZ2V0UG9pc0J5TWF0dGVycG9ydFN3ZWVwcyhzb3VyY2VTd2VlcElkcyk7XHJcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldFBvaXNBbGwgPSBhd2FpdCB0aGlzLnBvaVNlcnZpY2UuZ2V0UG9pc0J5TWF0dGVycG9ydFN3ZWVwcyh0YXJnZXRTd2VlcElkcyk7XHJcblxyXG4gICAgICAgICAgICAvLyBBIFBPSSBpcyBcIm93bmVkXCIgYnkgYW4gZWxlbWVudCAodGlja2V0LCBlcXVpcG1lbnQsIDNEIG9iamVjdCwgZmVhdHVyZSwgbWVhc3VyZW1lbnQpXHJcbiAgICAgICAgICAgIC8vIHdoZW4gaXRzIGVsZW1lbnRJRCBwb2ludHMgYXQgb25lLiBUaG9zZSBQT0lzIGFyZSBjcmVhdGVkIGJ5IHRoZWlyIGVsZW1lbnQncyBwaGFzZSxcclxuICAgICAgICAgICAgLy8gd2hpY2ggaXMgdGhlIG9ubHkgcGxhY2UgdGhhdCBrbm93cyB0aGUgZWxlbWVudCdzIE5FVyBpZCDigJQgc28gdGhleSBtdXN0IGJlIGV4Y2x1ZGVkXHJcbiAgICAgICAgICAgIC8vIGZyb20gdGhlIHN0YW5kYWxvbmUgcGhhc2UsIG90aGVyd2lzZSBldmVyeSBmZWF0dXJlIGVuZHMgdXAgd2l0aCB0d28gUE9Jczogb25lXHJcbiAgICAgICAgICAgIC8vIGNvcnJlY3RseSBsaW5rZWQgYnV0IHN0cmlwcGVkIG9mIGl0cyB0YWcgbWV0YWRhdGEsIGFuZCBvbmUgY2FycnlpbmcgdGhlIG1ldGFkYXRhXHJcbiAgICAgICAgICAgIC8vIGJ1dCBzdGlsbCBwb2ludGluZyBhdCB0aGUgc291cmNlIHNwYWNlJ3MgZWxlbWVudC5cclxuICAgICAgICAgICAgLy9cclxuICAgICAgICAgICAgLy8gT3duZXJzaGlwIGlzIHJlY29nbmlzZWQgYnkgVFdPIGluZGVwZW5kZW50IGNyaXRlcmlhLCBhbmQgZWl0aGVyIG9uZSBpcyBlbm91Z2ggdG9cclxuICAgICAgICAgICAgLy8ga2VlcCBhIFBPSSBvdXQgb2YgdGhlIHN0YW5kYWxvbmUgcGhhc2U6XHJcbiAgICAgICAgICAgIC8vXHJcbiAgICAgICAgICAgIC8vICAtIGl0cyB0eXBlIGlzIG9uZSBhbiBlbGVtZW50IHBoYXNlIGlzIHJlc3BvbnNpYmxlIGZvci4gVGhpcyBpcyB0aGUgaGlzdG9yaWNhbFxyXG4gICAgICAgICAgICAvLyAgICBydWxlIGFuZCBpdCBtdXN0IGJlIGtlcHQ6IGEgUE9JIG9mIHRoYXQgdHlwZSB3aG9zZSBlbGVtZW50IHdhcyBOT1QgY29sbGVjdGVkXHJcbiAgICAgICAgICAgIC8vICAgIChkZWxldGVkIHRpY2tldCwgZXF1aXBtZW50IG91dHNpZGUgdGhlIGN1cnJlbnQgZmlsdGVyLCAuLi4pIGlzIGFuIG9ycGhhbiwgYW5kXHJcbiAgICAgICAgICAgIC8vICAgIGNvcHlpbmcgaXQgc3RhbmRhbG9uZSB3b3VsZCByZWNyZWF0ZSBpdCB3aXRoIGFuIGVsZW1lbnRJRCBzdGlsbCBwb2ludGluZyBpbnRvXHJcbiAgICAgICAgICAgIC8vICAgIHRoZSBzb3VyY2Ugc3BhY2Ug4oCUIGFuIG9ycGhhbiB0aGUgcHJldmlvdXMgdmVyc2lvbiBjb3JyZWN0bHkgcmVmdXNlZCB0byBjb3B5LlxyXG4gICAgICAgICAgICAvLyAgLSBpdHMgZWxlbWVudElEIGJlbG9uZ3MgdG8gYW4gZWxlbWVudCB3ZSBhY3R1YWxseSBjb2xsZWN0ZWQuIFRoaXMgaXMgdGhlIGFkZGVkXHJcbiAgICAgICAgICAgIC8vICAgIHJ1bGUsIG5lZWRlZCBiZWNhdXNlIHRoZSB0eXBlIGFsb25lIGlzIG5vdCBhIHJlbGlhYmxlIGRpc2NyaW1pbmF0b3I6IGhpc3RvcmljYWxcclxuICAgICAgICAgICAgLy8gICAgZGF0YSBhbHNvIGhvbGRzIElORk9STUFUSU9OL1JPT00gUE9JcyBib3VuZCB0byBhIGZlYXR1cmUsIHdoaWNoIHRoZSB0eXBlIHRlc3RcclxuICAgICAgICAgICAgLy8gICAgbGV0cyB0aHJvdWdoIGFuZCB3aGljaCB3b3VsZCBlbmQgdXAgZHVwbGljYXRlZC5cclxuICAgICAgICAgICAgY29uc3QgaGFuZGxlZFBvaVR5cGVzID0gbmV3IFNldDxzdHJpbmc+KFtcclxuICAgICAgICAgICAgICAgIFBvaVR5cGUuVElDS0VULCBQb2lUeXBlLkVRVUlQTUVOVCwgUG9pVHlwZS5EQVRBLCBQb2lUeXBlLkRFU0ssXHJcbiAgICAgICAgICAgICAgICBQb2lUeXBlLk9CSkVDVDNELCBQb2lUeXBlLk1FQVNVUkVcclxuICAgICAgICAgICAgXSk7XHJcblxyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IG93bmVyIG9mIFsuLi5zb3VyY2VUaWNrZXRzLCAuLi5zb3VyY2VFcXVpcG1lbnRzLCAuLi5zb3VyY2VPYmplY3RzM0QsIC4uLnNvdXJjZUZlYXR1cmVzXSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKG93bmVyPy5pZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlZEVsZW1lbnRJZHMuYWRkKG93bmVyLmlkKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IG1lYXN1cmVtZW50IG9mIHNvdXJjZU1lYXN1cmVtZW50cykge1xyXG4gICAgICAgICAgICAgICAgLy8gYSBtZWFzdXJlbWVudCBQT0kgaXMgYm91bmQgdG8gdGhlIG1lYXN1cmVtZW50J3MgQ29tbWVudCwgbm90IHRvIHRoZSBtZWFzdXJlbWVudFxyXG4gICAgICAgICAgICAgICAgaWYgKG1lYXN1cmVtZW50Py5jb21tZW50Py5pZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlZEVsZW1lbnRJZHMuYWRkKG1lYXN1cmVtZW50LmNvbW1lbnQuaWQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCBpc093bmVkQnlBbkVsZW1lbnQgPSAocG9pOiBQT0kpID0+XHJcbiAgICAgICAgICAgICAgICBoYW5kbGVkUG9pVHlwZXMuaGFzKHBvaS50eXBlIGFzIHN0cmluZylcclxuICAgICAgICAgICAgICAgIHx8ICghIXBvaS5lbGVtZW50SUQgJiYgdGhpcy5oYW5kbGVkRWxlbWVudElkcy5oYXMocG9pLmVsZW1lbnRJRCkpO1xyXG5cclxuICAgICAgICAgICAgY29uc3Qgc291cmNlUG9pcyA9IHNvdXJjZVBvaXNBbGwuZmlsdGVyKHAgPT4gIWlzT3duZWRCeUFuRWxlbWVudChwKSk7XHJcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldFBvaXMgPSB0YXJnZXRQb2lzQWxsLmZpbHRlcihwID0+ICEhcCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnNldFN0ZXBQcm9ncmVzcygnY29sbGVjdGluZycsICdjb2xsZWN0aW5nJywgMTAwKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHRvdGFsT3ZlcmFsbCA9IHNvdXJjZVRpY2tldHMubGVuZ3RoICsgc291cmNlRXF1aXBtZW50cy5sZW5ndGggKyBzb3VyY2VQb2lzLmxlbmd0aFxyXG4gICAgICAgICAgICAgICAgKyBzb3VyY2VPYmplY3RzM0QubGVuZ3RoICsgc291cmNlRmVhdHVyZXMubGVuZ3RoICsgc291cmNlTWVhc3VyZW1lbnRzLmxlbmd0aDtcclxuICAgICAgICAgICAgbGV0IHByb2Nlc3NlZE92ZXJhbGwgPSAwO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgZW1pdFByb2dyZXNzID0gKHBoYXNlOiBDb3B5UHJvZ3Jlc3NbJ3BoYXNlJ10sIHByb2Nlc3NlZEluUGhhc2U6IG51bWJlciwgdG90YWxJblBoYXNlOiBudW1iZXIpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY29weVByb2dyZXNzJC5uZXh0KHtcclxuICAgICAgICAgICAgICAgICAgICBwaGFzZSxcclxuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzZWRJblBoYXNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvdGFsSW5QaGFzZSxcclxuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzZWRPdmVyYWxsLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvdGFsT3ZlcmFsbCxcclxuICAgICAgICAgICAgICAgICAgICBwZXJjZW50OiB0b3RhbE92ZXJhbGwgPiAwID8gTWF0aC5yb3VuZCgocHJvY2Vzc2VkT3ZlcmFsbCAvIHRvdGFsT3ZlcmFsbCkgKiAxMDApIDogMCxcclxuICAgICAgICAgICAgICAgICAgICBlcnJvckNvdW50LCBoZWFsZWRDb3VudFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5zcE1vZHVsZSA9PSBTcE1vZHVsZS5JTU1PKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBUSUNLRVRTXHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNvdXJjZVRpY2tldHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzb3VyY2VPYmogPSBzb3VyY2VUaWNrZXRzW2ldO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBleGlzdGluZ01hdGNoID0gdGhpcy5maW5kRXhpc3RpbmcoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VPYmogYXMgYW55LCB0YXJnZXRUaWNrZXRzIGFzIGFueSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0OiBhbnkpID0+IFt0LnRpdGxlLCB0LmRlc2NyaXB0aW9uXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nTWF0Y2gpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscmVhZHlQcmVzZW50Q291bnQrKztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWV4aXN0aW5nTWF0Y2gpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJhd1NvdXJjZSA9IHNvdXJjZU9iaiBhcyBhbnk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGlja2V0SW5wdXQ6IGFueSA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogcmF3U291cmNlLnRpdGxlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyaWVuZGx5TGFiZWw6IHJhd1NvdXJjZS5mcmllbmRseUxhYmVsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czogcmF3U291cmNlLnN0YXR1cyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiByYXdTb3VyY2UudHlwZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmlvcml0eTogcmF3U291cmNlLnByaW9yaXR5LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiByYXdTb3VyY2UuZGVzY3JpcHRpb24sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw6IHJhd1NvdXJjZS5sZXZlbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YTogcmF3U291cmNlLm1ldGFkYXRhIHx8IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZDogcmF3U291cmNlLnJlYWQgfHwgbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9qZWN0SUQ6IHJhd1NvdXJjZS5wcm9qZWN0SUQgfHwgbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9ibGVtQ29kZTogcmF3U291cmNlLnByb2JsZW1Db2RlIHx8IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWlzc2lvbnMgYXJlIHBlci1zcGFjZTogYSBzb3VyY2UgbWlzc2lvbiBpZCBkZXNpZ25hdGVzIG5vYm9keSBpblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB0YXJnZXQgc3BhY2UuIENhcnJ5aW5nIHRoZSBsaXN0IG92ZXIgd291bGQgbG9vayBsaWtlIHJlYWwgZGF0YVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoaWxlIGhpZGluZyB0aGUgaXRlbSBmcm9tIG5vIG9uZSDigJQgcmVzZXQgaXQsIGFzIGZvciBmZWF0dXJlcy5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmNoaXZlZEZvck1pc3Npb25JRDogbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFjZUlEOiB0YXJnZXRTcGFjZUlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlbWFwcGVkIGluIHRoZSBzZWNvbmQgcGFzcyBiZWxvdywgb25jZSBldmVyeSB0aWNrZXQgZXhpc3RzLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudElEOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJldXNlZCB1bmNoYW5nZWQgaW4gdGhlIHNhbWUgb3JnYW5pc2F0aW9uLCBtYXRjaGVkIGJ5IG5hbWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhY3Jvc3MgdHdvIOKAlCBzZWUgcmVzb2x2ZURvbWFpbklEKCkuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9tYWluSUQ6IHRoaXMucmVzb2x2ZURvbWFpbklEKHJhd1NvdXJjZS5kb21haW5JRCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duZXJNaXNzaW9uSUQ6IHRhcmdldE1pc3Npb25JZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjcmVhdGVkT2JqID0gYXdhaXQgdGhpcy50aWNrZXRTZXJ2aWNlLmNyZWF0ZVRpY2tldCh0aWNrZXRJbnB1dCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNyZWF0ZWRPYmogJiYgY3JlYXRlZE9iai5pZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRJZHNbc291cmNlT2JqLmlkXSA9IGNyZWF0ZWRPYmouaWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXR0YWNobWVudHMgb2YgdGhlIHRpY2tldCAocGhvdG9zIG9mIHRoZSBpbmNpZGVudCwgZG9jdW1lbnRzLi4uKS5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZXkgd2VyZSBuZXZlciBjb3BpZWQgYXQgYWxsOiBhIGR1cGxpY2F0ZWQgdGlja2V0IGFycml2ZWQgc3RyaXBwZWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mIGV2ZXJ5IHBpZWNlIG9mIGV2aWRlbmNlIGF0dGFjaGVkIHRvIGl0LlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNyZWF0ZWRPYmopIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc291cmNlQ29tbWVudHM6IENvbW1lbnRbXSA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUNvbW1lbnRzID0gYXdhaXQgdGhpcy5jb21tZW50U2VydmljZS5nZXRBbGxDb21tZW50c0ZvclRpY2tldChzb3VyY2VPYmouaWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGNvbW1lbnRzRmV0Y2hFcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYEZhbGxpbmcgYmFjayB0byB0aGUgZW1iZWRkZWQgY29tbWVudCBsaXN0IGZvciB0aWNrZXQgXCIke3Jhd1NvdXJjZS50aXRsZX1cIjpgLCBjb21tZW50c0ZldGNoRXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VDb21tZW50cyA9IChzb3VyY2VPYmouY29tbWVudHM/Lml0ZW1zIHx8IFtdKS5maWx0ZXIoYyA9PiAhIWMpIGFzIENvbW1lbnRbXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc291cmNlQ29tbWVudCBvZiB0aGlzLm9yZGVyQ29tbWVudHNGb3JDb3B5KHNvdXJjZUNvbW1lbnRzKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY3JlYXRlZCA9IGF3YWl0IHRoaXMuY29weUNvbW1lbnRGb3JUaWNrZXQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlQ29tbWVudCwgY3JlYXRlZE9iai5pZCwgdGFyZ2V0U3BhY2VJZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjcmVhdGVkPy5pZCAmJiAoc291cmNlQ29tbWVudCBhcyBhbnkpLmlkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21tZW50SWRzLnNldCgoc291cmNlQ29tbWVudCBhcyBhbnkpLmlkLCBjcmVhdGVkLmlkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoYXR0YWNobWVudEVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBFcnJvciBjb3B5aW5nIGF0dGFjaG1lbnQgXCIke3NvdXJjZUNvbW1lbnQ/LnRpdGxlfVwiIGZvciB0aWNrZXQgXCIke3NvdXJjZU9iaj8udGl0bGV9XCI6YCwgYXR0YWNobWVudEVycm9yKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ291bnQrKztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nQ29weUl0ZW1FcnJvcihhdHRhY2htZW50RXJyb3IsICdlcnJvckZlYXR1cmVBdHRhY2htZW50Jywgc291cmNlQ29tbWVudD8udGl0bGUgfHwgKHNvdXJjZUNvbW1lbnQgYXMgYW55KT8uaWQsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlOiByYXdTb3VyY2UudGl0bGUgfHwgc291cmNlT2JqLmlkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHNvdXJjZVBvaSBvZiAoc291cmNlT2JqLnBvaXM/Lml0ZW1zIHx8IFtdKS5maWx0ZXIocCA9PiAhIXApKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jcmVhdGVDb3BpZWRQb2koXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZVBvaSwgY3JlYXRlZE9iai5pZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlTmF2UG9zaXRpb25zLCB0YXJnZXROYXZQb3NpdGlvbnMsIHRyYW5zZm9ybVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTYW1lIHJlYXNvbmluZyBhcyB0aGUgRVFVSVBNRU5UUyBwaGFzZSAoc2VlIHRoZSBjb21tZW50IHRoZXJlKTpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGEgdGlja2V0IG1hdGNoaW5nIHRoaXMgb25lIGFscmVhZHkgZXhpc3RzIGluIHRoZSB0YXJnZXQgc3BhY2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtb3N0IGxpa2VseSBmcm9tIGFuIGVhcmxpZXIsIGluY29tcGxldGUgcnVuLiBGaWxsIGluIHdoYXRldmVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZGVudGl0eSBmaWVsZCBpdCBpcyBtaXNzaW5nIHJhdGhlciB0aGFuIGxlYXZpbmcgaXQgdW50b3VjaGVkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudElkc1tzb3VyY2VPYmouaWRdID0gZXhpc3RpbmdNYXRjaC5pZDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhlYWxlZEZpZWxkcyA9IGF3YWl0IHRoaXMuaGVhbFRpY2tldElkZW50aXR5KHNvdXJjZU9iaiBhcyBhbnksIGV4aXN0aW5nTWF0Y2ggYXMgYW55KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoZWFsZWRGaWVsZHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWxlZENvdW50Kys7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dIZWFsZWRJdGVtKCd0aWNrZXRIZWFsZWQnLCAoc291cmNlT2JqIGFzIGFueSk/LnRpdGxlIHx8IHNvdXJjZU9iaj8uaWQsIGhlYWxlZEZpZWxkcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChpdGVtRXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3IgY29weWluZyB0aWNrZXQgXCIke3NvdXJjZU9iaj8udGl0bGV9XCIgKGlkOiAke3NvdXJjZU9iaj8uaWR9KTpgLCBpdGVtRXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvdW50Kys7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nQ29weUl0ZW1FcnJvcihpdGVtRXJyb3IsICdlcnJvclRpY2tldCcsIHNvdXJjZU9iaj8udGl0bGUgfHwgc291cmNlT2JqPy5pZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzZWRPdmVyYWxsKys7XHJcbiAgICAgICAgICAgICAgICAgICAgZW1pdFByb2dyZXNzKCd0aWNrZXRzJywgaSArIDEsIHNvdXJjZVRpY2tldHMubGVuZ3RoKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwY3QgPSBzb3VyY2VUaWNrZXRzLmxlbmd0aCA+IDAgPyBNYXRoLnJvdW5kKCgoaSArIDEpIC8gc291cmNlVGlja2V0cy5sZW5ndGgpICogMTAwKSA6IDEwMDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFN0ZXBQcm9ncmVzcygndGlja2V0cycsICd0aWNrZXRzJywgcGN0KTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvLyBTZWNvbmQgcGFzczogcmVzdG9yZSB0aGUgdGlja2V0IGhpZXJhcmNoeS4gYHBhcmVudElEYCBoYWQgdG8gYmUgbnVsbGVkIGR1cmluZ1xyXG4gICAgICAgICAgICAgICAgLy8gY3JlYXRpb24gKHRoZSBwYXJlbnQgbWF5IG5vdCBoYXZlIGV4aXN0ZWQgeWV0KSBhbmQgd2FzIHRoZW4gbmV2ZXIgcmVzdG9yZWQsIHNvXHJcbiAgICAgICAgICAgICAgICAvLyBldmVyeSBzdWItdGlja2V0IGNhbWUgb3V0IGRldGFjaGVkLiBTYW1lIHJ1bGUgYXMgZm9yIHN1Yi1lcXVpcG1lbnRzOiBhIHBhcmVudFxyXG4gICAgICAgICAgICAgICAgLy8gd2l0aCBubyBjb3BpZWQgY291bnRlcnBhcnQgaXMgZHJvcHBlZCByYXRoZXIgdGhhbiBsZWZ0IHBvaW50aW5nIGF0IHRoZSBzb3VyY2VcclxuICAgICAgICAgICAgICAgIC8vIHNwYWNlJ3MgdGlja2V0LlxyXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBzb3VyY2VPYmogb2Ygc291cmNlVGlja2V0cykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJhd1NvdXJjZSA9IHNvdXJjZU9iaiBhcyBhbnk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3SWQgPSBlbGVtZW50SWRzW3NvdXJjZU9iai5pZF07XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3UGFyZW50SWQgPSByYXdTb3VyY2UucGFyZW50SUQgPyBlbGVtZW50SWRzW3Jhd1NvdXJjZS5wYXJlbnRJRF0gOiBudWxsO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAobmV3SWQgJiYgbmV3UGFyZW50SWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMudGlja2V0U2VydmljZS51cGRhdGVUaWNrZXQoeyBpZDogbmV3SWQsIHBhcmVudElEOiBuZXdQYXJlbnRJZCB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAocGFyZW50RXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yIHJlbWFwcGluZyB0aGUgcGFyZW50IHRpY2tldCBvZiBcIiR7c291cmNlT2JqPy50aXRsZX1cIjpgLCBwYXJlbnRFcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvdW50Kys7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ0NvcHlJdGVtRXJyb3IocGFyZW50RXJyb3IsICdlcnJvclRpY2tldCcsIHNvdXJjZU9iaj8udGl0bGUgfHwgc291cmNlT2JqPy5pZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gRVFVSVBNRU5UUyAoaWRlbnRpdHksIFBPSSwgUEhPVE8gYW5kIE5PVEVTL2RvY3VtZW50cyBhbGwgY29waWVkIOKAlCBmaWxlc1xyXG4gICAgICAgICAgICAgICAgLy8gcGh5c2ljYWxseSBkdXBsaWNhdGVkIGluIFMzIGZpcnN0LCBzbyB0aGUgY29weSBzdGF5cyBpbmRlcGVuZGVudCBmcm9tIHRoZSBzb3VyY2UpXHJcbiAgICAgICAgICAgICAgICAvL1xyXG4gICAgICAgICAgICAgICAgLy8gQ0FSRUZVTDogdGhlIEVxdWlwbWVudCBtb2RlbCBoYXMgTk8gYHRpdGxlYCBhbmQgTk8gYGRlc2NyaXB0aW9uYCBjb2x1bW4uIEl0XHJcbiAgICAgICAgICAgICAgICAvLyBpZGVudGlmaWVzIGl0c2VsZiB3aXRoIGBuYW1lYCAoU3RyaW5nISDigJQgcmVxdWlyZWQpIGFuZCBhbm5vdGF0ZXMgaXRzZWxmIHdpdGhcclxuICAgICAgICAgICAgICAgIC8vIGBhbm5vdGF0aW9uYC4gUmVhZGluZyBgcmF3U291cmNlLnRpdGxlYCB0aGVyZWZvcmUgYWx3YXlzIHlpZWxkZWQgdW5kZWZpbmVkIGFuZFxyXG4gICAgICAgICAgICAgICAgLy8gdGhlIHJlcXVpcmVkIGBuYW1lYCB3YXMgbmV2ZXIgc2VudCwgd2hpY2ggQXBwU3luYyByZWplY3RlZCB3aXRoXHJcbiAgICAgICAgICAgICAgICAvLyBcIlZhcmlhYmxlICdpbnB1dCcgaGFzIGNvZXJjZWQgTnVsbCB2YWx1ZSBmb3IgTm9uTnVsbCB0eXBlICdTdHJpbmchJ1wiLlxyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzb3VyY2VFcXVpcG1lbnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc291cmNlT2JqID0gc291cmNlRXF1aXBtZW50c1tpXTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXF1aXBtZW50IGhhcyBubyBgdGl0bGVgL2BkZXNjcmlwdGlvbmA6IGl0IGlkZW50aWZpZXMgaXRzZWxmIGJ5IG5hbWUsIGFuZCBieVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXJpYWwgbnVtYmVyIHdoZW4gb25lIGlzIHJlY29yZGVkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBleGlzdGluZ01hdGNoID0gdGhpcy5maW5kRXhpc3RpbmcoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VPYmogYXMgYW55LCB0YXJnZXRFcXVpcG1lbnRzIGFzIGFueSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlOiBhbnkpID0+IFtlLm5hbWUsIGUuc2VyaWFsTnVtYmVyXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nTWF0Y2gpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscmVhZHlQcmVzZW50Q291bnQrKztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWV4aXN0aW5nTWF0Y2gpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJhd1NvdXJjZSA9IHNvdXJjZU9iaiBhcyBhbnk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvcGllZFBob3RvS2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyYXdTb3VyY2UucGhvdG8pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3BpZWRQaG90b0tleSA9IGF3YWl0IHRoaXMuY29weVMzS2V5SWZQcmVzZW50KHJhd1NvdXJjZS5waG90bywgYGVxdWlwbWVudCBwaG90byBcIiR7cmF3U291cmNlLm5hbWV9XCJgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlcXVpcG1lbnRJbnB1dDogYW55ID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHJhd1NvdXJjZS5uYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVubGlrZSBldmVyeSBvdGhlciBtb2RlbCB0aGlzIGZpbGUgY29waWVzLCBFcXVpcG1lbnQgZGVjbGFyZXNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBgY3JlYXRlZEF0YCBhcyBhIHBsYWluIGNsaWVudC1zZXR0YWJsZSBmaWVsZCByYXRoZXIgdGhhbiBhblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFwcFN5bmMtbWFuYWdlZCB0aW1lc3RhbXAgKHNlZSBzY2hlbWEuZ3JhcGhxbCkg4oCUIHNvLCB1bmlxdWVseVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhlcmUsIHRoZSBvcmlnaW5hbCBjb21taXNzaW9uaW5nIGRhdGUgY2FuIGFjdHVhbGx5IGJlIGtlcHRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnN0ZWFkIG9mIHRoZSBjb3B5IHNpbGVudGx5IGdldHRpbmcgdG9kYXkncyBkYXRlLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZWRBdDogcmF3U291cmNlLmNyZWF0ZWRBdCA/PyBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm90YXRpb246IHJhd1NvdXJjZS5hbm5vdGF0aW9uID8/IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiByYXdTb3VyY2Uuc3RhdHVzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZ1bGwgaWRlbnRpdHkgb2YgdGhlIGVxdWlwbWVudCDigJQgYWxsIG9mIHRoZXNlIHdlcmUgZHJvcHBlZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbWlseTogcmF3U291cmNlLmZhbWlseSA/PyBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNrdTogcmF3U291cmNlLnNrdSA/PyBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbE51bWJlcjogcmF3U291cmNlLnNlcmlhbE51bWJlciA/PyBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbnVmYWN0dXJlcjogcmF3U291cmNlLm1hbnVmYWN0dXJlciA/PyBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbGxEYXRlOiByYXdTb3VyY2UuaW5zdGFsbERhdGUgPz8gbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJyYW50eUVuZERhdGU6IHJhd1NvdXJjZS53YXJyYW50eUVuZERhdGUgPz8gbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YTogcmF3U291cmNlLm1ldGFkYXRhID8/IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNDcmVhdGVkQnlBSTogcmF3U291cmNlLmlzQ3JlYXRlZEJ5QUkgPz8gbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNaXNzaW9ucyBhcmUgcGVyLXNwYWNlOiBhIHNvdXJjZSBtaXNzaW9uIGlkIGRlc2lnbmF0ZXMgbm9ib2R5IGluXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHRhcmdldCBzcGFjZS4gQ2FycnlpbmcgdGhlIGxpc3Qgb3ZlciB3b3VsZCBsb29rIGxpa2UgcmVhbCBkYXRhXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hpbGUgaGlkaW5nIHRoZSBpdGVtIGZyb20gbm8gb25lIOKAlCByZXNldCBpdCwgYXMgZm9yIGZlYXR1cmVzLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyY2hpdmVkRm9yTWlzc2lvbklEOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNlSUQ6IHRhcmdldFNwYWNlSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmV1c2VkIHVuY2hhbmdlZCBpbiB0aGUgc2FtZSBvcmdhbmlzYXRpb24sIG1hdGNoZWQgYnkgbmFtZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFjcm9zcyB0d28g4oCUIHNlZSByZXNvbHZlRG9tYWluSUQoKS5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb21haW5JRDogdGhpcy5yZXNvbHZlRG9tYWluSUQocmF3U291cmNlLmRvbWFpbklEKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaG90bzogY29waWVkUGhvdG9LZXksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYHN1YmVxdWlwbWVudHNJRHNgIGlzIGRlbGliZXJhdGVseSBhYnNlbnQ6IGl0IGlzIHJlbWFwcGVkIHRvIHRoZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvcGllZCBlcXVpcG1lbnRzIGluIHRoZSBzZWNvbmQgcGFzcywgb25jZSB0aGV5IGFsbCBleGlzdC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY3JlYXRlZE9iajogYW55ID0gYXdhaXQgdGhpcy5lcXVpcG1lbnRTZXJ2aWNlLmNyZWF0ZUVxdWlwbWVudChlcXVpcG1lbnRJbnB1dCwgbnVsbCwgbnVsbCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNyZWF0ZWRPYmogJiYgY3JlYXRlZE9iai5pZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRJZHNbc291cmNlT2JqLmlkXSA9IGNyZWF0ZWRPYmouaWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29weSBub3RlcyAoZG9jdW1lbnRzLCB0ZWNobmljYWwvZmluYW5jaWFsL290aGVyL2NvbnRyYWN0dWFsL2ltYWdlIG5vdGVzKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNyZWF0ZWRPYmogJiYgcmF3U291cmNlLm5vdGVzPy5pdGVtcyAmJiByYXdTb3VyY2Uubm90ZXMuaXRlbXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc291cmNlTm90ZSBvZiByYXdTb3VyY2Uubm90ZXMuaXRlbXMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgbm90ZSB3aXRob3V0IGEgZmlsZSBpcyBzdGlsbCBhIG5vdGU6IGl0IGNhcnJpZXMgYSB0eXBlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgaXRzIHNpZ25hdHVyZS9leHBpcnkgZGF0ZXMuIFNraXBwaW5nIGl0LCBhcyB3YXMgZG9uZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVmb3JlLCBzaWxlbnRseSBkcm9wcGVkIHRob3NlIHJlY29yZHMgZW50aXJlbHkuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb3BpZWRLZXkgPSBzb3VyY2VOb3RlLmF0dGFjaG1lbnRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGF3YWl0IHRoaXMuY29weVMzS2V5SWZQcmVzZW50KHNvdXJjZU5vdGUuYXR0YWNobWVudCwgYGVxdWlwbWVudCBub3RlIGZvciBcIiR7c291cmNlT2JqPy5uYW1lfVwiYClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmVxdWlwbWVudFNlcnZpY2UuY3JlYXRlTm90ZVdpdGhFeGlzdGluZ0F0dGFjaG1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlZE9iai5pZCwgY29waWVkS2V5LCBzb3VyY2VOb3RlLnR5cGUsIHRhcmdldE1pc3Npb25JZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25EYXRlOiBzb3VyY2VOb3RlLnNpZ25EYXRlID8/IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGlyYXRpb25EYXRlOiBzb3VyY2VOb3RlLmV4cGlyYXRpb25EYXRlID8/IG51bGxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChub3RlRXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yIGNvcHlpbmcgbm90ZSBmb3IgZXF1aXBtZW50IFwiJHtzb3VyY2VPYmo/Lm5hbWV9XCI6YCwgbm90ZUVycm9yKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ291bnQrKztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nQ29weUl0ZW1FcnJvcihub3RlRXJyb3IsICdlcnJvckVxdWlwbWVudE5vdGUnLCBzb3VyY2VPYmo/Lm5hbWUgfHwgc291cmNlT2JqPy5pZCwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVxdWlwbWVudDogc291cmNlT2JqPy5uYW1lIHx8IHNvdXJjZU9iaj8uaWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc291cmNlUG9pIG9mIChzb3VyY2VPYmoucG9pcz8uaXRlbXMgfHwgW10pLmZpbHRlcihwID0+ICEhcCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNyZWF0ZUNvcGllZFBvaShcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlUG9pLCBjcmVhdGVkT2JqLmlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VOYXZQb3NpdGlvbnMsIHRhcmdldE5hdlBvc2l0aW9ucywgdHJhbnNmb3JtXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFuIGVxdWlwbWVudCBtYXRjaGluZyB0aGlzIG9uZSBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgdGFyZ2V0IHNwYWNlIOKAlFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbW9zdCBvZnRlbiBiZWNhdXNlIGEgUFJFVklPVVMgcnVuIG9mIHRoaXMgY29weSBhbHJlYWR5IGNyZWF0ZWQgaXQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGF0IGVhcmxpZXIgcnVuIG1heSBoYXZlIGJlZW4gaW50ZXJydXB0ZWQsIG9yIGhpdCBhIGJ1ZyB0aGF0IGhhc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2luY2UgYmVlbiBmaXhlZCAobWlzc2luZyBmYW1pbHkvbWFudWZhY3R1cmVyL2RvbWFpbklELy4uLiB3ZXJlIG9uY2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRyb3BwZWQgZW50aXJlbHkg4oCUIHNlZSB0aGUgY29tbWVudCBhYm92ZSksIGxlYXZpbmcgYW4gZXF1aXBtZW50IHdpdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGl0cyBpZGVudGl0eSBmaWVsZHMgZW1wdHkgZm9yZXZlcjogcmUtcnVubmluZyB0aGUgY29weSB1c2VkIHRvIHNraXBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGl0IG91dHJpZ2h0LCBzaW5jZSBpdCBhbHJlYWR5IFwiZXhpc3RzXCIsIHNvIHRoZSBnYXAgY291bGQgbmV2ZXIgaGVhbC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZS1ydW5uaW5nIHRoZSB0b29sIG11c3QgYmUgYWJsZSB0byByZXBhaXIgdGhhdDogYW55IGlkZW50aXR5IGZpZWxkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZXhpc3RpbmcgdGFyZ2V0IGVxdWlwbWVudCBpcyBtaXNzaW5nLCBhbmQgdGhlIHNvdXJjZSBoYXMsIGlzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaWxsZWQgaW4uIEZpZWxkcyB0aGUgdGFyZ2V0IGFscmVhZHkgY2FycmllcyBhIHZhbHVlIGZvciBhcmUgbGVmdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdW50b3VjaGVkLCBzbyBhIG1hbnVhbCBlZGl0IG1hZGUgaW4gdGhlIHRhcmdldCBzcGFjZSBpcyBuZXZlclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3ZlcndyaXR0ZW4gYnkgYW4gb2xkZXIgb3IgZGlmZmVyZW50IHNvdXJjZSB2YWx1ZS4gTm90ZXMgYW5kIFBPSXMgYXJlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOT1QgcmUtY3JlYXRlZCBoZXJlOiB1bmxpa2Ugc2NhbGFyIGZpZWxkcyB0aGV5IGNhbm5vdCBiZSBcIm1pc3NpbmcgdnMuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcmVzZW50XCIgY2hlY2tlZCB0aGUgc2FtZSB3YXksIGFuZCByZS1hZGRpbmcgdGhlbSBvbiBldmVyeSByZS1ydW4gb2ZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuIGFscmVhZHktaGVhbHRoeSBjb3B5IHdvdWxkIGR1cGxpY2F0ZSB0aGVtLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudElkc1tzb3VyY2VPYmouaWRdID0gZXhpc3RpbmdNYXRjaC5pZDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhlYWxlZEZpZWxkcyA9IGF3YWl0IHRoaXMuaGVhbEVxdWlwbWVudElkZW50aXR5KHNvdXJjZU9iaiBhcyBhbnksIGV4aXN0aW5nTWF0Y2ggYXMgYW55KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoZWFsZWRGaWVsZHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWxlZENvdW50Kys7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dIZWFsZWRJdGVtKCdlcXVpcG1lbnRIZWFsZWQnLCAoc291cmNlT2JqIGFzIGFueSk/Lm5hbWUgfHwgc291cmNlT2JqPy5pZCwgaGVhbGVkRmllbGRzKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGl0ZW1FcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBFcnJvciBjb3B5aW5nIGVxdWlwbWVudCBcIiR7c291cmNlT2JqPy5uYW1lfVwiIChpZDogJHtzb3VyY2VPYmo/LmlkfSk6YCwgaXRlbUVycm9yKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JDb3VudCsrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ0NvcHlJdGVtRXJyb3IoaXRlbUVycm9yLCAnZXJyb3JFcXVpcG1lbnQnLCBzb3VyY2VPYmo/Lm5hbWUgfHwgc291cmNlT2JqPy5pZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzZWRPdmVyYWxsKys7XHJcbiAgICAgICAgICAgICAgICAgICAgZW1pdFByb2dyZXNzKCdlcXVpcG1lbnRzJywgaSArIDEsIHNvdXJjZUVxdWlwbWVudHMubGVuZ3RoKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwY3QgPSBzb3VyY2VFcXVpcG1lbnRzLmxlbmd0aCA+IDAgPyBNYXRoLnJvdW5kKCgoaSArIDEpIC8gc291cmNlRXF1aXBtZW50cy5sZW5ndGgpICogMTAwKSA6IDEwMDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFN0ZXBQcm9ncmVzcygnZXF1aXBtZW50cycsICdlcXVpcG1lbnRzJywgcGN0KTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvLyBTZWNvbmQgcGFzczogcmVtYXAgc3ViZXF1aXBtZW50c0lEcyBvbiBuZXdseSBjcmVhdGVkIGVxdWlwbWVudHMgdG8gcG9pbnQgdG9cclxuICAgICAgICAgICAgICAgIC8vIHRoZWlyIGNvcGllZCBjb3VudGVycGFydHMuIElEcyB3aXRoIG5vIGNvcGllZCBjb3VudGVycGFydCAoc291cmNlIGVxdWlwbWVudFxyXG4gICAgICAgICAgICAgICAgLy8gd2Fzbid0IGNvcGllZCDigJQgZS5nLiBpdCBhbHJlYWR5IGV4aXN0ZWQgaW4gdGFyZ2V0LCBvciB3YXMgc2tpcHBlZCkgYXJlIGRyb3BwZWRcclxuICAgICAgICAgICAgICAgIC8vIHJhdGhlciB0aGFuIGxlZnQgZGFuZ2xpbmcgb3IgcG9pbnRpbmcgYmFjayBhdCB0aGUgc291cmNlIHNwYWNlJ3MgZXF1aXBtZW50LlxyXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBzb3VyY2VPYmogb2Ygc291cmNlRXF1aXBtZW50cykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJhd1NvdXJjZSA9IHNvdXJjZU9iaiBhcyBhbnk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3SWQgPSBlbGVtZW50SWRzW3NvdXJjZU9iai5pZF07XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0lkICYmIHJhd1NvdXJjZS5zdWJlcXVpcG1lbnRzSURzICYmIHJhd1NvdXJjZS5zdWJlcXVpcG1lbnRzSURzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVtYXBwZWQgPSByYXdTb3VyY2Uuc3ViZXF1aXBtZW50c0lEc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgoc3ViSWQ6IHN0cmluZykgPT4gZWxlbWVudElkc1tzdWJJZF0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKChpZDogc3RyaW5nIHwgdW5kZWZpbmVkKSA9PiAhIWlkKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZW1hcHBlZC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZXF1aXBtZW50U2VydmljZS51cGRhdGVFcXVpcG1lbnQoeyBpZDogbmV3SWQsIHN1YmVxdWlwbWVudHNJRHM6IHJlbWFwcGVkIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoc3ViRXF1aXBFcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yIHJlbWFwcGluZyBzdWItZXF1aXBtZW50cyBmb3IgXCIke3NvdXJjZU9iaj8ubmFtZX1cIjpgLCBzdWJFcXVpcEVycm9yKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvdW50Kys7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dDb3B5SXRlbUVycm9yKHN1YkVxdWlwRXJyb3IsICdlcnJvckVxdWlwbWVudFN1YkVxdWlwJywgc291cmNlT2JqPy5uYW1lIHx8IHNvdXJjZU9iaj8uaWQsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXF1aXBtZW50OiBzb3VyY2VPYmo/Lm5hbWUgfHwgc291cmNlT2JqPy5pZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8vIE9QRVJBVElPTlMg4oCUIHRoZSBUaWNrZXQ8LT5FcXVpcG1lbnQgam9pbiAoZHJpdmVzIFwiVGlja2V0cyBhY3R1ZWxzXCIgb24gdGhlXHJcbiAgICAgICAgICAgICAgICAvLyBlcXVpcG1lbnQgcGFnZSBhbmQgdGhlIGxpbmtlZC1lcXVpcG1lbnQgbGlzdCBvbiB0aGUgdGlja2V0IHBhZ2UpLiBCb3RoIHRoZVxyXG4gICAgICAgICAgICAgICAgLy8gVElDS0VUUyBhbmQgRVFVSVBNRU5UUyBwaGFzZXMgYWJvdmUgY29weSB0aGUgcmVjb3JkIGl0c2VsZiwgYnV0IG5laXRoZXIgb25lXHJcbiAgICAgICAgICAgICAgICAvLyB0b3VjaGVzIHRoaXMgam9pbiB0YWJsZSwgc28gZXZlcnkgbGluayBiZXR3ZWVuIGEgY29waWVkIHRpY2tldCBhbmQgYSBjb3BpZWRcclxuICAgICAgICAgICAgICAgIC8vIGVxdWlwbWVudCB3YXMgc2lsZW50bHkgZHJvcHBlZDogYm90aCBzaWRlcyBleGlzdGVkIGluIHRoZSB0YXJnZXQgc3BhY2UsIGJ1dFxyXG4gICAgICAgICAgICAgICAgLy8gcG9pbnRpbmcgYXQgbm9ib2R5LlxyXG4gICAgICAgICAgICAgICAgLy9cclxuICAgICAgICAgICAgICAgIC8vIFJ1bnMgYWZ0ZXIgYm90aCBwaGFzZXMsIG92ZXIgZXZlcnkgU09VUkNFIHRpY2tldCB0aGF0IGVuZGVkIHVwIG1hcHBlZCBpblxyXG4gICAgICAgICAgICAgICAgLy8gdGhlIHRhcmdldCBzcGFjZSAoZnJlc2hseSBjcmVhdGVkIE9SIGhlYWxlZCDigJQgZWxlbWVudElkcyBjb3ZlcnMgYm90aCksIHNvIGFcclxuICAgICAgICAgICAgICAgIC8vIHJlLXJ1biBvdmVyIGFuIGFscmVhZHktY29waWVkIHBhaXIgb2Ygc3BhY2VzIGNhbiBzdGlsbCBwaWNrIHVwIGxpbmtzIHRoYXRcclxuICAgICAgICAgICAgICAgIC8vIGFuIGVhcmxpZXIsIGluY29tcGxldGUgcnVuIG5ldmVyIGNyZWF0ZWQuXHJcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHNvdXJjZVRpY2tldCBvZiBzb3VyY2VUaWNrZXRzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3VGlja2V0SWQgPSBlbGVtZW50SWRzW3NvdXJjZVRpY2tldC5pZF07XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFuZXdUaWNrZXRJZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZU9wcyA9IGF3YWl0IHRoaXMub3BlcmF0aW9uU2VydmljZS5nZXRPcGVyYXRpb25zQnlUaWNrZXRJRChzb3VyY2VUaWNrZXQuaWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc291cmNlT3BzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlYWQgd2hhdCB0aGUgdGFyZ2V0IHRpY2tldCBpcyBhbHJlYWR5IGxpbmtlZCB0bywgc28gYSByZS1ydW4gbmV2ZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlcyBhIGR1cGxpY2F0ZSBPcGVyYXRpb24gZm9yIGEgbGluayB0aGF0IGFscmVhZHkgZXhpc3RzLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXRPcHMgPSBhd2FpdCB0aGlzLm9wZXJhdGlvblNlcnZpY2UuZ2V0T3BlcmF0aW9uc0J5VGlja2V0SUQobmV3VGlja2V0SWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsaW5rZWRFcXVpcG1lbnRJZHMgPSBuZXcgU2V0KHRhcmdldE9wcy5tYXAob3AgPT4gb3AuZXF1aXBtZW50SUQpKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc291cmNlT3Agb2Ygc291cmNlT3BzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdFcXVpcG1lbnRJZCA9IHNvdXJjZU9wLmVxdWlwbWVudElEID8gZWxlbWVudElkc1tzb3VyY2VPcC5lcXVpcG1lbnRJRF0gOiBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm8gY29waWVkIGNvdW50ZXJwYXJ0IGZvciB0aGUgc291cmNlIGVxdWlwbWVudCAobm90IGNvbGxlY3RlZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG91dHNpZGUgdGhlIGN1cnJlbnQgZmlsdGVyLCAuLi4pIOKAlCBzYW1lIHJ1bGUgYXMgZXZlcnl3aGVyZSBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiB0aGlzIGZpbGU6IGRyb3AgdGhlIGxpbmsgcmF0aGVyIHRoYW4gcG9pbnQgaXQgYXQgbm90aGluZyBvclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXQgdGhlIHNvdXJjZSBzcGFjZSdzIGVxdWlwbWVudC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbmV3RXF1aXBtZW50SWQgfHwgbGlua2VkRXF1aXBtZW50SWRzLmhhcyhuZXdFcXVpcG1lbnRJZCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMub3BlcmF0aW9uU2VydmljZS5jcmVhdGVPcGVyYXRpb24oeyB0aWNrZXRJRDogbmV3VGlja2V0SWQsIGVxdWlwbWVudElEOiBuZXdFcXVpcG1lbnRJZCB9IGFzIE9wZXJhdGlvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rZWRFcXVpcG1lbnRJZHMuYWRkKG5ld0VxdWlwbWVudElkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKG9wRXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3IgY29weWluZyB0aWNrZXQtZXF1aXBtZW50IGxpbmtzIGZvciBcIiR7c291cmNlVGlja2V0Py50aXRsZX1cIjpgLCBvcEVycm9yKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JDb3VudCsrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ0NvcHlJdGVtRXJyb3Iob3BFcnJvciwgJ2Vycm9yT3BlcmF0aW9uJywgc291cmNlVGlja2V0Py50aXRsZSB8fCBzb3VyY2VUaWNrZXQ/LmlkKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIE9CSkVDVFMgM0QgKHRoZSAzRCBtb2RlbCBmaWxlIGl0c2VsZiDigJQgYHBhdGhgIOKAlCBpcyBwaHlzaWNhbGx5IGR1cGxpY2F0ZWQgaW4gUzMpXHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc291cmNlT2JqZWN0czNELmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzb3VyY2VPYmogPSBzb3VyY2VPYmplY3RzM0RbaV07XHJcblxyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBleGlzdHNJblRhcmdldCA9IHRhcmdldE9iamVjdHMzRC5zb21lKHRhcmdldE9iaiA9PiB0YXJnZXRPYmoubmFtZSA9PT0gc291cmNlT2JqLm5hbWUpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoZXhpc3RzSW5UYXJnZXQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYWxyZWFkeVByZXNlbnRDb3VudCsrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWV4aXN0c0luVGFyZ2V0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJhd1NvdXJjZSA9IHNvdXJjZU9iaiBhcyBhbnk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBgcGF0aGAgbWVhbnMgdHdvIGRpZmZlcmVudCB0aGluZ3MgZGVwZW5kaW5nIG9uIGBzM0J1Y2tldGAsIGV4YWN0bHkgYXMgdGhlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZpZXdlciByZWFkcyBpdCAoc2VlIHZpZXdlci5jb21wb25lbnQudHMgYW5kIG1hdHRlcnBvcnQtb2JqZWN0M2Quc2VydmljZS50cyk6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAtIHMzQnVja2V0ID09PSB0cnVlICAtPiBhIGtleSBvZiBhIG1vZGVsIGZpbGUgdXBsb2FkZWQgdG8gUzMsIG91cnMgdG8gZHVwbGljYXRlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgLSBvdGhlcndpc2UgICAgICAgICAgLT4gYSByZWZlcmVuY2UgaW50byB0aGUgM0Qgb2JqZWN0IGxpYnJhcnkgc2hpcHBlZCB3aXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHRoZSBhcHBsaWNhdGlvbiAoXCIzRE9iamVjdHMvb2JqZWN0cy9jdWJlLmRhZVwiIC0+IGFzc2V0cy8zRG9iamVjdHMvLi4uKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgd2hpY2ggZXhpc3RzIGluIGV2ZXJ5IHNwYWNlIGFuZCBtdXN0IGJlIHJldXNlZCB2ZXJiYXRpbS5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29weWluZyB1bmNvbmRpdGlvbmFsbHkgbWVhbnQgZXZlcnkgbGlicmFyeSBvYmplY3QgZmFpbGVkIHdpdGggTm9TdWNoS2V5IGFuZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgd2hvbGUgM0Qgb2JqZWN0IHdhcyBza2lwcGVkLCBtb2RlbCBBTkQgUE9JLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29waWVkUGF0aCA9IHJhd1NvdXJjZS5wYXRoO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmF3U291cmNlLnBhdGggJiYgcmF3U291cmNlLnMzQnVja2V0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3BpZWRQYXRoID0gYXdhaXQgdGhpcy5jb3B5UzNLZXlJZlByZXNlbnQocmF3U291cmNlLnBhdGgsIGAzRCBvYmplY3QgXCIke3Jhd1NvdXJjZS5uYW1lfVwiYCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgKiBTdHJpY3QgcGFyc2VyIHRvIGVuc3VyZSBbZmxvYXQsIGZsb2F0LCBmbG9hdF0gZm9ybWF0IGZvciBHcmFwaFFMLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgKiBGb3JjZXMgbnVtYmVycywgaGFuZGxlcyBwb3RlbnRpYWwgRHluYW1vREIgb2JqZWN0IHN0cnVjdHVyZXMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAqIGFuZCBlbnN1cmVzIHdlIG5ldmVyIHNlbmQgWzAsMCwwXSBmb3Igc2NhbGUuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0b0Zsb2F0QXJyYXkgPSAodmFsOiBhbnksIGRlZmF1bHRWYWw6IG51bWJlcltdID0gWzAsIDAsIDBdKTogbnVtYmVyW10gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFycmF5OiBudW1iZXJbXSA9IFtdO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBEQiBmb3JtYXQgWyB7TjogXCIxXCJ9LCAuLi4gXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWwubGVuZ3RoID4gMCAmJiB0eXBlb2YgdmFsWzBdID09PSAnb2JqZWN0JyAmJiAnTicgaW4gdmFsWzBdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5ID0gdmFsLm1hcChpdGVtID0+IHBhcnNlRmxvYXQoaXRlbS5OKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIGFscmVhZHkgc3RhbmRhcmQgYXJyYXkgWzEsIDEsIDFdXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5ID0gdmFsLm1hcChpdGVtID0+IHBhcnNlRmxvYXQoaXRlbSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIG9iamVjdCB7eCwgeSwgen1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHZhbCAmJiB0eXBlb2YgdmFsID09PSAnb2JqZWN0Jykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5ID0gW3BhcnNlRmxvYXQodmFsLngpLCBwYXJzZUZsb2F0KHZhbC55KSwgcGFyc2VGbG9hdCh2YWwueildO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFbnN1cmUgd2UgcmV0dXJuIHZhbGlkIG51bWJlcnNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhcnJheS5tYXAobiA9PiBpc05hTihuKSA/IDAgOiBuKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgc2VydmljZSBpcyBzaGFyZWQsIGJ1dCB0aGUgdHdvIGFwcGxpY2F0aW9ucyBkbyBOT1QgZGVwbG95IHRoZSBzYW1lXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9iamVjdDNEIHNjaGVtYTogYHZpZXdGcnVzdHVtYCBleGlzdHMgb25seSBpbiBzbWFydGVycGxhbiwgYW5kIGBzY2FsZWBcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgW0Zsb2F0XSB0aGVyZSBidXQgYSBwbGFpbiBGbG9hdCBpbiBtdXNldW0uIFNlbmRpbmcgdGhlIHNtYXJ0ZXJwbGFuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNoYXBlIHRvIG11c2V1bSB3YXMgcmVqZWN0ZWQgd2l0aCBcIlRoZSB2YXJpYWJsZXMgaW5wdXQgY29udGFpbnMgYSBmaWVsZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGF0IGlzIG5vdCBkZWZpbmVkIGZvciBpbnB1dCBvYmplY3QgdHlwZSAnQ3JlYXRlT2JqZWN0M0RJbnB1dCdcIi5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGlucHV0IHRoZXJlZm9yZSBNSVJST1JTIHRoZSBzb3VyY2UgcmVjb3JkIGluc3RlYWQgb2YgaW1wb3NpbmcgYVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzaGFwZTogc291cmNlIGFuZCB0YXJnZXQgbGl2ZSBpbiB0aGUgc2FtZSBkZXBsb3ltZW50LCBzbyB3aGF0ZXZlciB0aGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc291cmNlIGNhcnJpZXMgaXMgZXhhY3RseSB3aGF0IHRoZSB0YXJnZXQgYWNjZXB0cy5cclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2JqZWN0M0RJbnB1dDogYW55ID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogY29waWVkUGF0aCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRlbGxzIHRoZSB2aWV3ZXIgaG93IHRvIGludGVycHJldCBgcGF0aGAuIERyb3BwaW5nIGl0IHR1cm5lZCBhblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUzMtaG9zdGVkIG1vZGVsIGludG8gYSBsaWJyYXJ5IHJlZmVyZW5jZSBvbiB0aGUgY29weSwgd2hpY2ggdGhlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB2aWV3ZXIgdGhlbiB0cmllZCB0byByZXNvbHZlIGFnYWluc3QgYXNzZXRzLyBhbmQgZmFpbGVkIHRvIGxvYWQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzM0J1Y2tldDogISFyYXdTb3VyY2UuczNCdWNrZXQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiByYXdTb3VyY2UubmFtZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiByYXdTb3VyY2UuZGVzY3JpcHRpb24gfHwgXCJcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNlSUQ6IHRhcmdldFNwYWNlSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogdG9GbG9hdEFycmF5KHJhd1NvdXJjZS5wb3NpdGlvbiwgWzAsIDAsIDBdKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdGF0aW9uOiB0b0Zsb2F0QXJyYXkocmF3U291cmNlLnJvdGF0aW9uLCBbMCwgMCwgMF0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3ZpZXdGcnVzdHVtJyBpbiByYXdTb3VyY2UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdDNESW5wdXQudmlld0ZydXN0dW0gPSAhIXJhd1NvdXJjZS52aWV3RnJ1c3R1bTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2NhbGUga2VlcHMgdGhlIHNvdXJjZSdzIG93biBzaGFwZTogYSBsaXN0IHN0YXlzIGEgbGlzdCwgYSBzY2FsYXIgc3RheXNcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYSBzY2FsYXIuIEFuIGFic2VudCBzY2FsZSBpcyBsZWZ0IHVuc2V0IHJhdGhlciB0aGFuIGludmVudGVkLCBzbyB0aGUgY29weVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZW5kZXJzIGV4YWN0bHkgbGlrZSB0aGUgb3JpZ2luYWwuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHJhd1NvdXJjZS5zY2FsZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdDNESW5wdXQuc2NhbGUgPSB0b0Zsb2F0QXJyYXkocmF3U291cmNlLnNjYWxlLCBbMSwgMSwgMV0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJhd1NvdXJjZS5zY2FsZSAhPT0gbnVsbCAmJiByYXdTb3VyY2Uuc2NhbGUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2NhbGFyU2NhbGUgPSBwYXJzZUZsb2F0KHJhd1NvdXJjZS5zY2FsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QzRElucHV0LnNjYWxlID0gTnVtYmVyLmlzTmFOKHNjYWxhclNjYWxlKSA/IDEgOiBzY2FsYXJTY2FsZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY3JlYXRlZE9iaiA9IGF3YWl0IHRoaXMub2JqZWN0M0RTZXJ2aWNlLmNyZWF0ZShvYmplY3QzRElucHV0KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjcmVhdGVkT2JqICYmIGNyZWF0ZWRPYmouaWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRJZHNbc291cmNlT2JqLmlkXSA9IGNyZWF0ZWRPYmouaWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc291cmNlUG9pIG9mIChzb3VyY2VPYmoucG9pcz8uaXRlbXMgfHwgW10pLmZpbHRlcihwID0+ICEhcCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY3JlYXRlQ29waWVkUG9pKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZVBvaSwgY3JlYXRlZE9iai5pZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VOYXZQb3NpdGlvbnMsIHRhcmdldE5hdlBvc2l0aW9ucywgdHJhbnNmb3JtXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoaXRlbUVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGJhY2tlbmQgY2FuIGRlbnkgY3JlYXRpb24gb2YgdGhpcyB3aG9sZSBtb2RlbCB0byB0aGUgc2lnbmVkLWluIGFjY291bnRcclxuICAgICAgICAgICAgICAgICAgICAvLyAoaW4gTVVTRVVNLCBPYmplY3QzRCBvbmx5IGdyYW50cyBnZXQvbGlzdCB0byB1c2VyUG9vbHMpLiBUaGUgZGVuaWFsIGlzIG5vdFxyXG4gICAgICAgICAgICAgICAgICAgIC8vIHBlci1pdGVtLCBzbyBldmVyeSByZW1haW5pbmcgb2JqZWN0IHdvdWxkIGZhaWwgaWRlbnRpY2FsbHk6IHJlcG9ydCBpdCBvbmNlLFxyXG4gICAgICAgICAgICAgICAgICAgIC8vIGFzIGEgcGVybWlzc2lvbiBwcm9ibGVtIHJhdGhlciB0aGFuIGEgY29weSBlcnJvciwgYW5kIHN0b3AgdGhlIHBoYXNlIGluc3RlYWRcclxuICAgICAgICAgICAgICAgICAgICAvLyBvZiBmaXJpbmcgb25lIGRvb21lZCBtdXRhdGlvbiBwZXIgb2JqZWN0LlxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzVW5hdXRob3JpemVkKGl0ZW1FcnJvcikpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVtYWluaW5nID0gc291cmNlT2JqZWN0czNELmxlbmd0aCAtIGk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihgW01hdHRlcnBvcnRUYWdDb3B5U2VydmljZV0gTm90IGFsbG93ZWQgdG8gY3JlYXRlIDNEIG9iamVjdHMgaW4gdGhlIHRhcmdldCBzcGFjZSwgc2tpcHBpbmcgJHtyZW1haW5pbmd9IG9mIHRoZW0uYCwgaXRlbUVycm9yKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JDb3VudCsrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ0l0ZW1FcnJvcignZXJyb3JPYmplY3RzM2ROb3RBbGxvd2VkJywgeyBjb3VudDogcmVtYWluaW5nIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2VkT3ZlcmFsbCArPSByZW1haW5pbmc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRQcm9ncmVzcygnb2JqZWN0czNkJywgc291cmNlT2JqZWN0czNELmxlbmd0aCwgc291cmNlT2JqZWN0czNELmxlbmd0aCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RlcFByb2dyZXNzKCdvYmplY3RzM2QnLCAnb2JqZWN0czNkJywgMTAwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBFcnJvciBjb3B5aW5nIG9iamVjdDNEIFwiJHtzb3VyY2VPYmo/Lm5hbWV9XCI6YCwgaXRlbUVycm9yKTtcclxuICAgICAgICAgICAgICAgICAgICBlcnJvckNvdW50Kys7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dDb3B5SXRlbUVycm9yKGl0ZW1FcnJvciwgJ2Vycm9yT2JqZWN0M2QnLCBzb3VyY2VPYmo/Lm5hbWUgfHwgc291cmNlT2JqPy5pZCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgcHJvY2Vzc2VkT3ZlcmFsbCsrO1xyXG4gICAgICAgICAgICAgICAgZW1pdFByb2dyZXNzKCdvYmplY3RzM2QnLCBpICsgMSwgc291cmNlT2JqZWN0czNELmxlbmd0aCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwY3QgPSBzb3VyY2VPYmplY3RzM0QubGVuZ3RoID4gMCA/IE1hdGgucm91bmQoKChpICsgMSkgLyBzb3VyY2VPYmplY3RzM0QubGVuZ3RoKSAqIDEwMCkgOiAxMDA7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldFN0ZXBQcm9ncmVzcygnb2JqZWN0czNkJywgJ29iamVjdHMzZCcsIHBjdCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIEZFQVRVUkVTIOKAlCB0aGUgXCJQT0lcIiBvZiB0aGUgTVVTRVVNIG1vZHVsZTogaXRzIG93biByZWNvcmQgKHRpdGxlLCBpbmRleCwgbG9jYWxlLFxyXG4gICAgICAgICAgICAvLyBrZXl3b3JkcyksIGl0cyBtZWRpYSBzZXQgKG9uZSBDb21tZW50IHBlciBpbWFnZS92aWRlby9hdWRpby9kb2N1bWVudC9saW5rL3RleHQpXHJcbiAgICAgICAgICAgIC8vIGFuZCBpdHMgUE9JIHJlY29yZCAodGhlIHBhc3RpbGxlOiBpY29uLCB0YWcgZGVzY3JpcHRpb24sIGNvdmVyIGltYWdlKS5cclxuICAgICAgICAgICAgLy8gRXZlcnl0aGluZyBpcyBjb3BpZWQgaGVyZSwgZmlsZXMgcGh5c2ljYWxseSBkdXBsaWNhdGVkIGluIFMzIGZpcnN0LlxyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNvdXJjZUZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzb3VyY2VPYmogPSBzb3VyY2VGZWF0dXJlc1tpXTtcclxuXHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nTWF0Y2ggPSB0aGlzLmZpbmRFeGlzdGluZyhcclxuICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlT2JqIGFzIGFueSwgdGFyZ2V0RmVhdHVyZXMgYXMgYW55LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoZjogYW55KSA9PiBbZi50aXRsZSwgZi5kZXNjcmlwdGlvbl1cclxuICAgICAgICAgICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdNYXRjaCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhbHJlYWR5UHJlc2VudENvdW50Kys7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghZXhpc3RpbmdNYXRjaCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByYXdTb3VyY2UgPSBzb3VyY2VPYmogYXMgYW55O1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVzb2x2ZWQganVzdCBiZWZvcmUgdGhlIHdyaXRlOiBhIGtleXdvcmQgaXMgb25seSBjcmVhdGVkIGluIHRoZSB0YXJnZXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3BhY2Ugd2hlbiB0aGUgUE9JIGNhcnJ5aW5nIGl0IGlzIGFib3V0IHRvIGJlIGNyZWF0ZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkSGFzaHRhZ3MgPSBhd2FpdCB0aGlzLnJlc29sdmVIYXNodGFnSWRzKHJhd1NvdXJjZS5oYXNodGFncywgdGFyZ2V0U3BhY2VJZCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmZWF0dXJlSW5wdXQ6IGFueSA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiByYXdTb3VyY2UudGl0bGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydERlc2NyaXB0aW9uOiByYXdTb3VyY2Uuc2hvcnREZXNjcmlwdGlvbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsOiByYXdTb3VyY2UubGV2ZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiByYXdTb3VyY2UudHlwZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBpbmRleGAgZHJpdmVzIHRoZSBvcmRlcmluZyBvZiB0aGUgUE9JIGluIHRoZSBzcGFjZSdzIGxpc3QsIGluIHRoZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGF0ZXJhbCBtZW51IGFuZCBpbiB0aGUgZ3VpZGVkIHRvdXIuIERyb3BwaW5nIGl0IGZvcmNlZCBhIGZ1bGwgbWFudWFsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZW51bWJlcmluZyBvZiBldmVyeSBjb3BpZWQgUE9JLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg6IHJhd1NvdXJjZS5pbmRleCA/PyBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWlzc2lvbnMgYXJlIHBlci1zcGFjZTogc291cmNlIG1pc3Npb24gaWRzIG1lYW4gbm90aGluZyBpbiB0aGUgdGFyZ2V0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzcGFjZSwgc28gYW4gYXJjaGl2ZSBsaXN0IGNhcnJpZWQgb3ZlciB3b3VsZCBoaWRlIFBPSXMgZnJvbSBub2JvZHlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoaWxlIGxvb2tpbmcgbGlrZSByZWFsIGRhdGEuIFJlc2V0IGluc3RlYWQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmNoaXZlZEZvck1pc3Npb25JRDogbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlwZVByb2R1Y3RJRDogcmF3U291cmNlLnN0cmlwZVByb2R1Y3RJRCB8fCBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaXBlUHJpY2VJRDogcmF3U291cmNlLnN0cmlwZVByaWNlSUQgfHwgbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2tpbmdQcmljZU1ldGFkYXRhOiByYXdTb3VyY2UuYm9va2luZ1ByaWNlTWV0YWRhdGEgfHwgbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsZTogcmF3U291cmNlLmxvY2FsZSB8fCBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSGFzaHRhZ3MgYXJlIHNwYWNlLXNjb3BlZCByZWNvcmRzOiB0aGUgaWRzIG11c3QgYmUgdHJhbnNsYXRlZCB0byB0aGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVxdWl2YWxlbnQgaGFzaHRhZ3Mgb2YgdGhlIHRhcmdldCBzcGFjZSAoY3JlYXRlZCBvbiBkZW1hbmQpLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaHRhZ3M6IHJlc29sdmVkSGFzaHRhZ3MsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogcmF3U291cmNlLmRlc2NyaXB0aW9uIHx8IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXVzZWQgdW5jaGFuZ2VkIGluIHRoZSBzYW1lIG9yZ2FuaXNhdGlvbiwgbWF0Y2hlZCBieSBuYW1lXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhY3Jvc3MgdHdvIOKAlCBzZWUgcmVzb2x2ZURvbWFpbklEKCkuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb21haW5JRDogdGhpcy5yZXNvbHZlRG9tYWluSUQocmF3U291cmNlLmRvbWFpbklEKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNlSUQ6IHRhcmdldFNwYWNlSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvd25lck1pc3Npb25JRDogdGFyZ2V0TWlzc2lvbklkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjcmVhdGVkT2JqID0gYXdhaXQgdGhpcy5mZWF0dXJlU2VydmljZS5jcmVhdGVGZWF0dXJlKGZlYXR1cmVJbnB1dCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3JlYXRlZE9iaiAmJiBjcmVhdGVkT2JqLmlkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50SWRzW3NvdXJjZU9iai5pZF0gPSBjcmVhdGVkT2JqLmlkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGZlYXR1cmUgZXhpc3RzOiBpdHMga2V5d29yZHMgYXJlIG5vdyBnZW51aW5lbHkgcmVmZXJlbmNlZCBhbmRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG11c3Qgc3Vydml2ZSB0aGUgZW5kLW9mLXJ1biBjbGVhbnVwLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXJrSGFzaHRhZ3NVc2VkKHJlc29sdmVkSGFzaHRhZ3MpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3JlYXRlZE9iaikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVhZCB0aGUgbWVkaWEgc2V0IHRocm91Z2ggaXRzIG93biBwYWdpbmF0ZWQgcXVlcnk6IHRoZSBgY29tbWVudHNgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25uZWN0aW9uIGVtYmVkZGVkIGluIEZlYXR1cmVzQnlTcGFjZSBpcyBjYXBwZWQgYXQgMTAwIGl0ZW1zIGFuZCBpdHNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5leHRUb2tlbiB3YXMgbmV2ZXIgZm9sbG93ZWQsIHNvIHJpY2ggUE9JcyBsb3N0IGF0dGFjaG1lbnRzIHNpbGVudGx5LlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNvdXJjZUNvbW1lbnRzOiBDb21tZW50W10gPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlQ29tbWVudHMgPSBhd2FpdCB0aGlzLmNvbW1lbnRTZXJ2aWNlLmdldEFsbENvbW1lbnRzRm9yRmVhdHVyZShzb3VyY2VPYmouaWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoY29tbWVudHNGZXRjaEVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGBGYWxsaW5nIGJhY2sgdG8gdGhlIGVtYmVkZGVkIGNvbW1lbnQgbGlzdCBmb3IgZmVhdHVyZSBcIiR7cmF3U291cmNlLnRpdGxlfVwiOmAsIGNvbW1lbnRzRmV0Y2hFcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlQ29tbWVudHMgPSAoc291cmNlT2JqLmNvbW1lbnRzPy5pdGVtcyB8fCBbXSkuZmlsdGVyKGMgPT4gISFjKSBhcyBDb21tZW50W107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBzb3VyY2VDb21tZW50IG9mIHRoaXMub3JkZXJDb21tZW50c0ZvckNvcHkoc291cmNlQ29tbWVudHMpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY3JlYXRlZCA9IGF3YWl0IHRoaXMuY29weUNvbW1lbnRGb3JGZWF0dXJlKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlQ29tbWVudCwgY3JlYXRlZE9iai5pZCwgdGFyZ2V0U3BhY2VJZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3JlYXRlZD8uaWQgJiYgKHNvdXJjZUNvbW1lbnQgYXMgYW55KS5pZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21tZW50SWRzLnNldCgoc291cmNlQ29tbWVudCBhcyBhbnkpLmlkLCBjcmVhdGVkLmlkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGF0dGFjaG1lbnRFcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBFcnJvciBjb3B5aW5nIGF0dGFjaG1lbnQgXCIke3NvdXJjZUNvbW1lbnQ/LnRpdGxlfVwiIGZvciBmZWF0dXJlIFwiJHtzb3VyY2VPYmo/LnRpdGxlfVwiOmAsIGF0dGFjaG1lbnRFcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ291bnQrKztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dDb3B5SXRlbUVycm9yKGF0dGFjaG1lbnRFcnJvciwgJ2Vycm9yRmVhdHVyZUF0dGFjaG1lbnQnLCBzb3VyY2VDb21tZW50Py50aXRsZSB8fCAoc291cmNlQ29tbWVudCBhcyBhbnkpPy5pZCwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZTogcmF3U291cmNlLnRpdGxlIHx8IHNvdXJjZU9iai5pZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXZlcnkgUE9JIG9mIHRoZSBmZWF0dXJlLCBub3Qgb25seSB0aGUgZmlyc3Qgb25lOiBhIGZlYXR1cmUgbWF5IGJlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwaW5uZWQgYXQgc2V2ZXJhbCBwbGFjZXMsIGFuZCBvbmx5IHRoaXMgcGhhc2Uga25vd3MgdGhlIG5ldyBlbGVtZW50IGlkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc291cmNlRmVhdHVyZVBvaXMgPSAoc291cmNlT2JqLnBvaXM/Lml0ZW1zIHx8IFtdKS5maWx0ZXIocCA9PiAhIXApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBzb3VyY2VQb2kgb2Ygc291cmNlRmVhdHVyZVBvaXMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNyZWF0ZUNvcGllZFBvaShcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlUG9pLCBjcmVhdGVkT2JqLmlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VOYXZQb3NpdGlvbnMsIHRhcmdldE5hdlBvc2l0aW9ucywgdHJhbnNmb3JtXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNhbWUgcmVhc29uaW5nIGFzIHRoZSBFUVVJUE1FTlRTIHBoYXNlIChzZWUgdGhlIGNvbW1lbnQgdGhlcmUpOiBhXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZlYXR1cmUgbWF0Y2hpbmcgdGhpcyBvbmUgYWxyZWFkeSBleGlzdHMgaW4gdGhlIHRhcmdldCBzcGFjZSwgbW9zdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBsaWtlbHkgZnJvbSBhbiBlYXJsaWVyLCBpbmNvbXBsZXRlIHJ1bi4gRmlsbCBpbiB3aGF0ZXZlciBpZGVudGl0eVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmaWVsZCBpdCBpcyBtaXNzaW5nIHJhdGhlciB0aGFuIGxlYXZpbmcgaXQgdW50b3VjaGVkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50SWRzW3NvdXJjZU9iai5pZF0gPSBleGlzdGluZ01hdGNoLmlkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoZWFsZWRGaWVsZHMgPSBhd2FpdCB0aGlzLmhlYWxGZWF0dXJlSWRlbnRpdHkoc291cmNlT2JqIGFzIGFueSwgZXhpc3RpbmdNYXRjaCBhcyBhbnkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGVhbGVkRmllbGRzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWxlZENvdW50Kys7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ0hlYWxlZEl0ZW0oJ2ZlYXR1cmVIZWFsZWQnLCAoc291cmNlT2JqIGFzIGFueSk/LnRpdGxlIHx8IHNvdXJjZU9iaj8uaWQsIGhlYWxlZEZpZWxkcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChpdGVtRXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBFcnJvciBjb3B5aW5nIGZlYXR1cmUgXCIke3NvdXJjZU9iaj8udGl0bGV9XCIgKGlkOiAke3NvdXJjZU9iaj8uaWR9KTpgLCBpdGVtRXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgIGVycm9yQ291bnQrKztcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ0NvcHlJdGVtRXJyb3IoaXRlbUVycm9yLCAnZXJyb3JGZWF0dXJlJywgc291cmNlT2JqPy50aXRsZSB8fCBzb3VyY2VPYmo/LmlkKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBwcm9jZXNzZWRPdmVyYWxsKys7XHJcbiAgICAgICAgICAgICAgICBlbWl0UHJvZ3Jlc3MoJ2ZlYXR1cmVzJywgaSArIDEsIHNvdXJjZUZlYXR1cmVzLmxlbmd0aCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwY3QgPSBzb3VyY2VGZWF0dXJlcy5sZW5ndGggPiAwID8gTWF0aC5yb3VuZCgoKGkgKyAxKSAvIHNvdXJjZUZlYXR1cmVzLmxlbmd0aCkgKiAxMDApIDogMTAwO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTdGVwUHJvZ3Jlc3MoJ2ZlYXR1cmVzJywgJ2ZlYXR1cmVzJywgcGN0KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gTUVBU1VSRU1FTlRTIChJTU1PIG9ubHkg4oCUIGEgQ29tbWVudCArIGEgcG9zaXRpb25hbC1vbmx5IFBPSSwgbm8gcm90YXRpb247XHJcbiAgICAgICAgICAgIC8vIHRoZSBzY3JlZW5zaG90IGZpbGUgaXMgcGh5c2ljYWxseSBkdXBsaWNhdGVkIGluIFMzIGZpcnN0KVxyXG4gICAgICAgICAgICBpZiAodGhpcy5zcE1vZHVsZSA9PSBTcE1vZHVsZS5JTU1PKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNvdXJjZU1lYXN1cmVtZW50cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZU1lYXN1cmVtZW50ID0gc291cmNlTWVhc3VyZW1lbnRzW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4aXN0c0luVGFyZ2V0ID0gdGFyZ2V0TWVhc3VyZW1lbnRzLnNvbWUoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bSA9PiB0bS5jb21tZW50LnRpdGxlID09PSBzb3VyY2VNZWFzdXJlbWVudC5jb21tZW50LnRpdGxlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXhpc3RzSW5UYXJnZXQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscmVhZHlQcmVzZW50Q291bnQrKztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWV4aXN0c0luVGFyZ2V0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByYXdDb21tZW50ID0gc291cmNlTWVhc3VyZW1lbnQuY29tbWVudCBhcyBhbnk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvcGllZEFubmV4ZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmF3Q29tbWVudC5hbm5leGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3BpZWRBbm5leGUgPSBhd2FpdCB0aGlzLmNvcHlTM0tleUlmUHJlc2VudChyYXdDb21tZW50LmFubmV4ZSwgYG1lYXN1cmVtZW50IHNjcmVlbnNob3QgXCIke3Jhd0NvbW1lbnQudGl0bGV9XCJgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21tZW50SW5wdXQ6IGFueSA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogcmF3Q29tbWVudC50aXRsZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogcmF3Q29tbWVudC5kZXNjcmlwdGlvbiA/PyBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhOiByYXdDb21tZW50Lm1ldGFkYXRhID8/IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogQ29tbWVudFR5cGUuTUVBU1VSRSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaW1lbnNpb25zOiByYXdDb21tZW50LmRpbWVuc2lvbnMgfHwgbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5leGU6IGNvcGllZEFubmV4ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFjZUlEOiB0YXJnZXRTcGFjZUlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNhbWUgYXV0aG9yc2hpcCBydWxlIGFzIGV2ZXJ5IG90aGVyIGNvcGllZCBjb21tZW50IOKAlCBzZWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXNvbHZlQ29tbWVudE93bmVySUQoKS5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvd25lcklEOiB0aGlzLnJlc29sdmVDb21tZW50T3duZXJJRChyYXdDb21tZW50Lm93bmVySUQpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjcmVhdGVkQ29tbWVudDogQ29tbWVudCA9IGF3YWl0IHRoaXMuY29tbWVudFNlcnZpY2UuY3JlYXRlQ29tbWVudChjb21tZW50SW5wdXQpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjcmVhdGVkQ29tbWVudCAmJiAoY3JlYXRlZENvbW1lbnQgYXMgYW55KS5pZCAmJiByYXdDb21tZW50LmlkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21tZW50SWRzLnNldChyYXdDb21tZW50LmlkLCAoY3JlYXRlZENvbW1lbnQgYXMgYW55KS5pZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNyZWF0ZWRDb21tZW50ICYmIHNvdXJjZU1lYXN1cmVtZW50LnBvaSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldFN3ZWVwSWQgPSB0aGlzLmZpbmRDbG9zZXN0VGFyZ2V0U3dlZXBJZChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlTWVhc3VyZW1lbnQucG9pLm1hdHRlcnBvcnRTd2VlcElELCBzb3VyY2VOYXZQb3NpdGlvbnMsIHRhcmdldE5hdlBvc2l0aW9ucywgdHJhbnNmb3JtXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhZGp1c3RlZFBvc2l0aW9uID0gdGhpcy5nZXRBZGp1c3RlZFBvc2l0aW9uT25seShzb3VyY2VNZWFzdXJlbWVudC5wb2kuY29vcmRpbmF0ZSwgdHJhbnNmb3JtKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwb2lJbnB1dDogUE9JID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb29yZGluYXRlOiBKU09OLnN0cmluZ2lmeShhZGp1c3RlZFBvc2l0aW9uKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogUG9pVHlwZS5NRUFTVVJFLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50SUQ6IChjcmVhdGVkQ29tbWVudCBhcyBhbnkpLmlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTYW1lIHRyZWF0bWVudCBhcyBhbnkgb3RoZXIgUE9JOiB0aGUgc291cmNlJ3MgTWF0dGVycG9ydCB0YWdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU0lEIG11c3Qgbm90IHRyYXZlbCwgYW5kIHRoZSBzdGVtIG5vcm1hbCBoYXMgdG8gYmUgcm90YXRlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGE6IHRoaXMuZ2V0QWRqdXN0ZWRQb2lNZXRhZGF0YShzb3VyY2VNZWFzdXJlbWVudC5wb2kubWV0YWRhdGEsIHRyYW5zZm9ybSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdHRlcnBvcnRTd2VlcElEOiB0YXJnZXRTd2VlcElkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnBvaVNlcnZpY2UuY3JlYXRlUE9JRm9yU3BhY2VJRChwb2lJbnB1dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChpdGVtRXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3IgY29weWluZyBtZWFzdXJlbWVudCBcIiR7c291cmNlTWVhc3VyZW1lbnQ/LmNvbW1lbnQ/LnRpdGxlfVwiOmAsIGl0ZW1FcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ291bnQrKztcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dDb3B5SXRlbUVycm9yKGl0ZW1FcnJvciwgJ2Vycm9yTWVhc3VyZW1lbnQnLCBzb3VyY2VNZWFzdXJlbWVudD8uY29tbWVudD8udGl0bGUgfHwgc291cmNlTWVhc3VyZW1lbnQ/LmlkKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZE92ZXJhbGwrKztcclxuICAgICAgICAgICAgICAgICAgICBlbWl0UHJvZ3Jlc3MoJ21lYXN1cmVtZW50cycsIGkgKyAxLCBzb3VyY2VNZWFzdXJlbWVudHMubGVuZ3RoKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwY3QgPSBzb3VyY2VNZWFzdXJlbWVudHMubGVuZ3RoID4gMCA/IE1hdGgucm91bmQoKChpICsgMSkgLyBzb3VyY2VNZWFzdXJlbWVudHMubGVuZ3RoKSAqIDEwMCkgOiAxMDA7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRTdGVwUHJvZ3Jlc3MoJ21lYXN1cmVtZW50cycsICdtZWFzdXJlbWVudHMnLCBwY3QpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBQT0lTIOKAlCBzdGFuZGFsb25lIG9uZXMgb25seTogZXZlcnkgUE9JIG93bmVkIGJ5IGFuIGVsZW1lbnQgd2FzIGFscmVhZHkgY3JlYXRlZCBieVxyXG4gICAgICAgICAgICAvLyB0aGF0IGVsZW1lbnQncyBwaGFzZSwgd2l0aCB0aGUgZWxlbWVudCdzIE5FVyBpZC5cclxuICAgICAgICAgICAgLy9cclxuICAgICAgICAgICAgLy8gVGhpcyBwaGFzZSBydW5zIExBU1Qgb24gcHVycG9zZS4gSXQgdXNlZCB0byBydW4gdGhpcmQsIGJlZm9yZSAzRCBvYmplY3RzLCBmZWF0dXJlc1xyXG4gICAgICAgICAgICAvLyBhbmQgbWVhc3VyZW1lbnRzIGV4aXN0ZWQgaW4gdGhlIHRhcmdldCBzcGFjZSwgc28gYGVsZW1lbnRJZHNgIGFuZCBgY29tbWVudElkc2Agd2VyZVxyXG4gICAgICAgICAgICAvLyBzdGlsbCBlbXB0eSB3aGVuIGl0IG5lZWRlZCB0aGVtOiBlbGVtZW50SUQgc3RheWVkIHBvaW50aW5nIGF0IHRoZSBzb3VyY2Ugc3BhY2UgYW5kXHJcbiAgICAgICAgICAgIC8vIHRhZ0ltYWdlSUQgKGEgcmVmZXJlbmNlIHRvIGEgQ29tbWVudCByZWNvcmQpIGNvdWxkIG5ldmVyIGJlIHJlc29sdmVkLlxyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNvdXJjZVBvaXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZVBvaSA9IHNvdXJjZVBvaXNbaV07XHJcblxyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBDb21wYXJlZCBvbiB0aGUgcGFyc2VkIHBvc2l0aW9uLCB3aGVyZSB0aGUgY29weSBXT1VMRCBsYW5kOiB0aGUgc3RvcmVkIHN0cmluZ3NcclxuICAgICAgICAgICAgICAgICAgICAvLyBkaWZmZXIgaW4gZm9ybWF0ICgneyBcInhcIjonIHZzICd7XCJ4XCI6JykgYW5kLCBvbmNlIGxhbmRtYXJrcyBtb3ZlIHRoZSB0YWdzLCB0aGVcclxuICAgICAgICAgICAgICAgICAgICAvLyBzb3VyY2Ugc3RyaW5nIG5ldmVyIGVxdWFscyBpdHMgY29weSdzLCBzbyBldmVyeSByZS1ydW4gZHVwbGljYXRlZCB0aGVzZSBQT0lzLlxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4cGVjdGVkUG9zaXRpb24gPSB0aGlzLnBhcnNlQ29vcmRpbmF0ZSh0aGlzLmdldEFkanVzdGVkUG9zaXRpb25Pbmx5KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VQb2kuY29vcmRpbmF0ZSwgdHJhbnNmb3JtKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXhpc3RzSW5UYXJnZXQgPSB0YXJnZXRQb2lzLnNvbWUoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRwID0+IHRwLnRhZ0Rlc2NyaXB0aW9uID09PSBzb3VyY2VQb2kudGFnRGVzY3JpcHRpb25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHRoaXMuaXNTYW1lUG9zaXRpb24odGhpcy5wYXJzZUNvb3JkaW5hdGUodHAuY29vcmRpbmF0ZSksIGV4cGVjdGVkUG9zaXRpb24pXHJcbiAgICAgICAgICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGV4aXN0c0luVGFyZ2V0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFscmVhZHlQcmVzZW50Q291bnQrKztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFleGlzdHNJblRhcmdldCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50SUQgPSBzb3VyY2VQb2kuZWxlbWVudElEXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IChlbGVtZW50SWRzW3NvdXJjZVBvaS5lbGVtZW50SURdIHx8IHNvdXJjZVBvaS5lbGVtZW50SUQpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHNvdXJjZVBvaS5lbGVtZW50SUQ7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNyZWF0ZUNvcGllZFBvaShcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZVBvaSwgZWxlbWVudElELFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlTmF2UG9zaXRpb25zLCB0YXJnZXROYXZQb3NpdGlvbnMsIHRyYW5zZm9ybVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGl0ZW1FcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yIGNvcHlpbmcgUE9JIChzd2VlcDogJHtzb3VyY2VQb2k/Lm1hdHRlcnBvcnRTd2VlcElEfSk6YCwgaXRlbUVycm9yKTtcclxuICAgICAgICAgICAgICAgICAgICBlcnJvckNvdW50Kys7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dDb3B5SXRlbUVycm9yKGl0ZW1FcnJvciwgJ2Vycm9yUG9pJywgc291cmNlUG9pPy5tYXR0ZXJwb3J0U3dlZXBJRCwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzd2VlcDogc291cmNlUG9pPy5tYXR0ZXJwb3J0U3dlZXBJRFxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHByb2Nlc3NlZE92ZXJhbGwrKztcclxuICAgICAgICAgICAgICAgIGVtaXRQcm9ncmVzcygncG9pcycsIGkgKyAxLCBzb3VyY2VQb2lzLmxlbmd0aCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwY3QgPSBzb3VyY2VQb2lzLmxlbmd0aCA+IDAgPyBNYXRoLnJvdW5kKCgoaSArIDEpIC8gc291cmNlUG9pcy5sZW5ndGgpICogMTAwKSA6IDEwMDtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RlcFByb2dyZXNzKCdwb2lzJywgJ3BvaXMnLCBwY3QpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmNvcHlQcm9ncmVzcyQubmV4dCh7XHJcbiAgICAgICAgICAgICAgICBwaGFzZTogJ2RvbmUnLFxyXG4gICAgICAgICAgICAgICAgcHJvY2Vzc2VkSW5QaGFzZTogMCwgdG90YWxJblBoYXNlOiAwLFxyXG4gICAgICAgICAgICAgICAgcHJvY2Vzc2VkT3ZlcmFsbCwgdG90YWxPdmVyYWxsLFxyXG4gICAgICAgICAgICAgICAgcGVyY2VudDogMTAwLCBlcnJvckNvdW50LCBoZWFsZWRDb3VudFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdGhpcy5zZXRTdGVwTG9nKCdkb25lJywgZXJyb3JDb3VudCA+IDBcclxuICAgICAgICAgICAgICAgID8gdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnbWF0dGVycG9ydENvcHkuZG9uZVdpdGhFcnJvcnMnLCB7IGNvdW50OiBlcnJvckNvdW50IH0pXHJcbiAgICAgICAgICAgICAgICA6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ21hdHRlcnBvcnRDb3B5LmRvbmUnKSk7XHJcbiAgICAgICAgICAgIC8vIFNlcGFyYXRlIHN1bW1hcnkgbGluZSwgb24gdG9wIG9mIChub3QgaW5zdGVhZCBvZikgdGhlIGRvbmUvZG9uZVdpdGhFcnJvcnMgb25lXHJcbiAgICAgICAgICAgIC8vIGFib3ZlOiBoZWFsaW5nIGlzIG9ydGhvZ29uYWwgdG8gc3VjY2Vzcy9mYWlsdXJlLCBhbiBhbHJlYWR5LWNvbXBsZXRlIHJ1biBjYW5cclxuICAgICAgICAgICAgLy8gc3RpbGwgaGF2ZSByZXBhaXJlZCBpdGVtcyBsZWZ0IG92ZXIgZnJvbSBhbiBlYXJsaWVyLCBpbmNvbXBsZXRlIGF0dGVtcHQuXHJcbiAgICAgICAgICAgIGlmIChoZWFsZWRDb3VudCA+IDApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RlcExvZygnaGVhbGVkU3VtbWFyeScsIHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ21hdHRlcnBvcnRDb3B5LmhlYWxlZFN1bW1hcnknLCB7IGNvdW50OiBoZWFsZWRDb3VudCB9KSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gU2F5cyBwbGFpbmx5IHRoYXQgYSByZS1ydW4gY3JlYXRlZCBub3RoaW5nIG5ldywgaW5zdGVhZCBvZiBhIGJhcmUgXCJzdWNjZXNzXCIuXHJcbiAgICAgICAgICAgIGlmIChhbHJlYWR5UHJlc2VudENvdW50ID4gMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTdGVwTG9nKCdhbHJlYWR5UHJlc2VudFN1bW1hcnknLFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ21hdHRlcnBvcnRDb3B5LmFscmVhZHlQcmVzZW50U3VtbWFyeScsIHsgY291bnQ6IGFscmVhZHlQcmVzZW50Q291bnQgfSkpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBjb3B5aW5nIFBPSXM6JywgZXJyb3IpO1xyXG4gICAgICAgICAgICB0aGlzLmFwcGVuZEVycm9yTG9nKHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ21hdHRlcnBvcnRDb3B5LmVycm9yR2VuZXJhbCcsIHsgZXJyb3I6IHRvRXJyb3JNZXNzYWdlKGVycm9yKSB9KSk7XHJcbiAgICAgICAgICAgIHRoaXMuY29weVByb2dyZXNzJC5uZXh0KG51bGwpO1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfSBmaW5hbGx5IHtcclxuICAgICAgICAgICAgLy8gRXZlcnkgZXhpdCBwYXRoIOKAlCBzdWNjZXNzLCBwYXJ0aWFsIHN1Y2Nlc3MsIG9yIGdlbmVyYWwgZmFpbHVyZSDigJQgZ2l2ZXMgYmFjayB0aGVcclxuICAgICAgICAgICAgLy8ga2V5d29yZHMgdGhpcyBydW4gY3JlYXRlZCBidXQgbm8gY29waWVkIFBPSSBlbmRlZCB1cCB1c2luZy4gUGxhY2VkIGluIGBmaW5hbGx5YFxyXG4gICAgICAgICAgICAvLyBzbyBhbiBleGNlcHRpb24gdGhyb3duIG1pZC1jb3B5IGNhbm5vdCBsZWF2ZSB0aGVtIGJlaGluZCBlaXRoZXIuXHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY2xlYW51cFVudXNlZENyZWF0ZWRIYXNodGFncygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNlcmlhbGlzZXMgdGhlIGN1cnJlbnQgY29weSBsb2cgKHN0ZXAgbGluZXMgYXMgbGFzdCBlbWl0dGVkLCBwbHVzIGV2ZXJ5IGVycm9yIGFuZFxyXG4gICAgICogaGVhbGVkLWl0ZW0gbm90aWNlKSB0byBhIHBsYWluLXRleHQgZmlsZSBhbmQgdHJpZ2dlcnMgYSBicm93c2VyIGRvd25sb2FkIOKAlCB3aXJlZCB0byBhXHJcbiAgICAgKiBcImRvd25sb2FkIGxvZ1wiIGJ1dHRvbiBpbiB0aGUgY29weSBVSSwgc28gYW4gb3BlcmF0b3IgY2FuIGtlZXAgb3Igc2hhcmUgdGhlIGZ1bGwgcmVwb3J0XHJcbiAgICAgKiBvZiBhIHJ1biByYXRoZXIgdGhhbiBvbmx5IHRoZSB+MjAwcHggc2Nyb2xsYWJsZSBwYW5lbCBzaG93aW5nIGl0LlxyXG4gICAgICovXHJcbiAgICBkb3dubG9hZExvZyhmaWxlbmFtZT86IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSB0aGlzLmxvZy5tYXAoZW50cnkgPT4gZW50cnkudGV4dCkuam9pbignXFxuJyk7XHJcbiAgICAgICAgY29uc3QgZGVmYXVsdE5hbWUgPSBgbWF0dGVycG9ydC1jb3B5LWxvZy0ke25ldyBEYXRlKCkudG9JU09TdHJpbmcoKS5yZXBsYWNlKC9bOi5dL2csICctJyl9LnR4dGA7XHJcbiAgICAgICAgZG93bmxvYWRCbG9iKG5ldyBCbG9iKFt0ZXh0XSwgeyB0eXBlOiAndGV4dC9wbGFpbjtjaGFyc2V0PXV0Zi04JyB9KSwgZmlsZW5hbWUgfHwgZGVmYXVsdE5hbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vXHJcbiAgICAvLyAtLS0tLS0tLS0tIFByb2dyZXNzIC8gbG9nIGhlbHBlcnMgLS0tLS0tLS0tLVxyXG4gICAgLy9cclxuXHJcbiAgICAvKiogQWRkcyBvciB1cGRhdGVzIGEgc3RlcCBsaW5lIChpZGVudGlmaWVkIGJ5IHN0ZXBJZCkgd2l0aCBuZXcgdGV4dCwgdGhlbiByZXB1Ymxpc2hlcyB0aGUgbG9nLiAqL1xyXG4gICAgcHJpdmF0ZSBzZXRTdGVwTG9nKHN0ZXBJZDogc3RyaW5nLCB0ZXh0OiBzdHJpbmcpIHtcclxuICAgICAgICBjb25zdCBleGlzdGluZ0luZGV4ID0gdGhpcy5sb2cuZmluZEluZGV4KGUgPT4gZS50eXBlID09PSAnc3RlcCcgJiYgZS5pZCA9PT0gc3RlcElkKTtcclxuICAgICAgICBjb25zdCBlbnRyeTogQ29weUxvZ0VudHJ5ID0geyBpZDogc3RlcElkLCB0eXBlOiAnc3RlcCcsIHRleHQgfTtcclxuICAgICAgICBpZiAoZXhpc3RpbmdJbmRleCA+PSAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nW2V4aXN0aW5nSW5kZXhdID0gZW50cnk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5sb2cucHVzaChlbnRyeSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY29weUxvZyQubmV4dChbLi4udGhpcy5sb2ddKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQXBwZW5kcyBhIG5ldywgcGVybWFuZW50IGxvZyBsaW5lIChuZXZlciBvdmVyd3JpdHRlbiksIHRoZW4gcmVwdWJsaXNoZXMgdGhlIGxvZy4gKi9cclxuICAgIHByaXZhdGUgYXBwZW5kRXJyb3JMb2codGV4dDogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5sb2dTZXErKztcclxuICAgICAgICB0aGlzLmxvZy5wdXNoKHsgaWQ6IGBlcnJvci0ke3RoaXMubG9nU2VxfWAsIHR5cGU6ICdlcnJvcicsIHRleHQgfSk7XHJcbiAgICAgICAgdGhpcy5jb3B5TG9nJC5uZXh0KFsuLi50aGlzLmxvZ10pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBBcHBlbmRzIGEgcGVybWFuZW50IGxvZyBsaW5lIGZvciBhbiBpdGVtIHRoYXQgd2FzIHJlcGFpcmVkIHJhdGhlciB0aGFuIG5ld2x5XHJcbiAgICAgKiAgY3JlYXRlZCDigJQgc2VlIGhlYWxFcXVpcG1lbnRJZGVudGl0eSgpIGFuZCBpdHMgdGlja2V0L2ZlYXR1cmUgZXF1aXZhbGVudHMuICovXHJcbiAgICBwcml2YXRlIGFwcGVuZEhlYWxlZExvZyh0ZXh0OiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLmxvZ1NlcSsrO1xyXG4gICAgICAgIHRoaXMubG9nLnB1c2goeyBpZDogYGhlYWxlZC0ke3RoaXMubG9nU2VxfWAsIHR5cGU6ICdoZWFsZWQnLCB0ZXh0IH0pO1xyXG4gICAgICAgIHRoaXMuY29weUxvZyQubmV4dChbLi4udGhpcy5sb2ddKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogUmVzZXRzIHRoZSBsb2cgZm9yIGEgbmV3IHJ1bi4gKi9cclxuICAgIHByaXZhdGUgcmVzZXRMb2coKSB7XHJcbiAgICAgICAgdGhpcy5sb2cgPSBbXTtcclxuICAgICAgICB0aGlzLmxvZ1NlcSA9IDA7XHJcbiAgICAgICAgdGhpcy5jb3B5TG9nJC5uZXh0KFtdKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQ2xlYXJzIGV2ZXJ5IGlkIG1hcCBjYXJyaWVkIG92ZXIgZnJvbSBhIHByZXZpb3VzIHJ1bi4gVGhlIHNlcnZpY2UgaXMgYSByb290LWxldmVsXHJcbiAgICAgKiAgc2luZ2xldG9uLCBzbyBsZWZ0b3ZlciBtYXBwaW5ncyB3b3VsZCBzaWxlbnRseSBsaW5rIGEgbmV3IGNvcHkgdG8gcmVjb3JkcyBjcmVhdGVkXHJcbiAgICAgKiAgZHVyaW5nIHRoZSBwcmV2aW91cyBvbmUuICovXHJcbiAgICBwcml2YXRlIHJlc2V0UnVuU3RhdGUodGFyZ2V0U3BhY2VJZDogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5lbGVtZW50SWRzID0ge307XHJcbiAgICAgICAgdGhpcy5jb21tZW50SWRzID0gbmV3IE1hcCgpO1xyXG4gICAgICAgIHRoaXMuc291cmNlSGFzaHRhZ05hbWVzID0gbmV3IE1hcCgpO1xyXG4gICAgICAgIHRoaXMudGFyZ2V0SGFzaHRhZ0lkc0J5TmFtZSA9IG5ldyBNYXAoKTtcclxuICAgICAgICB0aGlzLmNyZWF0ZWRIYXNodGFnSWRzID0gbmV3IFNldCgpO1xyXG4gICAgICAgIHRoaXMudXNlZEhhc2h0YWdJZHMgPSBuZXcgU2V0KCk7XHJcbiAgICAgICAgdGhpcy5oYW5kbGVkRWxlbWVudElkcyA9IG5ldyBTZXQoKTtcclxuICAgICAgICB0aGlzLnNvdXJjZU1pc3Npb25Vc2VySWRzID0gbmV3IE1hcCgpO1xyXG4gICAgICAgIHRoaXMudGFyZ2V0TWlzc2lvbklkc0J5VXNlcklkID0gbmV3IE1hcCgpO1xyXG4gICAgICAgIHRoaXMuZG9tYWluc0J5SWQgPSBuZXcgTWFwKCk7XHJcbiAgICAgICAgdGhpcy50YXJnZXRWaXNpYmxlRG9tYWluT3JnSWRzID0gbmV3IFNldCgpO1xyXG4gICAgICAgIHRoaXMudGFyZ2V0RG9tYWluSWRzQnlUeXBlQW5kTmFtZSA9IG5ldyBNYXAoKTtcclxuICAgICAgICB0aGlzLnRhcmdldFNwYWNlSWQgPSB0YXJnZXRTcGFjZUlkO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBCdWlsZHMgYW5kIHNldHMgYSBzdGVwJ3MgbG9nIGxpbmUgYXMgXCI8dHJhbnNsYXRlZCBsYWJlbD46IDxwZXJjZW50PiVcIiwgbm8gc3RlcCBudW1iZXJpbmcuICovXHJcbiAgICBwcml2YXRlIHNldFN0ZXBQcm9ncmVzcyhzdGVwSWQ6IHN0cmluZywgdHJhbnNsYXRpb25LZXk6IHN0cmluZywgcGVyY2VudDogbnVtYmVyKSB7XHJcbiAgICAgICAgY29uc3QgbGFiZWwgPSB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGBtYXR0ZXJwb3J0Q29weS4ke3RyYW5zbGF0aW9uS2V5fWApO1xyXG4gICAgICAgIHRoaXMuc2V0U3RlcExvZyhzdGVwSWQsIGAke2xhYmVsfTogJHtwZXJjZW50fSVgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogTG9ncyBhIHRyYW5zbGF0ZWQsIHBhcmFtZXRlcml6ZWQgZXJyb3IgbGluZSBmb3IgYSBzaW5nbGUgZmFpbGVkIGl0ZW0uICovXHJcbiAgICBwcml2YXRlIGxvZ0l0ZW1FcnJvcih0cmFuc2xhdGlvbktleTogc3RyaW5nLCBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcclxuICAgICAgICBjb25zdCB0ZXh0ID0gdGhpcy50cmFuc2xhdGUuaW5zdGFudChgbWF0dGVycG9ydENvcHkuJHt0cmFuc2xhdGlvbktleX1gLCBwYXJhbXMpO1xyXG4gICAgICAgIHRoaXMuYXBwZW5kRXJyb3JMb2codGV4dCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIExvZ3MgYSB0cmFuc2xhdGVkIGxpbmUgZm9yIGFuIGl0ZW0gdGhhdCBhbHJlYWR5IGV4aXN0ZWQgaW4gdGhlIHRhcmdldCBzcGFjZSBhbmQgaGFkXHJcbiAgICAgKiAgaXRzIG1pc3NpbmcgaWRlbnRpdHkgZmllbGRzIGZpbGxlZCBpbiwgc28gdGhlIG9wZXJhdG9yIGNhbiB0ZWxsIGl0IGFwYXJ0IGZyb20gYVxyXG4gICAgICogIGZyZXNobHkgY3JlYXRlZCBpdGVtIGluIHRoZSBjb3B5IHJlcG9ydC4gKi9cclxuICAgIHByaXZhdGUgbG9nSGVhbGVkSXRlbSh0cmFuc2xhdGlvbktleTogc3RyaW5nLCBpdGVtTGFiZWw6IHN0cmluZywgaGVhbGVkRmllbGRzOiBzdHJpbmdbXSk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGBtYXR0ZXJwb3J0Q29weS4ke3RyYW5zbGF0aW9uS2V5fWAsIHtcclxuICAgICAgICAgICAgbmFtZTogaXRlbUxhYmVsLFxyXG4gICAgICAgICAgICBmaWVsZHM6IGhlYWxlZEZpZWxkcy5qb2luKCcsICcpXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5hcHBlbmRIZWFsZWRMb2codGV4dCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIExvZ3MgYW4gaXRlbS1sZXZlbCBlcnJvciwgdXNpbmcgYSBzcGVjaWZpYyBcIm1pc3NpbmcgZmlsZSAvIG9ycGhhbmVkIHJlZmVyZW5jZVwiXHJcbiAgICAgKiAgdHJhbnNsYXRpb24ga2V5IHdoZW4gdGhlIGNhdXNlIGlzIGEgTWlzc2luZ1MzRmlsZUVycm9yLCBhbmQgdGhlIGdlbmVyaWMgcGVyLXR5cGVcclxuICAgICAqICBrZXkgb3RoZXJ3aXNlLiBLZWVwcyB0aGUgY29weSBsb2cgcmVhZGFibGU6IGEgbWlzc2luZyBmaWxlIGlzIG5vdCBhIGJ1ZyB0b1xyXG4gICAgICogIGludmVzdGlnYXRlIHRoZSBzYW1lIHdheSBhIG5ldHdvcmsvcGVybWlzc2lvbiBlcnJvciBpcy5cclxuICAgICAqICBgZXh0cmFQYXJhbXNgIGNhcnJpZXMgdGhlIHBsYWNlaG9sZGVycyBhIGZldyBrZXlzIG5lZWQgb24gdG9wIG9mIHt7bmFtZX19L3t7ZXJyb3J9fVxyXG4gICAgICogIChlLmcuIGVycm9yRmVhdHVyZUF0dGFjaG1lbnQncyB7e2ZlYXR1cmV9fSwgZXJyb3JQb2kncyB7e3N3ZWVwfX0pLCB3aGljaCB1c2VkIHRvIGJlXHJcbiAgICAgKiAgcmVuZGVyZWQgYXMgcmF3IFwie3tmZWF0dXJlfX1cIiB0ZXh0IGluIHRoZSBsb2cuICovXHJcbiAgICBwcml2YXRlIGxvZ0NvcHlJdGVtRXJyb3IoXHJcbiAgICAgICAgZXJyb3I6IHVua25vd24sXHJcbiAgICAgICAgZ2VuZXJpY0tleTogc3RyaW5nLFxyXG4gICAgICAgIGl0ZW1MYWJlbDogc3RyaW5nLFxyXG4gICAgICAgIGV4dHJhUGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge31cclxuICAgICkge1xyXG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE1pc3NpbmdTM0ZpbGVFcnJvcikge1xyXG4gICAgICAgICAgICB0aGlzLmxvZ0l0ZW1FcnJvcignZXJyb3JNaXNzaW5nUzNGaWxlU2tpcHBlZCcsIHtcclxuICAgICAgICAgICAgICAgIC4uLmV4dHJhUGFyYW1zLFxyXG4gICAgICAgICAgICAgICAgbmFtZTogaXRlbUxhYmVsLFxyXG4gICAgICAgICAgICAgICAgZmlsZTogZXJyb3Iuc291cmNlS2V5XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nSXRlbUVycm9yKGdlbmVyaWNLZXksIHsgLi4uZXh0cmFQYXJhbXMsIG5hbWU6IGl0ZW1MYWJlbCwgZXJyb3I6IHRvRXJyb3JNZXNzYWdlKGVycm9yKSB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBOdWxsLXNhZmUgZXF1aXZhbGVudCBvZiBGZWF0dXJlU2VydmljZS5pc0FyY2hpdmVkKCk6IHRydWUgd2hlbiB0aGUgb3BlcmF0b3IgaGFzIGFyY2hpdmVkXHJcbiAgICAgKiB0aGlzIGZlYXR1cmUgb24gdGhhdCBzcGFjZS4gXCJObyBtaXNzaW9uIG9uIHRoZSBzcGFjZVwiIGFuc3dlcnMgZmFsc2UgKG5vdGhpbmcgYXJjaGl2ZWQpXHJcbiAgICAgKiBpbnN0ZWFkIG9mIHRocm93aW5nLCB3aGljaCBpcyB3aGF0IG1hZGUgYSBjb3B5IGZyb20gYSBzcGFjZSB0aGUgb3BlcmF0b3IgaXMgbm90IGEgbWVtYmVyXHJcbiAgICAgKiBvZiBmYWlsIG91dHJpZ2h0LlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGlzQXJjaGl2ZWRGb3JPcGVyYXRvcihmZWF0dXJlOiBGZWF0dXJlLCBzcGFjZUlkOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgICAgICBjb25zdCBhcmNoaXZlZEZvciA9IGZlYXR1cmU/LmFyY2hpdmVkRm9yTWlzc2lvbklEO1xyXG4gICAgICAgIGlmICghYXJjaGl2ZWRGb3IgfHwgYXJjaGl2ZWRGb3IubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbWlzc2lvbiA9IHRoaXMudXNlclNlcnZpY2UuY3VycmVudE1pc3Npb24oc3BhY2VJZCk7XHJcbiAgICAgICAgcmV0dXJuIG1pc3Npb24/LmlkID8gYXJjaGl2ZWRGb3IuaW5jbHVkZXMobWlzc2lvbi5pZCkgOiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICAvL1xyXG4gICAgLy8gLS0tLS0tLS0tLSBDcm9zcy1zcGFjZSByZWZlcmVuY2UgcmVtYXBwaW5nIC0tLS0tLS0tLS1cclxuICAgIC8vXHJcblxyXG4gICAgLyoqIE5vcm1hbGlzZWQgbG9va3VwIGtleSBmb3IgYSBkb21haW46IHR5cGUgZGlzYW1iaWd1YXRlcyBzYW1lLW5hbWVkIGRvbWFpbnMgdXNlZCBmb3JcclxuICAgICAqICBkaWZmZXJlbnQgcHVycG9zZXMgKGVxdWlwbWVudCB2cy4gdGlja2V0IHZzLiBmZWF0dXJlIGNhdGVnb3JpZXMsIC4uLikuICovXHJcbiAgICBwcml2YXRlIGRvbWFpbktleSh0eXBlOiBhbnksIG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIGAke3R5cGUgfHwgJyd9OjokeyhuYW1lIHx8ICcnKS50cmltKCkudG9Mb3dlckNhc2UoKX1gO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUkVBRC1PTkxZIGluZGV4aW5nIG9mIGV2ZXJ5IGRvbWFpbiBlaXRoZXIgb3BlcmF0b3IncyBNaXNzaW9uIGNhbiBzZWUuIENyZWF0ZXNcclxuICAgICAqIG5vdGhpbmcg4oCUIHVubGlrZSBoYXNodGFncywgYSBkb21haW4gaXMgYSBidXNpbmVzcyB0YXhvbm9teSBlbnRyeSBhbiBvcGVyYXRvciBtYW5hZ2VzXHJcbiAgICAgKiBkZWxpYmVyYXRlbHk7IHRoaXMgdG9vbCBvbmx5IGV2ZXIgcmV1c2VzIGFuIEVYSVNUSU5HIGVxdWl2YWxlbnQsIGl0IG5ldmVyIGludmVudHMgb25lLlxyXG4gICAgICpcclxuICAgICAqIFZpc2liaWxpdHkgaXMga2V5ZWQgdG8gYGN1cnJlbnRNaXNzaW9uKHNwYWNlSWQpLm9yZ2FuaXNhdGlvbklEYCAvXHJcbiAgICAgKiBgLm9yZGVyZWRPcmdhbmlzYXRpb25JRGAgZm9yIEVBQ0ggc3BhY2Ug4oCUIGV4YWN0bHkgd2hhdFxyXG4gICAgICogYERvbWFpblNlcnZpY2UuZ2V0RG9tYWluc0Zvck9yZ0ZvclR5cGUoKWAgdXNlcyB0byBwb3B1bGF0ZSB0aGUgY2F0ZWdvcnkgZHJvcGRvd24gb25cclxuICAgICAqIHRoZSBlcXVpcG1lbnQvdGlja2V0L2ZlYXR1cmUgZWRpdCBmb3JtcyAoc2VlIGZvcm0tZXF1aXBtZW50LmNvbXBvbmVudC50cyxcclxuICAgICAqIGJhdGNoLWVkaXQtZXF1aXBtZW50LmNvbXBvbmVudC50cywgZm9ybS1mZWF0dXJlLmNvbXBvbmVudC50cykuIENvbXBhcmluZyB0aGUgc3BhY2VzJ1xyXG4gICAgICogT1dOIGBvcmdhbmlzYXRpb25JRGAgaW5zdGVhZCDigJQgdGhlIHByZXZpb3VzIGFwcHJvYWNoIOKAlCBtaXNzZWQgZXZlcnkgZG9tYWluIHJlYWNoYWJsZVxyXG4gICAgICogb25seSB0aHJvdWdoIHRoZSBvcGVyYXRvcidzIGBvcmRlcmVkT3JnYW5pc2F0aW9uSURgIChzZXQgd2hlbiBhIG1pc3Npb24gaXMgY3JlYXRlZCBcIm9uXHJcbiAgICAgKiBiZWhhbGYgb2ZcIiBhbm90aGVyIG9yZ2FuaXNhdGlvbiDigJQgc2VlIGZvcm0tbWlzc2lvbi5jb21wb25lbnQudHMpLCB3aGljaCBpcyBleGFjdGx5IGhvd1xyXG4gICAgICogYSBkb21haW4gZW5kcyB1cCB2aXNpYmxlIG9uIHR3byBzcGFjZXMgdGhhdCBiZWxvbmcgdG8gZGlmZmVyZW50IG9yZ2FuaXNhdGlvbnMuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgYXN5bmMgbG9hZERvbWFpbkluZGV4KHNvdXJjZVNwYWNlSWQ6IHN0cmluZywgdGFyZ2V0U3BhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgY29uc3Qgc291cmNlTWlzc2lvbiA9IHRoaXMudXNlclNlcnZpY2UuY3VycmVudE1pc3Npb24oc291cmNlU3BhY2VJZCk7XHJcbiAgICAgICAgY29uc3QgdGFyZ2V0TWlzc2lvbiA9IHRoaXMudXNlclNlcnZpY2UuY3VycmVudE1pc3Npb24odGFyZ2V0U3BhY2VJZCk7XHJcblxyXG4gICAgICAgIGNvbnN0IHNvdXJjZU9yZ0lkcyA9IFtzb3VyY2VNaXNzaW9uPy5vcmdhbmlzYXRpb25JRCwgc291cmNlTWlzc2lvbj8ub3JkZXJlZE9yZ2FuaXNhdGlvbklEXVxyXG4gICAgICAgICAgICAuZmlsdGVyKChpZCk6IGlkIGlzIHN0cmluZyA9PiAhIWlkKTtcclxuICAgICAgICBjb25zdCB0YXJnZXRPcmdJZHMgPSBbdGFyZ2V0TWlzc2lvbj8ub3JnYW5pc2F0aW9uSUQsIHRhcmdldE1pc3Npb24/Lm9yZGVyZWRPcmdhbmlzYXRpb25JRF1cclxuICAgICAgICAgICAgLmZpbHRlcigoaWQpOiBpZCBpcyBzdHJpbmcgPT4gISFpZCk7XHJcbiAgICAgICAgdGhpcy50YXJnZXRWaXNpYmxlRG9tYWluT3JnSWRzID0gbmV3IFNldCh0YXJnZXRPcmdJZHMpO1xyXG5cclxuICAgICAgICBjb25zdCBhbGxPcmdJZHMgPSBBcnJheS5mcm9tKG5ldyBTZXQoWy4uLnNvdXJjZU9yZ0lkcywgLi4udGFyZ2V0T3JnSWRzXSkpO1xyXG4gICAgICAgIGlmIChhbGxPcmdJZHMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgIC8vIFRoZSBvcGVyYXRvciBoYXMgbm8gbWlzc2lvbiBvbiBlaXRoZXIgc3BhY2Ug4oCUIG5vdGhpbmcgdG8gcmVzb2x2ZSBhZ2FpbnN0O1xyXG4gICAgICAgICAgICAvLyBldmVyeSBkb21haW5JRCB3aWxsIGJlIGRyb3BwZWQsIHNhbWUgYXMgYW4gdW5yZXNvbHZhYmxlIGxvb2t1cCBlbHNld2hlcmUuXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRvbWFpbkxpc3RzID0gYXdhaXQgUHJvbWlzZS5hbGwoXHJcbiAgICAgICAgICAgICAgICBhbGxPcmdJZHMubWFwKG9yZ0lkID0+IHRoaXMuZG9tYWluU2VydmljZS5nZXRBbGxHZW5lcmljRG9tYWluc0FuZEZvck9yZ2FuaXNhdGlvbihvcmdJZCkpXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgbGlzdCBvZiBkb21haW5MaXN0cykge1xyXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBkb21haW4gb2YgbGlzdCB8fCBbXSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChkb21haW4/LmlkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZG9tYWluc0J5SWQuc2V0KGRvbWFpbi5pZCwgZG9tYWluKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ1tNYXR0ZXJwb3J0VGFnQ29weVNlcnZpY2VdIENvdWxkIG5vdCByZWFkIHRoZSBkb21haW5zLCBjcm9zcy1vcmdhbmlzYXRpb24gY2F0ZWdvcmllcyB3aWxsIGJlIGRyb3BwZWQ6JywgZXJyb3IpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IGRvbWFpbiBvZiB0aGlzLmRvbWFpbnNCeUlkLnZhbHVlcygpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHZpc2libGVUb1RhcmdldCA9ICFkb21haW4ub3JnYW5pc2F0aW9uSUQgfHwgdGhpcy50YXJnZXRWaXNpYmxlRG9tYWluT3JnSWRzLmhhcyhkb21haW4ub3JnYW5pc2F0aW9uSUQpO1xyXG4gICAgICAgICAgICBpZiAodmlzaWJsZVRvVGFyZ2V0ICYmIGRvbWFpbi5uYW1lKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRhcmdldERvbWFpbklkc0J5VHlwZUFuZE5hbWUuc2V0KHRoaXMuZG9tYWluS2V5KGRvbWFpbi50eXBlLCBkb21haW4ubmFtZSksIGRvbWFpbi5pZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXNvbHZlcyBhIHNvdXJjZSBkb21haW5JRCAoZXF1aXBtZW50L3RpY2tldC9mZWF0dXJlL1BPSSBjYXRlZ29yeSkgZm9yIHVzZSBpbiB0aGVcclxuICAgICAqIHRhcmdldCBzcGFjZS5cclxuICAgICAqXHJcbiAgICAgKiAgLSBnZW5lcmljIGRvbWFpbiAobm8gb3JnYW5pc2F0aW9uSUQgb2YgaXRzIG93biDigJQgYSBzaGFyZWQgdGF4b25vbXkgZW50cnksIGUuZy4gYVxyXG4gICAgICogICAgc3RhbmRhcmQgY2F0ZWdvcnkgY3JlYXRlZCBieSB0aGUgcGxhdGZvcm0pOiByZXVzZWQgdW5jaGFuZ2VkLCB2YWxpZCBldmVyeXdoZXJlLlxyXG4gICAgICogIC0gdGhlIGRvbWFpbidzIG93biBvcmdhbmlzYXRpb25JRCBpcyBhbHJlYWR5IG9uZSB0aGUgVEFSR0VUIG9wZXJhdG9yJ3MgbWlzc2lvbiBjYW5cclxuICAgICAqICAgIHNlZSAoaXRzIG9yZ2FuaXNhdGlvbklELCBvciBpdHMgb3JkZXJlZE9yZ2FuaXNhdGlvbklEKTogcmV1c2VkIHVuY2hhbmdlZCB0b28g4oCUIHRoZVxyXG4gICAgICogICAgaWQgaXMgZGlyZWN0bHkgc2VsZWN0YWJsZSBpbiB0aGUgdGFyZ2V0IHNwYWNlJ3Mgb3duIGRyb3Bkb3duIGFzLWlzLlxyXG4gICAgICogIC0gb3RoZXJ3aXNlOiBtYXRjaGVkIGJ5ICh0eXBlLCBuYW1lKSBhZ2FpbnN0IHRoZSBkb21haW5zIHZpc2libGUgdG8gdGhlIFRBUkdFVFxyXG4gICAgICogICAgb3BlcmF0b3IgKGxvYWREb21haW5JbmRleCgpKTsgZHJvcHBlZCB3aGVuIG5vIGVxdWl2YWxlbnQgZXhpc3RzIHRoZXJlLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHJlc29sdmVEb21haW5JRChzb3VyY2VEb21haW5JZDogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IG51bGwge1xyXG4gICAgICAgIGlmICghc291cmNlRG9tYWluSWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBkb21haW4gPSB0aGlzLmRvbWFpbnNCeUlkLmdldChzb3VyY2VEb21haW5JZCk7XHJcbiAgICAgICAgaWYgKCFkb21haW4pIHtcclxuICAgICAgICAgICAgLy8gTm90IHZpc2libGUgdG8gZWl0aGVyIG9wZXJhdG9yJ3MgbWlzc2lvbiAobG9va3VwIGZhaWxlZCwgb3IgaXQgYmVsb25ncyB0b1xyXG4gICAgICAgICAgICAvLyBuZWl0aGVyKSDigJQgdW5jaGFuZ2VkLCBzYWZlc3QgdG8gZHJvcC5cclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghZG9tYWluLm9yZ2FuaXNhdGlvbklEIHx8IHRoaXMudGFyZ2V0VmlzaWJsZURvbWFpbk9yZ0lkcy5oYXMoZG9tYWluLm9yZ2FuaXNhdGlvbklEKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gc291cmNlRG9tYWluSWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLnRhcmdldERvbWFpbklkc0J5VHlwZUFuZE5hbWUuZ2V0KHRoaXMuZG9tYWluS2V5KGRvbWFpbi50eXBlLCBkb21haW4ubmFtZSkpID8/IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIE5vcm1hbGlzZWQgbG9va3VwIGtleSBmb3IgYSBoYXNodGFnIG5hbWUsIHNvIFwiTW95ZW4gw4JnZVwiIGFuZCBcIm1veWVuIMOiZ2UgXCIgbWF0Y2guICovXHJcbiAgICBwcml2YXRlIGhhc2h0YWdLZXkobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gbmFtZS50cmltKCkudG9Mb3dlckNhc2UoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJFQUQtT05MWSBpbmRleGluZyBvZiBib3RoIHNwYWNlcycgaGFzaHRhZ3MuIENyZWF0ZXMgbm90aGluZy5cclxuICAgICAqXHJcbiAgICAgKiBgRmVhdHVyZS5oYXNodGFnc2Agc3RvcmVzIEhhc2h0YWcgKmlkcyosIGFuZCBhIEhhc2h0YWcgaXMgYSBwZXItc3BhY2UgcmVjb3JkLCBzbyB0aGVcclxuICAgICAqIGlkcyBoYXZlIHRvIGJlIHRyYW5zbGF0ZWQgYnkgbmFtZS4gVGhlIHRyYW5zbGF0aW9uIHRhYmxlIGlzIGJ1aWx0IGhlcmU7IHRoZSBtaXNzaW5nXHJcbiAgICAgKiBrZXl3b3JkcyBhcmUgY3JlYXRlZCBsYXRlciwgb25lIGF0IGEgdGltZSwgb25seSB3aGVuIGEgUE9JIHRoYXQgYWN0dWFsbHkgdXNlcyB0aGVtIGlzXHJcbiAgICAgKiBhYm91dCB0byBiZSB3cml0dGVuIChzZWUgcmVzb2x2ZUhhc2h0YWdJZHMoKSkuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgYXN5bmMgbG9hZEhhc2h0YWdJbmRleChzb3VyY2VTcGFjZUlkOiBzdHJpbmcsIHRhcmdldFNwYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIGxldCBzb3VyY2VIYXNodGFnczogSGFzaHRhZ1tdID0gW107XHJcbiAgICAgICAgbGV0IHRhcmdldEhhc2h0YWdzOiBIYXNodGFnW10gPSBbXTtcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgW3NvdXJjZUhhc2h0YWdzLCB0YXJnZXRIYXNodGFnc10gPSBhd2FpdCBQcm9taXNlLmFsbChbXHJcbiAgICAgICAgICAgICAgICB0aGlzLmhhc2h0YWdTZXJ2aWNlLmxpc3RIYXNodGFnc0ZvclNwYWNlKHNvdXJjZVNwYWNlSWQpLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5oYXNodGFnU2VydmljZS5saXN0SGFzaHRhZ3NGb3JTcGFjZSh0YXJnZXRTcGFjZUlkKVxyXG4gICAgICAgICAgICBdKTtcclxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ1tNYXR0ZXJwb3J0VGFnQ29weVNlcnZpY2VdIENvdWxkIG5vdCByZWFkIHRoZSBoYXNodGFncywga2V5d29yZHMgd2lsbCBiZSBkcm9wcGVkOicsIGVycm9yKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9yIChjb25zdCBoYXNodGFnIG9mIHNvdXJjZUhhc2h0YWdzIHx8IFtdKSB7XHJcbiAgICAgICAgICAgIGlmIChoYXNodGFnPy5pZCAmJiBoYXNodGFnLm5hbWUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc291cmNlSGFzaHRhZ05hbWVzLnNldChoYXNodGFnLmlkLCBoYXNodGFnLm5hbWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciAoY29uc3QgaGFzaHRhZyBvZiB0YXJnZXRIYXNodGFncyB8fCBbXSkge1xyXG4gICAgICAgICAgICBpZiAoaGFzaHRhZz8uaWQgJiYgaGFzaHRhZy5uYW1lKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRhcmdldEhhc2h0YWdJZHNCeU5hbWUuc2V0KHRoaXMuaGFzaHRhZ0tleShoYXNodGFnLm5hbWUpLCBoYXNodGFnLmlkKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRyYW5zbGF0ZXMgb25lIGZlYXR1cmUncyBoYXNodGFnIGlkcyBpbnRvIHRhcmdldC1zcGFjZSBpZHMsIGNyZWF0aW5nIG9uIHRoZSBmbHkgdGhlXHJcbiAgICAgKiBrZXl3b3JkcyB0aGUgdGFyZ2V0IHNwYWNlIGRvZXMgbm90IGhhdmUgeWV0LlxyXG4gICAgICpcclxuICAgICAqIENyZWF0aW9uIGlzIExBWlkgb24gcHVycG9zZS4gRG9pbmcgaXQgdXAgZnJvbnQsIGZvciB0aGUgd2hvbGUgc291cmNlIHZvY2FidWxhcnksIG1lYW50XHJcbiAgICAgKiB0aGF0IGEgY29weSB3aGljaCBmYWlsZWQgb3Igd2FzIGNsb3NlZCBoYWxmd2F5IGxlZnQgYmVoaW5kIGtleXdvcmRzIG5vIFBPSSByZWZlcmVuY2VkIOKAlFxyXG4gICAgICogcG9sbHV0aW9uIHRoZSBvcGVyYXRvciBoYWQgdG8gY2xlYW4gdXAgYnkgaGFuZC4gSGVyZSBhIGtleXdvcmQgaXMgb25seSBldmVyIHdyaXR0ZW5cclxuICAgICAqIHdoZW4gYSBQT0kgdGhhdCBjYXJyaWVzIGl0IGlzIGFib3V0IHRvIGJlIGNyZWF0ZWQsIHNvIGFuIGludGVycnVwdGVkIGNvcHkgc3RvcHNcclxuICAgICAqIGNyZWF0aW5nIGtleXdvcmRzIGF0IHRoZSBzYW1lIFBPSSBpdCBzdG9wcyBjcmVhdGluZyBjb250ZW50LlxyXG4gICAgICpcclxuICAgICAqIFRoZSByZXNpZHVhbCB3aW5kb3cgKGtleXdvcmQgY3JlYXRlZCwgdGhlbiBjcmVhdGVGZWF0dXJlIGZhaWxzKSBpcyBjbG9zZWQgYnlcclxuICAgICAqIG1hcmtIYXNodGFnc1VzZWQoKSArIGNsZWFudXBVbnVzZWRDcmVhdGVkSGFzaHRhZ3MoKS5cclxuICAgICAqXHJcbiAgICAgKiBBIGtleXdvcmQgdGhhdCBjYW4gbmVpdGhlciBiZSBmb3VuZCBub3IgY3JlYXRlZCBpcyBkcm9wcGVkIHJhdGhlciB0aGFuIGxlZnQgYXMgYVxyXG4gICAgICogZGFuZ2xpbmcgaWQuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgYXN5bmMgcmVzb2x2ZUhhc2h0YWdJZHMoXHJcbiAgICAgICAgc291cmNlSGFzaHRhZ0lkczogQXJyYXk8c3RyaW5nIHwgbnVsbD4gfCBudWxsIHwgdW5kZWZpbmVkLFxyXG4gICAgICAgIHRhcmdldFNwYWNlSWQ6IHN0cmluZ1xyXG4gICAgKTogUHJvbWlzZTxzdHJpbmdbXSB8IG51bGw+IHtcclxuICAgICAgICBpZiAoIXNvdXJjZUhhc2h0YWdJZHMgfHwgc291cmNlSGFzaHRhZ0lkcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCByZXNvbHZlZDogc3RyaW5nW10gPSBbXTtcclxuXHJcbiAgICAgICAgZm9yIChjb25zdCBzb3VyY2VJZCBvZiBzb3VyY2VIYXNodGFnSWRzKSB7XHJcbiAgICAgICAgICAgIGlmICghc291cmNlSWQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IG5hbWUgPSB0aGlzLnNvdXJjZUhhc2h0YWdOYW1lcy5nZXQoc291cmNlSWQpO1xyXG4gICAgICAgICAgICBpZiAoIW5hbWUpIHtcclxuICAgICAgICAgICAgICAgIC8vIHRoZSBzb3VyY2UgaWQgcG9pbnRzIGF0IGEgaGFzaHRhZyB0aGF0IG5vIGxvbmdlciBleGlzdHMg4oCUIG5vdGhpbmcgdG8gY2Fycnkgb3ZlclxyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IHRoaXMuaGFzaHRhZ0tleShuYW1lKTtcclxuICAgICAgICAgICAgbGV0IHRhcmdldElkID0gdGhpcy50YXJnZXRIYXNodGFnSWRzQnlOYW1lLmdldChrZXkpO1xyXG5cclxuICAgICAgICAgICAgaWYgKCF0YXJnZXRJZCkge1xyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjcmVhdGVkID0gYXdhaXQgdGhpcy5oYXNodGFnU2VydmljZS5jcmVhdGVIYXNodGFnRm9yU3BhY2UobmFtZSwgdGFyZ2V0U3BhY2VJZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0SWQgPSBjcmVhdGVkPy5pZDtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0SWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50YXJnZXRIYXNodGFnSWRzQnlOYW1lLnNldChrZXksIHRhcmdldElkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVkSGFzaHRhZ0lkcy5hZGQodGFyZ2V0SWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGBbTWF0dGVycG9ydFRhZ0NvcHlTZXJ2aWNlXSBDb3VsZCBub3QgY3JlYXRlIHRoZSBoYXNodGFnIFwiJHtuYW1lfVwiIGluIHRoZSB0YXJnZXQgc3BhY2U6YCwgZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodGFyZ2V0SWQgJiYgIXJlc29sdmVkLmluY2x1ZGVzKHRhcmdldElkKSkge1xyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZWQucHVzaCh0YXJnZXRJZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiByZXNvbHZlZC5sZW5ndGggPiAwID8gcmVzb2x2ZWQgOiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUkVBRC1PTkxZIGluZGV4aW5nIG9mIGJvdGggc3BhY2VzJyBtaXNzaW9ucy5cclxuICAgICAqXHJcbiAgICAgKiBBIE1pc3Npb24gaXMgc2NvcGVkIHRvIG9uZSBzcGFjZSAoaXQgcGFpcnMgYSB1c2VySUQgd2l0aCBhIHNwYWNlSUQpLCBzbyB0aGUgaWQgYVxyXG4gICAgICogc291cmNlIGNvbW1lbnQncyBgb3duZXJJRGAgcG9pbnRzIGF0IG5ldmVyIGRlc2lnbmF0ZXMgYW55b25lIGluIHRoZSB0YXJnZXQgc3BhY2UuXHJcbiAgICAgKiBUaGlzIGJ1aWxkcyB0aGUgdHdvIGxvb2t1cCB0YWJsZXMgcmVzb2x2ZUNvbW1lbnRPd25lcklEKCkgbmVlZHMgdG8gdHJhbnNsYXRlIGl0OlxyXG4gICAgICogd2hpY2ggdXNlciBhIHNvdXJjZSBNaXNzaW9uIGlkIGJlbG9uZ3MgdG8sIGFuZCB3aGljaCBNaXNzaW9uIChpZiBhbnkpIHRoYXQgc2FtZVxyXG4gICAgICogdXNlciBhbHJlYWR5IGhvbGRzIGluIHRoZSB0YXJnZXQgc3BhY2UuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgYXN5bmMgbG9hZE1pc3Npb25JbmRleChzb3VyY2VTcGFjZUlkOiBzdHJpbmcsIHRhcmdldFNwYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIGxldCBzb3VyY2VNaXNzaW9uczogTWlzc2lvbltdID0gW107XHJcbiAgICAgICAgbGV0IHRhcmdldE1pc3Npb25zOiBNaXNzaW9uW10gPSBbXTtcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgW3NvdXJjZU1pc3Npb25zLCB0YXJnZXRNaXNzaW9uc10gPSBhd2FpdCBQcm9taXNlLmFsbChbXHJcbiAgICAgICAgICAgICAgICB0aGlzLm1pc3Npb25TZXJ2aWNlLmdldEFsbE1pc3Npb25zRm9yU3BhY2Uoc291cmNlU3BhY2VJZCksXHJcbiAgICAgICAgICAgICAgICB0aGlzLm1pc3Npb25TZXJ2aWNlLmdldEFsbE1pc3Npb25zRm9yU3BhY2UodGFyZ2V0U3BhY2VJZClcclxuICAgICAgICAgICAgXSk7XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgY29uc29sZS53YXJuKCdbTWF0dGVycG9ydFRhZ0NvcHlTZXJ2aWNlXSBDb3VsZCBub3QgcmVhZCB0aGUgbWlzc2lvbnMsIGNvbW1lbnQgYXV0aG9yc2hpcCB3aWxsIGJlIGRyb3BwZWQ6JywgZXJyb3IpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IG1pc3Npb24gb2Ygc291cmNlTWlzc2lvbnMgfHwgW10pIHtcclxuICAgICAgICAgICAgaWYgKG1pc3Npb24/LmlkICYmIG1pc3Npb24udXNlcklEKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNvdXJjZU1pc3Npb25Vc2VySWRzLnNldChtaXNzaW9uLmlkLCBtaXNzaW9uLnVzZXJJRCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZm9yIChjb25zdCBtaXNzaW9uIG9mIHRhcmdldE1pc3Npb25zIHx8IFtdKSB7XHJcbiAgICAgICAgICAgIGlmIChtaXNzaW9uPy5pZCAmJiBtaXNzaW9uLnVzZXJJRCAmJiAhdGhpcy50YXJnZXRNaXNzaW9uSWRzQnlVc2VySWQuaGFzKG1pc3Npb24udXNlcklEKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy50YXJnZXRNaXNzaW9uSWRzQnlVc2VySWQuc2V0KG1pc3Npb24udXNlcklELCBtaXNzaW9uLmlkKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRyYW5zbGF0ZXMgYSBzb3VyY2UgY29tbWVudCdzIGBvd25lcklEYCAoYSBwZXItc3BhY2UgTWlzc2lvbiBpZCkgaW50byB0aGUgTWlzc2lvbiBvZlxyXG4gICAgICogdGhlIFNBTUUgdXNlciBpbiB0aGUgdGFyZ2V0IHNwYWNlLCBzbyB0aGUgY29weSBrZWVwcyBjcmVkaXRpbmcgaXRzIHJlYWwgYXV0aG9yLlxyXG4gICAgICpcclxuICAgICAqIFN1YnN0aXR1dGluZyB0aGUgY3VycmVudCBvcGVyYXRvcidzIG1pc3Npb24g4oCUIHRoZSB3YXkgYG93bmVyTWlzc2lvbklEYCBsZWdpdGltYXRlbHlcclxuICAgICAqIGRvZXMgZm9yIHRpY2tldHMvZXF1aXBtZW50L2ZlYXR1cmVzLCB3aGljaCByZWFsbHkgZG8gY2hhbmdlIG93bmVyIG9uIGEgY29weSDigJQgd291bGRcclxuICAgICAqIG1pc2F0dHJpYnV0ZSBldmVyeSBjb21tZW50IHRvIHdob2V2ZXIgcmFuIHRoZSBjb3B5IGluc3RlYWQgb2Ygd2hvIGFjdHVhbGx5IHdyb3RlIGl0LlxyXG4gICAgICpcclxuICAgICAqIFdoZW4gdGhlIG9yaWdpbmFsIGF1dGhvciBoYXMgbm8gbWlzc2lvbiBpbiB0aGUgdGFyZ2V0IHNwYWNlIChuZXZlciBncmFudGVkIGFjY2Vzc1xyXG4gICAgICogdGhlcmUpLCB0aGUgY29tbWVudCBpcyBsZWZ0IHdpdGggbm8gb3duZXIgcmF0aGVyIHRoYW4gYSB3cm9uZyBvbmU6IGFuIGFic2VudCBhdXRob3JcclxuICAgICAqIGlzIGhvbmVzdCwgYSBtaXNhdHRyaWJ1dGVkIG9uZSBpcyBub3QuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgcmVzb2x2ZUNvbW1lbnRPd25lcklEKHNvdXJjZU93bmVySUQ6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCBudWxsIHtcclxuICAgICAgICBpZiAoIXNvdXJjZU93bmVySUQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHVzZXJJRCA9IHRoaXMuc291cmNlTWlzc2lvblVzZXJJZHMuZ2V0KHNvdXJjZU93bmVySUQpO1xyXG4gICAgICAgIGlmICghdXNlcklEKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy50YXJnZXRNaXNzaW9uSWRzQnlVc2VySWQuZ2V0KHVzZXJJRCkgPz8gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvKiogUmVjb3JkcyB0aGF0IHRoZXNlIGhhc2h0YWdzIGFyZSBub3cgcmVmZXJlbmNlZCBieSBhIGZlYXR1cmUgdGhhdCByZWFsbHkgZXhpc3RzLCBzb1xyXG4gICAgICogIHRoZSBlbmQtb2YtcnVuIGNsZWFudXAgbGVhdmVzIHRoZW0gYWxvbmUuICovXHJcbiAgICBwcml2YXRlIG1hcmtIYXNodGFnc1VzZWQoaGFzaHRhZ0lkczogc3RyaW5nW10gfCBudWxsKTogdm9pZCB7XHJcbiAgICAgICAgZm9yIChjb25zdCBpZCBvZiBoYXNodGFnSWRzIHx8IFtdKSB7XHJcbiAgICAgICAgICAgIHRoaXMudXNlZEhhc2h0YWdJZHMuYWRkKGlkKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZWxldGVzIHRoZSBoYXNodGFncyB0aGlzIHJ1biBjcmVhdGVkIHRoYXQgbm8gY29waWVkIFBPSSBlbmRlZCB1cCByZWZlcmVuY2luZy5cclxuICAgICAqXHJcbiAgICAgKiBSdW5zIG9uIGV2ZXJ5IGV4aXQgcGF0aCDigJQgc3VjY2VzcywgZ2VuZXJhbCBmYWlsdXJlLCBvciBleGNlcHRpb24g4oCUIHNvIHRoZSB0YXJnZXQgc3BhY2VcclxuICAgICAqIG5ldmVyIGtlZXBzIGtleXdvcmRzIHRoYXQgY2FtZSBmcm9tIGFuIGFib3J0ZWQgY29weS4gT25seSBpZHMgY3JlYXRlZCBieSBUSElTIHJ1biBhcmVcclxuICAgICAqIGV2ZXIgY29uc2lkZXJlZDogYSBwcmUtZXhpc3Rpbmcga2V5d29yZCBvZiB0aGUgdGFyZ2V0IHNwYWNlIGlzIG5ldmVyIHRvdWNoZWQsIGV2ZW4gaWZcclxuICAgICAqIG5vIGNvcGllZCBQT0kgdXNlcyBpdC5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBhc3luYyBjbGVhbnVwVW51c2VkQ3JlYXRlZEhhc2h0YWdzKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIGNvbnN0IG9ycGhhbnMgPSBbLi4udGhpcy5jcmVhdGVkSGFzaHRhZ0lkc10uZmlsdGVyKGlkID0+ICF0aGlzLnVzZWRIYXNodGFnSWRzLmhhcyhpZCkpO1xyXG4gICAgICAgIGlmIChvcnBoYW5zLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zb2xlLmxvZyhgW01hdHRlcnBvcnRUYWdDb3B5U2VydmljZV0gUmVtb3ZpbmcgJHtvcnBoYW5zLmxlbmd0aH0ga2V5d29yZChzKSBjcmVhdGVkIGJ1dCBsZWZ0IHVudXNlZCBieSB0aGlzIGNvcHkuYCk7XHJcblxyXG4gICAgICAgIGZvciAoY29uc3QgaGFzaHRhZ0lkIG9mIG9ycGhhbnMpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFzaHRhZ1NlcnZpY2UuZGVsZXRlSGFzaHRhZ0J5SWQoaGFzaHRhZ0lkKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlZEhhc2h0YWdJZHMuZGVsZXRlKGhhc2h0YWdJZCk7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBDbGVhbnVwIGlzIGJlc3QtZWZmb3J0OiBhIGxlZnRvdmVyIGtleXdvcmQgaXMgaGFybWxlc3MgbmV4dCB0byBhIGZhaWxlZCBjb3B5LFxyXG4gICAgICAgICAgICAgICAgLy8gYW5kIG11c3QgbmV2ZXIgYmUgdGhlIHJlYXNvbiB0aGUgd2hvbGUgb3BlcmF0aW9uIHJlcG9ydHMgYSBmYWlsdXJlLlxyXG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGBbTWF0dGVycG9ydFRhZ0NvcHlTZXJ2aWNlXSBDb3VsZCBub3QgcmVtb3ZlIHRoZSB1bnVzZWQga2V5d29yZCBcIiR7aGFzaHRhZ0lkfVwiOmAsIGVycm9yKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvL1xyXG4gICAgLy8gLS0tLS0tLS0tLSBNZWRpYSBjb250ZW50IChDb21tZW50cykgLS0tLS0tLS0tLVxyXG4gICAgLy9cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9yZGVycyBhIGZlYXR1cmUncyBtZWRpYSBzZXQgZXhhY3RseSB0aGUgd2F5IHRoZSBVSSB3aWxsIHJlYWQgaXQgYmFjaywgYW5kIHJlcGFpcnNcclxuICAgICAqIHRoZSBvcmRlcmluZyBrZXkgd2hlbiB0aGUgc291cmNlIGRhdGEgY2Fubm90IGV4cHJlc3MgdGhlIHVzZXIncyBpbnRlbmRlZCBvcmRlci5cclxuICAgICAqXHJcbiAgICAgKiBUaGUgdmlld2VyIHNvcnRzIGVhY2ggbWVkaWEgZmFtaWx5IG9uIGl0cyBvd24gKGBzZXRJbWFnZXNgLCBgc2V0VmlkZW9zYCwgYHNldEF1ZGlvYCxcclxuICAgICAqIGBzZXREb2N1bWVudHNgLCAuLi4gYWxsIGRvIGAuc29ydCgoYSwgYikgPT4gYS5pbmRleCAtIGIuaW5kZXgpYCksIHNvIGBpbmRleGAgb25seSBoYXNcclxuICAgICAqIHRvIGJlIGNvbnNpc3RlbnQgV0lUSElOIGEgQ29tbWVudFR5cGUuIFRoZSBhdHRhY2htZW50IGZvcm0gaG93ZXZlciBkZWZhdWx0cyBgaW5kZXhgXHJcbiAgICAgKiB0byAxIGZvciBldmVyeSBuZXcgYXR0YWNobWVudCwgc28gYSBtdWx0aS1pbWFnZSBQT0kgdmVyeSBvZnRlbiBob2xkcyBzZXZlcmFsIGltYWdlc1xyXG4gICAgICogYWxsIHNoYXJpbmcgaW5kZXggMSDigJQgb3IgbnVsbC4gU29ydGluZyB0aG9zZSBpcyBsZWZ0IHRvIER5bmFtb0RCJ3MgYXJiaXRyYXJ5IHNjYW5cclxuICAgICAqIG9yZGVyLCB3aGljaCBpcyB3aHkgdGhlIGNvcHkgY2FtZSBvdXQgaW4gYSBkaWZmZXJlbnQgb3JkZXIgdGhhbiB0aGUgb3JpZ2luYWwuXHJcbiAgICAgKlxyXG4gICAgICogU3RyYXRlZ3k6IHNvcnQgZGV0ZXJtaW5pc3RpY2FsbHkgKGluZGV4LCB0aGVuIGNyZWF0aW9uIGRhdGUsIHRoZW4gaWQg4oCUIGkuZS4gdGhlXHJcbiAgICAgKiB1cGxvYWQgb3JkZXIgdGhlIHVzZXIgYWN0dWFsbHkgc2F3KSwgYW5kIG9ubHkgcmV3cml0ZSB0aGUgaW5kaWNlcyBvZiBhIGZhbWlseSB3aGVuXHJcbiAgICAgKiB0aGV5IGFyZSBhbWJpZ3VvdXMgKG51bGwgb3IgZHVwbGljYXRlZCkuIEEgZmFtaWx5IHdob3NlIGluZGljZXMgYXJlIGFscmVhZHkgdW5pcXVlXHJcbiAgICAgKiBpcyBjb3BpZWQgdW50b3VjaGVkLCBzbyBhIGRlbGliZXJhdGUgb3JkZXJpbmcgaXMgbmV2ZXIgb3ZlcndyaXR0ZW4uXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgb3JkZXJDb21tZW50c0ZvckNvcHkoY29tbWVudHM6IENvbW1lbnRbXSk6IENvbW1lbnRbXSB7XHJcbiAgICAgICAgY29uc3QgdmFsaWQgPSAoY29tbWVudHMgfHwgW10pLmZpbHRlcihjID0+ICEhYyk7XHJcblxyXG4gICAgICAgIGNvbnN0IGJ5VHlwZSA9IG5ldyBNYXA8c3RyaW5nLCBDb21tZW50W10+KCk7XHJcbiAgICAgICAgZm9yIChjb25zdCBjb21tZW50IG9mIHZhbGlkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IChjb21tZW50LnR5cGUgYXMgc3RyaW5nKSB8fCAnVU5UWVBFRCc7XHJcbiAgICAgICAgICAgIGlmICghYnlUeXBlLmhhcyhrZXkpKSB7XHJcbiAgICAgICAgICAgICAgICBieVR5cGUuc2V0KGtleSwgW10pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJ5VHlwZS5nZXQoa2V5KS5wdXNoKGNvbW1lbnQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3Qgb3JkZXJlZDogQ29tbWVudFtdID0gW107XHJcblxyXG4gICAgICAgIGZvciAoY29uc3QgZmFtaWx5IG9mIGJ5VHlwZS52YWx1ZXMoKSkge1xyXG4gICAgICAgICAgICBmYW1pbHkuc29ydCgoYSwgYikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYWkgPSB0aGlzLm9yZGVyaW5nSW5kZXhPZihhKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGJpID0gdGhpcy5vcmRlcmluZ0luZGV4T2YoYik7XHJcbiAgICAgICAgICAgICAgICBpZiAoYWkgIT09IGJpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFpIC0gYmk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjb25zdCBhZCA9IHRoaXMuY3JlYXRpb25UaW1lT2YoYSk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBiZCA9IHRoaXMuY3JlYXRpb25UaW1lT2YoYik7XHJcbiAgICAgICAgICAgICAgICBpZiAoYWQgIT09IGJkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFkIC0gYmQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nKChhIGFzIGFueSkuaWQgfHwgJycpLmxvY2FsZUNvbXBhcmUoU3RyaW5nKChiIGFzIGFueSkuaWQgfHwgJycpKTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBpbmRpY2VzID0gZmFtaWx5Lm1hcChjID0+IGMuaW5kZXgpO1xyXG4gICAgICAgICAgICBjb25zdCBpc0FtYmlndW91cyA9IGluZGljZXMuc29tZShpID0+IGkgPT09IG51bGwgfHwgaSA9PT0gdW5kZWZpbmVkKVxyXG4gICAgICAgICAgICAgICAgfHwgbmV3IFNldChpbmRpY2VzKS5zaXplICE9PSBpbmRpY2VzLmxlbmd0aDtcclxuXHJcbiAgICAgICAgICAgIGZhbWlseS5mb3JFYWNoKChjb21tZW50LCBwb3NpdGlvbikgPT4ge1xyXG4gICAgICAgICAgICAgICAgKGNvbW1lbnQgYXMgYW55KS5fX2NvcHlJbmRleCA9IGlzQW1iaWd1b3VzID8gcG9zaXRpb24gKyAxIDogY29tbWVudC5pbmRleDtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBvcmRlcmVkLnB1c2goLi4uZmFtaWx5KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBvcmRlcmVkO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBTb3J0IGtleSBmb3IgYSBjb21tZW50J3MgcG9zaXRpb247IGEgbWlzc2luZyBpbmRleCBzb3J0cyBsYXN0LCBub3QgZmlyc3QuICovXHJcbiAgICBwcml2YXRlIG9yZGVyaW5nSW5kZXhPZihjb21tZW50OiBDb21tZW50KTogbnVtYmVyIHtcclxuICAgICAgICBjb25zdCBpbmRleCA9IGNvbW1lbnQ/LmluZGV4O1xyXG4gICAgICAgIHJldHVybiBpbmRleCA9PT0gbnVsbCB8fCBpbmRleCA9PT0gdW5kZWZpbmVkIHx8IE51bWJlci5pc05hTihOdW1iZXIoaW5kZXgpKVxyXG4gICAgICAgICAgICA/IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSXHJcbiAgICAgICAgICAgIDogTnVtYmVyKGluZGV4KTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQ3JlYXRpb24gdGltZXN0YW1wIG9mIGEgY29tbWVudCwgdXNlZCBhcyB0aGUgdGllLWJyZWFrZXI6IGl0IHJlZmxlY3RzIHRoZSBvcmRlciBpblxyXG4gICAgICogIHdoaWNoIHRoZSB1c2VyIHVwbG9hZGVkIHRoZSBtZWRpYSwgd2hpY2ggaXMgdGhlIG9yZGVyIHRoZXkgc2F3LiAqL1xyXG4gICAgcHJpdmF0ZSBjcmVhdGlvblRpbWVPZihjb21tZW50OiBDb21tZW50KTogbnVtYmVyIHtcclxuICAgICAgICBjb25zdCBjcmVhdGVkQXQgPSAoY29tbWVudCBhcyBhbnkpPy5jcmVhdGVkQXQ7XHJcbiAgICAgICAgaWYgKCFjcmVhdGVkQXQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHRpbWUgPSBuZXcgRGF0ZShjcmVhdGVkQXQpLmdldFRpbWUoKTtcclxuICAgICAgICByZXR1cm4gTnVtYmVyLmlzTmFOKHRpbWUpID8gMCA6IHRpbWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb3BpZXMgT05FIG1lZGlhIGl0ZW0gKGltYWdlLCB2aWRlbywgYXVkaW8sIGRvY3VtZW50LCB0ZXh0LCBsaW5rLCBlbWJlZCwgaWZyYW1lLi4uKVxyXG4gICAgICogb2YgYSBmZWF0dXJlLCBkdXBsaWNhdGluZyBpdHMgZmlsZSBpbiBTMyBmaXJzdCB3aGVuIGl0IGhhcyBvbmUuXHJcbiAgICAgKlxyXG4gICAgICogRXZlcnkgY29sdW1uIG9mIHRoZSBDb21tZW50IG1vZGVsIGlzIGNhcnJpZWQgb3Zlci4gYGRlc2NyaXB0aW9uYCBhbmQgYG1ldGFkYXRhYCB3ZXJlXHJcbiAgICAgKiBwcmV2aW91c2x5IGRyb3BwZWQsIHdoaWNoIGVtcHRpZWQgdGhlIGNhcHRpb25zIG9mIGltYWdlcy92aWRlb3MsIHRoZSBib2R5IG9mIFRFWFRcclxuICAgICAqIGl0ZW1zIOKAlCB3aGVyZSB0aGUgd2hvbGUgY29udGVudCBsaXZlcywgc2luY2UgYSBURVhUIGNvbW1lbnQgaGFzIG5vIGZpbGUg4oCUIGFuZCBhbnlcclxuICAgICAqIHBlci1tZWRpYSBzZXR0aW5ncyBzdG9yZWQgaW4gbWV0YWRhdGEuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgYXN5bmMgY29weUNvbW1lbnRGb3JGZWF0dXJlKFxyXG4gICAgICAgIHNvdXJjZUNvbW1lbnQ6IENvbW1lbnQsXHJcbiAgICAgICAgdGFyZ2V0RmVhdHVyZUlkOiBzdHJpbmcsXHJcbiAgICAgICAgdGFyZ2V0U3BhY2VJZDogc3RyaW5nXHJcbiAgICApOiBQcm9taXNlPENvbW1lbnQ+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb3B5Q29tbWVudChzb3VyY2VDb21tZW50LCB0YXJnZXRTcGFjZUlkLCB7IGZlYXR1cmVJRDogdGFyZ2V0RmVhdHVyZUlkIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBTYW1lLCBmb3IgYW4gYXR0YWNobWVudCBjYXJyaWVkIGJ5IGEgdGlja2V0IHJhdGhlciB0aGFuIGJ5IGEgZmVhdHVyZS4gKi9cclxuICAgIHByaXZhdGUgYXN5bmMgY29weUNvbW1lbnRGb3JUaWNrZXQoXHJcbiAgICAgICAgc291cmNlQ29tbWVudDogQ29tbWVudCxcclxuICAgICAgICB0YXJnZXRUaWNrZXRJZDogc3RyaW5nLFxyXG4gICAgICAgIHRhcmdldFNwYWNlSWQ6IHN0cmluZ1xyXG4gICAgKTogUHJvbWlzZTxDb21tZW50PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY29weUNvbW1lbnQoc291cmNlQ29tbWVudCwgdGFyZ2V0U3BhY2VJZCwgeyB0aWNrZXRJRDogdGFyZ2V0VGlja2V0SWQgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFNoYXJlZCBib2R5IG9mIHRoZSB0d28gYWJvdmU6IGBvd25lcmAgY2FycmllcyB3aGljaGV2ZXIgZm9yZWlnbiBrZXkgbGlua3MgdGhlIGNvcHkgYmFja1xyXG4gICAgICogIHRvIGl0cyBuZXcgcGFyZW50LCBldmVyeXRoaW5nIGVsc2UgaXMgaWRlbnRpY2FsLiAqL1xyXG4gICAgcHJpdmF0ZSBhc3luYyBjb3B5Q29tbWVudChcclxuICAgICAgICBzb3VyY2VDb21tZW50OiBDb21tZW50LFxyXG4gICAgICAgIHRhcmdldFNwYWNlSWQ6IHN0cmluZyxcclxuICAgICAgICBvd25lcjogeyBmZWF0dXJlSUQ/OiBzdHJpbmc7IHRpY2tldElEPzogc3RyaW5nIH1cclxuICAgICk6IFByb21pc2U8Q29tbWVudD4ge1xyXG4gICAgICAgIGNvbnN0IHJhd0NvbW1lbnQgPSBzb3VyY2VDb21tZW50IGFzIGFueTtcclxuXHJcbiAgICAgICAgbGV0IGNvcGllZEFubmV4ZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcbiAgICAgICAgaWYgKHJhd0NvbW1lbnQuYW5uZXhlKSB7XHJcbiAgICAgICAgICAgIGNvcGllZEFubmV4ZSA9IGF3YWl0IHRoaXMuY29weVMzS2V5SWZQcmVzZW50KHJhd0NvbW1lbnQuYW5uZXhlLCBgYXR0YWNobWVudCBcIiR7cmF3Q29tbWVudC50aXRsZX1cImApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgY29tbWVudElucHV0OiBhbnkgPSB7XHJcbiAgICAgICAgICAgIHRpdGxlOiByYXdDb21tZW50LnRpdGxlLFxyXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogcmF3Q29tbWVudC5kZXNjcmlwdGlvbiA/PyBudWxsLFxyXG4gICAgICAgICAgICBtZXRhZGF0YTogcmF3Q29tbWVudC5tZXRhZGF0YSA/PyBudWxsLFxyXG4gICAgICAgICAgICB0eXBlOiByYXdDb21tZW50LnR5cGUsXHJcbiAgICAgICAgICAgIGFubmV4ZTogY29waWVkQW5uZXhlLFxyXG4gICAgICAgICAgICBleHRlcm5hbExpbms6IHJhd0NvbW1lbnQuZXh0ZXJuYWxMaW5rIHx8IG51bGwsXHJcbiAgICAgICAgICAgIGRpbWVuc2lvbnM6IHJhd0NvbW1lbnQuZGltZW5zaW9ucyB8fCBudWxsLFxyXG4gICAgICAgICAgICBpbmRleDogcmF3Q29tbWVudC5fX2NvcHlJbmRleCA/PyByYXdDb21tZW50LmluZGV4ID8/IG51bGwsXHJcbiAgICAgICAgICAgIHNob3duSW5UYWc6IHJhd0NvbW1lbnQuc2hvd25JblRhZyxcclxuICAgICAgICAgICAgaXNDb3ZlckltYWdlOiByYXdDb21tZW50LmlzQ292ZXJJbWFnZSxcclxuICAgICAgICAgICAgc3BhY2VJRDogdGFyZ2V0U3BhY2VJZCxcclxuICAgICAgICAgICAgLy8gS2VlcHMgY3JlZGl0aW5nIHRoZSBPUklHSU5BTCBhdXRob3Igd2hlbiB0aGV5IGFsc28gaGF2ZSBhIG1pc3Npb24gaW4gdGhlXHJcbiAgICAgICAgICAgIC8vIHRhcmdldCBzcGFjZSwgYW5kIGxlYXZlcyB0aGUgY29tbWVudCB1bi1vd25lZCBvdGhlcndpc2Ug4oCUIHNlZVxyXG4gICAgICAgICAgICAvLyByZXNvbHZlQ29tbWVudE93bmVySUQoKS4gTmV2ZXIgdGhlIGN1cnJlbnQgb3BlcmF0b3IncyBvd24gbWlzc2lvbjogdGhhdFxyXG4gICAgICAgICAgICAvLyB3b3VsZCBzaWxlbnRseSByZWFzc2lnbiBhdXRob3JzaGlwIHRvIHdob2V2ZXIgaGFwcGVucyB0byBydW4gdGhlIGNvcHkuXHJcbiAgICAgICAgICAgIG93bmVySUQ6IHRoaXMucmVzb2x2ZUNvbW1lbnRPd25lcklEKHJhd0NvbW1lbnQub3duZXJJRCksXHJcbiAgICAgICAgICAgIC4uLm93bmVyXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY29tbWVudFNlcnZpY2UuY3JlYXRlQ29tbWVudChjb21tZW50SW5wdXQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vXHJcbiAgICAvLyAtLS0tLS0tLS0tIFBPSSBjcmVhdGlvbiAtLS0tLS0tLS0tXHJcbiAgICAvL1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyB0aGUgdGFyZ2V0LXNwYWNlIGNvcHkgb2YgYSBzb3VyY2UgUE9JLCB3aXRoIEVWRVJZIGNvbHVtbiBvZiB0aGUgUE9JIG1vZGVsLlxyXG4gICAgICpcclxuICAgICAqIFNpbmdsZSBlbnRyeSBwb2ludCBmb3IgYWxsIHBoYXNlczogdGhlIGVsZW1lbnQgcGhhc2VzICh0aWNrZXQsIGVxdWlwbWVudCwgM0Qgb2JqZWN0LFxyXG4gICAgICogZmVhdHVyZSwgbWVhc3VyZW1lbnQpIHVzZWQgdG8gYnVpbGQgdGhlaXIgUE9JIGlubGluZSB3aXRoIG9ubHkgNSBmaWVsZHMg4oCUIGNvb3JkaW5hdGUsXHJcbiAgICAgKiB0eXBlLCBlbGVtZW50SUQsIG1ldGFkYXRhLCBzd2VlcCDigJQgd2hpY2ggaXMgcHJlY2lzZWx5IGhvdyBtdXNldW0gUE9JcyBsb3N0IHRoZWlyXHJcbiAgICAgKiBwYXN0aWxsZTogYHRhZ0Rlc2NyaXB0aW9uYCAodGhlIHBvcHVwIHRleHQpLCBgdGFnSWNvbmAgKHRoZSBjdXN0b20gaWNvbikgYW5kXHJcbiAgICAgKiBgdGFnSW1hZ2VJRGAgKHRoZSBwYXN0aWxsZSdzIGltYWdlKSBuZXZlciBsZWZ0IHRoZSBzb3VyY2Ugc3BhY2UuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgYXN5bmMgY3JlYXRlQ29waWVkUG9pKFxyXG4gICAgICAgIHNvdXJjZVBvaTogUE9JLFxyXG4gICAgICAgIGVsZW1lbnRJRDogc3RyaW5nIHwgbnVsbCxcclxuICAgICAgICBzb3VyY2VOYXZQb3NpdGlvbnM6IE1hcDxzdHJpbmcsIFZlYzM+LFxyXG4gICAgICAgIHRhcmdldE5hdlBvc2l0aW9uczogTWFwPHN0cmluZywgVmVjMz4sXHJcbiAgICAgICAgdHJhbnNmb3JtOiBSaWdpZFRyYW5zZm9ybVxyXG4gICAgKTogUHJvbWlzZTxQT0k+IHtcclxuICAgICAgICBjb25zdCByYXcgPSBzb3VyY2VQb2kgYXMgYW55O1xyXG5cclxuICAgICAgICBjb25zdCB0YXJnZXRTd2VlcElkID0gdGhpcy5maW5kQ2xvc2VzdFRhcmdldFN3ZWVwSWQoXHJcbiAgICAgICAgICAgIHNvdXJjZVBvaS5tYXR0ZXJwb3J0U3dlZXBJRCwgc291cmNlTmF2UG9zaXRpb25zLCB0YXJnZXROYXZQb3NpdGlvbnMsIHRyYW5zZm9ybVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgY29uc3QgYWRqdXN0ZWRDb29yZGluYXRlID0gdGhpcy5nZXRBZGp1c3RlZENvb3JkaW5hdGVzKHNvdXJjZVBvaS5jb29yZGluYXRlLCB0cmFuc2Zvcm0pO1xyXG5cclxuICAgICAgICBjb25zdCBwb2lJbnB1dDogYW55ID0ge1xyXG4gICAgICAgICAgICBjb29yZGluYXRlOiBhZGp1c3RlZENvb3JkaW5hdGUgPT09IG51bGwgfHwgYWRqdXN0ZWRDb29yZGluYXRlID09PSB1bmRlZmluZWRcclxuICAgICAgICAgICAgICAgID8gbnVsbFxyXG4gICAgICAgICAgICAgICAgOiBKU09OLnN0cmluZ2lmeShhZGp1c3RlZENvb3JkaW5hdGUpLFxyXG4gICAgICAgICAgICB0eXBlOiBzb3VyY2VQb2kudHlwZSxcclxuICAgICAgICAgICAgZWxlbWVudElEOiBlbGVtZW50SUQgPz8gbnVsbCxcclxuICAgICAgICAgICAgbWF0dGVycG9ydFN3ZWVwSUQ6IHRhcmdldFN3ZWVwSWQsXHJcblxyXG4gICAgICAgICAgICAvLyAtLS0gcGFzdGlsbGUgKHRhZyBwb3B1cCkgLS0tXHJcbiAgICAgICAgICAgIHRhZ0Rlc2NyaXB0aW9uOiBzb3VyY2VQb2kudGFnRGVzY3JpcHRpb24gPz8gbnVsbCxcclxuICAgICAgICAgICAgdGFnSWNvbjogYXdhaXQgdGhpcy5kdXBsaWNhdGVUYWdJY29uKHNvdXJjZVBvaS50YWdJY29uKSxcclxuICAgICAgICAgICAgdGFnSW1hZ2VJRDogdGhpcy5yZXNvbHZlVGFnSW1hZ2VJRChzb3VyY2VQb2kudGFnSW1hZ2VJRCksXHJcblxyXG4gICAgICAgICAgICAvLyAtLS0gcmVuZGVyaW5nIC8gdmlzaWJpbGl0eSBmbGFncywgY2FycmllZCBvdmVyIHZlcmJhdGltIC0tLVxyXG4gICAgICAgICAgICBzcGVjaWZpYzogcmF3LnNwZWNpZmljID8/IG51bGwsXHJcbiAgICAgICAgICAgIHByaXZhdGU6IHJhdy5wcml2YXRlID8/IG51bGwsXHJcbiAgICAgICAgICAgIGdsb2JhbDogcmF3Lmdsb2JhbCA/PyBudWxsLFxyXG4gICAgICAgICAgICBsZXZlbDogcmF3LmxldmVsID8/IG51bGwsXHJcbiAgICAgICAgICAgIHJvbGU6IHJhdy5yb2xlID8/IG51bGwsXHJcbiAgICAgICAgICAgIGNhdGVnb3J5OiByYXcuY2F0ZWdvcnkgPz8gbnVsbCxcclxuICAgICAgICAgICAgZG9tYWluSUQ6IHRoaXMucmVzb2x2ZURvbWFpbklEKHJhdy5kb21haW5JRCksXHJcblxyXG4gICAgICAgICAgICAvLyAtLS0gTWF0dGVycG9ydCBhbmNob3JpbmcgLS0tXHJcbiAgICAgICAgICAgIG1ldGFkYXRhOiB0aGlzLmdldEFkanVzdGVkUG9pTWV0YWRhdGEoc291cmNlUG9pLm1ldGFkYXRhLCB0cmFuc2Zvcm0pXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMucG9pU2VydmljZS5jcmVhdGVQT0lGb3JTcGFjZUlEKHBvaUlucHV0IGFzIFBPSSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGFwdHMgYSBQT0kncyBgbWV0YWRhdGFgIChzZWUgTWF0dGVydGFnRGF0YS5nZXRNZXRhZGF0YVN0cmluZygpOiB7IGljb24sIG5vcm1hbCwgc2lkIH0pXHJcbiAgICAgKiB0byB0aGUgdGFyZ2V0IHNwYWNlLlxyXG4gICAgICpcclxuICAgICAqICAtIGBzaWRgIGlzIHRoZSBpZCBvZiB0aGUgTWF0dGVydGFnIGluc2lkZSB0aGUgU09VUkNFIE1hdHRlcnBvcnQgbW9kZWwuIENhcnJpZWQgb3ZlcixcclxuICAgICAqICAgIHRoZSB2aWV3ZXIgdHJpZXMgdG8gcmUtY3JlYXRlIHRoZSB0YXJnZXQncyB0YWcgd2l0aCBhbiBpZCBiZWxvbmdpbmcgdG8gYW5vdGhlclxyXG4gICAgICogICAgbW9kZWwgKFwiYWxyZWFkeSBpbiB1c2VcIiksIHNvIHRoZSBwYXN0aWxsZSBmYWlscyB0byBhdHRhY2guIEl0IGlzIGRyb3BwZWQ6IHRoZVxyXG4gICAgICogICAgdmlld2VyIHRoZW4gYWxsb2NhdGVzIGEgZnJlc2ggc2lkIG9uIGZpcnN0IHJlbmRlci5cclxuICAgICAqICAtIGBub3JtYWxgIGlzIHRoZSBzdGVtIGRpcmVjdGlvbi4gSXQgaXMgYSBkaXJlY3Rpb24sIHNvIG9ubHkgdGhlIHJvdGF0aW9uIGFwcGxpZXNcclxuICAgICAqICAgIChuZXZlciB0aGUgdHJhbnNsYXRpb24pOyB3aXRob3V0IGl0LCBhIGNvcGllZCBwYXN0aWxsZSBwb2ludHMgaW50byB0aGUgd2FsbFxyXG4gICAgICogICAgd2hlbmV2ZXIgdGhlIHR3byBtb2RlbHMgYXJlIG5vdCBhbGlnbmVkIG9uIHRoZSBzYW1lIGF4aXMuXHJcbiAgICAgKiAgLSBgaWNvbmAgYW5kIGFueXRoaW5nIGVsc2UgaXMga2VwdCBhcy1pcy5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBnZXRBZGp1c3RlZFBvaU1ldGFkYXRhKG1ldGFkYXRhOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCB0cmFuc2Zvcm06IFJpZ2lkVHJhbnNmb3JtKTogc3RyaW5nIHwgbnVsbCB7XHJcbiAgICAgICAgaWYgKCFtZXRhZGF0YSkge1xyXG4gICAgICAgICAgICByZXR1cm4gbWV0YWRhdGEgPz8gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShtZXRhZGF0YSk7XHJcbiAgICAgICAgICAgIGlmICghcGFyc2VkIHx8IHR5cGVvZiBwYXJzZWQgIT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbWV0YWRhdGE7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChwYXJzZWQubm9ybWFsXHJcbiAgICAgICAgICAgICAgICAmJiB0eXBlb2YgcGFyc2VkLm5vcm1hbCA9PT0gJ29iamVjdCdcclxuICAgICAgICAgICAgICAgICYmIHR5cGVvZiBwYXJzZWQubm9ybWFsLnggPT09ICdudW1iZXInXHJcbiAgICAgICAgICAgICAgICAmJiB0eXBlb2YgcGFyc2VkLm5vcm1hbC55ID09PSAnbnVtYmVyJ1xyXG4gICAgICAgICAgICAgICAgJiYgdHlwZW9mIHBhcnNlZC5ub3JtYWwueiA9PT0gJ251bWJlcicpIHtcclxuICAgICAgICAgICAgICAgIHBhcnNlZC5ub3JtYWwgPSBhcHBseVJpZ2lkVHJhbnNmb3JtVG9EaXJlY3Rpb24ocGFyc2VkLm5vcm1hbCwgdHJhbnNmb3JtKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZGVsZXRlIHBhcnNlZC5zaWQ7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocGFyc2VkKTtcclxuICAgICAgICB9IGNhdGNoIHtcclxuICAgICAgICAgICAgLy8gTm90IEpTT04sIG9yIHVuZXhwZWN0ZWQgc2hhcGUg4oCUIGxlYXZlIHVudG91Y2hlZCByYXRoZXIgdGhhbiBndWVzcy5cclxuICAgICAgICAgICAgcmV0dXJuIG1ldGFkYXRhO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlc29sdmVzIGEgUE9JJ3MgYHRhZ0ltYWdlSURgIOKAlCB3aGljaCB0aGUgc2NoZW1hIGRvY3VtZW50cyBhcyBhIFwiY29ubmVjdGlvbiB0b1xyXG4gICAgICogY29tbWVudC5pZFwiLCBpLmUuIHRoZSBpZCBvZiB0aGUgQ29tbWVudCBob2xkaW5nIHRoZSBpbWFnZSBzaG93biBpbiB0aGUgcGFzdGlsbGUuXHJcbiAgICAgKlxyXG4gICAgICogSXQgaXMgTk9UIGFuIFMzIGtleSwgc28gdGhlIHByZXZpb3VzIFwiZG9lcyBpdCBjb250YWluIGEgc2xhc2g/XCIgaGV1cmlzdGljIG5ldmVyXHJcbiAgICAgKiBtYXRjaGVkIGFuZCB0aGUgdmFsdWUgdHJhdmVsbGVkIHVuY2hhbmdlZCwgbGVhdmluZyBldmVyeSBjb3BpZWQgcGFzdGlsbGUgcG9pbnRpbmcgYXRcclxuICAgICAqIGEgQ29tbWVudCBvZiB0aGUgc291cmNlIHNwYWNlLiBJdCBpcyBub3cgdHJhbnNsYXRlZCB0aHJvdWdoIHRoZSBjb21tZW50IGlkIG1hcCBidWlsdFxyXG4gICAgICogd2hpbGUgZHVwbGljYXRpbmcgdGhlIG1lZGlhLCBhbmQgZHJvcHBlZCB3aGVuIGl0IGNhbm5vdCBiZSByZXNvbHZlZCAodGhlIHBhc3RpbGxlXHJcbiAgICAgKiB0aGVuIGZhbGxzIGJhY2sgdG8gdGhlIGZlYXR1cmUncyBjb3ZlciBpbWFnZSBpbnN0ZWFkIG9mIGEgYnJva2VuIHJlZmVyZW5jZSkuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgcmVzb2x2ZVRhZ0ltYWdlSUQodGFnSW1hZ2VJRDogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IG51bGwge1xyXG4gICAgICAgIGlmICghdGFnSW1hZ2VJRCkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY29tbWVudElkcy5nZXQodGFnSW1hZ2VJRCkgPz8gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvL1xyXG4gICAgLy8gLS0tLS0tLS0tLSBEdXBsaWNhdGUgZGV0ZWN0aW9uIC0tLS0tLS0tLS1cclxuICAgIC8vXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBIZXVyaXN0aWMgZHVwbGljYXRlLWRldGVjdGlvbjogY29tcGFyZXMgc2V2ZXJhbCBpZGVudGlmeWluZyBmaWVsZHMgdG9nZXRoZXIgcmF0aGVyIHRoYW5cclxuICAgICAqIGEgc2luZ2xlIGxhYmVsLCB0byByZWR1Y2UgZmFsc2UgcG9zaXRpdmVzIHdoZW4gaXRlbXMgc2hhcmUgb25lIG9mIHRoZW0uIFJldHVybnMgdGhlXHJcbiAgICAgKiBtYXRjaGVkIHRhcmdldCBpdGVtIChvciB1bmRlZmluZWQpIHJhdGhlciB0aGFuIGEgYm9vbGVhbiwgc28gdGhlIGNhbGxlciBjYW4gYWN0IG9uIHRoZVxyXG4gICAgICogZXhpc3RpbmcgcmVjb3JkIOKAlCBoZWFsIGl0cyBtaXNzaW5nIGZpZWxkcyDigJQgaW5zdGVhZCBvZiBvbmx5IHNraXBwaW5nIGl0LlxyXG4gICAgICpcclxuICAgICAqIFRoZSBmaWVsZHMgYXJlIHN1cHBsaWVkIGJ5IHRoZSBjYWxsZXIgYmVjYXVzZSB0aGUgbW9kZWxzIGRvIG5vdCBhZ3JlZSBvbiB0aGVtLiBUaGVcclxuICAgICAqIHByZXZpb3VzIHZlcnNpb24gaGFyZC1jb2RlZCBgdGl0bGVgL2BkZXNjcmlwdGlvbmAsIHdoaWNoIGRvIG5vdCBleGlzdCBvbiBFcXVpcG1lbnQgYXRcclxuICAgICAqIGFsbDogYm90aCBzaWRlcyByZWFkIGB1bmRlZmluZWRgLCBldmVyeSBlcXVpcG1lbnQgdGhlcmVmb3JlIFwibWF0Y2hlZFwiIGV2ZXJ5IG90aGVyIG9uZSxcclxuICAgICAqIGFuZCBhIHRhcmdldCBzcGFjZSBob2xkaW5nIGEgc2luZ2xlIGVxdWlwbWVudCBzaWxlbnRseSBjYXVzZWQgdGhlIHdob2xlIGVxdWlwbWVudCBwaGFzZVxyXG4gICAgICogdG8gY29weSBub3RoaW5nLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGZpbmRFeGlzdGluZzxUPihcclxuICAgICAgICBzb3VyY2U6IFQsXHJcbiAgICAgICAgdGFyZ2V0TGlzdDogVFtdLFxyXG4gICAgICAgIGlkZW50aXR5OiAoaXRlbTogVCkgPT4gQXJyYXk8c3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZD5cclxuICAgICk6IFQgfCB1bmRlZmluZWQge1xyXG4gICAgICAgIGNvbnN0IHNvdXJjZUtleSA9IHRoaXMuaWRlbnRpdHlLZXkoaWRlbnRpdHkoc291cmNlKSk7XHJcbiAgICAgICAgcmV0dXJuIHRhcmdldExpc3QuZmluZCh0YXJnZXQgPT4gdGhpcy5pZGVudGl0eUtleShpZGVudGl0eSh0YXJnZXQpKSA9PT0gc291cmNlS2V5KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEJ1aWxkcyBhIHBhdGNoIG9mIHdoaWNoZXZlciBmaWVsZHMgaW4gYGZpZWxkc2AgdGhlIGV4aXN0aW5nIHRhcmdldCByZWNvcmQgaXMgbWlzc2luZ1xyXG4gICAgICogKGBudWxsYC9gdW5kZWZpbmVkYC9lbXB0eSBhcnJheSkgYnV0IHRoZSBzb3VyY2UgaGFzLCBwbHVzIGBkb21haW5JRGAgd2hlbiByZXF1ZXN0ZWQg4oCUXHJcbiAgICAgKiBkb21haW5zIGFyZSBvcmdhbmlzYXRpb24tc2NvcGVkIGV2ZXJ5d2hlcmUgaW4gdGhpcyBmaWxlLCBzbyB0aGF0IG9uZSBpcyBvbmx5IGV2ZXJcclxuICAgICAqIGhlYWxlZCBhY3Jvc3MgdGhlIFNBTUUgb3JnYW5pc2F0aW9uLCBleGFjdGx5IGxpa2UgYXQgY3JlYXRpb24gdGltZS5cclxuICAgICAqXHJcbiAgICAgKiBOZXZlciBvdmVyd3JpdGVzIGEgZmllbGQgdGhlIHRhcmdldCBhbHJlYWR5IGNhcnJpZXMgYSB2YWx1ZSBmb3I6IGEgdmFsdWUgZW50ZXJlZCBieVxyXG4gICAgICogaGFuZCBpbiB0aGUgdGFyZ2V0IHNwYWNlIHNpbmNlIGFuIGVhcmxpZXIsIGluY29tcGxldGUgY29weSBtdXN0IG5vdCBiZSBjbG9iYmVyZWQgYnlcclxuICAgICAqIGFuIG9sZGVyIG9yIGRpZmZlcmVudCBzb3VyY2UgdmFsdWUuXHJcbiAgICAgKlxyXG4gICAgICogUmV0dXJucyBib3RoIHRoZSBwYXRjaCB0byBzZW5kIGFuZCB0aGUgbGlzdCBvZiBoZWFsZWQgZmllbGQgbmFtZXMsIHNvIHRoZSBjYWxsZXIgY2FuXHJcbiAgICAgKiBib3RoIHBlcmZvcm0gdGhlIHVwZGF0ZSBhbmQgZGVzY3JpYmUgaXQgaW4gdGhlIGNvcHkgbG9nLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGJ1aWxkSGVhbFBhdGNoKFxyXG4gICAgICAgIHNvdXJjZU9iajogYW55LFxyXG4gICAgICAgIGV4aXN0aW5nVGFyZ2V0OiBhbnksXHJcbiAgICAgICAgZmllbGRzOiBzdHJpbmdbXSxcclxuICAgICAgICBpbmNsdWRlRG9tYWluOiBib29sZWFuXHJcbiAgICApOiB7IHBhdGNoOiBhbnk7IGhlYWxlZEZpZWxkczogc3RyaW5nW10gfSB7XHJcbiAgICAgICAgY29uc3QgcGF0Y2g6IGFueSA9IHt9O1xyXG4gICAgICAgIGNvbnN0IGhlYWxlZEZpZWxkczogc3RyaW5nW10gPSBbXTtcclxuXHJcbiAgICAgICAgY29uc3QgZmlsbElmTWlzc2luZyA9IChrZXk6IHN0cmluZywgc291cmNlVmFsdWU6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSBleGlzdGluZ1RhcmdldFtrZXldO1xyXG4gICAgICAgICAgICBjb25zdCBpc01pc3NpbmcgPSBjdXJyZW50VmFsdWUgPT09IG51bGwgfHwgY3VycmVudFZhbHVlID09PSB1bmRlZmluZWRcclxuICAgICAgICAgICAgICAgIHx8IChBcnJheS5pc0FycmF5KGN1cnJlbnRWYWx1ZSkgJiYgY3VycmVudFZhbHVlLmxlbmd0aCA9PT0gMCk7XHJcbiAgICAgICAgICAgIGlmIChpc01pc3NpbmcgJiYgc291cmNlVmFsdWUgIT09IG51bGwgJiYgc291cmNlVmFsdWUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgcGF0Y2hba2V5XSA9IHNvdXJjZVZhbHVlO1xyXG4gICAgICAgICAgICAgICAgaGVhbGVkRmllbGRzLnB1c2goa2V5KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGZvciAoY29uc3QgZmllbGQgb2YgZmllbGRzKSB7XHJcbiAgICAgICAgICAgIGZpbGxJZk1pc3NpbmcoZmllbGQsIHNvdXJjZU9ialtmaWVsZF0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaW5jbHVkZURvbWFpbiAmJiAoZXhpc3RpbmdUYXJnZXQuZG9tYWluSUQgPT09IG51bGwgfHwgZXhpc3RpbmdUYXJnZXQuZG9tYWluSUQgPT09IHVuZGVmaW5lZCkpIHtcclxuICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWREb21haW5JZCA9IHRoaXMucmVzb2x2ZURvbWFpbklEKHNvdXJjZU9iai5kb21haW5JRCk7XHJcbiAgICAgICAgICAgIGlmIChyZXNvbHZlZERvbWFpbklkKSB7XHJcbiAgICAgICAgICAgICAgICBwYXRjaC5kb21haW5JRCA9IHJlc29sdmVkRG9tYWluSWQ7XHJcbiAgICAgICAgICAgICAgICBoZWFsZWRGaWVsZHMucHVzaCgnZG9tYWluSUQnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHsgcGF0Y2gsIGhlYWxlZEZpZWxkcyB9O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRmlsbHMgaW4gd2hpY2hldmVyIGlkZW50aXR5IGZpZWxkIGEgUFJFLUVYSVNUSU5HIHRhcmdldCBlcXVpcG1lbnQgaXMgbWlzc2luZyBidXQgdGhlXHJcbiAgICAgKiBzb3VyY2UgaGFzIOKAlCBzZWUgdGhlIGNhbGwgc2l0ZSBpbiB0aGUgRVFVSVBNRU5UUyBwaGFzZSBmb3Igd2h5IHJlLXJ1bm5pbmcgdGhlIGNvcHlcclxuICAgICAqIGhhcyB0byBiZSBhYmxlIHRvIHJlcGFpciBhIHByZXZpb3VzbHktY29waWVkIGVxdWlwbWVudCwgbm90IGp1c3Qgc2tpcCBpdCBhZ2Fpbi5cclxuICAgICAqXHJcbiAgICAgKiBBIGZhaWxlZCB1cGRhdGUgaXMgbGVmdCB0byBidWJibGUgdXAgdG8gdGhlIGNhbGxlcidzIGV4aXN0aW5nIHBlci1pdGVtIHRyeS9jYXRjaCwgdGhlXHJcbiAgICAgKiBzYW1lIGFzIGEgZmFpbGVkIGNyZWF0aW9uIOKAlCBpdCBnZXRzIHRoZSBzYW1lIHZpc2libGUgZXJyb3IgbGluZSwgcmF0aGVyIHRoYW4gYSBzaWxlbnRcclxuICAgICAqIGNvbnNvbGUgd2FybmluZy5cclxuICAgICAqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIGZpZWxkcyB0aGF0IHdlcmUgYWN0dWFsbHkgaGVhbGVkIChlbXB0eSBpZiBub3RoaW5nIHdhcyBtaXNzaW5nKS5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBhc3luYyBoZWFsRXF1aXBtZW50SWRlbnRpdHkoc291cmNlT2JqOiBhbnksIGV4aXN0aW5nVGFyZ2V0OiBhbnkpOiBQcm9taXNlPHN0cmluZ1tdPiB7XHJcbiAgICAgICAgY29uc3QgeyBwYXRjaCwgaGVhbGVkRmllbGRzIH0gPSB0aGlzLmJ1aWxkSGVhbFBhdGNoKFxyXG4gICAgICAgICAgICBzb3VyY2VPYmosIGV4aXN0aW5nVGFyZ2V0LFxyXG4gICAgICAgICAgICBbJ3N0YXR1cycsICdhbm5vdGF0aW9uJywgJ2ZhbWlseScsICdza3UnLCAnbWFudWZhY3R1cmVyJywgJ2luc3RhbGxEYXRlJywgJ3dhcnJhbnR5RW5kRGF0ZScsICdtZXRhZGF0YScsICdpc0NyZWF0ZWRCeUFJJ10sXHJcbiAgICAgICAgICAgIHRydWVcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICBpZiAoIWV4aXN0aW5nVGFyZ2V0LnBob3RvICYmIHNvdXJjZU9iai5waG90bykge1xyXG4gICAgICAgICAgICBwYXRjaC5waG90byA9IGF3YWl0IHRoaXMuY29weVMzS2V5SWZQcmVzZW50KHNvdXJjZU9iai5waG90bywgYGVxdWlwbWVudCBwaG90byBcIiR7c291cmNlT2JqLm5hbWV9XCJgKTtcclxuICAgICAgICAgICAgaGVhbGVkRmllbGRzLnB1c2goJ3Bob3RvJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoaGVhbGVkRmllbGRzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gaGVhbGVkRmllbGRzO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcGF0Y2guaWQgPSBleGlzdGluZ1RhcmdldC5pZDtcclxuICAgICAgICBhd2FpdCB0aGlzLmVxdWlwbWVudFNlcnZpY2UudXBkYXRlRXF1aXBtZW50KHBhdGNoKTtcclxuICAgICAgICByZXR1cm4gaGVhbGVkRmllbGRzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2FtZSBpZGVhIGFzIGhlYWxFcXVpcG1lbnRJZGVudGl0eSgpLCBmb3IgYSBwcmUtZXhpc3RpbmcgdGlja2V0LiBgdGl0bGVgL2BkZXNjcmlwdGlvbmBcclxuICAgICAqIGFyZSB0aGUgcGFpciBmaW5kRXhpc3RpbmcoKSBtYXRjaGVkIG9uIHRvIGZpbmQgdGhpcyB0aWNrZXQgaW4gdGhlIGZpcnN0IHBsYWNlLCBzbyB0aGV5XHJcbiAgICAgKiBhcmUgbmV2ZXIgcGFydCBvZiB0aGUgaGVhbCDigJQgYnkgY29uc3RydWN0aW9uLCB0aGV5IGFscmVhZHkgYWdyZWUgd2l0aCB0aGUgc291cmNlLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGFzeW5jIGhlYWxUaWNrZXRJZGVudGl0eShzb3VyY2VPYmo6IGFueSwgZXhpc3RpbmdUYXJnZXQ6IGFueSk6IFByb21pc2U8c3RyaW5nW10+IHtcclxuICAgICAgICBjb25zdCB7IHBhdGNoLCBoZWFsZWRGaWVsZHMgfSA9IHRoaXMuYnVpbGRIZWFsUGF0Y2goXHJcbiAgICAgICAgICAgIHNvdXJjZU9iaiwgZXhpc3RpbmdUYXJnZXQsXHJcbiAgICAgICAgICAgIFsnZnJpZW5kbHlMYWJlbCcsICdzdGF0dXMnLCAndHlwZScsICdwcmlvcml0eScsICdsZXZlbCcsICdtZXRhZGF0YScsICdyZWFkJywgJ3Byb2plY3RJRCcsICdwcm9ibGVtQ29kZSddLFxyXG4gICAgICAgICAgICB0cnVlXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgaWYgKGhlYWxlZEZpZWxkcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIGhlYWxlZEZpZWxkcztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHBhdGNoLmlkID0gZXhpc3RpbmdUYXJnZXQuaWQ7XHJcbiAgICAgICAgYXdhaXQgdGhpcy50aWNrZXRTZXJ2aWNlLnVwZGF0ZVRpY2tldChwYXRjaCk7XHJcbiAgICAgICAgcmV0dXJuIGhlYWxlZEZpZWxkcztcclxuICAgIH1cclxuXHJcbiAgICAvKiogU2FtZSBpZGVhLCBmb3IgYSBwcmUtZXhpc3RpbmcgZmVhdHVyZS4gS2V5d29yZHMsIG1lZGlhIGFuZCBQT0lzIGFyZSBub3QgaGVhbGVkIGhlcmVcclxuICAgICAqICBmb3IgdGhlIHNhbWUgcmVhc29uIG5vdGVzL1BPSXMgYXJlIG5vdCBoZWFsZWQgb24gZXF1aXBtZW50IOKAlCBzZWUgaGVhbEVxdWlwbWVudElkZW50aXR5KCkuICovXHJcbiAgICBwcml2YXRlIGFzeW5jIGhlYWxGZWF0dXJlSWRlbnRpdHkoc291cmNlT2JqOiBhbnksIGV4aXN0aW5nVGFyZ2V0OiBhbnkpOiBQcm9taXNlPHN0cmluZ1tdPiB7XHJcbiAgICAgICAgY29uc3QgeyBwYXRjaCwgaGVhbGVkRmllbGRzIH0gPSB0aGlzLmJ1aWxkSGVhbFBhdGNoKFxyXG4gICAgICAgICAgICBzb3VyY2VPYmosIGV4aXN0aW5nVGFyZ2V0LFxyXG4gICAgICAgICAgICBbJ3Nob3J0RGVzY3JpcHRpb24nLCAnbGV2ZWwnLCAndHlwZScsICdpbmRleCcsICdzdHJpcGVQcm9kdWN0SUQnLCAnc3RyaXBlUHJpY2VJRCcsICdib29raW5nUHJpY2VNZXRhZGF0YScsICdsb2NhbGUnXSxcclxuICAgICAgICAgICAgdHJ1ZVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIGlmIChoZWFsZWRGaWVsZHMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBoZWFsZWRGaWVsZHM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBwYXRjaC5pZCA9IGV4aXN0aW5nVGFyZ2V0LmlkO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuZmVhdHVyZVNlcnZpY2UudXBkYXRlRmVhdHVyZShwYXRjaCk7XHJcbiAgICAgICAgcmV0dXJuIGhlYWxlZEZpZWxkcztcclxuICAgIH1cclxuXHJcbiAgICAvKiogU2VyaWFsaXNlcyB0aGUgaWRlbnRpZnlpbmcgZmllbGRzIHVuYW1iaWd1b3VzbHksIHNvIHRoYXQgW1wiYVwiLCBcImJcIl0gYW5kIFtcImFiXCIsIFwiXCJdXHJcbiAgICAgKiAgY2FuIG5ldmVyIHByb2R1Y2UgdGhlIHNhbWUga2V5LiAqL1xyXG4gICAgcHJpdmF0ZSBpZGVudGl0eUtleShwYXJ0czogQXJyYXk8c3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZD4pOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShwYXJ0cy5tYXAocGFydCA9PiBwYXJ0ID8/ICcnKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy9cclxuICAgIC8vIC0tLS0tLS0tLS0gU3dlZXAgcG9zaXRpb25zIC8gcmlnaWQgdHJhbnNmb3JtIC0tLS0tLS0tLS1cclxuICAgIC8vXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGZXRjaGVzIHRoZSBwb3NpdGlvbiBvZiBldmVyeSBzd2VlcCBpbiBhIHNwYWNlIGFuZCByZXR1cm5zIGl0IGFzIGEgTWFwIGZvciBPKDEpIGxvb2t1cC5cclxuICAgICAqIFVzZXMgYWxsU2V0dGxlZCBzbyBhIHNpbmdsZSBmYWlsaW5nIHN3ZWVwIGxvb2t1cCBkb2Vzbid0IGFib3J0IHRoZSB3aG9sZSBtYXAg4oCUXHJcbiAgICAgKiB0aGF0IHN3ZWVwIGlzIHNpbXBseSBhYnNlbnQgZnJvbSB0aGUgcmVzdWx0aW5nIG1hcCAoYW5kIHNraXBwZWQgbGF0ZXIpLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGFzeW5jIGJ1aWxkTmF2aWdhdGlvblBvc2l0aW9uTWFwKHNwYWNlSWQ6IHN0cmluZywgc3dlZXBJZHM6IHN0cmluZ1tdKTogUHJvbWlzZTxNYXA8c3RyaW5nLCBWZWMzPj4ge1xyXG4gICAgICAgIGNvbnN0IG1hcCA9IG5ldyBNYXA8c3RyaW5nLCBWZWMzPigpO1xyXG5cclxuICAgICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFxyXG4gICAgICAgICAgICBzd2VlcElkcy5tYXAoYXN5bmMgKHNpZCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmF2cyA9IGF3YWl0IHRoaXMubmF2aWdhdGlvblNlcnZpY2UuZ2V0TmF2aWdhdGlvbnNGb3JNYXR0ZXJwb3J0SURGb3JTcGFjZShzaWQsIHNwYWNlSWQpO1xyXG4gICAgICAgICAgICAgICAgaWYgKG5hdnMgJiYgbmF2cy5sZW5ndGggPiAwICYmIG5hdnNbMF0ucG9zaXRpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBzaWQsIHBvc2l0aW9uOiBKU09OLnBhcnNlKG5hdnNbMF0ucG9zaXRpb24pIGFzIFZlYzMgfTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIHJlc3VsdHMpIHtcclxuICAgICAgICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09ICdmdWxmaWxsZWQnICYmIHJlc3VsdC52YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgbWFwLnNldChyZXN1bHQudmFsdWUuc2lkLCByZXN1bHQudmFsdWUucG9zaXRpb24pO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdC5zdGF0dXMgPT09ICdyZWplY3RlZCcpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignRmFpbGVkIHRvIGZldGNoIGEgc3dlZXAgcG9zaXRpb24sIHNraXBwaW5nIGl0OicsIHJlc3VsdC5yZWFzb24pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbWFwO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBBcHBsaWVzIHRoZSByaWdpZCB0cmFuc2Zvcm0gdG8gYSBQT0kgY29vcmRpbmF0ZSAocG9zaXRpb24gKyBvcmllbnRhdGlvbikuICovXHJcbiAgICBwcml2YXRlIGdldEFkanVzdGVkQ29vcmRpbmF0ZXMoY29vcmRpbmF0ZTogc3RyaW5nLCB0cmFuc2Zvcm06IFJpZ2lkVHJhbnNmb3JtKTogYW55IHtcclxuICAgICAgICBpZiAoY29vcmRpbmF0ZSA9PT0gXCJudWxsXCIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghY29vcmRpbmF0ZSB8fCB0eXBlb2YgY29vcmRpbmF0ZSAhPT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGNvb3JkaW5hdGU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKGNvb3JkaW5hdGUpO1xyXG4gICAgICAgIGNvbnN0IHJvdGF0ZWRQb3MgPSBhcHBseVJpZ2lkVHJhbnNmb3JtVG9Qb2ludChcclxuICAgICAgICAgICAgeyB4OiBwYXJzZWQueCwgeTogcGFyc2VkLnksIHo6IHBhcnNlZC56IH0sXHJcbiAgICAgICAgICAgIHRyYW5zZm9ybVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHg6IHJvdGF0ZWRQb3MueCxcclxuICAgICAgICAgICAgeTogcm90YXRlZFBvcy55LFxyXG4gICAgICAgICAgICB6OiByb3RhdGVkUG9zLnosXHJcbiAgICAgICAgICAgIHhSb3RhdGlvbjogcGFyc2VkLnhSb3RhdGlvbixcclxuICAgICAgICAgICAgeVJvdGF0aW9uOiBhcHBseVJpZ2lkVHJhbnNmb3JtVG9ZUm90YXRpb25EZWcocGFyc2VkLnlSb3RhdGlvbiwgdHJhbnNmb3JtKVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWFkcyBhIHN0b3JlZCBjb29yZGluYXRlIChKU09OIHN0cmluZyBvciBvYmplY3QsIHdoYXRldmVyIGl0cyBzcGFjaW5nKSBhcyBhIHBvc2l0aW9uLlxyXG4gICAgICogTnVsbCBmb3IgYSB2aXJ0dWFsIFBPSSBvciBhbiB1bnJlYWRhYmxlIHZhbHVlLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHBhcnNlQ29vcmRpbmF0ZSh2YWx1ZTogYW55KTogVmVjMyB8IG51bGwge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyBKU09OLnBhcnNlKHZhbHVlKSA6IHZhbHVlO1xyXG4gICAgICAgICAgICByZXR1cm4gcGFyc2VkICYmIHR5cGVvZiBwYXJzZWQueCA9PT0gJ251bWJlcidcclxuICAgICAgICAgICAgICAgID8geyB4OiBwYXJzZWQueCwgeTogcGFyc2VkLnksIHo6IHBhcnNlZC56IH1cclxuICAgICAgICAgICAgICAgIDogbnVsbDtcclxuICAgICAgICB9IGNhdGNoIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBUd28gcG9zaXRpb25zIHdpdGhpbiAxIGNtIGFyZSB0aGUgc2FtZSAodHdvIHZpcnR1YWwgUE9JcywgYm90aCBudWxsLCBhcmUgdG9vKS4gKi9cclxuICAgIHByaXZhdGUgaXNTYW1lUG9zaXRpb24oYTogVmVjMyB8IG51bGwsIGI6IFZlYzMgfCBudWxsLCB0b2xlcmFuY2VNID0gMC4wMSk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmICghYSB8fCAhYikge1xyXG4gICAgICAgICAgICByZXR1cm4gIWEgJiYgIWI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBkaXN0YW5jZShhLCBiKSA8PSB0b2xlcmFuY2VNO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQXBwbGllcyB0aGUgcmlnaWQgdHJhbnNmb3JtJ3MgdHJhbnNsYXRpb24rcm90YXRpb24gdG8gYSBwbGFpbiB7eCx5LHp9IHBvc2l0aW9uLFxyXG4gICAgICogV0lUSE9VVCBhZGRpbmcgeFJvdGF0aW9uL3lSb3RhdGlvbiBrZXlzLiBVc2VkIGZvciBtZWFzdXJlbWVudHMsIHdob3NlIHN0b3JlZFxyXG4gICAgICogY29vcmRpbmF0ZSBpcyBhIGJhcmUgcG9zaXRpb24gKG5vIG9yaWVudGF0aW9uKSwgdW5saWtlIG90aGVyIFBPSSB0eXBlcy5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBnZXRBZGp1c3RlZFBvc2l0aW9uT25seShjb29yZGluYXRlOiBzdHJpbmcsIHRyYW5zZm9ybTogUmlnaWRUcmFuc2Zvcm0pOiBhbnkge1xyXG4gICAgICAgIGlmICghY29vcmRpbmF0ZSB8fCB0eXBlb2YgY29vcmRpbmF0ZSAhPT0gJ3N0cmluZycgfHwgY29vcmRpbmF0ZSA9PT0gJ251bGwnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBjb29yZGluYXRlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKGNvb3JkaW5hdGUpO1xyXG4gICAgICAgIHJldHVybiBhcHBseVJpZ2lkVHJhbnNmb3JtVG9Qb2ludCh7IHg6IHBhcnNlZC54LCB5OiBwYXJzZWQueSwgejogcGFyc2VkLnogfSwgdHJhbnNmb3JtKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEZpbmRzIHRoZSBjbG9zZXN0IHRhcmdldCBzd2VlcCwgY29tcGFyaW5nIHBvc2l0aW9ucyBpbiB0aGUgU0FNRSBjb29yZGluYXRlIGZyYW1lLlxyXG4gICAgICogUHVyZSBpbi1tZW1vcnkgbG9va3VwIOKAlCBubyBuZXR3b3JrIGNhbGwsIHRoYW5rcyB0byB0aGUgcHJlLWJ1aWx0IHBvc2l0aW9uIG1hcHMuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZmluZENsb3Nlc3RUYXJnZXRTd2VlcElkKFxyXG4gICAgICAgIHNvdXJjZVN3ZWVwSUQ6IHN0cmluZyxcclxuICAgICAgICBzb3VyY2VOYXZQb3NpdGlvbnM6IE1hcDxzdHJpbmcsIFZlYzM+LFxyXG4gICAgICAgIHRhcmdldE5hdlBvc2l0aW9uczogTWFwPHN0cmluZywgVmVjMz4sXHJcbiAgICAgICAgdHJhbnNmb3JtOiBSaWdpZFRyYW5zZm9ybVxyXG4gICAgKTogc3RyaW5nIHwgbnVsbCB7XHJcbiAgICAgICAgaWYgKCFzb3VyY2VTd2VlcElEKSByZXR1cm4gbnVsbDtcclxuXHJcbiAgICAgICAgY29uc3Qgc291cmNlUG9zID0gc291cmNlTmF2UG9zaXRpb25zLmdldChzb3VyY2VTd2VlcElEKTtcclxuICAgICAgICBpZiAoIXNvdXJjZVBvcykgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgICAgIGNvbnN0IHNvdXJjZVBvc0luVGFyZ2V0RnJhbWUgPSBhcHBseVJpZ2lkVHJhbnNmb3JtVG9Qb2ludChzb3VyY2VQb3MsIHRyYW5zZm9ybSk7XHJcblxyXG4gICAgICAgIGxldCBjbG9zZXN0U3dlZXBJRDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcbiAgICAgICAgbGV0IG1pbkRpc3RhbmNlID0gSW5maW5pdHk7XHJcblxyXG4gICAgICAgIGZvciAoY29uc3QgW3RhcmdldFN3ZWVwSWQsIHRhcmdldFBvc10gb2YgdGFyZ2V0TmF2UG9zaXRpb25zLmVudHJpZXMoKSkge1xyXG4gICAgICAgICAgICBjb25zdCBkeCA9IHRhcmdldFBvcy54IC0gc291cmNlUG9zSW5UYXJnZXRGcmFtZS54O1xyXG4gICAgICAgICAgICBjb25zdCBkeSA9IHRhcmdldFBvcy55IC0gc291cmNlUG9zSW5UYXJnZXRGcmFtZS55O1xyXG4gICAgICAgICAgICBjb25zdCBkeiA9IHRhcmdldFBvcy56IC0gc291cmNlUG9zSW5UYXJnZXRGcmFtZS56O1xyXG4gICAgICAgICAgICBjb25zdCBkaXN0ID0gTWF0aC5zcXJ0KGR4ICogZHggKyBkeSAqIGR5ICsgZHogKiBkeik7XHJcblxyXG4gICAgICAgICAgICBpZiAoZGlzdCA8IG1pbkRpc3RhbmNlKSB7XHJcbiAgICAgICAgICAgICAgICBtaW5EaXN0YW5jZSA9IGRpc3Q7XHJcbiAgICAgICAgICAgICAgICBjbG9zZXN0U3dlZXBJRCA9IHRhcmdldFN3ZWVwSWQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBjbG9zZXN0U3dlZXBJRDtcclxuICAgIH1cclxuXHJcbiAgICAvL1xyXG4gICAgLy8gLS0tLS0tLS0tLSBTMyBmaWxlIGR1cGxpY2F0aW9uIC0tLS0tLS0tLS1cclxuICAgIC8vXHJcblxyXG4gICAgLyoqIEdlbmVyYXRlcyBhIHNob3J0IHJhbmRvbSBpZCwgdXNlZCB0byBnaXZlIGVhY2ggY29waWVkIFMzIGZpbGUgYSBmcmVzaCwgY29sbGlzaW9uLXNhZmUga2V5LiAqL1xyXG4gICAgcHJpdmF0ZSBnZW5lcmF0ZVNob3J0SWQoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiwgMTApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQnVpbGRzIGEgbmV3IFMzIGtleSBmb3IgYSBjb3BpZWQgYXR0YWNobWVudCBhbmQgc2FuaXRpemVzIHRoZSBmaWxlbmFtZVxyXG4gICAgICogdG8gcHJldmVudCBBV1MgQW1wbGlmeSBTaWduYXR1cmVEb2VzTm90TWF0Y2ggZXJyb3JzLlxyXG4gICAgICogYGZvbGRlck92ZXJyaWRlYCByZS1ob21lcyB0aGUgY29weSBpbnRvIGFub3RoZXIgcHJlZml4IOKAlCB1c2VkIGZvciB0YWcgaWNvbnMsIHdoaWNoXHJcbiAgICAgKiBhcmUgc3RvcmVkIHBlciBzcGFjZSAoYGljb25zLXRhZ3MvPHNwYWNlSWQ+L2ApIGFuZCBtdXN0IGZvbGxvdyB0aGUgdGFyZ2V0IHNwYWNlLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGJ1aWxkQ29waWVkQXR0YWNobWVudEtleShzb3VyY2VBbm5leGU6IHN0cmluZywgZm9sZGVyT3ZlcnJpZGU6IHN0cmluZyB8IG51bGwgPSBudWxsKTogc3RyaW5nIHtcclxuICAgICAgICBjb25zdCBsYXN0U2xhc2ggPSBzb3VyY2VBbm5leGUubGFzdEluZGV4T2YoJy8nKTtcclxuICAgICAgICBjb25zdCBmb2xkZXIgPSBmb2xkZXJPdmVycmlkZSA/PyBzb3VyY2VBbm5leGUuc3Vic3RyaW5nKDAsIGxhc3RTbGFzaCArIDEpO1xyXG4gICAgICAgIGxldCBmaWxlbmFtZSA9IHNvdXJjZUFubmV4ZS5zdWJzdHJpbmcobGFzdFNsYXNoICsgMSk7XHJcblxyXG4gICAgICAgIC8vIFN0cmlwIGEgbGVhZGluZyBcIjw4IGhleCBjaGFycz5fXCIgaWQgcHJlZml4IGlmIHByZXNlbnRcclxuICAgICAgICBjb25zdCBwcmVmaXhNYXRjaCA9IGZpbGVuYW1lLm1hdGNoKC9eWzAtOWEtZkEtRi1dezh9XyguKykkLyk7XHJcbiAgICAgICAgaWYgKHByZWZpeE1hdGNoKSB7XHJcbiAgICAgICAgICAgIGZpbGVuYW1lID0gcHJlZml4TWF0Y2hbMV07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBTQU5JVElaQVRJT046IFJlcGxhY2Ugc3BhY2VzLCBwYXJlbnRoZXNlcywgYW5kIGFjY2VudHMgd2l0aCB1bmRlcnNjb3Jlc1xyXG4gICAgICAgIC8vIENydWNpYWwgdG8gcHJldmVudCBBbXBsaWZ5J3MgU3RvcmFnZS5jb3B5IGZyb20gZmFpbGluZyB0aGUgc2lnbmF0dXJlIGNhbGN1bGF0aW9uXHJcbiAgICAgICAgZmlsZW5hbWUgPSBmaWxlbmFtZS5yZXBsYWNlKC9bXmEtekEtWjAtOS5cXC1fXS9nLCAnXycpO1xyXG5cclxuICAgICAgICBjb25zdCBuZXdQcmVmaXggPSBgJHt0aGlzLmdlbmVyYXRlU2hvcnRJZCgpfV9gO1xyXG4gICAgICAgIHJldHVybiBgJHtmb2xkZXJ9JHtuZXdQcmVmaXh9JHtmaWxlbmFtZX1gO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRHVwbGljYXRlcyBhbiBTMyBvYmplY3QgaWYgYSBrZXkgaXMgcHJlc2VudC5cclxuICAgICAqIC0gSWYgdGhlIHNvdXJjZSBmaWxlIGlzIGdlbnVpbmVseSBtaXNzaW5nIGZyb20gUzMgKE5vU3VjaEtleSAvIG9ycGhhbmVkIERCIHJlZmVyZW5jZSksXHJcbiAgICAgKiAgIHRocm93cyBhIE1pc3NpbmdTM0ZpbGVFcnJvciBzbyB0aGUgY2FsbGVyIGNhbiBsb2cgYSBjbGVhciwgc3BlY2lmaWMgbWVzc2FnZSBhbmRcclxuICAgICAqICAgc2tpcCB0aGUgd2hvbGUgaXRlbSBlbnRpcmVseSwgcmF0aGVyIHRoYW4gY3JlYXRpbmcgYSByZWNvcmQgd2l0aCBhIGJyb2tlbiBmaWxlIGxpbmsuXHJcbiAgICAgKiAtIEFueSBvdGhlciBraW5kIG9mIGZhaWx1cmUgKHBlcm1pc3Npb25zLCBuZXR3b3JrLCBldGMuKSBzdGlsbCB0aHJvd3MgYSBnZW5lcmljIEVycm9yLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGFzeW5jIGNvcHlTM0tleUlmUHJlc2VudChcclxuICAgICAgICBrZXk6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsXHJcbiAgICAgICAgY29udGV4dExhYmVsOiBzdHJpbmcsXHJcbiAgICAgICAgZm9sZGVyT3ZlcnJpZGU6IHN0cmluZyB8IG51bGwgPSBudWxsXHJcbiAgICApOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcclxuICAgICAgICBpZiAoIWtleSkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qgc291cmNlS2V5ID0gdGhpcy5leHRyYWN0UzNLZXlGcm9tVmFsdWUoa2V5KTtcclxuICAgICAgICBjb25zdCBkZXN0S2V5ID0gdGhpcy5idWlsZENvcGllZEF0dGFjaG1lbnRLZXkoc291cmNlS2V5LCBmb2xkZXJPdmVycmlkZSk7XHJcblxyXG4gICAgICAgIC8vIExvZyB0aGUgc291cmNlIGtleSB0byBlbnN1cmUgaXQgbWF0Y2hlcyB0aGUgcmVhbCBTMyBvYmplY3QgcGF0aFxyXG4gICAgICAgIGNvbnNvbGUubG9nKGBbREVCVUddIEF0dGVtcHRpbmcgUzMgY29weSBmcm9tIHNvdXJjZTogXCIke3NvdXJjZUtleX1cIiB0byBkZXN0OiBcIiR7ZGVzdEtleX1cImApO1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjb25zdCBjb3BpZWQgPSBhd2FpdCBjb3B5RmlsZUluUzMoc291cmNlS2V5LCBkZXN0S2V5KTtcclxuICAgICAgICAgICAgaWYgKCFjb3BpZWQpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBNaXNzaW5nUzNGaWxlRXJyb3Ioc291cmNlS2V5LCBjb250ZXh0TGFiZWwpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBjb3BpZWQ7XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5pc01pc3NpbmdTM0ZpbGUoZXJyb3IpKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYFtNYXR0ZXJwb3J0VGFnQ29weVNlcnZpY2VdIE9ycGhhbmVkIFMzIHJlZmVyZW5jZSwgc2tpcHBpbmcgaXRlbTogXCIke3NvdXJjZUtleX1cIiAoJHtjb250ZXh0TGFiZWx9KWApO1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdTM0ZpbGVFcnJvcihzb3VyY2VLZXksIGNvbnRleHRMYWJlbCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIFN0b3JhZ2UuY29weSgpIGNhbm5vdCBoYW5kbGUgYSBrZXkgaG9sZGluZyBhIHNwYWNlLCBhbiBhY2NlbnQgb3IgYSBwYXJlbnRoZXNpczpcclxuICAgICAgICAgICAgLy8gaXQgcHV0cyB0aGUga2V5IHVuZW5jb2RlZCBpbnRvIGB4LWFtei1jb3B5LXNvdXJjZWAsIHdoaWNoIHRoZW4gZGlzYWdyZWVzIHdpdGggdGhlXHJcbiAgICAgICAgICAgIC8vIHNpZ25lZCByZXF1ZXN0LiBUaG9zZSBmaWxlcyBhcmUgcGVyZmVjdGx5IHJlYWRhYmxlIOKAlCBvbmx5IHRoYXQgaGVhZGVyIGlzIGJyb2tlbiDigJRcclxuICAgICAgICAgICAgLy8gc28gZmFsbCBiYWNrIHRvIGRvd25sb2FkaW5nIGFuZCByZS11cGxvYWRpbmcgdGhlbS5cclxuICAgICAgICAgICAgaWYgKHRoaXMuaXNTaWduYXR1cmVNaXNtYXRjaChlcnJvcikpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihgW01hdHRlcnBvcnRUYWdDb3B5U2VydmljZV0gU3RvcmFnZS5jb3B5KCkgc2lnbmF0dXJlIG1pc21hdGNoIG9uIFwiJHtzb3VyY2VLZXl9XCIsIGZhbGxpbmcgYmFjayB0byBkb3dubG9hZCArIHJlLXVwbG9hZC5gKTtcclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29waWVkID0gYXdhaXQgY29weUZpbGVJblMzVmlhRG93bmxvYWQoc291cmNlS2V5LCBkZXN0S2V5KTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWNvcGllZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWlzc2luZ1MzRmlsZUVycm9yKHNvdXJjZUtleSwgY29udGV4dExhYmVsKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvcGllZDtcclxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZhbGxiYWNrRXJyb3I6IGFueSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzTWlzc2luZ1MzRmlsZShmYWxsYmFja0Vycm9yKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWlzc2luZ1MzRmlsZUVycm9yKHNvdXJjZUtleSwgY29udGV4dExhYmVsKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZmFsbGJhY2tFcnJvcjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBUcnVlIHdoZW4gdGhlIGZhaWx1cmUgbWVhbnMgdGhlIHNvdXJjZSBvYmplY3Qgc2ltcGx5IGlzIG5vdCBvbiBTMyAob3JwaGFuZWQgcmVmZXJlbmNlKS4gKi9cclxuICAgIHByaXZhdGUgaXNNaXNzaW5nUzNGaWxlKGVycm9yOiBhbnkpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gZXJyb3IgaW5zdGFuY2VvZiBNaXNzaW5nUzNGaWxlRXJyb3JcclxuICAgICAgICAgICAgfHwgZXJyb3I/LmNvZGUgPT09ICdOb1N1Y2hLZXknXHJcbiAgICAgICAgICAgIHx8IGVycm9yPy5uYW1lID09PSAnTm9TdWNoS2V5J1xyXG4gICAgICAgICAgICB8fCAvTm9TdWNoS2V5fGRvZXMgbm90IGV4aXN0fE5vdEZvdW5kL2kudGVzdCh0b0Vycm9yTWVzc2FnZShlcnJvcikpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBUcnVlIHdoZW4gQXBwU3luYyByZWZ1c2VkIHRoZSBvcGVyYXRpb24gZm9yIGxhY2sgb2YgcGVybWlzc2lvbiwgYXMgb3Bwb3NlZCB0byBmYWlsaW5nIGl0LlxyXG4gICAgICogIE5vdGhpbmcgY2FuIGJlIHJldHJpZWQgb3Igd29ya2VkIGFyb3VuZCBjbGllbnQtc2lkZTogdGhlIGFjY291bnQgc2ltcGx5IGlzIG5vdCBhbGxvd2VkXHJcbiAgICAgKiAgdG8gd3JpdGUgdGhhdCBtb2RlbCwgd2hpY2ggaXMgYSBiYWNrZW5kIGF1dGhvcmlzYXRpb24gcnVsZSAoQGF1dGgpIHRvIGNoYW5nZS4gKi9cclxuICAgIHByaXZhdGUgaXNVbmF1dGhvcml6ZWQoZXJyb3I6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB0b0Vycm9yTWVzc2FnZShlcnJvcik7XHJcbiAgICAgICAgcmV0dXJuIGVycm9yPy5lcnJvclR5cGUgPT09ICdVbmF1dGhvcml6ZWQnXHJcbiAgICAgICAgICAgIHx8IC9VbmF1dGhvcml6ZWR8Tm90IEF1dGhvcml6ZWQgdG8gYWNjZXNzL2kudGVzdChtZXNzYWdlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogVHJ1ZSBmb3IgdGhlIFNpZ1Y0IG1pc21hdGNoIFN0b3JhZ2UuY29weSgpIHJhaXNlcyBvbiBrZXlzIHdpdGggc3BlY2lhbCBjaGFyYWN0ZXJzLiAqL1xyXG4gICAgcHJpdmF0ZSBpc1NpZ25hdHVyZU1pc21hdGNoKGVycm9yOiBhbnkpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gZXJyb3I/LmNvZGUgPT09ICdTaWduYXR1cmVEb2VzTm90TWF0Y2gnXHJcbiAgICAgICAgICAgIHx8IGVycm9yPy5uYW1lID09PSAnU2lnbmF0dXJlRG9lc05vdE1hdGNoJ1xyXG4gICAgICAgICAgICB8fCAvc2lnbmF0dXJlIHdlIGNhbGN1bGF0ZWQgZG9lcyBub3QgbWF0Y2h8U2lnbmF0dXJlRG9lc05vdE1hdGNoL2kudGVzdCh0b0Vycm9yTWVzc2FnZShlcnJvcikpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRHVwbGljYXRlcyB0aGUgZmlsZSByZWZlcmVuY2VkIGJ5IGEgUE9JJ3MgdGFnSWNvbiAoYSBKU09OIHN0cmluZyBzaGFwZWQgbGlrZVxyXG4gICAgICogeyBzcmMsIG9wYWNpdHkgfSwgcGVyIGZvcm0tZmVhdHVyZS5jb21wb25lbnQudHMpLlxyXG4gICAgICpcclxuICAgICAqIFR3byBiZWhhdmlvdXJzIG1hdHRlciBoZXJlOlxyXG4gICAgICogIC0gdGhlIGNvcHkgaXMgcmUtaG9tZWQgdW5kZXIgdGhlIFRBUkdFVCBzcGFjZSdzIGljb24gZm9sZGVyXHJcbiAgICAgKiAgICAoYGljb25zLXRhZ3MvPHRhcmdldFNwYWNlSWQ+L2AsIHRoZSBsYXlvdXQgZm9ybS1mZWF0dXJlLmNvbXBvbmVudC50cyB1cGxvYWRzIHRvKS5cclxuICAgICAqICAgIEtlZXBpbmcgdGhlIHNvdXJjZSBmb2xkZXIgcHJvZHVjZWQgYSB0YXJnZXQgc3BhY2Ugd2hvc2UgaWNvbnMgYWxsIGxpdmVkIHVuZGVyXHJcbiAgICAgKiAgICBhbm90aGVyIHNwYWNlJ3MgcHJlZml4LCBzbyBjbGVhbmluZyB1cCB0aGUgc291cmNlIHNwYWNlIGJyb2tlIHRoZSBjb3B5J3MgaWNvbnMuXHJcbiAgICAgKiAgLSBhIG1pc3NpbmcgaWNvbiBmaWxlIGlzIE5PVCBmYXRhbC4gSXQgdXNlZCB0byBidWJibGUgdXAgYXMgYSBNaXNzaW5nUzNGaWxlRXJyb3IgYW5kXHJcbiAgICAgKiAgICBhYm9ydCB0aGUgd2hvbGUgUE9JIOKAlCBsb3NpbmcgdGhlIHBhc3RpbGxlLCBpdHMgdGV4dCBhbmQgaXRzIG1lZGlhIGJlY2F1c2Ugb2YgYVxyXG4gICAgICogICAgZGVjb3JhdGl2ZSBmaWxlLiBUaGUgUE9JIGlzIG5vdyBjcmVhdGVkIHdpdGggdGhlIGljb24gcmVmZXJlbmNlIGRyb3BwZWQsIHdoaWNoXHJcbiAgICAgKiAgICByZW5kZXJzIHRoZSBtb2R1bGUncyBkZWZhdWx0IGljb24sIGFuZCBhIGxvZyBsaW5lIHJlcG9ydHMgaXQuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgYXN5bmMgZHVwbGljYXRlVGFnSWNvbih0YWdJY29uUmF3OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkPiB7XHJcbiAgICAgICAgaWYgKCF0YWdJY29uUmF3KSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0YWdJY29uUmF3ID8/IG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgcGFyc2VkOiBhbnk7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcGFyc2VkID0gSlNPTi5wYXJzZSh0YWdJY29uUmF3KTtcclxuICAgICAgICB9IGNhdGNoIHtcclxuICAgICAgICAgICAgLy8gTm90IEpTT04g4oCUIGxlYXZlIHVudG91Y2hlZCByYXRoZXIgdGhhbiBndWVzcy5cclxuICAgICAgICAgICAgcmV0dXJuIHRhZ0ljb25SYXc7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXBhcnNlZCB8fCB0eXBlb2YgcGFyc2VkICE9PSAnb2JqZWN0JyB8fCAhcGFyc2VkLnNyYykge1xyXG4gICAgICAgICAgICByZXR1cm4gdGFnSWNvblJhdztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHBhcnNlZC5zcmMgPSBhd2FpdCB0aGlzLmNvcHlTM0tleUlmUHJlc2VudChcclxuICAgICAgICAgICAgICAgIHBhcnNlZC5zcmMsICd0YWcgaWNvbicsIHRoaXMuYnVpbGRUYXJnZXRJY29uRm9sZGVyKClcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9IGNhdGNoIChpY29uRXJyb3IpIHtcclxuICAgICAgICAgICAgaWYgKCEoaWNvbkVycm9yIGluc3RhbmNlb2YgTWlzc2luZ1MzRmlsZUVycm9yKSkge1xyXG4gICAgICAgICAgICAgICAgLy8gQSByZWFsIGZhaWx1cmUgKHBlcm1pc3Npb25zLCBuZXR3b3JrLCAuLi4pIHN0aWxsIGFib3J0cyB0aGUgUE9JOiBpdCBtZWFuc1xyXG4gICAgICAgICAgICAgICAgLy8gdGhlIGNvcHkgY2Fubm90IGJlIHRydXN0ZWQsIHVubGlrZSBhIGZpbGUgdGhhdCBpcyBzaW1wbHkgYWxyZWFkeSBnb25lLlxyXG4gICAgICAgICAgICAgICAgdGhyb3cgaWNvbkVycm9yO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgW01hdHRlcnBvcnRUYWdDb3B5U2VydmljZV0gVGFnIGljb24gbWlzc2luZyBvbiBTMywgZmFsbGluZyBiYWNrIHRvIHRoZSBkZWZhdWx0IGljb246IFwiJHtpY29uRXJyb3Iuc291cmNlS2V5fVwiYCk7XHJcbiAgICAgICAgICAgIHRoaXMubG9nSXRlbUVycm9yKCd3YXJuaW5nVGFnSWNvbk1pc3NpbmcnLCB7IGZpbGU6IGljb25FcnJvci5zb3VyY2VLZXkgfSk7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBwYXJzZWQuc3JjO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHBhcnNlZCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEljb24gZm9sZGVyIG9mIHRoZSBzcGFjZSBiZWluZyBjb3BpZWQgaW50bywgbWF0Y2hpbmcgd2hhdCB0aGUgZmVhdHVyZSBmb3JtIHVwbG9hZHMgdG8uICovXHJcbiAgICBwcml2YXRlIGJ1aWxkVGFyZ2V0SWNvbkZvbGRlcigpOiBzdHJpbmcgfCBudWxsIHtcclxuICAgICAgICByZXR1cm4gdGhpcy50YXJnZXRTcGFjZUlkID8gYGljb25zLXRhZ3MvJHt0aGlzLnRhcmdldFNwYWNlSWR9L2AgOiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRXh0cmFjdHMgYW5kIG5vcm1hbGl6ZXMgdGhlIHJhdyBTMyBrZXkgZnJvbSBhIHN0b3JlZCB2YWx1ZSAod2hpY2ggbWF5IGJlIGEgZnVsbCBVUkxcclxuICAgICAqIG9yIGFscmVhZHkgYSByYXcga2V5KS5cclxuICAgICAqIElNUE9SVEFOVDogdGhpcyBtdXN0IHJldHVybiB0aGUgUkFXIChkZWNvZGVkLCBub24gVVJMLWVuY29kZWQpIGtleS4gQW1wbGlmeSdzXHJcbiAgICAgKiBTdG9yYWdlLmNvcHkoKSBhbHJlYWR5IGJ1aWxkcyBhbmQgZW5jb2RlcyB0aGUgJ3gtYW16LWNvcHktc291cmNlJyBoZWFkZXIgaW50ZXJuYWxseVxyXG4gICAgICogZnJvbSB0aGUga2V5IHdlIGdpdmUgaXQuIFByZS1lbmNvZGluZyBpdCBoZXJlIGNhdXNlZCBhIGRvdWJsZS1lbmNvZGluZyBidWcgKGUuZy4gYVxyXG4gICAgICogc3BhY2UgYmVjYW1lIFwiJTI1MjBcIiBpbnN0ZWFkIG9mIFwiJTIwXCIpLCBzbyBTdG9yYWdlLmNvcHkoKSBsb29rZWQgZm9yIGEga2V5IHRoYXQgbmV2ZXJcclxuICAgICAqIGV4aXN0ZWQgb24gUzMsIHJlc3VsdGluZyBpbiBhIE5vU3VjaEtleSBlcnJvci5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBleHRyYWN0UzNLZXlGcm9tVmFsdWUodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgICAgaWYgKCF2YWx1ZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gJyc7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgZXh0cmFjdGVkID0gdmFsdWU7XHJcblxyXG4gICAgICAgIC8vIDEuIEV4dHJhY3QgcGF0aCBmcm9tIFVSTCBhbmQgZHJvcCBxdWVyeSBwYXJhbXNcclxuICAgICAgICBpZiAodmFsdWUuc3RhcnRzV2l0aCgnaHR0cDovLycpIHx8IHZhbHVlLnN0YXJ0c1dpdGgoJ2h0dHBzOi8vJykpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwodmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgZXh0cmFjdGVkID0gZGVjb2RlVVJJQ29tcG9uZW50KHVybC5wYXRobmFtZSk7XHJcbiAgICAgICAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgICAgICAgICAgZXh0cmFjdGVkID0gdmFsdWUuc3BsaXQoJz8nKVswXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGV4dHJhY3RlZCA9IHZhbHVlLnNwbGl0KCc/JylbMF07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyAyLiBSZW1vdmUgbGVhZGluZyBzbGFzaFxyXG4gICAgICAgIGlmIChleHRyYWN0ZWQuc3RhcnRzV2l0aCgnLycpKSB7XHJcbiAgICAgICAgICAgIGV4dHJhY3RlZCA9IGV4dHJhY3RlZC5zdWJzdHJpbmcoMSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyAzLiBSZW1vdmUgJ3B1YmxpYy8nIHByZWZpeFxyXG4gICAgICAgIC8vIEFtcGxpZnkgcHJlcGVuZHMgdGhpcyBhdXRvbWF0aWNhbGx5OyB3ZSBtdXN0IHN0cmlwIGl0IGZyb20gdGhlIGlucHV0XHJcbiAgICAgICAgLy8gdG8gYXZvaWQgdGhlICdwdWJsaWMvcHVibGljLycgZG91YmxlLXByZWZpeCBpc3N1ZS5cclxuICAgICAgICBpZiAoZXh0cmFjdGVkLnN0YXJ0c1dpdGgoJ3B1YmxpYy8nKSkge1xyXG4gICAgICAgICAgICBleHRyYWN0ZWQgPSBleHRyYWN0ZWQuc3Vic3RyaW5nKCdwdWJsaWMvJy5sZW5ndGgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gUmV0dXJuIHRoZSByYXcga2V5IGFzLWlzIOKAlCBTdG9yYWdlLmNvcHkoKSB0YWtlcyBjYXJlIG9mIHByb3Blcmx5IGVuY29kaW5nIGl0XHJcbiAgICAgICAgLy8gZm9yIHRoZSBDb3B5U291cmNlIGhlYWRlci4gRG8gTk9UIHJlLWVuY29kZSBpdCBoZXJlLlxyXG4gICAgICAgIHJldHVybiBleHRyYWN0ZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBCb3RoIHRhZyBsaXN0cyBhIHJlY2FsaWJyYXRpb24gY2FuIG9mZmVyIGZvciBhIHRhcmdldCBzcGFjZSwgY29tcHV0ZWQgaW4gb25lIHBhc3MuIE9ubHlcclxuICAgICAqIHRoZSB0YXJnZXQgbG9jYXRpb24ncyBvd24gdGFncyBhcmUgZXZlciBsaXN0ZWQgKHNlZSBSZWNhbGlicmF0aW9uVGFnU2NvcGUpOyB0YWdzIHdob3NlXHJcbiAgICAgKiBlbGVtZW50IHdhcyBkZWxldGVkIOKAlCBvcnBoYW4gUE9JcyDigJQgbmV2ZXIgYXJlLlxyXG4gICAgICogIC0gYHNwYWNlYDogZXZlcnkgdGFnIG9mIHRoZSBsb2NhdGlvbiwgaW4gYW55IG9mIGl0cyB2aXNpdHM7XHJcbiAgICAgKiAgLSBgdmlzaXRgOiB0aGUgdGFncyBvZiB0aGUgbG9jYXRpb24gc2l0dGluZyBvbiB0aGUgc3dlZXBzIG9mIHRoZSBzZWxlY3RlZCB0YXJnZXQgdmlzaXRcclxuICAgICAqICAgIChgb3B0aW9ucy50YXJnZXROb2RlSWRgKTsgZW1wdHkgd2hlbiBubyB2aXNpdCBpcyBnaXZlbi5cclxuICAgICAqIFdpdGggYG9wdGlvbnMub25seVRhZ3NJblNvdXJjZWAgYW5kIGEgc291cmNlIG90aGVyIHRoYW4gdGhlIHRhcmdldCwgYm90aCBsaXN0cyBvbmx5IGtlZXBcclxuICAgICAqIHRoZSB0YWdzIHRoYXQgYWxzbyBleGlzdCBpbiB0aGUgc291cmNlIGxvY2F0aW9uIChzYW1lIGlkZW50aXR5IGFzIHRoZSBjb3B5J3MgZHVwbGljYXRlXHJcbiAgICAgKiBkZXRlY3Rpb24pOiB0eXBpY2FsbHkgdGhlIHRhZ3MgYW4gZWFybGllciBjb3B5IGJyb3VnaHQgb3Zlci5cclxuICAgICAqXHJcbiAgICAgKiBBIFBPSSBjYXJyaWVzIG5vIG5hbWUgb2YgaXRzIG93bjogZWFjaCB0YWcgZ2V0cyBgZWxlbWVudE5hbWVgLCB0aGUgbmFtZSBvZiB0aGUgZWxlbWVudFxyXG4gICAgICogaXQgcG9pbnRzIGF0ICh0aWNrZXQgdGl0bGUsIGVxdWlwbWVudCBuYW1lLCAuLi4pLlxyXG4gICAgICovXHJcbiAgICBhc3luYyBnZXRSZWNhbGlicmF0aW9uVGFnU2V0cyhcclxuICAgICAgICBzb3VyY2VTcGFjZUlkOiBzdHJpbmcsXHJcbiAgICAgICAgdGFyZ2V0U3BhY2VJZDogc3RyaW5nLFxyXG4gICAgICAgIG9wdGlvbnM6IFJlY2FsaWJyYXRpb25UYWdPcHRpb25zID0ge31cclxuICAgICk6IFByb21pc2U8UmVjYWxpYnJhdGlvblRhZ1NldHM+IHtcclxuICAgICAgICBpZiAoIXNvdXJjZVNwYWNlSWQgfHwgIXRhcmdldFNwYWNlSWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHsgc3BhY2U6IFtdLCB2aXNpdDogW10gfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZmlsdGVyQnlTb3VyY2UgPSAhIW9wdGlvbnMub25seVRhZ3NJblNvdXJjZSAmJiBzb3VyY2VTcGFjZUlkICE9PSB0YXJnZXRTcGFjZUlkO1xyXG4gICAgICAgIGNvbnN0IFt0YXJnZXRUYWdzLCBzb3VyY2VUYWdzXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcclxuICAgICAgICAgICAgdGhpcy5sb2FkTGl2ZVRhZ3NGb3JTcGFjZSh0YXJnZXRTcGFjZUlkLCBvcHRpb25zLnRhcmdldE5vZGVJZCksXHJcbiAgICAgICAgICAgIGZpbHRlckJ5U291cmNlID8gdGhpcy5sb2FkTGl2ZVRhZ3NGb3JTcGFjZShzb3VyY2VTcGFjZUlkKSA6IFByb21pc2UucmVzb2x2ZShudWxsKVxyXG4gICAgICAgIF0pO1xyXG5cclxuICAgICAgICBjb25zdCBzb3VyY2VLZXlzID0gc291cmNlVGFncyAmJiBuZXcgU2V0KHNvdXJjZVRhZ3MuZmlsdGVyKHRhZyA9PiB0YWcub3duZWRCeVNwYWNlKS5tYXAodGFnID0+IHRhZy5pZGVudGl0eSkpO1xyXG4gICAgICAgIGNvbnN0IG93blRhcmdldFRhZ3MgPSB0YXJnZXRUYWdzXHJcbiAgICAgICAgICAgIC5maWx0ZXIodGFnID0+IHRhZy5vd25lZEJ5U3BhY2UpXHJcbiAgICAgICAgICAgIC5maWx0ZXIodGFnID0+ICFzb3VyY2VLZXlzIHx8IHNvdXJjZUtleXMuaGFzKHRhZy5pZGVudGl0eSkpO1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHNwYWNlOiBvd25UYXJnZXRUYWdzLm1hcCh0YWcgPT4gdGFnLnBvaSksXHJcbiAgICAgICAgICAgIHZpc2l0OiBvd25UYXJnZXRUYWdzLmZpbHRlcih0YWcgPT4gdGFnLmluVmlzaXQpLm1hcCh0YWcgPT4gdGFnLnBvaSlcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2lnbmVkLCBkaXNwbGF5YWJsZSBVUkwgb2YgYSB0YWcncyBwaWN0dXJlIChgZWxlbWVudEltYWdlS2V5YCkuIE1lYW50IHRvIGJlIGNhbGxlZCBvblxyXG4gICAgICogZGVtYW5kIOKAlCB3aGVuIHRoZSB0YWcgaXMgcHJldmlld2VkIOKAlCByYXRoZXIgdGhhbiBmb3IgdGhlIHdob2xlIGxpc3QuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGdldFRhZ0ltYWdlVXJsKGltYWdlS2V5OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcclxuICAgICAgICBjb25zdCBrZXkgPSB0aGlzLmV4dHJhY3RTM0tleUZyb21WYWx1ZShpbWFnZUtleSk7XHJcbiAgICAgICAgcmV0dXJuIGtleSA/IGdldFNpZ25lZEZpbGUoa2V5KSA6IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBMb2FkcyB0aGUgUE9JcyBwbGFjZWQgb24gdGhlIHN3ZWVwcyBvZiBhIHNwYWNlIHdob3NlIGVsZW1lbnQgc3RpbGwgZXhpc3RzLCBlYWNoIHdpdGggYVxyXG4gICAgICogZGlzcGxheSBuYW1lLCBhbiBpZGVudGl0eSBrZXkgYW5kIHdoZXRoZXIgaXRzIGVsZW1lbnQgYmVsb25ncyB0byB0aGF0IHNwYWNlLiBUaGUga2V5XHJcbiAgICAgKiBmb2xsb3dzIHRoZSBzYW1lIHJ1bGVzIGFzIHRoZSBjb3B5J3MgZHVwbGljYXRlIGRldGVjdGlvbiAoZmluZEV4aXN0aW5nKSwgc28gYSB0YWcgYW5kIGl0c1xyXG4gICAgICogY29weSBpbiBhbm90aGVyIHNwYWNlIHNoYXJlIHRoZSBzYW1lIGtleS4gV2l0aCBhIHZpc2l0IG5vZGUsIGBpblZpc2l0YCB0ZWxscyB3aGV0aGVyIHRoZVxyXG4gICAgICogdGFnIHNpdHMgb24gb25lIG9mIHRoYXQgdmlzaXQncyBzd2VlcHMuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgYXN5bmMgbG9hZExpdmVUYWdzRm9yU3BhY2UoXHJcbiAgICAgICAgc3BhY2VJZDogc3RyaW5nLFxyXG4gICAgICAgIHZpc2l0Tm9kZUlkPzogc3RyaW5nIHwgbnVsbFxyXG4gICAgKTogUHJvbWlzZTx7IHBvaTogUmVjYWxpYnJhdGlvblRhZzsgaWRlbnRpdHk6IHN0cmluZzsgb3duZWRCeVNwYWNlOiBib29sZWFuOyBpblZpc2l0OiBib29sZWFuIH1bXT4ge1xyXG4gICAgICAgIGNvbnN0IFtwb2lzLCBlbGVtZW50cywgem9uZXNdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xyXG4gICAgICAgICAgICB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmdldEFsbG93ZWRTd2VlcHNJRHNGb3JVc2VySW5TcGFjZShzcGFjZUlkKVxyXG4gICAgICAgICAgICAgICAgLnRoZW4oc3dlZXBJZHMgPT4gdGhpcy5wb2lTZXJ2aWNlLmdldFBvaXNCeU1hdHRlcnBvcnRTd2VlcHMoc3dlZXBJZHMpKSxcclxuICAgICAgICAgICAgdGhpcy5nZXRUYWdFbGVtZW50c0ZvclNwYWNlKHNwYWNlSWQpLFxyXG4gICAgICAgICAgICB0aGlzLnpvbmVTZXJ2aWNlLmdldFpvbmVzQnlTcGFjZShzcGFjZUlkKS5jYXRjaChlcnJvciA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gbG9hZCB0aGUgem9uZXMgb2YgdGhlIHNwYWNlOicsIGVycm9yKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBbXSBhcyBhbnlbXTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICBdKTtcclxuICAgICAgICBjb25zdCBzd2VlcFpvbmVzID0gdGhpcy5nZXRTd2VlcFpvbmVzKHpvbmVzIHx8IFtdKTtcclxuICAgICAgICBjb25zdCB2aXNpdFN3ZWVwcyA9IHZpc2l0Tm9kZUlkID8gYXdhaXQgdGhpcy5nZXRTd2VlcHNPZlZpc2l0KHZpc2l0Tm9kZUlkLCB6b25lcyB8fCBbXSkgOiBuZXcgU2V0PHN0cmluZz4oKTtcclxuXHJcbiAgICAgICAgLy8gQSBQT0kgY2FuIHBvaW50IGF0IGFuIGVsZW1lbnQgc3RvcmVkIHVuZGVyIGFub3RoZXIgc3BhY2UgKGxlZnQgYmVoaW5kIGJ5IGFuIGVhcmxpZXJcclxuICAgICAgICAvLyBjb3B5KTogdGhvc2UgYXJlIG5vdCBpbiB0aGUgc3BhY2Utd2lkZSBsaXN0cyBhbmQgYXJlIGZldGNoZWQgYnkgSUQuXHJcbiAgICAgICAgY29uc3QgdW5yZXNvbHZlZCA9IChwb2lzIHx8IFtdKS5maWx0ZXIocG9pID0+IHBvaT8uZWxlbWVudElEICYmICFlbGVtZW50cy5oYXMocG9pLmVsZW1lbnRJRCkpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuZmV0Y2hUYWdFbGVtZW50c0J5SWQodW5yZXNvbHZlZCwgZWxlbWVudHMpO1xyXG5cclxuICAgICAgICBjb25zdCByZXN1bHQ6IHsgcG9pOiBSZWNhbGlicmF0aW9uVGFnOyBpZGVudGl0eTogc3RyaW5nOyBvd25lZEJ5U3BhY2U6IGJvb2xlYW47IGluVmlzaXQ6IGJvb2xlYW4gfVtdID0gW107XHJcbiAgICAgICAgZm9yIChjb25zdCBwb2kgb2YgcG9pcyB8fCBbXSkge1xyXG4gICAgICAgICAgICBpZiAoIXBvaSkge1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGV0IGVsZW1lbnQ6IFRhZ0VsZW1lbnQgfCB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIGlmIChwb2kuZWxlbWVudElEKSB7XHJcbiAgICAgICAgICAgICAgICBlbGVtZW50ID0gZWxlbWVudHMuZ2V0KHBvaS5lbGVtZW50SUQpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFlbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8vIG9ycGhhbjogdGhlIGVsZW1lbnQgd2FzIGRlbGV0ZWQgKG9yIGNhbm5vdCBiZSByZWFkKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gc3RhbmRhbG9uZSB0YWc6IGl0cyBkZXNjcmlwdGlvbiBpcyBhbGwgdGhhdCBpZGVudGlmaWVzIGl0XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkZXNjcmlwdGlvbiA9IHRoaXMuc3RyaXBIdG1sKHBvaS50YWdEZXNjcmlwdGlvbik7XHJcbiAgICAgICAgICAgICAgICBlbGVtZW50ID0geyBuYW1lOiBkZXNjcmlwdGlvbiwgaWRlbnRpdHk6IFtkZXNjcmlwdGlvbl0gfTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCB6b25lcyA9IHN3ZWVwWm9uZXMuZ2V0KHBvaS5tYXR0ZXJwb3J0U3dlZXBJRCBhcyBzdHJpbmcpO1xyXG4gICAgICAgICAgICByZXN1bHQucHVzaCh7XHJcbiAgICAgICAgICAgICAgICBwb2k6IHtcclxuICAgICAgICAgICAgICAgICAgICAuLi5wb2ksXHJcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudE5hbWU6IGVsZW1lbnQubmFtZSxcclxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50RGVzY3JpcHRpb246IGVsZW1lbnQuZGVzY3JpcHRpb24sXHJcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudEltYWdlS2V5OiBlbGVtZW50LmltYWdlS2V5LFxyXG4gICAgICAgICAgICAgICAgICAgIGZsb29yTmFtZTogem9uZXM/LmZsb29yLFxyXG4gICAgICAgICAgICAgICAgICAgIHpvbmVOYW1lOiB6b25lcz8uem9uZVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGlkZW50aXR5OiB0aGlzLmlkZW50aXR5S2V5KFtwb2kudHlwZSwgLi4uZWxlbWVudC5pZGVudGl0eV0pLFxyXG4gICAgICAgICAgICAgICAgLy8gZGVjaWRlZCBieSB0aGUgZWxlbWVudCdzIG93biBzcGFjZUlEIHJhdGhlciB0aGFuIGJ5IGl0cyBwcmVzZW5jZSBpbiB0aGVcclxuICAgICAgICAgICAgICAgIC8vIHNwYWNlLXdpZGUgbGlzdHMsIHNvbWUgb2Ygd2hpY2ggYXJlIG5vdCBwYWdpbmF0ZWQuIEEgc3RhbmRhbG9uZSB0YWcgaGFzIG5vXHJcbiAgICAgICAgICAgICAgICAvLyBlbGVtZW50IHRvIHRlbGw6IGl0IGJlbG9uZ3MgdG8gZXZlcnkgc3BhY2UgdGhhdCBzaG93cyBpdC5cclxuICAgICAgICAgICAgICAgIG93bmVkQnlTcGFjZTogIXBvaS5lbGVtZW50SUQgfHwgZWxlbWVudC5zcGFjZUlkID09PSBzcGFjZUlkLFxyXG4gICAgICAgICAgICAgICAgaW5WaXNpdDogdmlzaXRTd2VlcHMuaGFzKHBvaS5tYXR0ZXJwb3J0U3dlZXBJRCBhcyBzdHJpbmcpXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3dlZXBzIG9mIGEgdmlydHVhbCB2aXNpdCAoYSBOb2RlKTogdGhvc2Ugb2YgdGhlIHNwYWNlJ3Mgem9uZXMgYXR0YWNoZWQgdG8gdGhhdCBub2RlLFxyXG4gICAgICogZWxzZSDigJQgem9uZXMgbm90IGZpbGxlZCBpbiBmb3IgdGhpcyB2aXNpdCDigJQgdGhlIHN3ZWVwcyBvZiB0aGUgbm9kZSdzIG5hdmlnYXRpb25zLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGFzeW5jIGdldFN3ZWVwc09mVmlzaXQobm9kZUlkOiBzdHJpbmcsIHpvbmVzOiBhbnlbXSk6IFByb21pc2U8U2V0PHN0cmluZz4+IHtcclxuICAgICAgICBjb25zdCBzd2VlcHMgPSBuZXcgU2V0PHN0cmluZz4oem9uZXNcclxuICAgICAgICAgICAgLmZpbHRlcih6b25lID0+IHpvbmUubm9kZUlEcz8uaW5jbHVkZXMobm9kZUlkKSlcclxuICAgICAgICAgICAgLmZsYXRNYXAoem9uZSA9PiB6b25lLnN3ZWVwSURzIHx8IFtdKSk7XHJcbiAgICAgICAgaWYgKHN3ZWVwcy5zaXplID09PSAwKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBuYXZpZ2F0aW9ucyA9IGF3YWl0IHRoaXMubmF2aWdhdGlvblNlcnZpY2UuZ2V0TmF2aWdhdGlvbnNGb3JOb2RlKG5vZGVJZCk7XHJcbiAgICAgICAgICAgICAgICBuYXZpZ2F0aW9ucy5mb3JFYWNoKG5hdmlnYXRpb24gPT4gbmF2aWdhdGlvbi5tYXR0ZXJwb3J0U3dlZXBJRCAmJiBzd2VlcHMuYWRkKG5hdmlnYXRpb24ubWF0dGVycG9ydFN3ZWVwSUQpKTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBsb2FkIHRoZSBzd2VlcHMgb2YgdGhlIHZpc2l0OicsIGVycm9yKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gc3dlZXBzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWFwcyBlYWNoIHN3ZWVwIG9mIGEgc3BhY2UgdG8gdGhlIG5hbWVzIG9mIGl0cyBmbG9vciAoem9uZSBvZiBsYXllciBGTE9PUikgYW5kIG9mIGl0c1xyXG4gICAgICogbW9zdCBzcGVjaWZpYyBvdGhlciB6b25lICh0aGUgb25lIGhvbGRpbmcgdGhlIGZld2VzdCBzd2VlcHMsIHR5cGljYWxseSBhIHJvb20sIGVsc2UgdGhlXHJcbiAgICAgKiB2aXNpdCdzIEJVSUxESU5HIHpvbmUpLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGdldFN3ZWVwWm9uZXMoem9uZXM6IGFueVtdKTogTWFwPHN0cmluZywgeyBmbG9vcj86IHN0cmluZzsgem9uZT86IHN0cmluZyB9PiB7XHJcbiAgICAgICAgY29uc3QgYnlTd2VlcCA9IG5ldyBNYXA8c3RyaW5nLCB7IGZsb29yPzogc3RyaW5nOyB6b25lPzogc3RyaW5nIH0+KCk7XHJcbiAgICAgICAgY29uc3QgaXNGbG9vciA9ICh6b25lOiBhbnkpID0+ICh6b25lLmxheWVyPy5uYW1lIHx8ICcnKS5pbmNsdWRlcygnRkxPT1InKTtcclxuICAgICAgICBjb25zdCB6b25lUmFuayA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7IC8vIHN3ZWVwIC0+IHN3ZWVwIGNvdW50IG9mIHRoZSB6b25lIGtlcHQgc28gZmFyXHJcbiAgICAgICAgZm9yIChjb25zdCB6b25lIG9mIHpvbmVzKSB7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc3dlZXBJZCBvZiB6b25lLnN3ZWVwSURzIHx8IFtdKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBlbnRyeSA9IGJ5U3dlZXAuZ2V0KHN3ZWVwSWQpIHx8IHt9O1xyXG4gICAgICAgICAgICAgICAgaWYgKGlzRmxvb3Ioem9uZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBlbnRyeS5mbG9vciA9IGVudHJ5LmZsb29yIHx8IHpvbmUubmFtZTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZSA9IHpvbmUuc3dlZXBJRHMubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghem9uZVJhbmsuaGFzKHN3ZWVwSWQpIHx8IHNpemUgPCAoem9uZVJhbmsuZ2V0KHN3ZWVwSWQpIGFzIG51bWJlcikpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgem9uZVJhbmsuc2V0KHN3ZWVwSWQsIHNpemUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS56b25lID0gem9uZS5uYW1lO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJ5U3dlZXAuc2V0KHN3ZWVwSWQsIGVudHJ5KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gYnlTd2VlcDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEluZGV4ZXMsIGJ5IElELCBldmVyeSBlbGVtZW50IG9mIGEgc3BhY2UgYSBQT0kgY2FuIHBvaW50IGF0LiBFYWNoIGxpc3QgaXMgZmV0Y2hlZFxyXG4gICAgICogaW5kZXBlbmRlbnRseTogb25lIGZhaWxpbmcgKG1vZHVsZSBub3QgZW5hYmxlZCwgbWlzc2luZyBwZXJtaXNzaW9uKSBtdXN0IG5vdCBoaWRlIHRoZVxyXG4gICAgICogb3RoZXJzIOKAlCB0aGVpciBQT0lzIGFyZSB0aGVuIHJlc29sdmVkIG9uZSBieSBvbmUgYnkgZmV0Y2hUYWdFbGVtZW50c0J5SWQoKS5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBhc3luYyBnZXRUYWdFbGVtZW50c0ZvclNwYWNlKHNwYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8TWFwPHN0cmluZywgVGFnRWxlbWVudD4+IHtcclxuICAgICAgICBjb25zdCBlbGVtZW50cyA9IG5ldyBNYXA8c3RyaW5nLCBUYWdFbGVtZW50PigpO1xyXG4gICAgICAgIGNvbnN0IFt0aWNrZXRzLCBlcXVpcG1lbnRzLCBvYmplY3RzM0QsIGZlYXR1cmVzLCBjb21tZW50c10gPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoW1xyXG4gICAgICAgICAgICB0aGlzLnRpY2tldFNlcnZpY2UuZ2V0VGlja2V0c0J5U3BhY2Uoc3BhY2VJZCksXHJcbiAgICAgICAgICAgIHRoaXMuZXF1aXBtZW50U2VydmljZS5nZXRFcXVpcG1lbnRzRm9yU3BhY2Uoc3BhY2VJZCksXHJcbiAgICAgICAgICAgIHRoaXMub2JqZWN0M0RTZXJ2aWNlLmdldE9iamVjdHMzREJ5U3BhY2Uoc3BhY2VJZCksXHJcbiAgICAgICAgICAgIHRoaXMuZmVhdHVyZVNlcnZpY2UuZ2V0QWxsRmVhdHVyZXNCeVNwYWNlUmF3KHNwYWNlSWQpLFxyXG4gICAgICAgICAgICAvLyBhIG1lYXN1cmVtZW50IFBPSSBpcyBib3VuZCB0byB0aGUgbWVhc3VyZW1lbnQncyBDb21tZW50LCBub3QgdG8gdGhlIG1lYXN1cmVtZW50XHJcbiAgICAgICAgICAgIHRoaXMuY29tbWVudFNlcnZpY2UuZ2V0Q29tbWVudHNCeVNwYWNlSUQoc3BhY2VJZClcclxuICAgICAgICBdKTtcclxuXHJcbiAgICAgICAgY29uc3QgaW5kZXggPSAoc2V0dGxlZDogUHJvbWlzZVNldHRsZWRSZXN1bHQ8YW55W10+LCB0eXBlOiBUYWdFbGVtZW50VHlwZSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoc2V0dGxlZC5zdGF0dXMgPT09ICdmdWxmaWxsZWQnKSB7XHJcbiAgICAgICAgICAgICAgICBzZXR0bGVkLnZhbHVlPy5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpdGVtPy5pZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50cy5zZXQoaXRlbS5pZCwgdGhpcy50b1RhZ0VsZW1lbnQodHlwZSwgeyBzcGFjZUlEOiBzcGFjZUlkLCAuLi5pdGVtIH0pKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgaW5kZXgodGlja2V0cywgJ3RpY2tldCcpO1xyXG4gICAgICAgIGluZGV4KGVxdWlwbWVudHMsICdlcXVpcG1lbnQnKTtcclxuICAgICAgICBpbmRleChvYmplY3RzM0QsICdvYmplY3QzRCcpO1xyXG4gICAgICAgIGluZGV4KGZlYXR1cmVzLCAnZmVhdHVyZScpO1xyXG4gICAgICAgIGluZGV4KGNvbW1lbnRzLCAnY29tbWVudCcpO1xyXG4gICAgICAgIHJldHVybiBlbGVtZW50cztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEZldGNoZXMgYnkgSUQgdGhlIGVsZW1lbnRzIHRoZSBzcGFjZS13aWRlIGxpc3RzIGRpZCBub3QgcmV0dXJuLiBUaGUgSURzIGFyZSBwYWNrZWQgaW50b1xyXG4gICAgICogYSBmZXcgR3JhcGhRTCByZXF1ZXN0cyB1c2luZyBhbGlhc2VzIChgZTA6IGdldFRpY2tldChpZDogLi4uKSBlMTogZ2V0RXF1aXBtZW50KC4uLilgKSxcclxuICAgICAqIGluc3RlYWQgb2Ygb25lIHJlcXVlc3QgcGVyIGVsZW1lbnQ6IGEgc3BhY2UgY2FuIGhvbGQgb3ZlciBhIHRob3VzYW5kIG9ycGhhbiBQT0lzLlxyXG4gICAgICogQW4gZWxlbWVudCB0aGF0IG5vIGxvbmdlciBleGlzdHMgY29tZXMgYmFjayBhcyBudWxsIGFuZCBpcyBzaW1wbHkgbm90IGluZGV4ZWQuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgYXN5bmMgZmV0Y2hUYWdFbGVtZW50c0J5SWQocG9pczogUE9JW10sIGVsZW1lbnRzOiBNYXA8c3RyaW5nLCBUYWdFbGVtZW50Pik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIGNvbnN0IElEU19QRVJfUkVRVUVTVCA9IDEwMDtcclxuICAgICAgICBjb25zdCBxdWVyaWVzOiBSZWNvcmQ8VGFnRWxlbWVudFR5cGUsIHN0cmluZz4gPSB7XHJcbiAgICAgICAgICAgIHRpY2tldDogJ2dldFRpY2tldChpZDogJElEKSB7IGlkIHNwYWNlSUQgdGl0bGUgZGVzY3JpcHRpb24gfScsXHJcbiAgICAgICAgICAgIGVxdWlwbWVudDogJ2dldEVxdWlwbWVudChpZDogJElEKSB7IGlkIHNwYWNlSUQgbmFtZSBzZXJpYWxOdW1iZXIgfScsXHJcbiAgICAgICAgICAgIG9iamVjdDNEOiAnZ2V0T2JqZWN0M0QoaWQ6ICRJRCkgeyBpZCBzcGFjZUlEIG5hbWUgZGVzY3JpcHRpb24gfScsXHJcbiAgICAgICAgICAgIGNvbW1lbnQ6ICdnZXRDb21tZW50KGlkOiAkSUQpIHsgaWQgc3BhY2VJRCB0aXRsZSBkZXNjcmlwdGlvbiBhbm5leGUgfScsXHJcbiAgICAgICAgICAgIGZlYXR1cmU6ICdnZXRGZWF0dXJlKGlkOiAkSUQpIHsgaWQgc3BhY2VJRCB0aXRsZSBkZXNjcmlwdGlvbiB9J1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGNvbnN0IHBlbmRpbmcgPSBuZXcgTWFwPHN0cmluZywgVGFnRWxlbWVudFR5cGU+KCk7XHJcbiAgICAgICAgZm9yIChjb25zdCBwb2kgb2YgcG9pcykge1xyXG4gICAgICAgICAgICBwZW5kaW5nLnNldChwb2kuZWxlbWVudElEIGFzIHN0cmluZywgdGhpcy50YWdFbGVtZW50VHlwZU9mKHBvaS50eXBlKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGVudHJpZXMgPSBbLi4ucGVuZGluZy5lbnRyaWVzKCldO1xyXG4gICAgICAgIGNvbnN0IGJhdGNoZXM6IFtzdHJpbmcsIFRhZ0VsZW1lbnRUeXBlXVtdW10gPSBbXTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpICs9IElEU19QRVJfUkVRVUVTVCkge1xyXG4gICAgICAgICAgICBiYXRjaGVzLnB1c2goZW50cmllcy5zbGljZShpLCBpICsgSURTX1BFUl9SRVFVRVNUKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChiYXRjaGVzLm1hcChhc3luYyBiYXRjaCA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGZpZWxkcyA9IGJhdGNoLm1hcCgoW2lkLCB0eXBlXSwgaSkgPT5cclxuICAgICAgICAgICAgICAgIGBlJHtpfTogJHtxdWVyaWVzW3R5cGVdLnJlcGxhY2UoJyRJRCcsIEpTT04uc3RyaW5naWZ5KGlkKSl9YCk7XHJcbiAgICAgICAgICAgIGxldCBkYXRhOiBhbnk7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBkYXRhID0gKChhd2FpdCBBUEkuZ3JhcGhxbChncmFwaHFsT3BlcmF0aW9uKGBxdWVyeSBUYWdFbGVtZW50cyB7ICR7ZmllbGRzLmpvaW4oJ1xcbicpfSB9YCkpKSBhcyBhbnkpLmRhdGE7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcclxuICAgICAgICAgICAgICAgIC8vIEFtcGxpZnkgcmVqZWN0cyB3aGVuIEFOWSBhbGlhcyBlcnJvcnMgKGUuZy4gYW4gdW5yZWFkYWJsZSByZWNvcmQpLCBidXQgc3RpbGxcclxuICAgICAgICAgICAgICAgIC8vIGhhbmRzIG92ZXIgdGhlIGRhdGEgb2YgdGhlIGFsaWFzZXMgdGhhdCBzdWNjZWVkZWQuXHJcbiAgICAgICAgICAgICAgICBkYXRhID0gZXJyb3I/LmRhdGE7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWRhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gZmV0Y2ggdGFnIGVsZW1lbnRzIGJ5IElEOicsIGVycm9yKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYmF0Y2guZm9yRWFjaCgoW2lkLCB0eXBlXSwgaSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IGRhdGFbYGUke2l9YF07XHJcbiAgICAgICAgICAgICAgICBpZiAoaXRlbSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzLnNldChpZCwgdGhpcy50b1RhZ0VsZW1lbnQodHlwZSwgaXRlbSkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNb3ZlcyBhIHN0b3JlZCBjb29yZGluYXRlLiBPbmx5IHRoZSBwb3NpdGlvbiBhbmQgdGhlIGhvcml6b250YWwgb3JpZW50YXRpb24gY2hhbmdlOlxyXG4gICAgICogZXZlcnkgb3RoZXIga2V5IGlzIGtlcHQgYXMgaXMuIEEgY29vcmRpbmF0ZSBvZnRlbiBjYXJyaWVzIHRoZSB0YWcncyBvcmllbnRhdGlvbiBuZXh0IHRvXHJcbiAgICAgKiBpdHMgcG9zaXRpb24gKHt4LCB5LCB6LCB4Um90YXRpb24sIHlSb3RhdGlvbn0pOyByZWJ1aWxkaW5nIGl0IGZyb20gdGhlIHBvc2l0aW9uIGFsb25lXHJcbiAgICAgKiBzaWxlbnRseSBlcmFzZWQgdGhhdCBvcmllbnRhdGlvbi5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBnZXRSZWNhbGlicmF0ZWRDb29yZGluYXRlKGNvb3JkaW5hdGU6IGFueSwgdHJhbnNmb3JtOiBSaWdpZFRyYW5zZm9ybSk6IGFueSB7XHJcbiAgICAgICAgY29uc3QgcG9zaXRpb24gPSBhcHBseVJpZ2lkVHJhbnNmb3JtVG9Qb2ludChcclxuICAgICAgICAgICAgeyB4OiBjb29yZGluYXRlLngsIHk6IGNvb3JkaW5hdGUueSwgejogY29vcmRpbmF0ZS56IH0sIHRyYW5zZm9ybSk7XHJcbiAgICAgICAgY29uc3QgbW92ZWQ6IGFueSA9IHsgLi4uY29vcmRpbmF0ZSwgeDogcG9zaXRpb24ueCwgeTogcG9zaXRpb24ueSwgejogcG9zaXRpb24ueiB9O1xyXG4gICAgICAgIGlmICgneVJvdGF0aW9uJyBpbiBjb29yZGluYXRlKSB7XHJcbiAgICAgICAgICAgIG1vdmVkLnlSb3RhdGlvbiA9IGFwcGx5UmlnaWRUcmFuc2Zvcm1Ub1lSb3RhdGlvbkRlZyhjb29yZGluYXRlLnlSb3RhdGlvbiwgdHJhbnNmb3JtKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG1vdmVkO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVhZHMgUE9JcyBieSBJRCwgMTAwIHBlciBHcmFwaFFMIHJlcXVlc3QgKGFsaWFzZXMpLiBNaXNzaW5nIFBPSXMgYXJlIHNraXBwZWQuIEFtcGxpZnlcclxuICAgICAqIHJlamVjdHMgYSByZXF1ZXN0IHdoZW4gQU5ZIGFsaWFzIGVycm9ycywgYnV0IHN0aWxsIGhhbmRzIG92ZXIgdGhlIGRhdGEgb2YgdGhlIG90aGVyczpcclxuICAgICAqIHRob3NlIGFyZSBrZXB0LCBzbyBvbmUgdW5yZWFkYWJsZSBQT0kgZG9lcyBub3QgaGlkZSB0aGUgOTkgb3RoZXJzIG9mIGl0cyBiYXRjaC5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBhc3luYyBmZXRjaFBvaXNCeUlkKGlkczogc3RyaW5nW10pOiBQcm9taXNlPFBPSVtdPiB7XHJcbiAgICAgICAgY29uc3QgSURTX1BFUl9SRVFVRVNUID0gMTAwO1xyXG4gICAgICAgIGNvbnN0IHVuaXF1ZUlkcyA9IFsuLi5uZXcgU2V0KGlkcyldO1xyXG4gICAgICAgIGNvbnN0IGJhdGNoZXM6IHN0cmluZ1tdW10gPSBbXTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHVuaXF1ZUlkcy5sZW5ndGg7IGkgKz0gSURTX1BFUl9SRVFVRVNUKSB7XHJcbiAgICAgICAgICAgIGJhdGNoZXMucHVzaCh1bmlxdWVJZHMuc2xpY2UoaSwgaSArIElEU19QRVJfUkVRVUVTVCkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKGJhdGNoZXMubWFwKGFzeW5jIGJhdGNoID0+IHtcclxuICAgICAgICAgICAgY29uc3QgZmllbGRzID0gYmF0Y2gubWFwKChpZCwgaSkgPT4gYHAke2l9OiBnZXRQT0koaWQ6ICR7SlNPTi5zdHJpbmdpZnkoaWQpfSkgeyBpZCBjb29yZGluYXRlIG1ldGFkYXRhIH1gKTtcclxuICAgICAgICAgICAgbGV0IGRhdGE6IGFueTtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGRhdGEgPSAoKGF3YWl0IEFQSS5ncmFwaHFsKGdyYXBocWxPcGVyYXRpb24oYHF1ZXJ5IFNlbGVjdGVkUG9pcyB7ICR7ZmllbGRzLmpvaW4oJ1xcbicpfSB9YCkpKSBhcyBhbnkpLmRhdGE7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcclxuICAgICAgICAgICAgICAgIGRhdGEgPSBlcnJvcj8uZGF0YTtcclxuICAgICAgICAgICAgICAgIGlmICghZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byByZWFkIHRoZSBzZWxlY3RlZCBQT0lzOicsIGVycm9yKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW107XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGJhdGNoLm1hcCgoXywgaSkgPT4gZGF0YVtgcCR7aX1gXSBhcyBQT0kpLmZpbHRlcihwb2kgPT4gISFwb2kpO1xyXG4gICAgICAgIH0pKTtcclxuICAgICAgICByZXR1cm4gcmVzdWx0cy5mbGF0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB0YWdFbGVtZW50VHlwZU9mKHBvaVR5cGU6IFBvaVR5cGUgfCBudWxsIHwgdW5kZWZpbmVkKTogVGFnRWxlbWVudFR5cGUge1xyXG4gICAgICAgIHN3aXRjaCAocG9pVHlwZSkge1xyXG4gICAgICAgICAgICBjYXNlIFBvaVR5cGUuVElDS0VUOiByZXR1cm4gJ3RpY2tldCc7XHJcbiAgICAgICAgICAgIGNhc2UgUG9pVHlwZS5FUVVJUE1FTlQ6IHJldHVybiAnZXF1aXBtZW50JztcclxuICAgICAgICAgICAgY2FzZSBQb2lUeXBlLk9CSkVDVDNEOiByZXR1cm4gJ29iamVjdDNEJztcclxuICAgICAgICAgICAgY2FzZSBQb2lUeXBlLk1FQVNVUkU6IHJldHVybiAnY29tbWVudCc7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6IHJldHVybiAnZmVhdHVyZSc7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBEaXNwbGF5IG5hbWUgKyBpZGVudGl0eSBmaWVsZHMgb2YgYW4gZWxlbWVudCwgcGVyIHRoZSBjb3B5J3MgZHVwbGljYXRlLWRldGVjdGlvbiBydWxlcy4gKi9cclxuICAgIHByaXZhdGUgdG9UYWdFbGVtZW50KHR5cGU6IFRhZ0VsZW1lbnRUeXBlLCBpdGVtOiBhbnkpOiBUYWdFbGVtZW50IHtcclxuICAgICAgICBjb25zdCBzcGFjZUlkID0gaXRlbS5zcGFjZUlEO1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSAodmFsdWU6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpID0+IHRoaXMuc3RyaXBIdG1sKHZhbHVlKSB8fCB1bmRlZmluZWQ7XHJcbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgJ2VxdWlwbWVudCc6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyBuYW1lOiBpdGVtLm5hbWUgfHwgJycsIGlkZW50aXR5OiBbaXRlbS5uYW1lLCBpdGVtLnNlcmlhbE51bWJlcl0sIHNwYWNlSWQsIGRlc2NyaXB0aW9uOiB0ZXh0KGl0ZW0uZGVzY3JpcHRpb24pIH07XHJcbiAgICAgICAgICAgIGNhc2UgJ29iamVjdDNEJzpcclxuICAgICAgICAgICAgICAgIHJldHVybiB7IG5hbWU6IGl0ZW0ubmFtZSB8fCAnJywgaWRlbnRpdHk6IFtpdGVtLm5hbWVdLCBzcGFjZUlkLCBkZXNjcmlwdGlvbjogdGV4dChpdGVtLmRlc2NyaXB0aW9uKSB9O1xyXG4gICAgICAgICAgICBjYXNlICdjb21tZW50JzpcclxuICAgICAgICAgICAgICAgIC8vIEEgbWVhc3VyZW1lbnQncyB0aXRsZSBpcyB1c3VhbGx5IGVtcHR5OiBpdHMgZGVzY3JpcHRpb24gaG9sZHMgdGhlIGRpbWVuc2lvbnMgYW5kXHJcbiAgICAgICAgICAgICAgICAvLyBiZWNvbWVzIHRoZSBuYW1lLiBJdHMgcGljdHVyZSBpcyB0aGUgc2NyZWVuc2hvdCB0YWtlbiB3aGVuIGl0IHdhcyBtZWFzdXJlZC5cclxuICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogaXRlbS50aXRsZSB8fCBpdGVtLmRlc2NyaXB0aW9uIHx8ICcnLFxyXG4gICAgICAgICAgICAgICAgICAgIGlkZW50aXR5OiBbaXRlbS50aXRsZSwgaXRlbS5kZXNjcmlwdGlvbl0sXHJcbiAgICAgICAgICAgICAgICAgICAgc3BhY2VJZCxcclxuICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogaXRlbS50aXRsZSA/IHRleHQoaXRlbS5kZXNjcmlwdGlvbikgOiB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2VLZXk6IGl0ZW0uYW5uZXhlIHx8IHVuZGVmaW5lZFxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHJldHVybiB7IG5hbWU6IGl0ZW0udGl0bGUgfHwgJycsIGlkZW50aXR5OiBbaXRlbS50aXRsZSwgaXRlbS5kZXNjcmlwdGlvbl0sIHNwYWNlSWQsIGRlc2NyaXB0aW9uOiB0ZXh0KGl0ZW0uZGVzY3JpcHRpb24pIH07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RyaXBIdG1sKHZhbHVlOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gKHZhbHVlIHx8ICcnKS5yZXBsYWNlKC88W14+XSo+L2csICcgJykucmVwbGFjZSgvXFxzKy9nLCAnICcpLnRyaW0oKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlY2FsaWJyYXRlcyBhIHNwZWNpZmljIGxpc3Qgb2YgZXhpc3RpbmcgdGFncyBpbiB0aGUgdGFyZ2V0IHNwYWNlIGJ5IGFwcGx5aW5nIHRoZSByaWdpZFxyXG4gICAgICogdHJhbnNmb3JtYXRpb24gY2FsY3VsYXRlZCBmcm9tIHRoZSBzZWxlY3RlZCBsYW5kbWFyayBwb2ludHMuXHJcbiAgICAgKlxyXG4gICAgICogRWFjaCB0YWcgaXMgdXBkYXRlZCBvbiBpdHMgb3duOiBhIGZhaWxpbmcgdXBkYXRlIGlzIGxvZ2dlZCBhbmQgY291bnRlZCwgaXQgbm8gbG9uZ2VyXHJcbiAgICAgKiBzdG9wcyB0aGUgcmVtYWluaW5nIHRhZ3MuIFByb2dyZXNzIGFuZCBsb2cgZ28gdGhyb3VnaCBjb3B5UHJvZ3Jlc3MkIC8gY29weUxvZyQsIGxpa2UgYVxyXG4gICAgICogY29weSAocGhhc2UgJ3JlY2FsaWJyYXRpbmcnKS4gYHRhZ0xhYmVsc2AgKHRhZyBpZCAtPiBuYW1lKSBvbmx5IG1ha2VzIHRoZSBsb2cgcmVhZGFibGUuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIHJlY2FsaWJyYXRlVGFnc0Zyb21WaXNpdChcclxuICAgICAgICB0YXJnZXRTcGFjZUlkOiBzdHJpbmcsXHJcbiAgICAgICAgc2VsZWN0ZWRUYWdJZHM6IHN0cmluZ1tdLFxyXG4gICAgICAgIGxhbmRtYXJrU291cmNlQTogVmVjMyxcclxuICAgICAgICBsYW5kbWFya1RhcmdldEE6IFZlYzMsXHJcbiAgICAgICAgbGFuZG1hcmtTb3VyY2VCOiBWZWMzLFxyXG4gICAgICAgIGxhbmRtYXJrVGFyZ2V0QjogVmVjMyxcclxuICAgICAgICB0YWdMYWJlbHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fVxyXG4gICAgKTogUHJvbWlzZTxSZWNhbGlicmF0aW9uUmVzdWx0PiB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0OiBSZWNhbGlicmF0aW9uUmVzdWx0ID0geyB1cGRhdGVkOiAwLCBza2lwcGVkOiAwLCBmYWlsZWQ6IDAgfTtcclxuICAgICAgICBjb25zdCB1bmlxdWVJZHMgPSBbLi4ubmV3IFNldChzZWxlY3RlZFRhZ0lkcyldO1xyXG4gICAgICAgIGNvbnN0IHRvdGFsID0gdW5pcXVlSWRzLmxlbmd0aDtcclxuICAgICAgICBjb25zdCBsYWJlbCA9IChpZDogc3RyaW5nKSA9PiB0YWdMYWJlbHNbaWRdIHx8IGAjJHtpZC5zdWJzdHJpbmcoMCwgOCl9YDtcclxuICAgICAgICBsZXQgcHJvY2Vzc2VkID0gMDtcclxuICAgICAgICBjb25zdCBlbWl0UHJvZ3Jlc3MgPSAocGhhc2U6IENvcHlQcm9ncmVzc1sncGhhc2UnXSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmNvcHlQcm9ncmVzcyQubmV4dCh7XHJcbiAgICAgICAgICAgICAgICBwaGFzZSxcclxuICAgICAgICAgICAgICAgIHByb2Nlc3NlZEluUGhhc2U6IHByb2Nlc3NlZCwgdG90YWxJblBoYXNlOiB0b3RhbCxcclxuICAgICAgICAgICAgICAgIHByb2Nlc3NlZE92ZXJhbGw6IHByb2Nlc3NlZCwgdG90YWxPdmVyYWxsOiB0b3RhbCxcclxuICAgICAgICAgICAgICAgIHBlcmNlbnQ6IHRvdGFsID4gMCA/IE1hdGgucm91bmQoKHByb2Nlc3NlZCAvIHRvdGFsKSAqIDEwMCkgOiAxMDAsXHJcbiAgICAgICAgICAgICAgICBlcnJvckNvdW50OiByZXN1bHQuZmFpbGVkLCBoZWFsZWRDb3VudDogMFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdGhpcy5zZXRTdGVwTG9nKCdyZWNhbGlicmF0aW5nJywgdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnbWF0dGVycG9ydENvcHkucmVjYWxpYnJhdGVTdGVwJyxcclxuICAgICAgICAgICAgICAgIHsgcHJvY2Vzc2VkLCB0b3RhbCB9KSk7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdGhpcy5yZXNldExvZygpO1xyXG4gICAgICAgIGVtaXRQcm9ncmVzcygncmVjYWxpYnJhdGluZycpO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRyYW5zZm9ybSA9IGNvbXB1dGVSaWdpZFRyYW5zZm9ybShcclxuICAgICAgICAgICAgICAgIGxhbmRtYXJrU291cmNlQSwgbGFuZG1hcmtUYXJnZXRBLFxyXG4gICAgICAgICAgICAgICAgbGFuZG1hcmtTb3VyY2VCLCBsYW5kbWFya1RhcmdldEJcclxuICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICAgIC8vIFJlLXJlYWQgb25seSB0aGUgc2VsZWN0ZWQgUE9JcywgYnkgSUQsIHNvIHRoZSB0cmFuc2Zvcm0gaXMgYXBwbGllZCB0byB0aGVpciBjdXJyZW50XHJcbiAgICAgICAgICAgIC8vIHBvc2l0aW9uIOKAlCBzY2FubmluZyB0aGUgd2hvbGUgc3BhY2UgYWdhaW4gZm9yIGEgaGFuZGZ1bCBvZiB0YWdzIHdhcyB0aGUgc2xvdyBwYXRoLlxyXG4gICAgICAgICAgICBjb25zdCB0YXJnZXRQb2lzID0gYXdhaXQgdGhpcy5mZXRjaFBvaXNCeUlkKHVuaXF1ZUlkcyk7XHJcbiAgICAgICAgICAgIGNvbnN0IGZvdW5kSWRzID0gbmV3IFNldCh0YXJnZXRQb2lzLm1hcChwb2kgPT4gcG9pLmlkKSk7XHJcbiAgICAgICAgICAgIHVuaXF1ZUlkcy5maWx0ZXIoaWQgPT4gIWZvdW5kSWRzLmhhcyhpZCkpLmZvckVhY2goaWQgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0LnNraXBwZWQrKztcclxuICAgICAgICAgICAgICAgIHByb2Nlc3NlZCsrO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hcHBlbmRFcnJvckxvZyh0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdtYXR0ZXJwb3J0Q29weS5yZWNhbGlicmF0ZU5vdEZvdW5kJywgeyBuYW1lOiBsYWJlbChpZCkgfSkpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgZW1pdFByb2dyZXNzKCdyZWNhbGlicmF0aW5nJyk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBVUERBVEVTX0lOX1BBUkFMTEVMID0gMTA7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFyZ2V0UG9pcy5sZW5ndGg7IGkgKz0gVVBEQVRFU19JTl9QQVJBTExFTCkge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwodGFyZ2V0UG9pcy5zbGljZShpLCBpICsgVVBEQVRFU19JTl9QQVJBTExFTCkubWFwKGFzeW5jIHBvaSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaWQgPSBwb2kuaWQgYXMgc3RyaW5nO1xyXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBvcmlnaW5hbENvb3JkOiBhbnkgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxDb29yZCA9IHR5cGVvZiBwb2kuY29vcmRpbmF0ZSA9PT0gJ3N0cmluZydcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEpTT04ucGFyc2UocG9pLmNvb3JkaW5hdGUpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBwb2kuY29vcmRpbmF0ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbENvb3JkID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9yaWdpbmFsQ29vcmQgfHwgdHlwZW9mIG9yaWdpbmFsQ29vcmQueCAhPT0gJ251bWJlcicpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZpcnR1YWwgUE9JIG9yIHVucmVhZGFibGUgY29vcmRpbmF0ZTogbm8gcG9zaXRpb24gdG8gbW92ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnNraXBwZWQrKztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwZW5kRXJyb3JMb2codGhpcy50cmFuc2xhdGUuaW5zdGFudCgnbWF0dGVycG9ydENvcHkucmVjYWxpYnJhdGVTa2lwcGVkJywgeyBuYW1lOiBsYWJlbChpZCkgfSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnBvaVNlcnZpY2UudXBkYXRlUG9pKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29vcmRpbmF0ZTogSlNPTi5zdHJpbmdpZnkodGhpcy5nZXRSZWNhbGlicmF0ZWRDb29yZGluYXRlKG9yaWdpbmFsQ29vcmQsIHRyYW5zZm9ybSkpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGE6IHRoaXMuZ2V0QWRqdXN0ZWRQb2lNZXRhZGF0YShwb2kubWV0YWRhdGEsIHRyYW5zZm9ybSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC51cGRhdGVkKys7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmZhaWxlZCsrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gcmVjYWxpYnJhdGUgdGhlIHRhZyAke2lkfTpgLCBlcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwZW5kRXJyb3JMb2codGhpcy50cmFuc2xhdGUuaW5zdGFudCgnbWF0dGVycG9ydENvcHkucmVjYWxpYnJhdGVFcnJvcicsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IG5hbWU6IGxhYmVsKGlkKSwgZXJyb3I6IHRvRXJyb3JNZXNzYWdlKGVycm9yKSB9KSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2VkKys7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRQcm9ncmVzcygncmVjYWxpYnJhdGluZycpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgIC8vIHRyYW5zZm9ybSBvciByZWFkaW5nIGZhaWx1cmU6IG5vdGhpbmcgbGVmdCBjYW4gYmUgbW92ZWRcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyZXVyIGxvcnMgZHUgcmVjYWxpYnJhZ2UgZGVzIHRhZ3M6JywgZXJyb3IpO1xyXG4gICAgICAgICAgICByZXN1bHQuZmFpbGVkID0gdG90YWwgLSByZXN1bHQudXBkYXRlZCAtIHJlc3VsdC5za2lwcGVkO1xyXG4gICAgICAgICAgICBwcm9jZXNzZWQgPSB0b3RhbDtcclxuICAgICAgICAgICAgdGhpcy5hcHBlbmRFcnJvckxvZyh0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdtYXR0ZXJwb3J0Q29weS5lcnJvckdlbmVyYWwnLCB7IGVycm9yOiB0b0Vycm9yTWVzc2FnZShlcnJvcikgfSkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZW1pdFByb2dyZXNzKCdkb25lJyk7XHJcbiAgICAgICAgdGhpcy5zZXRTdGVwTG9nKCdkb25lJywgdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnbWF0dGVycG9ydENvcHkucmVjYWxpYnJhdGVTdW1tYXJ5JywgcmVzdWx0KSk7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxufSJdfQ==
|
|
2340
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0dGVycG9ydC10YWctY29weS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWNvcmUvc3JjL2xpYi9zZXJ2aWNlcy9tYXR0ZXJwb3J0LXRhZy1jb3B5LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBaUJ2QyxPQUFPLEVBQUUsWUFBWSxFQUFFLHVCQUF1QixFQUFFLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQyxDQUFDLHlHQUF5RztBQUM5TCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbEQsT0FBTyxFQUFFLEdBQUcsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNwRCxPQUFPLEVBQ0gscUJBQXFCLEVBQUUsMEJBQTBCLEVBQUUsOEJBQThCLEVBQUUsUUFBUSxFQUMzRixpQ0FBaUMsRUFDcEMsTUFBTSxtQ0FBbUMsQ0FBQztBQUMzQyxPQUFPLEVBQTJDLFdBQVcsRUFBRSxPQUFPLEVBQWEsUUFBUSxFQUErQyxNQUFNLGtCQUFrQixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7OztBQXlCbks7d0VBQ3dFO0FBQ3hFLFNBQVMsY0FBYyxDQUFDLEdBQVk7SUFDaEMsSUFBSSxHQUFHLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDakMsTUFBTSxNQUFNLEdBQUcsR0FBVSxDQUFDO1FBQzFCLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDM0QsT0FBTyxNQUFNLENBQUMsTUFBTTtpQkFDZixHQUFHLENBQUMsQ0FBQyxDQUFN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Q0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2pILENBQUM7UUFFRCxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDckIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsbUNBQW1DLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUM3RixPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO3dHQTFqRlEsd0JBQXdCOzRHQUF4Qix3QkFBd0IsY0FEWCxNQUFNOzs0RkFDbkIsd0JBQXdCO2tCQURwQyxVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgUE9JIH0gZnJvbSAnLi4vdHlwZXMuc2VydmljZSc7XG5pbXBvcnQgeyBOYXZpZ2F0aW9uU2VydmljZSB9IGZyb20gJy4vbW9kZWxzL25hdmlnYXRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBQb2lTZXJ2aWNlIH0gZnJvbSAnLi9tb2RlbHMvcG9pLnNlcnZpY2UnO1xuaW1wb3J0IHsgVGlja2V0c1NlcnZpY2UgfSBmcm9tICcuL21vZGVscy90aWNrZXQuc2VydmljZSc7XG5pbXBvcnQgeyBFcXVpcG1lbnRTZXJ2aWNlIH0gZnJvbSAnLi9tb2RlbHMvZXF1aXBtZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgT2JqZWN0M0RTZXJ2aWNlIH0gZnJvbSAnLi9tb2RlbHMvb2JqZWN0M0Quc2VydmljZSc7XG5pbXBvcnQgeyBGZWF0dXJlU2VydmljZSB9IGZyb20gJy4vbW9kZWxzL2ZlYXR1cmUuc2VydmljZSc7XG5pbXBvcnQgeyBNZWFzdXJlbWVudFNlcnZpY2UgfSBmcm9tICcuL21vZGVscy9tZWFzdXJlbWVudC5zZXJ2aWNlJztcbmltcG9ydCB7IENvbW1lbnRTZXJ2aWNlIH0gZnJvbSAnLi9tb2RlbHMvY29tbWVudC5zZXJ2aWNlJztcbmltcG9ydCB7IEhhc2h0YWdTZXJ2aWNlIH0gZnJvbSAnLi9tb2RlbHMvaGFzaHRhZy5zZXJ2aWNlJztcbmltcG9ydCB7IE1pc3Npb25TZXJ2aWNlIH0gZnJvbSAnLi9tb2RlbHMvbWlzc2lvbi5zZXJ2aWNlJztcbmltcG9ydCB7IE9wZXJhdGlvblNlcnZpY2UgfSBmcm9tICcuL21vZGVscy9vcGVyYXRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBEb21haW5TZXJ2aWNlIH0gZnJvbSAnLi9tb2RlbHMvZG9tYWluLnNlcnZpY2UnO1xuaW1wb3J0IHsgWm9uZVNlcnZpY2UgfSBmcm9tICcuL21vZGVscy96b25lLnNlcnZpY2UnO1xuaW1wb3J0IHsgQmFzZVVzZXJTZXJ2aWNlIH0gZnJvbSAnLi91c2VyLnNlcnZpY2UnO1xuaW1wb3J0IHsgY29weUZpbGVJblMzLCBjb3B5RmlsZUluUzNWaWFEb3dubG9hZCwgZ2V0U2lnbmVkRmlsZSB9IGZyb20gJy4vczMuc2VydmljZSc7IC8vIHNlZSBzMy5zZXJ2aWNlLnRzOiBuZWl0aGVyIG11c3Qgc3dhbGxvdyBlcnJvcnMgKG5lZWRlZCB0byBkZXRlY3QgTm9TdWNoS2V5IC8gc2lnbmF0dXJlIG1pc21hdGNoIGJlbG93KVxuaW1wb3J0IHsgZG93bmxvYWRCbG9iIH0gZnJvbSAnLi4vaGVscGVycy5zZXJ2aWNlJztcbmltcG9ydCB7IEFQSSwgZ3JhcGhxbE9wZXJhdGlvbiB9IGZyb20gJ2F3cy1hbXBsaWZ5JztcbmltcG9ydCB7XG4gICAgY29tcHV0ZVJpZ2lkVHJhbnNmb3JtLCBhcHBseVJpZ2lkVHJhbnNmb3JtVG9Qb2ludCwgYXBwbHlSaWdpZFRyYW5zZm9ybVRvRGlyZWN0aW9uLCBkaXN0YW5jZSxcbiAgICBhcHBseVJpZ2lkVHJhbnNmb3JtVG9ZUm90YXRpb25EZWcsIFJpZ2lkVHJhbnNmb3JtLCBWZWMzXG59IGZyb20gJy4vdXRpbHMvbWF0dGVycG9ydC10cmFuc2Zvcm0udXRpbCc7XG5pbXBvcnQgeyBPYmplY3QzRCwgRmVhdHVyZSwgTWVhc3VyZW1lbnQsIENvbW1lbnQsIENvbW1lbnRUeXBlLCBQb2lUeXBlLCBFcXVpcG1lbnQsIFNwTW9kdWxlLCBUaWNrZXQsIEhhc2h0YWcsIE1pc3Npb24sIE9wZXJhdGlvbiwgRG9tYWluIH0gZnJvbSAnLi4vdHlwZXMuc2VydmljZSc7XG5cbi8qKiBQcm9ncmVzcyBzbmFwc2hvdCBlbWl0dGVkIGR1cmluZyBjb3B5VGFnc0Zyb21WaXNpdCgpLCBzbyB0aGUgVUkgY2FuIHNob3cgYSBsaXZlIHN0YXR1cy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29weVByb2dyZXNzIHtcbiAgICBwaGFzZTogJ2NvbGxlY3RpbmcnIHwgJ3RpY2tldHMnIHwgJ2VxdWlwbWVudHMnIHwgJ3BvaXMnIHwgJ29iamVjdHMzZCcgfCAnZmVhdHVyZXMnIHwgJ21lYXN1cmVtZW50cycgfCAncmVjYWxpYnJhdGluZycgfCAnZG9uZSc7XG4gICAgcHJvY2Vzc2VkSW5QaGFzZTogbnVtYmVyO1xuICAgIHRvdGFsSW5QaGFzZTogbnVtYmVyO1xuICAgIHByb2Nlc3NlZE92ZXJhbGw6IG51bWJlcjtcbiAgICB0b3RhbE92ZXJhbGw6IG51bWJlcjtcbiAgICBwZXJjZW50OiBudW1iZXI7XG4gICAgZXJyb3JDb3VudDogbnVtYmVyO1xuICAgIC8qKiBJdGVtcyB0aGF0IGFscmVhZHkgZXhpc3RlZCBpbiB0aGUgdGFyZ2V0IHNwYWNlIGFuZCBoYWQgbWlzc2luZyBpZGVudGl0eSBmaWVsZHNcbiAgICAgKiAgZmlsbGVkIGluLCByYXRoZXIgdGhhbiBiZWluZyBuZXdseSBjcmVhdGVkIOKAlCBzZWUgaGVhbEVxdWlwbWVudElkZW50aXR5KCkgYW5kIGl0c1xuICAgICAqICB0aWNrZXQvZmVhdHVyZSBlcXVpdmFsZW50cy4gKi9cbiAgICBoZWFsZWRDb3VudDogbnVtYmVyO1xufVxuXG4vKiogQSBzaW5nbGUgbGluZSBpbiB0aGUgY29weSBsb2cg4oCUIGEgc3RlcCBzdGF0dXMgKHVwZGF0ZWQgaW4gcGxhY2UpLCBvciBhbiBlcnJvciAvIGhlYWxlZFxuICogIGl0ZW0gbm90aWNlIChhcHBlbmRlZCBvbmNlLCBwZXJtYW5lbnQpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb3B5TG9nRW50cnkge1xuICAgIGlkOiBzdHJpbmc7ICAgICAgIC8vIHN0YWJsZSBpZCBmb3Igc3RlcCBsaW5lcyAoc28gdGhleSB1cGRhdGUgaW4gcGxhY2UpLCB1bmlxdWUgZm9yIGVycm9yL2hlYWxlZCBsaW5lc1xuICAgIHR5cGU6ICdzdGVwJyB8ICdlcnJvcicgfCAnaGVhbGVkJztcbiAgICB0ZXh0OiBzdHJpbmc7XG59XG5cbi8qKiBTYWZlbHkgZXh0cmFjdHMgYSByZWFkYWJsZSBtZXNzYWdlIGZyb20gYW4gdW5rbm93biBjYXRjaCB2YWx1ZSwgaW5jbHVkaW5nIEFtcGxpZnknc1xuICogIEdyYXBoUUwgZXJyb3Igc2hhcGUgKHsgZGF0YSwgZXJyb3JzOiBbeyBlcnJvclR5cGUsIG1lc3NhZ2UgfV0gfSkuICovXG5mdW5jdGlvbiB0b0Vycm9yTWVzc2FnZShlcnI6IHVua25vd24pOiBzdHJpbmcge1xuICAgIGlmIChlcnIgJiYgdHlwZW9mIGVyciA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgY29uc3QgYW55RXJyID0gZXJyIGFzIGFueTtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYW55RXJyLmVycm9ycykgJiYgYW55RXJyLmVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYW55RXJyLmVycm9yc1xuICAgICAgICAgICAgICAgIC5tYXAoKGU6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0aXRsZSA9IGUuZXJyb3JUeXBlID8gYCR7ZS5lcnJvclR5cGV9OiBgIDogJyc7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgJHt0aXRsZX0ke2UubWVzc2FnZSB8fCAnVW5rbm93biBlcnJvcid9YDtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5qb2luKCcgfCAnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXJyIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlcnIubWVzc2FnZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAodHlwZW9mIGVyciA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIGVycjtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGVycik7XG4gICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBTdHJpbmcoZXJyKTtcbiAgICB9XG59XG5cbi8qKiBUaHJvd24gd2hlbiB0aGUgcmVmZXJlbmNlZCBTMyBzb3VyY2UgZmlsZSBkb2Vzbid0IGV4aXN0IChvcnBoYW5lZCBEQiByZWZlcmVuY2Ug4oCUXG4gKiAgZS5nLiB0aGUgZmlsZSB3YXMgZGVsZXRlZCBvciByZW5hbWVkIG9uIFMzIHdpdGhvdXQgdXBkYXRpbmcgdGhlIGRhdGFiYXNlKS5cbiAqICBLZXB0IGRpc3RpbmN0IGZyb20gb3RoZXIgY29weSBmYWlsdXJlcyBzbyB0aGUgY2FsbGluZyBsb29wIGNhbiBsb2cgYSBjbGVhcixcbiAqICBzcGVjaWZpYyBtZXNzYWdlIGFuZCBza2lwIHRoZSB3aG9sZSBpdGVtIGluc3RlYWQgb2YgYSBnZW5lcmljIGVycm9yLiAqL1xuY2xhc3MgTWlzc2luZ1MzRmlsZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSBzb3VyY2VLZXk6IHN0cmluZywgcHVibGljIHJlYWRvbmx5IGNvbnRleHRMYWJlbDogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKGBTb3VyY2UgZmlsZSBtaXNzaW5nIG9uIFMzOiBcIiR7c291cmNlS2V5fVwiICgke2NvbnRleHRMYWJlbH0pYCk7XG4gICAgICAgIHRoaXMubmFtZSA9ICdNaXNzaW5nUzNGaWxlRXJyb3InO1xuICAgIH1cbn1cblxuLyoqIEtpbmQgb2YgcmVjb3JkIGEgUE9JJ3MgZWxlbWVudElEIHBvaW50cyBhdCAoYSBtZWFzdXJlbWVudCBQT0kgcG9pbnRzIGF0IGEgQ29tbWVudCkuICovXG50eXBlIFRhZ0VsZW1lbnRUeXBlID0gJ3RpY2tldCcgfCAnZXF1aXBtZW50JyB8ICdvYmplY3QzRCcgfCAnZmVhdHVyZScgfCAnY29tbWVudCc7XG5cbi8qKiBXaGF0IHJlY2FsaWJyYXRpb24gbmVlZHMgdG8ga25vdyBhYm91dCBhIHRhZydzIGVsZW1lbnQuICovXG5pbnRlcmZhY2UgVGFnRWxlbWVudCB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGlkZW50aXR5OiBBcnJheTxzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkPjtcbiAgICAvKiogc3BhY2UgKGxvY2F0aW9uKSB0aGUgZWxlbWVudCBiZWxvbmdzIHRvICovXG4gICAgc3BhY2VJZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqIGZyZWUgdGV4dCBzaG93biBpbiB0aGUgdGFnIHByZXZpZXcgKHRpY2tldCBkZXNjcmlwdGlvbiwgLi4uKSAqL1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAgIC8qKiBTMyB2YWx1ZSBvZiB0aGUgZWxlbWVudCdzIHBpY3R1cmUgKGEgbWVhc3VyZW1lbnQncyBzY3JlZW5zaG90KSAqL1xuICAgIGltYWdlS2V5Pzogc3RyaW5nO1xufVxuXG4vKiogQSB0YWcgbGlzdGVkIGZvciByZWNhbGlicmF0aW9uLCB3aXRoIHdoYXQgdGhlIFVJIG5lZWRzIHRvIGlkZW50aWZ5IGl0LiAqL1xuZXhwb3J0IHR5cGUgUmVjYWxpYnJhdGlvblRhZyA9IFBPSSAmIHtcbiAgICBlbGVtZW50TmFtZTogc3RyaW5nO1xuICAgIGVsZW1lbnREZXNjcmlwdGlvbj86IHN0cmluZztcbiAgICAvKiogcGFzcyB0byBnZXRUYWdJbWFnZVVybCgpIHRvIGdldCBhIGRpc3BsYXlhYmxlIChzaWduZWQpIFVSTCAqL1xuICAgIGVsZW1lbnRJbWFnZUtleT86IHN0cmluZztcbiAgICAvKiogZmxvb3Igem9uZSAobGF5ZXIgRkxPT1IpIG9mIHRoZSB0YWcncyBzd2VlcCBpbiB0aGUgdGFyZ2V0IHNwYWNlICovXG4gICAgZmxvb3JOYW1lPzogc3RyaW5nO1xuICAgIC8qKiBtb3N0IHNwZWNpZmljIG90aGVyIHpvbmUgb2YgdGhlIHRhZydzIHN3ZWVwIGluIHRoZSB0YXJnZXQgc3BhY2UgKi9cbiAgICB6b25lTmFtZT86IHN0cmluZztcbn07XG5cbi8qKlxuICogV2hpY2ggdGFncyBvZiBhIHNwYWNlIChsb2NhdGlvbikgYSByZWNhbGlicmF0aW9uIGxpc3RzLiBBIHRhZyBiZWxvbmdzIHRvIGEgbG9jYXRpb24gKHRoZVxuICogc3BhY2Ugb2YgdGhlIGVsZW1lbnQgaXQgcG9pbnRzIGF0OyBhIHN0YW5kYWxvbmUgdGFnIGJlbG9uZ3MgdG8gZXZlcnkgbG9jYXRpb24gc2hvd2luZyBpdClcbiAqIGFuZCBpcyBkaXNwbGF5ZWQgaW4gb25lIG9yIHNldmVyYWwgdmlydHVhbCB2aXNpdHMgb2YgdGhhdCBsb2NhdGlvbi4gVGFncyBvZiBhbm90aGVyXG4gKiBsb2NhdGlvbiBhcmUgbmV2ZXIgbGlzdGVkLCBldmVuIHdoZW4gYm90aCBsb2NhdGlvbnMgdXNlIHRoZSBzYW1lIHZpc2l0LlxuICogIC0gU1BBQ0U6IGV2ZXJ5IHRhZyBvZiB0aGUgbG9jYXRpb24sIHdoaWNoZXZlciBvZiBpdHMgdmlzaXRzIGl0IHNpdHMgaW47XG4gKiAgLSBWSVNJVDogdGhlIHRhZ3Mgb2YgdGhlIGxvY2F0aW9uIHBsYWNlZCBvbiB0aGUgc3dlZXBzIG9mIHRoZSBzZWxlY3RlZCB2aXNpdC5cbiAqL1xuZXhwb3J0IHR5cGUgUmVjYWxpYnJhdGlvblRhZ1Njb3BlID0gJ1NQQUNFJyB8ICdWSVNJVCc7XG5cbi8qKiBCb3RoIGxpc3RzIGdldFJlY2FsaWJyYXRpb25UYWdTZXRzKCkgb2ZmZXJzLCBzZWUgdGhlcmUuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlY2FsaWJyYXRpb25UYWdTZXRzIHtcbiAgICBzcGFjZTogUmVjYWxpYnJhdGlvblRhZ1tdO1xuICAgIHZpc2l0OiBSZWNhbGlicmF0aW9uVGFnW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVjYWxpYnJhdGlvblRhZ09wdGlvbnMge1xuICAgIC8qKiBOb2RlIG9mIHRoZSBzZWxlY3RlZCB0YXJnZXQgdmlzaXQgKHZpc2l0Lm5vZGUuaWQpOiBkcml2ZXMgdGhlIFZJU0lUIGxpc3QuICovXG4gICAgdGFyZ2V0Tm9kZUlkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKiogT25seSBrZWVwIHRoZSB0YWdzIHRoYXQgYWxzbyBleGlzdCBpbiB0aGUgc291cmNlIGxvY2F0aW9uIChpZ25vcmVkIHdoZW4gc291cmNlID0gdGFyZ2V0KS4gKi9cbiAgICBvbmx5VGFnc0luU291cmNlPzogYm9vbGVhbjtcbn1cblxuLyoqIE91dGNvbWUgb2YgcmVjYWxpYnJhdGVUYWdzRnJvbVZpc2l0KCk6IGhvdyBtYW55IG9mIHRoZSBzZWxlY3RlZCB0YWdzIHdlcmUgbW92ZWQuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlY2FsaWJyYXRpb25SZXN1bHQge1xuICAgIHVwZGF0ZWQ6IG51bWJlcjtcbiAgICAvKiogc2VsZWN0ZWQgdGFncyBub3QgZm91bmQgYW55bW9yZSwgb3Igd2l0aG91dCBhIHBvc2l0aW9uIHRvIG1vdmUgKi9cbiAgICBza2lwcGVkOiBudW1iZXI7XG4gICAgZmFpbGVkOiBudW1iZXI7XG59XG5cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgTWF0dGVycG9ydFRhZ0NvcHlTZXJ2aWNlIHtcblxuICAgIC8vIEVtaXRzIHByb2dyZXNzIHVwZGF0ZXMgZHVyaW5nIGNvcHlUYWdzRnJvbVZpc2l0KCk7IG51bGwgd2hlbiBpZGxlXG4gICAgcHVibGljIGNvcHlQcm9ncmVzcyQ6IEJlaGF2aW9yU3ViamVjdDxDb3B5UHJvZ3Jlc3MgfCBudWxsPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Q29weVByb2dyZXNzIHwgbnVsbD4obnVsbCk7XG5cbiAgICAvLyBFbWl0cyB0aGUgYWNjdW11bGF0ZWQgbG9nIGxpbmVzIGR1cmluZyBjb3B5VGFnc0Zyb21WaXNpdCgpOyBbXSB3aGVuIGlkbGVcbiAgICBwdWJsaWMgY29weUxvZyQ6IEJlaGF2aW9yU3ViamVjdDxDb3B5TG9nRW50cnlbXT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PENvcHlMb2dFbnRyeVtdPihbXSk7XG5cbiAgICBwcml2YXRlIHNwTW9kdWxlOiBTcE1vZHVsZTtcbiAgICBwcml2YXRlIGxvZzogQ29weUxvZ0VudHJ5W10gPSBbXTtcbiAgICAvKiogVW5pcXVlLWlkIHNlcXVlbmNlIHNoYXJlZCBieSBldmVyeSBwZXJtYW5lbnQgKG5vbi1zdGVwKSBsb2cgbGluZSDigJQgZXJyb3JzIGFuZCBoZWFsZWQtaXRlbSBub3RpY2VzIGFsaWtlLiAqL1xuICAgIHByaXZhdGUgbG9nU2VxID0gMDtcblxuICAgIC8vIC0tLS0gUGVyLXJ1biByZW1hcHBpbmcgc3RhdGUgKHJlc2V0IGJ5IHJlc2V0UnVuU3RhdGUoKSBhdCB0aGUgc3RhcnQgb2YgZXZlcnkgY29weSkgLS0tLVxuXG4gICAgLyoqIHNvdXJjZSBlbGVtZW50IGlkIC0+IGlkIG9mIGl0cyBjb3B5IGluIHRoZSB0YXJnZXQgc3BhY2UuICovXG4gICAgcHJpdmF0ZSBlbGVtZW50SWRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG5cbiAgICAvKiogc291cmNlIENvbW1lbnQgaWQgLT4gaWQgb2YgaXRzIGNvcHkuIE5lZWRlZCB0byByZW1hcCBQT0kudGFnSW1hZ2VJRCwgd2hpY2ggaXMgYVxuICAgICAqICByZWZlcmVuY2UgdG8gYSBDb21tZW50IHJlY29yZCAoc2VlIHRoZSBzY2hlbWE6IFwiY29ubmVjdGlvbiB0byBjb21tZW50LmlkXCIpLiAqL1xuICAgIHByaXZhdGUgY29tbWVudElkczogTWFwPHN0cmluZywgc3RyaW5nPiA9IG5ldyBNYXAoKTtcblxuICAgIC8vIEhhc2h0YWdzIGFyZSBzcGFjZS1zY29wZWQgcmVjb3Jkcywgc28gdGhlaXIgaWRzIGNhbiBuZXZlciBiZSBjYXJyaWVkIG92ZXIgYXMtaXM6IHRoZXlcbiAgICAvLyBhcmUgbWF0Y2hlZCBieSBOQU1FIGFnYWluc3QgdGhlIHRhcmdldCBzcGFjZSwgYW5kIHRoZSBtaXNzaW5nIG9uZXMgYXJlIGNyZWF0ZWQgdGhlcmUuXG4gICAgLy8gVGhhdCBjcmVhdGlvbiBpcyBkZWxpYmVyYXRlbHkgbGF6eSDigJQgc2VlIHJlc29sdmVIYXNodGFnSWRzKCkg4oCUIGFuZCBhdWRpdGVkLCBzbyBhblxuICAgIC8vIGludGVycnVwdGVkIGNvcHkgY2Fubm90IGxlYXZlIGtleXdvcmRzIGJlaGluZCB0aGF0IG5vIFBPSSByZWZlcmVuY2VzLlxuXG4gICAgLyoqIHNvdXJjZSBIYXNodGFnIGlkIC0+IGl0cyBuYW1lLiAqL1xuICAgIHByaXZhdGUgc291cmNlSGFzaHRhZ05hbWVzOiBNYXA8c3RyaW5nLCBzdHJpbmc+ID0gbmV3IE1hcCgpO1xuXG4gICAgLyoqIG5vcm1hbGlzZWQgaGFzaHRhZyBuYW1lIC0+IGl0cyBpZCBpbiB0aGUgVEFSR0VUIHNwYWNlIChwcmUtZXhpc3Rpbmcgb3IganVzdCBjcmVhdGVkKS4gKi9cbiAgICBwcml2YXRlIHRhcmdldEhhc2h0YWdJZHNCeU5hbWU6IE1hcDxzdHJpbmcsIHN0cmluZz4gPSBuZXcgTWFwKCk7XG5cbiAgICAvKiogaWRzIG9mIHRoZSBoYXNodGFncyB0aGlzIHJ1biBjcmVhdGVkIGluIHRoZSB0YXJnZXQgc3BhY2UuICovXG4gICAgcHJpdmF0ZSBjcmVhdGVkSGFzaHRhZ0lkczogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG5cbiAgICAvKiogaWRzIG9mIHRoZSBoYXNodGFncyBhY3R1YWxseSBwZXJzaXN0ZWQgb24gYSBzdWNjZXNzZnVsbHkgY3JlYXRlZCBmZWF0dXJlLiBBbnl0aGluZyBpblxuICAgICAqICBjcmVhdGVkSGFzaHRhZ0lkcyBidXQgYWJzZW50IGhlcmUgaXMgYW4gb3JwaGFuIGFuZCBpcyBkZWxldGVkIGF0IHRoZSBlbmQgb2YgdGhlIHJ1bi4gKi9cbiAgICBwcml2YXRlIHVzZWRIYXNodGFnSWRzOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcblxuICAgIC8qKiBzb3VyY2UgaWRzIG9mIHRoZSBlbGVtZW50cyB3aG9zZSBQT0lzIHdlcmUgYWxyZWFkeSBjcmVhdGVkIGJ5IGFuIGVsZW1lbnQgcGhhc2UuXG4gICAgICogIEd1YXJkcyB0aGUgc3RhbmRhbG9uZSBQT0kgcGhhc2UgYWdhaW5zdCBjcmVhdGluZyBhIHNlY29uZCwgaW1wb3ZlcmlzaGVkIGNvcHkuICovXG4gICAgcHJpdmF0ZSBoYW5kbGVkRWxlbWVudElkczogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG5cbiAgICAvLyBDb21tZW50IGF1dGhvcnNoaXA6IGBDb21tZW50Lm93bmVySURgIGlzIGEgZm9yZWlnbiBrZXkgdG8gYSBNaXNzaW9uLCBhbmQgYSBNaXNzaW9uIGlzXG4gICAgLy8gc2NvcGVkIHRvIE9ORSBzcGFjZSAodXNlcklEICsgc3BhY2VJRCkuIEEgc291cmNlIGNvbW1lbnQncyBvd25lcklEIHRoZXJlZm9yZSBwb2ludHMgYXRcbiAgICAvLyBub2JvZHkgaW4gdGhlIHRhcmdldCBzcGFjZSwgc28gaXQgaGFzIHRvIGJlIHRyYW5zbGF0ZWQgdG8gdGhlIE1pc3Npb24gb2YgdGhlIFNBTUUgdXNlclxuICAgIC8vIHRoZXJlIOKAlCBzZWUgcmVzb2x2ZUNvbW1lbnRPd25lcklEKCkuXG5cbiAgICAvKiogc291cmNlIE1pc3Npb24gaWQgLT4gaXRzIHVzZXJJRC4gKi9cbiAgICBwcml2YXRlIHNvdXJjZU1pc3Npb25Vc2VySWRzOiBNYXA8c3RyaW5nLCBzdHJpbmc+ID0gbmV3IE1hcCgpO1xuXG4gICAgLyoqIHVzZXJJRCAtPiB0aGF0IHVzZXIncyBNaXNzaW9uIGlkIGluIHRoZSBUQVJHRVQgc3BhY2UgKG9ubHkgc2V0IHdoZW4gdGhleSBoYXZlIG9uZSkuICovXG4gICAgcHJpdmF0ZSB0YXJnZXRNaXNzaW9uSWRzQnlVc2VySWQ6IE1hcDxzdHJpbmcsIHN0cmluZz4gPSBuZXcgTWFwKCk7XG5cbiAgICAvLyBEb21haW4gKGVxdWlwbWVudC90aWNrZXQvZmVhdHVyZS9QT0kgY2F0ZWdvcnkpIHJlc29sdXRpb24gbWlycm9ycyB0aGUgZXhhY3QgcnVsZSB0aGVcbiAgICAvLyBlZGl0IGZvcm1zIHVzZSB0byBwb3B1bGF0ZSB0aGVpciBvd24gY2F0ZWdvcnkgZHJvcGRvd24g4oCUXG4gICAgLy8gRG9tYWluU2VydmljZS5nZXREb21haW5zRm9yT3JnRm9yVHlwZSh0eXBlLCBtaXNzaW9uLm9yZ2FuaXNhdGlvbklELFxuICAgIC8vIG1pc3Npb24ub3JkZXJlZE9yZ2FuaXNhdGlvbklEKSDigJQga2V5ZWQgdG8gdGhlIE9QRVJBVE9SJ3Mgb3duIE1pc3Npb24gb24gZWFjaCBzcGFjZSxcbiAgICAvLyBOT1QgdG8gdGhlIFNwYWNlJ3Mgb3duIG9yZ2FuaXNhdGlvbklELiBUd28gc3BhY2VzIGluIGRpZmZlcmVudCBvcmdhbmlzYXRpb25zIGNhblxuICAgIC8vIHN0aWxsIHNoYXJlIGEgZG9tYWluIHRocm91Z2ggdGhhdCBNaXNzaW9uIGxpbmsgKGFuIG9wZXJhdG9yIHdob3NlIG1pc3Npb24gb24gdGhlXG4gICAgLy8gdGFyZ2V0IHNwYWNlIGNhcnJpZXMgYW4gYG9yZGVyZWRPcmdhbmlzYXRpb25JRGAgbWF0Y2hpbmcgdGhlIGRvbWFpbidzIG93blxuICAgIC8vIG9yZ2FuaXNhdGlvbklEIHNlZXMg4oCUIGFuZCBjYW4gcmV1c2Ug4oCUIGl0IGRpcmVjdGx5KS4gU2VlIHJlc29sdmVEb21haW5JRCgpLlxuXG4gICAgLyoqIGlkIC0+IERvbWFpbiwgZm9yIGV2ZXJ5IGRvbWFpbiB2aXNpYmxlIGZyb20gRUlUSEVSIHNwYWNlJ3Mgb3BlcmF0b3IgbWlzc2lvbiAoaXRzXG4gICAgICogIG9yZ2FuaXNhdGlvbklELCBpdHMgb3JkZXJlZE9yZ2FuaXNhdGlvbklELCBvciBnZW5lcmljL25vLW9yZ2FuaXNhdGlvbiBkb21haW5zKSDigJQgYVxuICAgICAqICBzdXBlcnNldCBjb3ZlcmluZyB3aGF0ZXZlciBhIHNvdXJjZSBvYmplY3QncyBkb21haW5JRCBjb3VsZCBwb2ludCBhdC4gKi9cbiAgICBwcml2YXRlIGRvbWFpbnNCeUlkOiBNYXA8c3RyaW5nLCBEb21haW4+ID0gbmV3IE1hcCgpO1xuXG4gICAgLyoqIG9yZ2FuaXNhdGlvbklEcyB0aGUgVEFSR0VUIG9wZXJhdG9yJ3MgbWlzc2lvbiBjYW4gc2VlIGRvbWFpbnMgZnJvbS4gQSBkb21haW4gd2hvc2VcbiAgICAgKiAgb3duIG9yZ2FuaXNhdGlvbklEIGlzIGluIHRoaXMgc2V0IChvciBoYXMgbm9uZSBhdCBhbGwpIGlzIGFscmVhZHkgZGlyZWN0bHlcbiAgICAgKiAgc2VsZWN0YWJsZSBpbiB0aGUgdGFyZ2V0IHNwYWNlJ3Mgb3duIGRyb3Bkb3duLCBzbyBpdHMgaWQgaXMgcmV1c2VkIHVuY2hhbmdlZC4gKi9cbiAgICBwcml2YXRlIHRhcmdldFZpc2libGVEb21haW5PcmdJZHM6IFNldDxzdHJpbmc+ID0gbmV3IFNldCgpO1xuXG4gICAgLyoqIGAke3R5cGV9Ojoke25vcm1hbGlzZWQgbmFtZX1gIC0+IHRoYXQgZG9tYWluJ3MgaWQsIGFtb25nIGRvbWFpbnMgdmlzaWJsZSB0byB0aGVcbiAgICAgKiAgVEFSR0VUIG9wZXJhdG9yIOKAlCB1c2VkIHRvIGZpbmQgYW4gZXF1aXZhbGVudCB3aGVuIHRoZSBleGFjdCBpZCBpc24ndCByZXVzYWJsZS4gKi9cbiAgICBwcml2YXRlIHRhcmdldERvbWFpbklkc0J5VHlwZUFuZE5hbWU6IE1hcDxzdHJpbmcsIHN0cmluZz4gPSBuZXcgTWFwKCk7XG5cbiAgICAvKiogVGFyZ2V0IHNwYWNlIGlkIG9mIHRoZSBydW4gaW4gcHJvZ3Jlc3Mg4oCUIHVzZWQgdG8gcmUtaG9tZSBjb3BpZWQgdGFnIGljb25zLiAqL1xuICAgIHByaXZhdGUgdGFyZ2V0U3BhY2VJZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBuYXZpZ2F0aW9uU2VydmljZTogTmF2aWdhdGlvblNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgdXNlclNlcnZpY2U6IEJhc2VVc2VyU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBwb2lTZXJ2aWNlOiBQb2lTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHRpY2tldFNlcnZpY2U6IFRpY2tldHNTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGVxdWlwbWVudFNlcnZpY2U6IEVxdWlwbWVudFNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgb2JqZWN0M0RTZXJ2aWNlOiBPYmplY3QzRFNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgZmVhdHVyZVNlcnZpY2U6IEZlYXR1cmVTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIG1lYXN1cmVtZW50U2VydmljZTogTWVhc3VyZW1lbnRTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGNvbW1lbnRTZXJ2aWNlOiBDb21tZW50U2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBoYXNodGFnU2VydmljZTogSGFzaHRhZ1NlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgbWlzc2lvblNlcnZpY2U6IE1pc3Npb25TZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIG9wZXJhdGlvblNlcnZpY2U6IE9wZXJhdGlvblNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgZG9tYWluU2VydmljZTogRG9tYWluU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgem9uZVNlcnZpY2U6IFpvbmVTZXJ2aWNlXG4gICAgKSB7XG4gICAgICAgIHRoaXMuc3BNb2R1bGUgPSB1c2VyU2VydmljZS5nZXRTcE1vZHVsZSgpO1xuICAgIH1cblxuICAgIC8vXG4gICAgLy8gLS0tLS0tLS0tLSBQdWJsaWMgQVBJIC0tLS0tLS0tLS1cbiAgICAvL1xuXG4gICAgYXN5bmMgY29weVRhZ3NGcm9tVmlzaXQoXG4gICAgICAgIHNvdXJjZVNwYWNlSWQ6IHN0cmluZyxcbiAgICAgICAgdGFyZ2V0U3BhY2VJZDogc3RyaW5nLFxuICAgICAgICBsYW5kbWFya1NvdXJjZUE6IFZlYzMsIGxhbmRtYXJrVGFyZ2V0QTogVmVjMyxcbiAgICAgICAgbGFuZG1hcmtTb3VyY2VCOiBWZWMzLCBsYW5kbWFya1RhcmdldEI6IFZlYzNcbiAgICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgbGV0IGVycm9yQ291bnQgPSAwO1xuICAgICAgICBsZXQgaGVhbGVkQ291bnQgPSAwO1xuICAgICAgICAvLyBpdGVtcyBza2lwcGVkIGJlY2F1c2UgYW4gZXF1aXZhbGVudCBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgdGFyZ2V0IChlYXJsaWVyIHJ1bilcbiAgICAgICAgbGV0IGFscmVhZHlQcmVzZW50Q291bnQgPSAwO1xuICAgICAgICB0aGlzLnJlc2V0TG9nKCk7XG4gICAgICAgIHRoaXMucmVzZXRSdW5TdGF0ZSh0YXJnZXRTcGFjZUlkKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coYENvcHlpbmcgVGFncyBmcm9tIHNvdXJjZSAke3NvdXJjZVNwYWNlSWR9IHRvIHRhcmdldCAke3RhcmdldFNwYWNlSWR9YCk7XG5cbiAgICAgICAgICAgIHRoaXMuc2V0U3RlcFByb2dyZXNzKCdjb2xsZWN0aW5nJywgJ2NvbGxlY3RpbmcnLCAwKTtcbiAgICAgICAgICAgIHRoaXMuY29weVByb2dyZXNzJC5uZXh0KHtcbiAgICAgICAgICAgICAgICBwaGFzZTogJ2NvbGxlY3RpbmcnLFxuICAgICAgICAgICAgICAgIHByb2Nlc3NlZEluUGhhc2U6IDAsIHRvdGFsSW5QaGFzZTogMCxcbiAgICAgICAgICAgICAgICBwcm9jZXNzZWRPdmVyYWxsOiAwLCB0b3RhbE92ZXJhbGw6IDAsXG4gICAgICAgICAgICAgICAgcGVyY2VudDogMCwgZXJyb3JDb3VudDogMCwgaGVhbGVkQ291bnQ6IDBcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBjb25zdCB0YXJnZXRNaXNzaW9uID0gdGhpcy51c2VyU2VydmljZS5jdXJyZW50TWlzc2lvbih0YXJnZXRTcGFjZUlkKTtcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldE1pc3Npb25JZCA9IHRhcmdldE1pc3Npb24gPyB0YXJnZXRNaXNzaW9uLmlkIDogbnVsbDtcblxuICAgICAgICAgICAgY29uc3QgdHJhbnNmb3JtOiBSaWdpZFRyYW5zZm9ybSA9IGNvbXB1dGVSaWdpZFRyYW5zZm9ybShcbiAgICAgICAgICAgICAgICBsYW5kbWFya1NvdXJjZUEsIGxhbmRtYXJrVGFyZ2V0QSxcbiAgICAgICAgICAgICAgICBsYW5kbWFya1NvdXJjZUIsIGxhbmRtYXJrVGFyZ2V0QlxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdSaWdpZCB0cmFuc2Zvcm0gY29tcHV0ZWQ6Jywge1xuICAgICAgICAgICAgICAgIHJvdGF0aW9uWURlZzogdHJhbnNmb3JtLnJvdGF0aW9uWVJhZCAqICgxODAgLyBNYXRoLlBJKSxcbiAgICAgICAgICAgICAgICByZWZTb3VyY2U6IHRyYW5zZm9ybS5yZWZTb3VyY2UsXG4gICAgICAgICAgICAgICAgcmVmVGFyZ2V0OiB0cmFuc2Zvcm0ucmVmVGFyZ2V0XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgY29uc3Qgc291cmNlU3dlZXBJZHMgPSBhd2FpdCB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmdldEFsbG93ZWRTd2VlcHNJRHNGb3JVc2VySW5TcGFjZShzb3VyY2VTcGFjZUlkKTtcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldFN3ZWVwSWRzID0gYXdhaXQgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5nZXRBbGxvd2VkU3dlZXBzSURzRm9yVXNlckluU3BhY2UodGFyZ2V0U3BhY2VJZCk7XG5cbiAgICAgICAgICAgIHRoaXMuc2V0U3RlcFByb2dyZXNzKCdjb2xsZWN0aW5nJywgJ2NvbGxlY3RpbmcnLCAzMCk7XG5cbiAgICAgICAgICAgIGNvbnN0IFtzb3VyY2VOYXZQb3NpdGlvbnMsIHRhcmdldE5hdlBvc2l0aW9uc10gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICAgICAgdGhpcy5idWlsZE5hdmlnYXRpb25Qb3NpdGlvbk1hcChzb3VyY2VTcGFjZUlkLCBzb3VyY2VTd2VlcElkcyksXG4gICAgICAgICAgICAgICAgdGhpcy5idWlsZE5hdmlnYXRpb25Qb3NpdGlvbk1hcCh0YXJnZXRTcGFjZUlkLCB0YXJnZXRTd2VlcElkcylcbiAgICAgICAgICAgIF0pO1xuXG4gICAgICAgICAgICBjb25zdCBlbGVtZW50SWRzID0gdGhpcy5lbGVtZW50SWRzO1xuXG4gICAgICAgICAgICBsZXQgc291cmNlVGlja2V0czogVGlja2V0W10gPSBbXTtcbiAgICAgICAgICAgIGxldCBzb3VyY2VFcXVpcG1lbnRzOiBFcXVpcG1lbnRbXSA9IFtdO1xuICAgICAgICAgICAgbGV0IHRhcmdldFRpY2tldHM6IFRpY2tldFtdID0gW107XG4gICAgICAgICAgICBsZXQgdGFyZ2V0RXF1aXBtZW50czogRXF1aXBtZW50W10gPSBbXTtcbiAgICAgICAgICAgIGxldCBzb3VyY2VNZWFzdXJlbWVudHM6IE1lYXN1cmVtZW50W10gPSBbXTtcbiAgICAgICAgICAgIGxldCB0YXJnZXRNZWFzdXJlbWVudHM6IE1lYXN1cmVtZW50W10gPSBbXTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuc3BNb2R1bGUgPT0gU3BNb2R1bGUuSU1NTykge1xuICAgICAgICAgICAgICAgIHNvdXJjZVRpY2tldHMgPSBhd2FpdCB0aGlzLnRpY2tldFNlcnZpY2UuZ2V0VGlja2V0c0J5U3BhY2Uoc291cmNlU3BhY2VJZCk7XG4gICAgICAgICAgICAgICAgc291cmNlRXF1aXBtZW50cyA9IGF3YWl0IHRoaXMuZXF1aXBtZW50U2VydmljZS5nZXRFcXVpcG1lbnRzRm9yU3BhY2Uoc291cmNlU3BhY2VJZCk7XG4gICAgICAgICAgICAgICAgdGFyZ2V0VGlja2V0cyA9IGF3YWl0IHRoaXMudGlja2V0U2VydmljZS5nZXRUaWNrZXRzQnlTcGFjZSh0YXJnZXRTcGFjZUlkKTtcbiAgICAgICAgICAgICAgICB0YXJnZXRFcXVpcG1lbnRzID0gYXdhaXQgdGhpcy5lcXVpcG1lbnRTZXJ2aWNlLmdldEVxdWlwbWVudHNGb3JTcGFjZSh0YXJnZXRTcGFjZUlkKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5zZXRTdGVwUHJvZ3Jlc3MoJ2NvbGxlY3RpbmcnLCAnY29sbGVjdGluZycsIDU1KTtcblxuICAgICAgICAgICAgY29uc3Qgc291cmNlT2JqZWN0czNEID0gYXdhaXQgdGhpcy5vYmplY3QzRFNlcnZpY2UuZ2V0T2JqZWN0czNEQnlTcGFjZShzb3VyY2VTcGFjZUlkKTtcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldE9iamVjdHMzRCA9IGF3YWl0IHRoaXMub2JqZWN0M0RTZXJ2aWNlLmdldE9iamVjdHMzREJ5U3BhY2UodGFyZ2V0U3BhY2VJZCk7XG5cbiAgICAgICAgICAgIC8vIFBhZ2luYXRlZDogYSBzcGFjZSByb3V0aW5lbHkgaG9sZHMgbW9yZSB0aGFuIHRoZSAxMDAgZmVhdHVyZXMgYSBzaW5nbGUgQXBwU3luY1xuICAgICAgICAgICAgLy8gcGFnZSByZXR1cm5zLCBhbmQgdGhlIHRhaWwgd2FzIHNpbGVudGx5IGRyb3BwZWQuXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gVGhlIHNvdXJjZSBsaXN0IGtlZXBzIHRoZSBoaXN0b3JpY2FsIFwic2tpcCB3aGF0IHRoZSBvcGVyYXRvciBhcmNoaXZlZFwiIHJ1bGUsIHNvXG4gICAgICAgICAgICAvLyB0aGUgc2V0IG9mIGNvcGllZCBmZWF0dXJlcyBkb2VzIG5vdCBjaGFuZ2Ug4oCUIGJ1dCB0aGUgY2hlY2sgaXMgbm93IG51bGwtc2FmZTpcbiAgICAgICAgICAgIC8vIEZlYXR1cmVTZXJ2aWNlLmlzQXJjaGl2ZWQoKSBkZXJlZmVyZW5jZXMgY3VycmVudE1pc3Npb24oc3BhY2VJRCkuaWQgYW5kIHRocmV3IGFcbiAgICAgICAgICAgIC8vIFR5cGVFcnJvciB3aGVuIHRoZSBvcGVyYXRvciBoYWQgbm8gbWlzc2lvbiBvbiB0aGUgc291cmNlIHNwYWNlICh0aGUgY29tbW9uIGNhc2VcbiAgICAgICAgICAgIC8vIGZvciBhbiBhcmNoaXZlZCB2MSBzcGFjZSksIGFib3J0aW5nIHRoZSB3aG9sZSBjb3B5LlxuICAgICAgICAgICAgLy8gVGhlIHRhcmdldCBsaXN0IGlzIE5PVCBmaWx0ZXJlZDogaXQgb25seSBmZWVkcyBkdXBsaWNhdGUgZGV0ZWN0aW9uLCBhbmQgYW5cbiAgICAgICAgICAgIC8vIGFyY2hpdmVkIGZlYXR1cmUgaXMgc3RpbGwgYSBmZWF0dXJlIHRoYXQgZXhpc3RzIHRoZXJlLlxuICAgICAgICAgICAgY29uc3Qgc291cmNlRmVhdHVyZXMgPSAoYXdhaXQgdGhpcy5mZWF0dXJlU2VydmljZS5nZXRBbGxGZWF0dXJlc0J5U3BhY2VSYXcoc291cmNlU3BhY2VJZCkpXG4gICAgICAgICAgICAgICAgLmZpbHRlcihmZWF0dXJlID0+ICF0aGlzLmlzQXJjaGl2ZWRGb3JPcGVyYXRvcihmZWF0dXJlLCBzb3VyY2VTcGFjZUlkKSk7XG4gICAgICAgICAgICBjb25zdCB0YXJnZXRGZWF0dXJlcyA9IGF3YWl0IHRoaXMuZmVhdHVyZVNlcnZpY2UuZ2V0QWxsRmVhdHVyZXNCeVNwYWNlUmF3KHRhcmdldFNwYWNlSWQpO1xuXG4gICAgICAgICAgICB0aGlzLnNldFN0ZXBQcm9ncmVzcygnY29sbGVjdGluZycsICdjb2xsZWN0aW5nJywgNzUpO1xuXG4gICAgICAgICAgICAvLyBLZXl3b3JkczogaW5kZXggYm90aCB2b2NhYnVsYXJpZXMgbm93IChyZWFkLW9ubHkpLiBUaGUga2V5d29yZHMgdGhlIHRhcmdldCBzcGFjZVxuICAgICAgICAgICAgLy8gaXMgbWlzc2luZyBhcmUgY3JlYXRlZCBsYXRlciwgUE9JIGJ5IFBPSSwgb25seSBmb3IgdGhvc2UgYWN0dWFsbHkgdXNlZC5cbiAgICAgICAgICAgIGF3YWl0IHRoaXMubG9hZEhhc2h0YWdJbmRleChzb3VyY2VTcGFjZUlkLCB0YXJnZXRTcGFjZUlkKTtcblxuICAgICAgICAgICAgLy8gTWlzc2lvbnM6IGluZGV4IGJvdGggc3BhY2VzIG5vdyAocmVhZC1vbmx5KSwgc28gY29waWVkIGNvbW1lbnRzIGNhbiBjcmVkaXRcbiAgICAgICAgICAgIC8vIHRoZWlyIHJlYWwgYXV0aG9yIGluc3RlYWQgb2Ygd2hvZXZlciBpcyBydW5uaW5nIHRoZSBjb3B5LlxuICAgICAgICAgICAgYXdhaXQgdGhpcy5sb2FkTWlzc2lvbkluZGV4KHNvdXJjZVNwYWNlSWQsIHRhcmdldFNwYWNlSWQpO1xuXG4gICAgICAgICAgICAvLyBEb21haW5zOiBpbmRleCBldmVyeSBkb21haW4gZWl0aGVyIG9wZXJhdG9yJ3MgbWlzc2lvbiBjYW4gc2VlIChyZWFkLW9ubHkpLCBzb1xuICAgICAgICAgICAgLy8gYSBjYXRlZ29yeSBzdXJ2aXZlcyBhIGNvcHkgYWNyb3NzIHR3byBESUZGRVJFTlQgb3JnYW5pc2F0aW9ucyB3aGVuZXZlciBpdFxuICAgICAgICAgICAgLy8gZ2VudWluZWx5IHdvdWxkIGJlIHNlbGVjdGFibGUgaW4gdGhlIHRhcmdldCBzcGFjZSdzIG93biBkcm9wZG93biDigJQgc2VlXG4gICAgICAgICAgICAvLyBsb2FkRG9tYWluSW5kZXgoKSBmb3Igd2h5IHRoaXMgaXMga2V5ZWQgdG8gTWlzc2lvbiwgbm90IHRvIHRoZSBTcGFjZSBpdHNlbGYuXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmxvYWREb21haW5JbmRleChzb3VyY2VTcGFjZUlkLCB0YXJnZXRTcGFjZUlkKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuc3BNb2R1bGUgPT0gU3BNb2R1bGUuSU1NTykge1xuICAgICAgICAgICAgICAgIHNvdXJjZU1lYXN1cmVtZW50cyA9IChhd2FpdCB0aGlzLm1lYXN1cmVtZW50U2VydmljZS5nZXRNZWFzdXJlbWVudHNGb3JTcGFjZUZvclVzZXIoc291cmNlU3BhY2VJZCkpXG4gICAgICAgICAgICAgICAgICAgIC5maWx0ZXIobSA9PiAobS5udW1iZXJQb2ludHMgPz8gMCkgPiAwKVxuICAgICAgICAgICAgICAgIHRhcmdldE1lYXN1cmVtZW50cyA9IChhd2FpdCB0aGlzLm1lYXN1cmVtZW50U2VydmljZS5nZXRNZWFzdXJlbWVudHNGb3JTcGFjZUZvclVzZXIodGFyZ2V0U3BhY2VJZCkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnNldFN0ZXBQcm9ncmVzcygnY29sbGVjdGluZycsICdjb2xsZWN0aW5nJywgOTApO1xuXG4gICAgICAgICAgICBjb25zdCBzb3VyY2VQb2lzQWxsID0gYXdhaXQgdGhpcy5wb2lTZXJ2aWNlLmdldFBvaXNCeU1hdHRlcnBvcnRTd2VlcHMoc291cmNlU3dlZXBJZHMpO1xuICAgICAgICAgICAgY29uc3QgdGFyZ2V0UG9pc0FsbCA9IGF3YWl0IHRoaXMucG9pU2VydmljZS5nZXRQb2lzQnlNYXR0ZXJwb3J0U3dlZXBzKHRhcmdldFN3ZWVwSWRzKTtcblxuICAgICAgICAgICAgLy8gQSBQT0kgaXMgXCJvd25lZFwiIGJ5IGFuIGVsZW1lbnQgKHRpY2tldCwgZXF1aXBtZW50LCAzRCBvYmplY3QsIGZlYXR1cmUsIG1lYXN1cmVtZW50KVxuICAgICAgICAgICAgLy8gd2hlbiBpdHMgZWxlbWVudElEIHBvaW50cyBhdCBvbmUuIFRob3NlIFBPSXMgYXJlIGNyZWF0ZWQgYnkgdGhlaXIgZWxlbWVudCdzIHBoYXNlLFxuICAgICAgICAgICAgLy8gd2hpY2ggaXMgdGhlIG9ubHkgcGxhY2UgdGhhdCBrbm93cyB0aGUgZWxlbWVudCdzIE5FVyBpZCDigJQgc28gdGhleSBtdXN0IGJlIGV4Y2x1ZGVkXG4gICAgICAgICAgICAvLyBmcm9tIHRoZSBzdGFuZGFsb25lIHBoYXNlLCBvdGhlcndpc2UgZXZlcnkgZmVhdHVyZSBlbmRzIHVwIHdpdGggdHdvIFBPSXM6IG9uZVxuICAgICAgICAgICAgLy8gY29ycmVjdGx5IGxpbmtlZCBidXQgc3RyaXBwZWQgb2YgaXRzIHRhZyBtZXRhZGF0YSwgYW5kIG9uZSBjYXJyeWluZyB0aGUgbWV0YWRhdGFcbiAgICAgICAgICAgIC8vIGJ1dCBzdGlsbCBwb2ludGluZyBhdCB0aGUgc291cmNlIHNwYWNlJ3MgZWxlbWVudC5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBPd25lcnNoaXAgaXMgcmVjb2duaXNlZCBieSBUV08gaW5kZXBlbmRlbnQgY3JpdGVyaWEsIGFuZCBlaXRoZXIgb25lIGlzIGVub3VnaCB0b1xuICAgICAgICAgICAgLy8ga2VlcCBhIFBPSSBvdXQgb2YgdGhlIHN0YW5kYWxvbmUgcGhhc2U6XG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gIC0gaXRzIHR5cGUgaXMgb25lIGFuIGVsZW1lbnQgcGhhc2UgaXMgcmVzcG9uc2libGUgZm9yLiBUaGlzIGlzIHRoZSBoaXN0b3JpY2FsXG4gICAgICAgICAgICAvLyAgICBydWxlIGFuZCBpdCBtdXN0IGJlIGtlcHQ6IGEgUE9JIG9mIHRoYXQgdHlwZSB3aG9zZSBlbGVtZW50IHdhcyBOT1QgY29sbGVjdGVkXG4gICAgICAgICAgICAvLyAgICAoZGVsZXRlZCB0aWNrZXQsIGVxdWlwbWVudCBvdXRzaWRlIHRoZSBjdXJyZW50IGZpbHRlciwgLi4uKSBpcyBhbiBvcnBoYW4sIGFuZFxuICAgICAgICAgICAgLy8gICAgY29weWluZyBpdCBzdGFuZGFsb25lIHdvdWxkIHJlY3JlYXRlIGl0IHdpdGggYW4gZWxlbWVudElEIHN0aWxsIHBvaW50aW5nIGludG9cbiAgICAgICAgICAgIC8vICAgIHRoZSBzb3VyY2Ugc3BhY2Ug4oCUIGFuIG9ycGhhbiB0aGUgcHJldmlvdXMgdmVyc2lvbiBjb3JyZWN0bHkgcmVmdXNlZCB0byBjb3B5LlxuICAgICAgICAgICAgLy8gIC0gaXRzIGVsZW1lbnRJRCBiZWxvbmdzIHRvIGFuIGVsZW1lbnQgd2UgYWN0dWFsbHkgY29sbGVjdGVkLiBUaGlzIGlzIHRoZSBhZGRlZFxuICAgICAgICAgICAgLy8gICAgcnVsZSwgbmVlZGVkIGJlY2F1c2UgdGhlIHR5cGUgYWxvbmUgaXMgbm90IGEgcmVsaWFibGUgZGlzY3JpbWluYXRvcjogaGlzdG9yaWNhbFxuICAgICAgICAgICAgLy8gICAgZGF0YSBhbHNvIGhvbGRzIElORk9STUFUSU9OL1JPT00gUE9JcyBib3VuZCB0byBhIGZlYXR1cmUsIHdoaWNoIHRoZSB0eXBlIHRlc3RcbiAgICAgICAgICAgIC8vICAgIGxldHMgdGhyb3VnaCBhbmQgd2hpY2ggd291bGQgZW5kIHVwIGR1cGxpY2F0ZWQuXG4gICAgICAgICAgICBjb25zdCBoYW5kbGVkUG9pVHlwZXMgPSBuZXcgU2V0PHN0cmluZz4oW1xuICAgICAgICAgICAgICAgIFBvaVR5cGUuVElDS0VULCBQb2lUeXBlLkVRVUlQTUVOVCwgUG9pVHlwZS5EQVRBLCBQb2lUeXBlLkRFU0ssXG4gICAgICAgICAgICAgICAgUG9pVHlwZS5PQkpFQ1QzRCwgUG9pVHlwZS5NRUFTVVJFXG4gICAgICAgICAgICBdKTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCBvd25lciBvZiBbLi4uc291cmNlVGlja2V0cywgLi4uc291cmNlRXF1aXBtZW50cywgLi4uc291cmNlT2JqZWN0czNELCAuLi5zb3VyY2VGZWF0dXJlc10pIHtcbiAgICAgICAgICAgICAgICBpZiAob3duZXI/LmlkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlZEVsZW1lbnRJZHMuYWRkKG93bmVyLmlkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGNvbnN0IG1lYXN1cmVtZW50IG9mIHNvdXJjZU1lYXN1cmVtZW50cykge1xuICAgICAgICAgICAgICAgIC8vIGEgbWVhc3VyZW1lbnQgUE9JIGlzIGJvdW5kIHRvIHRoZSBtZWFzdXJlbWVudCdzIENvbW1lbnQsIG5vdCB0byB0aGUgbWVhc3VyZW1lbnRcbiAgICAgICAgICAgICAgICBpZiAobWVhc3VyZW1lbnQ/LmNvbW1lbnQ/LmlkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlZEVsZW1lbnRJZHMuYWRkKG1lYXN1cmVtZW50LmNvbW1lbnQuaWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgaXNPd25lZEJ5QW5FbGVtZW50ID0gKHBvaTogUE9JKSA9PlxuICAgICAgICAgICAgICAgIGhhbmRsZWRQb2lUeXBlcy5oYXMocG9pLnR5cGUgYXMgc3RyaW5nKVxuICAgICAgICAgICAgICAgIHx8ICghIXBvaS5lbGVtZW50SUQgJiYgdGhpcy5oYW5kbGVkRWxlbWVudElkcy5oYXMocG9pLmVsZW1lbnRJRCkpO1xuXG4gICAgICAgICAgICBjb25zdCBzb3VyY2VQb2lzID0gc291cmNlUG9pc0FsbC5maWx0ZXIocCA9PiAhaXNPd25lZEJ5QW5FbGVtZW50KHApKTtcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldFBvaXMgPSB0YXJnZXRQb2lzQWxsLmZpbHRlcihwID0+ICEhcCk7XG5cbiAgICAgICAgICAgIHRoaXMuc2V0U3RlcFByb2dyZXNzKCdjb2xsZWN0aW5nJywgJ2NvbGxlY3RpbmcnLCAxMDApO1xuXG4gICAgICAgICAgICBjb25zdCB0b3RhbE92ZXJhbGwgPSBzb3VyY2VUaWNrZXRzLmxlbmd0aCArIHNvdXJjZUVxdWlwbWVudHMubGVuZ3RoICsgc291cmNlUG9pcy5sZW5ndGhcbiAgICAgICAgICAgICAgICArIHNvdXJjZU9iamVjdHMzRC5sZW5ndGggKyBzb3VyY2VGZWF0dXJlcy5sZW5ndGggKyBzb3VyY2VNZWFzdXJlbWVudHMubGVuZ3RoO1xuICAgICAgICAgICAgbGV0IHByb2Nlc3NlZE92ZXJhbGwgPSAwO1xuXG4gICAgICAgICAgICBjb25zdCBlbWl0UHJvZ3Jlc3MgPSAocGhhc2U6IENvcHlQcm9ncmVzc1sncGhhc2UnXSwgcHJvY2Vzc2VkSW5QaGFzZTogbnVtYmVyLCB0b3RhbEluUGhhc2U6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY29weVByb2dyZXNzJC5uZXh0KHtcbiAgICAgICAgICAgICAgICAgICAgcGhhc2UsXG4gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZEluUGhhc2UsXG4gICAgICAgICAgICAgICAgICAgIHRvdGFsSW5QaGFzZSxcbiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2VkT3ZlcmFsbCxcbiAgICAgICAgICAgICAgICAgICAgdG90YWxPdmVyYWxsLFxuICAgICAgICAgICAgICAgICAgICBwZXJjZW50OiB0b3RhbE92ZXJhbGwgPiAwID8gTWF0aC5yb3VuZCgocHJvY2Vzc2VkT3ZlcmFsbCAvIHRvdGFsT3ZlcmFsbCkgKiAxMDApIDogMCxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JDb3VudCwgaGVhbGVkQ291bnRcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnNwTW9kdWxlID09IFNwTW9kdWxlLklNTU8pIHtcbiAgICAgICAgICAgICAgICAvLyBUSUNLRVRTXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzb3VyY2VUaWNrZXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZU9iaiA9IHNvdXJjZVRpY2tldHNbaV07XG5cbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nTWF0Y2ggPSB0aGlzLmZpbmRFeGlzdGluZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VPYmogYXMgYW55LCB0YXJnZXRUaWNrZXRzIGFzIGFueSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAodDogYW55KSA9PiBbdC50aXRsZSwgdC5kZXNjcmlwdGlvbl1cbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleGlzdGluZ01hdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxyZWFkeVByZXNlbnRDb3VudCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFleGlzdGluZ01hdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmF3U291cmNlID0gc291cmNlT2JqIGFzIGFueTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRpY2tldElucHV0OiBhbnkgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiByYXdTb3VyY2UudGl0bGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyaWVuZGx5TGFiZWw6IHJhd1NvdXJjZS5mcmllbmRseUxhYmVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IHJhd1NvdXJjZS5zdGF0dXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHJhd1NvdXJjZS50eXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmlvcml0eTogcmF3U291cmNlLnByaW9yaXR5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogcmF3U291cmNlLmRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogcmF3U291cmNlLmxldmVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YTogcmF3U291cmNlLm1ldGFkYXRhIHx8IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWQ6IHJhd1NvdXJjZS5yZWFkIHx8IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2plY3RJRDogcmF3U291cmNlLnByb2plY3RJRCB8fCBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9ibGVtQ29kZTogcmF3U291cmNlLnByb2JsZW1Db2RlIHx8IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1pc3Npb25zIGFyZSBwZXItc3BhY2U6IGEgc291cmNlIG1pc3Npb24gaWQgZGVzaWduYXRlcyBub2JvZHkgaW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHRhcmdldCBzcGFjZS4gQ2FycnlpbmcgdGhlIGxpc3Qgb3ZlciB3b3VsZCBsb29rIGxpa2UgcmVhbCBkYXRhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoaWxlIGhpZGluZyB0aGUgaXRlbSBmcm9tIG5vIG9uZSDigJQgcmVzZXQgaXQsIGFzIGZvciBmZWF0dXJlcy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJjaGl2ZWRGb3JNaXNzaW9uSUQ6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNlSUQ6IHRhcmdldFNwYWNlSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlbWFwcGVkIGluIHRoZSBzZWNvbmQgcGFzcyBiZWxvdywgb25jZSBldmVyeSB0aWNrZXQgZXhpc3RzLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRJRDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmV1c2VkIHVuY2hhbmdlZCBpbiB0aGUgc2FtZSBvcmdhbmlzYXRpb24sIG1hdGNoZWQgYnkgbmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhY3Jvc3MgdHdvIOKAlCBzZWUgcmVzb2x2ZURvbWFpbklEKCkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbWFpbklEOiB0aGlzLnJlc29sdmVEb21haW5JRChyYXdTb3VyY2UuZG9tYWluSUQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvd25lck1pc3Npb25JRDogdGFyZ2V0TWlzc2lvbklkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNyZWF0ZWRPYmogPSBhd2FpdCB0aGlzLnRpY2tldFNlcnZpY2UuY3JlYXRlVGlja2V0KHRpY2tldElucHV0KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjcmVhdGVkT2JqICYmIGNyZWF0ZWRPYmouaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudElkc1tzb3VyY2VPYmouaWRdID0gY3JlYXRlZE9iai5pZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBdHRhY2htZW50cyBvZiB0aGUgdGlja2V0IChwaG90b3Mgb2YgdGhlIGluY2lkZW50LCBkb2N1bWVudHMuLi4pLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZXkgd2VyZSBuZXZlciBjb3BpZWQgYXQgYWxsOiBhIGR1cGxpY2F0ZWQgdGlja2V0IGFycml2ZWQgc3RyaXBwZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZiBldmVyeSBwaWVjZSBvZiBldmlkZW5jZSBhdHRhY2hlZCB0byBpdC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3JlYXRlZE9iaikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc291cmNlQ29tbWVudHM6IENvbW1lbnRbXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlQ29tbWVudHMgPSBhd2FpdCB0aGlzLmNvbW1lbnRTZXJ2aWNlLmdldEFsbENvbW1lbnRzRm9yVGlja2V0KHNvdXJjZU9iai5pZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGNvbW1lbnRzRmV0Y2hFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGBGYWxsaW5nIGJhY2sgdG8gdGhlIGVtYmVkZGVkIGNvbW1lbnQgbGlzdCBmb3IgdGlja2V0IFwiJHtyYXdTb3VyY2UudGl0bGV9XCI6YCwgY29tbWVudHNGZXRjaEVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUNvbW1lbnRzID0gKHNvdXJjZU9iai5jb21tZW50cz8uaXRlbXMgfHwgW10pLmZpbHRlcihjID0+ICEhYykgYXMgQ29tbWVudFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBzb3VyY2VDb21tZW50IG9mIHRoaXMub3JkZXJDb21tZW50c0ZvckNvcHkoc291cmNlQ29tbWVudHMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNyZWF0ZWQgPSBhd2FpdCB0aGlzLmNvcHlDb21tZW50Rm9yVGlja2V0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VDb21tZW50LCBjcmVhdGVkT2JqLmlkLCB0YXJnZXRTcGFjZUlkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3JlYXRlZD8uaWQgJiYgKHNvdXJjZUNvbW1lbnQgYXMgYW55KS5pZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbW1lbnRJZHMuc2V0KChzb3VyY2VDb21tZW50IGFzIGFueSkuaWQsIGNyZWF0ZWQuaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGF0dGFjaG1lbnRFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yIGNvcHlpbmcgYXR0YWNobWVudCBcIiR7c291cmNlQ29tbWVudD8udGl0bGV9XCIgZm9yIHRpY2tldCBcIiR7c291cmNlT2JqPy50aXRsZX1cIjpgLCBhdHRhY2htZW50RXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ291bnQrKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ0NvcHlJdGVtRXJyb3IoYXR0YWNobWVudEVycm9yLCAnZXJyb3JGZWF0dXJlQXR0YWNobWVudCcsIHNvdXJjZUNvbW1lbnQ/LnRpdGxlIHx8IChzb3VyY2VDb21tZW50IGFzIGFueSk/LmlkLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmU6IHJhd1NvdXJjZS50aXRsZSB8fCBzb3VyY2VPYmouaWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc291cmNlUG9pIG9mIChzb3VyY2VPYmoucG9pcz8uaXRlbXMgfHwgW10pLmZpbHRlcihwID0+ICEhcCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jcmVhdGVDb3BpZWRQb2koXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VQb2ksIGNyZWF0ZWRPYmouaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VOYXZQb3NpdGlvbnMsIHRhcmdldE5hdlBvc2l0aW9ucywgdHJhbnNmb3JtXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTYW1lIHJlYXNvbmluZyBhcyB0aGUgRVFVSVBNRU5UUyBwaGFzZSAoc2VlIHRoZSBjb21tZW50IHRoZXJlKTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhIHRpY2tldCBtYXRjaGluZyB0aGlzIG9uZSBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgdGFyZ2V0IHNwYWNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1vc3QgbGlrZWx5IGZyb20gYW4gZWFybGllciwgaW5jb21wbGV0ZSBydW4uIEZpbGwgaW4gd2hhdGV2ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZGVudGl0eSBmaWVsZCBpdCBpcyBtaXNzaW5nIHJhdGhlciB0aGFuIGxlYXZpbmcgaXQgdW50b3VjaGVkLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRJZHNbc291cmNlT2JqLmlkXSA9IGV4aXN0aW5nTWF0Y2guaWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGVhbGVkRmllbGRzID0gYXdhaXQgdGhpcy5oZWFsVGlja2V0SWRlbnRpdHkoc291cmNlT2JqIGFzIGFueSwgZXhpc3RpbmdNYXRjaCBhcyBhbnkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoZWFsZWRGaWVsZHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFsZWRDb3VudCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ0hlYWxlZEl0ZW0oJ3RpY2tldEhlYWxlZCcsIChzb3VyY2VPYmogYXMgYW55KT8udGl0bGUgfHwgc291cmNlT2JqPy5pZCwgaGVhbGVkRmllbGRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGl0ZW1FcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3IgY29weWluZyB0aWNrZXQgXCIke3NvdXJjZU9iaj8udGl0bGV9XCIgKGlkOiAke3NvdXJjZU9iaj8uaWR9KTpgLCBpdGVtRXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JDb3VudCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dDb3B5SXRlbUVycm9yKGl0ZW1FcnJvciwgJ2Vycm9yVGlja2V0Jywgc291cmNlT2JqPy50aXRsZSB8fCBzb3VyY2VPYmo/LmlkKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZE92ZXJhbGwrKztcbiAgICAgICAgICAgICAgICAgICAgZW1pdFByb2dyZXNzKCd0aWNrZXRzJywgaSArIDEsIHNvdXJjZVRpY2tldHMubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGN0ID0gc291cmNlVGlja2V0cy5sZW5ndGggPiAwID8gTWF0aC5yb3VuZCgoKGkgKyAxKSAvIHNvdXJjZVRpY2tldHMubGVuZ3RoKSAqIDEwMCkgOiAxMDA7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RlcFByb2dyZXNzKCd0aWNrZXRzJywgJ3RpY2tldHMnLCBwY3QpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFNlY29uZCBwYXNzOiByZXN0b3JlIHRoZSB0aWNrZXQgaGllcmFyY2h5LiBgcGFyZW50SURgIGhhZCB0byBiZSBudWxsZWQgZHVyaW5nXG4gICAgICAgICAgICAgICAgLy8gY3JlYXRpb24gKHRoZSBwYXJlbnQgbWF5IG5vdCBoYXZlIGV4aXN0ZWQgeWV0KSBhbmQgd2FzIHRoZW4gbmV2ZXIgcmVzdG9yZWQsIHNvXG4gICAgICAgICAgICAgICAgLy8gZXZlcnkgc3ViLXRpY2tldCBjYW1lIG91dCBkZXRhY2hlZC4gU2FtZSBydWxlIGFzIGZvciBzdWItZXF1aXBtZW50czogYSBwYXJlbnRcbiAgICAgICAgICAgICAgICAvLyB3aXRoIG5vIGNvcGllZCBjb3VudGVycGFydCBpcyBkcm9wcGVkIHJhdGhlciB0aGFuIGxlZnQgcG9pbnRpbmcgYXQgdGhlIHNvdXJjZVxuICAgICAgICAgICAgICAgIC8vIHNwYWNlJ3MgdGlja2V0LlxuICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc291cmNlT2JqIG9mIHNvdXJjZVRpY2tldHMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmF3U291cmNlID0gc291cmNlT2JqIGFzIGFueTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3SWQgPSBlbGVtZW50SWRzW3NvdXJjZU9iai5pZF07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld1BhcmVudElkID0gcmF3U291cmNlLnBhcmVudElEID8gZWxlbWVudElkc1tyYXdTb3VyY2UucGFyZW50SURdIDogbnVsbDtcblxuICAgICAgICAgICAgICAgICAgICBpZiAobmV3SWQgJiYgbmV3UGFyZW50SWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy50aWNrZXRTZXJ2aWNlLnVwZGF0ZVRpY2tldCh7IGlkOiBuZXdJZCwgcGFyZW50SUQ6IG5ld1BhcmVudElkIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAocGFyZW50RXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBFcnJvciByZW1hcHBpbmcgdGhlIHBhcmVudCB0aWNrZXQgb2YgXCIke3NvdXJjZU9iaj8udGl0bGV9XCI6YCwgcGFyZW50RXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ291bnQrKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ0NvcHlJdGVtRXJyb3IocGFyZW50RXJyb3IsICdlcnJvclRpY2tldCcsIHNvdXJjZU9iaj8udGl0bGUgfHwgc291cmNlT2JqPy5pZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBFUVVJUE1FTlRTIChpZGVudGl0eSwgUE9JLCBQSE9UTyBhbmQgTk9URVMvZG9jdW1lbnRzIGFsbCBjb3BpZWQg4oCUIGZpbGVzXG4gICAgICAgICAgICAgICAgLy8gcGh5c2ljYWxseSBkdXBsaWNhdGVkIGluIFMzIGZpcnN0LCBzbyB0aGUgY29weSBzdGF5cyBpbmRlcGVuZGVudCBmcm9tIHRoZSBzb3VyY2UpXG4gICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAvLyBDQVJFRlVMOiB0aGUgRXF1aXBtZW50IG1vZGVsIGhhcyBOTyBgdGl0bGVgIGFuZCBOTyBgZGVzY3JpcHRpb25gIGNvbHVtbi4gSXRcbiAgICAgICAgICAgICAgICAvLyBpZGVudGlmaWVzIGl0c2VsZiB3aXRoIGBuYW1lYCAoU3RyaW5nISDigJQgcmVxdWlyZWQpIGFuZCBhbm5vdGF0ZXMgaXRzZWxmIHdpdGhcbiAgICAgICAgICAgICAgICAvLyBgYW5ub3RhdGlvbmAuIFJlYWRpbmcgYHJhd1NvdXJjZS50aXRsZWAgdGhlcmVmb3JlIGFsd2F5cyB5aWVsZGVkIHVuZGVmaW5lZCBhbmRcbiAgICAgICAgICAgICAgICAvLyB0aGUgcmVxdWlyZWQgYG5hbWVgIHdhcyBuZXZlciBzZW50LCB3aGljaCBBcHBTeW5jIHJlamVjdGVkIHdpdGhcbiAgICAgICAgICAgICAgICAvLyBcIlZhcmlhYmxlICdpbnB1dCcgaGFzIGNvZXJjZWQgTnVsbCB2YWx1ZSBmb3IgTm9uTnVsbCB0eXBlICdTdHJpbmchJ1wiLlxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc291cmNlRXF1aXBtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzb3VyY2VPYmogPSBzb3VyY2VFcXVpcG1lbnRzW2ldO1xuXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBFcXVpcG1lbnQgaGFzIG5vIGB0aXRsZWAvYGRlc2NyaXB0aW9uYDogaXQgaWRlbnRpZmllcyBpdHNlbGYgYnkgbmFtZSwgYW5kIGJ5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXJpYWwgbnVtYmVyIHdoZW4gb25lIGlzIHJlY29yZGVkLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXhpc3RpbmdNYXRjaCA9IHRoaXMuZmluZEV4aXN0aW5nKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZU9iaiBhcyBhbnksIHRhcmdldEVxdWlwbWVudHMgYXMgYW55LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlOiBhbnkpID0+IFtlLm5hbWUsIGUuc2VyaWFsTnVtYmVyXVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nTWF0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHJlYWR5UHJlc2VudENvdW50Kys7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWV4aXN0aW5nTWF0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByYXdTb3VyY2UgPSBzb3VyY2VPYmogYXMgYW55O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvcGllZFBob3RvS2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmF3U291cmNlLnBob3RvKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcGllZFBob3RvS2V5ID0gYXdhaXQgdGhpcy5jb3B5UzNLZXlJZlByZXNlbnQocmF3U291cmNlLnBob3RvLCBgZXF1aXBtZW50IHBob3RvIFwiJHtyYXdTb3VyY2UubmFtZX1cImApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVxdWlwbWVudElucHV0OiBhbnkgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHJhd1NvdXJjZS5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVbmxpa2UgZXZlcnkgb3RoZXIgbW9kZWwgdGhpcyBmaWxlIGNvcGllcywgRXF1aXBtZW50IGRlY2xhcmVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBjcmVhdGVkQXRgIGFzIGEgcGxhaW4gY2xpZW50LXNldHRhYmxlIGZpZWxkIHJhdGhlciB0aGFuIGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFwcFN5bmMtbWFuYWdlZCB0aW1lc3RhbXAgKHNlZSBzY2hlbWEuZ3JhcGhxbCkg4oCUIHNvLCB1bmlxdWVseVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBoZXJlLCB0aGUgb3JpZ2luYWwgY29tbWlzc2lvbmluZyBkYXRlIGNhbiBhY3R1YWxseSBiZSBrZXB0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluc3RlYWQgb2YgdGhlIGNvcHkgc2lsZW50bHkgZ2V0dGluZyB0b2RheSdzIGRhdGUuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZWRBdDogcmF3U291cmNlLmNyZWF0ZWRBdCA/PyBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uOiByYXdTb3VyY2UuYW5ub3RhdGlvbiA/PyBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IHJhd1NvdXJjZS5zdGF0dXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZ1bGwgaWRlbnRpdHkgb2YgdGhlIGVxdWlwbWVudCDigJQgYWxsIG9mIHRoZXNlIHdlcmUgZHJvcHBlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYW1pbHk6IHJhd1NvdXJjZS5mYW1pbHkgPz8gbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2t1OiByYXdTb3VyY2Uuc2t1ID8/IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbE51bWJlcjogcmF3U291cmNlLnNlcmlhbE51bWJlciA/PyBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYW51ZmFjdHVyZXI6IHJhd1NvdXJjZS5tYW51ZmFjdHVyZXIgPz8gbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFsbERhdGU6IHJhd1NvdXJjZS5pbnN0YWxsRGF0ZSA/PyBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJyYW50eUVuZERhdGU6IHJhd1NvdXJjZS53YXJyYW50eUVuZERhdGUgPz8gbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGE6IHJhd1NvdXJjZS5tZXRhZGF0YSA/PyBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0NyZWF0ZWRCeUFJOiByYXdTb3VyY2UuaXNDcmVhdGVkQnlBSSA/PyBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNaXNzaW9ucyBhcmUgcGVyLXNwYWNlOiBhIHNvdXJjZSBtaXNzaW9uIGlkIGRlc2lnbmF0ZXMgbm9ib2R5IGluXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB0YXJnZXQgc3BhY2UuIENhcnJ5aW5nIHRoZSBsaXN0IG92ZXIgd291bGQgbG9vayBsaWtlIHJlYWwgZGF0YVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGlsZSBoaWRpbmcgdGhlIGl0ZW0gZnJvbSBubyBvbmUg4oCUIHJlc2V0IGl0LCBhcyBmb3IgZmVhdHVyZXMuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyY2hpdmVkRm9yTWlzc2lvbklEOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFjZUlEOiB0YXJnZXRTcGFjZUlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXVzZWQgdW5jaGFuZ2VkIGluIHRoZSBzYW1lIG9yZ2FuaXNhdGlvbiwgbWF0Y2hlZCBieSBuYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFjcm9zcyB0d28g4oCUIHNlZSByZXNvbHZlRG9tYWluSUQoKS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9tYWluSUQ6IHRoaXMucmVzb2x2ZURvbWFpbklEKHJhd1NvdXJjZS5kb21haW5JRCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBob3RvOiBjb3BpZWRQaG90b0tleSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYHN1YmVxdWlwbWVudHNJRHNgIGlzIGRlbGliZXJhdGVseSBhYnNlbnQ6IGl0IGlzIHJlbWFwcGVkIHRvIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb3BpZWQgZXF1aXBtZW50cyBpbiB0aGUgc2Vjb25kIHBhc3MsIG9uY2UgdGhleSBhbGwgZXhpc3QuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNyZWF0ZWRPYmo6IGFueSA9IGF3YWl0IHRoaXMuZXF1aXBtZW50U2VydmljZS5jcmVhdGVFcXVpcG1lbnQoZXF1aXBtZW50SW5wdXQsIG51bGwsIG51bGwpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNyZWF0ZWRPYmogJiYgY3JlYXRlZE9iai5pZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50SWRzW3NvdXJjZU9iai5pZF0gPSBjcmVhdGVkT2JqLmlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvcHkgbm90ZXMgKGRvY3VtZW50cywgdGVjaG5pY2FsL2ZpbmFuY2lhbC9vdGhlci9jb250cmFjdHVhbC9pbWFnZSBub3RlcylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3JlYXRlZE9iaiAmJiByYXdTb3VyY2Uubm90ZXM/Lml0ZW1zICYmIHJhd1NvdXJjZS5ub3Rlcy5pdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc291cmNlTm90ZSBvZiByYXdTb3VyY2Uubm90ZXMuaXRlbXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBub3RlIHdpdGhvdXQgYSBmaWxlIGlzIHN0aWxsIGEgbm90ZTogaXQgY2FycmllcyBhIHR5cGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgaXRzIHNpZ25hdHVyZS9leHBpcnkgZGF0ZXMuIFNraXBwaW5nIGl0LCBhcyB3YXMgZG9uZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlZm9yZSwgc2lsZW50bHkgZHJvcHBlZCB0aG9zZSByZWNvcmRzIGVudGlyZWx5LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvcGllZEtleSA9IHNvdXJjZU5vdGUuYXR0YWNobWVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGF3YWl0IHRoaXMuY29weVMzS2V5SWZQcmVzZW50KHNvdXJjZU5vdGUuYXR0YWNobWVudCwgYGVxdWlwbWVudCBub3RlIGZvciBcIiR7c291cmNlT2JqPy5uYW1lfVwiYClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZXF1aXBtZW50U2VydmljZS5jcmVhdGVOb3RlV2l0aEV4aXN0aW5nQXR0YWNobWVudChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlZE9iai5pZCwgY29waWVkS2V5LCBzb3VyY2VOb3RlLnR5cGUsIHRhcmdldE1pc3Npb25JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbkRhdGU6IHNvdXJjZU5vdGUuc2lnbkRhdGUgPz8gbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGlyYXRpb25EYXRlOiBzb3VyY2VOb3RlLmV4cGlyYXRpb25EYXRlID8/IG51bGxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChub3RlRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBFcnJvciBjb3B5aW5nIG5vdGUgZm9yIGVxdWlwbWVudCBcIiR7c291cmNlT2JqPy5uYW1lfVwiOmAsIG5vdGVFcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JDb3VudCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nQ29weUl0ZW1FcnJvcihub3RlRXJyb3IsICdlcnJvckVxdWlwbWVudE5vdGUnLCBzb3VyY2VPYmo/Lm5hbWUgfHwgc291cmNlT2JqPy5pZCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcXVpcG1lbnQ6IHNvdXJjZU9iaj8ubmFtZSB8fCBzb3VyY2VPYmo/LmlkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHNvdXJjZVBvaSBvZiAoc291cmNlT2JqLnBvaXM/Lml0ZW1zIHx8IFtdKS5maWx0ZXIocCA9PiAhIXApKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY3JlYXRlQ29waWVkUG9pKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlUG9pLCBjcmVhdGVkT2JqLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlTmF2UG9zaXRpb25zLCB0YXJnZXROYXZQb3NpdGlvbnMsIHRyYW5zZm9ybVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQW4gZXF1aXBtZW50IG1hdGNoaW5nIHRoaXMgb25lIGFscmVhZHkgZXhpc3RzIGluIHRoZSB0YXJnZXQgc3BhY2Ug4oCUXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbW9zdCBvZnRlbiBiZWNhdXNlIGEgUFJFVklPVVMgcnVuIG9mIHRoaXMgY29weSBhbHJlYWR5IGNyZWF0ZWQgaXQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhhdCBlYXJsaWVyIHJ1biBtYXkgaGF2ZSBiZWVuIGludGVycnVwdGVkLCBvciBoaXQgYSBidWcgdGhhdCBoYXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaW5jZSBiZWVuIGZpeGVkIChtaXNzaW5nIGZhbWlseS9tYW51ZmFjdHVyZXIvZG9tYWluSUQvLi4uIHdlcmUgb25jZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRyb3BwZWQgZW50aXJlbHkg4oCUIHNlZSB0aGUgY29tbWVudCBhYm92ZSksIGxlYXZpbmcgYW4gZXF1aXBtZW50IHdpdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpdHMgaWRlbnRpdHkgZmllbGRzIGVtcHR5IGZvcmV2ZXI6IHJlLXJ1bm5pbmcgdGhlIGNvcHkgdXNlZCB0byBza2lwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXQgb3V0cmlnaHQsIHNpbmNlIGl0IGFscmVhZHkgXCJleGlzdHNcIiwgc28gdGhlIGdhcCBjb3VsZCBuZXZlciBoZWFsLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmUtcnVubmluZyB0aGUgdG9vbCBtdXN0IGJlIGFibGUgdG8gcmVwYWlyIHRoYXQ6IGFueSBpZGVudGl0eSBmaWVsZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBleGlzdGluZyB0YXJnZXQgZXF1aXBtZW50IGlzIG1pc3NpbmcsIGFuZCB0aGUgc291cmNlIGhhcywgaXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaWxsZWQgaW4uIEZpZWxkcyB0aGUgdGFyZ2V0IGFscmVhZHkgY2FycmllcyBhIHZhbHVlIGZvciBhcmUgbGVmdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVudG91Y2hlZCwgc28gYSBtYW51YWwgZWRpdCBtYWRlIGluIHRoZSB0YXJnZXQgc3BhY2UgaXMgbmV2ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvdmVyd3JpdHRlbiBieSBhbiBvbGRlciBvciBkaWZmZXJlbnQgc291cmNlIHZhbHVlLiBOb3RlcyBhbmQgUE9JcyBhcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOT1QgcmUtY3JlYXRlZCBoZXJlOiB1bmxpa2Ugc2NhbGFyIGZpZWxkcyB0aGV5IGNhbm5vdCBiZSBcIm1pc3NpbmcgdnMuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJlc2VudFwiIGNoZWNrZWQgdGhlIHNhbWUgd2F5LCBhbmQgcmUtYWRkaW5nIHRoZW0gb24gZXZlcnkgcmUtcnVuIG9mXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW4gYWxyZWFkeS1oZWFsdGh5IGNvcHkgd291bGQgZHVwbGljYXRlIHRoZW0uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudElkc1tzb3VyY2VPYmouaWRdID0gZXhpc3RpbmdNYXRjaC5pZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoZWFsZWRGaWVsZHMgPSBhd2FpdCB0aGlzLmhlYWxFcXVpcG1lbnRJZGVudGl0eShzb3VyY2VPYmogYXMgYW55LCBleGlzdGluZ01hdGNoIGFzIGFueSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhlYWxlZEZpZWxkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWxlZENvdW50Kys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nSGVhbGVkSXRlbSgnZXF1aXBtZW50SGVhbGVkJywgKHNvdXJjZU9iaiBhcyBhbnkpPy5uYW1lIHx8IHNvdXJjZU9iaj8uaWQsIGhlYWxlZEZpZWxkcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChpdGVtRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yIGNvcHlpbmcgZXF1aXBtZW50IFwiJHtzb3VyY2VPYmo/Lm5hbWV9XCIgKGlkOiAke3NvdXJjZU9iaj8uaWR9KTpgLCBpdGVtRXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JDb3VudCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dDb3B5SXRlbUVycm9yKGl0ZW1FcnJvciwgJ2Vycm9yRXF1aXBtZW50Jywgc291cmNlT2JqPy5uYW1lIHx8IHNvdXJjZU9iaj8uaWQpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2VkT3ZlcmFsbCsrO1xuICAgICAgICAgICAgICAgICAgICBlbWl0UHJvZ3Jlc3MoJ2VxdWlwbWVudHMnLCBpICsgMSwgc291cmNlRXF1aXBtZW50cy5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwY3QgPSBzb3VyY2VFcXVpcG1lbnRzLmxlbmd0aCA+IDAgPyBNYXRoLnJvdW5kKCgoaSArIDEpIC8gc291cmNlRXF1aXBtZW50cy5sZW5ndGgpICogMTAwKSA6IDEwMDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRTdGVwUHJvZ3Jlc3MoJ2VxdWlwbWVudHMnLCAnZXF1aXBtZW50cycsIHBjdCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gU2Vjb25kIHBhc3M6IHJlbWFwIHN1YmVxdWlwbWVudHNJRHMgb24gbmV3bHkgY3JlYXRlZCBlcXVpcG1lbnRzIHRvIHBvaW50IHRvXG4gICAgICAgICAgICAgICAgLy8gdGhlaXIgY29waWVkIGNvdW50ZXJwYXJ0cy4gSURzIHdpdGggbm8gY29waWVkIGNvdW50ZXJwYXJ0IChzb3VyY2UgZXF1aXBtZW50XG4gICAgICAgICAgICAgICAgLy8gd2Fzbid0IGNvcGllZCDigJQgZS5nLiBpdCBhbHJlYWR5IGV4aXN0ZWQgaW4gdGFyZ2V0LCBvciB3YXMgc2tpcHBlZCkgYXJlIGRyb3BwZWRcbiAgICAgICAgICAgICAgICAvLyByYXRoZXIgdGhhbiBsZWZ0IGRhbmdsaW5nIG9yIHBvaW50aW5nIGJhY2sgYXQgdGhlIHNvdXJjZSBzcGFjZSdzIGVxdWlwbWVudC5cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHNvdXJjZU9iaiBvZiBzb3VyY2VFcXVpcG1lbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJhd1NvdXJjZSA9IHNvdXJjZU9iaiBhcyBhbnk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld0lkID0gZWxlbWVudElkc1tzb3VyY2VPYmouaWRdO1xuICAgICAgICAgICAgICAgICAgICBpZiAobmV3SWQgJiYgcmF3U291cmNlLnN1YmVxdWlwbWVudHNJRHMgJiYgcmF3U291cmNlLnN1YmVxdWlwbWVudHNJRHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVtYXBwZWQgPSByYXdTb3VyY2Uuc3ViZXF1aXBtZW50c0lEc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKHN1YklkOiBzdHJpbmcpID0+IGVsZW1lbnRJZHNbc3ViSWRdKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKGlkOiBzdHJpbmcgfCB1bmRlZmluZWQpID0+ICEhaWQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVtYXBwZWQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZXF1aXBtZW50U2VydmljZS51cGRhdGVFcXVpcG1lbnQoeyBpZDogbmV3SWQsIHN1YmVxdWlwbWVudHNJRHM6IHJlbWFwcGVkIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHN1YkVxdWlwRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3IgcmVtYXBwaW5nIHN1Yi1lcXVpcG1lbnRzIGZvciBcIiR7c291cmNlT2JqPy5uYW1lfVwiOmAsIHN1YkVxdWlwRXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvdW50Kys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nQ29weUl0ZW1FcnJvcihzdWJFcXVpcEVycm9yLCAnZXJyb3JFcXVpcG1lbnRTdWJFcXVpcCcsIHNvdXJjZU9iaj8ubmFtZSB8fCBzb3VyY2VPYmo/LmlkLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcXVpcG1lbnQ6IHNvdXJjZU9iaj8ubmFtZSB8fCBzb3VyY2VPYmo/LmlkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIE9QRVJBVElPTlMg4oCUIHRoZSBUaWNrZXQ8LT5FcXVpcG1lbnQgam9pbiAoZHJpdmVzIFwiVGlja2V0cyBhY3R1ZWxzXCIgb24gdGhlXG4gICAgICAgICAgICAgICAgLy8gZXF1aXBtZW50IHBhZ2UgYW5kIHRoZSBsaW5rZWQtZXF1aXBtZW50IGxpc3Qgb24gdGhlIHRpY2tldCBwYWdlKS4gQm90aCB0aGVcbiAgICAgICAgICAgICAgICAvLyBUSUNLRVRTIGFuZCBFUVVJUE1FTlRTIHBoYXNlcyBhYm92ZSBjb3B5IHRoZSByZWNvcmQgaXRzZWxmLCBidXQgbmVpdGhlciBvbmVcbiAgICAgICAgICAgICAgICAvLyB0b3VjaGVzIHRoaXMgam9pbiB0YWJsZSwgc28gZXZlcnkgbGluayBiZXR3ZWVuIGEgY29waWVkIHRpY2tldCBhbmQgYSBjb3BpZWRcbiAgICAgICAgICAgICAgICAvLyBlcXVpcG1lbnQgd2FzIHNpbGVudGx5IGRyb3BwZWQ6IGJvdGggc2lkZXMgZXhpc3RlZCBpbiB0aGUgdGFyZ2V0IHNwYWNlLCBidXRcbiAgICAgICAgICAgICAgICAvLyBwb2ludGluZyBhdCBub2JvZHkuXG4gICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAvLyBSdW5zIGFmdGVyIGJvdGggcGhhc2VzLCBvdmVyIGV2ZXJ5IFNPVVJDRSB0aWNrZXQgdGhhdCBlbmRlZCB1cCBtYXBwZWQgaW5cbiAgICAgICAgICAgICAgICAvLyB0aGUgdGFyZ2V0IHNwYWNlIChmcmVzaGx5IGNyZWF0ZWQgT1IgaGVhbGVkIOKAlCBlbGVtZW50SWRzIGNvdmVycyBib3RoKSwgc28gYVxuICAgICAgICAgICAgICAgIC8vIHJlLXJ1biBvdmVyIGFuIGFscmVhZHktY29waWVkIHBhaXIgb2Ygc3BhY2VzIGNhbiBzdGlsbCBwaWNrIHVwIGxpbmtzIHRoYXRcbiAgICAgICAgICAgICAgICAvLyBhbiBlYXJsaWVyLCBpbmNvbXBsZXRlIHJ1biBuZXZlciBjcmVhdGVkLlxuICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc291cmNlVGlja2V0IG9mIHNvdXJjZVRpY2tldHMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3VGlja2V0SWQgPSBlbGVtZW50SWRzW3NvdXJjZVRpY2tldC5pZF07XG4gICAgICAgICAgICAgICAgICAgIGlmICghbmV3VGlja2V0SWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZU9wcyA9IGF3YWl0IHRoaXMub3BlcmF0aW9uU2VydmljZS5nZXRPcGVyYXRpb25zQnlUaWNrZXRJRChzb3VyY2VUaWNrZXQuaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNvdXJjZU9wcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVhZCB3aGF0IHRoZSB0YXJnZXQgdGlja2V0IGlzIGFscmVhZHkgbGlua2VkIHRvLCBzbyBhIHJlLXJ1biBuZXZlclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlcyBhIGR1cGxpY2F0ZSBPcGVyYXRpb24gZm9yIGEgbGluayB0aGF0IGFscmVhZHkgZXhpc3RzLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0T3BzID0gYXdhaXQgdGhpcy5vcGVyYXRpb25TZXJ2aWNlLmdldE9wZXJhdGlvbnNCeVRpY2tldElEKG5ld1RpY2tldElkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpbmtlZEVxdWlwbWVudElkcyA9IG5ldyBTZXQodGFyZ2V0T3BzLm1hcChvcCA9PiBvcC5lcXVpcG1lbnRJRCkpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHNvdXJjZU9wIG9mIHNvdXJjZU9wcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld0VxdWlwbWVudElkID0gc291cmNlT3AuZXF1aXBtZW50SUQgPyBlbGVtZW50SWRzW3NvdXJjZU9wLmVxdWlwbWVudElEXSA6IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm8gY29waWVkIGNvdW50ZXJwYXJ0IGZvciB0aGUgc291cmNlIGVxdWlwbWVudCAobm90IGNvbGxlY3RlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvdXRzaWRlIHRoZSBjdXJyZW50IGZpbHRlciwgLi4uKSDigJQgc2FtZSBydWxlIGFzIGV2ZXJ5d2hlcmUgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluIHRoaXMgZmlsZTogZHJvcCB0aGUgbGluayByYXRoZXIgdGhhbiBwb2ludCBpdCBhdCBub3RoaW5nIG9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXQgdGhlIHNvdXJjZSBzcGFjZSdzIGVxdWlwbWVudC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW5ld0VxdWlwbWVudElkIHx8IGxpbmtlZEVxdWlwbWVudElkcy5oYXMobmV3RXF1aXBtZW50SWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm9wZXJhdGlvblNlcnZpY2UuY3JlYXRlT3BlcmF0aW9uKHsgdGlja2V0SUQ6IG5ld1RpY2tldElkLCBlcXVpcG1lbnRJRDogbmV3RXF1aXBtZW50SWQgfSBhcyBPcGVyYXRpb24pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtlZEVxdWlwbWVudElkcy5hZGQobmV3RXF1aXBtZW50SWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChvcEVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBFcnJvciBjb3B5aW5nIHRpY2tldC1lcXVpcG1lbnQgbGlua3MgZm9yIFwiJHtzb3VyY2VUaWNrZXQ/LnRpdGxlfVwiOmAsIG9wRXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JDb3VudCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dDb3B5SXRlbUVycm9yKG9wRXJyb3IsICdlcnJvck9wZXJhdGlvbicsIHNvdXJjZVRpY2tldD8udGl0bGUgfHwgc291cmNlVGlja2V0Py5pZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIE9CSkVDVFMgM0QgKHRoZSAzRCBtb2RlbCBmaWxlIGl0c2VsZiDigJQgYHBhdGhgIOKAlCBpcyBwaHlzaWNhbGx5IGR1cGxpY2F0ZWQgaW4gUzMpXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNvdXJjZU9iamVjdHMzRC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZU9iaiA9IHNvdXJjZU9iamVjdHMzRFtpXTtcblxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4aXN0c0luVGFyZ2V0ID0gdGFyZ2V0T2JqZWN0czNELnNvbWUodGFyZ2V0T2JqID0+IHRhcmdldE9iai5uYW1lID09PSBzb3VyY2VPYmoubmFtZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGV4aXN0c0luVGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhbHJlYWR5UHJlc2VudENvdW50Kys7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFleGlzdHNJblRhcmdldCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmF3U291cmNlID0gc291cmNlT2JqIGFzIGFueTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYHBhdGhgIG1lYW5zIHR3byBkaWZmZXJlbnQgdGhpbmdzIGRlcGVuZGluZyBvbiBgczNCdWNrZXRgLCBleGFjdGx5IGFzIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmlld2VyIHJlYWRzIGl0IChzZWUgdmlld2VyLmNvbXBvbmVudC50cyBhbmQgbWF0dGVycG9ydC1vYmplY3QzZC5zZXJ2aWNlLnRzKTpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAtIHMzQnVja2V0ID09PSB0cnVlICAtPiBhIGtleSBvZiBhIG1vZGVsIGZpbGUgdXBsb2FkZWQgdG8gUzMsIG91cnMgdG8gZHVwbGljYXRlO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gIC0gb3RoZXJ3aXNlICAgICAgICAgIC0+IGEgcmVmZXJlbmNlIGludG8gdGhlIDNEIG9iamVjdCBsaWJyYXJ5IHNoaXBwZWQgd2l0aFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgdGhlIGFwcGxpY2F0aW9uIChcIjNET2JqZWN0cy9vYmplY3RzL2N1YmUuZGFlXCIgLT4gYXNzZXRzLzNEb2JqZWN0cy8uLi4pLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgd2hpY2ggZXhpc3RzIGluIGV2ZXJ5IHNwYWNlIGFuZCBtdXN0IGJlIHJldXNlZCB2ZXJiYXRpbS5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvcHlpbmcgdW5jb25kaXRpb25hbGx5IG1lYW50IGV2ZXJ5IGxpYnJhcnkgb2JqZWN0IGZhaWxlZCB3aXRoIE5vU3VjaEtleSBhbmRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB3aG9sZSAzRCBvYmplY3Qgd2FzIHNraXBwZWQsIG1vZGVsIEFORCBQT0kuXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29waWVkUGF0aCA9IHJhd1NvdXJjZS5wYXRoO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJhd1NvdXJjZS5wYXRoICYmIHJhd1NvdXJjZS5zM0J1Y2tldCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcGllZFBhdGggPSBhd2FpdCB0aGlzLmNvcHlTM0tleUlmUHJlc2VudChyYXdTb3VyY2UucGF0aCwgYDNEIG9iamVjdCBcIiR7cmF3U291cmNlLm5hbWV9XCJgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICAgICAgICAgKiBTdHJpY3QgcGFyc2VyIHRvIGVuc3VyZSBbZmxvYXQsIGZsb2F0LCBmbG9hdF0gZm9ybWF0IGZvciBHcmFwaFFMLlxuICAgICAgICAgICAgICAgICAgICAgICAgICogRm9yY2VzIG51bWJlcnMsIGhhbmRsZXMgcG90ZW50aWFsIER5bmFtb0RCIG9iamVjdCBzdHJ1Y3R1cmVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICogYW5kIGVuc3VyZXMgd2UgbmV2ZXIgc2VuZCBbMCwwLDBdIGZvciBzY2FsZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdG9GbG9hdEFycmF5ID0gKHZhbDogYW55LCBkZWZhdWx0VmFsOiBudW1iZXJbXSA9IFswLCAwLCAwXSk6IG51bWJlcltdID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYXJyYXk6IG51bWJlcltdID0gW107XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIERCIGZvcm1hdCBbIHtOOiBcIjFcIn0sIC4uLiBdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWwubGVuZ3RoID4gMCAmJiB0eXBlb2YgdmFsWzBdID09PSAnb2JqZWN0JyAmJiAnTicgaW4gdmFsWzBdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheSA9IHZhbC5tYXAoaXRlbSA9PiBwYXJzZUZsb2F0KGl0ZW0uTikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIGFscmVhZHkgc3RhbmRhcmQgYXJyYXkgWzEsIDEsIDFdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkgPSB2YWwubWFwKGl0ZW0gPT4gcGFyc2VGbG9hdChpdGVtKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgb2JqZWN0IHt4LCB5LCB6fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHZhbCAmJiB0eXBlb2YgdmFsID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheSA9IFtwYXJzZUZsb2F0KHZhbC54KSwgcGFyc2VGbG9hdCh2YWwueSksIHBhcnNlRmxvYXQodmFsLnopXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFbnN1cmUgd2UgcmV0dXJuIHZhbGlkIG51bWJlcnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXkubWFwKG4gPT4gaXNOYU4obikgPyAwIDogbik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHNlcnZpY2UgaXMgc2hhcmVkLCBidXQgdGhlIHR3byBhcHBsaWNhdGlvbnMgZG8gTk9UIGRlcGxveSB0aGUgc2FtZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gT2JqZWN0M0Qgc2NoZW1hOiBgdmlld0ZydXN0dW1gIGV4aXN0cyBvbmx5IGluIHNtYXJ0ZXJwbGFuLCBhbmQgYHNjYWxlYFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgW0Zsb2F0XSB0aGVyZSBidXQgYSBwbGFpbiBGbG9hdCBpbiBtdXNldW0uIFNlbmRpbmcgdGhlIHNtYXJ0ZXJwbGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzaGFwZSB0byBtdXNldW0gd2FzIHJlamVjdGVkIHdpdGggXCJUaGUgdmFyaWFibGVzIGlucHV0IGNvbnRhaW5zIGEgZmllbGRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoYXQgaXMgbm90IGRlZmluZWQgZm9yIGlucHV0IG9iamVjdCB0eXBlICdDcmVhdGVPYmplY3QzRElucHV0J1wiLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBpbnB1dCB0aGVyZWZvcmUgTUlSUk9SUyB0aGUgc291cmNlIHJlY29yZCBpbnN0ZWFkIG9mIGltcG9zaW5nIGFcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNoYXBlOiBzb3VyY2UgYW5kIHRhcmdldCBsaXZlIGluIHRoZSBzYW1lIGRlcGxveW1lbnQsIHNvIHdoYXRldmVyIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc291cmNlIGNhcnJpZXMgaXMgZXhhY3RseSB3aGF0IHRoZSB0YXJnZXQgYWNjZXB0cy5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9iamVjdDNESW5wdXQ6IGFueSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiBjb3BpZWRQYXRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRlbGxzIHRoZSB2aWV3ZXIgaG93IHRvIGludGVycHJldCBgcGF0aGAuIERyb3BwaW5nIGl0IHR1cm5lZCBhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFMzLWhvc3RlZCBtb2RlbCBpbnRvIGEgbGlicmFyeSByZWZlcmVuY2Ugb24gdGhlIGNvcHksIHdoaWNoIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZpZXdlciB0aGVuIHRyaWVkIHRvIHJlc29sdmUgYWdhaW5zdCBhc3NldHMvIGFuZCBmYWlsZWQgdG8gbG9hZC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzM0J1Y2tldDogISFyYXdTb3VyY2UuczNCdWNrZXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogcmF3U291cmNlLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IHJhd1NvdXJjZS5kZXNjcmlwdGlvbiB8fCBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNlSUQ6IHRhcmdldFNwYWNlSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IHRvRmxvYXRBcnJheShyYXdTb3VyY2UucG9zaXRpb24sIFswLCAwLCAwXSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRpb246IHRvRmxvYXRBcnJheShyYXdTb3VyY2Uucm90YXRpb24sIFswLCAwLCAwXSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgndmlld0ZydXN0dW0nIGluIHJhd1NvdXJjZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdDNESW5wdXQudmlld0ZydXN0dW0gPSAhIXJhd1NvdXJjZS52aWV3RnJ1c3R1bTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2NhbGUga2VlcHMgdGhlIHNvdXJjZSdzIG93biBzaGFwZTogYSBsaXN0IHN0YXlzIGEgbGlzdCwgYSBzY2FsYXIgc3RheXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGEgc2NhbGFyLiBBbiBhYnNlbnQgc2NhbGUgaXMgbGVmdCB1bnNldCByYXRoZXIgdGhhbiBpbnZlbnRlZCwgc28gdGhlIGNvcHlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbmRlcnMgZXhhY3RseSBsaWtlIHRoZSBvcmlnaW5hbC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHJhd1NvdXJjZS5zY2FsZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QzRElucHV0LnNjYWxlID0gdG9GbG9hdEFycmF5KHJhd1NvdXJjZS5zY2FsZSwgWzEsIDEsIDFdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmF3U291cmNlLnNjYWxlICE9PSBudWxsICYmIHJhd1NvdXJjZS5zY2FsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2NhbGFyU2NhbGUgPSBwYXJzZUZsb2F0KHJhd1NvdXJjZS5zY2FsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0M0RJbnB1dC5zY2FsZSA9IE51bWJlci5pc05hTihzY2FsYXJTY2FsZSkgPyAxIDogc2NhbGFyU2NhbGU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNyZWF0ZWRPYmogPSBhd2FpdCB0aGlzLm9iamVjdDNEU2VydmljZS5jcmVhdGUob2JqZWN0M0RJbnB1dCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjcmVhdGVkT2JqICYmIGNyZWF0ZWRPYmouaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50SWRzW3NvdXJjZU9iai5pZF0gPSBjcmVhdGVkT2JqLmlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHNvdXJjZVBvaSBvZiAoc291cmNlT2JqLnBvaXM/Lml0ZW1zIHx8IFtdKS5maWx0ZXIocCA9PiAhIXApKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jcmVhdGVDb3BpZWRQb2koXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZVBvaSwgY3JlYXRlZE9iai5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlTmF2UG9zaXRpb25zLCB0YXJnZXROYXZQb3NpdGlvbnMsIHRyYW5zZm9ybVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGNhdGNoIChpdGVtRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGJhY2tlbmQgY2FuIGRlbnkgY3JlYXRpb24gb2YgdGhpcyB3aG9sZSBtb2RlbCB0byB0aGUgc2lnbmVkLWluIGFjY291bnRcbiAgICAgICAgICAgICAgICAgICAgLy8gKGluIE1VU0VVTSwgT2JqZWN0M0Qgb25seSBncmFudHMgZ2V0L2xpc3QgdG8gdXNlclBvb2xzKS4gVGhlIGRlbmlhbCBpcyBub3RcbiAgICAgICAgICAgICAgICAgICAgLy8gcGVyLWl0ZW0sIHNvIGV2ZXJ5IHJlbWFpbmluZyBvYmplY3Qgd291bGQgZmFpbCBpZGVudGljYWxseTogcmVwb3J0IGl0IG9uY2UsXG4gICAgICAgICAgICAgICAgICAgIC8vIGFzIGEgcGVybWlzc2lvbiBwcm9ibGVtIHJhdGhlciB0aGFuIGEgY29weSBlcnJvciwgYW5kIHN0b3AgdGhlIHBoYXNlIGluc3RlYWRcbiAgICAgICAgICAgICAgICAgICAgLy8gb2YgZmlyaW5nIG9uZSBkb29tZWQgbXV0YXRpb24gcGVyIG9iamVjdC5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNVbmF1dGhvcml6ZWQoaXRlbUVycm9yKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVtYWluaW5nID0gc291cmNlT2JqZWN0czNELmxlbmd0aCAtIGk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYFtNYXR0ZXJwb3J0VGFnQ29weVNlcnZpY2VdIE5vdCBhbGxvd2VkIHRvIGNyZWF0ZSAzRCBvYmplY3RzIGluIHRoZSB0YXJnZXQgc3BhY2UsIHNraXBwaW5nICR7cmVtYWluaW5nfSBvZiB0aGVtLmAsIGl0ZW1FcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvdW50Kys7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ0l0ZW1FcnJvcignZXJyb3JPYmplY3RzM2ROb3RBbGxvd2VkJywgeyBjb3VudDogcmVtYWluaW5nIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzZWRPdmVyYWxsICs9IHJlbWFpbmluZztcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRQcm9ncmVzcygnb2JqZWN0czNkJywgc291cmNlT2JqZWN0czNELmxlbmd0aCwgc291cmNlT2JqZWN0czNELmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFN0ZXBQcm9ncmVzcygnb2JqZWN0czNkJywgJ29iamVjdHMzZCcsIDEwMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yIGNvcHlpbmcgb2JqZWN0M0QgXCIke3NvdXJjZU9iaj8ubmFtZX1cIjpgLCBpdGVtRXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICBlcnJvckNvdW50Kys7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nQ29weUl0ZW1FcnJvcihpdGVtRXJyb3IsICdlcnJvck9iamVjdDNkJywgc291cmNlT2JqPy5uYW1lIHx8IHNvdXJjZU9iaj8uaWQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHByb2Nlc3NlZE92ZXJhbGwrKztcbiAgICAgICAgICAgICAgICBlbWl0UHJvZ3Jlc3MoJ29iamVjdHMzZCcsIGkgKyAxLCBzb3VyY2VPYmplY3RzM0QubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBwY3QgPSBzb3VyY2VPYmplY3RzM0QubGVuZ3RoID4gMCA/IE1hdGgucm91bmQoKChpICsgMSkgLyBzb3VyY2VPYmplY3RzM0QubGVuZ3RoKSAqIDEwMCkgOiAxMDA7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTdGVwUHJvZ3Jlc3MoJ29iamVjdHMzZCcsICdvYmplY3RzM2QnLCBwY3QpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBGRUFUVVJFUyDigJQgdGhlIFwiUE9JXCIgb2YgdGhlIE1VU0VVTSBtb2R1bGU6IGl0cyBvd24gcmVjb3JkICh0aXRsZSwgaW5kZXgsIGxvY2FsZSxcbiAgICAgICAgICAgIC8vIGtleXdvcmRzKSwgaXRzIG1lZGlhIHNldCAob25lIENvbW1lbnQgcGVyIGltYWdlL3ZpZGVvL2F1ZGlvL2RvY3VtZW50L2xpbmsvdGV4dClcbiAgICAgICAgICAgIC8vIGFuZCBpdHMgUE9JIHJlY29yZCAodGhlIHBhc3RpbGxlOiBpY29uLCB0YWcgZGVzY3JpcHRpb24sIGNvdmVyIGltYWdlKS5cbiAgICAgICAgICAgIC8vIEV2ZXJ5dGhpbmcgaXMgY29waWVkIGhlcmUsIGZpbGVzIHBoeXNpY2FsbHkgZHVwbGljYXRlZCBpbiBTMyBmaXJzdC5cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc291cmNlRmVhdHVyZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzb3VyY2VPYmogPSBzb3VyY2VGZWF0dXJlc1tpXTtcblxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nTWF0Y2ggPSB0aGlzLmZpbmRFeGlzdGluZyhcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZU9iaiBhcyBhbnksIHRhcmdldEZlYXR1cmVzIGFzIGFueSxcbiAgICAgICAgICAgICAgICAgICAgICAgIChmOiBhbnkpID0+IFtmLnRpdGxlLCBmLmRlc2NyaXB0aW9uXVxuICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChleGlzdGluZ01hdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhbHJlYWR5UHJlc2VudENvdW50Kys7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFleGlzdGluZ01hdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByYXdTb3VyY2UgPSBzb3VyY2VPYmogYXMgYW55O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXNvbHZlZCBqdXN0IGJlZm9yZSB0aGUgd3JpdGU6IGEga2V5d29yZCBpcyBvbmx5IGNyZWF0ZWQgaW4gdGhlIHRhcmdldFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3BhY2Ugd2hlbiB0aGUgUE9JIGNhcnJ5aW5nIGl0IGlzIGFib3V0IHRvIGJlIGNyZWF0ZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNvbHZlZEhhc2h0YWdzID0gYXdhaXQgdGhpcy5yZXNvbHZlSGFzaHRhZ0lkcyhyYXdTb3VyY2UuaGFzaHRhZ3MsIHRhcmdldFNwYWNlSWQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmZWF0dXJlSW5wdXQ6IGFueSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogcmF3U291cmNlLnRpdGxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0RGVzY3JpcHRpb246IHJhd1NvdXJjZS5zaG9ydERlc2NyaXB0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsOiByYXdTb3VyY2UubGV2ZWwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogcmF3U291cmNlLnR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYGluZGV4YCBkcml2ZXMgdGhlIG9yZGVyaW5nIG9mIHRoZSBQT0kgaW4gdGhlIHNwYWNlJ3MgbGlzdCwgaW4gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGF0ZXJhbCBtZW51IGFuZCBpbiB0aGUgZ3VpZGVkIHRvdXIuIERyb3BwaW5nIGl0IGZvcmNlZCBhIGZ1bGwgbWFudWFsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVudW1iZXJpbmcgb2YgZXZlcnkgY29waWVkIFBPSS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleDogcmF3U291cmNlLmluZGV4ID8/IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWlzc2lvbnMgYXJlIHBlci1zcGFjZTogc291cmNlIG1pc3Npb24gaWRzIG1lYW4gbm90aGluZyBpbiB0aGUgdGFyZ2V0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3BhY2UsIHNvIGFuIGFyY2hpdmUgbGlzdCBjYXJyaWVkIG92ZXIgd291bGQgaGlkZSBQT0lzIGZyb20gbm9ib2R5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hpbGUgbG9va2luZyBsaWtlIHJlYWwgZGF0YS4gUmVzZXQgaW5zdGVhZC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmNoaXZlZEZvck1pc3Npb25JRDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpcGVQcm9kdWN0SUQ6IHJhd1NvdXJjZS5zdHJpcGVQcm9kdWN0SUQgfHwgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpcGVQcmljZUlEOiByYXdTb3VyY2Uuc3RyaXBlUHJpY2VJRCB8fCBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2tpbmdQcmljZU1ldGFkYXRhOiByYXdTb3VyY2UuYm9va2luZ1ByaWNlTWV0YWRhdGEgfHwgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbGU6IHJhd1NvdXJjZS5sb2NhbGUgfHwgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBIYXNodGFncyBhcmUgc3BhY2Utc2NvcGVkIHJlY29yZHM6IHRoZSBpZHMgbXVzdCBiZSB0cmFuc2xhdGVkIHRvIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVxdWl2YWxlbnQgaGFzaHRhZ3Mgb2YgdGhlIHRhcmdldCBzcGFjZSAoY3JlYXRlZCBvbiBkZW1hbmQpLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2h0YWdzOiByZXNvbHZlZEhhc2h0YWdzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiByYXdTb3VyY2UuZGVzY3JpcHRpb24gfHwgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXVzZWQgdW5jaGFuZ2VkIGluIHRoZSBzYW1lIG9yZ2FuaXNhdGlvbiwgbWF0Y2hlZCBieSBuYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWNyb3NzIHR3byDigJQgc2VlIHJlc29sdmVEb21haW5JRCgpLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbWFpbklEOiB0aGlzLnJlc29sdmVEb21haW5JRChyYXdTb3VyY2UuZG9tYWluSUQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNlSUQ6IHRhcmdldFNwYWNlSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duZXJNaXNzaW9uSUQ6IHRhcmdldE1pc3Npb25JZFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY3JlYXRlZE9iaiA9IGF3YWl0IHRoaXMuZmVhdHVyZVNlcnZpY2UuY3JlYXRlRmVhdHVyZShmZWF0dXJlSW5wdXQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3JlYXRlZE9iaiAmJiBjcmVhdGVkT2JqLmlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudElkc1tzb3VyY2VPYmouaWRdID0gY3JlYXRlZE9iai5pZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgZmVhdHVyZSBleGlzdHM6IGl0cyBrZXl3b3JkcyBhcmUgbm93IGdlbnVpbmVseSByZWZlcmVuY2VkIGFuZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG11c3Qgc3Vydml2ZSB0aGUgZW5kLW9mLXJ1biBjbGVhbnVwLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWFya0hhc2h0YWdzVXNlZChyZXNvbHZlZEhhc2h0YWdzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNyZWF0ZWRPYmopIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZWFkIHRoZSBtZWRpYSBzZXQgdGhyb3VnaCBpdHMgb3duIHBhZ2luYXRlZCBxdWVyeTogdGhlIGBjb21tZW50c2BcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25uZWN0aW9uIGVtYmVkZGVkIGluIEZlYXR1cmVzQnlTcGFjZSBpcyBjYXBwZWQgYXQgMTAwIGl0ZW1zIGFuZCBpdHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXh0VG9rZW4gd2FzIG5ldmVyIGZvbGxvd2VkLCBzbyByaWNoIFBPSXMgbG9zdCBhdHRhY2htZW50cyBzaWxlbnRseS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc291cmNlQ29tbWVudHM6IENvbW1lbnRbXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUNvbW1lbnRzID0gYXdhaXQgdGhpcy5jb21tZW50U2VydmljZS5nZXRBbGxDb21tZW50c0ZvckZlYXR1cmUoc291cmNlT2JqLmlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChjb21tZW50c0ZldGNoRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGBGYWxsaW5nIGJhY2sgdG8gdGhlIGVtYmVkZGVkIGNvbW1lbnQgbGlzdCBmb3IgZmVhdHVyZSBcIiR7cmF3U291cmNlLnRpdGxlfVwiOmAsIGNvbW1lbnRzRmV0Y2hFcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUNvbW1lbnRzID0gKHNvdXJjZU9iai5jb21tZW50cz8uaXRlbXMgfHwgW10pLmZpbHRlcihjID0+ICEhYykgYXMgQ29tbWVudFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc291cmNlQ29tbWVudCBvZiB0aGlzLm9yZGVyQ29tbWVudHNGb3JDb3B5KHNvdXJjZUNvbW1lbnRzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY3JlYXRlZCA9IGF3YWl0IHRoaXMuY29weUNvbW1lbnRGb3JGZWF0dXJlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUNvbW1lbnQsIGNyZWF0ZWRPYmouaWQsIHRhcmdldFNwYWNlSWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3JlYXRlZD8uaWQgJiYgKHNvdXJjZUNvbW1lbnQgYXMgYW55KS5pZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29tbWVudElkcy5zZXQoKHNvdXJjZUNvbW1lbnQgYXMgYW55KS5pZCwgY3JlYXRlZC5pZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGF0dGFjaG1lbnRFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3IgY29weWluZyBhdHRhY2htZW50IFwiJHtzb3VyY2VDb21tZW50Py50aXRsZX1cIiBmb3IgZmVhdHVyZSBcIiR7c291cmNlT2JqPy50aXRsZX1cIjpgLCBhdHRhY2htZW50RXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JDb3VudCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dDb3B5SXRlbUVycm9yKGF0dGFjaG1lbnRFcnJvciwgJ2Vycm9yRmVhdHVyZUF0dGFjaG1lbnQnLCBzb3VyY2VDb21tZW50Py50aXRsZSB8fCAoc291cmNlQ29tbWVudCBhcyBhbnkpPy5pZCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmU6IHJhd1NvdXJjZS50aXRsZSB8fCBzb3VyY2VPYmouaWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXZlcnkgUE9JIG9mIHRoZSBmZWF0dXJlLCBub3Qgb25seSB0aGUgZmlyc3Qgb25lOiBhIGZlYXR1cmUgbWF5IGJlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGlubmVkIGF0IHNldmVyYWwgcGxhY2VzLCBhbmQgb25seSB0aGlzIHBoYXNlIGtub3dzIHRoZSBuZXcgZWxlbWVudCBpZC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzb3VyY2VGZWF0dXJlUG9pcyA9IChzb3VyY2VPYmoucG9pcz8uaXRlbXMgfHwgW10pLmZpbHRlcihwID0+ICEhcCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBzb3VyY2VQb2kgb2Ygc291cmNlRmVhdHVyZVBvaXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jcmVhdGVDb3BpZWRQb2koXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VQb2ksIGNyZWF0ZWRPYmouaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VOYXZQb3NpdGlvbnMsIHRhcmdldE5hdlBvc2l0aW9ucywgdHJhbnNmb3JtXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2FtZSByZWFzb25pbmcgYXMgdGhlIEVRVUlQTUVOVFMgcGhhc2UgKHNlZSB0aGUgY29tbWVudCB0aGVyZSk6IGFcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZlYXR1cmUgbWF0Y2hpbmcgdGhpcyBvbmUgYWxyZWFkeSBleGlzdHMgaW4gdGhlIHRhcmdldCBzcGFjZSwgbW9zdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGlrZWx5IGZyb20gYW4gZWFybGllciwgaW5jb21wbGV0ZSBydW4uIEZpbGwgaW4gd2hhdGV2ZXIgaWRlbnRpdHlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpZWxkIGl0IGlzIG1pc3NpbmcgcmF0aGVyIHRoYW4gbGVhdmluZyBpdCB1bnRvdWNoZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50SWRzW3NvdXJjZU9iai5pZF0gPSBleGlzdGluZ01hdGNoLmlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGVhbGVkRmllbGRzID0gYXdhaXQgdGhpcy5oZWFsRmVhdHVyZUlkZW50aXR5KHNvdXJjZU9iaiBhcyBhbnksIGV4aXN0aW5nTWF0Y2ggYXMgYW55KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoZWFsZWRGaWVsZHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWxlZENvdW50Kys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dIZWFsZWRJdGVtKCdmZWF0dXJlSGVhbGVkJywgKHNvdXJjZU9iaiBhcyBhbnkpPy50aXRsZSB8fCBzb3VyY2VPYmo/LmlkLCBoZWFsZWRGaWVsZHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoaXRlbUVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yIGNvcHlpbmcgZmVhdHVyZSBcIiR7c291cmNlT2JqPy50aXRsZX1cIiAoaWQ6ICR7c291cmNlT2JqPy5pZH0pOmAsIGl0ZW1FcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yQ291bnQrKztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dDb3B5SXRlbUVycm9yKGl0ZW1FcnJvciwgJ2Vycm9yRmVhdHVyZScsIHNvdXJjZU9iaj8udGl0bGUgfHwgc291cmNlT2JqPy5pZCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcHJvY2Vzc2VkT3ZlcmFsbCsrO1xuICAgICAgICAgICAgICAgIGVtaXRQcm9ncmVzcygnZmVhdHVyZXMnLCBpICsgMSwgc291cmNlRmVhdHVyZXMubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBwY3QgPSBzb3VyY2VGZWF0dXJlcy5sZW5ndGggPiAwID8gTWF0aC5yb3VuZCgoKGkgKyAxKSAvIHNvdXJjZUZlYXR1cmVzLmxlbmd0aCkgKiAxMDApIDogMTAwO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RlcFByb2dyZXNzKCdmZWF0dXJlcycsICdmZWF0dXJlcycsIHBjdCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIE1FQVNVUkVNRU5UUyAoSU1NTyBvbmx5IOKAlCBhIENvbW1lbnQgKyBhIHBvc2l0aW9uYWwtb25seSBQT0ksIG5vIHJvdGF0aW9uO1xuICAgICAgICAgICAgLy8gdGhlIHNjcmVlbnNob3QgZmlsZSBpcyBwaHlzaWNhbGx5IGR1cGxpY2F0ZWQgaW4gUzMgZmlyc3QpXG4gICAgICAgICAgICBpZiAodGhpcy5zcE1vZHVsZSA9PSBTcE1vZHVsZS5JTU1PKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzb3VyY2VNZWFzdXJlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc291cmNlTWVhc3VyZW1lbnQgPSBzb3VyY2VNZWFzdXJlbWVudHNbaV07XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBleGlzdHNJblRhcmdldCA9IHRhcmdldE1lYXN1cmVtZW50cy5zb21lKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtID0+IHRtLmNvbW1lbnQudGl0bGUgPT09IHNvdXJjZU1lYXN1cmVtZW50LmNvbW1lbnQudGl0bGVcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleGlzdHNJblRhcmdldCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscmVhZHlQcmVzZW50Q291bnQrKztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZXhpc3RzSW5UYXJnZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByYXdDb21tZW50ID0gc291cmNlTWVhc3VyZW1lbnQuY29tbWVudCBhcyBhbnk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29waWVkQW5uZXhlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmF3Q29tbWVudC5hbm5leGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29waWVkQW5uZXhlID0gYXdhaXQgdGhpcy5jb3B5UzNLZXlJZlByZXNlbnQocmF3Q29tbWVudC5hbm5leGUsIGBtZWFzdXJlbWVudCBzY3JlZW5zaG90IFwiJHtyYXdDb21tZW50LnRpdGxlfVwiYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tbWVudElucHV0OiBhbnkgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiByYXdDb21tZW50LnRpdGxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogcmF3Q29tbWVudC5kZXNjcmlwdGlvbiA/PyBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YTogcmF3Q29tbWVudC5tZXRhZGF0YSA/PyBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBDb21tZW50VHlwZS5NRUFTVVJFLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaW1lbnNpb25zOiByYXdDb21tZW50LmRpbWVuc2lvbnMgfHwgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5uZXhlOiBjb3BpZWRBbm5leGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNlSUQ6IHRhcmdldFNwYWNlSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNhbWUgYXV0aG9yc2hpcCBydWxlIGFzIGV2ZXJ5IG90aGVyIGNvcGllZCBjb21tZW50IOKAlCBzZWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzb2x2ZUNvbW1lbnRPd25lcklEKCkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG93bmVySUQ6IHRoaXMucmVzb2x2ZUNvbW1lbnRPd25lcklEKHJhd0NvbW1lbnQub3duZXJJRCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNyZWF0ZWRDb21tZW50OiBDb21tZW50ID0gYXdhaXQgdGhpcy5jb21tZW50U2VydmljZS5jcmVhdGVDb21tZW50KGNvbW1lbnRJbnB1dCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3JlYXRlZENvbW1lbnQgJiYgKGNyZWF0ZWRDb21tZW50IGFzIGFueSkuaWQgJiYgcmF3Q29tbWVudC5pZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbW1lbnRJZHMuc2V0KHJhd0NvbW1lbnQuaWQsIChjcmVhdGVkQ29tbWVudCBhcyBhbnkpLmlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3JlYXRlZENvbW1lbnQgJiYgc291cmNlTWVhc3VyZW1lbnQucG9pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldFN3ZWVwSWQgPSB0aGlzLmZpbmRDbG9zZXN0VGFyZ2V0U3dlZXBJZChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZU1lYXN1cmVtZW50LnBvaS5tYXR0ZXJwb3J0U3dlZXBJRCwgc291cmNlTmF2UG9zaXRpb25zLCB0YXJnZXROYXZQb3NpdGlvbnMsIHRyYW5zZm9ybVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhZGp1c3RlZFBvc2l0aW9uID0gdGhpcy5nZXRBZGp1c3RlZFBvc2l0aW9uT25seShzb3VyY2VNZWFzdXJlbWVudC5wb2kuY29vcmRpbmF0ZSwgdHJhbnNmb3JtKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcG9pSW5wdXQ6IFBPSSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvb3JkaW5hdGU6IEpTT04uc3RyaW5naWZ5KGFkanVzdGVkUG9zaXRpb24pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogUG9pVHlwZS5NRUFTVVJFLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudElEOiAoY3JlYXRlZENvbW1lbnQgYXMgYW55KS5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNhbWUgdHJlYXRtZW50IGFzIGFueSBvdGhlciBQT0k6IHRoZSBzb3VyY2UncyBNYXR0ZXJwb3J0IHRhZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU0lEIG11c3Qgbm90IHRyYXZlbCwgYW5kIHRoZSBzdGVtIG5vcm1hbCBoYXMgdG8gYmUgcm90YXRlZC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhOiB0aGlzLmdldEFkanVzdGVkUG9pTWV0YWRhdGEoc291cmNlTWVhc3VyZW1lbnQucG9pLm1ldGFkYXRhLCB0cmFuc2Zvcm0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0dGVycG9ydFN3ZWVwSUQ6IHRhcmdldFN3ZWVwSWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wb2lTZXJ2aWNlLmNyZWF0ZVBPSUZvclNwYWNlSUQocG9pSW5wdXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoaXRlbUVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBFcnJvciBjb3B5aW5nIG1lYXN1cmVtZW50IFwiJHtzb3VyY2VNZWFzdXJlbWVudD8uY29tbWVudD8udGl0bGV9XCI6YCwgaXRlbUVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ291bnQrKztcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nQ29weUl0ZW1FcnJvcihpdGVtRXJyb3IsICdlcnJvck1lYXN1cmVtZW50Jywgc291cmNlTWVhc3VyZW1lbnQ/LmNvbW1lbnQ/LnRpdGxlIHx8IHNvdXJjZU1lYXN1cmVtZW50Py5pZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzZWRPdmVyYWxsKys7XG4gICAgICAgICAgICAgICAgICAgIGVtaXRQcm9ncmVzcygnbWVhc3VyZW1lbnRzJywgaSArIDEsIHNvdXJjZU1lYXN1cmVtZW50cy5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwY3QgPSBzb3VyY2VNZWFzdXJlbWVudHMubGVuZ3RoID4gMCA/IE1hdGgucm91bmQoKChpICsgMSkgLyBzb3VyY2VNZWFzdXJlbWVudHMubGVuZ3RoKSAqIDEwMCkgOiAxMDA7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RlcFByb2dyZXNzKCdtZWFzdXJlbWVudHMnLCAnbWVhc3VyZW1lbnRzJywgcGN0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFBPSVMg4oCUIHN0YW5kYWxvbmUgb25lcyBvbmx5OiBldmVyeSBQT0kgb3duZWQgYnkgYW4gZWxlbWVudCB3YXMgYWxyZWFkeSBjcmVhdGVkIGJ5XG4gICAgICAgICAgICAvLyB0aGF0IGVsZW1lbnQncyBwaGFzZSwgd2l0aCB0aGUgZWxlbWVudCdzIE5FVyBpZC5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBUaGlzIHBoYXNlIHJ1bnMgTEFTVCBvbiBwdXJwb3NlLiBJdCB1c2VkIHRvIHJ1biB0aGlyZCwgYmVmb3JlIDNEIG9iamVjdHMsIGZlYXR1cmVzXG4gICAgICAgICAgICAvLyBhbmQgbWVhc3VyZW1lbnRzIGV4aXN0ZWQgaW4gdGhlIHRhcmdldCBzcGFjZSwgc28gYGVsZW1lbnRJZHNgIGFuZCBgY29tbWVudElkc2Agd2VyZVxuICAgICAgICAgICAgLy8gc3RpbGwgZW1wdHkgd2hlbiBpdCBuZWVkZWQgdGhlbTogZWxlbWVudElEIHN0YXllZCBwb2ludGluZyBhdCB0aGUgc291cmNlIHNwYWNlIGFuZFxuICAgICAgICAgICAgLy8gdGFnSW1hZ2VJRCAoYSByZWZlcmVuY2UgdG8gYSBDb21tZW50IHJlY29yZCkgY291bGQgbmV2ZXIgYmUgcmVzb2x2ZWQuXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNvdXJjZVBvaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzb3VyY2VQb2kgPSBzb3VyY2VQb2lzW2ldO1xuXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ29tcGFyZWQgb24gdGhlIHBhcnNlZCBwb3NpdGlvbiwgd2hlcmUgdGhlIGNvcHkgV09VTEQgbGFuZDogdGhlIHN0b3JlZCBzdHJpbmdzXG4gICAgICAgICAgICAgICAgICAgIC8vIGRpZmZlciBpbiBmb3JtYXQgKCd7IFwieFwiOicgdnMgJ3tcInhcIjonKSBhbmQsIG9uY2UgbGFuZG1hcmtzIG1vdmUgdGhlIHRhZ3MsIHRoZVxuICAgICAgICAgICAgICAgICAgICAvLyBzb3VyY2Ugc3RyaW5nIG5ldmVyIGVxdWFscyBpdHMgY29weSdzLCBzbyBldmVyeSByZS1ydW4gZHVwbGljYXRlZCB0aGVzZSBQT0lzLlxuICAgICAgICAgICAgICAgICAgICBjb25zdCBleHBlY3RlZFBvc2l0aW9uID0gdGhpcy5wYXJzZUNvb3JkaW5hdGUodGhpcy5nZXRBZGp1c3RlZFBvc2l0aW9uT25seShcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZVBvaS5jb29yZGluYXRlLCB0cmFuc2Zvcm0pKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXhpc3RzSW5UYXJnZXQgPSB0YXJnZXRQb2lzLnNvbWUoXG4gICAgICAgICAgICAgICAgICAgICAgICB0cCA9PiB0cC50YWdEZXNjcmlwdGlvbiA9PT0gc291cmNlUG9pLnRhZ0Rlc2NyaXB0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgdGhpcy5pc1NhbWVQb3NpdGlvbih0aGlzLnBhcnNlQ29vcmRpbmF0ZSh0cC5jb29yZGluYXRlKSwgZXhwZWN0ZWRQb3NpdGlvbilcbiAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoZXhpc3RzSW5UYXJnZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFscmVhZHlQcmVzZW50Q291bnQrKztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIWV4aXN0c0luVGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50SUQgPSBzb3VyY2VQb2kuZWxlbWVudElEXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAoZWxlbWVudElkc1tzb3VyY2VQb2kuZWxlbWVudElEXSB8fCBzb3VyY2VQb2kuZWxlbWVudElEKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogc291cmNlUG9pLmVsZW1lbnRJRDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jcmVhdGVDb3BpZWRQb2koXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlUG9pLCBlbGVtZW50SUQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlTmF2UG9zaXRpb25zLCB0YXJnZXROYXZQb3NpdGlvbnMsIHRyYW5zZm9ybVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGl0ZW1FcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBFcnJvciBjb3B5aW5nIFBPSSAoc3dlZXA6ICR7c291cmNlUG9pPy5tYXR0ZXJwb3J0U3dlZXBJRH0pOmAsIGl0ZW1FcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yQ291bnQrKztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dDb3B5SXRlbUVycm9yKGl0ZW1FcnJvciwgJ2Vycm9yUG9pJywgc291cmNlUG9pPy5tYXR0ZXJwb3J0U3dlZXBJRCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3dlZXA6IHNvdXJjZVBvaT8ubWF0dGVycG9ydFN3ZWVwSURcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcHJvY2Vzc2VkT3ZlcmFsbCsrO1xuICAgICAgICAgICAgICAgIGVtaXRQcm9ncmVzcygncG9pcycsIGkgKyAxLCBzb3VyY2VQb2lzLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgY29uc3QgcGN0ID0gc291cmNlUG9pcy5sZW5ndGggPiAwID8gTWF0aC5yb3VuZCgoKGkgKyAxKSAvIHNvdXJjZVBvaXMubGVuZ3RoKSAqIDEwMCkgOiAxMDA7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTdGVwUHJvZ3Jlc3MoJ3BvaXMnLCAncG9pcycsIHBjdCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuY29weVByb2dyZXNzJC5uZXh0KHtcbiAgICAgICAgICAgICAgICBwaGFzZTogJ2RvbmUnLFxuICAgICAgICAgICAgICAgIHByb2Nlc3NlZEluUGhhc2U6IDAsIHRvdGFsSW5QaGFzZTogMCxcbiAgICAgICAgICAgICAgICBwcm9jZXNzZWRPdmVyYWxsLCB0b3RhbE92ZXJhbGwsXG4gICAgICAgICAgICAgICAgcGVyY2VudDogMTAwLCBlcnJvckNvdW50LCBoZWFsZWRDb3VudFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnNldFN0ZXBMb2coJ2RvbmUnLCBlcnJvckNvdW50ID4gMFxuICAgICAgICAgICAgICAgID8gdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnbWF0dGVycG9ydENvcHkuZG9uZVdpdGhFcnJvcnMnLCB7IGNvdW50OiBlcnJvckNvdW50IH0pXG4gICAgICAgICAgICAgICAgOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdtYXR0ZXJwb3J0Q29weS5kb25lJykpO1xuICAgICAgICAgICAgLy8gU2VwYXJhdGUgc3VtbWFyeSBsaW5lLCBvbiB0b3Agb2YgKG5vdCBpbnN0ZWFkIG9mKSB0aGUgZG9uZS9kb25lV2l0aEVycm9ycyBvbmVcbiAgICAgICAgICAgIC8vIGFib3ZlOiBoZWFsaW5nIGlzIG9ydGhvZ29uYWwgdG8gc3VjY2Vzcy9mYWlsdXJlLCBhbiBhbHJlYWR5LWNvbXBsZXRlIHJ1biBjYW5cbiAgICAgICAgICAgIC8vIHN0aWxsIGhhdmUgcmVwYWlyZWQgaXRlbXMgbGVmdCBvdmVyIGZyb20gYW4gZWFybGllciwgaW5jb21wbGV0ZSBhdHRlbXB0LlxuICAgICAgICAgICAgaWYgKGhlYWxlZENvdW50ID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RlcExvZygnaGVhbGVkU3VtbWFyeScsIHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ21hdHRlcnBvcnRDb3B5LmhlYWxlZFN1bW1hcnknLCB7IGNvdW50OiBoZWFsZWRDb3VudCB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBTYXlzIHBsYWlubHkgdGhhdCBhIHJlLXJ1biBjcmVhdGVkIG5vdGhpbmcgbmV3LCBpbnN0ZWFkIG9mIGEgYmFyZSBcInN1Y2Nlc3NcIi5cbiAgICAgICAgICAgIGlmIChhbHJlYWR5UHJlc2VudENvdW50ID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RlcExvZygnYWxyZWFkeVByZXNlbnRTdW1tYXJ5JyxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnbWF0dGVycG9ydENvcHkuYWxyZWFkeVByZXNlbnRTdW1tYXJ5JywgeyBjb3VudDogYWxyZWFkeVByZXNlbnRDb3VudCB9KSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgY29weWluZyBQT0lzOicsIGVycm9yKTtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kRXJyb3JMb2codGhpcy50cmFuc2xhdGUuaW5zdGFudCgnbWF0dGVycG9ydENvcHkuZXJyb3JHZW5lcmFsJywgeyBlcnJvcjogdG9FcnJvck1lc3NhZ2UoZXJyb3IpIH0pKTtcbiAgICAgICAgICAgIHRoaXMuY29weVByb2dyZXNzJC5uZXh0KG51bGwpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgLy8gRXZlcnkgZXhpdCBwYXRoIOKAlCBzdWNjZXNzLCBwYXJ0aWFsIHN1Y2Nlc3MsIG9yIGdlbmVyYWwgZmFpbHVyZSDigJQgZ2l2ZXMgYmFjayB0aGVcbiAgICAgICAgICAgIC8vIGtleXdvcmRzIHRoaXMgcnVuIGNyZWF0ZWQgYnV0IG5vIGNvcGllZCBQT0kgZW5kZWQgdXAgdXNpbmcuIFBsYWNlZCBpbiBgZmluYWxseWBcbiAgICAgICAgICAgIC8vIHNvIGFuIGV4Y2VwdGlvbiB0aHJvd24gbWlkLWNvcHkgY2Fubm90IGxlYXZlIHRoZW0gYmVoaW5kIGVpdGhlci5cbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY2xlYW51cFVudXNlZENyZWF0ZWRIYXNodGFncygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VyaWFsaXNlcyB0aGUgY3VycmVudCBjb3B5IGxvZyAoc3RlcCBsaW5lcyBhcyBsYXN0IGVtaXR0ZWQsIHBsdXMgZXZlcnkgZXJyb3IgYW5kXG4gICAgICogaGVhbGVkLWl0ZW0gbm90aWNlKSB0byBhIHBsYWluLXRleHQgZmlsZSBhbmQgdHJpZ2dlcnMgYSBicm93c2VyIGRvd25sb2FkIOKAlCB3aXJlZCB0byBhXG4gICAgICogXCJkb3dubG9hZCBsb2dcIiBidXR0b24gaW4gdGhlIGNvcHkgVUksIHNvIGFuIG9wZXJhdG9yIGNhbiBrZWVwIG9yIHNoYXJlIHRoZSBmdWxsIHJlcG9ydFxuICAgICAqIG9mIGEgcnVuIHJhdGhlciB0aGFuIG9ubHkgdGhlIH4yMDBweCBzY3JvbGxhYmxlIHBhbmVsIHNob3dpbmcgaXQuXG4gICAgICovXG4gICAgZG93bmxvYWRMb2coZmlsZW5hbWU/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdGV4dCA9IHRoaXMubG9nLm1hcChlbnRyeSA9PiBlbnRyeS50ZXh0KS5qb2luKCdcXG4nKTtcbiAgICAgICAgY29uc3QgZGVmYXVsdE5hbWUgPSBgbWF0dGVycG9ydC1jb3B5LWxvZy0ke25ldyBEYXRlKCkudG9JU09TdHJpbmcoKS5yZXBsYWNlKC9bOi5dL2csICctJyl9LnR4dGA7XG4gICAgICAgIGRvd25sb2FkQmxvYihuZXcgQmxvYihbdGV4dF0sIHsgdHlwZTogJ3RleHQvcGxhaW47Y2hhcnNldD11dGYtOCcgfSksIGZpbGVuYW1lIHx8IGRlZmF1bHROYW1lKTtcbiAgICB9XG5cbiAgICAvL1xuICAgIC8vIC0tLS0tLS0tLS0gUHJvZ3Jlc3MgLyBsb2cgaGVscGVycyAtLS0tLS0tLS0tXG4gICAgLy9cblxuICAgIC8qKiBBZGRzIG9yIHVwZGF0ZXMgYSBzdGVwIGxpbmUgKGlkZW50aWZpZWQgYnkgc3RlcElkKSB3aXRoIG5ldyB0ZXh0LCB0aGVuIHJlcHVibGlzaGVzIHRoZSBsb2cuICovXG4gICAgcHJpdmF0ZSBzZXRTdGVwTG9nKHN0ZXBJZDogc3RyaW5nLCB0ZXh0OiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgZXhpc3RpbmdJbmRleCA9IHRoaXMubG9nLmZpbmRJbmRleChlID0+IGUudHlwZSA9PT0gJ3N0ZXAnICYmIGUuaWQgPT09IHN0ZXBJZCk7XG4gICAgICAgIGNvbnN0IGVudHJ5OiBDb3B5TG9nRW50cnkgPSB7IGlkOiBzdGVwSWQsIHR5cGU6ICdzdGVwJywgdGV4dCB9O1xuICAgICAgICBpZiAoZXhpc3RpbmdJbmRleCA+PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ1tleGlzdGluZ0luZGV4XSA9IGVudHJ5O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5sb2cucHVzaChlbnRyeSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb3B5TG9nJC5uZXh0KFsuLi50aGlzLmxvZ10pO1xuICAgIH1cblxuICAgIC8qKiBBcHBlbmRzIGEgbmV3LCBwZXJtYW5lbnQgbG9nIGxpbmUgKG5ldmVyIG92ZXJ3cml0dGVuKSwgdGhlbiByZXB1Ymxpc2hlcyB0aGUgbG9nLiAqL1xuICAgIHByaXZhdGUgYXBwZW5kRXJyb3JMb2codGV4dDogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMubG9nU2VxKys7XG4gICAgICAgIHRoaXMubG9nLnB1c2goeyBpZDogYGVycm9yLSR7dGhpcy5sb2dTZXF9YCwgdHlwZTogJ2Vycm9yJywgdGV4dCB9KTtcbiAgICAgICAgdGhpcy5jb3B5TG9nJC5uZXh0KFsuLi50aGlzLmxvZ10pO1xuICAgIH1cblxuICAgIC8qKiBBcHBlbmRzIGEgcGVybWFuZW50IGxvZyBsaW5lIGZvciBhbiBpdGVtIHRoYXQgd2FzIHJlcGFpcmVkIHJhdGhlciB0aGFuIG5ld2x5XG4gICAgICogIGNyZWF0ZWQg4oCUIHNlZSBoZWFsRXF1aXBtZW50SWRlbnRpdHkoKSBhbmQgaXRzIHRpY2tldC9mZWF0dXJlIGVxdWl2YWxlbnRzLiAqL1xuICAgIHByaXZhdGUgYXBwZW5kSGVhbGVkTG9nKHRleHQ6IHN0cmluZykge1xuICAgICAgICB0aGlzLmxvZ1NlcSsrO1xuICAgICAgICB0aGlzLmxvZy5wdXNoKHsgaWQ6IGBoZWFsZWQtJHt0aGlzLmxvZ1NlcX1gLCB0eXBlOiAnaGVhbGVkJywgdGV4dCB9KTtcbiAgICAgICAgdGhpcy5jb3B5TG9nJC5uZXh0KFsuLi50aGlzLmxvZ10pO1xuICAgIH1cblxuICAgIC8qKiBSZXNldHMgdGhlIGxvZyBmb3IgYSBuZXcgcnVuLiAqL1xuICAgIHByaXZhdGUgcmVzZXRMb2coKSB7XG4gICAgICAgIHRoaXMubG9nID0gW107XG4gICAgICAgIHRoaXMubG9nU2VxID0gMDtcbiAgICAgICAgdGhpcy5jb3B5TG9nJC5uZXh0KFtdKTtcbiAgICB9XG5cbiAgICAvKiogQ2xlYXJzIGV2ZXJ5IGlkIG1hcCBjYXJyaWVkIG92ZXIgZnJvbSBhIHByZXZpb3VzIHJ1bi4gVGhlIHNlcnZpY2UgaXMgYSByb290LWxldmVsXG4gICAgICogIHNpbmdsZXRvbiwgc28gbGVmdG92ZXIgbWFwcGluZ3Mgd291bGQgc2lsZW50bHkgbGluayBhIG5ldyBjb3B5IHRvIHJlY29yZHMgY3JlYXRlZFxuICAgICAqICBkdXJpbmcgdGhlIHByZXZpb3VzIG9uZS4gKi9cbiAgICBwcml2YXRlIHJlc2V0UnVuU3RhdGUodGFyZ2V0U3BhY2VJZDogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuZWxlbWVudElkcyA9IHt9O1xuICAgICAgICB0aGlzLmNvbW1lbnRJZHMgPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXMuc291cmNlSGFzaHRhZ05hbWVzID0gbmV3IE1hcCgpO1xuICAgICAgICB0aGlzLnRhcmdldEhhc2h0YWdJZHNCeU5hbWUgPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXMuY3JlYXRlZEhhc2h0YWdJZHMgPSBuZXcgU2V0KCk7XG4gICAgICAgIHRoaXMudXNlZEhhc2h0YWdJZHMgPSBuZXcgU2V0KCk7XG4gICAgICAgIHRoaXMuaGFuZGxlZEVsZW1lbnRJZHMgPSBuZXcgU2V0KCk7XG4gICAgICAgIHRoaXMuc291cmNlTWlzc2lvblVzZXJJZHMgPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXMudGFyZ2V0TWlzc2lvbklkc0J5VXNlcklkID0gbmV3IE1hcCgpO1xuICAgICAgICB0aGlzLmRvbWFpbnNCeUlkID0gbmV3IE1hcCgpO1xuICAgICAgICB0aGlzLnRhcmdldFZpc2libGVEb21haW5PcmdJZHMgPSBuZXcgU2V0KCk7XG4gICAgICAgIHRoaXMudGFyZ2V0RG9tYWluSWRzQnlUeXBlQW5kTmFtZSA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpcy50YXJnZXRTcGFjZUlkID0gdGFyZ2V0U3BhY2VJZDtcbiAgICB9XG5cbiAgICAvKiogQnVpbGRzIGFuZCBzZXRzIGEgc3RlcCdzIGxvZyBsaW5lIGFzIFwiPHRyYW5zbGF0ZWQgbGFiZWw+OiA8cGVyY2VudD4lXCIsIG5vIHN0ZXAgbnVtYmVyaW5nLiAqL1xuICAgIHByaXZhdGUgc2V0U3RlcFByb2dyZXNzKHN0ZXBJZDogc3RyaW5nLCB0cmFuc2xhdGlvbktleTogc3RyaW5nLCBwZXJjZW50OiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgbGFiZWwgPSB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGBtYXR0ZXJwb3J0Q29weS4ke3RyYW5zbGF0aW9uS2V5fWApO1xuICAgICAgICB0aGlzLnNldFN0ZXBMb2coc3RlcElkLCBgJHtsYWJlbH06ICR7cGVyY2VudH0lYCk7XG4gICAgfVxuXG4gICAgLyoqIExvZ3MgYSB0cmFuc2xhdGVkLCBwYXJhbWV0ZXJpemVkIGVycm9yIGxpbmUgZm9yIGEgc2luZ2xlIGZhaWxlZCBpdGVtLiAqL1xuICAgIHByaXZhdGUgbG9nSXRlbUVycm9yKHRyYW5zbGF0aW9uS2V5OiBzdHJpbmcsIHBhcmFtczogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgICAgICBjb25zdCB0ZXh0ID0gdGhpcy50cmFuc2xhdGUuaW5zdGFudChgbWF0dGVycG9ydENvcHkuJHt0cmFuc2xhdGlvbktleX1gLCBwYXJhbXMpO1xuICAgICAgICB0aGlzLmFwcGVuZEVycm9yTG9nKHRleHQpO1xuICAgIH1cblxuICAgIC8qKiBMb2dzIGEgdHJhbnNsYXRlZCBsaW5lIGZvciBhbiBpdGVtIHRoYXQgYWxyZWFkeSBleGlzdGVkIGluIHRoZSB0YXJnZXQgc3BhY2UgYW5kIGhhZFxuICAgICAqICBpdHMgbWlzc2luZyBpZGVudGl0eSBmaWVsZHMgZmlsbGVkIGluLCBzbyB0aGUgb3BlcmF0b3IgY2FuIHRlbGwgaXQgYXBhcnQgZnJvbSBhXG4gICAgICogIGZyZXNobHkgY3JlYXRlZCBpdGVtIGluIHRoZSBjb3B5IHJlcG9ydC4gKi9cbiAgICBwcml2YXRlIGxvZ0hlYWxlZEl0ZW0odHJhbnNsYXRpb25LZXk6IHN0cmluZywgaXRlbUxhYmVsOiBzdHJpbmcsIGhlYWxlZEZpZWxkczogc3RyaW5nW10pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdGV4dCA9IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYG1hdHRlcnBvcnRDb3B5LiR7dHJhbnNsYXRpb25LZXl9YCwge1xuICAgICAgICAgICAgbmFtZTogaXRlbUxhYmVsLFxuICAgICAgICAgICAgZmllbGRzOiBoZWFsZWRGaWVsZHMuam9pbignLCAnKVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5hcHBlbmRIZWFsZWRMb2codGV4dCk7XG4gICAgfVxuXG4gICAgLyoqIExvZ3MgYW4gaXRlbS1sZXZlbCBlcnJvciwgdXNpbmcgYSBzcGVjaWZpYyBcIm1pc3NpbmcgZmlsZSAvIG9ycGhhbmVkIHJlZmVyZW5jZVwiXG4gICAgICogIHRyYW5zbGF0aW9uIGtleSB3aGVuIHRoZSBjYXVzZSBpcyBhIE1pc3NpbmdTM0ZpbGVFcnJvciwgYW5kIHRoZSBnZW5lcmljIHBlci10eXBlXG4gICAgICogIGtleSBvdGhlcndpc2UuIEtlZXBzIHRoZSBjb3B5IGxvZyByZWFkYWJsZTogYSBtaXNzaW5nIGZpbGUgaXMgbm90IGEgYnVnIHRvXG4gICAgICogIGludmVzdGlnYXRlIHRoZSBzYW1lIHdheSBhIG5ldHdvcmsvcGVybWlzc2lvbiBlcnJvciBpcy5cbiAgICAgKiAgYGV4dHJhUGFyYW1zYCBjYXJyaWVzIHRoZSBwbGFjZWhvbGRlcnMgYSBmZXcga2V5cyBuZWVkIG9uIHRvcCBvZiB7e25hbWV9fS97e2Vycm9yfX1cbiAgICAgKiAgKGUuZy4gZXJyb3JGZWF0dXJlQXR0YWNobWVudCdzIHt7ZmVhdHVyZX19LCBlcnJvclBvaSdzIHt7c3dlZXB9fSksIHdoaWNoIHVzZWQgdG8gYmVcbiAgICAgKiAgcmVuZGVyZWQgYXMgcmF3IFwie3tmZWF0dXJlfX1cIiB0ZXh0IGluIHRoZSBsb2cuICovXG4gICAgcHJpdmF0ZSBsb2dDb3B5SXRlbUVycm9yKFxuICAgICAgICBlcnJvcjogdW5rbm93bixcbiAgICAgICAgZ2VuZXJpY0tleTogc3RyaW5nLFxuICAgICAgICBpdGVtTGFiZWw6IHN0cmluZyxcbiAgICAgICAgZXh0cmFQYXJhbXM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fVxuICAgICkge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBNaXNzaW5nUzNGaWxlRXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMubG9nSXRlbUVycm9yKCdlcnJvck1pc3NpbmdTM0ZpbGVTa2lwcGVkJywge1xuICAgICAgICAgICAgICAgIC4uLmV4dHJhUGFyYW1zLFxuICAgICAgICAgICAgICAgIG5hbWU6IGl0ZW1MYWJlbCxcbiAgICAgICAgICAgICAgICBmaWxlOiBlcnJvci5zb3VyY2VLZXlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5sb2dJdGVtRXJyb3IoZ2VuZXJpY0tleSwgeyAuLi5leHRyYVBhcmFtcywgbmFtZTogaXRlbUxhYmVsLCBlcnJvcjogdG9FcnJvck1lc3NhZ2UoZXJyb3IpIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTnVsbC1zYWZlIGVxdWl2YWxlbnQgb2YgRmVhdHVyZVNlcnZpY2UuaXNBcmNoaXZlZCgpOiB0cnVlIHdoZW4gdGhlIG9wZXJhdG9yIGhhcyBhcmNoaXZlZFxuICAgICAqIHRoaXMgZmVhdHVyZSBvbiB0aGF0IHNwYWNlLiBcIk5vIG1pc3Npb24gb24gdGhlIHNwYWNlXCIgYW5zd2VycyBmYWxzZSAobm90aGluZyBhcmNoaXZlZClcbiAgICAgKiBpbnN0ZWFkIG9mIHRocm93aW5nLCB3aGljaCBpcyB3aGF0IG1hZGUgYSBjb3B5IGZyb20gYSBzcGFjZSB0aGUgb3BlcmF0b3IgaXMgbm90IGEgbWVtYmVyXG4gICAgICogb2YgZmFpbCBvdXRyaWdodC5cbiAgICAgKi9cbiAgICBwcml2YXRlIGlzQXJjaGl2ZWRGb3JPcGVyYXRvcihmZWF0dXJlOiBGZWF0dXJlLCBzcGFjZUlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgYXJjaGl2ZWRGb3IgPSBmZWF0dXJlPy5hcmNoaXZlZEZvck1pc3Npb25JRDtcbiAgICAgICAgaWYgKCFhcmNoaXZlZEZvciB8fCBhcmNoaXZlZEZvci5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtaXNzaW9uID0gdGhpcy51c2VyU2VydmljZS5jdXJyZW50TWlzc2lvbihzcGFjZUlkKTtcbiAgICAgICAgcmV0dXJuIG1pc3Npb24/LmlkID8gYXJjaGl2ZWRGb3IuaW5jbHVkZXMobWlzc2lvbi5pZCkgOiBmYWxzZTtcbiAgICB9XG5cbiAgICAvL1xuICAgIC8vIC0tLS0tLS0tLS0gQ3Jvc3Mtc3BhY2UgcmVmZXJlbmNlIHJlbWFwcGluZyAtLS0tLS0tLS0tXG4gICAgLy9cblxuICAgIC8qKiBOb3JtYWxpc2VkIGxvb2t1cCBrZXkgZm9yIGEgZG9tYWluOiB0eXBlIGRpc2FtYmlndWF0ZXMgc2FtZS1uYW1lZCBkb21haW5zIHVzZWQgZm9yXG4gICAgICogIGRpZmZlcmVudCBwdXJwb3NlcyAoZXF1aXBtZW50IHZzLiB0aWNrZXQgdnMuIGZlYXR1cmUgY2F0ZWdvcmllcywgLi4uKS4gKi9cbiAgICBwcml2YXRlIGRvbWFpbktleSh0eXBlOiBhbnksIG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBgJHt0eXBlIHx8ICcnfTo6JHsobmFtZSB8fCAnJykudHJpbSgpLnRvTG93ZXJDYXNlKCl9YDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSRUFELU9OTFkgaW5kZXhpbmcgb2YgZXZlcnkgZG9tYWluIGVpdGhlciBvcGVyYXRvcidzIE1pc3Npb24gY2FuIHNlZS4gQ3JlYXRlc1xuICAgICAqIG5vdGhpbmcg4oCUIHVubGlrZSBoYXNodGFncywgYSBkb21haW4gaXMgYSBidXNpbmVzcyB0YXhvbm9teSBlbnRyeSBhbiBvcGVyYXRvciBtYW5hZ2VzXG4gICAgICogZGVsaWJlcmF0ZWx5OyB0aGlzIHRvb2wgb25seSBldmVyIHJldXNlcyBhbiBFWElTVElORyBlcXVpdmFsZW50LCBpdCBuZXZlciBpbnZlbnRzIG9uZS5cbiAgICAgKlxuICAgICAqIFZpc2liaWxpdHkgaXMga2V5ZWQgdG8gYGN1cnJlbnRNaXNzaW9uKHNwYWNlSWQpLm9yZ2FuaXNhdGlvbklEYCAvXG4gICAgICogYC5vcmRlcmVkT3JnYW5pc2F0aW9uSURgIGZvciBFQUNIIHNwYWNlIOKAlCBleGFjdGx5IHdoYXRcbiAgICAgKiBgRG9tYWluU2VydmljZS5nZXREb21haW5zRm9yT3JnRm9yVHlwZSgpYCB1c2VzIHRvIHBvcHVsYXRlIHRoZSBjYXRlZ29yeSBkcm9wZG93biBvblxuICAgICAqIHRoZSBlcXVpcG1lbnQvdGlja2V0L2ZlYXR1cmUgZWRpdCBmb3JtcyAoc2VlIGZvcm0tZXF1aXBtZW50LmNvbXBvbmVudC50cyxcbiAgICAgKiBiYXRjaC1lZGl0LWVxdWlwbWVudC5jb21wb25lbnQudHMsIGZvcm0tZmVhdHVyZS5jb21wb25lbnQudHMpLiBDb21wYXJpbmcgdGhlIHNwYWNlcydcbiAgICAgKiBPV04gYG9yZ2FuaXNhdGlvbklEYCBpbnN0ZWFkIOKAlCB0aGUgcHJldmlvdXMgYXBwcm9hY2gg4oCUIG1pc3NlZCBldmVyeSBkb21haW4gcmVhY2hhYmxlXG4gICAgICogb25seSB0aHJvdWdoIHRoZSBvcGVyYXRvcidzIGBvcmRlcmVkT3JnYW5pc2F0aW9uSURgIChzZXQgd2hlbiBhIG1pc3Npb24gaXMgY3JlYXRlZCBcIm9uXG4gICAgICogYmVoYWxmIG9mXCIgYW5vdGhlciBvcmdhbmlzYXRpb24g4oCUIHNlZSBmb3JtLW1pc3Npb24uY29tcG9uZW50LnRzKSwgd2hpY2ggaXMgZXhhY3RseSBob3dcbiAgICAgKiBhIGRvbWFpbiBlbmRzIHVwIHZpc2libGUgb24gdHdvIHNwYWNlcyB0aGF0IGJlbG9uZyB0byBkaWZmZXJlbnQgb3JnYW5pc2F0aW9ucy5cbiAgICAgKi9cbiAgICBwcml2YXRlIGFzeW5jIGxvYWREb21haW5JbmRleChzb3VyY2VTcGFjZUlkOiBzdHJpbmcsIHRhcmdldFNwYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBzb3VyY2VNaXNzaW9uID0gdGhpcy51c2VyU2VydmljZS5jdXJyZW50TWlzc2lvbihzb3VyY2VTcGFjZUlkKTtcbiAgICAgICAgY29uc3QgdGFyZ2V0TWlzc2lvbiA9IHRoaXMudXNlclNlcnZpY2UuY3VycmVudE1pc3Npb24odGFyZ2V0U3BhY2VJZCk7XG5cbiAgICAgICAgY29uc3Qgc291cmNlT3JnSWRzID0gW3NvdXJjZU1pc3Npb24/Lm9yZ2FuaXNhdGlvbklELCBzb3VyY2VNaXNzaW9uPy5vcmRlcmVkT3JnYW5pc2F0aW9uSURdXG4gICAgICAgICAgICAuZmlsdGVyKChpZCk6IGlkIGlzIHN0cmluZyA9PiAhIWlkKTtcbiAgICAgICAgY29uc3QgdGFyZ2V0T3JnSWRzID0gW3RhcmdldE1pc3Npb24/Lm9yZ2FuaXNhdGlvbklELCB0YXJnZXRNaXNzaW9uPy5vcmRlcmVkT3JnYW5pc2F0aW9uSURdXG4gICAgICAgICAgICAuZmlsdGVyKChpZCk6IGlkIGlzIHN0cmluZyA9PiAhIWlkKTtcbiAgICAgICAgdGhpcy50YXJnZXRWaXNpYmxlRG9tYWluT3JnSWRzID0gbmV3IFNldCh0YXJnZXRPcmdJZHMpO1xuXG4gICAgICAgIGNvbnN0IGFsbE9yZ0lkcyA9IEFycmF5LmZyb20obmV3IFNldChbLi4uc291cmNlT3JnSWRzLCAuLi50YXJnZXRPcmdJZHNdKSk7XG4gICAgICAgIGlmIChhbGxPcmdJZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAvLyBUaGUgb3BlcmF0b3IgaGFzIG5vIG1pc3Npb24gb24gZWl0aGVyIHNwYWNlIOKAlCBub3RoaW5nIHRvIHJlc29sdmUgYWdhaW5zdDtcbiAgICAgICAgICAgIC8vIGV2ZXJ5IGRvbWFpbklEIHdpbGwgYmUgZHJvcHBlZCwgc2FtZSBhcyBhbiB1bnJlc29sdmFibGUgbG9va3VwIGVsc2V3aGVyZS5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBkb21haW5MaXN0cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgICAgICAgIGFsbE9yZ0lkcy5tYXAob3JnSWQgPT4gdGhpcy5kb21haW5TZXJ2aWNlLmdldEFsbEdlbmVyaWNEb21haW5zQW5kRm9yT3JnYW5pc2F0aW9uKG9yZ0lkKSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGxpc3Qgb2YgZG9tYWluTGlzdHMpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGRvbWFpbiBvZiBsaXN0IHx8IFtdKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkb21haW4/LmlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRvbWFpbnNCeUlkLnNldChkb21haW4uaWQsIGRvbWFpbik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ1tNYXR0ZXJwb3J0VGFnQ29weVNlcnZpY2VdIENvdWxkIG5vdCByZWFkIHRoZSBkb21haW5zLCBjcm9zcy1vcmdhbmlzYXRpb24gY2F0ZWdvcmllcyB3aWxsIGJlIGRyb3BwZWQ6JywgZXJyb3IpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBkb21haW4gb2YgdGhpcy5kb21haW5zQnlJZC52YWx1ZXMoKSkge1xuICAgICAgICAgICAgY29uc3QgdmlzaWJsZVRvVGFyZ2V0ID0gIWRvbWFpbi5vcmdhbmlzYXRpb25JRCB8fCB0aGlzLnRhcmdldFZpc2libGVEb21haW5PcmdJZHMuaGFzKGRvbWFpbi5vcmdhbmlzYXRpb25JRCk7XG4gICAgICAgICAgICBpZiAodmlzaWJsZVRvVGFyZ2V0ICYmIGRvbWFpbi5uYW1lKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50YXJnZXREb21haW5JZHNCeVR5cGVBbmROYW1lLnNldCh0aGlzLmRvbWFpbktleShkb21haW4udHlwZSwgZG9tYWluLm5hbWUpLCBkb21haW4uaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzb2x2ZXMgYSBzb3VyY2UgZG9tYWluSUQgKGVxdWlwbWVudC90aWNrZXQvZmVhdHVyZS9QT0kgY2F0ZWdvcnkpIGZvciB1c2UgaW4gdGhlXG4gICAgICogdGFyZ2V0IHNwYWNlLlxuICAgICAqXG4gICAgICogIC0gZ2VuZXJpYyBkb21haW4gKG5vIG9yZ2FuaXNhdGlvbklEIG9mIGl0cyBvd24g4oCUIGEgc2hhcmVkIHRheG9ub215IGVudHJ5LCBlLmcuIGFcbiAgICAgKiAgICBzdGFuZGFyZCBjYXRlZ29yeSBjcmVhdGVkIGJ5IHRoZSBwbGF0Zm9ybSk6IHJldXNlZCB1bmNoYW5nZWQsIHZhbGlkIGV2ZXJ5d2hlcmUuXG4gICAgICogIC0gdGhlIGRvbWFpbidzIG93biBvcmdhbmlzYXRpb25JRCBpcyBhbHJlYWR5IG9uZSB0aGUgVEFSR0VUIG9wZXJhdG9yJ3MgbWlzc2lvbiBjYW5cbiAgICAgKiAgICBzZWUgKGl0cyBvcmdhbmlzYXRpb25JRCwgb3IgaXRzIG9yZGVyZWRPcmdhbmlzYXRpb25JRCk6IHJldXNlZCB1bmNoYW5nZWQgdG9vIOKAlCB0aGVcbiAgICAgKiAgICBpZCBpcyBkaXJlY3RseSBzZWxlY3RhYmxlIGluIHRoZSB0YXJnZXQgc3BhY2UncyBvd24gZHJvcGRvd24gYXMtaXMuXG4gICAgICogIC0gb3RoZXJ3aXNlOiBtYXRjaGVkIGJ5ICh0eXBlLCBuYW1lKSBhZ2FpbnN0IHRoZSBkb21haW5zIHZpc2libGUgdG8gdGhlIFRBUkdFVFxuICAgICAqICAgIG9wZXJhdG9yIChsb2FkRG9tYWluSW5kZXgoKSk7IGRyb3BwZWQgd2hlbiBubyBlcXVpdmFsZW50IGV4aXN0cyB0aGVyZS5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlc29sdmVEb21haW5JRChzb3VyY2VEb21haW5JZDogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICBpZiAoIXNvdXJjZURvbWFpbklkKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRvbWFpbiA9IHRoaXMuZG9tYWluc0J5SWQuZ2V0KHNvdXJjZURvbWFpbklkKTtcbiAgICAgICAgaWYgKCFkb21haW4pIHtcbiAgICAgICAgICAgIC8vIE5vdCB2aXNpYmxlIHRvIGVpdGhlciBvcGVyYXRvcidzIG1pc3Npb24gKGxvb2t1cCBmYWlsZWQsIG9yIGl0IGJlbG9uZ3MgdG9cbiAgICAgICAgICAgIC8vIG5laXRoZXIpIOKAlCB1bmNoYW5nZWQsIHNhZmVzdCB0byBkcm9wLlxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFkb21haW4ub3JnYW5pc2F0aW9uSUQgfHwgdGhpcy50YXJnZXRWaXNpYmxlRG9tYWluT3JnSWRzLmhhcyhkb21haW4ub3JnYW5pc2F0aW9uSUQpKSB7XG4gICAgICAgICAgICByZXR1cm4gc291cmNlRG9tYWluSWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMudGFyZ2V0RG9tYWluSWRzQnlUeXBlQW5kTmFtZS5nZXQodGhpcy5kb21haW5LZXkoZG9tYWluLnR5cGUsIGRvbWFpbi5uYW1lKSkgPz8gbnVsbDtcbiAgICB9XG5cbiAgICAvKiogTm9ybWFsaXNlZCBsb29rdXAga2V5IGZvciBhIGhhc2h0YWcgbmFtZSwgc28gXCJNb3llbiDDgmdlXCIgYW5kIFwibW95ZW4gw6JnZSBcIiBtYXRjaC4gKi9cbiAgICBwcml2YXRlIGhhc2h0YWdLZXkobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIG5hbWUudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUkVBRC1PTkxZIGluZGV4aW5nIG9mIGJvdGggc3BhY2VzJyBoYXNodGFncy4gQ3JlYXRlcyBub3RoaW5nLlxuICAgICAqXG4gICAgICogYEZlYXR1cmUuaGFzaHRhZ3NgIHN0b3JlcyBIYXNodGFnICppZHMqLCBhbmQgYSBIYXNodGFnIGlzIGEgcGVyLXNwYWNlIHJlY29yZCwgc28gdGhlXG4gICAgICogaWRzIGhhdmUgdG8gYmUgdHJhbnNsYXRlZCBieSBuYW1lLiBUaGUgdHJhbnNsYXRpb24gdGFibGUgaXMgYnVpbHQgaGVyZTsgdGhlIG1pc3NpbmdcbiAgICAgKiBrZXl3b3JkcyBhcmUgY3JlYXRlZCBsYXRlciwgb25lIGF0IGEgdGltZSwgb25seSB3aGVuIGEgUE9JIHRoYXQgYWN0dWFsbHkgdXNlcyB0aGVtIGlzXG4gICAgICogYWJvdXQgdG8gYmUgd3JpdHRlbiAoc2VlIHJlc29sdmVIYXNodGFnSWRzKCkpLlxuICAgICAqL1xuICAgIHByaXZhdGUgYXN5bmMgbG9hZEhhc2h0YWdJbmRleChzb3VyY2VTcGFjZUlkOiBzdHJpbmcsIHRhcmdldFNwYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgc291cmNlSGFzaHRhZ3M6IEhhc2h0YWdbXSA9IFtdO1xuICAgICAgICBsZXQgdGFyZ2V0SGFzaHRhZ3M6IEhhc2h0YWdbXSA9IFtdO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBbc291cmNlSGFzaHRhZ3MsIHRhcmdldEhhc2h0YWdzXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgICAgICB0aGlzLmhhc2h0YWdTZXJ2aWNlLmxpc3RIYXNodGFnc0ZvclNwYWNlKHNvdXJjZVNwYWNlSWQpLFxuICAgICAgICAgICAgICAgIHRoaXMuaGFzaHRhZ1NlcnZpY2UubGlzdEhhc2h0YWdzRm9yU3BhY2UodGFyZ2V0U3BhY2VJZClcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdbTWF0dGVycG9ydFRhZ0NvcHlTZXJ2aWNlXSBDb3VsZCBub3QgcmVhZCB0aGUgaGFzaHRhZ3MsIGtleXdvcmRzIHdpbGwgYmUgZHJvcHBlZDonLCBlcnJvcik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGhhc2h0YWcgb2Ygc291cmNlSGFzaHRhZ3MgfHwgW10pIHtcbiAgICAgICAgICAgIGlmIChoYXNodGFnPy5pZCAmJiBoYXNodGFnLm5hbWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNvdXJjZUhhc2h0YWdOYW1lcy5zZXQoaGFzaHRhZy5pZCwgaGFzaHRhZy5uYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGhhc2h0YWcgb2YgdGFyZ2V0SGFzaHRhZ3MgfHwgW10pIHtcbiAgICAgICAgICAgIGlmIChoYXNodGFnPy5pZCAmJiBoYXNodGFnLm5hbWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRhcmdldEhhc2h0YWdJZHNCeU5hbWUuc2V0KHRoaXMuaGFzaHRhZ0tleShoYXNodGFnLm5hbWUpLCBoYXNodGFnLmlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRyYW5zbGF0ZXMgb25lIGZlYXR1cmUncyBoYXNodGFnIGlkcyBpbnRvIHRhcmdldC1zcGFjZSBpZHMsIGNyZWF0aW5nIG9uIHRoZSBmbHkgdGhlXG4gICAgICoga2V5d29yZHMgdGhlIHRhcmdldCBzcGFjZSBkb2VzIG5vdCBoYXZlIHlldC5cbiAgICAgKlxuICAgICAqIENyZWF0aW9uIGlzIExBWlkgb24gcHVycG9zZS4gRG9pbmcgaXQgdXAgZnJvbnQsIGZvciB0aGUgd2hvbGUgc291cmNlIHZvY2FidWxhcnksIG1lYW50XG4gICAgICogdGhhdCBhIGNvcHkgd2hpY2ggZmFpbGVkIG9yIHdhcyBjbG9zZWQgaGFsZndheSBsZWZ0IGJlaGluZCBrZXl3b3JkcyBubyBQT0kgcmVmZXJlbmNlZCDigJRcbiAgICAgKiBwb2xsdXRpb24gdGhlIG9wZXJhdG9yIGhhZCB0byBjbGVhbiB1cCBieSBoYW5kLiBIZXJlIGEga2V5d29yZCBpcyBvbmx5IGV2ZXIgd3JpdHRlblxuICAgICAqIHdoZW4gYSBQT0kgdGhhdCBjYXJyaWVzIGl0IGlzIGFib3V0IHRvIGJlIGNyZWF0ZWQsIHNvIGFuIGludGVycnVwdGVkIGNvcHkgc3RvcHNcbiAgICAgKiBjcmVhdGluZyBrZXl3b3JkcyBhdCB0aGUgc2FtZSBQT0kgaXQgc3RvcHMgY3JlYXRpbmcgY29udGVudC5cbiAgICAgKlxuICAgICAqIFRoZSByZXNpZHVhbCB3aW5kb3cgKGtleXdvcmQgY3JlYXRlZCwgdGhlbiBjcmVhdGVGZWF0dXJlIGZhaWxzKSBpcyBjbG9zZWQgYnlcbiAgICAgKiBtYXJrSGFzaHRhZ3NVc2VkKCkgKyBjbGVhbnVwVW51c2VkQ3JlYXRlZEhhc2h0YWdzKCkuXG4gICAgICpcbiAgICAgKiBBIGtleXdvcmQgdGhhdCBjYW4gbmVpdGhlciBiZSBmb3VuZCBub3IgY3JlYXRlZCBpcyBkcm9wcGVkIHJhdGhlciB0aGFuIGxlZnQgYXMgYVxuICAgICAqIGRhbmdsaW5nIGlkLlxuICAgICAqL1xuICAgIHByaXZhdGUgYXN5bmMgcmVzb2x2ZUhhc2h0YWdJZHMoXG4gICAgICAgIHNvdXJjZUhhc2h0YWdJZHM6IEFycmF5PHN0cmluZyB8IG51bGw+IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgICAgICAgdGFyZ2V0U3BhY2VJZDogc3RyaW5nXG4gICAgKTogUHJvbWlzZTxzdHJpbmdbXSB8IG51bGw+IHtcbiAgICAgICAgaWYgKCFzb3VyY2VIYXNodGFnSWRzIHx8IHNvdXJjZUhhc2h0YWdJZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc29sdmVkOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICAgIGZvciAoY29uc3Qgc291cmNlSWQgb2Ygc291cmNlSGFzaHRhZ0lkcykge1xuICAgICAgICAgICAgaWYgKCFzb3VyY2VJZCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbmFtZSA9IHRoaXMuc291cmNlSGFzaHRhZ05hbWVzLmdldChzb3VyY2VJZCk7XG4gICAgICAgICAgICBpZiAoIW5hbWUpIHtcbiAgICAgICAgICAgICAgICAvLyB0aGUgc291cmNlIGlkIHBvaW50cyBhdCBhIGhhc2h0YWcgdGhhdCBubyBsb25nZXIgZXhpc3RzIOKAlCBub3RoaW5nIHRvIGNhcnJ5IG92ZXJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5oYXNodGFnS2V5KG5hbWUpO1xuICAgICAgICAgICAgbGV0IHRhcmdldElkID0gdGhpcy50YXJnZXRIYXNodGFnSWRzQnlOYW1lLmdldChrZXkpO1xuXG4gICAgICAgICAgICBpZiAoIXRhcmdldElkKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY3JlYXRlZCA9IGF3YWl0IHRoaXMuaGFzaHRhZ1NlcnZpY2UuY3JlYXRlSGFzaHRhZ0ZvclNwYWNlKG5hbWUsIHRhcmdldFNwYWNlSWQpO1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXRJZCA9IGNyZWF0ZWQ/LmlkO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0SWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGFyZ2V0SGFzaHRhZ0lkc0J5TmFtZS5zZXQoa2V5LCB0YXJnZXRJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZWRIYXNodGFnSWRzLmFkZCh0YXJnZXRJZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYFtNYXR0ZXJwb3J0VGFnQ29weVNlcnZpY2VdIENvdWxkIG5vdCBjcmVhdGUgdGhlIGhhc2h0YWcgXCIke25hbWV9XCIgaW4gdGhlIHRhcmdldCBzcGFjZTpgLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRhcmdldElkICYmICFyZXNvbHZlZC5pbmNsdWRlcyh0YXJnZXRJZCkpIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlZC5wdXNoKHRhcmdldElkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXNvbHZlZC5sZW5ndGggPiAwID8gcmVzb2x2ZWQgOiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJFQUQtT05MWSBpbmRleGluZyBvZiBib3RoIHNwYWNlcycgbWlzc2lvbnMuXG4gICAgICpcbiAgICAgKiBBIE1pc3Npb24gaXMgc2NvcGVkIHRvIG9uZSBzcGFjZSAoaXQgcGFpcnMgYSB1c2VySUQgd2l0aCBhIHNwYWNlSUQpLCBzbyB0aGUgaWQgYVxuICAgICAqIHNvdXJjZSBjb21tZW50J3MgYG93bmVySURgIHBvaW50cyBhdCBuZXZlciBkZXNpZ25hdGVzIGFueW9uZSBpbiB0aGUgdGFyZ2V0IHNwYWNlLlxuICAgICAqIFRoaXMgYnVpbGRzIHRoZSB0d28gbG9va3VwIHRhYmxlcyByZXNvbHZlQ29tbWVudE93bmVySUQoKSBuZWVkcyB0byB0cmFuc2xhdGUgaXQ6XG4gICAgICogd2hpY2ggdXNlciBhIHNvdXJjZSBNaXNzaW9uIGlkIGJlbG9uZ3MgdG8sIGFuZCB3aGljaCBNaXNzaW9uIChpZiBhbnkpIHRoYXQgc2FtZVxuICAgICAqIHVzZXIgYWxyZWFkeSBob2xkcyBpbiB0aGUgdGFyZ2V0IHNwYWNlLlxuICAgICAqL1xuICAgIHByaXZhdGUgYXN5bmMgbG9hZE1pc3Npb25JbmRleChzb3VyY2VTcGFjZUlkOiBzdHJpbmcsIHRhcmdldFNwYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgc291cmNlTWlzc2lvbnM6IE1pc3Npb25bXSA9IFtdO1xuICAgICAgICBsZXQgdGFyZ2V0TWlzc2lvbnM6IE1pc3Npb25bXSA9IFtdO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBbc291cmNlTWlzc2lvbnMsIHRhcmdldE1pc3Npb25zXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgICAgICB0aGlzLm1pc3Npb25TZXJ2aWNlLmdldEFsbE1pc3Npb25zRm9yU3BhY2Uoc291cmNlU3BhY2VJZCksXG4gICAgICAgICAgICAgICAgdGhpcy5taXNzaW9uU2VydmljZS5nZXRBbGxNaXNzaW9uc0ZvclNwYWNlKHRhcmdldFNwYWNlSWQpXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignW01hdHRlcnBvcnRUYWdDb3B5U2VydmljZV0gQ291bGQgbm90IHJlYWQgdGhlIG1pc3Npb25zLCBjb21tZW50IGF1dGhvcnNoaXAgd2lsbCBiZSBkcm9wcGVkOicsIGVycm9yKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgbWlzc2lvbiBvZiBzb3VyY2VNaXNzaW9ucyB8fCBbXSkge1xuICAgICAgICAgICAgaWYgKG1pc3Npb24/LmlkICYmIG1pc3Npb24udXNlcklEKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zb3VyY2VNaXNzaW9uVXNlcklkcy5zZXQobWlzc2lvbi5pZCwgbWlzc2lvbi51c2VySUQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgbWlzc2lvbiBvZiB0YXJnZXRNaXNzaW9ucyB8fCBbXSkge1xuICAgICAgICAgICAgaWYgKG1pc3Npb24/LmlkICYmIG1pc3Npb24udXNlcklEICYmICF0aGlzLnRhcmdldE1pc3Npb25JZHNCeVVzZXJJZC5oYXMobWlzc2lvbi51c2VySUQpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50YXJnZXRNaXNzaW9uSWRzQnlVc2VySWQuc2V0KG1pc3Npb24udXNlcklELCBtaXNzaW9uLmlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRyYW5zbGF0ZXMgYSBzb3VyY2UgY29tbWVudCdzIGBvd25lcklEYCAoYSBwZXItc3BhY2UgTWlzc2lvbiBpZCkgaW50byB0aGUgTWlzc2lvbiBvZlxuICAgICAqIHRoZSBTQU1FIHVzZXIgaW4gdGhlIHRhcmdldCBzcGFjZSwgc28gdGhlIGNvcHkga2VlcHMgY3JlZGl0aW5nIGl0cyByZWFsIGF1dGhvci5cbiAgICAgKlxuICAgICAqIFN1YnN0aXR1dGluZyB0aGUgY3VycmVudCBvcGVyYXRvcidzIG1pc3Npb24g4oCUIHRoZSB3YXkgYG93bmVyTWlzc2lvbklEYCBsZWdpdGltYXRlbHlcbiAgICAgKiBkb2VzIGZvciB0aWNrZXRzL2VxdWlwbWVudC9mZWF0dXJlcywgd2hpY2ggcmVhbGx5IGRvIGNoYW5nZSBvd25lciBvbiBhIGNvcHkg4oCUIHdvdWxkXG4gICAgICogbWlzYXR0cmlidXRlIGV2ZXJ5IGNvbW1lbnQgdG8gd2hvZXZlciByYW4gdGhlIGNvcHkgaW5zdGVhZCBvZiB3aG8gYWN0dWFsbHkgd3JvdGUgaXQuXG4gICAgICpcbiAgICAgKiBXaGVuIHRoZSBvcmlnaW5hbCBhdXRob3IgaGFzIG5vIG1pc3Npb24gaW4gdGhlIHRhcmdldCBzcGFjZSAobmV2ZXIgZ3JhbnRlZCBhY2Nlc3NcbiAgICAgKiB0aGVyZSksIHRoZSBjb21tZW50IGlzIGxlZnQgd2l0aCBubyBvd25lciByYXRoZXIgdGhhbiBhIHdyb25nIG9uZTogYW4gYWJzZW50IGF1dGhvclxuICAgICAqIGlzIGhvbmVzdCwgYSBtaXNhdHRyaWJ1dGVkIG9uZSBpcyBub3QuXG4gICAgICovXG4gICAgcHJpdmF0ZSByZXNvbHZlQ29tbWVudE93bmVySUQoc291cmNlT3duZXJJRDogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICBpZiAoIXNvdXJjZU93bmVySUQpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVzZXJJRCA9IHRoaXMuc291cmNlTWlzc2lvblVzZXJJZHMuZ2V0KHNvdXJjZU93bmVySUQpO1xuICAgICAgICBpZiAoIXVzZXJJRCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMudGFyZ2V0TWlzc2lvbklkc0J5VXNlcklkLmdldCh1c2VySUQpID8/IG51bGw7XG4gICAgfVxuXG4gICAgLyoqIFJlY29yZHMgdGhhdCB0aGVzZSBoYXNodGFncyBhcmUgbm93IHJlZmVyZW5jZWQgYnkgYSBmZWF0dXJlIHRoYXQgcmVhbGx5IGV4aXN0cywgc29cbiAgICAgKiAgdGhlIGVuZC1vZi1ydW4gY2xlYW51cCBsZWF2ZXMgdGhlbSBhbG9uZS4gKi9cbiAgICBwcml2YXRlIG1hcmtIYXNodGFnc1VzZWQoaGFzaHRhZ0lkczogc3RyaW5nW10gfCBudWxsKTogdm9pZCB7XG4gICAgICAgIGZvciAoY29uc3QgaWQgb2YgaGFzaHRhZ0lkcyB8fCBbXSkge1xuICAgICAgICAgICAgdGhpcy51c2VkSGFzaHRhZ0lkcy5hZGQoaWQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVsZXRlcyB0aGUgaGFzaHRhZ3MgdGhpcyBydW4gY3JlYXRlZCB0aGF0IG5vIGNvcGllZCBQT0kgZW5kZWQgdXAgcmVmZXJlbmNpbmcuXG4gICAgICpcbiAgICAgKiBSdW5zIG9uIGV2ZXJ5IGV4aXQgcGF0aCDigJQgc3VjY2VzcywgZ2VuZXJhbCBmYWlsdXJlLCBvciBleGNlcHRpb24g4oCUIHNvIHRoZSB0YXJnZXQgc3BhY2VcbiAgICAgKiBuZXZlciBrZWVwcyBrZXl3b3JkcyB0aGF0IGNhbWUgZnJvbSBhbiBhYm9ydGVkIGNvcHkuIE9ubHkgaWRzIGNyZWF0ZWQgYnkgVEhJUyBydW4gYXJlXG4gICAgICogZXZlciBjb25zaWRlcmVkOiBhIHByZS1leGlzdGluZyBrZXl3b3JkIG9mIHRoZSB0YXJnZXQgc3BhY2UgaXMgbmV2ZXIgdG91Y2hlZCwgZXZlbiBpZlxuICAgICAqIG5vIGNvcGllZCBQT0kgdXNlcyBpdC5cbiAgICAgKi9cbiAgICBwcml2YXRlIGFzeW5jIGNsZWFudXBVbnVzZWRDcmVhdGVkSGFzaHRhZ3MoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IG9ycGhhbnMgPSBbLi4udGhpcy5jcmVhdGVkSGFzaHRhZ0lkc10uZmlsdGVyKGlkID0+ICF0aGlzLnVzZWRIYXNodGFnSWRzLmhhcyhpZCkpO1xuICAgICAgICBpZiAob3JwaGFucy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnNvbGUubG9nKGBbTWF0dGVycG9ydFRhZ0NvcHlTZXJ2aWNlXSBSZW1vdmluZyAke29ycGhhbnMubGVuZ3RofSBrZXl3b3JkKHMpIGNyZWF0ZWQgYnV0IGxlZnQgdW51c2VkIGJ5IHRoaXMgY29weS5gKTtcblxuICAgICAgICBmb3IgKGNvbnN0IGhhc2h0YWdJZCBvZiBvcnBoYW5zKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFzaHRhZ1NlcnZpY2UuZGVsZXRlSGFzaHRhZ0J5SWQoaGFzaHRhZ0lkKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZWRIYXNodGFnSWRzLmRlbGV0ZShoYXNodGFnSWQpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAvLyBDbGVhbnVwIGlzIGJlc3QtZWZmb3J0OiBhIGxlZnRvdmVyIGtleXdvcmQgaXMgaGFybWxlc3MgbmV4dCB0byBhIGZhaWxlZCBjb3B5LFxuICAgICAgICAgICAgICAgIC8vIGFuZCBtdXN0IG5ldmVyIGJlIHRoZSByZWFzb24gdGhlIHdob2xlIG9wZXJhdGlvbiByZXBvcnRzIGEgZmFpbHVyZS5cbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYFtNYXR0ZXJwb3J0VGFnQ29weVNlcnZpY2VdIENvdWxkIG5vdCByZW1vdmUgdGhlIHVudXNlZCBrZXl3b3JkIFwiJHtoYXNodGFnSWR9XCI6YCwgZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy9cbiAgICAvLyAtLS0tLS0tLS0tIE1lZGlhIGNvbnRlbnQgKENvbW1lbnRzKSAtLS0tLS0tLS0tXG4gICAgLy9cblxuICAgIC8qKlxuICAgICAqIE9yZGVycyBhIGZlYXR1cmUncyBtZWRpYSBzZXQgZXhhY3RseSB0aGUgd2F5IHRoZSBVSSB3aWxsIHJlYWQgaXQgYmFjaywgYW5kIHJlcGFpcnNcbiAgICAgKiB0aGUgb3JkZXJpbmcga2V5IHdoZW4gdGhlIHNvdXJjZSBkYXRhIGNhbm5vdCBleHByZXNzIHRoZSB1c2VyJ3MgaW50ZW5kZWQgb3JkZXIuXG4gICAgICpcbiAgICAgKiBUaGUgdmlld2VyIHNvcnRzIGVhY2ggbWVkaWEgZmFtaWx5IG9uIGl0cyBvd24gKGBzZXRJbWFnZXNgLCBgc2V0VmlkZW9zYCwgYHNldEF1ZGlvYCxcbiAgICAgKiBgc2V0RG9jdW1lbnRzYCwgLi4uIGFsbCBkbyBgLnNvcnQoKGEsIGIpID0+IGEuaW5kZXggLSBiLmluZGV4KWApLCBzbyBgaW5kZXhgIG9ubHkgaGFzXG4gICAgICogdG8gYmUgY29uc2lzdGVudCBXSVRISU4gYSBDb21tZW50VHlwZS4gVGhlIGF0dGFjaG1lbnQgZm9ybSBob3dldmVyIGRlZmF1bHRzIGBpbmRleGBcbiAgICAgKiB0byAxIGZvciBldmVyeSBuZXcgYXR0YWNobWVudCwgc28gYSBtdWx0aS1pbWFnZSBQT0kgdmVyeSBvZnRlbiBob2xkcyBzZXZlcmFsIGltYWdlc1xuICAgICAqIGFsbCBzaGFyaW5nIGluZGV4IDEg4oCUIG9yIG51bGwuIFNvcnRpbmcgdGhvc2UgaXMgbGVmdCB0byBEeW5hbW9EQidzIGFyYml0cmFyeSBzY2FuXG4gICAgICogb3JkZXIsIHdoaWNoIGlzIHdoeSB0aGUgY29weSBjYW1lIG91dCBpbiBhIGRpZmZlcmVudCBvcmRlciB0aGFuIHRoZSBvcmlnaW5hbC5cbiAgICAgKlxuICAgICAqIFN0cmF0ZWd5OiBzb3J0IGRldGVybWluaXN0aWNhbGx5IChpbmRleCwgdGhlbiBjcmVhdGlvbiBkYXRlLCB0aGVuIGlkIOKAlCBpLmUuIHRoZVxuICAgICAqIHVwbG9hZCBvcmRlciB0aGUgdXNlciBhY3R1YWxseSBzYXcpLCBhbmQgb25seSByZXdyaXRlIHRoZSBpbmRpY2VzIG9mIGEgZmFtaWx5IHdoZW5cbiAgICAgKiB0aGV5IGFyZSBhbWJpZ3VvdXMgKG51bGwgb3IgZHVwbGljYXRlZCkuIEEgZmFtaWx5IHdob3NlIGluZGljZXMgYXJlIGFscmVhZHkgdW5pcXVlXG4gICAgICogaXMgY29waWVkIHVudG91Y2hlZCwgc28gYSBkZWxpYmVyYXRlIG9yZGVyaW5nIGlzIG5ldmVyIG92ZXJ3cml0dGVuLlxuICAgICAqL1xuICAgIHByaXZhdGUgb3JkZXJDb21tZW50c0ZvckNvcHkoY29tbWVudHM6IENvbW1lbnRbXSk6IENvbW1lbnRbXSB7XG4gICAgICAgIGNvbnN0IHZhbGlkID0gKGNvbW1lbnRzIHx8IFtdKS5maWx0ZXIoYyA9PiAhIWMpO1xuXG4gICAgICAgIGNvbnN0IGJ5VHlwZSA9IG5ldyBNYXA8c3RyaW5nLCBDb21tZW50W10+KCk7XG4gICAgICAgIGZvciAoY29uc3QgY29tbWVudCBvZiB2YWxpZCkge1xuICAgICAgICAgICAgY29uc3Qga2V5ID0gKGNvbW1lbnQudHlwZSBhcyBzdHJpbmcpIHx8ICdVTlRZUEVEJztcbiAgICAgICAgICAgIGlmICghYnlUeXBlLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICAgICAgYnlUeXBlLnNldChrZXksIFtdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJ5VHlwZS5nZXQoa2V5KS5wdXNoKGNvbW1lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgb3JkZXJlZDogQ29tbWVudFtdID0gW107XG5cbiAgICAgICAgZm9yIChjb25zdCBmYW1pbHkgb2YgYnlUeXBlLnZhbHVlcygpKSB7XG4gICAgICAgICAgICBmYW1pbHkuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFpID0gdGhpcy5vcmRlcmluZ0luZGV4T2YoYSk7XG4gICAgICAgICAgICAgICAgY29uc3QgYmkgPSB0aGlzLm9yZGVyaW5nSW5kZXhPZihiKTtcbiAgICAgICAgICAgICAgICBpZiAoYWkgIT09IGJpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhaSAtIGJpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBhZCA9IHRoaXMuY3JlYXRpb25UaW1lT2YoYSk7XG4gICAgICAgICAgICAgICAgY29uc3QgYmQgPSB0aGlzLmNyZWF0aW9uVGltZU9mKGIpO1xuICAgICAgICAgICAgICAgIGlmIChhZCAhPT0gYmQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFkIC0gYmQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcoKGEgYXMgYW55KS5pZCB8fCAnJykubG9jYWxlQ29tcGFyZShTdHJpbmcoKGIgYXMgYW55KS5pZCB8fCAnJykpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGluZGljZXMgPSBmYW1pbHkubWFwKGMgPT4gYy5pbmRleCk7XG4gICAgICAgICAgICBjb25zdCBpc0FtYmlndW91cyA9IGluZGljZXMuc29tZShpID0+IGkgPT09IG51bGwgfHwgaSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgIHx8IG5ldyBTZXQoaW5kaWNlcykuc2l6ZSAhPT0gaW5kaWNlcy5sZW5ndGg7XG5cbiAgICAgICAgICAgIGZhbWlseS5mb3JFYWNoKChjb21tZW50LCBwb3NpdGlvbikgPT4ge1xuICAgICAgICAgICAgICAgIChjb21tZW50IGFzIGFueSkuX19jb3B5SW5kZXggPSBpc0FtYmlndW91cyA/IHBvc2l0aW9uICsgMSA6IGNvbW1lbnQuaW5kZXg7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgb3JkZXJlZC5wdXNoKC4uLmZhbWlseSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gb3JkZXJlZDtcbiAgICB9XG5cbiAgICAvKiogU29ydCBrZXkgZm9yIGEgY29tbWVudCdzIHBvc2l0aW9uOyBhIG1pc3NpbmcgaW5kZXggc29ydHMgbGFzdCwgbm90IGZpcnN0LiAqL1xuICAgIHByaXZhdGUgb3JkZXJpbmdJbmRleE9mKGNvbW1lbnQ6IENvbW1lbnQpOiBudW1iZXIge1xuICAgICAgICBjb25zdCBpbmRleCA9IGNvbW1lbnQ/LmluZGV4O1xuICAgICAgICByZXR1cm4gaW5kZXggPT09IG51bGwgfHwgaW5kZXggPT09IHVuZGVmaW5lZCB8fCBOdW1iZXIuaXNOYU4oTnVtYmVyKGluZGV4KSlcbiAgICAgICAgICAgID8gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVJcbiAgICAgICAgICAgIDogTnVtYmVyKGluZGV4KTtcbiAgICB9XG5cbiAgICAvKiogQ3JlYXRpb24gdGltZXN0YW1wIG9mIGEgY29tbWVudCwgdXNlZCBhcyB0aGUgdGllLWJyZWFrZXI6IGl0IHJlZmxlY3RzIHRoZSBvcmRlciBpblxuICAgICAqICB3aGljaCB0aGUgdXNlciB1cGxvYWRlZCB0aGUgbWVkaWEsIHdoaWNoIGlzIHRoZSBvcmRlciB0aGV5IHNhdy4gKi9cbiAgICBwcml2YXRlIGNyZWF0aW9uVGltZU9mKGNvbW1lbnQ6IENvbW1lbnQpOiBudW1iZXIge1xuICAgICAgICBjb25zdCBjcmVhdGVkQXQgPSAoY29tbWVudCBhcyBhbnkpPy5jcmVhdGVkQXQ7XG4gICAgICAgIGlmICghY3JlYXRlZEF0KSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0aW1lID0gbmV3IERhdGUoY3JlYXRlZEF0KS5nZXRUaW1lKCk7XG4gICAgICAgIHJldHVybiBOdW1iZXIuaXNOYU4odGltZSkgPyAwIDogdGltZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb3BpZXMgT05FIG1lZGlhIGl0ZW0gKGltYWdlLCB2aWRlbywgYXVkaW8sIGRvY3VtZW50LCB0ZXh0LCBsaW5rLCBlbWJlZCwgaWZyYW1lLi4uKVxuICAgICAqIG9mIGEgZmVhdHVyZSwgZHVwbGljYXRpbmcgaXRzIGZpbGUgaW4gUzMgZmlyc3Qgd2hlbiBpdCBoYXMgb25lLlxuICAgICAqXG4gICAgICogRXZlcnkgY29sdW1uIG9mIHRoZSBDb21tZW50IG1vZGVsIGlzIGNhcnJpZWQgb3Zlci4gYGRlc2NyaXB0aW9uYCBhbmQgYG1ldGFkYXRhYCB3ZXJlXG4gICAgICogcHJldmlvdXNseSBkcm9wcGVkLCB3aGljaCBlbXB0aWVkIHRoZSBjYXB0aW9ucyBvZiBpbWFnZXMvdmlkZW9zLCB0aGUgYm9keSBvZiBURVhUXG4gICAgICogaXRlbXMg4oCUIHdoZXJlIHRoZSB3aG9sZSBjb250ZW50IGxpdmVzLCBzaW5jZSBhIFRFWFQgY29tbWVudCBoYXMgbm8gZmlsZSDigJQgYW5kIGFueVxuICAgICAqIHBlci1tZWRpYSBzZXR0aW5ncyBzdG9yZWQgaW4gbWV0YWRhdGEuXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3luYyBjb3B5Q29tbWVudEZvckZlYXR1cmUoXG4gICAgICAgIHNvdXJjZUNvbW1lbnQ6IENvbW1lbnQsXG4gICAgICAgIHRhcmdldEZlYXR1cmVJZDogc3RyaW5nLFxuICAgICAgICB0YXJnZXRTcGFjZUlkOiBzdHJpbmdcbiAgICApOiBQcm9taXNlPENvbW1lbnQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29weUNvbW1lbnQoc291cmNlQ29tbWVudCwgdGFyZ2V0U3BhY2VJZCwgeyBmZWF0dXJlSUQ6IHRhcmdldEZlYXR1cmVJZCB9KTtcbiAgICB9XG5cbiAgICAvKiogU2FtZSwgZm9yIGFuIGF0dGFjaG1lbnQgY2FycmllZCBieSBhIHRpY2tldCByYXRoZXIgdGhhbiBieSBhIGZlYXR1cmUuICovXG4gICAgcHJpdmF0ZSBhc3luYyBjb3B5Q29tbWVudEZvclRpY2tldChcbiAgICAgICAgc291cmNlQ29tbWVudDogQ29tbWVudCxcbiAgICAgICAgdGFyZ2V0VGlja2V0SWQ6IHN0cmluZyxcbiAgICAgICAgdGFyZ2V0U3BhY2VJZDogc3RyaW5nXG4gICAgKTogUHJvbWlzZTxDb21tZW50PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvcHlDb21tZW50KHNvdXJjZUNvbW1lbnQsIHRhcmdldFNwYWNlSWQsIHsgdGlja2V0SUQ6IHRhcmdldFRpY2tldElkIH0pO1xuICAgIH1cblxuICAgIC8qKiBTaGFyZWQgYm9keSBvZiB0aGUgdHdvIGFib3ZlOiBgb3duZXJgIGNhcnJpZXMgd2hpY2hldmVyIGZvcmVpZ24ga2V5IGxpbmtzIHRoZSBjb3B5IGJhY2tcbiAgICAgKiAgdG8gaXRzIG5ldyBwYXJlbnQsIGV2ZXJ5dGhpbmcgZWxzZSBpcyBpZGVudGljYWwuICovXG4gICAgcHJpdmF0ZSBhc3luYyBjb3B5Q29tbWVudChcbiAgICAgICAgc291cmNlQ29tbWVudDogQ29tbWVudCxcbiAgICAgICAgdGFyZ2V0U3BhY2VJZDogc3RyaW5nLFxuICAgICAgICBvd25lcjogeyBmZWF0dXJlSUQ/OiBzdHJpbmc7IHRpY2tldElEPzogc3RyaW5nIH1cbiAgICApOiBQcm9taXNlPENvbW1lbnQ+IHtcbiAgICAgICAgY29uc3QgcmF3Q29tbWVudCA9IHNvdXJjZUNvbW1lbnQgYXMgYW55O1xuXG4gICAgICAgIGxldCBjb3BpZWRBbm5leGU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgICAgICBpZiAocmF3Q29tbWVudC5hbm5leGUpIHtcbiAgICAgICAgICAgIGNvcGllZEFubmV4ZSA9IGF3YWl0IHRoaXMuY29weVMzS2V5SWZQcmVzZW50KHJhd0NvbW1lbnQuYW5uZXhlLCBgYXR0YWNobWVudCBcIiR7cmF3Q29tbWVudC50aXRsZX1cImApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29tbWVudElucHV0OiBhbnkgPSB7XG4gICAgICAgICAgICB0aXRsZTogcmF3Q29tbWVudC50aXRsZSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiByYXdDb21tZW50LmRlc2NyaXB0aW9uID8/IG51bGwsXG4gICAgICAgICAgICBtZXRhZGF0YTogcmF3Q29tbWVudC5tZXRhZGF0YSA/PyBudWxsLFxuICAgICAgICAgICAgdHlwZTogcmF3Q29tbWVudC50eXBlLFxuICAgICAgICAgICAgYW5uZXhlOiBjb3BpZWRBbm5leGUsXG4gICAgICAgICAgICBleHRlcm5hbExpbms6IHJhd0NvbW1lbnQuZXh0ZXJuYWxMaW5rIHx8IG51bGwsXG4gICAgICAgICAgICBkaW1lbnNpb25zOiByYXdDb21tZW50LmRpbWVuc2lvbnMgfHwgbnVsbCxcbiAgICAgICAgICAgIGluZGV4OiByYXdDb21tZW50Ll9fY29weUluZGV4ID8/IHJhd0NvbW1lbnQuaW5kZXggPz8gbnVsbCxcbiAgICAgICAgICAgIHNob3duSW5UYWc6IHJhd0NvbW1lbnQuc2hvd25JblRhZyxcbiAgICAgICAgICAgIGlzQ292ZXJJbWFnZTogcmF3Q29tbWVudC5pc0NvdmVySW1hZ2UsXG4gICAgICAgICAgICBzcGFjZUlEOiB0YXJnZXRTcGFjZUlkLFxuICAgICAgICAgICAgLy8gS2VlcHMgY3JlZGl0aW5nIHRoZSBPUklHSU5BTCBhdXRob3Igd2hlbiB0aGV5IGFsc28gaGF2ZSBhIG1pc3Npb24gaW4gdGhlXG4gICAgICAgICAgICAvLyB0YXJnZXQgc3BhY2UsIGFuZCBsZWF2ZXMgdGhlIGNvbW1lbnQgdW4tb3duZWQgb3RoZXJ3aXNlIOKAlCBzZWVcbiAgICAgICAgICAgIC8vIHJlc29sdmVDb21tZW50T3duZXJJRCgpLiBOZXZlciB0aGUgY3VycmVudCBvcGVyYXRvcidzIG93biBtaXNzaW9uOiB0aGF0XG4gICAgICAgICAgICAvLyB3b3VsZCBzaWxlbnRseSByZWFzc2lnbiBhdXRob3JzaGlwIHRvIHdob2V2ZXIgaGFwcGVucyB0byBydW4gdGhlIGNvcHkuXG4gICAgICAgICAgICBvd25lcklEOiB0aGlzLnJlc29sdmVDb21tZW50T3duZXJJRChyYXdDb21tZW50Lm93bmVySUQpLFxuICAgICAgICAgICAgLi4ub3duZXJcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gdGhpcy5jb21tZW50U2VydmljZS5jcmVhdGVDb21tZW50KGNvbW1lbnRJbnB1dCk7XG4gICAgfVxuXG4gICAgLy9cbiAgICAvLyAtLS0tLS0tLS0tIFBPSSBjcmVhdGlvbiAtLS0tLS0tLS0tXG4gICAgLy9cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgdGhlIHRhcmdldC1zcGFjZSBjb3B5IG9mIGEgc291cmNlIFBPSSwgd2l0aCBFVkVSWSBjb2x1bW4gb2YgdGhlIFBPSSBtb2RlbC5cbiAgICAgKlxuICAgICAqIFNpbmdsZSBlbnRyeSBwb2ludCBmb3IgYWxsIHBoYXNlczogdGhlIGVsZW1lbnQgcGhhc2VzICh0aWNrZXQsIGVxdWlwbWVudCwgM0Qgb2JqZWN0LFxuICAgICAqIGZlYXR1cmUsIG1lYXN1cmVtZW50KSB1c2VkIHRvIGJ1aWxkIHRoZWlyIFBPSSBpbmxpbmUgd2l0aCBvbmx5IDUgZmllbGRzIOKAlCBjb29yZGluYXRlLFxuICAgICAqIHR5cGUsIGVsZW1lbnRJRCwgbWV0YWRhdGEsIHN3ZWVwIOKAlCB3aGljaCBpcyBwcmVjaXNlbHkgaG93IG11c2V1bSBQT0lzIGxvc3QgdGhlaXJcbiAgICAgKiBwYXN0aWxsZTogYHRhZ0Rlc2NyaXB0aW9uYCAodGhlIHBvcHVwIHRleHQpLCBgdGFnSWNvbmAgKHRoZSBjdXN0b20gaWNvbikgYW5kXG4gICAgICogYHRhZ0ltYWdlSURgICh0aGUgcGFzdGlsbGUncyBpbWFnZSkgbmV2ZXIgbGVmdCB0aGUgc291cmNlIHNwYWNlLlxuICAgICAqL1xuICAgIHByaXZhdGUgYXN5bmMgY3JlYXRlQ29waWVkUG9pKFxuICAgICAgICBzb3VyY2VQb2k6IFBPSSxcbiAgICAgICAgZWxlbWVudElEOiBzdHJpbmcgfCBudWxsLFxuICAgICAgICBzb3VyY2VOYXZQb3NpdGlvbnM6IE1hcDxzdHJpbmcsIFZlYzM+LFxuICAgICAgICB0YXJnZXROYXZQb3NpdGlvbnM6IE1hcDxzdHJpbmcsIFZlYzM+LFxuICAgICAgICB0cmFuc2Zvcm06IFJpZ2lkVHJhbnNmb3JtXG4gICAgKTogUHJvbWlzZTxQT0k+IHtcbiAgICAgICAgY29uc3QgcmF3ID0gc291cmNlUG9pIGFzIGFueTtcblxuICAgICAgICBjb25zdCB0YXJnZXRTd2VlcElkID0gdGhpcy5maW5kQ2xvc2VzdFRhcmdldFN3ZWVwSWQoXG4gICAgICAgICAgICBzb3VyY2VQb2kubWF0dGVycG9ydFN3ZWVwSUQsIHNvdXJjZU5hdlBvc2l0aW9ucywgdGFyZ2V0TmF2UG9zaXRpb25zLCB0cmFuc2Zvcm1cbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgYWRqdXN0ZWRDb29yZGluYXRlID0gdGhpcy5nZXRBZGp1c3RlZENvb3JkaW5hdGVzKHNvdXJjZVBvaS5jb29yZGluYXRlLCB0cmFuc2Zvcm0pO1xuXG4gICAgICAgIGNvbnN0IHBvaUlucHV0OiBhbnkgPSB7XG4gICAgICAgICAgICBjb29yZGluYXRlOiBhZGp1c3RlZENvb3JkaW5hdGUgPT09IG51bGwgfHwgYWRqdXN0ZWRDb29yZGluYXRlID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICA/IG51bGxcbiAgICAgICAgICAgICAgICA6IEpTT04uc3RyaW5naWZ5KGFkanVzdGVkQ29vcmRpbmF0ZSksXG4gICAgICAgICAgICB0eXBlOiBzb3VyY2VQb2kudHlwZSxcbiAgICAgICAgICAgIGVsZW1lbnRJRDogZWxlbWVudElEID8/IG51bGwsXG4gICAgICAgICAgICBtYXR0ZXJwb3J0U3dlZXBJRDogdGFyZ2V0U3dlZXBJZCxcblxuICAgICAgICAgICAgLy8gLS0tIHBhc3RpbGxlICh0YWcgcG9wdXApIC0tLVxuICAgICAgICAgICAgdGFnRGVzY3JpcHRpb246IHNvdXJjZVBvaS50YWdEZXNjcmlwdGlvbiA/PyBudWxsLFxuICAgICAgICAgICAgdGFnSWNvbjogYXdhaXQgdGhpcy5kdXBsaWNhdGVUYWdJY29uKHNvdXJjZVBvaS50YWdJY29uKSxcbiAgICAgICAgICAgIHRhZ0ltYWdlSUQ6IHRoaXMucmVzb2x2ZVRhZ0ltYWdlSUQoc291cmNlUG9pLnRhZ0ltYWdlSUQpLFxuXG4gICAgICAgICAgICAvLyAtLS0gcmVuZGVyaW5nIC8gdmlzaWJpbGl0eSBmbGFncywgY2FycmllZCBvdmVyIHZlcmJhdGltIC0tLVxuICAgICAgICAgICAgc3BlY2lmaWM6IHJhdy5zcGVjaWZpYyA/PyBudWxsLFxuICAgICAgICAgICAgcHJpdmF0ZTogcmF3LnByaXZhdGUgPz8gbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbDogcmF3Lmdsb2JhbCA/PyBudWxsLFxuICAgICAgICAgICAgbGV2ZWw6IHJhdy5sZXZlbCA/PyBudWxsLFxuICAgICAgICAgICAgcm9sZTogcmF3LnJvbGUgPz8gbnVsbCxcbiAgICAgICAgICAgIGNhdGVnb3J5OiByYXcuY2F0ZWdvcnkgPz8gbnVsbCxcbiAgICAgICAgICAgIGRvbWFpbklEOiB0aGlzLnJlc29sdmVEb21haW5JRChyYXcuZG9tYWluSUQpLFxuXG4gICAgICAgICAgICAvLyAtLS0gTWF0dGVycG9ydCBhbmNob3JpbmcgLS0tXG4gICAgICAgICAgICBtZXRhZGF0YTogdGhpcy5nZXRBZGp1c3RlZFBvaU1ldGFkYXRhKHNvdXJjZVBvaS5tZXRhZGF0YSwgdHJhbnNmb3JtKVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiB0aGlzLnBvaVNlcnZpY2UuY3JlYXRlUE9JRm9yU3BhY2VJRChwb2lJbnB1dCBhcyBQT0kpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkYXB0cyBhIFBPSSdzIGBtZXRhZGF0YWAgKHNlZSBNYXR0ZXJ0YWdEYXRhLmdldE1ldGFkYXRhU3RyaW5nKCk6IHsgaWNvbiwgbm9ybWFsLCBzaWQgfSlcbiAgICAgKiB0byB0aGUgdGFyZ2V0IHNwYWNlLlxuICAgICAqXG4gICAgICogIC0gYHNpZGAgaXMgdGhlIGlkIG9mIHRoZSBNYXR0ZXJ0YWcgaW5zaWRlIHRoZSBTT1VSQ0UgTWF0dGVycG9ydCBtb2RlbC4gQ2FycmllZCBvdmVyLFxuICAgICAqICAgIHRoZSB2aWV3ZXIgdHJpZXMgdG8gcmUtY3JlYXRlIHRoZSB0YXJnZXQncyB0YWcgd2l0aCBhbiBpZCBiZWxvbmdpbmcgdG8gYW5vdGhlclxuICAgICAqICAgIG1vZGVsIChcImFscmVhZHkgaW4gdXNlXCIpLCBzbyB0aGUgcGFzdGlsbGUgZmFpbHMgdG8gYXR0YWNoLiBJdCBpcyBkcm9wcGVkOiB0aGVcbiAgICAgKiAgICB2aWV3ZXIgdGhlbiBhbGxvY2F0ZXMgYSBmcmVzaCBzaWQgb24gZmlyc3QgcmVuZGVyLlxuICAgICAqICAtIGBub3JtYWxgIGlzIHRoZSBzdGVtIGRpcmVjdGlvbi4gSXQgaXMgYSBkaXJlY3Rpb24sIHNvIG9ubHkgdGhlIHJvdGF0aW9uIGFwcGxpZXNcbiAgICAgKiAgICAobmV2ZXIgdGhlIHRyYW5zbGF0aW9uKTsgd2l0aG91dCBpdCwgYSBjb3BpZWQgcGFzdGlsbGUgcG9pbnRzIGludG8gdGhlIHdhbGxcbiAgICAgKiAgICB3aGVuZXZlciB0aGUgdHdvIG1vZGVscyBhcmUgbm90IGFsaWduZWQgb24gdGhlIHNhbWUgYXhpcy5cbiAgICAgKiAgLSBgaWNvbmAgYW5kIGFueXRoaW5nIGVsc2UgaXMga2VwdCBhcy1pcy5cbiAgICAgKi9cbiAgICBwcml2YXRlIGdldEFkanVzdGVkUG9pTWV0YWRhdGEobWV0YWRhdGE6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIHRyYW5zZm9ybTogUmlnaWRUcmFuc2Zvcm0pOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgaWYgKCFtZXRhZGF0YSkge1xuICAgICAgICAgICAgcmV0dXJuIG1ldGFkYXRhID8/IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UobWV0YWRhdGEpO1xuICAgICAgICAgICAgaWYgKCFwYXJzZWQgfHwgdHlwZW9mIHBhcnNlZCAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbWV0YWRhdGE7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChwYXJzZWQubm9ybWFsXG4gICAgICAgICAgICAgICAgJiYgdHlwZW9mIHBhcnNlZC5ub3JtYWwgPT09ICdvYmplY3QnXG4gICAgICAgICAgICAgICAgJiYgdHlwZW9mIHBhcnNlZC5ub3JtYWwueCA9PT0gJ251bWJlcidcbiAgICAgICAgICAgICAgICAmJiB0eXBlb2YgcGFyc2VkLm5vcm1hbC55ID09PSAnbnVtYmVyJ1xuICAgICAgICAgICAgICAgICYmIHR5cGVvZiBwYXJzZWQubm9ybWFsLnogPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgcGFyc2VkLm5vcm1hbCA9IGFwcGx5UmlnaWRUcmFuc2Zvcm1Ub0RpcmVjdGlvbihwYXJzZWQubm9ybWFsLCB0cmFuc2Zvcm0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkZWxldGUgcGFyc2VkLnNpZDtcblxuICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHBhcnNlZCk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy8gTm90IEpTT04sIG9yIHVuZXhwZWN0ZWQgc2hhcGUg4oCUIGxlYXZlIHVudG91Y2hlZCByYXRoZXIgdGhhbiBndWVzcy5cbiAgICAgICAgICAgIHJldHVybiBtZXRhZGF0YTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc29sdmVzIGEgUE9JJ3MgYHRhZ0ltYWdlSURgIOKAlCB3aGljaCB0aGUgc2NoZW1hIGRvY3VtZW50cyBhcyBhIFwiY29ubmVjdGlvbiB0b1xuICAgICAqIGNvbW1lbnQuaWRcIiwgaS5lLiB0aGUgaWQgb2YgdGhlIENvbW1lbnQgaG9sZGluZyB0aGUgaW1hZ2Ugc2hvd24gaW4gdGhlIHBhc3RpbGxlLlxuICAgICAqXG4gICAgICogSXQgaXMgTk9UIGFuIFMzIGtleSwgc28gdGhlIHByZXZpb3VzIFwiZG9lcyBpdCBjb250YWluIGEgc2xhc2g/XCIgaGV1cmlzdGljIG5ldmVyXG4gICAgICogbWF0Y2hlZCBhbmQgdGhlIHZhbHVlIHRyYXZlbGxlZCB1bmNoYW5nZWQsIGxlYXZpbmcgZXZlcnkgY29waWVkIHBhc3RpbGxlIHBvaW50aW5nIGF0XG4gICAgICogYSBDb21tZW50IG9mIHRoZSBzb3VyY2Ugc3BhY2UuIEl0IGlzIG5vdyB0cmFuc2xhdGVkIHRocm91Z2ggdGhlIGNvbW1lbnQgaWQgbWFwIGJ1aWx0XG4gICAgICogd2hpbGUgZHVwbGljYXRpbmcgdGhlIG1lZGlhLCBhbmQgZHJvcHBlZCB3aGVuIGl0IGNhbm5vdCBiZSByZXNvbHZlZCAodGhlIHBhc3RpbGxlXG4gICAgICogdGhlbiBmYWxscyBiYWNrIHRvIHRoZSBmZWF0dXJlJ3MgY292ZXIgaW1hZ2UgaW5zdGVhZCBvZiBhIGJyb2tlbiByZWZlcmVuY2UpLlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVzb2x2ZVRhZ0ltYWdlSUQodGFnSW1hZ2VJRDogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICBpZiAoIXRhZ0ltYWdlSUQpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmNvbW1lbnRJZHMuZ2V0KHRhZ0ltYWdlSUQpID8/IG51bGw7XG4gICAgfVxuXG4gICAgLy9cbiAgICAvLyAtLS0tLS0tLS0tIER1cGxpY2F0ZSBkZXRlY3Rpb24gLS0tLS0tLS0tLVxuICAgIC8vXG5cbiAgICAvKipcbiAgICAgKiBIZXVyaXN0aWMgZHVwbGljYXRlLWRldGVjdGlvbjogY29tcGFyZXMgc2V2ZXJhbCBpZGVudGlmeWluZyBmaWVsZHMgdG9nZXRoZXIgcmF0aGVyIHRoYW5cbiAgICAgKiBhIHNpbmdsZSBsYWJlbCwgdG8gcmVkdWNlIGZhbHNlIHBvc2l0aXZlcyB3aGVuIGl0ZW1zIHNoYXJlIG9uZSBvZiB0aGVtLiBSZXR1cm5zIHRoZVxuICAgICAqIG1hdGNoZWQgdGFyZ2V0IGl0ZW0gKG9yIHVuZGVmaW5lZCkgcmF0aGVyIHRoYW4gYSBib29sZWFuLCBzbyB0aGUgY2FsbGVyIGNhbiBhY3Qgb24gdGhlXG4gICAgICogZXhpc3RpbmcgcmVjb3JkIOKAlCBoZWFsIGl0cyBtaXNzaW5nIGZpZWxkcyDigJQgaW5zdGVhZCBvZiBvbmx5IHNraXBwaW5nIGl0LlxuICAgICAqXG4gICAgICogVGhlIGZpZWxkcyBhcmUgc3VwcGxpZWQgYnkgdGhlIGNhbGxlciBiZWNhdXNlIHRoZSBtb2RlbHMgZG8gbm90IGFncmVlIG9uIHRoZW0uIFRoZVxuICAgICAqIHByZXZpb3VzIHZlcnNpb24gaGFyZC1jb2RlZCBgdGl0bGVgL2BkZXNjcmlwdGlvbmAsIHdoaWNoIGRvIG5vdCBleGlzdCBvbiBFcXVpcG1lbnQgYXRcbiAgICAgKiBhbGw6IGJvdGggc2lkZXMgcmVhZCBgdW5kZWZpbmVkYCwgZXZlcnkgZXF1aXBtZW50IHRoZXJlZm9yZSBcIm1hdGNoZWRcIiBldmVyeSBvdGhlciBvbmUsXG4gICAgICogYW5kIGEgdGFyZ2V0IHNwYWNlIGhvbGRpbmcgYSBzaW5nbGUgZXF1aXBtZW50IHNpbGVudGx5IGNhdXNlZCB0aGUgd2hvbGUgZXF1aXBtZW50IHBoYXNlXG4gICAgICogdG8gY29weSBub3RoaW5nLlxuICAgICAqL1xuICAgIHByaXZhdGUgZmluZEV4aXN0aW5nPFQ+KFxuICAgICAgICBzb3VyY2U6IFQsXG4gICAgICAgIHRhcmdldExpc3Q6IFRbXSxcbiAgICAgICAgaWRlbnRpdHk6IChpdGVtOiBUKSA9PiBBcnJheTxzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkPlxuICAgICk6IFQgfCB1bmRlZmluZWQge1xuICAgICAgICBjb25zdCBzb3VyY2VLZXkgPSB0aGlzLmlkZW50aXR5S2V5KGlkZW50aXR5KHNvdXJjZSkpO1xuICAgICAgICByZXR1cm4gdGFyZ2V0TGlzdC5maW5kKHRhcmdldCA9PiB0aGlzLmlkZW50aXR5S2V5KGlkZW50aXR5KHRhcmdldCkpID09PSBzb3VyY2VLZXkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEJ1aWxkcyBhIHBhdGNoIG9mIHdoaWNoZXZlciBmaWVsZHMgaW4gYGZpZWxkc2AgdGhlIGV4aXN0aW5nIHRhcmdldCByZWNvcmQgaXMgbWlzc2luZ1xuICAgICAqIChgbnVsbGAvYHVuZGVmaW5lZGAvZW1wdHkgYXJyYXkpIGJ1dCB0aGUgc291cmNlIGhhcywgcGx1cyBgZG9tYWluSURgIHdoZW4gcmVxdWVzdGVkIOKAlFxuICAgICAqIGRvbWFpbnMgYXJlIG9yZ2FuaXNhdGlvbi1zY29wZWQgZXZlcnl3aGVyZSBpbiB0aGlzIGZpbGUsIHNvIHRoYXQgb25lIGlzIG9ubHkgZXZlclxuICAgICAqIGhlYWxlZCBhY3Jvc3MgdGhlIFNBTUUgb3JnYW5pc2F0aW9uLCBleGFjdGx5IGxpa2UgYXQgY3JlYXRpb24gdGltZS5cbiAgICAgKlxuICAgICAqIE5ldmVyIG92ZXJ3cml0ZXMgYSBmaWVsZCB0aGUgdGFyZ2V0IGFscmVhZHkgY2FycmllcyBhIHZhbHVlIGZvcjogYSB2YWx1ZSBlbnRlcmVkIGJ5XG4gICAgICogaGFuZCBpbiB0aGUgdGFyZ2V0IHNwYWNlIHNpbmNlIGFuIGVhcmxpZXIsIGluY29tcGxldGUgY29weSBtdXN0IG5vdCBiZSBjbG9iYmVyZWQgYnlcbiAgICAgKiBhbiBvbGRlciBvciBkaWZmZXJlbnQgc291cmNlIHZhbHVlLlxuICAgICAqXG4gICAgICogUmV0dXJucyBib3RoIHRoZSBwYXRjaCB0byBzZW5kIGFuZCB0aGUgbGlzdCBvZiBoZWFsZWQgZmllbGQgbmFtZXMsIHNvIHRoZSBjYWxsZXIgY2FuXG4gICAgICogYm90aCBwZXJmb3JtIHRoZSB1cGRhdGUgYW5kIGRlc2NyaWJlIGl0IGluIHRoZSBjb3B5IGxvZy5cbiAgICAgKi9cbiAgICBwcml2YXRlIGJ1aWxkSGVhbFBhdGNoKFxuICAgICAgICBzb3VyY2VPYmo6IGFueSxcbiAgICAgICAgZXhpc3RpbmdUYXJnZXQ6IGFueSxcbiAgICAgICAgZmllbGRzOiBzdHJpbmdbXSxcbiAgICAgICAgaW5jbHVkZURvbWFpbjogYm9vbGVhblxuICAgICk6IHsgcGF0Y2g6IGFueTsgaGVhbGVkRmllbGRzOiBzdHJpbmdbXSB9IHtcbiAgICAgICAgY29uc3QgcGF0Y2g6IGFueSA9IHt9O1xuICAgICAgICBjb25zdCBoZWFsZWRGaWVsZHM6IHN0cmluZ1tdID0gW107XG5cbiAgICAgICAgY29uc3QgZmlsbElmTWlzc2luZyA9IChrZXk6IHN0cmluZywgc291cmNlVmFsdWU6IGFueSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY3VycmVudFZhbHVlID0gZXhpc3RpbmdUYXJnZXRba2V5XTtcbiAgICAgICAgICAgIGNvbnN0IGlzTWlzc2luZyA9IGN1cnJlbnRWYWx1ZSA9PT0gbnVsbCB8fCBjdXJyZW50VmFsdWUgPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgIHx8IChBcnJheS5pc0FycmF5KGN1cnJlbnRWYWx1ZSkgJiYgY3VycmVudFZhbHVlLmxlbmd0aCA9PT0gMCk7XG4gICAgICAgICAgICBpZiAoaXNNaXNzaW5nICYmIHNvdXJjZVZhbHVlICE9PSBudWxsICYmIHNvdXJjZVZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBwYXRjaFtrZXldID0gc291cmNlVmFsdWU7XG4gICAgICAgICAgICAgICAgaGVhbGVkRmllbGRzLnB1c2goa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIGZpZWxkcykge1xuICAgICAgICAgICAgZmlsbElmTWlzc2luZyhmaWVsZCwgc291cmNlT2JqW2ZpZWxkXSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGluY2x1ZGVEb21haW4gJiYgKGV4aXN0aW5nVGFyZ2V0LmRvbWFpbklEID09PSBudWxsIHx8IGV4aXN0aW5nVGFyZ2V0LmRvbWFpbklEID09PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICBjb25zdCByZXNvbHZlZERvbWFpbklkID0gdGhpcy5yZXNvbHZlRG9tYWluSUQoc291cmNlT2JqLmRvbWFpbklEKTtcbiAgICAgICAgICAgIGlmIChyZXNvbHZlZERvbWFpbklkKSB7XG4gICAgICAgICAgICAgICAgcGF0Y2guZG9tYWluSUQgPSByZXNvbHZlZERvbWFpbklkO1xuICAgICAgICAgICAgICAgIGhlYWxlZEZpZWxkcy5wdXNoKCdkb21haW5JRCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHsgcGF0Y2gsIGhlYWxlZEZpZWxkcyB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbGxzIGluIHdoaWNoZXZlciBpZGVudGl0eSBmaWVsZCBhIFBSRS1FWElTVElORyB0YXJnZXQgZXF1aXBtZW50IGlzIG1pc3NpbmcgYnV0IHRoZVxuICAgICAqIHNvdXJjZSBoYXMg4oCUIHNlZSB0aGUgY2FsbCBzaXRlIGluIHRoZSBFUVVJUE1FTlRTIHBoYXNlIGZvciB3aHkgcmUtcnVubmluZyB0aGUgY29weVxuICAgICAqIGhhcyB0byBiZSBhYmxlIHRvIHJlcGFpciBhIHByZXZpb3VzbHktY29waWVkIGVxdWlwbWVudCwgbm90IGp1c3Qgc2tpcCBpdCBhZ2Fpbi5cbiAgICAgKlxuICAgICAqIEEgZmFpbGVkIHVwZGF0ZSBpcyBsZWZ0IHRvIGJ1YmJsZSB1cCB0byB0aGUgY2FsbGVyJ3MgZXhpc3RpbmcgcGVyLWl0ZW0gdHJ5L2NhdGNoLCB0aGVcbiAgICAgKiBzYW1lIGFzIGEgZmFpbGVkIGNyZWF0aW9uIOKAlCBpdCBnZXRzIHRoZSBzYW1lIHZpc2libGUgZXJyb3IgbGluZSwgcmF0aGVyIHRoYW4gYSBzaWxlbnRcbiAgICAgKiBjb25zb2xlIHdhcm5pbmcuXG4gICAgICpcbiAgICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIGZpZWxkcyB0aGF0IHdlcmUgYWN0dWFsbHkgaGVhbGVkIChlbXB0eSBpZiBub3RoaW5nIHdhcyBtaXNzaW5nKS5cbiAgICAgKi9cbiAgICBwcml2YXRlIGFzeW5jIGhlYWxFcXVpcG1lbnRJZGVudGl0eShzb3VyY2VPYmo6IGFueSwgZXhpc3RpbmdUYXJnZXQ6IGFueSk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICAgICAgY29uc3QgeyBwYXRjaCwgaGVhbGVkRmllbGRzIH0gPSB0aGlzLmJ1aWxkSGVhbFBhdGNoKFxuICAgICAgICAgICAgc291cmNlT2JqLCBleGlzdGluZ1RhcmdldCxcbiAgICAgICAgICAgIFsnc3RhdHVzJywgJ2Fubm90YXRpb24nLCAnZmFtaWx5JywgJ3NrdScsICdtYW51ZmFjdHVyZXInLCAnaW5zdGFsbERhdGUnLCAnd2FycmFudHlFbmREYXRlJywgJ21ldGFkYXRhJywgJ2lzQ3JlYXRlZEJ5QUknXSxcbiAgICAgICAgICAgIHRydWVcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoIWV4aXN0aW5nVGFyZ2V0LnBob3RvICYmIHNvdXJjZU9iai5waG90bykge1xuICAgICAgICAgICAgcGF0Y2gucGhvdG8gPSBhd2FpdCB0aGlzLmNvcHlTM0tleUlmUHJlc2VudChzb3VyY2VPYmoucGhvdG8sIGBlcXVpcG1lbnQgcGhvdG8gXCIke3NvdXJjZU9iai5uYW1lfVwiYCk7XG4gICAgICAgICAgICBoZWFsZWRGaWVsZHMucHVzaCgncGhvdG8nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChoZWFsZWRGaWVsZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gaGVhbGVkRmllbGRzO1xuICAgICAgICB9XG5cbiAgICAgICAgcGF0Y2guaWQgPSBleGlzdGluZ1RhcmdldC5pZDtcbiAgICAgICAgYXdhaXQgdGhpcy5lcXVpcG1lbnRTZXJ2aWNlLnVwZGF0ZUVxdWlwbWVudChwYXRjaCk7XG4gICAgICAgIHJldHVybiBoZWFsZWRGaWVsZHM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2FtZSBpZGVhIGFzIGhlYWxFcXVpcG1lbnRJZGVudGl0eSgpLCBmb3IgYSBwcmUtZXhpc3RpbmcgdGlja2V0LiBgdGl0bGVgL2BkZXNjcmlwdGlvbmBcbiAgICAgKiBhcmUgdGhlIHBhaXIgZmluZEV4aXN0aW5nKCkgbWF0Y2hlZCBvbiB0byBmaW5kIHRoaXMgdGlja2V0IGluIHRoZSBmaXJzdCBwbGFjZSwgc28gdGhleVxuICAgICAqIGFyZSBuZXZlciBwYXJ0IG9mIHRoZSBoZWFsIOKAlCBieSBjb25zdHJ1Y3Rpb24sIHRoZXkgYWxyZWFkeSBhZ3JlZSB3aXRoIHRoZSBzb3VyY2UuXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3luYyBoZWFsVGlja2V0SWRlbnRpdHkoc291cmNlT2JqOiBhbnksIGV4aXN0aW5nVGFyZ2V0OiBhbnkpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgICAgIGNvbnN0IHsgcGF0Y2gsIGhlYWxlZEZpZWxkcyB9ID0gdGhpcy5idWlsZEhlYWxQYXRjaChcbiAgICAgICAgICAgIHNvdXJjZU9iaiwgZXhpc3RpbmdUYXJnZXQsXG4gICAgICAgICAgICBbJ2ZyaWVuZGx5TGFiZWwnLCAnc3RhdHVzJywgJ3R5cGUnLCAncHJpb3JpdHknLCAnbGV2ZWwnLCAnbWV0YWRhdGEnLCAncmVhZCcsICdwcm9qZWN0SUQnLCAncHJvYmxlbUNvZGUnXSxcbiAgICAgICAgICAgIHRydWVcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoaGVhbGVkRmllbGRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGhlYWxlZEZpZWxkcztcbiAgICAgICAgfVxuXG4gICAgICAgIHBhdGNoLmlkID0gZXhpc3RpbmdUYXJnZXQuaWQ7XG4gICAgICAgIGF3YWl0IHRoaXMudGlja2V0U2VydmljZS51cGRhdGVUaWNrZXQocGF0Y2gpO1xuICAgICAgICByZXR1cm4gaGVhbGVkRmllbGRzO1xuICAgIH1cblxuICAgIC8qKiBTYW1lIGlkZWEsIGZvciBhIHByZS1leGlzdGluZyBmZWF0dXJlLiBLZXl3b3JkcywgbWVkaWEgYW5kIFBPSXMgYXJlIG5vdCBoZWFsZWQgaGVyZVxuICAgICAqICBmb3IgdGhlIHNhbWUgcmVhc29uIG5vdGVzL1BPSXMgYXJlIG5vdCBoZWFsZWQgb24gZXF1aXBtZW50IOKAlCBzZWUgaGVhbEVxdWlwbWVudElkZW50aXR5KCkuICovXG4gICAgcHJpdmF0ZSBhc3luYyBoZWFsRmVhdHVyZUlkZW50aXR5KHNvdXJjZU9iajogYW55LCBleGlzdGluZ1RhcmdldDogYW55KTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgICAgICBjb25zdCB7IHBhdGNoLCBoZWFsZWRGaWVsZHMgfSA9IHRoaXMuYnVpbGRIZWFsUGF0Y2goXG4gICAgICAgICAgICBzb3VyY2VPYmosIGV4aXN0aW5nVGFyZ2V0LFxuICAgICAgICAgICAgWydzaG9ydERlc2NyaXB0aW9uJywgJ2xldmVsJywgJ3R5cGUnLCAnaW5kZXgnLCAnc3RyaXBlUHJvZHVjdElEJywgJ3N0cmlwZVByaWNlSUQnLCAnYm9va2luZ1ByaWNlTWV0YWRhdGEnLCAnbG9jYWxlJ10sXG4gICAgICAgICAgICB0cnVlXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKGhlYWxlZEZpZWxkcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBoZWFsZWRGaWVsZHM7XG4gICAgICAgIH1cblxuICAgICAgICBwYXRjaC5pZCA9IGV4aXN0aW5nVGFyZ2V0LmlkO1xuICAgICAgICBhd2FpdCB0aGlzLmZlYXR1cmVTZXJ2aWNlLnVwZGF0ZUZlYXR1cmUocGF0Y2gpO1xuICAgICAgICByZXR1cm4gaGVhbGVkRmllbGRzO1xuICAgIH1cblxuICAgIC8qKiBTZXJpYWxpc2VzIHRoZSBpZGVudGlmeWluZyBmaWVsZHMgdW5hbWJpZ3VvdXNseSwgc28gdGhhdCBbXCJhXCIsIFwiYlwiXSBhbmQgW1wiYWJcIiwgXCJcIl1cbiAgICAgKiAgY2FuIG5ldmVyIHByb2R1Y2UgdGhlIHNhbWUga2V5LiAqL1xuICAgIHByaXZhdGUgaWRlbnRpdHlLZXkocGFydHM6IEFycmF5PHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ+KTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHBhcnRzLm1hcChwYXJ0ID0+IHBhcnQgPz8gJycpKTtcbiAgICB9XG5cbiAgICAvL1xuICAgIC8vIC0tLS0tLS0tLS0gU3dlZXAgcG9zaXRpb25zIC8gcmlnaWQgdHJhbnNmb3JtIC0tLS0tLS0tLS1cbiAgICAvL1xuXG4gICAgLyoqXG4gICAgICogRmV0Y2hlcyB0aGUgcG9zaXRpb24gb2YgZXZlcnkgc3dlZXAgaW4gYSBzcGFjZSBhbmQgcmV0dXJucyBpdCBhcyBhIE1hcCBmb3IgTygxKSBsb29rdXAuXG4gICAgICogVXNlcyBhbGxTZXR0bGVkIHNvIGEgc2luZ2xlIGZhaWxpbmcgc3dlZXAgbG9va3VwIGRvZXNuJ3QgYWJvcnQgdGhlIHdob2xlIG1hcCDigJRcbiAgICAgKiB0aGF0IHN3ZWVwIGlzIHNpbXBseSBhYnNlbnQgZnJvbSB0aGUgcmVzdWx0aW5nIG1hcCAoYW5kIHNraXBwZWQgbGF0ZXIpLlxuICAgICAqL1xuICAgIHByaXZhdGUgYXN5bmMgYnVpbGROYXZpZ2F0aW9uUG9zaXRpb25NYXAoc3BhY2VJZDogc3RyaW5nLCBzd2VlcElkczogc3RyaW5nW10pOiBQcm9taXNlPE1hcDxzdHJpbmcsIFZlYzM+PiB7XG4gICAgICAgIGNvbnN0IG1hcCA9IG5ldyBNYXA8c3RyaW5nLCBWZWMzPigpO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoXG4gICAgICAgICAgICBzd2VlcElkcy5tYXAoYXN5bmMgKHNpZCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5hdnMgPSBhd2FpdCB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmdldE5hdmlnYXRpb25zRm9yTWF0dGVycG9ydElERm9yU3BhY2Uoc2lkLCBzcGFjZUlkKTtcbiAgICAgICAgICAgICAgICBpZiAobmF2cyAmJiBuYXZzLmxlbmd0aCA+IDAgJiYgbmF2c1swXS5wb3NpdGlvbikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBzaWQsIHBvc2l0aW9uOiBKU09OLnBhcnNlKG5hdnNbMF0ucG9zaXRpb24pIGFzIFZlYzMgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuXG4gICAgICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIHJlc3VsdHMpIHtcbiAgICAgICAgICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSAnZnVsZmlsbGVkJyAmJiByZXN1bHQudmFsdWUpIHtcbiAgICAgICAgICAgICAgICBtYXAuc2V0KHJlc3VsdC52YWx1ZS5zaWQsIHJlc3VsdC52YWx1ZS5wb3NpdGlvbik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdC5zdGF0dXMgPT09ICdyZWplY3RlZCcpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ0ZhaWxlZCB0byBmZXRjaCBhIHN3ZWVwIHBvc2l0aW9uLCBza2lwcGluZyBpdDonLCByZXN1bHQucmVhc29uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBtYXA7XG4gICAgfVxuXG4gICAgLyoqIEFwcGxpZXMgdGhlIHJpZ2lkIHRyYW5zZm9ybSB0byBhIFBPSSBjb29yZGluYXRlIChwb3NpdGlvbiArIG9yaWVudGF0aW9uKS4gKi9cbiAgICBwcml2YXRlIGdldEFkanVzdGVkQ29vcmRpbmF0ZXMoY29vcmRpbmF0ZTogc3RyaW5nLCB0cmFuc2Zvcm06IFJpZ2lkVHJhbnNmb3JtKTogYW55IHtcbiAgICAgICAgaWYgKGNvb3JkaW5hdGUgPT09IFwibnVsbFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWNvb3JkaW5hdGUgfHwgdHlwZW9mIGNvb3JkaW5hdGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gY29vcmRpbmF0ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UoY29vcmRpbmF0ZSk7XG4gICAgICAgIGNvbnN0IHJvdGF0ZWRQb3MgPSBhcHBseVJpZ2lkVHJhbnNmb3JtVG9Qb2ludChcbiAgICAgICAgICAgIHsgeDogcGFyc2VkLngsIHk6IHBhcnNlZC55LCB6OiBwYXJzZWQueiB9LFxuICAgICAgICAgICAgdHJhbnNmb3JtXG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHg6IHJvdGF0ZWRQb3MueCxcbiAgICAgICAgICAgIHk6IHJvdGF0ZWRQb3MueSxcbiAgICAgICAgICAgIHo6IHJvdGF0ZWRQb3MueixcbiAgICAgICAgICAgIHhSb3RhdGlvbjogcGFyc2VkLnhSb3RhdGlvbixcbiAgICAgICAgICAgIHlSb3RhdGlvbjogYXBwbHlSaWdpZFRyYW5zZm9ybVRvWVJvdGF0aW9uRGVnKHBhcnNlZC55Um90YXRpb24sIHRyYW5zZm9ybSlcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWFkcyBhIHN0b3JlZCBjb29yZGluYXRlIChKU09OIHN0cmluZyBvciBvYmplY3QsIHdoYXRldmVyIGl0cyBzcGFjaW5nKSBhcyBhIHBvc2l0aW9uLlxuICAgICAqIE51bGwgZm9yIGEgdmlydHVhbCBQT0kgb3IgYW4gdW5yZWFkYWJsZSB2YWx1ZS5cbiAgICAgKi9cbiAgICBwcml2YXRlIHBhcnNlQ29vcmRpbmF0ZSh2YWx1ZTogYW55KTogVmVjMyB8IG51bGwge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IEpTT04ucGFyc2UodmFsdWUpIDogdmFsdWU7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VkICYmIHR5cGVvZiBwYXJzZWQueCA9PT0gJ251bWJlcidcbiAgICAgICAgICAgICAgICA/IHsgeDogcGFyc2VkLngsIHk6IHBhcnNlZC55LCB6OiBwYXJzZWQueiB9XG4gICAgICAgICAgICAgICAgOiBudWxsO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIFR3byBwb3NpdGlvbnMgd2l0aGluIDEgY20gYXJlIHRoZSBzYW1lICh0d28gdmlydHVhbCBQT0lzLCBib3RoIG51bGwsIGFyZSB0b28pLiAqL1xuICAgIHByaXZhdGUgaXNTYW1lUG9zaXRpb24oYTogVmVjMyB8IG51bGwsIGI6IFZlYzMgfCBudWxsLCB0b2xlcmFuY2VNID0gMC4wMSk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIWEgfHwgIWIpIHtcbiAgICAgICAgICAgIHJldHVybiAhYSAmJiAhYjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGlzdGFuY2UoYSwgYikgPD0gdG9sZXJhbmNlTTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBcHBsaWVzIHRoZSByaWdpZCB0cmFuc2Zvcm0ncyB0cmFuc2xhdGlvbityb3RhdGlvbiB0byBhIHBsYWluIHt4LHksen0gcG9zaXRpb24sXG4gICAgICogV0lUSE9VVCBhZGRpbmcgeFJvdGF0aW9uL3lSb3RhdGlvbiBrZXlzLiBVc2VkIGZvciBtZWFzdXJlbWVudHMsIHdob3NlIHN0b3JlZFxuICAgICAqIGNvb3JkaW5hdGUgaXMgYSBiYXJlIHBvc2l0aW9uIChubyBvcmllbnRhdGlvbiksIHVubGlrZSBvdGhlciBQT0kgdHlwZXMuXG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRBZGp1c3RlZFBvc2l0aW9uT25seShjb29yZGluYXRlOiBzdHJpbmcsIHRyYW5zZm9ybTogUmlnaWRUcmFuc2Zvcm0pOiBhbnkge1xuICAgICAgICBpZiAoIWNvb3JkaW5hdGUgfHwgdHlwZW9mIGNvb3JkaW5hdGUgIT09ICdzdHJpbmcnIHx8IGNvb3JkaW5hdGUgPT09ICdudWxsJykge1xuICAgICAgICAgICAgcmV0dXJuIGNvb3JkaW5hdGU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShjb29yZGluYXRlKTtcbiAgICAgICAgcmV0dXJuIGFwcGx5UmlnaWRUcmFuc2Zvcm1Ub1BvaW50KHsgeDogcGFyc2VkLngsIHk6IHBhcnNlZC55LCB6OiBwYXJzZWQueiB9LCB0cmFuc2Zvcm0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbmRzIHRoZSBjbG9zZXN0IHRhcmdldCBzd2VlcCwgY29tcGFyaW5nIHBvc2l0aW9ucyBpbiB0aGUgU0FNRSBjb29yZGluYXRlIGZyYW1lLlxuICAgICAqIFB1cmUgaW4tbWVtb3J5IGxvb2t1cCDigJQgbm8gbmV0d29yayBjYWxsLCB0aGFua3MgdG8gdGhlIHByZS1idWlsdCBwb3NpdGlvbiBtYXBzLlxuICAgICAqL1xuICAgIHByaXZhdGUgZmluZENsb3Nlc3RUYXJnZXRTd2VlcElkKFxuICAgICAgICBzb3VyY2VTd2VlcElEOiBzdHJpbmcsXG4gICAgICAgIHNvdXJjZU5hdlBvc2l0aW9uczogTWFwPHN0cmluZywgVmVjMz4sXG4gICAgICAgIHRhcmdldE5hdlBvc2l0aW9uczogTWFwPHN0cmluZywgVmVjMz4sXG4gICAgICAgIHRyYW5zZm9ybTogUmlnaWRUcmFuc2Zvcm1cbiAgICApOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgaWYgKCFzb3VyY2VTd2VlcElEKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCBzb3VyY2VQb3MgPSBzb3VyY2VOYXZQb3NpdGlvbnMuZ2V0KHNvdXJjZVN3ZWVwSUQpO1xuICAgICAgICBpZiAoIXNvdXJjZVBvcykgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgY29uc3Qgc291cmNlUG9zSW5UYXJnZXRGcmFtZSA9IGFwcGx5UmlnaWRUcmFuc2Zvcm1Ub1BvaW50KHNvdXJjZVBvcywgdHJhbnNmb3JtKTtcblxuICAgICAgICBsZXQgY2xvc2VzdFN3ZWVwSUQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgICAgICBsZXQgbWluRGlzdGFuY2UgPSBJbmZpbml0eTtcblxuICAgICAgICBmb3IgKGNvbnN0IFt0YXJnZXRTd2VlcElkLCB0YXJnZXRQb3NdIG9mIHRhcmdldE5hdlBvc2l0aW9ucy5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGR4ID0gdGFyZ2V0UG9zLnggLSBzb3VyY2VQb3NJblRhcmdldEZyYW1lLng7XG4gICAgICAgICAgICBjb25zdCBkeSA9IHRhcmdldFBvcy55IC0gc291cmNlUG9zSW5UYXJnZXRGcmFtZS55O1xuICAgICAgICAgICAgY29uc3QgZHogPSB0YXJnZXRQb3MueiAtIHNvdXJjZVBvc0luVGFyZ2V0RnJhbWUuejtcbiAgICAgICAgICAgIGNvbnN0IGRpc3QgPSBNYXRoLnNxcnQoZHggKiBkeCArIGR5ICogZHkgKyBkeiAqIGR6KTtcblxuICAgICAgICAgICAgaWYgKGRpc3QgPCBtaW5EaXN0YW5jZSkge1xuICAgICAgICAgICAgICAgIG1pbkRpc3RhbmNlID0gZGlzdDtcbiAgICAgICAgICAgICAgICBjbG9zZXN0U3dlZXBJRCA9IHRhcmdldFN3ZWVwSWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY2xvc2VzdFN3ZWVwSUQ7XG4gICAgfVxuXG4gICAgLy9cbiAgICAvLyAtLS0tLS0tLS0tIFMzIGZpbGUgZHVwbGljYXRpb24gLS0tLS0tLS0tLVxuICAgIC8vXG5cbiAgICAvKiogR2VuZXJhdGVzIGEgc2hvcnQgcmFuZG9tIGlkLCB1c2VkIHRvIGdpdmUgZWFjaCBjb3BpZWQgUzMgZmlsZSBhIGZyZXNoLCBjb2xsaXNpb24tc2FmZSBrZXkuICovXG4gICAgcHJpdmF0ZSBnZW5lcmF0ZVNob3J0SWQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIsIDEwKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBCdWlsZHMgYSBuZXcgUzMga2V5IGZvciBhIGNvcGllZCBhdHRhY2htZW50IGFuZCBzYW5pdGl6ZXMgdGhlIGZpbGVuYW1lXG4gICAgICogdG8gcHJldmVudCBBV1MgQW1wbGlmeSBTaWduYXR1cmVEb2VzTm90TWF0Y2ggZXJyb3JzLlxuICAgICAqIGBmb2xkZXJPdmVycmlkZWAgcmUtaG9tZXMgdGhlIGNvcHkgaW50byBhbm90aGVyIHByZWZpeCDigJQgdXNlZCBmb3IgdGFnIGljb25zLCB3aGljaFxuICAgICAqIGFyZSBzdG9yZWQgcGVyIHNwYWNlIChgaWNvbnMtdGFncy88c3BhY2VJZD4vYCkgYW5kIG11c3QgZm9sbG93IHRoZSB0YXJnZXQgc3BhY2UuXG4gICAgICovXG4gICAgcHJpdmF0ZSBidWlsZENvcGllZEF0dGFjaG1lbnRLZXkoc291cmNlQW5uZXhlOiBzdHJpbmcsIGZvbGRlck92ZXJyaWRlOiBzdHJpbmcgfCBudWxsID0gbnVsbCk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IGxhc3RTbGFzaCA9IHNvdXJjZUFubmV4ZS5sYXN0SW5kZXhPZignLycpO1xuICAgICAgICBjb25zdCBmb2xkZXIgPSBmb2xkZXJPdmVycmlkZSA/PyBzb3VyY2VBbm5leGUuc3Vic3RyaW5nKDAsIGxhc3RTbGFzaCArIDEpO1xuICAgICAgICBsZXQgZmlsZW5hbWUgPSBzb3VyY2VBbm5leGUuc3Vic3RyaW5nKGxhc3RTbGFzaCArIDEpO1xuXG4gICAgICAgIC8vIFN0cmlwIGEgbGVhZGluZyBcIjw4IGhleCBjaGFycz5fXCIgaWQgcHJlZml4IGlmIHByZXNlbnRcbiAgICAgICAgY29uc3QgcHJlZml4TWF0Y2ggPSBmaWxlbmFtZS5tYXRjaCgvXlswLTlhLWZBLUYtXXs4fV8oLispJC8pO1xuICAgICAgICBpZiAocHJlZml4TWF0Y2gpIHtcbiAgICAgICAgICAgIGZpbGVuYW1lID0gcHJlZml4TWF0Y2hbMV07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTQU5JVElaQVRJT046IFJlcGxhY2Ugc3BhY2VzLCBwYXJlbnRoZXNlcywgYW5kIGFjY2VudHMgd2l0aCB1bmRlcnNjb3Jlc1xuICAgICAgICAvLyBDcnVjaWFsIHRvIHByZXZlbnQgQW1wbGlmeSdzIFN0b3JhZ2UuY29weSBmcm9tIGZhaWxpbmcgdGhlIHNpZ25hdHVyZSBjYWxjdWxhdGlvblxuICAgICAgICBmaWxlbmFtZSA9IGZpbGVuYW1lLnJlcGxhY2UoL1teYS16QS1aMC05LlxcLV9dL2csICdfJyk7XG5cbiAgICAgICAgY29uc3QgbmV3UHJlZml4ID0gYCR7dGhpcy5nZW5lcmF0ZVNob3J0SWQoKX1fYDtcbiAgICAgICAgcmV0dXJuIGAke2ZvbGRlcn0ke25ld1ByZWZpeH0ke2ZpbGVuYW1lfWA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRHVwbGljYXRlcyBhbiBTMyBvYmplY3QgaWYgYSBrZXkgaXMgcHJlc2VudC5cbiAgICAgKiAtIElmIHRoZSBzb3VyY2UgZmlsZSBpcyBnZW51aW5lbHkgbWlzc2luZyBmcm9tIFMzIChOb1N1Y2hLZXkgLyBvcnBoYW5lZCBEQiByZWZlcmVuY2UpLFxuICAgICAqICAgdGhyb3dzIGEgTWlzc2luZ1MzRmlsZUVycm9yIHNvIHRoZSBjYWxsZXIgY2FuIGxvZyBhIGNsZWFyLCBzcGVjaWZpYyBtZXNzYWdlIGFuZFxuICAgICAqICAgc2tpcCB0aGUgd2hvbGUgaXRlbSBlbnRpcmVseSwgcmF0aGVyIHRoYW4gY3JlYXRpbmcgYSByZWNvcmQgd2l0aCBhIGJyb2tlbiBmaWxlIGxpbmsuXG4gICAgICogLSBBbnkgb3RoZXIga2luZCBvZiBmYWlsdXJlIChwZXJtaXNzaW9ucywgbmV0d29yaywgZXRjLikgc3RpbGwgdGhyb3dzIGEgZ2VuZXJpYyBFcnJvci5cbiAgICAgKi9cbiAgICBwcml2YXRlIGFzeW5jIGNvcHlTM0tleUlmUHJlc2VudChcbiAgICAgICAga2V5OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLFxuICAgICAgICBjb250ZXh0TGFiZWw6IHN0cmluZyxcbiAgICAgICAgZm9sZGVyT3ZlcnJpZGU6IHN0cmluZyB8IG51bGwgPSBudWxsXG4gICAgKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG4gICAgICAgIGlmICgha2V5KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzb3VyY2VLZXkgPSB0aGlzLmV4dHJhY3RTM0tleUZyb21WYWx1ZShrZXkpO1xuICAgICAgICBjb25zdCBkZXN0S2V5ID0gdGhpcy5idWlsZENvcGllZEF0dGFjaG1lbnRLZXkoc291cmNlS2V5LCBmb2xkZXJPdmVycmlkZSk7XG5cbiAgICAgICAgLy8gTG9nIHRoZSBzb3VyY2Uga2V5IHRvIGVuc3VyZSBpdCBtYXRjaGVzIHRoZSByZWFsIFMzIG9iamVjdCBwYXRoXG4gICAgICAgIGNvbnNvbGUubG9nKGBbREVCVUddIEF0dGVtcHRpbmcgUzMgY29weSBmcm9tIHNvdXJjZTogXCIke3NvdXJjZUtleX1cIiB0byBkZXN0OiBcIiR7ZGVzdEtleX1cImApO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBjb3BpZWQgPSBhd2FpdCBjb3B5RmlsZUluUzMoc291cmNlS2V5LCBkZXN0S2V5KTtcbiAgICAgICAgICAgIGlmICghY29waWVkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdTM0ZpbGVFcnJvcihzb3VyY2VLZXksIGNvbnRleHRMYWJlbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY29waWVkO1xuICAgICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pc01pc3NpbmdTM0ZpbGUoZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGBbTWF0dGVycG9ydFRhZ0NvcHlTZXJ2aWNlXSBPcnBoYW5lZCBTMyByZWZlcmVuY2UsIHNraXBwaW5nIGl0ZW06IFwiJHtzb3VyY2VLZXl9XCIgKCR7Y29udGV4dExhYmVsfSlgKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWlzc2luZ1MzRmlsZUVycm9yKHNvdXJjZUtleSwgY29udGV4dExhYmVsKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gU3RvcmFnZS5jb3B5KCkgY2Fubm90IGhhbmRsZSBhIGtleSBob2xkaW5nIGEgc3BhY2UsIGFuIGFjY2VudCBvciBhIHBhcmVudGhlc2lzOlxuICAgICAgICAgICAgLy8gaXQgcHV0cyB0aGUga2V5IHVuZW5jb2RlZCBpbnRvIGB4LWFtei1jb3B5LXNvdXJjZWAsIHdoaWNoIHRoZW4gZGlzYWdyZWVzIHdpdGggdGhlXG4gICAgICAgICAgICAvLyBzaWduZWQgcmVxdWVzdC4gVGhvc2UgZmlsZXMgYXJlIHBlcmZlY3RseSByZWFkYWJsZSDigJQgb25seSB0aGF0IGhlYWRlciBpcyBicm9rZW4g4oCUXG4gICAgICAgICAgICAvLyBzbyBmYWxsIGJhY2sgdG8gZG93bmxvYWRpbmcgYW5kIHJlLXVwbG9hZGluZyB0aGVtLlxuICAgICAgICAgICAgaWYgKHRoaXMuaXNTaWduYXR1cmVNaXNtYXRjaChlcnJvcikpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYFtNYXR0ZXJwb3J0VGFnQ29weVNlcnZpY2VdIFN0b3JhZ2UuY29weSgpIHNpZ25hdHVyZSBtaXNtYXRjaCBvbiBcIiR7c291cmNlS2V5fVwiLCBmYWxsaW5nIGJhY2sgdG8gZG93bmxvYWQgKyByZS11cGxvYWQuYCk7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29waWVkID0gYXdhaXQgY29weUZpbGVJblMzVmlhRG93bmxvYWQoc291cmNlS2V5LCBkZXN0S2V5KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjb3BpZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBNaXNzaW5nUzNGaWxlRXJyb3Ioc291cmNlS2V5LCBjb250ZXh0TGFiZWwpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjb3BpZWQ7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZmFsbGJhY2tFcnJvcjogYW55KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzTWlzc2luZ1MzRmlsZShmYWxsYmFja0Vycm9yKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdTM0ZpbGVFcnJvcihzb3VyY2VLZXksIGNvbnRleHRMYWJlbCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZmFsbGJhY2tFcnJvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIFRydWUgd2hlbiB0aGUgZmFpbHVyZSBtZWFucyB0aGUgc291cmNlIG9iamVjdCBzaW1wbHkgaXMgbm90IG9uIFMzIChvcnBoYW5lZCByZWZlcmVuY2UpLiAqL1xuICAgIHByaXZhdGUgaXNNaXNzaW5nUzNGaWxlKGVycm9yOiBhbnkpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGVycm9yIGluc3RhbmNlb2YgTWlzc2luZ1MzRmlsZUVycm9yXG4gICAgICAgICAgICB8fCBlcnJvcj8uY29kZSA9PT0gJ05vU3VjaEtleSdcbiAgICAgICAgICAgIHx8IGVycm9yPy5uYW1lID09PSAnTm9TdWNoS2V5J1xuICAgICAgICAgICAgfHwgL05vU3VjaEtleXxkb2VzIG5vdCBleGlzdHxOb3RGb3VuZC9pLnRlc3QodG9FcnJvck1lc3NhZ2UoZXJyb3IpKTtcbiAgICB9XG5cbiAgICAvKiogVHJ1ZSB3aGVuIEFwcFN5bmMgcmVmdXNlZCB0aGUgb3BlcmF0aW9uIGZvciBsYWNrIG9mIHBlcm1pc3Npb24sIGFzIG9wcG9zZWQgdG8gZmFpbGluZyBpdC5cbiAgICAgKiAgTm90aGluZyBjYW4gYmUgcmV0cmllZCBvciB3b3JrZWQgYXJvdW5kIGNsaWVudC1zaWRlOiB0aGUgYWNjb3VudCBzaW1wbHkgaXMgbm90IGFsbG93ZWRcbiAgICAgKiAgdG8gd3JpdGUgdGhhdCBtb2RlbCwgd2hpY2ggaXMgYSBiYWNrZW5kIGF1dGhvcmlzYXRpb24gcnVsZSAoQGF1dGgpIHRvIGNoYW5nZS4gKi9cbiAgICBwcml2YXRlIGlzVW5hdXRob3JpemVkKGVycm9yOiBhbnkpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IHRvRXJyb3JNZXNzYWdlKGVycm9yKTtcbiAgICAgICAgcmV0dXJuIGVycm9yPy5lcnJvclR5cGUgPT09ICdVbmF1dGhvcml6ZWQnXG4gICAgICAgICAgICB8fCAvVW5hdXRob3JpemVkfE5vdCBBdXRob3JpemVkIHRvIGFjY2Vzcy9pLnRlc3QobWVzc2FnZSk7XG4gICAgfVxuXG4gICAgLyoqIFRydWUgZm9yIHRoZSBTaWdWNCBtaXNtYXRjaCBTdG9yYWdlLmNvcHkoKSByYWlzZXMgb24ga2V5cyB3aXRoIHNwZWNpYWwgY2hhcmFjdGVycy4gKi9cbiAgICBwcml2YXRlIGlzU2lnbmF0dXJlTWlzbWF0Y2goZXJyb3I6IGFueSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gZXJyb3I/LmNvZGUgPT09ICdTaWduYXR1cmVEb2VzTm90TWF0Y2gnXG4gICAgICAgICAgICB8fCBlcnJvcj8ubmFtZSA9PT0gJ1NpZ25hdHVyZURvZXNOb3RNYXRjaCdcbiAgICAgICAgICAgIHx8IC9zaWduYXR1cmUgd2UgY2FsY3VsYXRlZCBkb2VzIG5vdCBtYXRjaHxTaWduYXR1cmVEb2VzTm90TWF0Y2gvaS50ZXN0KHRvRXJyb3JNZXNzYWdlKGVycm9yKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRHVwbGljYXRlcyB0aGUgZmlsZSByZWZlcmVuY2VkIGJ5IGEgUE9JJ3MgdGFnSWNvbiAoYSBKU09OIHN0cmluZyBzaGFwZWQgbGlrZVxuICAgICAqIHsgc3JjLCBvcGFjaXR5IH0sIHBlciBmb3JtLWZlYXR1cmUuY29tcG9uZW50LnRzKS5cbiAgICAgKlxuICAgICAqIFR3byBiZWhhdmlvdXJzIG1hdHRlciBoZXJlOlxuICAgICAqICAtIHRoZSBjb3B5IGlzIHJlLWhvbWVkIHVuZGVyIHRoZSBUQVJHRVQgc3BhY2UncyBpY29uIGZvbGRlclxuICAgICAqICAgIChgaWNvbnMtdGFncy88dGFyZ2V0U3BhY2VJZD4vYCwgdGhlIGxheW91dCBmb3JtLWZlYXR1cmUuY29tcG9uZW50LnRzIHVwbG9hZHMgdG8pLlxuICAgICAqICAgIEtlZXBpbmcgdGhlIHNvdXJjZSBmb2xkZXIgcHJvZHVjZWQgYSB0YXJnZXQgc3BhY2Ugd2hvc2UgaWNvbnMgYWxsIGxpdmVkIHVuZGVyXG4gICAgICogICAgYW5vdGhlciBzcGFjZSdzIHByZWZpeCwgc28gY2xlYW5pbmcgdXAgdGhlIHNvdXJjZSBzcGFjZSBicm9rZSB0aGUgY29weSdzIGljb25zLlxuICAgICAqICAtIGEgbWlzc2luZyBpY29uIGZpbGUgaXMgTk9UIGZhdGFsLiBJdCB1c2VkIHRvIGJ1YmJsZSB1cCBhcyBhIE1pc3NpbmdTM0ZpbGVFcnJvciBhbmRcbiAgICAgKiAgICBhYm9ydCB0aGUgd2hvbGUgUE9JIOKAlCBsb3NpbmcgdGhlIHBhc3RpbGxlLCBpdHMgdGV4dCBhbmQgaXRzIG1lZGlhIGJlY2F1c2Ugb2YgYVxuICAgICAqICAgIGRlY29yYXRpdmUgZmlsZS4gVGhlIFBPSSBpcyBub3cgY3JlYXRlZCB3aXRoIHRoZSBpY29uIHJlZmVyZW5jZSBkcm9wcGVkLCB3aGljaFxuICAgICAqICAgIHJlbmRlcnMgdGhlIG1vZHVsZSdzIGRlZmF1bHQgaWNvbiwgYW5kIGEgbG9nIGxpbmUgcmVwb3J0cyBpdC5cbiAgICAgKi9cbiAgICBwcml2YXRlIGFzeW5jIGR1cGxpY2F0ZVRhZ0ljb24odGFnSWNvblJhdzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCk6IFByb21pc2U8c3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBpZiAoIXRhZ0ljb25SYXcpIHtcbiAgICAgICAgICAgIHJldHVybiB0YWdJY29uUmF3ID8/IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcGFyc2VkOiBhbnk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBwYXJzZWQgPSBKU09OLnBhcnNlKHRhZ0ljb25SYXcpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8vIE5vdCBKU09OIOKAlCBsZWF2ZSB1bnRvdWNoZWQgcmF0aGVyIHRoYW4gZ3Vlc3MuXG4gICAgICAgICAgICByZXR1cm4gdGFnSWNvblJhdztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcGFyc2VkIHx8IHR5cGVvZiBwYXJzZWQgIT09ICdvYmplY3QnIHx8ICFwYXJzZWQuc3JjKSB7XG4gICAgICAgICAgICByZXR1cm4gdGFnSWNvblJhdztcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBwYXJzZWQuc3JjID0gYXdhaXQgdGhpcy5jb3B5UzNLZXlJZlByZXNlbnQoXG4gICAgICAgICAgICAgICAgcGFyc2VkLnNyYywgJ3RhZyBpY29uJywgdGhpcy5idWlsZFRhcmdldEljb25Gb2xkZXIoKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBjYXRjaCAoaWNvbkVycm9yKSB7XG4gICAgICAgICAgICBpZiAoIShpY29uRXJyb3IgaW5zdGFuY2VvZiBNaXNzaW5nUzNGaWxlRXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgLy8gQSByZWFsIGZhaWx1cmUgKHBlcm1pc3Npb25zLCBuZXR3b3JrLCAuLi4pIHN0aWxsIGFib3J0cyB0aGUgUE9JOiBpdCBtZWFuc1xuICAgICAgICAgICAgICAgIC8vIHRoZSBjb3B5IGNhbm5vdCBiZSB0cnVzdGVkLCB1bmxpa2UgYSBmaWxlIHRoYXQgaXMgc2ltcGx5IGFscmVhZHkgZ29uZS5cbiAgICAgICAgICAgICAgICB0aHJvdyBpY29uRXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYFtNYXR0ZXJwb3J0VGFnQ29weVNlcnZpY2VdIFRhZyBpY29uIG1pc3Npbmcgb24gUzMsIGZhbGxpbmcgYmFjayB0byB0aGUgZGVmYXVsdCBpY29uOiBcIiR7aWNvbkVycm9yLnNvdXJjZUtleX1cImApO1xuICAgICAgICAgICAgdGhpcy5sb2dJdGVtRXJyb3IoJ3dhcm5pbmdUYWdJY29uTWlzc2luZycsIHsgZmlsZTogaWNvbkVycm9yLnNvdXJjZUtleSB9KTtcbiAgICAgICAgICAgIGRlbGV0ZSBwYXJzZWQuc3JjO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHBhcnNlZCk7XG4gICAgfVxuXG4gICAgLyoqIEljb24gZm9sZGVyIG9mIHRoZSBzcGFjZSBiZWluZyBjb3BpZWQgaW50bywgbWF0Y2hpbmcgd2hhdCB0aGUgZmVhdHVyZSBmb3JtIHVwbG9hZHMgdG8uICovXG4gICAgcHJpdmF0ZSBidWlsZFRhcmdldEljb25Gb2xkZXIoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLnRhcmdldFNwYWNlSWQgPyBgaWNvbnMtdGFncy8ke3RoaXMudGFyZ2V0U3BhY2VJZH0vYCA6IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXh0cmFjdHMgYW5kIG5vcm1hbGl6ZXMgdGhlIHJhdyBTMyBrZXkgZnJvbSBhIHN0b3JlZCB2YWx1ZSAod2hpY2ggbWF5IGJlIGEgZnVsbCBVUkxcbiAgICAgKiBvciBhbHJlYWR5IGEgcmF3IGtleSkuXG4gICAgICogSU1QT1JUQU5UOiB0aGlzIG11c3QgcmV0dXJuIHRoZSBSQVcgKGRlY29kZWQsIG5vbiBVUkwtZW5jb2RlZCkga2V5LiBBbXBsaWZ5J3NcbiAgICAgKiBTdG9yYWdlLmNvcHkoKSBhbHJlYWR5IGJ1aWxkcyBhbmQgZW5jb2RlcyB0aGUgJ3gtYW16LWNvcHktc291cmNlJyBoZWFkZXIgaW50ZXJuYWxseVxuICAgICAqIGZyb20gdGhlIGtleSB3ZSBnaXZlIGl0LiBQcmUtZW5jb2RpbmcgaXQgaGVyZSBjYXVzZWQgYSBkb3VibGUtZW5jb2RpbmcgYnVnIChlLmcuIGFcbiAgICAgKiBzcGFjZSBiZWNhbWUgXCIlMjUyMFwiIGluc3RlYWQgb2YgXCIlMjBcIiksIHNvIFN0b3JhZ2UuY29weSgpIGxvb2tlZCBmb3IgYSBrZXkgdGhhdCBuZXZlclxuICAgICAqIGV4aXN0ZWQgb24gUzMsIHJlc3VsdGluZyBpbiBhIE5vU3VjaEtleSBlcnJvci5cbiAgICAgKi9cbiAgICBwcml2YXRlIGV4dHJhY3RTM0tleUZyb21WYWx1ZSh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGV4dHJhY3RlZCA9IHZhbHVlO1xuXG4gICAgICAgIC8vIDEuIEV4dHJhY3QgcGF0aCBmcm9tIFVSTCBhbmQgZHJvcCBxdWVyeSBwYXJhbXNcbiAgICAgICAgaWYgKHZhbHVlLnN0YXJ0c1dpdGgoJ2h0dHA6Ly8nKSB8fCB2YWx1ZS5zdGFydHNXaXRoKCdodHRwczovLycpKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwodmFsdWUpO1xuICAgICAgICAgICAgICAgIGV4dHJhY3RlZCA9IGRlY29kZVVSSUNvbXBvbmVudCh1cmwucGF0aG5hbWUpO1xuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgZXh0cmFjdGVkID0gdmFsdWUuc3BsaXQoJz8nKVswXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGV4dHJhY3RlZCA9IHZhbHVlLnNwbGl0KCc/JylbMF07XG4gICAgICAgIH1cblxuICAgICAgICAvLyAyLiBSZW1vdmUgbGVhZGluZyBzbGFzaFxuICAgICAgICBpZiAoZXh0cmFjdGVkLnN0YXJ0c1dpdGgoJy8nKSkge1xuICAgICAgICAgICAgZXh0cmFjdGVkID0gZXh0cmFjdGVkLnN1YnN0cmluZygxKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDMuIFJlbW92ZSAncHVibGljLycgcHJlZml4XG4gICAgICAgIC8vIEFtcGxpZnkgcHJlcGVuZHMgdGhpcyBhdXRvbWF0aWNhbGx5OyB3ZSBtdXN0IHN0cmlwIGl0IGZyb20gdGhlIGlucHV0XG4gICAgICAgIC8vIHRvIGF2b2lkIHRoZSAncHVibGljL3B1YmxpYy8nIGRvdWJsZS1wcmVmaXggaXNzdWUuXG4gICAgICAgIGlmIChleHRyYWN0ZWQuc3RhcnRzV2l0aCgncHVibGljLycpKSB7XG4gICAgICAgICAgICBleHRyYWN0ZWQgPSBleHRyYWN0ZWQuc3Vic3RyaW5nKCdwdWJsaWMvJy5sZW5ndGgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmV0dXJuIHRoZSByYXcga2V5IGFzLWlzIOKAlCBTdG9yYWdlLmNvcHkoKSB0YWtlcyBjYXJlIG9mIHByb3Blcmx5IGVuY29kaW5nIGl0XG4gICAgICAgIC8vIGZvciB0aGUgQ29weVNvdXJjZSBoZWFkZXIuIERvIE5PVCByZS1lbmNvZGUgaXQgaGVyZS5cbiAgICAgICAgcmV0dXJuIGV4dHJhY3RlZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBCb3RoIHRhZyBsaXN0cyBhIHJlY2FsaWJyYXRpb24gY2FuIG9mZmVyIGZvciBhIHRhcmdldCBzcGFjZSwgY29tcHV0ZWQgaW4gb25lIHBhc3MuIE9ubHlcbiAgICAgKiB0aGUgdGFyZ2V0IGxvY2F0aW9uJ3Mgb3duIHRhZ3MgYXJlIGV2ZXIgbGlzdGVkIChzZWUgUmVjYWxpYnJhdGlvblRhZ1Njb3BlKTsgdGFncyB3aG9zZVxuICAgICAqIGVsZW1lbnQgd2FzIGRlbGV0ZWQg4oCUIG9ycGhhbiBQT0lzIOKAlCBuZXZlciBhcmUuXG4gICAgICogIC0gYHNwYWNlYDogZXZlcnkgdGFnIG9mIHRoZSBsb2NhdGlvbiwgaW4gYW55IG9mIGl0cyB2aXNpdHM7XG4gICAgICogIC0gYHZpc2l0YDogdGhlIHRhZ3Mgb2YgdGhlIGxvY2F0aW9uIHNpdHRpbmcgb24gdGhlIHN3ZWVwcyBvZiB0aGUgc2VsZWN0ZWQgdGFyZ2V0IHZpc2l0XG4gICAgICogICAgKGBvcHRpb25zLnRhcmdldE5vZGVJZGApOyBlbXB0eSB3aGVuIG5vIHZpc2l0IGlzIGdpdmVuLlxuICAgICAqIFdpdGggYG9wdGlvbnMub25seVRhZ3NJblNvdXJjZWAgYW5kIGEgc291cmNlIG90aGVyIHRoYW4gdGhlIHRhcmdldCwgYm90aCBsaXN0cyBvbmx5IGtlZXBcbiAgICAgKiB0aGUgdGFncyB0aGF0IGFsc28gZXhpc3QgaW4gdGhlIHNvdXJjZSBsb2NhdGlvbiAoc2FtZSBpZGVudGl0eSBhcyB0aGUgY29weSdzIGR1cGxpY2F0ZVxuICAgICAqIGRldGVjdGlvbik6IHR5cGljYWxseSB0aGUgdGFncyBhbiBlYXJsaWVyIGNvcHkgYnJvdWdodCBvdmVyLlxuICAgICAqXG4gICAgICogQSBQT0kgY2FycmllcyBubyBuYW1lIG9mIGl0cyBvd246IGVhY2ggdGFnIGdldHMgYGVsZW1lbnROYW1lYCwgdGhlIG5hbWUgb2YgdGhlIGVsZW1lbnRcbiAgICAgKiBpdCBwb2ludHMgYXQgKHRpY2tldCB0aXRsZSwgZXF1aXBtZW50IG5hbWUsIC4uLikuXG4gICAgICovXG4gICAgYXN5bmMgZ2V0UmVjYWxpYnJhdGlvblRhZ1NldHMoXG4gICAgICAgIHNvdXJjZVNwYWNlSWQ6IHN0cmluZyxcbiAgICAgICAgdGFyZ2V0U3BhY2VJZDogc3RyaW5nLFxuICAgICAgICBvcHRpb25zOiBSZWNhbGlicmF0aW9uVGFnT3B0aW9ucyA9IHt9XG4gICAgKTogUHJvbWlzZTxSZWNhbGlicmF0aW9uVGFnU2V0cz4ge1xuICAgICAgICBpZiAoIXNvdXJjZVNwYWNlSWQgfHwgIXRhcmdldFNwYWNlSWQpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHNwYWNlOiBbXSwgdmlzaXQ6IFtdIH07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZmlsdGVyQnlTb3VyY2UgPSAhIW9wdGlvbnMub25seVRhZ3NJblNvdXJjZSAmJiBzb3VyY2VTcGFjZUlkICE9PSB0YXJnZXRTcGFjZUlkO1xuICAgICAgICBjb25zdCBbdGFyZ2V0VGFncywgc291cmNlVGFnc10gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICB0aGlzLmxvYWRMaXZlVGFnc0ZvclNwYWNlKHRhcmdldFNwYWNlSWQsIG9wdGlvbnMudGFyZ2V0Tm9kZUlkKSxcbiAgICAgICAgICAgIGZpbHRlckJ5U291cmNlID8gdGhpcy5sb2FkTGl2ZVRhZ3NGb3JTcGFjZShzb3VyY2VTcGFjZUlkKSA6IFByb21pc2UucmVzb2x2ZShudWxsKVxuICAgICAgICBdKTtcblxuICAgICAgICBjb25zdCBzb3VyY2VLZXlzID0gc291cmNlVGFncyAmJiBuZXcgU2V0KHNvdXJjZVRhZ3MuZmlsdGVyKHRhZyA9PiB0YWcub3duZWRCeVNwYWNlKS5tYXAodGFnID0+IHRhZy5pZGVudGl0eSkpO1xuICAgICAgICBjb25zdCBvd25UYXJnZXRUYWdzID0gdGFyZ2V0VGFnc1xuICAgICAgICAgICAgLmZpbHRlcih0YWcgPT4gdGFnLm93bmVkQnlTcGFjZSlcbiAgICAgICAgICAgIC5maWx0ZXIodGFnID0+ICFzb3VyY2VLZXlzIHx8IHNvdXJjZUtleXMuaGFzKHRhZy5pZGVudGl0eSkpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3BhY2U6IG93blRhcmdldFRhZ3MubWFwKHRhZyA9PiB0YWcucG9pKSxcbiAgICAgICAgICAgIHZpc2l0OiBvd25UYXJnZXRUYWdzLmZpbHRlcih0YWcgPT4gdGFnLmluVmlzaXQpLm1hcCh0YWcgPT4gdGFnLnBvaSlcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTaWduZWQsIGRpc3BsYXlhYmxlIFVSTCBvZiBhIHRhZydzIHBpY3R1cmUgKGBlbGVtZW50SW1hZ2VLZXlgKS4gTWVhbnQgdG8gYmUgY2FsbGVkIG9uXG4gICAgICogZGVtYW5kIOKAlCB3aGVuIHRoZSB0YWcgaXMgcHJldmlld2VkIOKAlCByYXRoZXIgdGhhbiBmb3IgdGhlIHdob2xlIGxpc3QuXG4gICAgICovXG4gICAgYXN5bmMgZ2V0VGFnSW1hZ2VVcmwoaW1hZ2VLZXk6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICAgICAgICBjb25zdCBrZXkgPSB0aGlzLmV4dHJhY3RTM0tleUZyb21WYWx1ZShpbWFnZUtleSk7XG4gICAgICAgIHJldHVybiBrZXkgPyBnZXRTaWduZWRGaWxlKGtleSkgOiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvYWRzIHRoZSBQT0lzIHBsYWNlZCBvbiB0aGUgc3dlZXBzIG9mIGEgc3BhY2Ugd2hvc2UgZWxlbWVudCBzdGlsbCBleGlzdHMsIGVhY2ggd2l0aCBhXG4gICAgICogZGlzcGxheSBuYW1lLCBhbiBpZGVudGl0eSBrZXkgYW5kIHdoZXRoZXIgaXRzIGVsZW1lbnQgYmVsb25ncyB0byB0aGF0IHNwYWNlLiBUaGUga2V5XG4gICAgICogZm9sbG93cyB0aGUgc2FtZSBydWxlcyBhcyB0aGUgY29weSdzIGR1cGxpY2F0ZSBkZXRlY3Rpb24gKGZpbmRFeGlzdGluZyksIHNvIGEgdGFnIGFuZCBpdHNcbiAgICAgKiBjb3B5IGluIGFub3RoZXIgc3BhY2Ugc2hhcmUgdGhlIHNhbWUga2V5LiBXaXRoIGEgdmlzaXQgbm9kZSwgYGluVmlzaXRgIHRlbGxzIHdoZXRoZXIgdGhlXG4gICAgICogdGFnIHNpdHMgb24gb25lIG9mIHRoYXQgdmlzaXQncyBzd2VlcHMuXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3luYyBsb2FkTGl2ZVRhZ3NGb3JTcGFjZShcbiAgICAgICAgc3BhY2VJZDogc3RyaW5nLFxuICAgICAgICB2aXNpdE5vZGVJZD86IHN0cmluZyB8IG51bGxcbiAgICApOiBQcm9taXNlPHsgcG9pOiBSZWNhbGlicmF0aW9uVGFnOyBpZGVudGl0eTogc3RyaW5nOyBvd25lZEJ5U3BhY2U6IGJvb2xlYW47IGluVmlzaXQ6IGJvb2xlYW4gfVtdPiB7XG4gICAgICAgIGNvbnN0IFtwb2lzLCBlbGVtZW50cywgem9uZXNdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5nZXRBbGxvd2VkU3dlZXBzSURzRm9yVXNlckluU3BhY2Uoc3BhY2VJZClcbiAgICAgICAgICAgICAgICAudGhlbihzd2VlcElkcyA9PiB0aGlzLnBvaVNlcnZpY2UuZ2V0UG9pc0J5TWF0dGVycG9ydFN3ZWVwcyhzd2VlcElkcykpLFxuICAgICAgICAgICAgdGhpcy5nZXRUYWdFbGVtZW50c0ZvclNwYWNlKHNwYWNlSWQpLFxuICAgICAgICAgICAgdGhpcy56b25lU2VydmljZS5nZXRab25lc0J5U3BhY2Uoc3BhY2VJZCkuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBsb2FkIHRoZSB6b25lcyBvZiB0aGUgc3BhY2U6JywgZXJyb3IpO1xuICAgICAgICAgICAgICAgIHJldHVybiBbXSBhcyBhbnlbXTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIF0pO1xuICAgICAgICBjb25zdCBzd2VlcFpvbmVzID0gdGhpcy5nZXRTd2VlcFpvbmVzKHpvbmVzIHx8IFtdKTtcbiAgICAgICAgY29uc3QgdmlzaXRTd2VlcHMgPSB2aXNpdE5vZGVJZCA/IGF3YWl0IHRoaXMuZ2V0U3dlZXBzT2ZWaXNpdCh2aXNpdE5vZGVJZCwgem9uZXMgfHwgW10pIDogbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICAgICAgLy8gQSBQT0kgY2FuIHBvaW50IGF0IGFuIGVsZW1lbnQgc3RvcmVkIHVuZGVyIGFub3RoZXIgc3BhY2UgKGxlZnQgYmVoaW5kIGJ5IGFuIGVhcmxpZXJcbiAgICAgICAgLy8gY29weSk6IHRob3NlIGFyZSBub3QgaW4gdGhlIHNwYWNlLXdpZGUgbGlzdHMgYW5kIGFyZSBmZXRjaGVkIGJ5IElELlxuICAgICAgICBjb25zdCB1bnJlc29sdmVkID0gKHBvaXMgfHwgW10pLmZpbHRlcihwb2kgPT4gcG9pPy5lbGVtZW50SUQgJiYgIWVsZW1lbnRzLmhhcyhwb2kuZWxlbWVudElEKSk7XG4gICAgICAgIGF3YWl0IHRoaXMuZmV0Y2hUYWdFbGVtZW50c0J5SWQodW5yZXNvbHZlZCwgZWxlbWVudHMpO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdDogeyBwb2k6IFJlY2FsaWJyYXRpb25UYWc7IGlkZW50aXR5OiBzdHJpbmc7IG93bmVkQnlTcGFjZTogYm9vbGVhbjsgaW5WaXNpdDogYm9vbGVhbiB9W10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBwb2kgb2YgcG9pcyB8fCBbXSkge1xuICAgICAgICAgICAgaWYgKCFwb2kpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBlbGVtZW50OiBUYWdFbGVtZW50IHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKHBvaS5lbGVtZW50SUQpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50ID0gZWxlbWVudHMuZ2V0KHBvaS5lbGVtZW50SUQpO1xuICAgICAgICAgICAgICAgIGlmICghZWxlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gb3JwaGFuOiB0aGUgZWxlbWVudCB3YXMgZGVsZXRlZCAob3IgY2Fubm90IGJlIHJlYWQpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBzdGFuZGFsb25lIHRhZzogaXRzIGRlc2NyaXB0aW9uIGlzIGFsbCB0aGF0IGlkZW50aWZpZXMgaXRcbiAgICAgICAgICAgICAgICBjb25zdCBkZXNjcmlwdGlvbiA9IHRoaXMuc3RyaXBIdG1sKHBvaS50YWdEZXNjcmlwdGlvbik7XG4gICAgICAgICAgICAgICAgZWxlbWVudCA9IHsgbmFtZTogZGVzY3JpcHRpb24sIGlkZW50aXR5OiBbZGVzY3JpcHRpb25dIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB6b25lcyA9IHN3ZWVwWm9uZXMuZ2V0KHBvaS5tYXR0ZXJwb3J0U3dlZXBJRCBhcyBzdHJpbmcpO1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goe1xuICAgICAgICAgICAgICAgIHBvaToge1xuICAgICAgICAgICAgICAgICAgICAuLi5wb2ksXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnROYW1lOiBlbGVtZW50Lm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnREZXNjcmlwdGlvbjogZWxlbWVudC5kZXNjcmlwdGlvbixcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudEltYWdlS2V5OiBlbGVtZW50LmltYWdlS2V5LFxuICAgICAgICAgICAgICAgICAgICBmbG9vck5hbWU6IHpvbmVzPy5mbG9vcixcbiAgICAgICAgICAgICAgICAgICAgem9uZU5hbWU6IHpvbmVzPy56b25lXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBpZGVudGl0eTogdGhpcy5pZGVudGl0eUtleShbcG9pLnR5cGUsIC4uLmVsZW1lbnQuaWRlbnRpdHldKSxcbiAgICAgICAgICAgICAgICAvLyBkZWNpZGVkIGJ5IHRoZSBlbGVtZW50J3Mgb3duIHNwYWNlSUQgcmF0aGVyIHRoYW4gYnkgaXRzIHByZXNlbmNlIGluIHRoZVxuICAgICAgICAgICAgICAgIC8vIHNwYWNlLXdpZGUgbGlzdHMsIHNvbWUgb2Ygd2hpY2ggYXJlIG5vdCBwYWdpbmF0ZWQuIEEgc3RhbmRhbG9uZSB0YWcgaGFzIG5vXG4gICAgICAgICAgICAgICAgLy8gZWxlbWVudCB0byB0ZWxsOiBpdCBiZWxvbmdzIHRvIGV2ZXJ5IHNwYWNlIHRoYXQgc2hvd3MgaXQuXG4gICAgICAgICAgICAgICAgb3duZWRCeVNwYWNlOiAhcG9pLmVsZW1lbnRJRCB8fCBlbGVtZW50LnNwYWNlSWQgPT09IHNwYWNlSWQsXG4gICAgICAgICAgICAgICAgaW5WaXNpdDogdmlzaXRTd2VlcHMuaGFzKHBvaS5tYXR0ZXJwb3J0U3dlZXBJRCBhcyBzdHJpbmcpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFN3ZWVwcyBvZiBhIHZpcnR1YWwgdmlzaXQgKGEgTm9kZSk6IHRob3NlIG9mIHRoZSBzcGFjZSdzIHpvbmVzIGF0dGFjaGVkIHRvIHRoYXQgbm9kZSxcbiAgICAgKiBlbHNlIOKAlCB6b25lcyBub3QgZmlsbGVkIGluIGZvciB0aGlzIHZpc2l0IOKAlCB0aGUgc3dlZXBzIG9mIHRoZSBub2RlJ3MgbmF2aWdhdGlvbnMuXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3luYyBnZXRTd2VlcHNPZlZpc2l0KG5vZGVJZDogc3RyaW5nLCB6b25lczogYW55W10pOiBQcm9taXNlPFNldDxzdHJpbmc+PiB7XG4gICAgICAgIGNvbnN0IHN3ZWVwcyA9IG5ldyBTZXQ8c3RyaW5nPih6b25lc1xuICAgICAgICAgICAgLmZpbHRlcih6b25lID0+IHpvbmUubm9kZUlEcz8uaW5jbHVkZXMobm9kZUlkKSlcbiAgICAgICAgICAgIC5mbGF0TWFwKHpvbmUgPT4gem9uZS5zd2VlcElEcyB8fCBbXSkpO1xuICAgICAgICBpZiAoc3dlZXBzLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmF2aWdhdGlvbnMgPSBhd2FpdCB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmdldE5hdmlnYXRpb25zRm9yTm9kZShub2RlSWQpO1xuICAgICAgICAgICAgICAgIG5hdmlnYXRpb25zLmZvckVhY2gobmF2aWdhdGlvbiA9PiBuYXZpZ2F0aW9uLm1hdHRlcnBvcnRTd2VlcElEICYmIHN3ZWVwcy5hZGQobmF2aWdhdGlvbi5tYXR0ZXJwb3J0U3dlZXBJRCkpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gbG9hZCB0aGUgc3dlZXBzIG9mIHRoZSB2aXNpdDonLCBlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN3ZWVwcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNYXBzIGVhY2ggc3dlZXAgb2YgYSBzcGFjZSB0byB0aGUgbmFtZXMgb2YgaXRzIGZsb29yICh6b25lIG9mIGxheWVyIEZMT09SKSBhbmQgb2YgaXRzXG4gICAgICogbW9zdCBzcGVjaWZpYyBvdGhlciB6b25lICh0aGUgb25lIGhvbGRpbmcgdGhlIGZld2VzdCBzd2VlcHMsIHR5cGljYWxseSBhIHJvb20sIGVsc2UgdGhlXG4gICAgICogdmlzaXQncyBCVUlMRElORyB6b25lKS5cbiAgICAgKi9cbiAgICBwcml2YXRlIGdldFN3ZWVwWm9uZXMoem9uZXM6IGFueVtdKTogTWFwPHN0cmluZywgeyBmbG9vcj86IHN0cmluZzsgem9uZT86IHN0cmluZyB9PiB7XG4gICAgICAgIGNvbnN0IGJ5U3dlZXAgPSBuZXcgTWFwPHN0cmluZywgeyBmbG9vcj86IHN0cmluZzsgem9uZT86IHN0cmluZyB9PigpO1xuICAgICAgICBjb25zdCBpc0Zsb29yID0gKHpvbmU6IGFueSkgPT4gKHpvbmUubGF5ZXI/Lm5hbWUgfHwgJycpLmluY2x1ZGVzKCdGTE9PUicpO1xuICAgICAgICBjb25zdCB6b25lUmFuayA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7IC8vIHN3ZWVwIC0+IHN3ZWVwIGNvdW50IG9mIHRoZSB6b25lIGtlcHQgc28gZmFyXG4gICAgICAgIGZvciAoY29uc3Qgem9uZSBvZiB6b25lcykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBzd2VlcElkIG9mIHpvbmUuc3dlZXBJRHMgfHwgW10pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbnRyeSA9IGJ5U3dlZXAuZ2V0KHN3ZWVwSWQpIHx8IHt9O1xuICAgICAgICAgICAgICAgIGlmIChpc0Zsb29yKHpvbmUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGVudHJ5LmZsb29yID0gZW50cnkuZmxvb3IgfHwgem9uZS5uYW1lO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpemUgPSB6b25lLnN3ZWVwSURzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF6b25lUmFuay5oYXMoc3dlZXBJZCkgfHwgc2l6ZSA8ICh6b25lUmFuay5nZXQoc3dlZXBJZCkgYXMgbnVtYmVyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgem9uZVJhbmsuc2V0KHN3ZWVwSWQsIHNpemUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuem9uZSA9IHpvbmUubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBieVN3ZWVwLnNldChzd2VlcElkLCBlbnRyeSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ5U3dlZXA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5kZXhlcywgYnkgSUQsIGV2ZXJ5IGVsZW1lbnQgb2YgYSBzcGFjZSBhIFBPSSBjYW4gcG9pbnQgYXQuIEVhY2ggbGlzdCBpcyBmZXRjaGVkXG4gICAgICogaW5kZXBlbmRlbnRseTogb25lIGZhaWxpbmcgKG1vZHVsZSBub3QgZW5hYmxlZCwgbWlzc2luZyBwZXJtaXNzaW9uKSBtdXN0IG5vdCBoaWRlIHRoZVxuICAgICAqIG90aGVycyDigJQgdGhlaXIgUE9JcyBhcmUgdGhlbiByZXNvbHZlZCBvbmUgYnkgb25lIGJ5IGZldGNoVGFnRWxlbWVudHNCeUlkKCkuXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3luYyBnZXRUYWdFbGVtZW50c0ZvclNwYWNlKHNwYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8TWFwPHN0cmluZywgVGFnRWxlbWVudD4+IHtcbiAgICAgICAgY29uc3QgZWxlbWVudHMgPSBuZXcgTWFwPHN0cmluZywgVGFnRWxlbWVudD4oKTtcbiAgICAgICAgY29uc3QgW3RpY2tldHMsIGVxdWlwbWVudHMsIG9iamVjdHMzRCwgZmVhdHVyZXMsIGNvbW1lbnRzXSA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChbXG4gICAgICAgICAgICB0aGlzLnRpY2tldFNlcnZpY2UuZ2V0VGlja2V0c0J5U3BhY2Uoc3BhY2VJZCksXG4gICAgICAgICAgICB0aGlzLmVxdWlwbWVudFNlcnZpY2UuZ2V0RXF1aXBtZW50c0ZvclNwYWNlKHNwYWNlSWQpLFxuICAgICAgICAgICAgdGhpcy5vYmplY3QzRFNlcnZpY2UuZ2V0T2JqZWN0czNEQnlTcGFjZShzcGFjZUlkKSxcbiAgICAgICAgICAgIHRoaXMuZmVhdHVyZVNlcnZpY2UuZ2V0QWxsRmVhdHVyZXNCeVNwYWNlUmF3KHNwYWNlSWQpLFxuICAgICAgICAgICAgLy8gYSBtZWFzdXJlbWVudCBQT0kgaXMgYm91bmQgdG8gdGhlIG1lYXN1cmVtZW50J3MgQ29tbWVudCwgbm90IHRvIHRoZSBtZWFzdXJlbWVudFxuICAgICAgICAgICAgdGhpcy5jb21tZW50U2VydmljZS5nZXRDb21tZW50c0J5U3BhY2VJRChzcGFjZUlkKVxuICAgICAgICBdKTtcblxuICAgICAgICBjb25zdCBpbmRleCA9IChzZXR0bGVkOiBQcm9taXNlU2V0dGxlZFJlc3VsdDxhbnlbXT4sIHR5cGU6IFRhZ0VsZW1lbnRUeXBlKSA9PiB7XG4gICAgICAgICAgICBpZiAoc2V0dGxlZC5zdGF0dXMgPT09ICdmdWxmaWxsZWQnKSB7XG4gICAgICAgICAgICAgICAgc2V0dGxlZC52YWx1ZT8uZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0/LmlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50cy5zZXQoaXRlbS5pZCwgdGhpcy50b1RhZ0VsZW1lbnQodHlwZSwgeyBzcGFjZUlEOiBzcGFjZUlkLCAuLi5pdGVtIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBpbmRleCh0aWNrZXRzLCAndGlja2V0Jyk7XG4gICAgICAgIGluZGV4KGVxdWlwbWVudHMsICdlcXVpcG1lbnQnKTtcbiAgICAgICAgaW5kZXgob2JqZWN0czNELCAnb2JqZWN0M0QnKTtcbiAgICAgICAgaW5kZXgoZmVhdHVyZXMsICdmZWF0dXJlJyk7XG4gICAgICAgIGluZGV4KGNvbW1lbnRzLCAnY29tbWVudCcpO1xuICAgICAgICByZXR1cm4gZWxlbWVudHM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmV0Y2hlcyBieSBJRCB0aGUgZWxlbWVudHMgdGhlIHNwYWNlLXdpZGUgbGlzdHMgZGlkIG5vdCByZXR1cm4uIFRoZSBJRHMgYXJlIHBhY2tlZCBpbnRvXG4gICAgICogYSBmZXcgR3JhcGhRTCByZXF1ZXN0cyB1c2luZyBhbGlhc2VzIChgZTA6IGdldFRpY2tldChpZDogLi4uKSBlMTogZ2V0RXF1aXBtZW50KC4uLilgKSxcbiAgICAgKiBpbnN0ZWFkIG9mIG9uZSByZXF1ZXN0IHBlciBlbGVtZW50OiBhIHNwYWNlIGNhbiBob2xkIG92ZXIgYSB0aG91c2FuZCBvcnBoYW4gUE9Jcy5cbiAgICAgKiBBbiBlbGVtZW50IHRoYXQgbm8gbG9uZ2VyIGV4aXN0cyBjb21lcyBiYWNrIGFzIG51bGwgYW5kIGlzIHNpbXBseSBub3QgaW5kZXhlZC5cbiAgICAgKi9cbiAgICBwcml2YXRlIGFzeW5jIGZldGNoVGFnRWxlbWVudHNCeUlkKHBvaXM6IFBPSVtdLCBlbGVtZW50czogTWFwPHN0cmluZywgVGFnRWxlbWVudD4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgSURTX1BFUl9SRVFVRVNUID0gMTAwO1xuICAgICAgICBjb25zdCBxdWVyaWVzOiBSZWNvcmQ8VGFnRWxlbWVudFR5cGUsIHN0cmluZz4gPSB7XG4gICAgICAgICAgICB0aWNrZXQ6ICdnZXRUaWNrZXQoaWQ6ICRJRCkgeyBpZCBzcGFjZUlEIHRpdGxlIGRlc2NyaXB0aW9uIH0nLFxuICAgICAgICAgICAgZXF1aXBtZW50OiAnZ2V0RXF1aXBtZW50KGlkOiAkSUQpIHsgaWQgc3BhY2VJRCBuYW1lIHNlcmlhbE51bWJlciB9JyxcbiAgICAgICAgICAgIG9iamVjdDNEOiAnZ2V0T2JqZWN0M0QoaWQ6ICRJRCkgeyBpZCBzcGFjZUlEIG5hbWUgZGVzY3JpcHRpb24gfScsXG4gICAgICAgICAgICBjb21tZW50OiAnZ2V0Q29tbWVudChpZDogJElEKSB7IGlkIHNwYWNlSUQgdGl0bGUgZGVzY3JpcHRpb24gYW5uZXhlIH0nLFxuICAgICAgICAgICAgZmVhdHVyZTogJ2dldEZlYXR1cmUoaWQ6ICRJRCkgeyBpZCBzcGFjZUlEIHRpdGxlIGRlc2NyaXB0aW9uIH0nXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgcGVuZGluZyA9IG5ldyBNYXA8c3RyaW5nLCBUYWdFbGVtZW50VHlwZT4oKTtcbiAgICAgICAgZm9yIChjb25zdCBwb2kgb2YgcG9pcykge1xuICAgICAgICAgICAgcGVuZGluZy5zZXQocG9pLmVsZW1lbnRJRCBhcyBzdHJpbmcsIHRoaXMudGFnRWxlbWVudFR5cGVPZihwb2kudHlwZSkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVudHJpZXMgPSBbLi4ucGVuZGluZy5lbnRyaWVzKCldO1xuICAgICAgICBjb25zdCBiYXRjaGVzOiBbc3RyaW5nLCBUYWdFbGVtZW50VHlwZV1bXVtdID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkgKz0gSURTX1BFUl9SRVFVRVNUKSB7XG4gICAgICAgICAgICBiYXRjaGVzLnB1c2goZW50cmllcy5zbGljZShpLCBpICsgSURTX1BFUl9SRVFVRVNUKSk7XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChiYXRjaGVzLm1hcChhc3luYyBiYXRjaCA9PiB7XG4gICAgICAgICAgICBjb25zdCBmaWVsZHMgPSBiYXRjaC5tYXAoKFtpZCwgdHlwZV0sIGkpID0+XG4gICAgICAgICAgICAgICAgYGUke2l9OiAke3F1ZXJpZXNbdHlwZV0ucmVwbGFjZSgnJElEJywgSlNPTi5zdHJpbmdpZnkoaWQpKX1gKTtcbiAgICAgICAgICAgIGxldCBkYXRhOiBhbnk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGRhdGEgPSAoKGF3YWl0IEFQSS5ncmFwaHFsKGdyYXBocWxPcGVyYXRpb24oYHF1ZXJ5IFRhZ0VsZW1lbnRzIHsgJHtmaWVsZHMuam9pbignXFxuJyl9IH1gKSkpIGFzIGFueSkuZGF0YTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgICAgICAgICAvLyBBbXBsaWZ5IHJlamVjdHMgd2hlbiBBTlkgYWxpYXMgZXJyb3JzIChlLmcuIGFuIHVucmVhZGFibGUgcmVjb3JkKSwgYnV0IHN0aWxsXG4gICAgICAgICAgICAgICAgLy8gaGFuZHMgb3ZlciB0aGUgZGF0YSBvZiB0aGUgYWxpYXNlcyB0aGF0IHN1Y2NlZWRlZC5cbiAgICAgICAgICAgICAgICBkYXRhID0gZXJyb3I/LmRhdGE7XG4gICAgICAgICAgICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBmZXRjaCB0YWcgZWxlbWVudHMgYnkgSUQ6JywgZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYmF0Y2guZm9yRWFjaCgoW2lkLCB0eXBlXSwgaSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBkYXRhW2BlJHtpfWBdO1xuICAgICAgICAgICAgICAgIGlmIChpdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzLnNldChpZCwgdGhpcy50b1RhZ0VsZW1lbnQodHlwZSwgaXRlbSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTW92ZXMgYSBzdG9yZWQgY29vcmRpbmF0ZS4gT25seSB0aGUgcG9zaXRpb24gYW5kIHRoZSBob3Jpem9udGFsIG9yaWVudGF0aW9uIGNoYW5nZTpcbiAgICAgKiBldmVyeSBvdGhlciBrZXkgaXMga2VwdCBhcyBpcy4gQSBjb29yZGluYXRlIG9mdGVuIGNhcnJpZXMgdGhlIHRhZydzIG9yaWVudGF0aW9uIG5leHQgdG9cbiAgICAgKiBpdHMgcG9zaXRpb24gKHt4LCB5LCB6LCB4Um90YXRpb24sIHlSb3RhdGlvbn0pOyByZWJ1aWxkaW5nIGl0IGZyb20gdGhlIHBvc2l0aW9uIGFsb25lXG4gICAgICogc2lsZW50bHkgZXJhc2VkIHRoYXQgb3JpZW50YXRpb24uXG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRSZWNhbGlicmF0ZWRDb29yZGluYXRlKGNvb3JkaW5hdGU6IGFueSwgdHJhbnNmb3JtOiBSaWdpZFRyYW5zZm9ybSk6IGFueSB7XG4gICAgICAgIGNvbnN0IHBvc2l0aW9uID0gYXBwbHlSaWdpZFRyYW5zZm9ybVRvUG9pbnQoXG4gICAgICAgICAgICB7IHg6IGNvb3JkaW5hdGUueCwgeTogY29vcmRpbmF0ZS55LCB6OiBjb29yZGluYXRlLnogfSwgdHJhbnNmb3JtKTtcbiAgICAgICAgY29uc3QgbW92ZWQ6IGFueSA9IHsgLi4uY29vcmRpbmF0ZSwgeDogcG9zaXRpb24ueCwgeTogcG9zaXRpb24ueSwgejogcG9zaXRpb24ueiB9O1xuICAgICAgICBpZiAoJ3lSb3RhdGlvbicgaW4gY29vcmRpbmF0ZSkge1xuICAgICAgICAgICAgbW92ZWQueVJvdGF0aW9uID0gYXBwbHlSaWdpZFRyYW5zZm9ybVRvWVJvdGF0aW9uRGVnKGNvb3JkaW5hdGUueVJvdGF0aW9uLCB0cmFuc2Zvcm0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtb3ZlZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWFkcyBQT0lzIGJ5IElELCAxMDAgcGVyIEdyYXBoUUwgcmVxdWVzdCAoYWxpYXNlcykuIE1pc3NpbmcgUE9JcyBhcmUgc2tpcHBlZC4gQW1wbGlmeVxuICAgICAqIHJlamVjdHMgYSByZXF1ZXN0IHdoZW4gQU5ZIGFsaWFzIGVycm9ycywgYnV0IHN0aWxsIGhhbmRzIG92ZXIgdGhlIGRhdGEgb2YgdGhlIG90aGVyczpcbiAgICAgKiB0aG9zZSBhcmUga2VwdCwgc28gb25lIHVucmVhZGFibGUgUE9JIGRvZXMgbm90IGhpZGUgdGhlIDk5IG90aGVycyBvZiBpdHMgYmF0Y2guXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3luYyBmZXRjaFBvaXNCeUlkKGlkczogc3RyaW5nW10pOiBQcm9taXNlPFBPSVtdPiB7XG4gICAgICAgIGNvbnN0IElEU19QRVJfUkVRVUVTVCA9IDEwMDtcbiAgICAgICAgY29uc3QgdW5pcXVlSWRzID0gWy4uLm5ldyBTZXQoaWRzKV07XG4gICAgICAgIGNvbnN0IGJhdGNoZXM6IHN0cmluZ1tdW10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB1bmlxdWVJZHMubGVuZ3RoOyBpICs9IElEU19QRVJfUkVRVUVTVCkge1xuICAgICAgICAgICAgYmF0Y2hlcy5wdXNoKHVuaXF1ZUlkcy5zbGljZShpLCBpICsgSURTX1BFUl9SRVFVRVNUKSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoYmF0Y2hlcy5tYXAoYXN5bmMgYmF0Y2ggPT4ge1xuICAgICAgICAgICAgY29uc3QgZmllbGRzID0gYmF0Y2gubWFwKChpZCwgaSkgPT4gYHAke2l9OiBnZXRQT0koaWQ6ICR7SlNPTi5zdHJpbmdpZnkoaWQpfSkgeyBpZCBjb29yZGluYXRlIG1ldGFkYXRhIH1gKTtcbiAgICAgICAgICAgIGxldCBkYXRhOiBhbnk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGRhdGEgPSAoKGF3YWl0IEFQSS5ncmFwaHFsKGdyYXBocWxPcGVyYXRpb24oYHF1ZXJ5IFNlbGVjdGVkUG9pcyB7ICR7ZmllbGRzLmpvaW4oJ1xcbicpfSB9YCkpKSBhcyBhbnkpLmRhdGE7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgICAgICAgICAgZGF0YSA9IGVycm9yPy5kYXRhO1xuICAgICAgICAgICAgICAgIGlmICghZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gcmVhZCB0aGUgc2VsZWN0ZWQgUE9JczonLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYmF0Y2gubWFwKChfLCBpKSA9PiBkYXRhW2BwJHtpfWBdIGFzIFBPSSkuZmlsdGVyKHBvaSA9PiAhIXBvaSk7XG4gICAgICAgIH0pKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdHMuZmxhdCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdGFnRWxlbWVudFR5cGVPZihwb2lUeXBlOiBQb2lUeXBlIHwgbnVsbCB8IHVuZGVmaW5lZCk6IFRhZ0VsZW1lbnRUeXBlIHtcbiAgICAgICAgc3dpdGNoIChwb2lUeXBlKSB7XG4gICAgICAgICAgICBjYXNlIFBvaVR5cGUuVElDS0VUOiByZXR1cm4gJ3RpY2tldCc7XG4gICAgICAgICAgICBjYXNlIFBvaVR5cGUuRVFVSVBNRU5UOiByZXR1cm4gJ2VxdWlwbWVudCc7XG4gICAgICAgICAgICBjYXNlIFBvaVR5cGUuT0JKRUNUM0Q6IHJldHVybiAnb2JqZWN0M0QnO1xuICAgICAgICAgICAgY2FzZSBQb2lUeXBlLk1FQVNVUkU6IHJldHVybiAnY29tbWVudCc7XG4gICAgICAgICAgICBkZWZhdWx0OiByZXR1cm4gJ2ZlYXR1cmUnO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIERpc3BsYXkgbmFtZSArIGlkZW50aXR5IGZpZWxkcyBvZiBhbiBlbGVtZW50LCBwZXIgdGhlIGNvcHkncyBkdXBsaWNhdGUtZGV0ZWN0aW9uIHJ1bGVzLiAqL1xuICAgIHByaXZhdGUgdG9UYWdFbGVtZW50KHR5cGU6IFRhZ0VsZW1lbnRUeXBlLCBpdGVtOiBhbnkpOiBUYWdFbGVtZW50IHtcbiAgICAgICAgY29uc3Qgc3BhY2VJZCA9IGl0ZW0uc3BhY2VJRDtcbiAgICAgICAgY29uc3QgdGV4dCA9ICh2YWx1ZTogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCkgPT4gdGhpcy5zdHJpcEh0bWwodmFsdWUpIHx8IHVuZGVmaW5lZDtcbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICBjYXNlICdlcXVpcG1lbnQnOlxuICAgICAgICAgICAgICAgIHJldHVybiB7IG5hbWU6IGl0ZW0ubmFtZSB8fCAnJywgaWRlbnRpdHk6IFtpdGVtLm5hbWUsIGl0ZW0uc2VyaWFsTnVtYmVyXSwgc3BhY2VJZCwgZGVzY3JpcHRpb246IHRleHQoaXRlbS5kZXNjcmlwdGlvbikgfTtcbiAgICAgICAgICAgIGNhc2UgJ29iamVjdDNEJzpcbiAgICAgICAgICAgICAgICByZXR1cm4geyBuYW1lOiBpdGVtLm5hbWUgfHwgJycsIGlkZW50aXR5OiBbaXRlbS5uYW1lXSwgc3BhY2VJZCwgZGVzY3JpcHRpb246IHRleHQoaXRlbS5kZXNjcmlwdGlvbikgfTtcbiAgICAgICAgICAgIGNhc2UgJ2NvbW1lbnQnOlxuICAgICAgICAgICAgICAgIC8vIEEgbWVhc3VyZW1lbnQncyB0aXRsZSBpcyB1c3VhbGx5IGVtcHR5OiBpdHMgZGVzY3JpcHRpb24gaG9sZHMgdGhlIGRpbWVuc2lvbnMgYW5kXG4gICAgICAgICAgICAgICAgLy8gYmVjb21lcyB0aGUgbmFtZS4gSXRzIHBpY3R1cmUgaXMgdGhlIHNjcmVlbnNob3QgdGFrZW4gd2hlbiBpdCB3YXMgbWVhc3VyZWQuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogaXRlbS50aXRsZSB8fCBpdGVtLmRlc2NyaXB0aW9uIHx8ICcnLFxuICAgICAgICAgICAgICAgICAgICBpZGVudGl0eTogW2l0ZW0udGl0bGUsIGl0ZW0uZGVzY3JpcHRpb25dLFxuICAgICAgICAgICAgICAgICAgICBzcGFjZUlkLFxuICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogaXRlbS50aXRsZSA/IHRleHQoaXRlbS5kZXNjcmlwdGlvbikgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgIGltYWdlS2V5OiBpdGVtLmFubmV4ZSB8fCB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4geyBuYW1lOiBpdGVtLnRpdGxlIHx8ICcnLCBpZGVudGl0eTogW2l0ZW0udGl0bGUsIGl0ZW0uZGVzY3JpcHRpb25dLCBzcGFjZUlkLCBkZXNjcmlwdGlvbjogdGV4dChpdGVtLmRlc2NyaXB0aW9uKSB9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdHJpcEh0bWwodmFsdWU6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gKHZhbHVlIHx8ICcnKS5yZXBsYWNlKC88W14+XSo+L2csICcgJykucmVwbGFjZSgvXFxzKy9nLCAnICcpLnRyaW0oKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWNhbGlicmF0ZXMgYSBzcGVjaWZpYyBsaXN0IG9mIGV4aXN0aW5nIHRhZ3MgaW4gdGhlIHRhcmdldCBzcGFjZSBieSBhcHBseWluZyB0aGUgcmlnaWRcbiAgICAgKiB0cmFuc2Zvcm1hdGlvbiBjYWxjdWxhdGVkIGZyb20gdGhlIHNlbGVjdGVkIGxhbmRtYXJrIHBvaW50cy5cbiAgICAgKlxuICAgICAqIEVhY2ggdGFnIGlzIHVwZGF0ZWQgb24gaXRzIG93bjogYSBmYWlsaW5nIHVwZGF0ZSBpcyBsb2dnZWQgYW5kIGNvdW50ZWQsIGl0IG5vIGxvbmdlclxuICAgICAqIHN0b3BzIHRoZSByZW1haW5pbmcgdGFncy4gUHJvZ3Jlc3MgYW5kIGxvZyBnbyB0aHJvdWdoIGNvcHlQcm9ncmVzcyQgLyBjb3B5TG9nJCwgbGlrZSBhXG4gICAgICogY29weSAocGhhc2UgJ3JlY2FsaWJyYXRpbmcnKS4gYHRhZ0xhYmVsc2AgKHRhZyBpZCAtPiBuYW1lKSBvbmx5IG1ha2VzIHRoZSBsb2cgcmVhZGFibGUuXG4gICAgICovXG4gICAgYXN5bmMgcmVjYWxpYnJhdGVUYWdzRnJvbVZpc2l0KFxuICAgICAgICB0YXJnZXRTcGFjZUlkOiBzdHJpbmcsXG4gICAgICAgIHNlbGVjdGVkVGFnSWRzOiBzdHJpbmdbXSxcbiAgICAgICAgbGFuZG1hcmtTb3VyY2VBOiBWZWMzLFxuICAgICAgICBsYW5kbWFya1RhcmdldEE6IFZlYzMsXG4gICAgICAgIGxhbmRtYXJrU291cmNlQjogVmVjMyxcbiAgICAgICAgbGFuZG1hcmtUYXJnZXRCOiBWZWMzLFxuICAgICAgICB0YWdMYWJlbHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fVxuICAgICk6IFByb21pc2U8UmVjYWxpYnJhdGlvblJlc3VsdD4ge1xuICAgICAgICBjb25zdCByZXN1bHQ6IFJlY2FsaWJyYXRpb25SZXN1bHQgPSB7IHVwZGF0ZWQ6IDAsIHNraXBwZWQ6IDAsIGZhaWxlZDogMCB9O1xuICAgICAgICBjb25zdCB1bmlxdWVJZHMgPSBbLi4ubmV3IFNldChzZWxlY3RlZFRhZ0lkcyldO1xuICAgICAgICBjb25zdCB0b3RhbCA9IHVuaXF1ZUlkcy5sZW5ndGg7XG4gICAgICAgIGNvbnN0IGxhYmVsID0gKGlkOiBzdHJpbmcpID0+IHRhZ0xhYmVsc1tpZF0gfHwgYCMke2lkLnN1YnN0cmluZygwLCA4KX1gO1xuICAgICAgICBsZXQgcHJvY2Vzc2VkID0gMDtcbiAgICAgICAgY29uc3QgZW1pdFByb2dyZXNzID0gKHBoYXNlOiBDb3B5UHJvZ3Jlc3NbJ3BoYXNlJ10pID0+IHtcbiAgICAgICAgICAgIHRoaXMuY29weVByb2dyZXNzJC5uZXh0KHtcbiAgICAgICAgICAgICAgICBwaGFzZSxcbiAgICAgICAgICAgICAgICBwcm9jZXNzZWRJblBoYXNlOiBwcm9jZXNzZWQsIHRvdGFsSW5QaGFzZTogdG90YWwsXG4gICAgICAgICAgICAgICAgcHJvY2Vzc2VkT3ZlcmFsbDogcHJvY2Vzc2VkLCB0b3RhbE92ZXJhbGw6IHRvdGFsLFxuICAgICAgICAgICAgICAgIHBlcmNlbnQ6IHRvdGFsID4gMCA/IE1hdGgucm91bmQoKHByb2Nlc3NlZCAvIHRvdGFsKSAqIDEwMCkgOiAxMDAsXG4gICAgICAgICAgICAgICAgZXJyb3JDb3VudDogcmVzdWx0LmZhaWxlZCwgaGVhbGVkQ291bnQ6IDBcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5zZXRTdGVwTG9nKCdyZWNhbGlicmF0aW5nJywgdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnbWF0dGVycG9ydENvcHkucmVjYWxpYnJhdGVTdGVwJyxcbiAgICAgICAgICAgICAgICB7IHByb2Nlc3NlZCwgdG90YWwgfSkpO1xuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMucmVzZXRMb2coKTtcbiAgICAgICAgZW1pdFByb2dyZXNzKCdyZWNhbGlicmF0aW5nJyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB0cmFuc2Zvcm0gPSBjb21wdXRlUmlnaWRUcmFuc2Zvcm0oXG4gICAgICAgICAgICAgICAgbGFuZG1hcmtTb3VyY2VBLCBsYW5kbWFya1RhcmdldEEsXG4gICAgICAgICAgICAgICAgbGFuZG1hcmtTb3VyY2VCLCBsYW5kbWFya1RhcmdldEJcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIC8vIFJlLXJlYWQgb25seSB0aGUgc2VsZWN0ZWQgUE9JcywgYnkgSUQsIHNvIHRoZSB0cmFuc2Zvcm0gaXMgYXBwbGllZCB0byB0aGVpciBjdXJyZW50XG4gICAgICAgICAgICAvLyBwb3NpdGlvbiDigJQgc2Nhbm5pbmcgdGhlIHdob2xlIHNwYWNlIGFnYWluIGZvciBhIGhhbmRmdWwgb2YgdGFncyB3YXMgdGhlIHNsb3cgcGF0aC5cbiAgICAgICAgICAgIGNvbnN0IHRhcmdldFBvaXMgPSBhd2FpdCB0aGlzLmZldGNoUG9pc0J5SWQodW5pcXVlSWRzKTtcbiAgICAgICAgICAgIGNvbnN0IGZvdW5kSWRzID0gbmV3IFNldCh0YXJnZXRQb2lzLm1hcChwb2kgPT4gcG9pLmlkKSk7XG4gICAgICAgICAgICB1bmlxdWVJZHMuZmlsdGVyKGlkID0+ICFmb3VuZElkcy5oYXMoaWQpKS5mb3JFYWNoKGlkID0+IHtcbiAgICAgICAgICAgICAgICByZXN1bHQuc2tpcHBlZCsrO1xuICAgICAgICAgICAgICAgIHByb2Nlc3NlZCsrO1xuICAgICAgICAgICAgICAgIHRoaXMuYXBwZW5kRXJyb3JMb2codGhpcy50cmFuc2xhdGUuaW5zdGFudCgnbWF0dGVycG9ydENvcHkucmVjYWxpYnJhdGVOb3RGb3VuZCcsIHsgbmFtZTogbGFiZWwoaWQpIH0pKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZW1pdFByb2dyZXNzKCdyZWNhbGlicmF0aW5nJyk7XG5cbiAgICAgICAgICAgIGNvbnN0IFVQREFURVNfSU5fUEFSQUxMRUwgPSAxMDtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFyZ2V0UG9pcy5sZW5ndGg7IGkgKz0gVVBEQVRFU19JTl9QQVJBTExFTCkge1xuICAgICAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHRhcmdldFBvaXMuc2xpY2UoaSwgaSArIFVQREFURVNfSU5fUEFSQUxMRUwpLm1hcChhc3luYyBwb2kgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpZCA9IHBvaS5pZCBhcyBzdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgb3JpZ2luYWxDb29yZDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxDb29yZCA9IHR5cGVvZiBwb2kuY29vcmRpbmF0ZSA9PT0gJ3N0cmluZydcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBKU09OLnBhcnNlKHBvaS5jb29yZGluYXRlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHBvaS5jb29yZGluYXRlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxDb29yZCA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9yaWdpbmFsQ29vcmQgfHwgdHlwZW9mIG9yaWdpbmFsQ29vcmQueCAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB2aXJ0dWFsIFBPSSBvciB1bnJlYWRhYmxlIGNvb3JkaW5hdGU6IG5vIHBvc2l0aW9uIHRvIG1vdmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuc2tpcHBlZCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwZW5kRXJyb3JMb2codGhpcy50cmFuc2xhdGUuaW5zdGFudCgnbWF0dGVycG9ydENvcHkucmVjYWxpYnJhdGVTa2lwcGVkJywgeyBuYW1lOiBsYWJlbChpZCkgfSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wb2lTZXJ2aWNlLnVwZGF0ZVBvaSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29vcmRpbmF0ZTogSlNPTi5zdHJpbmdpZnkodGhpcy5nZXRSZWNhbGlicmF0ZWRDb29yZGluYXRlKG9yaWdpbmFsQ29vcmQsIHRyYW5zZm9ybSkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhOiB0aGlzLmdldEFkanVzdGVkUG9pTWV0YWRhdGEocG9pLm1ldGFkYXRhLCB0cmFuc2Zvcm0pXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC51cGRhdGVkKys7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuZmFpbGVkKys7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gcmVjYWxpYnJhdGUgdGhlIHRhZyAke2lkfTpgLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcGVuZEVycm9yTG9nKHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ21hdHRlcnBvcnRDb3B5LnJlY2FsaWJyYXRlRXJyb3InLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgbmFtZTogbGFiZWwoaWQpLCBlcnJvcjogdG9FcnJvck1lc3NhZ2UoZXJyb3IpIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgZW1pdFByb2dyZXNzKCdyZWNhbGlicmF0aW5nJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAvLyB0cmFuc2Zvcm0gb3IgcmVhZGluZyBmYWlsdXJlOiBub3RoaW5nIGxlZnQgY2FuIGJlIG1vdmVkXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJldXIgbG9ycyBkdSByZWNhbGlicmFnZSBkZXMgdGFnczonLCBlcnJvcik7XG4gICAgICAgICAgICByZXN1bHQuZmFpbGVkID0gdG90YWwgLSByZXN1bHQudXBkYXRlZCAtIHJlc3VsdC5za2lwcGVkO1xuICAgICAgICAgICAgcHJvY2Vzc2VkID0gdG90YWw7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZEVycm9yTG9nKHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ21hdHRlcnBvcnRDb3B5LmVycm9yR2VuZXJhbCcsIHsgZXJyb3I6IHRvRXJyb3JNZXNzYWdlKGVycm9yKSB9KSk7XG4gICAgICAgIH1cblxuICAgICAgICBlbWl0UHJvZ3Jlc3MoJ2RvbmUnKTtcbiAgICAgICAgdGhpcy5zZXRTdGVwTG9nKCdkb25lJywgdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnbWF0dGVycG9ydENvcHkucmVjYWxpYnJhdGVTdW1tYXJ5JywgcmVzdWx0KSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufSJdfQ==
|