@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.
Files changed (114) hide show
  1. package/README.md +24 -24
  2. package/esm2022/lib/components/csv-export/csv-export.component.mjs +3 -3
  3. package/esm2022/lib/components/loader/loader.component.mjs +3 -3
  4. package/esm2022/lib/components/menu-bar/avatar/avatar.component.mjs +1 -1
  5. package/esm2022/lib/components/menu-bar/menu-bar.component.mjs +3 -3
  6. package/esm2022/lib/components/menu-bar/navigation-bar/navigation-bar.component.mjs +3 -3
  7. package/esm2022/lib/components/modal-switch-visit/modal-switch-visit.component.mjs +3 -3
  8. package/esm2022/lib/components/search-bar/search-bar.component.mjs +3 -3
  9. package/esm2022/lib/components/splat-viewer/splat-viewer.component.mjs +361 -0
  10. package/esm2022/lib/components/support-modal/support-modal.component.mjs +3 -3
  11. package/esm2022/lib/config.mjs +1 -1
  12. package/esm2022/lib/helpers.service.mjs +1 -1
  13. package/esm2022/lib/matterport-extensions/nest-thermostat/CanvasImage.mjs +1 -1
  14. package/esm2022/lib/matterport-extensions/nest-thermostat/CanvasRenderer.mjs +1 -1
  15. package/esm2022/lib/matterport-extensions/nest-thermostat/NestThermostat.mjs +1 -1
  16. package/esm2022/lib/matterport-extensions/nest-thermostat/PlaneRenderer.mjs +1 -1
  17. package/esm2022/lib/matterport-extensions/scene-component/SceneComponent.mjs +1 -1
  18. package/esm2022/lib/matterport-extensions/security-camera/SecurityCamera.mjs +22 -22
  19. package/esm2022/lib/matterport-extensions/tv-player/TvPlayer.mjs +1 -1
  20. package/esm2022/lib/matterport-extensions/view-frustum-mesh/ViewFrustumMesh.mjs +22 -22
  21. package/esm2022/lib/mattertagData.mjs +1 -1
  22. package/esm2022/lib/ngx-smarterplan-core.module.mjs +9 -4
  23. package/esm2022/lib/ngx-smarterplan-core.service.mjs +1 -1
  24. package/esm2022/lib/pipes/duration-to-string.pipe.mjs +1 -1
  25. package/esm2022/lib/pipes/format-date-number-to-digits.pipe.mjs +1 -1
  26. package/esm2022/lib/pipes/hashtag-from-id.pipe.mjs +1 -1
  27. package/esm2022/lib/pipes/safe-url.pipe.mjs +1 -1
  28. package/esm2022/lib/pipes/time-date-to-local-string.pipe.mjs +1 -1
  29. package/esm2022/lib/pipes/username-from-id.pipe.mjs +1 -1
  30. package/esm2022/lib/services/amplify-cache.service.mjs +1 -1
  31. package/esm2022/lib/services/base-tab.service.mjs +1 -1
  32. package/esm2022/lib/services/baseVisibility.service.mjs +1 -1
  33. package/esm2022/lib/services/content.service.mjs +1 -1
  34. package/esm2022/lib/services/filter.service.mjs +1 -1
  35. package/esm2022/lib/services/intervention.service.mjs +1 -1
  36. package/esm2022/lib/services/locale.service.mjs +1 -1
  37. package/esm2022/lib/services/matterport-import.service.mjs +1 -1
  38. package/esm2022/lib/services/matterport-measurement.service.mjs +1 -1
  39. package/esm2022/lib/services/matterport-navigation.service.mjs +1 -1
  40. package/esm2022/lib/services/matterport-pointer.service.mjs +6 -6
  41. package/esm2022/lib/services/matterport-tag-copy.service.mjs +1 -1
  42. package/esm2022/lib/services/matterport-tag.service.mjs +12 -7
  43. package/esm2022/lib/services/matterport.service.mjs +17 -17
  44. package/esm2022/lib/services/models/affectation.service.mjs +1 -1
  45. package/esm2022/lib/services/models/base-object.service.mjs +1 -1
  46. package/esm2022/lib/services/models/capture.service.mjs +1 -1
  47. package/esm2022/lib/services/models/comment.service.mjs +1 -1
  48. package/esm2022/lib/services/models/domain.service.mjs +1 -1
  49. package/esm2022/lib/services/models/equipment.service.mjs +1 -1
  50. package/esm2022/lib/services/models/event.service.mjs +1 -1
  51. package/esm2022/lib/services/models/feature.service.mjs +1 -1
  52. package/esm2022/lib/services/models/hashtag.service.mjs +1 -1
  53. package/esm2022/lib/services/models/layer.service.mjs +1 -1
  54. package/esm2022/lib/services/models/measurement.service.mjs +1 -1
  55. package/esm2022/lib/services/models/mission.service.mjs +1 -1
  56. package/esm2022/lib/services/models/navigation.service.mjs +1 -1
  57. package/esm2022/lib/services/models/node.service.mjs +1 -1
  58. package/esm2022/lib/services/models/object3D.service.mjs +1 -1
  59. package/esm2022/lib/services/models/operation.service.mjs +1 -1
  60. package/esm2022/lib/services/models/organisation.service.mjs +1 -1
  61. package/esm2022/lib/services/models/plan.service.mjs +1 -1
  62. package/esm2022/lib/services/models/poi.service.mjs +27 -27
  63. package/esm2022/lib/services/models/profile.service.mjs +1 -1
  64. package/esm2022/lib/services/models/property.service.mjs +1 -1
  65. package/esm2022/lib/services/models/space.service.mjs +1 -1
  66. package/esm2022/lib/services/models/template.service.mjs +1 -1
  67. package/esm2022/lib/services/models/ticket.service.mjs +1 -1
  68. package/esm2022/lib/services/models/visit.service.mjs +1 -1
  69. package/esm2022/lib/services/models/zone.service.mjs +1 -1
  70. package/esm2022/lib/services/navigator.service.mjs +1 -1
  71. package/esm2022/lib/services/obj-to-glb.mjs +649 -0
  72. package/esm2022/lib/services/s3.service.mjs +43 -3
  73. package/esm2022/lib/services/search.service.mjs +1 -1
  74. package/esm2022/lib/services/support.service.mjs +1 -1
  75. package/esm2022/lib/services/sweep-locator.service.mjs +1 -1
  76. package/esm2022/lib/services/tag.service.mjs +16 -16
  77. package/esm2022/lib/services/threejs-import.service.mjs +6 -4
  78. package/esm2022/lib/services/threejs.service.mjs +867 -95
  79. package/esm2022/lib/services/user.service.mjs +1 -1
  80. package/esm2022/lib/services/utils/matterport-transform.util.mjs +1 -1
  81. package/esm2022/lib/services/validators.service.mjs +1 -1
  82. package/esm2022/lib/services/viewer.service.mjs +189 -7
  83. package/esm2022/lib/services/zone-drawer.service.mjs +1 -1
  84. package/esm2022/lib/services/zoneChange.service.mjs +1 -1
  85. package/esm2022/lib/tokens/matterport-sdk-key.token.mjs +1 -1
  86. package/esm2022/lib/validators/email.directive.mjs +1 -1
  87. package/esm2022/lib/validators/no-empty.directive.mjs +1 -1
  88. package/esm2022/lib/validators/number.directive.mjs +1 -1
  89. package/esm2022/lib/validators/text.directive.mjs +1 -1
  90. package/esm2022/public-api.mjs +3 -1
  91. package/fesm2022/smarterplan-ngx-smarterplan-core.mjs +2239 -233
  92. package/fesm2022/smarterplan-ngx-smarterplan-core.mjs.map +1 -1
  93. package/lib/components/splat-viewer/splat-viewer.component.d.ts +98 -0
  94. package/lib/ngx-smarterplan-core.module.d.ts +7 -6
  95. package/lib/services/matterport-tag.service.d.ts +5 -5
  96. package/lib/services/obj-to-glb.d.ts +66 -0
  97. package/lib/services/s3.service.d.ts +7 -0
  98. package/lib/services/threejs.service.d.ts +336 -16
  99. package/lib/services/viewer.service.d.ts +110 -8
  100. package/package.json +1 -1
  101. package/public-api.d.ts +2 -0
  102. package/src/assets/viewers/splat/chunk-BYLI4YBI.js +17037 -0
  103. package/src/assets/viewers/splat/chunk-LDV6YPMG.js +1 -0
  104. package/src/assets/viewers/splat/chunk-WZ5Z4TU3.js +105719 -0
  105. package/src/assets/viewers/splat/convert-4DRLH77X.js +1 -0
  106. package/src/assets/viewers/splat/convert.html +11 -0
  107. package/src/assets/viewers/splat/converter-SLBB5MHG.js +1 -0
  108. package/src/assets/viewers/splat/index.html +90 -0
  109. package/src/assets/viewers/splat/spz-DEYRea_v-QE6YSGIB.js +5292 -0
  110. package/src/assets/viewers/splat/viewer-W4X3FWQJ.js +2704 -0
  111. package/src/assets/viewers/splat/viewer.css +1096 -0
  112. package/src/assets/viewers/splat/webp.wasm +0 -0
  113. package/src/assets/viewers/splat/worker.mjs +1383 -0
  114. package/src/assets/vs-app.json +67 -67
@@ -131,6 +131,15 @@ function solveReducedAlignment(pairs, up) {
131
131
  scale,
132
132
  };
133
133
  }
134
+ /**
135
+ * The 3D viewers' background where there is nothing to draw, unless the app sets its own as
136
+ * --smarterplan-viewer-background: the SmarterPlan app's light blue, from the POC.
137
+ */
138
+ export const VIEWER_BACKGROUND = '#e0f7ff';
139
+ /** The 3D viewers' background as the app sets it, where the element is. */
140
+ function viewerBackground(element) {
141
+ return getComputedStyle(element).getPropertyValue('--smarterplan-viewer-background').trim() || VIEWER_BACKGROUND;
142
+ }
134
143
  export class ThreeJsService {
135
144
  ngZone;
136
145
  scene;
@@ -149,6 +158,17 @@ export class ThreeJsService {
149
158
  objectClicked$ = new Subject();
150
159
  /** Emits when the user clicks a tag, mirroring Matterport's tag click. */
151
160
  tagClicked$ = new Subject();
161
+ /**
162
+ * Emits the tag the camera is sent to (goToTag): for a viewer drawing the model elsewhere, the
163
+ * splat viewer, to point it out.
164
+ */
165
+ tagFocused$ = new Subject();
166
+ /**
167
+ * Emits when the tags change - added, moved, removed, filtered, calibrated differently - at most
168
+ * once per turn of the event loop, however many changed in it.
169
+ */
170
+ tagsChanged$ = new Subject();
171
+ tagsChangeQueued = false;
152
172
  /** Emits a tag's label while the pointer is over it, and null when it leaves. */
153
173
  tagHovered$ = new Subject();
154
174
  // Tags live under the model rather than the scene, so the centering and scaling applied when the
@@ -158,6 +178,22 @@ export class ThreeJsService {
158
178
  canvasResizeObserver;
159
179
  /** Aborts the in-flight model download. Parsing cannot be interrupted, only not started. */
160
180
  loadAbortController;
181
+ /**
182
+ * Which load is the wanted one. Every load takes the next number as it starts, and anything that
183
+ * makes it unwanted - another load, the scene being rebuilt, the viewer closing - moves the
184
+ * number on.
185
+ *
186
+ * Aborting the download is not enough to stop a load. A model read from the cache has no
187
+ * download to abort, and one that has finished downloading still has seconds of work ahead of it
188
+ * before it reaches the screen. A load that finds the number has moved on drops what it has.
189
+ */
190
+ loadGeneration = 0;
191
+ /** Whether the wanted load is still on its way, so abandoning it can say that it stopped. */
192
+ loadInProgress = false;
193
+ /** Whether a scene is up: started by init() and not yet taken down by destroy(). */
194
+ live = false;
195
+ /** Takes off each listener init() put on the canvas. */
196
+ canvasListeners = [];
161
197
  // The loaded base model, kept so tag placement can raycast against its geometry.
162
198
  modelRoot;
163
199
  /** True while the next click on the model places a tag instead of orbiting. */
@@ -179,6 +215,12 @@ export class ThreeJsService {
179
215
  * placed in this one are told from those that came from elsewhere.
180
216
  */
181
217
  currentCaptureID = null;
218
+ /**
219
+ * Whether the visit on screen is the only one the site has. A tag records the visit it was placed
220
+ * in, but some do not - placed before that was recorded, or in the development model. With
221
+ * another visit around, such a tag is taken to come from it. With none, it can only be this one's.
222
+ */
223
+ soleVisit = false;
182
224
  /**
183
225
  * The model's surface as a grid: every cell some part of the surface passes through.
184
226
  *
@@ -223,6 +265,17 @@ export class ThreeJsService {
223
265
  modelUp = 'y';
224
266
  /** While measuring: how many points and each segment's length. Null when it is abandoned. */
225
267
  measurementProgress$ = new Subject();
268
+ /**
269
+ * True when a measurement starts taking clicks, false when it stops - finished or abandoned. For a
270
+ * viewer drawing the model elsewhere, which takes the clicks itself; see addMeasurePointAtModelPoint.
271
+ */
272
+ measuringChanged$ = new Subject();
273
+ /**
274
+ * A measurement - under way or finished - was taken off the model. For a viewer drawing it
275
+ * elsewhere, the splat viewer: a finished one stays drawn while its form is open, which
276
+ * measurementProgress$ does not say the end of.
277
+ */
278
+ measurementCleared$ = new Subject();
226
279
  /**
227
280
  * Layer carrying the model alone, so the depth pick can render it without the tags.
228
281
  *
@@ -230,8 +283,18 @@ export class ThreeJsService {
230
283
  * their parent passed, so marking the model's own meshes is enough - no re-parenting.
231
284
  */
232
285
  static PICK_LAYER = 1;
286
+ /** How large a tag is drawn, in CSS pixels. About what Matterport draws its own at. */
287
+ static TAG_SCREEN_PX = 28;
233
288
  /** The app's highlight colour, so a measurement reads as the active thing on screen. */
234
289
  static MEASURE_COLOR = '#FFB103';
290
+ /** Green for the points of a calibration that are settled, as opposed to the one in hand. */
291
+ static CALIBRATION_DONE_COLOR = '#1E9E5A';
292
+ /** Size on screen of the numbered pin left where a tag was matched: a little under a tag's. */
293
+ static CALIBRATION_PIN_PX = 24;
294
+ /** How long a mark just dropped takes to settle to its size, in milliseconds. */
295
+ static CONFIRM_PULSE_MS = 350;
296
+ /** How many matched tags a calibration takes. Three settle everything there is to settle. */
297
+ static CALIBRATION_PAIRS = 3;
235
298
  /** Cache Storage bucket holding downloaded models, and how many to keep. */
236
299
  static MODEL_CACHE = 'smarterplan-3d-models';
237
300
  static MODEL_CACHE_SIZE = 3;
@@ -246,12 +309,36 @@ export class ThreeJsService {
246
309
  /** Translucent marker shown under the cursor while placing. */
247
310
  placementPreview;
248
311
  aligning = false;
312
+ /**
313
+ * True from the moment the calibration panel opens, before the walkthrough is armed: the tags
314
+ * from elsewhere are all on show, as they are while calibrating, so that what there is to
315
+ * calibrate with can be seen while reading what calibrating involves.
316
+ */
317
+ revealingCalibrationTags = false;
249
318
  alignmentPairs = [];
250
319
  alignmentSource = null;
251
320
  /** The tag `alignmentSource` was read from, kept so the same tag is not matched twice. */
252
321
  alignmentSourceTagId;
322
+ /**
323
+ * Everything drawn for the calibration under way: a numbered pin where each tag was matched, a
324
+ * line from the pin to its tag, and a ring round the tag being matched.
325
+ *
326
+ * A sibling of the tag group rather than a child of it. The points clicked are where the tags are
327
+ * to end up, in the frame the calibration maps onto (see pickAlignmentTarget) - not in the tags'
328
+ * own frame, which is the one about to change.
329
+ */
330
+ calibrationGroup = new THREE.Group();
331
+ /** Marks still settling after being dropped, advanced by the render loop. */
332
+ pulses = [];
253
333
  /** Drives the alignment walkthrough's UI: how many pairs are done and what it wants next. */
254
334
  alignmentProgress$ = new Subject();
335
+ /**
336
+ * Emits when a click during calibration did nothing, with what it was expected to land on.
337
+ *
338
+ * A click that changes nothing looks the same as a click that was not received. This lets the
339
+ * panel point at what it is waiting for instead.
340
+ */
341
+ alignmentClickIgnored$ = new Subject();
255
342
  /** In-flight camera move started by goToTag, advanced by the render loop. */
256
343
  cameraTween = null;
257
344
  /** Emits true while a heavy OBJ file is being parsed (in a worker, when available), false once done. */
@@ -363,15 +450,30 @@ export class ThreeJsService {
363
450
  // by then, so the model being abandoned would be handed to the scene built below.
364
451
  // - The tag group, which is a field and keeps its sprites. They would be re-parented under the
365
452
  // new model and show the previous visit's tags on it.
453
+ // Usually destroy() ran before this and there is nothing left to stop. When it did not, the
454
+ // scene before would carry on beside the one started below: its render loop drawing every
455
+ // frame as well, its model still on the graphics card, its listeners answering every click a
456
+ // second time.
457
+ if (this.live) {
458
+ this.destroy();
459
+ }
366
460
  this.discardCurrentLoad();
367
461
  this.clearTags();
368
462
  this.measuring = false;
369
463
  this.clearMeasurement();
464
+ // A calibration left half-done belongs to the scene it was started in: its points mean nothing
465
+ // in the next one, and left armed it would take that scene's first clicks for itself.
466
+ this.aligning = false;
467
+ this.revealingCalibrationTags = false;
468
+ this.soleVisit = false;
469
+ this.alignmentPairs = [];
470
+ this.clearAlignmentSource();
471
+ this.clearCalibrationMarks();
472
+ this.pulses = [];
370
473
  this.cameraTween = null;
371
- this.modelRoot = undefined;
372
474
  // 1. Setup Scene
373
475
  this.scene = new THREE.Scene();
374
- this.scene.background = new THREE.Color(0xe0f7ff); // from POC
476
+ this.scene.background = new THREE.Color(viewerBackground(canvas));
375
477
  // 2. Setup Camera
376
478
  this.camera = new THREE.PerspectiveCamera(75, canvas.clientWidth / canvas.clientHeight, 0.1, 10000);
377
479
  this.camera.position.set(0, 5, 10); // will be overridden later if passed
@@ -416,7 +518,14 @@ export class ThreeJsService {
416
518
  // A light only contributes while it is part of the scene graph, and this one hangs off the camera.
417
519
  this.scene.add(this.camera);
418
520
  // 5. Setup Controls (from POC)
419
- this.controls = new OrbitControls(this.camera, this.renderer.domElement);
521
+ //
522
+ // Created outside Angular's zone, as is the pointer-move listener further down. The controls
523
+ // listen to every pointer move and wheel tick, and inside the zone each of those events had
524
+ // Angular re-check the whole page - dozens of times a second while the camera is dragged,
525
+ // competing with the frames being drawn - for a change that only ever concerns the canvas.
526
+ this.ngZone.runOutsideAngular(() => {
527
+ this.controls = new OrbitControls(this.camera, this.renderer.domElement);
528
+ });
420
529
  this.controls.rotateSpeed = 1.0;
421
530
  this.controls.dampingFactor = 0.1;
422
531
  this.controls.enableDamping = true;
@@ -440,9 +549,18 @@ export class ThreeJsService {
440
549
  }, 250);
441
550
  }
442
551
  });
443
- // Interaction Event Listeners on canvas
444
- canvas.addEventListener('click', this.onMouseClick.bind(this), false);
445
- canvas.addEventListener('mousemove', this.onMouseMove.bind(this), false);
552
+ // Interaction Event Listeners on canvas. Kept so that destroy() can take them off again: the
553
+ // same canvas is used again when one 3D model is swapped for another, and a second set of
554
+ // listeners would answer every click twice.
555
+ const listen = (type, handler) => {
556
+ canvas.addEventListener(type, handler, false);
557
+ this.canvasListeners.push(() => canvas.removeEventListener(type, handler, false));
558
+ };
559
+ // A click changes what the page shows - a panel opens, a point is recorded - so Angular has to
560
+ // hear of it, wherever init() itself was called from.
561
+ listen('click', (event) => this.ngZone.run(() => this.onMouseClick(event)));
562
+ // Moving the pointer does not: it moves the ghost and the tooltip, both drawn here.
563
+ this.ngZone.runOutsideAngular(() => listen('mousemove', (event) => this.onMouseMove(event)));
446
564
  // Escape backs out of placement and calibration. On the window rather than the canvas, which
447
565
  // would need focus the user has no reason to have given it - they are aiming with the mouse.
448
566
  // Removed first because this service is a singleton: init() runs again for every canvas, and
@@ -455,6 +573,7 @@ export class ThreeJsService {
455
573
  this.pickCamera = undefined;
456
574
  window.addEventListener('keydown', this.onKeyDown);
457
575
  // 6. Start the render loop
576
+ this.live = true;
458
577
  this.ngZone.runOutsideAngular(() => {
459
578
  this.animate();
460
579
  });
@@ -491,33 +610,25 @@ export class ThreeJsService {
491
610
  }
492
611
  // Lets gltfpack/gltf-transform output using EXT_meshopt_compression load without extra setup.
493
612
  loader.setMeshoptDecoder(MeshoptDecoder);
494
- this.modelLoading$.next(true);
613
+ const wanted = this.beginLoad();
495
614
  this.modelLoadProgress$.next(0);
496
615
  // Order matters: normals must exist before anisotropy, and the Phong conversion has to run
497
616
  // before side/flatShading are touched so those settings land on the materials we keep.
498
617
  const onLoaded = (gltf) => {
618
+ if (!wanted()) {
619
+ // Built for a request that has since been replaced or abandoned. It was never on screen;
620
+ // what it holds is freed here because nothing else ever will.
621
+ this.disposeModel(gltf.scene);
622
+ return;
623
+ }
499
624
  this.convertToPhongMaterials(gltf.scene);
500
625
  this.forceDoubleSidedMaterials(gltf.scene);
501
626
  this.ensureVertexNormals(gltf.scene);
502
627
  this.tuneTextureSampling(gltf.scene);
503
628
  this.placeLoadedObjectInScene(gltf.scene, cameraPosition, rotation, up);
504
- this.modelLoading$.next(false);
505
- };
506
- const onError = (error) => {
507
- // Cancelling is a decision, not a failure: clear the overlay without an error in the console.
508
- if (error?.name === 'AbortError') {
509
- // Only a cancel of the load that is still current came from the user; anything else is this
510
- // load having been superseded or discarded.
511
- if (this.loadAbortController?.signal.aborted) {
512
- this.modelLoadCancelled$.next();
513
- }
514
- }
515
- else {
516
- console.error('Error loading GLTF model:', error);
517
- }
518
- this.modelLoading$.next(false);
519
- this.modelLoadProgress$.next(null);
629
+ this.endLoad();
520
630
  };
631
+ const onError = (error) => this.loadFailed(wanted, error, 'GLTF model');
521
632
  // GLTFLoader decodes embedded images with createImageBitmap when the browser offers it, and on
522
633
  // large texture atlases that path returns visibly corrupt data - scattered white blocks across
523
634
  // the model. The exact same bytes decoded through an HTMLImageElement, which is what the .obj
@@ -535,7 +646,8 @@ export class ThreeJsService {
535
646
  .then((buffer) => {
536
647
  // parse() cannot be interrupted, so a cancel that lands during the paint yield has to be
537
648
  // caught here - the last moment before the main thread is committed for several seconds.
538
- if (this.loadAbortController?.signal.aborted) {
649
+ // The same goes for a load nobody is waiting for any more.
650
+ if (!wanted() || this.loadAbortController?.signal.aborted) {
539
651
  throw new DOMException('Model load cancelled', 'AbortError');
540
652
  }
541
653
  const globalScope = globalThis;
@@ -550,6 +662,28 @@ export class ThreeJsService {
550
662
  })
551
663
  .catch(onError);
552
664
  }
665
+ /** Ends a load that failed, unless another load has replaced it in the meantime. */
666
+ loadFailed(wanted, error, what) {
667
+ if (!wanted()) {
668
+ // Whatever replaced this load owns the loading indicator now; ending it from here would
669
+ // switch the indicator off while that one is still on its way.
670
+ return;
671
+ }
672
+ this.loadInProgress = false;
673
+ // Cancelling is a decision, not a failure: clear the overlay without an error in the console.
674
+ if (error?.name === 'AbortError') {
675
+ // Only a cancel of the load that is still current came from the user; anything else is this
676
+ // load having been superseded or discarded.
677
+ if (this.loadAbortController?.signal.aborted) {
678
+ this.modelLoadCancelled$.next();
679
+ }
680
+ }
681
+ else {
682
+ console.error(`Error loading ${what}:`, error);
683
+ }
684
+ this.modelLoading$.next(false);
685
+ this.modelLoadProgress$.next(null);
686
+ }
553
687
  /**
554
688
  * Stops the model download in progress, if any.
555
689
  *
@@ -568,8 +702,30 @@ export class ThreeJsService {
568
702
  * scene is not something the person asked for, so it must not surface as "loading cancelled".
569
703
  */
570
704
  discardCurrentLoad() {
705
+ this.loadGeneration += 1;
571
706
  this.loadAbortController?.abort();
572
707
  this.loadAbortController = undefined;
708
+ if (this.loadInProgress) {
709
+ this.loadInProgress = false;
710
+ this.modelLoading$.next(false);
711
+ this.modelLoadProgress$.next(null);
712
+ }
713
+ }
714
+ /**
715
+ * Starts a load, replacing whichever was under way, and returns the question it has to keep
716
+ * asking: is it still the one that is wanted?
717
+ */
718
+ beginLoad() {
719
+ this.loadGeneration += 1;
720
+ const generation = this.loadGeneration;
721
+ this.loadInProgress = true;
722
+ this.modelLoading$.next(true);
723
+ return () => generation === this.loadGeneration;
724
+ }
725
+ /** Marks the wanted load as over, whichever way it ended. */
726
+ endLoad() {
727
+ this.loadInProgress = false;
728
+ this.modelLoading$.next(false);
573
729
  }
574
730
  /**
575
731
  * Resolves once the browser has painted at least one frame.
@@ -600,6 +756,11 @@ export class ThreeJsService {
600
756
  this.loadAbortController = new AbortController();
601
757
  const { signal } = this.loadAbortController;
602
758
  const cached = await this.readModelFromCache(cacheKey);
759
+ if (signal.aborted) {
760
+ // Replaced or abandoned while the cache was being read. With nothing being downloaded, this
761
+ // is the only place a load served from the cache can find that out.
762
+ throw new DOMException('Model load cancelled', 'AbortError');
763
+ }
603
764
  if (cached) {
604
765
  this.modelLoadProgress$.next(1);
605
766
  return cached;
@@ -940,12 +1101,25 @@ export class ThreeJsService {
940
1101
  const basePath = mtlUrl.substring(0, mtlUrl.lastIndexOf('/') + 1);
941
1102
  mtlLoader.setPath(basePath);
942
1103
  const mtlFileName = mtlUrl.substring(mtlUrl.lastIndexOf('/') + 1);
943
- this.modelLoading$.next(true);
1104
+ // These loaders cannot be interrupted, so a load that is no longer wanted runs to its end and
1105
+ // is dropped there - see loadGeneration.
1106
+ const wanted = this.beginLoad();
1107
+ const finish = () => {
1108
+ if (wanted()) {
1109
+ this.endLoad();
1110
+ }
1111
+ };
944
1112
  mtlLoader.load(mtlFileName, (materials) => {
1113
+ if (!wanted()) {
1114
+ return;
1115
+ }
945
1116
  materials.preload();
946
1117
  if (this.objParserWorker) {
947
1118
  this.requestObjParseInWorker(objUrl)
948
1119
  .then((meshes) => {
1120
+ if (!wanted()) {
1121
+ return;
1122
+ }
949
1123
  const group = new THREE.Group();
950
1124
  meshes.forEach((meshData) => {
951
1125
  group.add(this.meshFromParsedData(meshData, materials));
@@ -955,25 +1129,42 @@ export class ThreeJsService {
955
1129
  .catch((error) => {
956
1130
  console.error('Error parsing OBJ model in worker:', error);
957
1131
  })
958
- .finally(() => this.modelLoading$.next(false));
1132
+ .finally(finish);
959
1133
  return;
960
1134
  }
961
1135
  const objLoader = new OBJLoader();
962
1136
  objLoader.setMaterials(materials);
963
1137
  objLoader.load(objUrl, (object) => {
1138
+ if (!wanted()) {
1139
+ this.disposeModel(object);
1140
+ return;
1141
+ }
964
1142
  this.placeLoadedObjectInScene(object, cameraPosition, rotation);
965
- this.modelLoading$.next(false);
1143
+ finish();
966
1144
  }, undefined, (error) => {
967
1145
  console.error('Error loading OBJ model:', error);
968
- this.modelLoading$.next(false);
1146
+ finish();
969
1147
  });
970
1148
  }, undefined, (error) => {
971
1149
  console.error('Error loading MTL file:', error);
972
- this.modelLoading$.next(false);
1150
+ finish();
973
1151
  });
974
1152
  }
975
1153
  /** Centers, scales and adds a loaded object to the scene, then frames the camera on it. */
976
1154
  placeLoadedObjectInScene(object, cameraPosition, rotation, up) {
1155
+ // A scene shows one model. Whatever was there is taken out and freed first, or the two would be
1156
+ // drawn through each other, every frame, for as long as the viewer stays open.
1157
+ if (this.modelRoot) {
1158
+ // Points being clicked for a calibration or a measurement were clicked on the model that is
1159
+ // about to go; they say nothing about the one arriving.
1160
+ if (this.aligning) {
1161
+ this.cancelTagAlignment();
1162
+ }
1163
+ if (this.measuring) {
1164
+ this.cancelMeasuring();
1165
+ }
1166
+ }
1167
+ this.removeModel();
977
1168
  const box = new THREE.Box3().setFromObject(object);
978
1169
  const center = box.getCenter(new THREE.Vector3());
979
1170
  const size = box.getSize(new THREE.Vector3());
@@ -1010,8 +1201,9 @@ export class ThreeJsService {
1010
1201
  group.add(centered);
1011
1202
  group.scale.setScalar(scale);
1012
1203
  this.scene.add(group);
1013
- // Tags registered before the model finished loading were sized against the old scale.
1014
- this.tagSprites.forEach((sprite) => this.scaleTagForModel(sprite));
1204
+ this.scene.updateMatrixWorld(true);
1205
+ // Markers registered before the model finished loading were sized against the old scale.
1206
+ this.refreshScreenSizes();
1015
1207
  this.adjustClippingPlanes((size.length() / 2) * scale);
1016
1208
  if (cameraPosition) {
1017
1209
  this.camera.position.set(cameraPosition.x, cameraPosition.y, cameraPosition.z);
@@ -1027,16 +1219,25 @@ export class ThreeJsService {
1027
1219
  * not clear enough to act on.
1028
1220
  *
1029
1221
  * Models arrive in two conventions: Y up (glTF, and what this viewer assumes) and Z up (most CAD
1030
- * and scanning exports). A Z-up model loads lying on its side. Two independent cues say which
1031
- * axis is the vertical one, and both have to agree before anything is turned:
1222
+ * and scanning exports). A Z-up model loads lying on its side. Three independent cues say which
1223
+ * axis is the vertical one:
1032
1224
  *
1033
1225
  * - Surface area. Floors and ceilings all face along the vertical, while walls are shared out
1034
1226
  * between the two horizontal axes, so the vertical usually collects the most area.
1035
1227
  * - Extent. A building is normally wider than it is tall, so the vertical is its shortest side.
1228
+ * - Openness. A capture made from outside has ground and roofs but nothing underneath them, so
1229
+ * along the vertical nearly all of its surface faces one way; walls face both ways evenly.
1230
+ *
1231
+ * Each is wrong often enough on its own - a long corridor has more wall than floor, a tower is
1232
+ * taller than it is wide - so a cue only counts when its answer is clear-cut, and the model is
1233
+ * turned when the clear answers agree. It used to take area and extent agreeing with each other,
1234
+ * which failed on exactly the models that need this most: in a whole building or a city block
1235
+ * there is as much wall as floor, the area cue comes out a three-way tie, and a model 130 m wide
1236
+ * and 34 m tall with 86% of its surface facing one way was left lying on its side.
1036
1237
  *
1037
- * Either alone is wrong often enough to matter - a long corridor has more wall than floor, a
1038
- * tower is taller than it is wide - and turning a model that was fine is worse than leaving one
1039
- * that was not. A model that already has Y as its vertical is never touched.
1238
+ * Turning a model that was fine is worse than leaving one that was not: when the clear answers
1239
+ * contradict each other, or there is none, nothing is turned. A model that already has Y as its
1240
+ * vertical is never touched.
1040
1241
  */
1041
1242
  detectModelUp(object, size) {
1042
1243
  const axes = ['x', 'y', 'z'];
@@ -1051,6 +1252,7 @@ export class ThreeJsService {
1051
1252
  }
1052
1253
  });
1053
1254
  if (triangleCount === 0) {
1255
+ // Nothing with faces to weigh: the convention.
1054
1256
  return 'y';
1055
1257
  }
1056
1258
  // A sample is plenty to see where the area lies, and keeps this cheap on models with millions
@@ -1081,16 +1283,45 @@ export class ThreeJsService {
1081
1283
  }
1082
1284
  });
1083
1285
  const total = { x: area.x[0] + area.x[1], y: area.y[0] + area.y[1], z: area.z[0] + area.z[1] };
1084
- const byArea = axes.reduce((best, axis) => (total[axis] > total[best] ? axis : best), 'y');
1085
- const byExtent = axes.reduce((best, axis) => (size[axis] < size[best] ? axis : best), 'y');
1086
- if (byArea === 'y' || byArea !== byExtent || total[byArea] < 1.25 * total.y) {
1286
+ const extent = { x: size.x, y: size.y, z: size.z };
1287
+ // How one-sided the surface is along each axis: 0 when it faces both ways evenly, 1 when it
1288
+ // all faces the same way.
1289
+ const lopsided = { x: 0, y: 0, z: 0 };
1290
+ axes.forEach((axis) => {
1291
+ lopsided[axis] = total[axis] > 0 ? Math.abs(area[axis][0] - area[axis][1]) / total[axis] : 0;
1292
+ });
1293
+ /** The axes ordered by a measure, largest first. */
1294
+ const ranked = (measure) => [...axes].sort((first, second) => measure[second] - measure[first]);
1295
+ const [mostArea, nextArea] = ranked(total);
1296
+ const [, middleExtent, shortest] = ranked(extent);
1297
+ const [mostOpen, nextOpen] = ranked(lopsided);
1298
+ // What each cue says, when it says it clearly; null when it has no clear answer.
1299
+ const areaSays = total[mostArea] >= 1.25 * total[nextArea] ? mostArea : null;
1300
+ const extentSays = extent[middleExtent] >= 1.5 * extent[shortest] ? shortest : null;
1301
+ const opennessSays = lopsided[mostOpen] >= 0.5
1302
+ && lopsided[mostOpen] >= 2 * lopsided[nextOpen]
1303
+ // Not on the strength of a few stray triangles: the surface along that axis has to matter.
1304
+ && total[mostOpen] >= 0.25 * total[mostArea]
1305
+ ? mostOpen
1306
+ : null;
1307
+ const clear = [areaSays, extentSays, opennessSays].filter((axis) => axis !== null);
1308
+ let vertical = 'y';
1309
+ if (clear.length > 0) {
1310
+ // Clear answers that contradict each other are no answer.
1311
+ vertical = clear.every((axis) => axis === clear[0]) ? clear[0] : 'y';
1312
+ }
1313
+ else if (mostArea === shortest && total[mostArea] >= 1.25 * total.y) {
1314
+ // Nothing clear-cut, but area and extent lean the same way and away from Y.
1315
+ vertical = mostArea;
1316
+ }
1317
+ if (vertical === 'y') {
1087
1318
  return 'y';
1088
1319
  }
1089
1320
  // Which way along that axis is up. Roofs and ground make an outdoor model face mostly upward,
1090
1321
  // which settles it; indoors floors and ceilings balance out, and the convention - positive is
1091
1322
  // up - is the better guess.
1092
- const [positive, negative] = area[byArea];
1093
- const up = `${negative > 0.65 * (positive + negative) ? '-' : ''}${byArea}`;
1323
+ const [positive, negative] = area[vertical];
1324
+ const up = `${negative > 0.65 * (positive + negative) ? '-' : ''}${vertical}`;
1094
1325
  console.info(`ThreeJsService: this model's vertical axis looks like ${up}, not y - standing it upright.`);
1095
1326
  return up;
1096
1327
  }
@@ -1140,6 +1371,7 @@ export class ThreeJsService {
1140
1371
  this.camera.updateProjectionMatrix();
1141
1372
  this.renderer.setSize(width, height);
1142
1373
  this.updateMeasureLineResolution();
1374
+ this.refreshScreenSizes();
1143
1375
  });
1144
1376
  this.canvasResizeObserver.observe(container);
1145
1377
  }
@@ -1150,6 +1382,34 @@ export class ThreeJsService {
1150
1382
  * only has to supply the matching spot on the model. No new records are written; nothing is
1151
1383
  * applied until solveAlignmentFromPairs() succeeds.
1152
1384
  */
1385
+ /**
1386
+ * Shows every tag that came from elsewhere, whether or not it lands on the model, without arming
1387
+ * anything: clicks still do what they always do.
1388
+ *
1389
+ * Calibrating shows them too, and ending a calibration - saved or abandoned - puts them back
1390
+ * under the usual rule, so this only ever has to be switched on.
1391
+ */
1392
+ revealCalibrationTags(revealed = true) {
1393
+ this.revealingCalibrationTags = revealed;
1394
+ this.refreshTagVisibility();
1395
+ // Another viewer showing the tags shows these as well now; see showsCalibrationTags.
1396
+ this.announceTagsChanged();
1397
+ }
1398
+ /**
1399
+ * Whether the tags a calibration works with are on show - while one is under way, or its panel
1400
+ * open - including those that do not land on the model. For another viewer showing the tags,
1401
+ * which otherwise leaves out the ones from elsewhere until the model is calibrated.
1402
+ */
1403
+ showsCalibrationTags() {
1404
+ return this.aligning || this.revealingCalibrationTags;
1405
+ }
1406
+ /** Says a tag was clicked in a viewer drawing the model elsewhere, as a click on it here would. */
1407
+ clickTag(elementId) {
1408
+ const sprite = this.tagSprites.get(elementId);
1409
+ if (sprite) {
1410
+ this.tagClicked$.next({ elementId, poiType: sprite.userData.poiType ?? null });
1411
+ }
1412
+ }
1153
1413
  startTagAlignment() {
1154
1414
  // One pointer mode at a time, the same rule startMeasuring() applies the other way round.
1155
1415
  if (this.measuring) {
@@ -1157,27 +1417,28 @@ export class ThreeJsService {
1157
1417
  }
1158
1418
  this.aligning = true;
1159
1419
  this.alignmentPairs = [];
1160
- this.alignmentSource = null;
1420
+ this.clearAlignmentSource();
1161
1421
  // While calibrating, the tags from elsewhere are all shown - including the ones off the model,
1162
1422
  // which are exactly the ones a calibration is for.
1163
1423
  this.refreshTagVisibility();
1164
1424
  if (this.renderer) {
1165
1425
  this.renderer.domElement.style.cursor = 'crosshair';
1166
1426
  }
1167
- this.alignmentProgress$.next({ pairs: 0, awaiting: 'tag' });
1427
+ this.alignmentChanged();
1428
+ this.announceTagsChanged();
1168
1429
  }
1169
1430
  cancelTagAlignment() {
1170
1431
  const wasAligning = this.aligning;
1171
1432
  this.aligning = false;
1433
+ this.revealingCalibrationTags = false;
1172
1434
  this.alignmentPairs = [];
1173
- this.alignmentSource = null;
1174
- this.pendingPreviewEvent = null;
1175
- this.removePlacementPreview();
1435
+ this.clearAlignmentSource();
1176
1436
  this.refreshTagVisibility();
1177
1437
  if (this.renderer) {
1178
1438
  this.renderer.domElement.style.cursor = 'default';
1179
1439
  }
1180
- this.alignmentProgress$.next({ pairs: 0, awaiting: null });
1440
+ this.alignmentChanged();
1441
+ this.announceTagsChanged();
1181
1442
  if (wasAligning) {
1182
1443
  this.alignmentCancelled$.next();
1183
1444
  }
@@ -1225,11 +1486,10 @@ export class ThreeJsService {
1225
1486
  // Out of calibrating mode first: applying the result re-decides which tags show, and from here
1226
1487
  // on that is the ones on the model again, not all of them.
1227
1488
  this.aligning = false;
1489
+ this.revealingCalibrationTags = false;
1228
1490
  this.applyAlignmentKeepingOwnTags(alignment);
1229
- this.pendingPreviewEvent = null;
1230
- this.removePlacementPreview();
1231
1491
  this.renderer.domElement.style.cursor = 'default';
1232
- this.alignmentProgress$.next({ pairs: this.alignmentPairs.length, awaiting: null });
1492
+ this.alignmentChanged();
1233
1493
  return alignment;
1234
1494
  }
1235
1495
  /**
@@ -1288,7 +1548,8 @@ export class ThreeJsService {
1288
1548
  */
1289
1549
  selectAlignmentTag(elementId) {
1290
1550
  const sprite = this.tagSprites.get(elementId);
1291
- if (!this.aligning || this.alignmentSource || !sprite || !this.calibrationCandidates().includes(sprite)) {
1551
+ if (!this.aligning || this.alignmentSource || !this.canMatchAnotherTag()
1552
+ || !sprite || !this.calibrationCandidates().includes(sprite)) {
1292
1553
  return false;
1293
1554
  }
1294
1555
  this.setAlignmentSource(sprite);
@@ -1300,18 +1561,28 @@ export class ThreeJsService {
1300
1561
  const stored = sprite.position;
1301
1562
  this.alignmentSource = { x: stored.x, y: stored.y, z: stored.z };
1302
1563
  this.alignmentSourceTagId = sprite.name;
1303
- this.alignmentProgress$.next({
1304
- pairs: this.alignmentPairs.length,
1305
- awaiting: 'point',
1306
- tagId: sprite.name,
1307
- });
1564
+ this.alignmentChanged('tag');
1565
+ }
1566
+ clearAlignmentSource() {
1567
+ this.alignmentSource = null;
1568
+ this.alignmentSourceTagId = undefined;
1569
+ }
1570
+ /** Whether the calibration still has room for a pair and a tag to make it from. */
1571
+ canMatchAnotherTag() {
1572
+ return this.alignmentPairs.length < ThreeJsService.CALIBRATION_PAIRS
1573
+ && this.calibrationCandidates().length > 0;
1308
1574
  }
1309
1575
  /** Handles a click while the alignment walkthrough is running. */
1310
1576
  handleAlignmentClick(event) {
1311
1577
  if (!this.alignmentSource) {
1312
1578
  // First half of a pair: which tag are we talking about?
1579
+ if (!this.canMatchAnotherTag()) {
1580
+ // Nothing left to match: what remains is to save, or to take a pair back.
1581
+ return;
1582
+ }
1313
1583
  const hit = this.raycaster.intersectObjects(this.calibrationCandidates(), false)[0];
1314
1584
  if (!hit) {
1585
+ this.alignmentClickIgnored$.next('tag');
1315
1586
  return;
1316
1587
  }
1317
1588
  this.setAlignmentSource(hit.object);
@@ -1320,18 +1591,220 @@ export class ThreeJsService {
1320
1591
  // Second half: where that tag actually belongs on the model.
1321
1592
  const target = this.pickAlignmentTarget(event);
1322
1593
  if (!target) {
1594
+ this.alignmentClickIgnored$.next('point');
1323
1595
  return;
1324
1596
  }
1325
1597
  this.alignmentPairs.push({ tagId: this.alignmentSourceTagId, source: this.alignmentSource, target });
1326
- this.alignmentSource = null;
1327
- // The ghost belongs to the click that just happened; the next half is a click on a tag.
1598
+ this.clearAlignmentSource();
1599
+ this.alignmentChanged('point');
1600
+ }
1601
+ /**
1602
+ * Records where the tag being matched really is, from a spot another viewer picked on the model -
1603
+ * the splat viewer - in the model's own coordinates: the frame pickAlignmentTarget measures a
1604
+ * click in, as placeTagAtModelPoint takes it. False when no tag is waiting for its spot.
1605
+ */
1606
+ matchAlignmentTagAtModelPoint(point) {
1607
+ if (!this.aligning || !this.alignmentSource) {
1608
+ return false;
1609
+ }
1610
+ this.alignmentPairs.push({
1611
+ tagId: this.alignmentSourceTagId,
1612
+ source: this.alignmentSource,
1613
+ target: { x: point.x, y: point.y, z: point.z },
1614
+ });
1615
+ this.clearAlignmentSource();
1616
+ this.alignmentChanged('point');
1617
+ return true;
1618
+ }
1619
+ /**
1620
+ * Takes back the last thing done in the calibration under way: the choice of tag while its place
1621
+ * on the model is being asked for, the last matched pair otherwise.
1622
+ *
1623
+ * One step at a time, so a click made by mistake costs that click and not the whole calibration.
1624
+ * Returns false when there is nothing to take back.
1625
+ */
1626
+ undoAlignmentStep() {
1627
+ if (!this.aligning) {
1628
+ return false;
1629
+ }
1630
+ if (this.alignmentSource) {
1631
+ this.clearAlignmentSource();
1632
+ }
1633
+ else if (this.alignmentPairs.length > 0) {
1634
+ this.alignmentPairs.pop();
1635
+ }
1636
+ else {
1637
+ return false;
1638
+ }
1639
+ this.alignmentChanged();
1640
+ return true;
1641
+ }
1642
+ /**
1643
+ * Removes one matched pair, whichever it is, putting its tag back on offer.
1644
+ *
1645
+ * For the point noticed to be wrong only after others were matched: taking steps back one by one
1646
+ * to reach it would throw away the good ones made since.
1647
+ */
1648
+ removeAlignmentPair(index) {
1649
+ if (!this.aligning || !Number.isInteger(index) || index < 0 || index >= this.alignmentPairs.length) {
1650
+ return false;
1651
+ }
1652
+ this.alignmentPairs.splice(index, 1);
1653
+ this.alignmentChanged();
1654
+ return true;
1655
+ }
1656
+ /** The tags matched so far in the calibration under way, in the order they are numbered in. */
1657
+ getAlignmentPairs() {
1658
+ return this.alignmentPairs.map((pair) => {
1659
+ const sprite = this.tagSprites.get(pair.tagId);
1660
+ return {
1661
+ tagId: pair.tagId,
1662
+ label: sprite?.userData.label ?? null,
1663
+ poiType: sprite?.userData.poiType ?? null,
1664
+ target: { ...pair.target },
1665
+ };
1666
+ });
1667
+ }
1668
+ /**
1669
+ * Brings the scene and the panel in line with the calibration's state, after anything changed it.
1670
+ *
1671
+ * `dropped` names the mark the change put down, if it put one down, so that it can be shown
1672
+ * arriving: that movement is what tells someone their click was taken.
1673
+ */
1674
+ alignmentChanged(dropped) {
1675
+ // The ghost previews the pin about to be dropped, number included, so it is never carried over
1676
+ // from one state to the next; the next pointer move draws the right one.
1328
1677
  this.pendingPreviewEvent = null;
1329
1678
  this.removePlacementPreview();
1679
+ if (this.aligning && this.renderer) {
1680
+ this.renderer.domElement.style.cursor = 'crosshair';
1681
+ }
1682
+ this.redrawCalibrationMarks(dropped);
1683
+ let awaiting = null;
1684
+ if (this.aligning) {
1685
+ if (this.alignmentSource) {
1686
+ awaiting = 'point';
1687
+ }
1688
+ else if (this.canMatchAnotherTag()) {
1689
+ // Otherwise done at three, or sooner when there are no more tags to match: fewer pairs
1690
+ // still calibrate, only less completely.
1691
+ awaiting = 'tag';
1692
+ }
1693
+ }
1330
1694
  this.alignmentProgress$.next({
1331
1695
  pairs: this.alignmentPairs.length,
1332
- // Done at three, or sooner when there are no more tags to match: fewer pairs still calibrate,
1333
- // only less completely.
1334
- awaiting: this.alignmentPairs.length >= 3 || this.calibrationCandidates().length === 0 ? null : 'tag',
1696
+ awaiting,
1697
+ tagId: awaiting === 'point' ? this.alignmentSourceTagId : undefined,
1698
+ matched: this.getAlignmentPairs(),
1699
+ });
1700
+ }
1701
+ /**
1702
+ * Draws the calibration as it stands: what has been matched, and what is being matched.
1703
+ *
1704
+ * Redrawn whole on every change rather than patched. There are at most three pairs, and undoing
1705
+ * or removing one renumbers the others.
1706
+ */
1707
+ redrawCalibrationMarks(dropped) {
1708
+ this.clearCalibrationMarks();
1709
+ if (!this.aligning) {
1710
+ return;
1711
+ }
1712
+ const frame = this.tagGroup.parent ?? this.scene;
1713
+ if (this.calibrationGroup.parent !== frame) {
1714
+ frame.add(this.calibrationGroup);
1715
+ }
1716
+ this.tagGroup.updateMatrix();
1717
+ // Where a tag is drawn at the moment, in the frame the marks are drawn in.
1718
+ const drawnAt = (stored) => new THREE.Vector3(stored.x, stored.y, stored.z).applyMatrix4(this.tagGroup.matrix);
1719
+ this.alignmentPairs.forEach((pair, index) => {
1720
+ const target = new THREE.Vector3(pair.target.x, pair.target.y, pair.target.z);
1721
+ // From where the tag is to where it was said to belong: the correction, made visible.
1722
+ const link = this.createMeasureLine(drawnAt(pair.source), target, ThreeJsService.CALIBRATION_DONE_COLOR, 2);
1723
+ link.material.opacity = 0.75;
1724
+ // The same green as the pin it leads to; see createCalibrationMark.
1725
+ link.material.color.convertSRGBToLinear();
1726
+ link.material.toneMapped = false;
1727
+ // Behind the tags: it sets off from the middle of one, and should come out from under its
1728
+ // icon rather than run across it.
1729
+ link.renderOrder = 997;
1730
+ this.calibrationGroup.add(link);
1731
+ const pin = this.createCalibrationMark(this.createNumberedTexture(index + 1, ThreeJsService.CALIBRATION_DONE_COLOR), 1001);
1732
+ pin.position.copy(target);
1733
+ this.calibrationGroup.add(pin);
1734
+ this.setScreenSize(pin, ThreeJsService.CALIBRATION_PIN_PX);
1735
+ if (dropped === 'point' && index === this.alignmentPairs.length - 1) {
1736
+ this.pulse(pin);
1737
+ }
1738
+ // Its tag is spoken for; it stays in view to show what the pin refers to, but stands back.
1739
+ const matched = this.tagSprites.get(pair.tagId);
1740
+ if (matched) {
1741
+ matched.material.opacity = 0.4;
1742
+ }
1743
+ });
1744
+ if (this.alignmentSource) {
1745
+ const ring = this.createCalibrationMark(this.createRingTexture(ThreeJsService.MEASURE_COLOR), 998);
1746
+ ring.position.copy(drawnAt(this.alignmentSource));
1747
+ this.calibrationGroup.add(ring);
1748
+ this.setScreenSize(ring, ThreeJsService.TAG_SCREEN_PX * 1.6);
1749
+ if (dropped === 'tag') {
1750
+ this.pulse(ring);
1751
+ }
1752
+ }
1753
+ }
1754
+ /** Removes everything drawn for a calibration, and gives the tags it dimmed their look back. */
1755
+ clearCalibrationMarks() {
1756
+ [...this.calibrationGroup.children].forEach((child) => {
1757
+ this.calibrationGroup.remove(child);
1758
+ child.geometry?.dispose?.();
1759
+ child.material?.map?.dispose?.();
1760
+ child.material?.dispose?.();
1761
+ });
1762
+ this.tagSprites.forEach((sprite) => {
1763
+ sprite.material.opacity = 1;
1764
+ });
1765
+ }
1766
+ /**
1767
+ * A calibration mark: a fixed size on screen and showing through the model, as the tags do, and
1768
+ * drawn in the colours it was painted in.
1769
+ *
1770
+ * The renderer's tone mapping and output conversion are there for the model's lighting. Put
1771
+ * through them a mark comes out pale - the amber nearer to cream - and a mark that has to be
1772
+ * picked out against a photograph of a building is the last thing that should be.
1773
+ */
1774
+ createCalibrationMark(map, renderOrder) {
1775
+ // Says the canvas holds sRGB, which it does, so the output conversion gives it back unchanged.
1776
+ if ('colorSpace' in map) {
1777
+ map.colorSpace = 'srgb'; // THREE.SRGBColorSpace, r152+
1778
+ }
1779
+ else {
1780
+ map.encoding = 3001; // THREE.sRGBEncoding
1781
+ }
1782
+ const mark = new THREE.Sprite(new THREE.SpriteMaterial({
1783
+ map, depthTest: false, transparent: true, sizeAttenuation: false, toneMapped: false,
1784
+ }));
1785
+ mark.renderOrder = renderOrder;
1786
+ return mark;
1787
+ }
1788
+ /** Shows a mark arriving: it starts oversized and settles. */
1789
+ pulse(sprite) {
1790
+ this.pulses.push({ sprite, startedAt: performance.now() });
1791
+ }
1792
+ stepPulses() {
1793
+ if (this.pulses.length === 0) {
1794
+ return;
1795
+ }
1796
+ const now = performance.now();
1797
+ this.pulses = this.pulses.filter(({ sprite, startedAt }) => {
1798
+ const size = sprite.userData.screenSize;
1799
+ if (!sprite.parent || !size) {
1800
+ // Redrawn or cleared in the meantime.
1801
+ return false;
1802
+ }
1803
+ const progress = Math.min(1, (now - startedAt) / ThreeJsService.CONFIRM_PULSE_MS);
1804
+ this.setScreenSize(sprite, size[0], size[1]);
1805
+ // Eased out, so most of the settling happens while the eye is still on the click.
1806
+ sprite.scale.multiplyScalar(1 + 0.9 * (1 - progress) ** 2);
1807
+ return progress < 1;
1335
1808
  });
1336
1809
  }
1337
1810
  /**
@@ -1356,6 +1829,7 @@ export class ThreeJsService {
1356
1829
  if (this.renderer) {
1357
1830
  this.renderer.domElement.style.cursor = 'crosshair';
1358
1831
  }
1832
+ this.measuringChanged$.next(true);
1359
1833
  this.measurementProgress$.next({ points: 0, distances: [] });
1360
1834
  }
1361
1835
  /**
@@ -1376,8 +1850,10 @@ export class ThreeJsService {
1376
1850
  this.renderer.domElement.style.cursor = 'default';
1377
1851
  }
1378
1852
  if (wasMeasuring) {
1853
+ this.measuringChanged$.next(false);
1379
1854
  this.measurementProgress$.next(null);
1380
1855
  }
1856
+ this.measurementCleared$.next();
1381
1857
  }
1382
1858
  /**
1383
1859
  * Ends the measurement and returns it, or null when there are not yet two points to measure
@@ -1386,11 +1862,12 @@ export class ThreeJsService {
1386
1862
  * The drawing stays on the model so it is still visible while the person names the measurement;
1387
1863
  * cancelMeasuring() takes it away afterwards.
1388
1864
  */
1389
- finishMeasuring() {
1865
+ finishMeasuring(screenshot) {
1390
1866
  if (!this.measuring || this.measurePoints.length < 2) {
1391
1867
  return null;
1392
1868
  }
1393
1869
  this.measuring = false;
1870
+ this.measuringChanged$.next(false);
1394
1871
  this.pendingPreviewEvent = null;
1395
1872
  this.removePlacementPreview();
1396
1873
  this.updateMeasureRubberBand(null);
@@ -1398,10 +1875,32 @@ export class ThreeJsService {
1398
1875
  this.lastMeasurement = {
1399
1876
  points: this.measurePoints.map((point) => ({ x: point.x, y: point.y, z: point.z })),
1400
1877
  distances: this.measureDistances(),
1401
- screenshot: this.captureMeasurementScreenshot(),
1878
+ // From the viewer the model is drawn in, when it is not this scene: the splat viewer.
1879
+ screenshot: screenshot ?? this.captureMeasurementScreenshot(),
1402
1880
  };
1403
1881
  return this.lastMeasurement;
1404
1882
  }
1883
+ /**
1884
+ * Adds a point to the measurement under way from a spot another viewer picked on the model - the
1885
+ * splat viewer - in the model's own coordinates. Into the frame the measurement is kept in, the
1886
+ * tags', through the calibration, as placeTagAtModelPoint does. False when not measuring.
1887
+ */
1888
+ addMeasurePointAtModelPoint(point) {
1889
+ if (!this.measuring) {
1890
+ return false;
1891
+ }
1892
+ this.tagGroup.updateMatrix();
1893
+ this.addMeasurePoint(new THREE.Vector3(point.x, point.y, point.z).applyMatrix4(this.tagGroup.matrix.clone().invert()));
1894
+ return true;
1895
+ }
1896
+ /** The measurement's points, under way or finished, in the model's own coordinates: for a viewer drawing it elsewhere. */
1897
+ getMeasurePointsInModelFrame() {
1898
+ this.tagGroup.updateMatrix();
1899
+ return this.measurePoints.map((point) => {
1900
+ const { x, y, z } = point.clone().applyMatrix4(this.tagGroup.matrix);
1901
+ return { x, y, z };
1902
+ });
1903
+ }
1405
1904
  isMeasuring() {
1406
1905
  return this.measuring;
1407
1906
  }
@@ -1430,10 +1929,10 @@ export class ThreeJsService {
1430
1929
  // anything sized in metres would cover the very thing being measured.
1431
1930
  sizeAttenuation: false,
1432
1931
  }));
1433
- marker.scale.set(0.022, 0.022, 1);
1434
1932
  marker.position.copy(point);
1435
1933
  marker.renderOrder = 1001;
1436
1934
  this.measureGroup.add(marker);
1935
+ this.setScreenSize(marker, 12);
1437
1936
  if (previous) {
1438
1937
  this.measureGroup.add(this.createMeasureLine(previous, point));
1439
1938
  const distance = Math.round(previous.distanceTo(point) * 100) / 100;
@@ -1443,10 +1942,10 @@ export class ThreeJsService {
1443
1942
  transparent: true,
1444
1943
  sizeAttenuation: false,
1445
1944
  }));
1446
- label.scale.set(0.15, 0.05, 1);
1447
1945
  label.position.copy(previous).add(point).multiplyScalar(0.5);
1448
1946
  label.renderOrder = 1002;
1449
1947
  this.measureGroup.add(label);
1948
+ this.setScreenSize(label, 84, 28);
1450
1949
  }
1451
1950
  this.measurementProgress$.next({
1452
1951
  points: this.measurePoints.length,
@@ -1459,12 +1958,12 @@ export class ThreeJsService {
1459
1958
  * WebGL's own lines are one pixel wide whatever is asked for, which all but disappears over a
1460
1959
  * photographic texture. This kind is drawn as screen-facing geometry, so the width holds.
1461
1960
  */
1462
- createMeasureLine(from, to) {
1961
+ createMeasureLine(from, to, color = ThreeJsService.MEASURE_COLOR, width = 3) {
1463
1962
  const geometry = new LineGeometry();
1464
1963
  geometry.setPositions([from.x, from.y, from.z, to.x, to.y, to.z]);
1465
1964
  const material = new LineMaterial({
1466
- color: new THREE.Color(ThreeJsService.MEASURE_COLOR).getHex(),
1467
- linewidth: 3,
1965
+ color: new THREE.Color(color).getHex(),
1966
+ linewidth: width,
1468
1967
  depthTest: false,
1469
1968
  transparent: true,
1470
1969
  });
@@ -1480,7 +1979,7 @@ export class ThreeJsService {
1480
1979
  return;
1481
1980
  }
1482
1981
  const size = this.renderer.getSize(new THREE.Vector2());
1483
- this.measureGroup.children.forEach((child) => {
1982
+ [...this.measureGroup.children, ...this.calibrationGroup.children].forEach((child) => {
1484
1983
  if (child.material?.resolution) {
1485
1984
  child.material.resolution.set(size.x, size.y);
1486
1985
  }
@@ -1566,6 +2065,12 @@ export class ThreeJsService {
1566
2065
  });
1567
2066
  return canvas.toDataURL('image/jpeg', 0.85);
1568
2067
  }
2068
+ /**
2069
+ * True when tag placement is armed, false when it ends - placed or abandoned. For a viewer drawing
2070
+ * the model instead of this scene, the splat viewer, which picks the spot itself; see
2071
+ * placeTagAtModelPoint.
2072
+ */
2073
+ placementChanged$ = new Subject();
1569
2074
  /** Arms tag placement: the next click on the model drops a tag instead of being ignored. */
1570
2075
  startTagPlacement(poiType = null) {
1571
2076
  this.placingTag = true;
@@ -1574,9 +2079,40 @@ export class ThreeJsService {
1574
2079
  if (this.renderer) {
1575
2080
  this.renderer.domElement.style.cursor = 'crosshair';
1576
2081
  }
2082
+ this.placementChanged$.next(true);
2083
+ }
2084
+ /**
2085
+ * Places the armed tag at a spot another viewer picked on the model - the splat viewer - given
2086
+ * in the model's own coordinates, as a click on the model in this scene would. Into the frame tag
2087
+ * coordinates are stored in, through the calibration, as pickPlacementOnModel does.
2088
+ */
2089
+ placeTagAtModelPoint(point, normal = null) {
2090
+ if (!this.placingTag) {
2091
+ return null;
2092
+ }
2093
+ this.tagGroup.updateMatrix();
2094
+ const position = new THREE.Vector3(point.x, point.y, point.z).applyMatrix4(this.tagGroup.matrix.clone().invert());
2095
+ // Turned only: the calibration's scale changes no direction.
2096
+ const facing = normal
2097
+ ? new THREE.Vector3(normal.x, normal.y, normal.z).applyQuaternion(this.tagGroup.quaternion.clone().invert()).normalize()
2098
+ : new THREE.Vector3(0, 1, 0);
2099
+ const placement = {
2100
+ position: { x: position.x, y: position.y, z: position.z },
2101
+ normal: { x: facing.x, y: facing.y, z: facing.z },
2102
+ poiType: this.placementPoiType,
2103
+ };
2104
+ this.pendingTagPlacement = placement;
2105
+ this.placingTag = false;
2106
+ this.removePlacementPreview();
2107
+ this.placementChanged$.next(false);
2108
+ this.tagPlaced$.next(placement);
2109
+ return placement;
1577
2110
  }
1578
2111
  /** Leaves placement mode without placing anything. */
1579
2112
  cancelTagPlacement() {
2113
+ if (this.placingTag) {
2114
+ this.placementChanged$.next(false);
2115
+ }
1580
2116
  this.placingTag = false;
1581
2117
  this.pendingTagPlacement = null;
1582
2118
  this.pendingPreviewEvent = null;
@@ -1601,15 +2137,20 @@ export class ThreeJsService {
1601
2137
  }
1602
2138
  this.renderer.domElement.style.cursor = 'crosshair';
1603
2139
  if (!this.placementPreview) {
1604
- this.placementPreview = new THREE.Sprite(new THREE.SpriteMaterial({
1605
- map: this.createTagTexture('#9E9E9E'),
1606
- depthTest: false,
1607
- transparent: true,
1608
- opacity: 0.6,
1609
- }));
2140
+ // While calibrating, the ghost is the pin the click will leave, number and all: what is
2141
+ // under the pointer is what stays there.
2142
+ this.placementPreview = this.aligning
2143
+ ? this.createCalibrationMark(this.createNumberedTexture(this.alignmentPairs.length + 1, ThreeJsService.CALIBRATION_DONE_COLOR), 999)
2144
+ : new THREE.Sprite(new THREE.SpriteMaterial({
2145
+ map: this.createTagTexture('#9E9E9E'),
2146
+ depthTest: false,
2147
+ transparent: true,
2148
+ sizeAttenuation: false,
2149
+ }));
1610
2150
  this.placementPreview.renderOrder = 999;
2151
+ this.placementPreview.material.opacity = 0.6;
1611
2152
  this.tagGroup.add(this.placementPreview);
1612
- this.scaleTagForModel(this.placementPreview);
2153
+ this.setScreenSize(this.placementPreview, this.aligning ? ThreeJsService.CALIBRATION_PIN_PX : ThreeJsService.TAG_SCREEN_PX);
1613
2154
  }
1614
2155
  this.placementPreview.position.copy(position);
1615
2156
  this.updateMeasureRubberBand(position);
@@ -1716,6 +2257,16 @@ export class ThreeJsService {
1716
2257
  setVisibleTagTypes(types) {
1717
2258
  this.visibleTagTypes = types;
1718
2259
  this.tagSprites.forEach((sprite) => this.applyTagVisibility(sprite));
2260
+ this.announceTagsChanged();
2261
+ }
2262
+ /** Says whether the visit on screen is the site's only one; see soleVisit. */
2263
+ setSoleVisit(sole) {
2264
+ this.soleVisit = sole;
2265
+ this.tagSprites.forEach((sprite) => {
2266
+ this.parentTag(sprite);
2267
+ this.applyTagVisibility(sprite);
2268
+ });
2269
+ this.announceTagsChanged();
1719
2270
  }
1720
2271
  /** Says which capture is on screen, so the tags placed in it can be told from the rest. */
1721
2272
  setCurrentCapture(captureID) {
@@ -1724,6 +2275,7 @@ export class ThreeJsService {
1724
2275
  this.parentTag(sprite);
1725
2276
  this.applyTagVisibility(sprite);
1726
2277
  });
2278
+ this.announceTagsChanged();
1727
2279
  }
1728
2280
  /** Every tag registered in the scene, shown or not. */
1729
2281
  getTags() {
@@ -1799,8 +2351,8 @@ export class ThreeJsService {
1799
2351
  }
1800
2352
  /** Whether the tag was placed in the visit on screen. */
1801
2353
  isOwnedByVisit(sprite) {
1802
- return !!sprite.userData.originCaptureID
1803
- && sprite.userData.originCaptureID === this.currentCaptureID;
2354
+ const origin = sprite.userData.originCaptureID;
2355
+ return origin ? origin === this.currentCaptureID : this.soleVisit;
1804
2356
  }
1805
2357
  /**
1806
2358
  * A tag shows when its type is not filtered out and it belongs on this model.
@@ -1829,8 +2381,9 @@ export class ThreeJsService {
1829
2381
  if (sprite.userData.frame === 'model') {
1830
2382
  return false;
1831
2383
  }
1832
- // Calibrating is matching tags to where they belong, so they all have to be on offer.
1833
- if (this.aligning) {
2384
+ // Calibrating is matching tags to where they belong, so they all have to be on offer - from
2385
+ // the moment the panel opens, not only once the first click is being waited for.
2386
+ if (this.aligning || this.revealingCalibrationTags) {
1834
2387
  return true;
1835
2388
  }
1836
2389
  return this.isOnModel(sprite);
@@ -1968,6 +2521,9 @@ export class ThreeJsService {
1968
2521
  */
1969
2522
  goToTag(elementId) {
1970
2523
  const sprite = this.tagSprites.get(elementId);
2524
+ if (sprite) {
2525
+ this.tagFocused$.next(elementId);
2526
+ }
1971
2527
  if (!sprite || !this.camera) {
1972
2528
  return;
1973
2529
  }
@@ -2089,10 +2645,11 @@ export class ThreeJsService {
2089
2645
  this.tagGroup.rotation.set(rotation?.x ?? 0, rotation?.y ?? 0, rotation?.z ?? 0);
2090
2646
  this.tagGroup.scale.setScalar(scale ?? 1);
2091
2647
  this.tagGroup.updateMatrix();
2092
- // Tag size is derived from the world scale it inherits, which this call just changed - and so
2093
- // is which tags land on the model.
2094
- this.tagSprites.forEach((sprite) => this.scaleTagForModel(sprite));
2648
+ // Marker sizes are worked back from the scale they inherit, which this call just changed - and
2649
+ // so is which tags land on the model.
2650
+ this.refreshScreenSizes();
2095
2651
  this.refreshTagVisibility();
2652
+ this.announceTagsChanged();
2096
2653
  }
2097
2654
  /**
2098
2655
  * Adds a tag, or moves/restyles the one already registered for this element.
@@ -2109,22 +2666,29 @@ export class ThreeJsService {
2109
2666
  existing.userData.label = tag.label ?? existing.userData.label;
2110
2667
  existing.userData.originCaptureID = tag.originCaptureID ?? existing.userData.originCaptureID;
2111
2668
  existing.userData.frame = tag.frame ?? existing.userData.frame;
2669
+ existing.userData.iconUrl = tag.iconUrl ?? existing.userData.iconUrl;
2670
+ existing.userData.normal = tag.normal ?? existing.userData.normal;
2112
2671
  this.parentTag(existing);
2113
2672
  this.applyTagVisibility(existing);
2673
+ this.announceTagsChanged();
2114
2674
  return;
2115
2675
  }
2116
2676
  const sprite = new THREE.Sprite(new THREE.SpriteMaterial({
2117
2677
  map: this.createTagTexture(tag.color),
2118
2678
  // Tags read as UI rather than geometry, so they stay visible through the model instead of
2119
- // being occluded by whatever wall happens to be between them and the camera.
2679
+ // being occluded by whatever wall happens to be between them and the camera - and, for
2680
+ // the same reason, keep one size on screen rather than a size in the model.
2120
2681
  depthTest: false,
2121
2682
  transparent: true,
2683
+ sizeAttenuation: false,
2122
2684
  }));
2123
2685
  sprite.name = tag.id;
2124
2686
  sprite.userData.poiType = tag.poiType ?? null;
2125
2687
  sprite.userData.label = tag.label ?? null;
2126
2688
  sprite.userData.originCaptureID = tag.originCaptureID ?? null;
2127
2689
  sprite.userData.frame = tag.frame ?? null;
2690
+ sprite.userData.iconUrl = tag.iconUrl ?? null;
2691
+ sprite.userData.normal = tag.normal ?? null;
2128
2692
  sprite.position.set(tag.position.x, tag.position.y, tag.position.z);
2129
2693
  sprite.renderOrder = 999;
2130
2694
  this.parentTag(sprite);
@@ -2134,6 +2698,52 @@ export class ThreeJsService {
2134
2698
  if (tag.iconUrl) {
2135
2699
  this.applyTagIcon(sprite, tag.iconUrl);
2136
2700
  }
2701
+ this.announceTagsChanged();
2702
+ }
2703
+ /**
2704
+ * The tags another viewer should show, and the calibration they are drawn under.
2705
+ *
2706
+ * The same ones this scene would offer, short of the test against the model's surface, which needs
2707
+ * the model here: the type filter applies, and a tag placed in another model before it was
2708
+ * calibrated is left out, its coordinates meaning nothing in this one.
2709
+ */
2710
+ getTagSnapshot() {
2711
+ const tags = [];
2712
+ this.tagSprites.forEach((sprite) => {
2713
+ const owned = this.isOwnedByVisit(sprite);
2714
+ const typeAllowed = this.visibleTagTypes === null || this.visibleTagTypes.includes(sprite.userData.poiType);
2715
+ if (!typeAllowed || (sprite.userData.frame === 'model' && !owned)) {
2716
+ return;
2717
+ }
2718
+ tags.push({
2719
+ id: sprite.name,
2720
+ position: { x: sprite.position.x, y: sprite.position.y, z: sprite.position.z },
2721
+ label: sprite.userData.label ?? null,
2722
+ poiType: sprite.userData.poiType ?? null,
2723
+ iconUrl: sprite.userData.iconUrl ?? null,
2724
+ inModelFrame: sprite.userData.frame === 'model' && owned,
2725
+ normal: sprite.userData.normal ?? null,
2726
+ });
2727
+ });
2728
+ const group = this.tagGroup;
2729
+ return {
2730
+ tags,
2731
+ alignment: {
2732
+ translation: { x: group.position.x, y: group.position.y, z: group.position.z },
2733
+ rotation: { x: group.rotation.x, y: group.rotation.y, z: group.rotation.z },
2734
+ scale: group.scale.x,
2735
+ },
2736
+ };
2737
+ }
2738
+ announceTagsChanged() {
2739
+ if (this.tagsChangeQueued) {
2740
+ return;
2741
+ }
2742
+ this.tagsChangeQueued = true;
2743
+ queueMicrotask(() => {
2744
+ this.tagsChangeQueued = false;
2745
+ this.tagsChanged$.next();
2746
+ });
2137
2747
  }
2138
2748
  /** Removes the tag registered for an element, if there is one. */
2139
2749
  removeTag(elementId) {
@@ -2145,6 +2755,7 @@ export class ThreeJsService {
2145
2755
  sprite.material.map?.dispose();
2146
2756
  sprite.material.dispose();
2147
2757
  this.tagSprites.delete(elementId);
2758
+ this.announceTagsChanged();
2148
2759
  }
2149
2760
  /** Removes every tag from the scene. */
2150
2761
  clearTags() {
@@ -2174,18 +2785,78 @@ export class ThreeJsService {
2174
2785
  context.stroke();
2175
2786
  return new THREE.CanvasTexture(canvas);
2176
2787
  }
2788
+ /** The default marker with a number on it: the nth point of a calibration. */
2789
+ createNumberedTexture(number, color) {
2790
+ const texture = this.createTagTexture(color);
2791
+ const canvas = texture.image;
2792
+ const context = canvas.getContext('2d');
2793
+ context.fillStyle = '#FFFFFF';
2794
+ context.font = 'bold 76px sans-serif';
2795
+ context.textAlign = 'center';
2796
+ context.textBaseline = 'middle';
2797
+ context.fillText(String(number), canvas.width / 2, canvas.height / 2 + 5);
2798
+ return texture;
2799
+ }
2800
+ /** A ring with nothing in the middle, to go round a tag and leave it showing. */
2801
+ createRingTexture(color) {
2802
+ const size = 128;
2803
+ const canvas = document.createElement('canvas');
2804
+ canvas.width = size;
2805
+ canvas.height = size;
2806
+ const context = canvas.getContext('2d');
2807
+ // White under the colour, a little wider, for the same reason the tags have a white edge.
2808
+ context.beginPath();
2809
+ context.arc(size / 2, size / 2, size / 2 - 10, 0, Math.PI * 2);
2810
+ context.lineWidth = 16;
2811
+ context.strokeStyle = '#FFFFFF';
2812
+ context.stroke();
2813
+ context.lineWidth = 10;
2814
+ context.strokeStyle = color;
2815
+ context.stroke();
2816
+ return new THREE.CanvasTexture(canvas);
2817
+ }
2177
2818
  /**
2178
- * Sizes a tag relative to the model.
2819
+ * Gives a tag its size: the same number of pixels on screen whatever the model.
2179
2820
  *
2180
- * A sprite inherits the model's scale and the alignment's, so a fixed size would come out tiny on
2181
- * a large model and huge on a small one. Dividing by the group's world scale keeps tags the same
2182
- * size on screen whatever the model's units are.
2821
+ * It used to be a fixed fraction of the model instead. That reads fine on a room, but on a model
2822
+ * the size of a city block it is a tag several metres across, which fills the view as soon as
2823
+ * the camera moves in to look at anything.
2183
2824
  */
2184
2825
  scaleTagForModel(sprite) {
2185
- // Its own parent's scale: tags in the model's coordinates do not inherit the calibration's.
2186
- const worldScale = (sprite.parent ?? this.tagGroup).getWorldScale(new THREE.Vector3()).x || 1;
2187
- const size = 0.4 / worldScale;
2188
- sprite.scale.set(size, size, 1);
2826
+ this.setScreenSize(sprite, ThreeJsService.TAG_SCREEN_PX);
2827
+ }
2828
+ /**
2829
+ * Fixes a sprite's size on screen, in CSS pixels.
2830
+ *
2831
+ * The sprite must be drawn without size attenuation, which makes its size a proportion of the
2832
+ * viewport instead of something that shrinks with distance. Its scale is then worked back from
2833
+ * the pixels wanted, the viewport's height and the scale it inherits from its parents - the
2834
+ * model's normalisation and, for tags, the calibration - so none of those show in the result.
2835
+ * The size asked for is kept on the sprite, so it can be worked out again when any of them changes.
2836
+ */
2837
+ setScreenSize(sprite, widthPx, heightPx = widthPx) {
2838
+ sprite.userData.screenSize = [widthPx, heightPx];
2839
+ const inherited = (sprite.parent ?? this.tagGroup).getWorldScale(new THREE.Vector3()).x || 1;
2840
+ const perPixel = this.worldUnitsPerPixel() / inherited;
2841
+ sprite.scale.set(widthPx * perPixel, heightPx * perPixel, 1);
2842
+ }
2843
+ /** What one screen pixel is worth in the scale of a sprite drawn without size attenuation. */
2844
+ worldUnitsPerPixel() {
2845
+ const height = this.renderer?.getSize?.(new THREE.Vector2()).y || 800;
2846
+ const fieldOfView = THREE.MathUtils.degToRad(this.camera?.fov ?? 75);
2847
+ return (2 * Math.tan(fieldOfView / 2)) / height;
2848
+ }
2849
+ /** Re-applies every marker's on-screen size: the viewport, the model or the calibration changed. */
2850
+ refreshScreenSizes() {
2851
+ const resize = (object) => {
2852
+ if (object?.userData?.screenSize) {
2853
+ this.setScreenSize(object, object.userData.screenSize[0], object.userData.screenSize[1]);
2854
+ }
2855
+ };
2856
+ this.tagSprites.forEach(resize);
2857
+ this.measureGroup.children.forEach(resize);
2858
+ this.calibrationGroup.children.forEach(resize);
2859
+ resize(this.placementPreview);
2189
2860
  }
2190
2861
  /**
2191
2862
  * Adds secondary interactive objects (e.g., POIs, sensors) to the scene.
@@ -2299,6 +2970,7 @@ export class ThreeJsService {
2299
2970
  this.placingTag = false;
2300
2971
  this.removePlacementPreview();
2301
2972
  this.renderer.domElement.style.cursor = 'default';
2973
+ this.placementChanged$.next(false);
2302
2974
  this.tagPlaced$.next(placement);
2303
2975
  }
2304
2976
  return;
@@ -2326,12 +2998,19 @@ export class ThreeJsService {
2326
2998
  }
2327
2999
  }
2328
3000
  /**
2329
- * Escape cancels whatever the pointer is currently committed to.
3001
+ * Escape cancels whatever the pointer is currently committed to. While calibrating, the undo keys
3002
+ * take back one step of it instead of all of it.
2330
3003
  *
2331
3004
  * Emits through the same subjects the explicit Cancel buttons use, so the UI driving them follows
2332
3005
  * along instead of being left showing a mode that is no longer armed.
2333
3006
  */
2334
3007
  onKeyDown = (event) => {
3008
+ if (this.aligning && this.isUndoKey(event)) {
3009
+ if (this.undoAlignmentStep()) {
3010
+ event.preventDefault();
3011
+ }
3012
+ return;
3013
+ }
2335
3014
  if (event.key !== 'Escape') {
2336
3015
  return;
2337
3016
  }
@@ -2348,9 +3027,22 @@ export class ThreeJsService {
2348
3027
  this.cancelTagAlignment();
2349
3028
  }
2350
3029
  };
3030
+ /**
3031
+ * Ctrl+Z (Cmd+Z on a Mac) or Backspace, unless typed into a field - where they mean something
3032
+ * else, to whatever the field is.
3033
+ */
3034
+ isUndoKey(event) {
3035
+ const target = event.target;
3036
+ if (target?.isContentEditable || ['INPUT', 'TEXTAREA'].includes(target?.tagName ?? '')) {
3037
+ return false;
3038
+ }
3039
+ return event.key === 'Backspace'
3040
+ || ((event.ctrlKey || event.metaKey) && !event.shiftKey && event.key.toLowerCase() === 'z');
3041
+ }
2351
3042
  animate = () => {
2352
3043
  this.animationFrameId = requestAnimationFrame(this.animate);
2353
3044
  this.stepCameraTween();
3045
+ this.stepPulses();
2354
3046
  this.controls.update();
2355
3047
  // One pick per frame, against the pointer's latest position - see onMouseMove.
2356
3048
  if (this.pendingPreviewEvent) {
@@ -2360,11 +3052,84 @@ export class ThreeJsService {
2360
3052
  }
2361
3053
  this.renderer.render(this.scene, this.camera);
2362
3054
  };
2363
- destroy() {
3055
+ /**
3056
+ * Stops drawing the scene, or starts again. For while another viewer covers it - the splat viewer
3057
+ * - where it would otherwise go on drawing, unseen, every frame, on the graphics card the other
3058
+ * viewer needs. The scene keeps its tags and calibration all the same.
3059
+ */
3060
+ setRenderingPaused(paused) {
3061
+ if (paused) {
3062
+ this.stopRendering();
3063
+ }
3064
+ else if (this.live && !this.animationFrameId) {
3065
+ this.ngZone.runOutsideAngular(() => this.animate());
3066
+ }
3067
+ }
3068
+ /** Stops the render loop, if one is running. */
3069
+ stopRendering() {
2364
3070
  if (this.animationFrameId) {
2365
3071
  cancelAnimationFrame(this.animationFrameId);
3072
+ this.animationFrameId = 0;
3073
+ }
3074
+ }
3075
+ /**
3076
+ * Takes the model out of the scene and frees what it holds on the graphics card.
3077
+ *
3078
+ * The tags are kept. They hang from the model's group so as to share its frame, and are moved out
3079
+ * of it first: they belong to the visit, not to the file that was drawn under them.
3080
+ */
3081
+ removeModel() {
3082
+ const group = this.modelGroup;
3083
+ const model = this.modelRoot;
3084
+ this.modelGroup = undefined;
3085
+ this.modelRoot = undefined;
3086
+ this.surfaceCells = null;
3087
+ this.modelWorldRadius = 0;
3088
+ [this.tagGroup, this.modelTagGroup, this.calibrationGroup].forEach((kept) => kept.parent?.remove(kept));
3089
+ group?.parent?.remove(group);
3090
+ if (model) {
3091
+ this.disposeModel(model);
2366
3092
  }
3093
+ }
3094
+ /**
3095
+ * Frees a model's geometry, materials and textures.
3096
+ *
3097
+ * Dropping the last reference to a model does not do this. What it uploaded stays on the graphics
3098
+ * card until the page is closed - hundreds of megabytes for a captured building - and on a
3099
+ * machine whose graphics memory is shared with the rest of the system, everything slows down
3100
+ * long before anything fails.
3101
+ */
3102
+ disposeModel(model) {
3103
+ const freed = new Set();
3104
+ const free = (resource) => {
3105
+ if (resource && typeof resource.dispose === 'function' && !freed.has(resource)) {
3106
+ freed.add(resource);
3107
+ resource.dispose();
3108
+ }
3109
+ };
3110
+ model.traverse((child) => {
3111
+ free(child.geometry);
3112
+ const materials = Array.isArray(child.material) ? child.material : [child.material];
3113
+ materials.forEach((material) => {
3114
+ if (!material) {
3115
+ return;
3116
+ }
3117
+ // Whichever slots this kind of material has: map, normalMap, emissiveMap...
3118
+ Object.values(material).forEach((value) => {
3119
+ if (value?.isTexture) {
3120
+ free(value);
3121
+ }
3122
+ });
3123
+ free(material);
3124
+ });
3125
+ });
3126
+ }
3127
+ destroy() {
3128
+ this.live = false;
3129
+ this.stopRendering();
2367
3130
  window.removeEventListener('keydown', this.onKeyDown);
3131
+ this.canvasListeners.forEach((remove) => remove());
3132
+ this.canvasListeners = [];
2368
3133
  if (this.canvasResizeObserver) {
2369
3134
  this.canvasResizeObserver.disconnect();
2370
3135
  this.canvasResizeObserver = undefined;
@@ -2373,6 +3138,13 @@ export class ThreeJsService {
2373
3138
  this.clearTags();
2374
3139
  this.measuring = false;
2375
3140
  this.clearMeasurement();
3141
+ this.clearCalibrationMarks();
3142
+ this.pulses = [];
3143
+ // While the renderer is still there to hand the memory back through.
3144
+ this.removeModel();
3145
+ // They were in the scene that is going. Kept, the next scene would go on testing every pointer
3146
+ // move against objects nobody can see, and would skip loading them again as "already there".
3147
+ this.clickableObjects = [];
2376
3148
  if (this.renderer) {
2377
3149
  this.renderer.dispose();
2378
3150
  }
@@ -2389,4 +3161,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
2389
3161
  providedIn: 'root'
2390
3162
  }]
2391
3163
  }], ctorParameters: () => [{ type: i0.NgZone }] });
2392
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhyZWVqcy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWNvcmUvc3JjL2xpYi9zZXJ2aWNlcy90aHJlZWpzLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEtBQUssS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMvQixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDMUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUNqRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDbkUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtREFBbUQsQ0FBQztBQUNuRixPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDdkQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUNyRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDOztBQW1GL0I7Ozs7OztHQU1HO0FBQ0gsU0FBUyxlQUFlLENBQUMsQ0FBZ0IsRUFBRSxDQUFnQixFQUFFLENBQWdCO0lBQzNFLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDNUIsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFLEdBQUcsS0FBSyxFQUFFLENBQUM7UUFDMUIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lB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QUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNsQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBVSxFQUFFLEVBQUU7WUFDN0IsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxRQUFRLENBQUM7WUFDdEUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUNkLE9BQU87WUFDVCxDQUFDO1lBQ0QsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7WUFDbkMsTUFBTSxLQUFLLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDekQsS0FBSyxJQUFJLFFBQVEsR0FBRyxDQUFDLEVBQUUsUUFBUSxHQUFHLEtBQUssRUFBRSxRQUFRLElBQUksTUFBTSxFQUFFLENBQUM7Z0JBQzVELE1BQU0sTUFBTSxHQUFHLFFBQVEsR0FBRyxDQUFDLENBQUM7Z0JBQzVCLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUNyRyxDQUFDLENBQUMsbUJBQW1CLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUM3RyxDQUFDLENBQUMsbUJBQW1CLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEdB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SyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3hCLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2xCLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDMUIsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2xCLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDMUIsQ0FBQztJQUNILENBQUM7d0dBNStFVSxjQUFjOzRHQUFkLGNBQWMsY0FGYixNQUFNOzs0RkFFUCxjQUFjO2tCQUgxQixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIE5nWm9uZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgKiBhcyBUSFJFRSBmcm9tICd0aHJlZSc7XHJcbmltcG9ydCB7IE9yYml0Q29udHJvbHMgfSBmcm9tICd0aHJlZS9leGFtcGxlcy9qc20vY29udHJvbHMvT3JiaXRDb250cm9scyc7XHJcbmltcG9ydCB7IE9CSkxvYWRlciB9IGZyb20gJ3RocmVlL2V4YW1wbGVzL2pzbS9sb2FkZXJzL09CSkxvYWRlcic7XHJcbmltcG9ydCB7IE1UTExvYWRlciB9IGZyb20gJ3RocmVlL2V4YW1wbGVzL2pzbS9sb2FkZXJzL01UTExvYWRlcic7XHJcbmltcG9ydCB7IEdMVEZMb2FkZXIgfSBmcm9tICd0aHJlZS9leGFtcGxlcy9qc20vbG9hZGVycy9HTFRGTG9hZGVyJztcclxuaW1wb3J0IHsgS1RYMkxvYWRlciB9IGZyb20gJ3RocmVlL2V4YW1wbGVzL2pzbS9sb2FkZXJzL0tUWDJMb2FkZXInO1xyXG5pbXBvcnQgeyBNZXNob3B0RGVjb2RlciB9IGZyb20gJ3RocmVlL2V4YW1wbGVzL2pzbS9saWJzL21lc2hvcHRfZGVjb2Rlci5tb2R1bGUuanMnO1xyXG5pbXBvcnQgeyBMaW5lMiB9IGZyb20gJ3RocmVlL2V4YW1wbGVzL2pzbS9saW5lcy9MaW5lMic7XHJcbmltcG9ydCB7IExpbmVHZW9tZXRyeSB9IGZyb20gJ3RocmVlL2V4YW1wbGVzL2pzbS9saW5lcy9MaW5lR2VvbWV0cnknO1xyXG5pbXBvcnQgeyBMaW5lTWF0ZXJpYWwgfSBmcm9tICd0aHJlZS9leGFtcGxlcy9qc20vbGluZXMvTGluZU1hdGVyaWFsJztcclxuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBUaHJlZUpzQWxpZ25tZW50LCBUaHJlZUpzTW9kZWxVcCB9IGZyb20gJy4uL2hlbHBlcnMuc2VydmljZSc7XHJcbmltcG9ydCB7IFBvaVR5cGUgfSBmcm9tICcuLi90eXBlcy5zZXJ2aWNlJztcclxuXHJcbi8qKlxyXG4gKiBBIHRhZyB0byBkcmF3IGluIHRoZSBUaHJlZS5qcyBzY2VuZSwgbWlycm9yaW5nIGEgTWF0dGVydGFnLlxyXG4gKlxyXG4gKiBQb3NpdGlvbnMgYXJlIGluIHRoZSBtb2RlbCdzIG93biBjb29yZGluYXRlIHNwYWNlIC0gdGhlIHNhbWUgbnVtYmVycyBzdG9yZWQgaW4gUE9JLmNvb3JkaW5hdGUgLVxyXG4gKiBub3Qgc2NlbmUgc3BhY2UuIFRoZSBzZXJ2aWNlIHJlcGFyZW50cyB0YWdzIHVuZGVyIHRoZSBtb2RlbCBzbyB0aGV5IGluaGVyaXQgdGhlIGNlbnRlcmluZyBhbmRcclxuICogc2NhbGluZyBhcHBsaWVkIGF0IGxvYWQsIHdoaWNoIG1lYW5zIGNhbGxlcnMgbmV2ZXIgZGVhbCB3aXRoIHRoYXQgdHJhbnNmb3JtLlxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBUaHJlZUpzVGFnIHtcclxuICAvKiogVGhlIHRhZ2dlZCBlbGVtZW50J3MgaWQgKFBPSS5lbGVtZW50SUQpLCB1c2VkIHRvIHVwZGF0ZSBvciByZW1vdmUgdGhlIHRhZyBsYXRlci4gKi9cclxuICBpZDogc3RyaW5nO1xyXG4gIHBvc2l0aW9uOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB6OiBudW1iZXIgfTtcclxuICAvKiogRHJpdmVzIGJvdGggdGhlIGNsaWNrIHJvdXRlIGFuZCB0eXBlIGZpbHRlcmluZywgc28gaXQgdHJhdmVscyB3aXRoIHRoZSB0YWcuICovXHJcbiAgcG9pVHlwZT86IFBvaVR5cGUgfCBudWxsO1xyXG4gIC8qKiBTaG93biBvbiBob3Zlci4gQSBtYXJrZXIgd2l0aCBubyBpZGVudGl0eSBpcyBqdXN0IGEgZG90IG9uIGEgd2FsbC4gKi9cclxuICBsYWJlbD86IHN0cmluZyB8IG51bGw7XHJcbiAgLyoqIFRoZSBUaHJlZS5qcyBjYXB0dXJlIHRoaXMgdGFnIHdhcyBwbGFjZWQgaW4sIHdoZW4gaXQgd2FzIHBsYWNlZCBpbiBvbmUuICovXHJcbiAgb3JpZ2luQ2FwdHVyZUlEPzogc3RyaW5nIHwgbnVsbDtcclxuICAvKipcclxuICAgKiAnbW9kZWwnIHdoZW4gdGhlIHBvc2l0aW9uIGlzIGluIHRoZSBtb2RlbCdzIG93biBjb29yZGluYXRlcyByYXRoZXIgdGhhbiB0aGUgc3BhY2UgdGFncyBzaGFyZTpcclxuICAgKiBhIHRhZyBwbGFjZWQgaW4gYSBtb2RlbCBiZWZvcmUgaXQgd2FzIGNhbGlicmF0ZWQuIE9ubHkgbWVhbmluZ2Z1bCBpbiB0aGUgbW9kZWwgaXQgd2FzIHBsYWNlZCBpbi5cclxuICAgKi9cclxuICBmcmFtZT86ICdtb2RlbCcgfCBudWxsO1xyXG4gIC8qKiBJY29uIGRyYXduIG9uIHRoZSB0YWcuIEZhbGxzIGJhY2sgdG8gYSBwbGFpbiBkaXNjIHdoZW4gYWJzZW50IG9yIGl0IGZhaWxzIHRvIGxvYWQuICovXHJcbiAgaWNvblVybD86IHN0cmluZyB8IG51bGw7XHJcbiAgLyoqIFRpbnQgZm9yIHRoZSBmYWxsYmFjayBkaXNjLCBhcyBhIENTUyBjb2xvdXIuICovXHJcbiAgY29sb3I/OiBzdHJpbmc7XHJcbn1cclxuXHJcbi8qKiBXaGF0IGEgY2xpY2sgb24gYSB0YWcgcmVwb3J0czogZW5vdWdoIHRvIHJvdXRlIHRvIHRoZSBlbGVtZW50J3MgZGV0YWlsIHBhZ2UuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgVGhyZWVKc1RhZ0NsaWNrIHtcclxuICBlbGVtZW50SWQ6IHN0cmluZztcclxuICBwb2lUeXBlOiBQb2lUeXBlIHwgbnVsbDtcclxufVxyXG5cclxuLyoqXHJcbiAqIEEgc3BvdCBwaWNrZWQgb24gdGhlIG1vZGVsIGZvciBhIG5ldyB0YWcuXHJcbiAqXHJcbiAqIEJvdGggdmVjdG9ycyBhcmUgaW4gdGhlIG1vZGVsJ3Mgb3duIGNvb3JkaW5hdGUgc3BhY2UsIHdoaWNoIGlzIHdoYXQgUE9JLmNvb3JkaW5hdGUgc3RvcmVzLiBTY2VuZVxyXG4gKiBjb29yZGluYXRlcyBkZWxpYmVyYXRlbHkgbmV2ZXIgbGVhdmUgdGhpcyBzZXJ2aWNlOiB0aGUgbW9kZWwgaXMgc2NhbGVkIHRvIGEgZml4ZWQgc2l6ZSBvbiBsb2FkLCBzb1xyXG4gKiBhIHNjZW5lLXNwYWNlIHBvc2l0aW9uIHdvdWxkIHNpbGVudGx5IG1lYW4gc29tZXdoZXJlIGVsc2UgdGhlIG1vbWVudCB0aGUgLmdsYiBpcyByZS1leHBvcnRlZC5cclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgVGhyZWVKc1RhZ1BsYWNlbWVudCB7XHJcbiAgcG9zaXRpb246IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHo6IG51bWJlciB9O1xyXG4gIC8qKiBTdXJmYWNlIG5vcm1hbCBhdCB0aGUgcGlja2VkIHBvaW50IC0gTWF0dGVycG9ydCBzdG9yZXMgdGhlIHNhbWUgdGhpbmcgaW4gUE9JLm1ldGFkYXRhLiAqL1xyXG4gIG5vcm1hbDogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgejogbnVtYmVyIH07XHJcbiAgLyoqIFdoYXQgdGhlIHBsYWNlbWVudCB3YXMgYXJtZWQgZm9yLCBzbyB0aGUgY2FsbGVyIGtub3dzIHdoaWNoIGNyZWF0aW9uIGZvcm0gdG8gb3Blbi4gKi9cclxuICBwb2lUeXBlPzogUG9pVHlwZSB8IG51bGw7XHJcbn1cclxuXHJcbi8qKiBPbmUgdGFnIHNlZW4gaW4gYm90aCBzcGFjZXM6IHdoZXJlIGl0IGlzIHN0b3JlZCwgYW5kIHdoZXJlIGl0IHJlYWxseSBzaXRzIG9uIHRoZSBtb2RlbC4gKi9cclxuLyoqIEEgZGlzdGFuY2UgbWVhc3VyZWQgb24gdGhlIG1vZGVsOiBpdHMgcG9pbnRzLCBlYWNoIHNlZ21lbnQncyBsZW5ndGgsIGFuZCBhIHBpY3R1cmUgb2YgaXQuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgVGhyZWVKc01lYXN1cmVtZW50IHtcclxuICAvKiogSW4gdGhlIGZyYW1lIHRhZyBjb29yZGluYXRlcyBhcmUgc3RvcmVkIGluLCBzbyB0aGUgbGFzdCBvbmUgY2FuIGJlIHNhdmVkIGFzIHRoZSBQT0kuICovXHJcbiAgcG9pbnRzOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB6OiBudW1iZXIgfVtdO1xyXG4gIC8qKiBNZXRyZXMgYmV0d2VlbiBjb25zZWN1dGl2ZSBwb2ludHMsIHJvdW5kZWQgbGlrZSBNYXR0ZXJwb3J0J3MgbWVhc3VyZW1lbnRzIGFyZS4gKi9cclxuICBkaXN0YW5jZXM6IG51bWJlcltdO1xyXG4gIC8qKiBKUEVHIGRhdGEgVVJJIG9mIHRoZSBzY2VuZSB3aXRoIHRoZSBtZWFzdXJlbWVudCBkcmF3biBvbiBpdC4gKi9cclxuICBzY3JlZW5zaG90OiBzdHJpbmc7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBIHRhZyBwbGFjZWQgaW4gdGhpcyBtb2RlbCB3aG9zZSBzdG9yZWQgY29vcmRpbmF0ZXMgaGFkIHRvIGNoYW5nZSBmb3IgaXQgdG8gc3RheSB3aGVyZSBpdCBpcyxcclxuICogYmVjYXVzZSB0aGUgY2FsaWJyYXRpb24gaXQgaXMgZHJhd24gdW5kZXIgY2hhbmdlZC5cclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgVGhyZWVKc1JlYmFzZWRUYWcge1xyXG4gIGlkOiBzdHJpbmc7XHJcbiAgLyoqIEl0cyBjb29yZGluYXRlcyBpbiB0aGUgc3BhY2UgdGFncyBzaGFyZSwgdW5kZXIgdGhlIG5ldyBjYWxpYnJhdGlvbi4gKi9cclxuICBwb3NpdGlvbjogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgejogbnVtYmVyIH07XHJcbiAgLyoqIFR1cm5zIGEgZGlyZWN0aW9uIHN0b3JlZCB3aXRoIHRoZSB0YWcgLSBpdHMgc3VyZmFjZSBub3JtYWwgLSB0aGUgc2FtZSB3YXkuICovXHJcbiAgcm90YXRlRGlyZWN0aW9uOiAoZGlyZWN0aW9uOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB6OiBudW1iZXIgfSkgPT4geyB4OiBudW1iZXI7IHk6IG51bWJlcjsgejogbnVtYmVyIH07XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgVGhyZWVKc0FsaWdubWVudFBhaXIge1xyXG4gIC8qKiBUaGUgdGFnIHRoZSBwYWlyIHdhcyBtYWRlIGZyb20sIHdoZW4gaXQgY2FtZSBmcm9tIG9uZS4gKi9cclxuICB0YWdJZD86IHN0cmluZztcclxuICBzb3VyY2U6IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHo6IG51bWJlciB9O1xyXG4gIHRhcmdldDogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgejogbnVtYmVyIH07XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBCdWlsZHMgYW4gb3J0aG9ub3JtYWwgZnJhbWUgZnJvbSB0aHJlZSBwb2ludHMsIG9yIG51bGwgd2hlbiB0aGV5IGFyZSAobmVhcmx5KSBjb2xsaW5lYXIuXHJcbiAqXHJcbiAqIFRocmVlIHBvaW50cyBkZWZpbmUgYSBwbGFuZSwgYW5kIGEgcGxhbmUgcGx1cyBhbiBvcmlnaW4gZGVmaW5lcyBhbiBvcmllbnRhdGlvbi4gQ29sbGluZWFyIHBvaW50c1xyXG4gKiBkbyBub3Q6IHRoZXkgbGVhdmUgdGhlIHJvdGF0aW9uIGFib3V0IHRoZWlyIGNvbW1vbiBsaW5lIHVuZGV0ZXJtaW5lZCwgd2hpY2ggaXMgd2h5IHRoZSBjYWxsZXIgaGFzXHJcbiAqIHRvIHJlamVjdCB0aGVtIHJhdGhlciB0aGFuIHByb2R1Y2UgYSBjb25maWRlbnQgd3JvbmcgYW5zd2VyLlxyXG4gKi9cclxuZnVuY3Rpb24gZnJhbWVGcm9tUG9pbnRzKGE6IFRIUkVFLlZlY3RvcjMsIGI6IFRIUkVFLlZlY3RvcjMsIGM6IFRIUkVFLlZlY3RvcjMpOiBUSFJFRS5NYXRyaXg0IHwgbnVsbCB7XHJcbiAgY29uc3QgZTEgPSBiLmNsb25lKCkuc3ViKGEpO1xyXG4gIGlmIChlMS5sZW5ndGhTcSgpIDwgMWUtMTIpIHtcclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuICBlMS5ub3JtYWxpemUoKTtcclxuXHJcbiAgY29uc3QgdG9DID0gYy5jbG9uZSgpLnN1YihhKTtcclxuICBjb25zdCBlMiA9IHRvQy5jbG9uZSgpLnN1YihlMS5jbG9uZSgpLm11bHRpcGx5U2NhbGFyKHRvQy5kb3QoZTEpKSk7XHJcbiAgaWYgKGUyLmxlbmd0aFNxKCkgPCAxZS0xMikge1xyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG4gIGUyLm5vcm1hbGl6ZSgpO1xyXG5cclxuICByZXR1cm4gbmV3IFRIUkVFLk1hdHJpeDQoKS5tYWtlQmFzaXMoZTEsIGUyLCBlMS5jbG9uZSgpLmNyb3NzKGUyKSk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBTb2x2ZXMgdGhlIHRyYW5zZm9ybSB0aGF0IG1hcHMgc3RvcmVkIHRhZyBjb29yZGluYXRlcyBvbnRvIHRoZSBsb2FkZWQgbW9kZWwsIGZyb20gYXMgbWFueSBtYXRjaGVkXHJcbiAqIHRhZ3MgYXMgdGhlcmUgYXJlIC0gdXAgdG8gdGhyZWUuXHJcbiAqXHJcbiAqIFRocmVlIHBhaXJzIHBpbiBkb3duIGV2ZXJ5dGhpbmc6IHBvc2l0aW9uLCBvcmllbnRhdGlvbiBhbmQgc2NhbGUuIEEgbW9kZWwgdGhhdCBzaGFyZXMgb25seSBhXHJcbiAqIGNvcm5lciB3aXRoIHRoZSB0YWdzJyBzcGFjZSBtYXkgbm90IGhhdmUgdGhyZWUgdGFncyB0byBvZmZlciwgc28gZmV3ZXIgYXJlIGFjY2VwdGVkLCBlYWNoXHJcbiAqIHNldHRsaW5nIHdoYXQgaXQgY2FuIGFuZCBhc3N1bWluZyB0aGUgcmVzdDpcclxuICpcclxuICogIC0gVHdvIHBhaXJzOiBwb3NpdGlvbiwgaGVhZGluZyBhbmQgc2NhbGUuIFRoZSBvbmUgdGhpbmcgdHdvIHBvaW50cyBjYW5ub3Qgc2F5IGlzIGhvdyB0aGUgbW9kZWxcclxuICogICAgaXMgdGlsdGVkLCBzbyBib3RoIHNwYWNlcyBhcmUgdGFrZW4gdG8gYWdyZWUgb24gd2hpY2ggd2F5IGlzIHVwLlxyXG4gKiAgLSBPbmUgcGFpcjogcG9zaXRpb24gb25seS4gSGVhZGluZyBhbmQgc2NhbGUgYXJlIHRha2VuIHRvIG1hdGNoIGFscmVhZHkuXHJcbiAqXHJcbiAqIGB0YXJnZXRVcGAgaXMgdGhlIG1vZGVsJ3MgdmVydGljYWwgYXhpcywgd2hpY2ggdGhlIHRhZ3MnIG93biB2ZXJ0aWNhbCAoK1kpIGlzIG1hdGNoZWQgdG8gaW4gdGhvc2VcclxuICogdHdvIGNhc2VzLiBSZXR1cm5zIG51bGwgd2hlbiB0aGUgcG9pbnRzIGNhbm5vdCBhbnN3ZXIgdGhlIHF1ZXN0aW9uIGFza2VkIG9mIHRoZW0gLSBjb2xsaW5lYXIgZm9yXHJcbiAqIHRocmVlLCBvbmUgYWJvdmUgdGhlIG90aGVyIGZvciB0d28gLSBiZWNhdXNlIGEgd3JvbmcgY2FsaWJyYXRpb24gYXBwbGllZCBzaWxlbnRseSBpcyB3b3JzZSB0aGFuXHJcbiAqIG5vbmUuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gc29sdmVUaHJlZUpzQWxpZ25tZW50KFxyXG4gIHBhaXJzOiBUaHJlZUpzQWxpZ25tZW50UGFpcltdLFxyXG4gIHRhcmdldFVwOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB6OiBudW1iZXIgfSA9IHsgeDogMCwgeTogMSwgejogMCB9LFxyXG4pOiBUaHJlZUpzQWxpZ25tZW50IHwgbnVsbCB7XHJcbiAgaWYgKCFwYWlycyB8fCBwYWlycy5sZW5ndGggPT09IDApIHtcclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuICBpZiAocGFpcnMubGVuZ3RoIDwgMykge1xyXG4gICAgcmV0dXJuIHNvbHZlUmVkdWNlZEFsaWdubWVudChwYWlycywgbmV3IFRIUkVFLlZlY3RvcjModGFyZ2V0VXAueCwgdGFyZ2V0VXAueSwgdGFyZ2V0VXAueikubm9ybWFsaXplKCkpO1xyXG4gIH1cclxuXHJcbiAgY29uc3Qgc291cmNlcyA9IHBhaXJzLnNsaWNlKDAsIDMpLm1hcCgocGFpcikgPT4gbmV3IFRIUkVFLlZlY3RvcjMocGFpci5zb3VyY2UueCwgcGFpci5zb3VyY2UueSwgcGFpci5zb3VyY2UueikpO1xyXG4gIGNvbnN0IHRhcmdldHMgPSBwYWlycy5zbGljZSgwLCAzKS5tYXAoKHBhaXIpID0+IG5ldyBUSFJFRS5WZWN0b3IzKHBhaXIudGFyZ2V0LngsIHBhaXIudGFyZ2V0LnksIHBhaXIudGFyZ2V0LnopKTtcclxuXHJcbiAgY29uc3Qgc291cmNlRnJhbWUgPSBmcmFtZUZyb21Qb2ludHMoc291cmNlc1swXSwgc291cmNlc1sxXSwgc291cmNlc1syXSk7XHJcbiAgY29uc3QgdGFyZ2V0RnJhbWUgPSBmcmFtZUZyb21Qb2ludHModGFyZ2V0c1swXSwgdGFyZ2V0c1sxXSwgdGFyZ2V0c1syXSk7XHJcbiAgaWYgKCFzb3VyY2VGcmFtZSB8fCAhdGFyZ2V0RnJhbWUpIHtcclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgLy8gQSByb3RhdGlvbidzIGludmVyc2UgaXMgaXRzIHRyYW5zcG9zZSwgc28gdGhpcyBpcyB0aGUgcm90YXRpb24gY2Fycnlpbmcgb25lIGZyYW1lIG9udG8gdGhlIG90aGVyLlxyXG4gIGNvbnN0IHJvdGF0aW9uID0gdGFyZ2V0RnJhbWUubXVsdGlwbHkoc291cmNlRnJhbWUuY2xvbmUoKS50cmFuc3Bvc2UoKSk7XHJcblxyXG4gIC8vIFNjYWxlIGZyb20gaG93IGZhciBhcGFydCB0aGUgcG9pbnRzIGFyZSBpbiBlYWNoIHNwYWNlLCBhdmVyYWdlZCBvdmVyIHRoZSB0aHJlZSBlZGdlcyBzbyBhIHNpbmdsZVxyXG4gIC8vIHNsb3BweSBjbGljayBkb2VzIG5vdCBzZXQgaXQgb24gaXRzIG93bi5cclxuICBjb25zdCBlZGdlcyA9IFtbMCwgMV0sIFsxLCAyXSwgWzAsIDJdXTtcclxuICBsZXQgcmF0aW9TdW0gPSAwO1xyXG4gIGxldCByYXRpb0NvdW50ID0gMDtcclxuICBmb3IgKGNvbnN0IFtpLCBqXSBvZiBlZGdlcykge1xyXG4gICAgY29uc3Qgc291cmNlTGVuZ3RoID0gc291cmNlc1tpXS5kaXN0YW5jZVRvKHNvdXJjZXNbal0pO1xyXG4gICAgY29uc3QgdGFyZ2V0TGVuZ3RoID0gdGFyZ2V0c1tpXS5kaXN0YW5jZVRvKHRhcmdldHNbal0pO1xyXG4gICAgaWYgKHNvdXJjZUxlbmd0aCA+IDFlLTkpIHtcclxuICAgICAgcmF0aW9TdW0gKz0gdGFyZ2V0TGVuZ3RoIC8gc291cmNlTGVuZ3RoO1xyXG4gICAgICByYXRpb0NvdW50ICs9IDE7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGlmIChyYXRpb0NvdW50ID09PSAwKSB7XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcbiAgY29uc3Qgc2NhbGUgPSByYXRpb1N1bSAvIHJhdGlvQ291bnQ7XHJcblxyXG4gIC8vIFRoZSBncm91cCBhcHBsaWVzIHBvc2l0aW9uLCB0aGVuIHJvdGF0aW9uLCB0aGVuIHNjYWxlLCBzbyBhIHBvaW50IGxhbmRzIGF0IHQgKyBzKlIqcC4gU29sdmluZ1xyXG4gIC8vIHRoYXQgZm9yIHQgYXQgdGhlIGNlbnRyb2lkcyBnaXZlcyB0aGUgdHJhbnNsYXRpb24uXHJcbiAgY29uc3Qgc291cmNlQ2VudHJvaWQgPSBzb3VyY2VzLnJlZHVjZSgoc3VtLCB2KSA9PiBzdW0uYWRkKHYpLCBuZXcgVEhSRUUuVmVjdG9yMygpKS5tdWx0aXBseVNjYWxhcigxIC8gMyk7XHJcbiAgY29uc3QgdGFyZ2V0Q2VudHJvaWQgPSB0YXJnZXRzLnJlZHVjZSgoc3VtLCB2KSA9PiBzdW0uYWRkKHYpLCBuZXcgVEhSRUUuVmVjdG9yMygpKS5tdWx0aXBseVNjYWxhcigxIC8gMyk7XHJcbiAgY29uc3QgdHJhbnNsYXRpb24gPSB0YXJnZXRDZW50cm9pZFxyXG4gICAgLmNsb25lKClcclxuICAgIC5zdWIoc291cmNlQ2VudHJvaWQuY2xvbmUoKS5hcHBseU1hdHJpeDQocm90YXRpb24pLm11bHRpcGx5U2NhbGFyKHNjYWxlKSk7XHJcblxyXG4gIGNvbnN0IGV1bGVyID0gbmV3IFRIUkVFLkV1bGVyKCkuc2V0RnJvbVJvdGF0aW9uTWF0cml4KHJvdGF0aW9uKTtcclxuXHJcbiAgcmV0dXJuIHtcclxuICAgIHRyYW5zbGF0aW9uOiB7IHg6IHRyYW5zbGF0aW9uLngsIHk6IHRyYW5zbGF0aW9uLnksIHo6IHRyYW5zbGF0aW9uLnogfSxcclxuICAgIHJvdGF0aW9uOiB7IHg6IGV1bGVyLngsIHk6IGV1bGVyLnksIHo6IGV1bGVyLnogfSxcclxuICAgIHNjYWxlLFxyXG4gIH07XHJcbn1cclxuXHJcbi8qKiBUaGUgb25lLSBhbmQgdHdvLXBhaXIgY2FzZXMgb2Ygc29sdmVUaHJlZUpzQWxpZ25tZW50LCB3aGljaCBzaGFyZSB0aGUgXCJzYW1lIHZlcnRpY2FsXCIgYXNzdW1wdGlvbi4gKi9cclxuZnVuY3Rpb24gc29sdmVSZWR1Y2VkQWxpZ25tZW50KHBhaXJzOiBUaHJlZUpzQWxpZ25tZW50UGFpcltdLCB1cDogVEhSRUUuVmVjdG9yMyk6IFRocmVlSnNBbGlnbm1lbnQgfCBudWxsIHtcclxuICBjb25zdCBzb3VyY2VzID0gcGFpcnMubWFwKChwYWlyKSA9PiBuZXcgVEhSRUUuVmVjdG9yMyhwYWlyLnNvdXJjZS54LCBwYWlyLnNvdXJjZS55LCBwYWlyLnNvdXJjZS56KSk7XHJcbiAgY29uc3QgdGFyZ2V0cyA9IHBhaXJzLm1hcCgocGFpcikgPT4gbmV3IFRIUkVFLlZlY3RvcjMocGFpci50YXJnZXQueCwgcGFpci50YXJnZXQueSwgcGFpci50YXJnZXQueikpO1xyXG5cclxuICAvLyBTdGFydHMgZnJvbSB0aGUgcm90YXRpb24gdGhhdCBvbmx5IHN0YW5kcyB0aGUgdGFncycgdmVydGljYWwgb24gdGhlIG1vZGVsJ3MuXHJcbiAgY29uc3Qgcm90YXRpb24gPSBuZXcgVEhSRUUuUXVhdGVybmlvbigpLnNldEZyb21Vbml0VmVjdG9ycyhuZXcgVEhSRUUuVmVjdG9yMygwLCAxLCAwKSwgdXApO1xyXG4gIGxldCBzY2FsZSA9IDE7XHJcblxyXG4gIGlmIChwYWlycy5sZW5ndGggPT09IDIpIHtcclxuICAgIGNvbnN0IHNvdXJjZVNwYW4gPSBzb3VyY2VzWzFdLmNsb25lKCkuc3ViKHNvdXJjZXNbMF0pO1xyXG4gICAgY29uc3QgdGFyZ2V0U3BhbiA9IHRhcmdldHNbMV0uY2xvbmUoKS5zdWIodGFyZ2V0c1swXSk7XHJcbiAgICBpZiAoc291cmNlU3Bhbi5sZW5ndGgoKSA8IDFlLTkgfHwgdGFyZ2V0U3Bhbi5sZW5ndGgoKSA8IDFlLTkpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICBzY2FsZSA9IHRhcmdldFNwYW4ubGVuZ3RoKCkgLyBzb3VyY2VTcGFuLmxlbmd0aCgpO1xyXG5cclxuICAgIC8vIEhlYWRpbmcgaXMgdGhlIHR1cm4gYWJvdXQgdGhlIHZlcnRpY2FsIHRoYXQgbGluZXMgdGhlIHR3byBzcGFucyB1cCwgc28gb25seSB0aGVpciBob3Jpem9udGFsXHJcbiAgICAvLyBwYXJ0cyBjb3VudC4gVHdvIHBvaW50cyBvbmUgYWJvdmUgdGhlIG90aGVyIGhhdmUgbm9uZSwgYW5kIHNheSBub3RoaW5nIGFib3V0IGhlYWRpbmcuXHJcbiAgICBjb25zdCBmbGF0dGVuID0gKHY6IFRIUkVFLlZlY3RvcjMpID0+IHYuY2xvbmUoKS5zdWIodXAuY2xvbmUoKS5tdWx0aXBseVNjYWxhcih2LmRvdCh1cCkpKTtcclxuICAgIGNvbnN0IGZyb20gPSBmbGF0dGVuKHNvdXJjZVNwYW4uY2xvbmUoKS5hcHBseVF1YXRlcm5pb24ocm90YXRpb24pKTtcclxuICAgIGNvbnN0IHRvID0gZmxhdHRlbih0YXJnZXRTcGFuKTtcclxuICAgIGlmIChmcm9tLmxlbmd0aCgpIDwgMWUtNiAqIHNvdXJjZVNwYW4ubGVuZ3RoKCkgfHwgdG8ubGVuZ3RoKCkgPCAxZS02ICogdGFyZ2V0U3Bhbi5sZW5ndGgoKSkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIGNvbnN0IGhlYWRpbmcgPSBNYXRoLmF0YW4yKG5ldyBUSFJFRS5WZWN0b3IzKCkuY3Jvc3NWZWN0b3JzKGZyb20sIHRvKS5kb3QodXApLCBmcm9tLmRvdCh0bykpO1xyXG4gICAgcm90YXRpb24ucHJlbXVsdGlwbHkobmV3IFRIUkVFLlF1YXRlcm5pb24oKS5zZXRGcm9tQXhpc0FuZ2xlKHVwLCBoZWFkaW5nKSk7XHJcbiAgfVxyXG5cclxuICAvLyBBIHBvaW50IGxhbmRzIGF0IHQgKyBzKlIqcDsgc29sdmVkIGZvciB0IGF0IHRoZSBjZW50cm9pZHMsIGFzIGluIHRoZSB0aHJlZS1wYWlyIGNhc2UuXHJcbiAgY29uc3QgY2VudHJvaWQgPSAocG9pbnRzOiBUSFJFRS5WZWN0b3IzW10pID0+XHJcbiAgICBwb2ludHMucmVkdWNlKChzdW0sIHYpID0+IHN1bS5hZGQodiksIG5ldyBUSFJFRS5WZWN0b3IzKCkpLm11bHRpcGx5U2NhbGFyKDEgLyBwb2ludHMubGVuZ3RoKTtcclxuICBjb25zdCB0cmFuc2xhdGlvbiA9IGNlbnRyb2lkKHRhcmdldHMpLnN1YihjZW50cm9pZChzb3VyY2VzKS5hcHBseVF1YXRlcm5pb24ocm90YXRpb24pLm11bHRpcGx5U2NhbGFyKHNjYWxlKSk7XHJcbiAgY29uc3QgZXVsZXIgPSBuZXcgVEhSRUUuRXVsZXIoKS5zZXRGcm9tUXVhdGVybmlvbihyb3RhdGlvbik7XHJcblxyXG4gIHJldHVybiB7XHJcbiAgICB0cmFuc2xhdGlvbjogeyB4OiB0cmFuc2xhdGlvbi54LCB5OiB0cmFuc2xhdGlvbi55LCB6OiB0cmFuc2xhdGlvbi56IH0sXHJcbiAgICByb3RhdGlvbjogeyB4OiBldWxlci54LCB5OiBldWxlci55LCB6OiBldWxlci56IH0sXHJcbiAgICBzY2FsZSxcclxuICB9O1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIE9iakFkZGVkIHtcclxuICBpZDogc3RyaW5nO1xyXG4gIG5hbWU6IHN0cmluZztcclxuICBmaWxlOiBzdHJpbmc7IC8vIFRoZSBVUkwgdG8gdGhlIC5vYmogZmlsZVxyXG4gIHBvc2l0aW9uOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB6OiBudW1iZXIgfTtcclxuICByb3RhdGlvbjogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgejogbnVtYmVyIH07XHJcbiAgc2NhbGU6IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHo6IG51bWJlciB9O1xyXG59XHJcblxyXG5pbnRlcmZhY2UgUGFyc2VkTWVzaEdyb3VwIHtcclxuICBzdGFydDogbnVtYmVyO1xyXG4gIGNvdW50OiBudW1iZXI7XHJcbiAgbWF0ZXJpYWxJbmRleDogbnVtYmVyO1xyXG59XHJcblxyXG4vKiogUmF3IGdlb21ldHJ5IGRhdGEgZXh0cmFjdGVkIGZyb20gYSBwYXJzZWQgT0JKIG1lc2gsIHNlbnQgYmFjayBieSB0aGUgcGFyc2VyIHdvcmtlci4gKi9cclxuaW50ZXJmYWNlIFBhcnNlZE1lc2hEYXRhIHtcclxuICBuYW1lOiBzdHJpbmc7XHJcbiAgLy8gT25lIG5hbWUgcGVyIG1hdGVyaWFsIHVzZWQgYnkgdGhpcyBtZXNoLiBBIHNpbmdsZS1tYXRlcmlhbCBtZXNoIGhhcyBvbmUgZW50cnk7XHJcbiAgLy8gYSBtZXNoIHdpdGggbXVsdGlwbGUgdXNlbXRsIHN3aXRjaGVzIChnZW9tZXRyeS5ncm91cHMpIGhhcyBvbmUgcGVyIGdyb3VwLlxyXG4gIG1hdGVyaWFsTmFtZXM6IHN0cmluZ1tdO1xyXG4gIGdyb3VwczogUGFyc2VkTWVzaEdyb3VwW10gfCBudWxsO1xyXG4gIHBvc2l0aW9uOiBGbG9hdDMyQXJyYXk7XHJcbiAgbm9ybWFsOiBGbG9hdDMyQXJyYXkgfCBudWxsO1xyXG4gIHV2OiBGbG9hdDMyQXJyYXkgfCBudWxsO1xyXG4gIGluZGV4OiBVaW50MzJBcnJheSB8IG51bGw7XHJcbiAgYm91bmRpbmdCb3g/OiB7IG1pbjogW251bWJlciwgbnVtYmVyLCBudW1iZXJdOyBtYXg6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSB9O1xyXG59XHJcblxyXG5pbnRlcmZhY2UgT2JqUGFyc2VyV29ya2VyUmVzcG9uc2Uge1xyXG4gIHJlcXVlc3RJZDogc3RyaW5nO1xyXG4gIHN1Y2Nlc3M6IGJvb2xlYW47XHJcbiAgbWVzaGVzPzogUGFyc2VkTWVzaERhdGFbXTtcclxuICBlcnJvcj86IHN0cmluZztcclxufVxyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgVGhyZWVKc1NlcnZpY2Uge1xyXG4gIHByaXZhdGUgc2NlbmUhOiBUSFJFRS5TY2VuZTtcclxuICBwcml2YXRlIGNhbWVyYSE6IFRIUkVFLlBlcnNwZWN0aXZlQ2FtZXJhO1xyXG4gIHByaXZhdGUgcmVuZGVyZXIhOiBUSFJFRS5XZWJHTFJlbmRlcmVyO1xyXG4gIHByaXZhdGUgY29udHJvbHMhOiBPcmJpdENvbnRyb2xzO1xyXG4gIHByaXZhdGUgYW5pbWF0aW9uRnJhbWVJZCE6IG51bWJlcjtcclxuXHJcbiAgLy8gUmF5Y2FzdGluZyBhbmQgaW50ZXJhY3Rpb25cclxuICBwcml2YXRlIHJheWNhc3RlciA9IG5ldyBUSFJFRS5SYXljYXN0ZXIoKTtcclxuICBwcml2YXRlIG1vdXNlID0gbmV3IFRIUkVFLlZlY3RvcjIoKTtcclxuICBwcml2YXRlIGlzRHJhZ2dpbmdDYW1lcmE6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIGlzRHJhZ2dpbmdUaW1lcjogYW55O1xyXG4gIHByaXZhdGUgY2xpY2thYmxlT2JqZWN0czogVEhSRUUuT2JqZWN0M0RbXSA9IFtdO1xyXG5cclxuICAvLyBPYnNlcnZhYmxlcyBmb3IgdGhlIHZpZXdlciBjb21wb25lbnRcclxuICBwdWJsaWMgb2JqZWN0SG92ZXJlZCQgPSBuZXcgU3ViamVjdDx7IGlkOiBzdHJpbmc7IGV2ZW50OiBNb3VzZUV2ZW50IH0gfCBudWxsPigpO1xyXG4gIHB1YmxpYyBvYmplY3RDbGlja2VkJCA9IG5ldyBTdWJqZWN0PHN0cmluZyB8IG51bGw+KCk7XHJcblxyXG4gIC8qKiBFbWl0cyB3aGVuIHRoZSB1c2VyIGNsaWNrcyBhIHRhZywgbWlycm9yaW5nIE1hdHRlcnBvcnQncyB0YWcgY2xpY2suICovXHJcbiAgcHVibGljIHRhZ0NsaWNrZWQkID0gbmV3IFN1YmplY3Q8VGhyZWVKc1RhZ0NsaWNrPigpO1xyXG5cclxuICAvKiogRW1pdHMgYSB0YWcncyBsYWJlbCB3aGlsZSB0aGUgcG9pbnRlciBpcyBvdmVyIGl0LCBhbmQgbnVsbCB3aGVuIGl0IGxlYXZlcy4gKi9cclxuICBwdWJsaWMgdGFnSG92ZXJlZCQgPSBuZXcgU3ViamVjdDx7IGxhYmVsOiBzdHJpbmc7IGV2ZW50OiBNb3VzZUV2ZW50IH0gfCBudWxsPigpO1xyXG5cclxuICAvLyBUYWdzIGxpdmUgdW5kZXIgdGhlIG1vZGVsIHJhdGhlciB0aGFuIHRoZSBzY2VuZSwgc28gdGhlIGNlbnRlcmluZyBhbmQgc2NhbGluZyBhcHBsaWVkIHdoZW4gdGhlXHJcbiAgLy8gbW9kZWwgaXMgcGxhY2VkIGNhcnJpZXMgb3ZlciBhbmQgUE9JIGNvb3JkaW5hdGVzIGNhbiBzdGF5IGluIHRoZSBtb2RlbCdzIG93biBzcGFjZS5cclxuICBwcml2YXRlIHRhZ0dyb3VwID0gbmV3IFRIUkVFLkdyb3VwKCk7XHJcbiAgcHJpdmF0ZSB0YWdTcHJpdGVzID0gbmV3IE1hcDxzdHJpbmcsIFRIUkVFLlNwcml0ZT4oKTtcclxuXHJcbiAgcHJpdmF0ZSBjYW52YXNSZXNpemVPYnNlcnZlcj86IFJlc2l6ZU9ic2VydmVyO1xyXG5cclxuICAvKiogQWJvcnRzIHRoZSBpbi1mbGlnaHQgbW9kZWwgZG93bmxvYWQuIFBhcnNpbmcgY2Fubm90IGJlIGludGVycnVwdGVkLCBvbmx5IG5vdCBzdGFydGVkLiAqL1xyXG4gIHByaXZhdGUgbG9hZEFib3J0Q29udHJvbGxlcj86IEFib3J0Q29udHJvbGxlcjtcclxuXHJcbiAgLy8gVGhlIGxvYWRlZCBiYXNlIG1vZGVsLCBrZXB0IHNvIHRhZyBwbGFjZW1lbnQgY2FuIHJheWNhc3QgYWdhaW5zdCBpdHMgZ2VvbWV0cnkuXHJcbiAgcHJpdmF0ZSBtb2RlbFJvb3Q/OiBUSFJFRS5PYmplY3QzRDtcclxuXHJcbiAgLyoqIFRydWUgd2hpbGUgdGhlIG5leHQgY2xpY2sgb24gdGhlIG1vZGVsIHBsYWNlcyBhIHRhZyBpbnN0ZWFkIG9mIG9yYml0aW5nLiAqL1xyXG4gIHByaXZhdGUgcGxhY2luZ1RhZyA9IGZhbHNlO1xyXG5cclxuICAvKiogV2hhdCB0aGUgYXJtZWQgcGxhY2VtZW50IGlzIGZvciwgZWNob2VkIGJhY2sgd2hlbiB0aGUgc3BvdCBpcyBwaWNrZWQuICovXHJcbiAgcHJpdmF0ZSBwbGFjZW1lbnRQb2lUeXBlOiBQb2lUeXBlIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIC8qKiBQb3NpdGlvbiBhbmQgbm9ybWFsIG9mIHRoZSBsYXN0IHBsYWNlZCB0YWcsIGluIG1vZGVsIHNwYWNlLCBhd2FpdGluZyBjb21taXQgdG8gYSBQT0kuICovXHJcbiAgcHJpdmF0ZSBwZW5kaW5nVGFnUGxhY2VtZW50OiBUaHJlZUpzVGFnUGxhY2VtZW50IHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIC8qKiBQb2ludGVyIHBvc2l0aW9uIHdhaXRpbmcgZm9yIGEgcHJldmlldyBwaWNrLCBjb2FsZXNjZWQgdG8gb25lIHBlciBmcmFtZS4gKi9cclxuICBwcml2YXRlIHBlbmRpbmdQcmV2aWV3RXZlbnQ6IE1vdXNlRXZlbnQgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgLyoqXHJcbiAgICogVGFncyB3aG9zZSBwb3NpdGlvbiBpcyBpbiB0aGlzIG1vZGVsJ3Mgb3duIGNvb3JkaW5hdGVzLiBBIHNpYmxpbmcgb2YgdGhlIHRhZyBncm91cCB0aGF0IGRvZXMgbm90XHJcbiAgICogY2FycnkgdGhlIGNhbGlicmF0aW9uOiBjYWxpYnJhdGluZyBhIG1vZGVsIGZvciB0aGUgdGFncyBpdCBpbXBvcnRzIG11c3Qgbm90IG1vdmUgdGhlIG9uZXMgdGhhdFxyXG4gICAqIHdlcmUgcGxhY2VkIHN0cmFpZ2h0IG9udG8gaXQuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBtb2RlbFRhZ0dyb3VwID0gbmV3IFRIUkVFLkdyb3VwKCk7XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBjYXB0dXJlIG9uIHNjcmVlbi4gQSB0YWcgcGxhY2VkIGluIGEgM0QgbW9kZWwgaXMgcmVjb3JkZWQgd2l0aCBpdCwgd2hpY2ggaXMgaG93IHRoZSB0YWdzXHJcbiAgICogcGxhY2VkIGluIHRoaXMgb25lIGFyZSB0b2xkIGZyb20gdGhvc2UgdGhhdCBjYW1lIGZyb20gZWxzZXdoZXJlLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgY3VycmVudENhcHR1cmVJRDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBtb2RlbCdzIHN1cmZhY2UgYXMgYSBncmlkOiBldmVyeSBjZWxsIHNvbWUgcGFydCBvZiB0aGUgc3VyZmFjZSBwYXNzZXMgdGhyb3VnaC5cclxuICAgKlxyXG4gICAqIEl0IGFuc3dlcnMgXCJpcyB0aGlzIHBvaW50IG5lYXIgdGhlIG1vZGVsP1wiIHdpdGhvdXQgdmlzaXRpbmcgdGhlIHRyaWFuZ2xlcywgb2Ygd2hpY2ggYSBjYXB0dXJlZFxyXG4gICAqIG1vZGVsIGhhcyBtaWxsaW9ucyAtIHRoZSBxdWVzdGlvbiBpcyBhc2tlZCBmb3IgZXZlcnkgdGFnLCBldmVyeSB0aW1lIHRoZSBjYWxpYnJhdGlvbiBjaGFuZ2VzLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgc3VyZmFjZUNlbGxzOiBTZXQ8bnVtYmVyPiB8IG51bGwgPSBudWxsO1xyXG5cclxuICBwcml2YXRlIHN1cmZhY2VPcmlnaW4gPSBuZXcgVEhSRUUuVmVjdG9yMygpO1xyXG5cclxuICBwcml2YXRlIHN1cmZhY2VDZWxsU2l6ZSA9IDE7XHJcblxyXG4gIC8qKlxyXG4gICAqIEhvdyBmYXIgZnJvbSB0aGUgbW9kZWwncyBzdXJmYWNlIGEgdGFnIG1heSBiZSBhbmQgc3RpbGwgY291bnQgYXMgb24gaXQsIGluIG1ldHJlcy5cclxuICAgKlxyXG4gICAqIEV2ZXJ5IHRhZyBvZiB0aGUgc3BhY2UgaXMgb2ZmZXJlZCB0byBldmVyeSBtb2RlbDsgdGhpcyBpcyB3aGF0IGRlY2lkZXMgd2hpY2ggb25lcyBhIG1vZGVsXHJcbiAgICogc2hvd3MuIEEgdGFnIG1hcmtzIHNvbWV0aGluZyBvbiBhIHN1cmZhY2UsIHNvIG9uZSB0aGF0IGJlbG9uZ3MgaGVyZSBzaXRzIG9uIHRoZSBzdXJmYWNlIG9yXHJcbiAgICogY2xvc2UgdG8gaXQuIE9uZSB0aGF0IGxhbmRzIGRlZXAgaW5zaWRlIHRoZSBtb2RlbCwgb3Igd2VsbCBhd2F5IGZyb20gaXQsIG1hcmtzIHNvbWV0aGluZyB0aGF0XHJcbiAgICogaXMgbm90IHBhcnQgb2YgdGhpcyBtb2RlbC4gVGhlIGFsbG93YW5jZSBjb3ZlcnMgYSBjYWxpYnJhdGlvbiBkb25lIGJ5IGhhbmQgYW5kIHRoZSBtb2RlbCBub3RcclxuICAgKiBtYXRjaGluZyB0aGUgc2NhbiBleGFjdGx5LCB3aGljaCB0b2dldGhlciBydW4gdG8gYSBmZXcgdGVucyBvZiBjZW50aW1ldHJlcy5cclxuICAgKi9cclxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBPTl9NT0RFTF9NRVRSRVMgPSAwLjc1O1xyXG5cclxuICAvKiogQ2VsbHMgcGVyIGF4aXMgdGhlIGdyaWQncyBrZXlzIGNhbiBhZGRyZXNzLCB3aXRoIHJvb20gZWl0aGVyIHNpZGUgZm9yIHBvaW50cyBvZmYgdGhlIG1vZGVsLiAqL1xyXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFNVUkZBQ0VfR1JJRF9TUEFOID0gMTAyNDtcclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgU1VSRkFDRV9HUklEX1BBRCA9IDEyODtcclxuXHJcbiAgLyoqIE93biB0YWdzIG1vdmVkIHRvIGtlZXAgdGhlaXIgcGxhY2UgdW5kZXIgdGhlIGxhc3QgY2FsaWJyYXRpb24sIHdhaXRpbmcgdG8gYmUgc3RvcmVkLiAqL1xyXG4gIHByaXZhdGUgcmViYXNlZFRhZ3M6IFRocmVlSnNSZWJhc2VkVGFnW10gPSBbXTtcclxuXHJcbiAgLyoqIFRoZSB0eXBlIGZpbHRlciBpbiBmb3JjZS4gTnVsbCBzaG93cyBldmVyeSB0eXBlLiAqL1xyXG4gIHByaXZhdGUgdmlzaWJsZVRhZ1R5cGVzOiBQb2lUeXBlW10gfCBudWxsID0gbnVsbDtcclxuXHJcbiAgcHJpdmF0ZSBtZWFzdXJpbmcgPSBmYWxzZTtcclxuXHJcbiAgLyoqIFBvaW50cyBjbGlja2VkIHNvIGZhciwgaW4gdGFnIHNwYWNlLiAqL1xyXG4gIHByaXZhdGUgbWVhc3VyZVBvaW50czogVEhSRUUuVmVjdG9yM1tdID0gW107XHJcblxyXG4gIC8qKlxyXG4gICAqIEV2ZXJ5dGhpbmcgZHJhd24gZm9yIHRoZSBtZWFzdXJlbWVudC4gQSBjaGlsZCBvZiB0aGUgdGFnIGdyb3VwLCBzbyBpdHMgcG9pbnRzIHNoYXJlIHRoZSBmcmFtZVxyXG4gICAqIHRhZyBjb29yZGluYXRlcyBhcmUgc3RvcmVkIGluIC0gd2hpY2ggaXMgbWV0cmVzLCBhbmQgd2hhdCB0aGUgc2F2ZWQgUE9JIGhhcyB0byBiZSBpbi5cclxuICAgKi9cclxuICBwcml2YXRlIG1lYXN1cmVHcm91cCA9IG5ldyBUSFJFRS5Hcm91cCgpO1xyXG5cclxuICAvKiogVGhlIHNlZ21lbnQgdGhhdCBmb2xsb3dzIHRoZSBwb2ludGVyIGZyb20gdGhlIGxhc3QgcG9pbnQgY2xpY2tlZC4gKi9cclxuICBwcml2YXRlIG1lYXN1cmVSdWJiZXJCYW5kPzogYW55O1xyXG5cclxuICBwcml2YXRlIGxhc3RNZWFzdXJlbWVudDogVGhyZWVKc01lYXN1cmVtZW50IHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIC8qKiBIYWxmIHRoZSBtb2RlbCdzIGRpYWdvbmFsIGFzIHBsYWNlZCBpbiB0aGUgc2NlbmUsIHdoZXJlIGl0IGlzIGNlbnRyZWQgb24gdGhlIG9yaWdpbi4gKi9cclxuICBwcml2YXRlIG1vZGVsV29ybGRSYWRpdXMgPSAwO1xyXG5cclxuICAvKiogVGhlIG91dGVybW9zdCBncm91cCB0aGUgbW9kZWwgYW5kIGl0cyB0YWdzIGhhbmcgZnJvbTogd2hlcmUgXCJ3aGljaCB3YXkgaXMgdXBcIiBpcyBhcHBsaWVkLiAqL1xyXG4gIHByaXZhdGUgbW9kZWxHcm91cD86IFRIUkVFLkdyb3VwO1xyXG5cclxuICBwcml2YXRlIG1vZGVsVXA6IFRocmVlSnNNb2RlbFVwID0gJ3knO1xyXG5cclxuICAvKiogV2hpbGUgbWVhc3VyaW5nOiBob3cgbWFueSBwb2ludHMgYW5kIGVhY2ggc2VnbWVudCdzIGxlbmd0aC4gTnVsbCB3aGVuIGl0IGlzIGFiYW5kb25lZC4gKi9cclxuICBwdWJsaWMgbWVhc3VyZW1lbnRQcm9ncmVzcyQgPSBuZXcgU3ViamVjdDx7IHBvaW50czogbnVtYmVyOyBkaXN0YW5jZXM6IG51bWJlcltdIH0gfCBudWxsPigpO1xyXG5cclxuICAvKipcclxuICAgKiBMYXllciBjYXJyeWluZyB0aGUgbW9kZWwgYWxvbmUsIHNvIHRoZSBkZXB0aCBwaWNrIGNhbiByZW5kZXIgaXQgd2l0aG91dCB0aGUgdGFncy5cclxuICAgKlxyXG4gICAqIExheWVycyBhcmUgdGVzdGVkIHBlciBvYmplY3QgYXQgcmVuZGVyIHRpbWUgYW5kIGNoaWxkcmVuIGFyZSB0cmF2ZXJzZWQgcmVnYXJkbGVzcyBvZiB3aGV0aGVyXHJcbiAgICogdGhlaXIgcGFyZW50IHBhc3NlZCwgc28gbWFya2luZyB0aGUgbW9kZWwncyBvd24gbWVzaGVzIGlzIGVub3VnaCAtIG5vIHJlLXBhcmVudGluZy5cclxuICAgKi9cclxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBQSUNLX0xBWUVSID0gMTtcclxuXHJcbiAgLyoqIFRoZSBhcHAncyBoaWdobGlnaHQgY29sb3VyLCBzbyBhIG1lYXN1cmVtZW50IHJlYWRzIGFzIHRoZSBhY3RpdmUgdGhpbmcgb24gc2NyZWVuLiAqL1xyXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE1FQVNVUkVfQ09MT1IgPSAnI0ZGQjEwMyc7XHJcblxyXG4gIC8qKiBDYWNoZSBTdG9yYWdlIGJ1Y2tldCBob2xkaW5nIGRvd25sb2FkZWQgbW9kZWxzLCBhbmQgaG93IG1hbnkgdG8ga2VlcC4gKi9cclxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBNT0RFTF9DQUNIRSA9ICdzbWFydGVycGxhbi0zZC1tb2RlbHMnO1xyXG5cclxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBNT0RFTF9DQUNIRV9TSVpFID0gMztcclxuXHJcbiAgcHJpdmF0ZSBwaWNrVGFyZ2V0PzogVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ7XHJcblxyXG4gIHByaXZhdGUgcGlja0NhbWVyYT86IFRIUkVFLlBlcnNwZWN0aXZlQ2FtZXJhO1xyXG5cclxuICBwcml2YXRlIHBpY2tEZXB0aE1hdGVyaWFsPzogVEhSRUUuTWVzaERlcHRoTWF0ZXJpYWw7XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgcGlja1BpeGVsID0gbmV3IFVpbnQ4QXJyYXkoNCk7XHJcblxyXG4gIC8qKiBFbWl0cyBvbmNlIGEgdGFnIGlzIGRyb3BwZWQgb24gdGhlIG1vZGVsLCBzbyB0aGUgVUkgY2FuIGNvbmZpcm0gYW5kIHBlcnNpc3QgaXQuICovXHJcbiAgcHVibGljIHRhZ1BsYWNlZCQgPSBuZXcgU3ViamVjdDxUaHJlZUpzVGFnUGxhY2VtZW50PigpO1xyXG5cclxuICAvKiogRW1pdHMgd2hlbiB0aGUgY2FsaWJyYXRpb24gd2Fsa3Rocm91Z2ggaXMgYWJhbmRvbmVkLCBzbyB0aGUgcGFuZWwgZHJpdmluZyBpdCBjYW4gY2xvc2UuICovXHJcbiAgcHVibGljIGFsaWdubWVudENhbmNlbGxlZCQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG5cclxuICAvKiogVHJhbnNsdWNlbnQgbWFya2VyIHNob3duIHVuZGVyIHRoZSBjdXJzb3Igd2hpbGUgcGxhY2luZy4gKi9cclxuICBwcml2YXRlIHBsYWNlbWVudFByZXZpZXc/OiBUSFJFRS5TcHJpdGU7XHJcblxyXG4gIHByaXZhdGUgYWxpZ25pbmcgPSBmYWxzZTtcclxuICBwcml2YXRlIGFsaWdubWVudFBhaXJzOiBUaHJlZUpzQWxpZ25tZW50UGFpcltdID0gW107XHJcbiAgcHJpdmF0ZSBhbGlnbm1lbnRTb3VyY2U6IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHo6IG51bWJlciB9IHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIC8qKiBUaGUgdGFnIGBhbGlnbm1lbnRTb3VyY2VgIHdhcyByZWFkIGZyb20sIGtlcHQgc28gdGhlIHNhbWUgdGFnIGlzIG5vdCBtYXRjaGVkIHR3aWNlLiAqL1xyXG4gIHByaXZhdGUgYWxpZ25tZW50U291cmNlVGFnSWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuXHJcbiAgLyoqIERyaXZlcyB0aGUgYWxpZ25tZW50IHdhbGt0aHJvdWdoJ3MgVUk6IGhvdyBtYW55IHBhaXJzIGFyZSBkb25lIGFuZCB3aGF0IGl0IHdhbnRzIG5leHQuICovXHJcbiAgcHVibGljIGFsaWdubWVudFByb2dyZXNzJCA9IG5ldyBTdWJqZWN0PHtcclxuICAgIHBhaXJzOiBudW1iZXI7XHJcbiAgICBhd2FpdGluZzogJ3RhZycgfCAncG9pbnQnIHwgbnVsbDtcclxuICAgIHRhZ0lkPzogc3RyaW5nO1xyXG4gIH0+KCk7XHJcblxyXG4gIC8qKiBJbi1mbGlnaHQgY2FtZXJhIG1vdmUgc3RhcnRlZCBieSBnb1RvVGFnLCBhZHZhbmNlZCBieSB0aGUgcmVuZGVyIGxvb3AuICovXHJcbiAgcHJpdmF0ZSBjYW1lcmFUd2Vlbjoge1xyXG4gICAgZnJvbVBvc2l0aW9uOiBUSFJFRS5WZWN0b3IzO1xyXG4gICAgdG9Qb3NpdGlvbjogVEhSRUUuVmVjdG9yMztcclxuICAgIGZyb21UYXJnZXQ6IFRIUkVFLlZlY3RvcjM7XHJcbiAgICB0b1RhcmdldDogVEhSRUUuVmVjdG9yMztcclxuICAgIHN0YXJ0ZWRBdDogbnVtYmVyO1xyXG4gICAgZHVyYXRpb25NczogbnVtYmVyO1xyXG4gIH0gfCBudWxsID0gbnVsbDtcclxuXHJcbiAgLyoqIEVtaXRzIHRydWUgd2hpbGUgYSBoZWF2eSBPQkogZmlsZSBpcyBiZWluZyBwYXJzZWQgKGluIGEgd29ya2VyLCB3aGVuIGF2YWlsYWJsZSksIGZhbHNlIG9uY2UgZG9uZS4gKi9cclxuICBwdWJsaWMgbW9kZWxMb2FkaW5nJCA9IG5ldyBTdWJqZWN0PGJvb2xlYW4+KCk7XHJcblxyXG4gIC8qKlxyXG4gICAqIERvd25sb2FkIHByb2dyZXNzIGZvciBHTEIgbW9kZWxzLCBhcyBhIDAtMSBmcmFjdGlvbiwgb3IgbnVsbCB3aGVuIHRoZSB0b3RhbCBzaXplIGlzIHVua25vd24uXHJcbiAgICpcclxuICAgKiBBIG51bGwgbWVhbnMgdGhlIHNlcnZlciBkaWQgbm90IHNlbmQgQ29udGVudC1MZW5ndGggKGNodW5rZWQgcmVzcG9uc2VzLCBzb21lIHByb3hpZXMpIGFuZCBub1xyXG4gICAqIHBlcmNlbnRhZ2UgY2FuIGJlIGRlcml2ZWQ7IHNob3cgYW4gaW5kZXRlcm1pbmF0ZSBpbmRpY2F0b3IgcmF0aGVyIHRoYW4gZ3Vlc3NpbmcgYXQgb25lLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBtb2RlbExvYWRQcm9ncmVzcyQgPSBuZXcgU3ViamVjdDxudW1iZXIgfCBudWxsPigpO1xyXG5cclxuICAvKipcclxuICAgKiBFbWl0cyB3aGVuIGEgbG9hZCBhY3R1YWxseSBzdG9wcGVkIHNob3J0LCB3aGljaCBpcyBub3QgdGhlIHNhbWUgYXMgYXNraW5nIGl0IHRvLlxyXG4gICAqXHJcbiAgICogY2FuY2VsTW9kZWxMb2FkKCkgY2FuIGFycml2ZSBhZnRlciBwYXJzZSgpIGhhcyB0YWtlbiB0aGUgbWFpbiB0aHJlYWQsIGFuZCBwYXJzZSBjYW5ub3QgYmVcclxuICAgKiBpbnRlcnJ1cHRlZCAtIHRoZSBtb2RlbCBmaW5pc2hlcyBsb2FkaW5nIHJlZ2FyZGxlc3MuIE9ubHkgdGhpcyB0ZWxscyB0aGUgVUkgd2hpY2ggb2YgdGhlIHR3b1xyXG4gICAqIGhhcHBlbmVkLCBzbyBpdCBkb2VzIG5vdCBvZmZlciB0byByZWxvYWQgc29tZXRoaW5nIHRoYXQgaXMgYWxyZWFkeSBvbiBzY3JlZW4uXHJcbiAgICovXHJcbiAgcHVibGljIG1vZGVsTG9hZENhbmNlbGxlZCQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG5cclxuICAvLyBCYWNrZ3JvdW5kIHBhcnNpbmcgb2YgaGVhdnkgLm9iaiBmaWxlcywgcHJvdmlkZWQgYnkgdGhlIGhvc3RpbmcgYXBwIChzZWUgc2V0T2JqUGFyc2VyV29ya2VyKS5cclxuICAvLyBBbmd1bGFyIGxpYnJhcmllcyBidWlsdCB3aXRoIG5nLXBhY2thZ3IgY2FuJ3QgYnVuZGxlIGBuZXcgV29ya2VyKG5ldyBVUkwoLi4uKSlgIHRoZW1zZWx2ZXMsXHJcbiAgLy8gc28gdGhlIGFwcCBpbnN0YW50aWF0ZXMgdGhlIHdvcmtlciAoaXRzIGJ1aWxkIHBpcGVsaW5lIHN1cHBvcnRzIGl0KSBhbmQgaGFuZHMgaXQgb3ZlciBoZXJlLlxyXG4gIHByaXZhdGUgb2JqUGFyc2VyV29ya2VyPzogV29ya2VyO1xyXG4gIHByaXZhdGUgb2JqUGFyc2VyUGVuZGluZ1JlcXVlc3RzID0gbmV3IE1hcDxzdHJpbmcsIHsgcmVzb2x2ZTogKG1lc2hlczogUGFyc2VkTWVzaERhdGFbXSkgPT4gdm9pZDsgcmVqZWN0OiAoZXJyb3I6IEVycm9yKSA9PiB2b2lkIH0+KCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgbmdab25lOiBOZ1pvbmUpIHsgfVxyXG5cclxuICAvKipcclxuICAgKiBSZWdpc3RlcnMgYSBXZWIgV29ya2VyIHVzZWQgdG8gcGFyc2UgaGVhdnkgLm9iaiBmaWxlcyBvZmYgdGhlIG1haW4gdGhyZWFkLlxyXG4gICAqIE11c3QgYmUgaW5zdGFudGlhdGVkIGJ5IHRoZSBjb25zdW1pbmcgYXBwIChlLmcuIGBuZXcgV29ya2VyKG5ldyBVUkwoJy4vb2JqLXBhcnNlci53b3JrZXInLCBpbXBvcnQubWV0YS51cmwpKWApLFxyXG4gICAqIHNpbmNlIGEgbGlicmFyeSBwYWNrYWdlZCB3aXRoIG5nLXBhY2thZ3IgY2Fubm90IGJ1bmRsZSB3b3JrZXIgZmlsZXMgaXRzZWxmLlxyXG4gICAqIFdoZW4gbm8gd29ya2VyIGlzIHByb3ZpZGVkLCBsb2FkT2JqTW9kZWwgZmFsbHMgYmFjayB0byBwYXJzaW5nIG9uIHRoZSBtYWluIHRocmVhZC5cclxuICAgKi9cclxuICBzZXRPYmpQYXJzZXJXb3JrZXIod29ya2VyOiBXb3JrZXIpOiB2b2lkIHtcclxuICAgIHRoaXMub2JqUGFyc2VyV29ya2VyID0gd29ya2VyO1xyXG4gICAgdGhpcy5vYmpQYXJzZXJXb3JrZXIub25tZXNzYWdlID0gKHsgZGF0YSB9OiBNZXNzYWdlRXZlbnQ8T2JqUGFyc2VyV29ya2VyUmVzcG9uc2U+KSA9PiB7XHJcbiAgICAgIGNvbnN0IHBlbmRpbmcgPSB0aGlzLm9ialBhcnNlclBlbmRpbmdSZXF1ZXN0cy5nZXQoZGF0YS5yZXF1ZXN0SWQpO1xyXG4gICAgICBpZiAoIXBlbmRpbmcpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5vYmpQYXJzZXJQZW5kaW5nUmVxdWVzdHMuZGVsZXRlKGRhdGEucmVxdWVzdElkKTtcclxuICAgICAgaWYgKGRhdGEuc3VjY2VzcyAmJiBkYXRhLm1lc2hlcykge1xyXG4gICAgICAgIHBlbmRpbmcucmVzb2x2ZShkYXRhLm1lc2hlcyk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcGVuZGluZy5yZWplY3QobmV3IEVycm9yKGRhdGEuZXJyb3IgfHwgJ1Vua25vd24gZXJyb3Igd2hpbGUgcGFyc2luZyBPQkogZmlsZSBpbiB3b3JrZXInKSk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlcXVlc3RPYmpQYXJzZUluV29ya2VyKG9ialVybDogc3RyaW5nKTogUHJvbWlzZTxQYXJzZWRNZXNoRGF0YVtdPiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBjb25zdCByZXF1ZXN0SWQgPSBgJHtEYXRlLm5vdygpfS0ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIpfWA7XHJcbiAgICAgIHRoaXMub2JqUGFyc2VyUGVuZGluZ1JlcXVlc3RzLnNldChyZXF1ZXN0SWQsIHsgcmVzb2x2ZSwgcmVqZWN0IH0pO1xyXG4gICAgICB0aGlzLm9ialBhcnNlcldvcmtlciEucG9zdE1lc3NhZ2UoeyByZXF1ZXN0SWQsIG9ialVybCB9KTtcclxuICAgICAgLy8gRGlhZ25vc3RpYyBvbmx5OiBsYXJnZSBtb2RlbHMgbGVnaXRpbWF0ZWx5IHRha2UgYSB3aGlsZSwgdGhpcyBpc24ndCBhIHRpbWVvdXQvYWJvcnQsXHJcbiAgICAgIC8vIGp1c3QgYSBzaWduYWwgaW4gY2FzZSB0aGUgd29ya2VyIHdlbnQgc2lsZW50IChlLmcuIGl0IHJhbiBvdXQgb2YgbWVtb3J5IG1pZC1wYXJzZSkuXHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLm9ialBhcnNlclBlbmRpbmdSZXF1ZXN0cy5oYXMocmVxdWVzdElkKSkge1xyXG4gICAgICAgICAgY29uc29sZS53YXJuKGBUaHJlZUpzU2VydmljZTogb2JqLXBhcnNlciB3b3JrZXIgaGFzIG5vdCByZXBsaWVkIGFmdGVyIDYwcyBmb3IgcmVxdWVzdCAke3JlcXVlc3RJZH0gKG9ialVybD0ke29ialVybH0pLiBTdGlsbCB3YWl0aW5nIC0gbGFyZ2UgZmlsZXMgY2FuIHRha2UgYSB3aGlsZSwgYnV0IHRoaXMgbWF5IGFsc28gbWVhbiB0aGUgd29ya2VyIGh1bmcgb3IgcmFuIG91dCBvZiBtZW1vcnkuYCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LCA2MDAwMCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKiBSZWJ1aWxkcyBhIFRIUkVFLk1lc2ggZnJvbSB0aGUgcmF3IHR5cGVkIGFycmF5cyBzZW50IGJhY2sgYnkgdGhlIHBhcnNlciB3b3JrZXIuICovXHJcbiAgcHJpdmF0ZSBtZXNoRnJvbVBhcnNlZERhdGEoZGF0YTogUGFyc2VkTWVzaERhdGEsIG1hdGVyaWFscz86IGFueSk6IFRIUkVFLk1lc2gge1xyXG4gICAgY29uc3QgZ2VvbWV0cnkgPSBuZXcgVEhSRUUuQnVmZmVyR2VvbWV0cnkoKTtcclxuICAgIGdlb21ldHJ5LnNldEF0dHJpYnV0ZSgncG9zaXRpb24nLCBuZXcgVEhSRUUuQnVmZmVyQXR0cmlidXRlKGRhdGEucG9zaXRpb24sIDMpKTtcclxuICAgIGlmIChkYXRhLnV2KSB7XHJcbiAgICAgIGdlb21ldHJ5LnNldEF0dHJpYnV0ZSgndXYnLCBuZXcgVEhSRUUuQnVmZmVyQXR0cmlidXRlKGRhdGEudXYsIDIpKTtcclxuICAgIH1cclxuICAgIC8vIEluZGV4IGhhcyB0byBiZSBzZXQgYmVmb3JlIGFueSBub3JtYWwgY29tcHV0YXRpb24sIHdoaWNoIHJlYWRzIGl0IHRvIGF2ZXJhZ2Ugc2hhcmVkIGZhY2VzLlxyXG4gICAgaWYgKGRhdGEuaW5kZXgpIHtcclxuICAgICAgZ2VvbWV0cnkuc2V0SW5kZXgobmV3IFRIUkVFLkJ1ZmZlckF0dHJpYnV0ZShkYXRhLmluZGV4LCAxKSk7XHJcbiAgICB9XHJcbiAgICBpZiAoZGF0YS5ub3JtYWwpIHtcclxuICAgICAgZ2VvbWV0cnkuc2V0QXR0cmlidXRlKCdub3JtYWwnLCBuZXcgVEhSRUUuQnVmZmVyQXR0cmlidXRlKGRhdGEubm9ybWFsLCAzKSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBnZW9tZXRyeS5jb21wdXRlVmVydGV4Tm9ybWFscygpO1xyXG4gICAgfVxyXG4gICAgLy8gQm94My5zZXRGcm9tT2JqZWN0KCkgcmV1c2VzIGFuIGFscmVhZHktc2V0IGJvdW5kaW5nQm94IGluc3RlYWQgb2Ygd2Fsa2luZyBldmVyeSB2ZXJ0ZXgsXHJcbiAgICAvLyBzbyBhZG9wdGluZyB0aGUgd29ya2VyJ3MgbWFrZXMgZnJhbWluZyB0aGUgY2FtZXJhIGNoZWFwIG5vIG1hdHRlciBob3cgZGVuc2UgdGhlIG1lc2ggaXMuXHJcbiAgICBpZiAoZGF0YS5ib3VuZGluZ0JveCkge1xyXG4gICAgICBnZW9tZXRyeS5ib3VuZGluZ0JveCA9IG5ldyBUSFJFRS5Cb3gzKFxyXG4gICAgICAgIG5ldyBUSFJFRS5WZWN0b3IzKC4uLmRhdGEuYm91bmRpbmdCb3gubWluKSxcclxuICAgICAgICBuZXcgVEhSRUUuVmVjdG9yMyguLi5kYXRhLmJvdW5kaW5nQm94Lm1heCksXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcmVzb2x2ZWRNYXRlcmlhbHMgPSBkYXRhLm1hdGVyaWFsTmFtZXMubWFwKChuYW1lKSA9PiB7XHJcbiAgICAgIGNvbnN0IG1hdGVyaWFsID0gbWF0ZXJpYWxzICYmIG5hbWUgPyBtYXRlcmlhbHMuY3JlYXRlKG5hbWUpIDogdW5kZWZpbmVkO1xyXG4gICAgICBpZiAoIW1hdGVyaWFsKSB7XHJcbiAgICAgICAgY29uc29sZS53YXJuKGBUaHJlZUpzU2VydmljZTogbm8gTVRMIG1hdGVyaWFsIG5hbWVkIFwiJHtuYW1lfVwiIGZvciBtZXNoIFwiJHtkYXRhLm5hbWV9XCIsIHVzaW5nIGEgcGxhaW4gZmFsbGJhY2sgKG5vIHRleHR1cmUpLmApO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBtYXRlcmlhbCB8fCBuZXcgVEhSRUUuTWVzaFBob25nTWF0ZXJpYWwoKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGxldCBtZXNoOiBUSFJFRS5NZXNoO1xyXG4gICAgaWYgKGRhdGEuZ3JvdXBzICYmIGRhdGEuZ3JvdXBzLmxlbmd0aCA+IDApIHtcclxuICAgICAgZGF0YS5ncm91cHMuZm9yRWFjaCgoZ3JvdXApID0+IGdlb21ldHJ5LmFkZEdyb3VwKGdyb3VwLnN0YXJ0LCBncm91cC5jb3VudCwgZ3JvdXAubWF0ZXJpYWxJbmRleCkpO1xyXG4gICAgICBtZXNoID0gbmV3IFRIUkVFLk1lc2goZ2VvbWV0cnksIHJlc29sdmVkTWF0ZXJpYWxzKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIG1lc2ggPSBuZXcgVEhSRUUuTWVzaChnZW9tZXRyeSwgcmVzb2x2ZWRNYXRlcmlhbHNbMF0pO1xyXG4gICAgfVxyXG4gICAgbWVzaC5uYW1lID0gZGF0YS5uYW1lO1xyXG4gICAgcmV0dXJuIG1lc2g7XHJcbiAgfVxyXG5cclxuICBpbml0KGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQpOiB2b2lkIHtcclxuICAgIC8vIFRoaXMgc2VydmljZSBpcyBhIHNpbmdsZXRvbiBidXQgdGhlIHZpZXdlciBjb21wb25lbnQgaXMgcmVidWlsdCBvbiBldmVyeSBuYXZpZ2F0aW9uLCBzbyBzdGF0ZVxyXG4gICAgLy8gZnJvbSB0aGUgcHJldmlvdXMgc2NlbmUgaXMgc3RpbGwgaGVyZS4gVHdvIHRoaW5ncyBvdXRsaXZlIGl0IGFuZCBoYXZlIHRvIGdvIGZpcnN0OlxyXG4gICAgLy9cclxuICAgIC8vICAtIEEgZG93bmxvYWQgc3RpbGwgaW4gZmxpZ2h0LiBJdHMgb25Mb2FkZWQgcmVzb2x2ZXMgYWdhaW5zdCB3aGF0ZXZlciBgdGhpcy5zY2VuZWAgcG9pbnRzIGF0XHJcbiAgICAvLyAgICBieSB0aGVuLCBzbyB0aGUgbW9kZWwgYmVpbmcgYWJhbmRvbmVkIHdvdWxkIGJlIGhhbmRlZCB0byB0aGUgc2NlbmUgYnVpbHQgYmVsb3cuXHJcbiAgICAvLyAgLSBUaGUgdGFnIGdyb3VwLCB3aGljaCBpcyBhIGZpZWxkIGFuZCBrZWVwcyBpdHMgc3ByaXRlcy4gVGhleSB3b3VsZCBiZSByZS1wYXJlbnRlZCB1bmRlciB0aGVcclxuICAgIC8vICAgIG5ldyBtb2RlbCBhbmQgc2hvdyB0aGUgcHJldmlvdXMgdmlzaXQncyB0YWdzIG9uIGl0LlxyXG4gICAgdGhpcy5kaXNjYXJkQ3VycmVudExvYWQoKTtcclxuICAgIHRoaXMuY2xlYXJUYWdzKCk7XHJcbiAgICB0aGlzLm1lYXN1cmluZyA9IGZhbHNlO1xyXG4gICAgdGhpcy5jbGVhck1lYXN1cmVtZW50KCk7XHJcbiAgICB0aGlzLmNhbWVyYVR3ZWVuID0gbnVsbDtcclxuICAgIHRoaXMubW9kZWxSb290ID0gdW5kZWZpbmVkO1xyXG5cclxuICAgIC8vIDEuIFNldHVwIFNjZW5lXHJcbiAgICB0aGlzLnNjZW5lID0gbmV3IFRIUkVFLlNjZW5lKCk7XHJcbiAgICB0aGlzLnNjZW5lLmJhY2tncm91bmQgPSBuZXcgVEhSRUUuQ29sb3IoMHhlMGY3ZmYpOyAvLyBmcm9tIFBPQ1xyXG5cclxuICAgIC8vIDIuIFNldHVwIENhbWVyYVxyXG4gICAgdGhpcy5jYW1lcmEgPSBuZXcgVEhSRUUuUGVyc3BlY3RpdmVDYW1lcmEoNzUsIGNhbnZhcy5jbGllbnRXaWR0aCAvIGNhbnZhcy5jbGllbnRIZWlnaHQsIDAuMSwgMTAwMDApO1xyXG4gICAgdGhpcy5jYW1lcmEucG9zaXRpb24uc2V0KDAsIDUsIDEwKTsgLy8gd2lsbCBiZSBvdmVycmlkZGVuIGxhdGVyIGlmIHBhc3NlZFxyXG5cclxuICAgIC8vIDMuIFNldHVwIFdlYkdMIFJlbmRlcmVyXHJcbiAgICB0aGlzLnJlbmRlcmVyID0gbmV3IFRIUkVFLldlYkdMUmVuZGVyZXIoeyBjYW52YXMsIGFudGlhbGlhczogdHJ1ZSB9KTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0U2l6ZShjYW52YXMuY2xpZW50V2lkdGgsIGNhbnZhcy5jbGllbnRIZWlnaHQpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRQaXhlbFJhdGlvKE1hdGgubWluKHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvLCAxLjUpKTtcclxuICAgIHRoaXMub2JzZXJ2ZUNhbnZhc1Jlc2l6ZShjYW52YXMpO1xyXG4gICAgXHJcbiAgICAvLyBGaXggZm9yIFRocmVlLmpzIHIxNDcgdnMgcjE1MisgY29sb3IgbWFuYWdlbWVudFxyXG4gICAgaWYgKCdvdXRwdXRDb2xvclNwYWNlJyBpbiB0aGlzLnJlbmRlcmVyKSB7XHJcbiAgICAgICh0aGlzLnJlbmRlcmVyIGFzIGFueSkub3V0cHV0Q29sb3JTcGFjZSA9ICdzcmdiJzsgLy8gVEhSRUUuU1JHQkNvbG9yU3BhY2VcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICh0aGlzLnJlbmRlcmVyIGFzIGFueSkub3V0cHV0RW5jb2RpbmcgPSAzMDAxOyAvLyBUSFJFRS5zUkdCRW5jb2RpbmdcclxuICAgIH1cclxuXHJcbiAgICAvLyBXaXRob3V0IHRvbmUgbWFwcGluZyBhbnl0aGluZyBicmlnaHRlciB0aGFuIDEuMCBpcyBzaW1wbHkgY3V0IG9mZiB0byBwdXJlIHdoaXRlLiBDYXB0dXJlZFxyXG4gICAgLy8gdGV4dHVyZXMgY2FycnkgYSBzbWFsbCBmcmFjdGlvbiBvZiB2ZXJ5IGJyaWdodCBwaXhlbHMgLSBza3kgcmVmbGVjdGVkIGluIHdpbmRvd3MsIHN1bmxpdFxyXG4gICAgLy8gcmVuZGVyIC0gYW5kIG9uY2UgbGlnaHRpbmcgcHVzaGVzIHRob3NlIHBhc3QgdGhlIGxpbWl0IHRoZXkgZmxhdHRlbiBpbnRvIHdoaXRlIHNwZWNrcyB3aXRoXHJcbiAgICAvLyBubyBkZXRhaWwgbGVmdC4gUm9sbGluZyB0aGUgaGlnaGxpZ2h0cyBvZmYgaW5zdGVhZCBrZWVwcyB0aGF0IGRldGFpbCBhbmQga2VlcHMgYnJpZ2h0IGFyZWFzXHJcbiAgICAvLyByZWFkaW5nIGFzIGJyaWdodCByYXRoZXIgdGhhbiBibG93bi5cclxuICAgIHRoaXMucmVuZGVyZXIudG9uZU1hcHBpbmcgPSBUSFJFRS5BQ0VTRmlsbWljVG9uZU1hcHBpbmc7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnRvbmVNYXBwaW5nRXhwb3N1cmUgPSAxLjA7XHJcblxyXG4gICAgLy8gNC4gTGlnaHRpbmcsIGtlcHQgZGVsaWJlcmF0ZWx5IHJlc3RyYWluZWQgYW5kIG5ldXRyYWwuXHJcbiAgICAvL1xyXG4gICAgLy8gQ2FwdHVyZWQvcGhvdG9ncmFtbWV0cnkgbW9kZWxzIGFscmVhZHkgaGF2ZSBsaWdodGluZyBiYWtlZCBpbnRvIHRoZWlyIHRleHR1cmVzICh0aGUgc3VuIGFuZFxyXG4gICAgLy8gc2hhZG93cyBjYW1lIHdpdGggdGhlIHBob3RvcyksIHNvIGxpZ2h0aW5nIHRoZW0gYWdhaW4gZGlzdG9ydHMgd2hhdCB0aGV5IGFjdHVhbGx5IGxvb2sgbGlrZS5cclxuICAgIC8vIFRoZSBpbnRlbnNpdGllcyBiZWxvdyBhZGQgdXAgdG8gcm91Z2hseSAxLjAgb24gYSBzdXJmYWNlIGZhY2luZyB0aGUgdmlld2VyLCB3aGljaCByZW5kZXJzIHRoZVxyXG4gICAgLy8gdGV4dHVyZSBhdCBpdHMgdHJ1ZSB2YWx1ZS4gQW55dGhpbmcgYWJvdmUgMS4wIGlzIGNsaXBwZWQgdG8gcHVyZSB3aGl0ZSBieSB0aGUgcmVuZGVyZXIsIHdoaWNoXHJcbiAgICAvLyBpcyB3aGF0IHR1cm5zIGJyaWdodCBhcmVhcyBpbnRvIGZsYXQgd2hpdGUgcGF0Y2hlcyB3aXRoIG5vIGRldGFpbCBsZWZ0IGluIHRoZW0uXHJcbiAgICAvL1xyXG4gICAgLy8gTmV1dHJhbCB3aGl0ZSBpcyB1c2VkIHJhdGhlciB0aGFuIGEgd2FybSB0aW50IGZvciB0aGUgc2FtZSByZWFzb246IGEgdGludGVkIGxpZ2h0IHNoaWZ0cyBldmVyeVxyXG4gICAgLy8gY29sb3VyIGluIHRoZSBtb2RlbCBhd2F5IGZyb20gd2hhdCB3YXMgY2FwdHVyZWQuXHJcbiAgICBjb25zdCBhbWJpZW50TGlnaHQgPSBuZXcgVEhSRUUuQW1iaWVudExpZ2h0KDB4ZmZmZmZmLCAwLjcpO1xyXG4gICAgdGhpcy5zY2VuZS5hZGQoYW1iaWVudExpZ2h0KTtcclxuXHJcbiAgICAvLyBIZWFkbGlnaHQgcmF0aGVyIHRoYW4gYSBmaXhlZCBzdW46IHBhcmVudGVkIHRvIHRoZSBjYW1lcmEgc28gaXQgYWx3YXlzIHBvaW50cyBhdCB3aGF0ZXZlciBpc1xyXG4gICAgLy8gYmVpbmcgbG9va2VkIGF0LCBnaXZpbmcgc2hhcGUgdG8gc3VyZmFjZXMgd2l0aG91dCBldmVyIGxlYXZpbmcgYSBmYWNlIHVubGl0LiBObyBzaGFkb3cgY2FzdGluZ1xyXG4gICAgLy8gLSBzaGFkb3dzIHdvdWxkIGRvdWJsZSB1cCB3aXRoIHRoZSBvbmVzIGFscmVhZHkgYmFrZWQgaW50byB0aGUgdGV4dHVyZXMsIGFuZCB0aGUgc2hhZG93IG1hcFxyXG4gICAgLy8gd2FzIGEgcmVhbCBjb3N0IHBlciBmcmFtZS5cclxuICAgIGNvbnN0IGhlYWRMaWdodCA9IG5ldyBUSFJFRS5EaXJlY3Rpb25hbExpZ2h0KDB4ZmZmZmZmLCAwLjM1KTtcclxuICAgIGhlYWRMaWdodC5wb3NpdGlvbi5zZXQoMCwgMCwgMSk7XHJcbiAgICB0aGlzLmNhbWVyYS5hZGQoaGVhZExpZ2h0KTtcclxuICAgIC8vIEEgbGlnaHQgb25seSBjb250cmlidXRlcyB3aGlsZSBpdCBpcyBwYXJ0IG9mIHRoZSBzY2VuZSBncmFwaCwgYW5kIHRoaXMgb25lIGhhbmdzIG9mZiB0aGUgY2FtZXJhLlxyXG4gICAgdGhpcy5zY2VuZS5hZGQodGhpcy5jYW1lcmEpO1xyXG5cclxuICAgIC8vIDUuIFNldHVwIENvbnRyb2xzIChmcm9tIFBPQylcclxuICAgIHRoaXMuY29udHJvbHMgPSBuZXcgT3JiaXRDb250cm9scyh0aGlzLmNhbWVyYSwgdGhpcy5yZW5kZXJlci5kb21FbGVtZW50KTtcclxuICAgIHRoaXMuY29udHJvbHMucm90YXRlU3BlZWQgPSAxLjA7XHJcbiAgICB0aGlzLmNvbnRyb2xzLmRhbXBpbmdGYWN0b3IgPSAwLjE7XHJcbiAgICB0aGlzLmNvbnRyb2xzLmVuYWJsZURhbXBpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy5jb250cm9scy5tb3VzZUJ1dHRvbnMgPSB7XHJcbiAgICAgIExFRlQ6IFRIUkVFLk1PVVNFLlJPVEFURSxcclxuICAgICAgTUlERExFOiBUSFJFRS5NT1VTRS5ET0xMWSxcclxuICAgICAgUklHSFQ6IFRIUkVFLk1PVVNFLlBBTixcclxuICAgIH07XHJcbiAgICB0aGlzLmNvbnRyb2xzLnRhcmdldC5zZXQoMCwgMCwgMCk7XHJcblxyXG4gICAgLy8gRXZlbnQgbGlzdGVuZXJzIG9uIGNvbnRyb2xzIHRvIGRpZmZlcmVudGlhdGUgZHJhZ2dpbmcgdnMgY2xpY2tpbmdcclxuICAgIHRoaXMuY29udHJvbHMuYWRkRXZlbnRMaXN0ZW5lcignc3RhcnQnLCAoKSA9PiB7XHJcbiAgICAgIHRoaXMuaXNEcmFnZ2luZ1RpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5pc0RyYWdnaW5nQ2FtZXJhID0gdHJ1ZTtcclxuICAgICAgfSwgMTUwKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuY29udHJvbHMuYWRkRXZlbnRMaXN0ZW5lcignZW5kJywgKCkgPT4ge1xyXG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5pc0RyYWdnaW5nVGltZXIpO1xyXG4gICAgICBpZiAodGhpcy5pc0RyYWdnaW5nQ2FtZXJhKSB7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmlzRHJhZ2dpbmdDYW1lcmEgPSBmYWxzZTtcclxuICAgICAgICB9LCAyNTApO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBJbnRlcmFjdGlvbiBFdmVudCBMaXN0ZW5lcnMgb24gY2FudmFzXHJcbiAgICBjYW52YXMuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLm9uTW91c2VDbGljay5iaW5kKHRoaXMpLCBmYWxzZSk7XHJcbiAgICBjYW52YXMuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5vbk1vdXNlTW92ZS5iaW5kKHRoaXMpLCBmYWxzZSk7XHJcblxyXG4gICAgLy8gRXNjYXBlIGJhY2tzIG91dCBvZiBwbGFjZW1lbnQgYW5kIGNhbGlicmF0aW9uLiBPbiB0aGUgd2luZG93IHJhdGhlciB0aGFuIHRoZSBjYW52YXMsIHdoaWNoXHJcbiAgICAvLyB3b3VsZCBuZWVkIGZvY3VzIHRoZSB1c2VyIGhhcyBubyByZWFzb24gdG8gaGF2ZSBnaXZlbiBpdCAtIHRoZXkgYXJlIGFpbWluZyB3aXRoIHRoZSBtb3VzZS5cclxuICAgIC8vIFJlbW92ZWQgZmlyc3QgYmVjYXVzZSB0aGlzIHNlcnZpY2UgaXMgYSBzaW5nbGV0b246IGluaXQoKSBydW5zIGFnYWluIGZvciBldmVyeSBjYW52YXMsIGFuZFxyXG4gICAgLy8gdGhlIHByZXZpb3VzIHJlZ2lzdHJhdGlvbiB3b3VsZCBvdGhlcndpc2Ugc3RpbGwgYmUgYXR0YWNoZWQuXHJcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMub25LZXlEb3duKTtcclxuICAgIHRoaXMucGlja1RhcmdldD8uZGlzcG9zZSgpO1xyXG4gICAgdGhpcy5waWNrVGFyZ2V0ID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy5waWNrRGVwdGhNYXRlcmlhbD8uZGlzcG9zZSgpO1xyXG4gICAgdGhpcy5waWNrRGVwdGhNYXRlcmlhbCA9IHVuZGVmaW5lZDtcclxuICAgIHRoaXMucGlja0NhbWVyYSA9IHVuZGVmaW5lZDtcclxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5vbktleURvd24pO1xyXG5cclxuICAgIC8vIDYuIFN0YXJ0IHRoZSByZW5kZXIgbG9vcFxyXG4gICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xyXG4gICAgICB0aGlzLmFuaW1hdGUoKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUGF0aCAoc2VydmVkIGJ5IHRoZSBhcHApIGhvbGRpbmcgYmFzaXNfdHJhbnNjb2Rlci5qcy8ud2FzbSwgd2hpY2ggS1RYMkxvYWRlciBuZWVkcyB0byB0dXJuXHJcbiAgICogQmFzaXMgVW5pdmVyc2FsIHRleHR1cmVzIGludG8gd2hhdGV2ZXIgY29tcHJlc3NlZCBmb3JtYXQgdGhlIGxvY2FsIEdQVSBhY3R1YWxseSBzdXBwb3J0cy5cclxuICAgKi9cclxuICBwcml2YXRlIGt0eDJUcmFuc2NvZGVyUGF0aCA9ICdhc3NldHMvYmFzaXMvJztcclxuXHJcbiAgLyoqIE92ZXJyaWRlcyB3aGVyZSB0aGUgQmFzaXMgdHJhbnNjb2RlciBmaWxlcyBhcmUgc2VydmVkIGZyb20uICovXHJcbiAgc2V0S3R4MlRyYW5zY29kZXJQYXRoKHBhdGg6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5rdHgyVHJhbnNjb2RlclBhdGggPSBwYXRoO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTG9hZHMgYSBiYXNlIDNEIG1vZGVsIGluIEdMVEYvR0xCIGZvcm1hdCAtIHRoZSBwcmVmZXJyZWQgZm9ybWF0IGZvciBsYXJnZSBtb2RlbHMuXHJcbiAgICogVW5saWtlIC5vYmosIGdlb21ldHJ5IGFycml2ZXMgYXMgYmluYXJ5IHR5cGVkIGFycmF5cyAobm8gdGV4dCBwYXJzaW5nIHRvIG9mZmxvYWQgdG8gYSB3b3JrZXIpXHJcbiAgICogYW5kIHN0YXlzIGluZGV4ZWQsIHNvIGZhciBsZXNzIGRhdGEgcmVhY2hlcyB0aGUgR1BVLiBLVFgyIHRleHR1cmVzIGFyZSBzdXBwb3J0ZWQgdG9vOiB0aGV5XHJcbiAgICogc3RheSBjb21wcmVzc2VkIGluIFZSQU0gaW5zdGVhZCBvZiBiZWluZyBkZWNvZGVkIHRvIHJhdyBwaXhlbHMgbGlrZSBKUEVHL1BORy5cclxuICAgKi9cclxuICBsb2FkR0xURk1vZGVsKHVybDogc3RyaW5nLCBjYW1lcmFQb3NpdGlvbj86IHt4OiBudW1iZXIsIHk6IG51bWJlciwgejogbnVtYmVyfSwgcm90YXRpb24/OiB7eDogbnVtYmVyLCB5OiBudW1iZXIsIHo6IG51bWJlcn0sIGNhY2hlS2V5Pzogc3RyaW5nLCB1cD86IFRocmVlSnNNb2RlbFVwKTogdm9pZCB7XHJcbiAgICBjb25zdCBsb2FkZXIgPSBuZXcgR0xURkxvYWRlcigpO1xyXG5cclxuICAgIC8vIEtUWDIgbmVlZHMgdGhlIHJlbmRlcmVyIHRvIHJlcG9ydCB3aGljaCBjb21wcmVzc2VkIGZvcm1hdHMgdGhpcyBHUFUgYWNjZXB0cywgc28gdGhpcyBoYXMgdG9cclxuICAgIC8vIGhhcHBlbiBhZnRlciBpbml0KCkuIEd1YXJkZWQgc28gYSBtb2RlbCB3aXRob3V0IEtUWDIgdGV4dHVyZXMgc3RpbGwgbG9hZHMgaWYgaXQncyBtaXNzaW5nLlxyXG4gICAgaWYgKHRoaXMucmVuZGVyZXIpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjb25zdCBrdHgyTG9hZGVyID0gbmV3IEtUWDJMb2FkZXIoKVxyXG4gICAgICAgICAgLnNldFRyYW5zY29kZXJQYXRoKHRoaXMua3R4MlRyYW5zY29kZXJQYXRoKVxyXG4gICAgICAgICAgLmRldGVjdFN1cHBvcnQodGhpcy5yZW5kZXJlcik7XHJcbiAgICAgICAgbG9hZGVyLnNldEtUWDJMb2FkZXIoa3R4MkxvYWRlcik7XHJcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgY29uc29sZS53YXJuKCdUaHJlZUpzU2VydmljZTogY291bGQgbm90IHNldCB1cCBLVFgyIHRleHR1cmUgc3VwcG9ydCwgZmFsbGluZyBiYWNrIHRvIHVuY29tcHJlc3NlZCB0ZXh0dXJlcy4nLCBlcnJvcik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIExldHMgZ2x0ZnBhY2svZ2x0Zi10cmFuc2Zvcm0gb3V0cHV0IHVzaW5nIEVYVF9tZXNob3B0X2NvbXByZXNzaW9uIGxvYWQgd2l0aG91dCBleHRyYSBzZXR1cC5cclxuICAgIGxvYWRlci5zZXRNZXNob3B0RGVjb2RlcihNZXNob3B0RGVjb2Rlcik7XHJcblxyXG4gICAgdGhpcy5tb2RlbExvYWRpbmckLm5leHQodHJ1ZSk7XHJcbiAgICB0aGlzLm1vZGVsTG9hZFByb2dyZXNzJC5uZXh0KDApO1xyXG5cclxuICAgIC8vIE9yZGVyIG1hdHRlcnM6IG5vcm1hbHMgbXVzdCBleGlzdCBiZWZvcmUgYW5pc290cm9weSwgYW5kIHRoZSBQaG9uZyBjb252ZXJzaW9uIGhhcyB0byBydW5cclxuICAgIC8vIGJlZm9yZSBzaWRlL2ZsYXRTaGFkaW5nIGFyZSB0b3VjaGVkIHNvIHRob3NlIHNldHRpbmdzIGxhbmQgb24gdGhlIG1hdGVyaWFscyB3ZSBrZWVwLlxyXG4gICAgY29uc3Qgb25Mb2FkZWQgPSAoZ2x0ZjogYW55KSA9PiB7XHJcbiAgICAgIHRoaXMuY29udmVydFRvUGhvbmdNYXRlcmlhbHMoZ2x0Zi5zY2VuZSk7XHJcbiAgICAgIHRoaXMuZm9yY2VEb3VibGVTaWRlZE1hdGVyaWFscyhnbHRmLnNjZW5lKTtcclxuICAgICAgdGhpcy5lbnN1cmVWZXJ0ZXhOb3JtYWxzKGdsdGYuc2NlbmUpO1xyXG4gICAgICB0aGlzLnR1bmVUZXh0dXJlU2FtcGxpbmcoZ2x0Zi5zY2VuZSk7XHJcbiAgICAgIHRoaXMucGxhY2VMb2FkZWRPYmplY3RJblNjZW5lKGdsdGYuc2NlbmUsIGNhbWVyYVBvc2l0aW9uLCByb3RhdGlvbiwgdXApO1xyXG4gICAgICB0aGlzLm1vZGVsTG9hZGluZyQubmV4dChmYWxzZSk7XHJcbiAgICB9O1xyXG4gICAgY29uc3Qgb25FcnJvciA9IChlcnJvcjogYW55KSA9PiB7XHJcbiAgICAgIC8vIENhbmNlbGxpbmcgaXMgYSBkZWNpc2lvbiwgbm90IGEgZmFpbHVyZTogY2xlYXIgdGhlIG92ZXJsYXkgd2l0aG91dCBhbiBlcnJvciBpbiB0aGUgY29uc29sZS5cclxuICAgICAgaWYgKGVycm9yPy5uYW1lID09PSAnQWJvcnRFcnJvcicpIHtcclxuICAgICAgICAvLyBPbmx5IGEgY2FuY2VsIG9mIHRoZSBsb2FkIHRoYXQgaXMgc3RpbGwgY3VycmVudCBjYW1lIGZyb20gdGhlIHVzZXI7IGFueXRoaW5nIGVsc2UgaXMgdGhpc1xyXG4gICAgICAgIC8vIGxvYWQgaGF2aW5nIGJlZW4gc3VwZXJzZWRlZCBvciBkaXNjYXJkZWQuXHJcbiAgICAgICAgaWYgKHRoaXMubG9hZEFib3J0Q29udHJvbGxlcj8uc2lnbmFsLmFib3J0ZWQpIHtcclxuICAgICAgICAgIHRoaXMubW9kZWxMb2FkQ2FuY2VsbGVkJC5uZXh0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGxvYWRpbmcgR0xURiBtb2RlbDonLCBlcnJvcik7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5tb2RlbExvYWRpbmckLm5leHQoZmFsc2UpO1xyXG4gICAgICB0aGlzLm1vZGVsTG9hZFByb2dyZXNzJC5uZXh0KG51bGwpO1xyXG4gICAgfTtcclxuXHJcbiAgICAvLyBHTFRGTG9hZGVyIGRlY29kZXMgZW1iZWRkZWQgaW1hZ2VzIHdpdGggY3JlYXRlSW1hZ2VCaXRtYXAgd2hlbiB0aGUgYnJvd3NlciBvZmZlcnMgaXQsIGFuZCBvblxyXG4gICAgLy8gbGFyZ2UgdGV4dHVyZSBhdGxhc2VzIHRoYXQgcGF0aCByZXR1cm5zIHZpc2libHkgY29ycnVwdCBkYXRhIC0gc2NhdHRlcmVkIHdoaXRlIGJsb2NrcyBhY3Jvc3NcclxuICAgIC8vIHRoZSBtb2RlbC4gVGhlIGV4YWN0IHNhbWUgYnl0ZXMgZGVjb2RlZCB0aHJvdWdoIGFuIEhUTUxJbWFnZUVsZW1lbnQsIHdoaWNoIGlzIHdoYXQgdGhlIC5vYmpcclxuICAgIC8vIHBhdGggdXNlcyB2aWEgTVRMTG9hZGVyLCBjb21lIG91dCBjbGVhbi4gR0xURkxvYWRlciBhbHJlYWR5IGZhbGxzIGJhY2sgdG8gdGhhdCBkZWNvZGVyIGZvclxyXG4gICAgLy8gU2FmYXJpIGFuZCBvbGRlciBGaXJlZm94OyB0aGlzIHNpbXBseSBleHRlbmRzIHRoZSBmYWxsYmFjayB0byBjb3ZlciB0aGlzIGNhc2UgdG9vLlxyXG4gICAgLy9cclxuICAgIC8vIFRoZSBkZWNvZGVyIGlzIGNob3NlbiB3aGlsZSBHTFRGUGFyc2VyIGlzIGJlaW5nIGNvbnN0cnVjdGVkLCB3aGljaCBoYXBwZW5zIHN5bmNocm9ub3VzbHlcclxuICAgIC8vIGluc2lkZSBwYXJzZSgpLCBzbyBoaWRpbmcgY3JlYXRlSW1hZ2VCaXRtYXAgb25seSBoYXMgdG8gaG9sZCBhY3Jvc3MgdGhhdCBjYWxsIHJhdGhlciB0aGFuXHJcbiAgICAvLyBmb3IgdGhlIHdob2xlIGRvd25sb2FkLlxyXG4gICAgdGhpcy5mZXRjaFdpdGhQcm9ncmVzcyh1cmwsIGNhY2hlS2V5KVxyXG4gICAgICAvLyBwYXJzZSgpIGhvbGRzIHRoZSBtYWluIHRocmVhZCBmb3Igc2Vjb25kcyBvbiBhIGxhcmdlIG1vZGVsLiBZaWVsZCB1bnRpbCB0aGUgYnJvd3NlciBoYXNcclxuICAgICAgLy8gYWN0dWFsbHkgcGFpbnRlZCBmaXJzdCwgb3RoZXJ3aXNlIHRoZSBmaW5hbCBwcm9ncmVzcyB1cGRhdGUgbmV2ZXIgcmVhY2hlcyB0aGUgc2NyZWVuIGFuZFxyXG4gICAgICAvLyB0aGUgYmFyIGFwcGVhcnMgdG8gc3RhbGwgc2hvcnQgb2YgdGhlIGVuZC5cclxuICAgICAgLnRoZW4oKGJ1ZmZlcikgPT4gdGhpcy5hZnRlck5leHRQYWludCgpLnRoZW4oKCkgPT4gYnVmZmVyKSlcclxuICAgICAgLnRoZW4oKGJ1ZmZlcikgPT4ge1xyXG4gICAgICAgIC8vIHBhcnNlKCkgY2Fubm90IGJlIGludGVycnVwdGVkLCBzbyBhIGNhbmNlbCB0aGF0IGxhbmRzIGR1cmluZyB0aGUgcGFpbnQgeWllbGQgaGFzIHRvIGJlXHJcbiAgICAgICAgLy8gY2F1Z2h0IGhlcmUgLSB0aGUgbGFzdCBtb21lbnQgYmVmb3JlIHRoZSBtYWluIHRocmVhZCBpcyBjb21taXR0ZWQgZm9yIHNldmVyYWwgc2Vjb25kcy5cclxuICAgICAgICBpZiAodGhpcy5sb2FkQWJvcnRDb250cm9sbGVyPy5zaWduYWwuYWJvcnRlZCkge1xyXG4gICAgICAgICAgdGhyb3cgbmV3IERPTUV4Y2VwdGlvbignTW9kZWwgbG9hZCBjYW5jZWxsZWQnLCAnQWJvcnRFcnJvcicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBnbG9iYWxTY29wZSA9IGdsb2JhbFRoaXMgYXMgYW55O1xyXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsQ3JlYXRlSW1hZ2VCaXRtYXAgPSBnbG9iYWxTY29wZS5jcmVhdGVJbWFnZUJpdG1hcDtcclxuICAgICAgICBnbG9iYWxTY29wZS5jcmVhdGVJbWFnZUJpdG1hcCA9IHVuZGVmaW5lZDtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgbG9hZGVyLnBhcnNlKGJ1ZmZlciwgdXJsLnN1YnN0cmluZygwLCB1cmwubGFzdEluZGV4T2YoJy8nKSArIDEpLCBvbkxvYWRlZCwgb25FcnJvcik7XHJcbiAgICAgICAgfSBmaW5hbGx5IHtcclxuICAgICAgICAgIGdsb2JhbFNjb3BlLmNyZWF0ZUltYWdlQml0bWFwID0gb3JpZ2luYWxDcmVhdGVJbWFnZUJpdG1hcDtcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICAgIC5jYXRjaChvbkVycm9yKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFN0b3BzIHRoZSBtb2RlbCBkb3dubG9hZCBpbiBwcm9ncmVzcywgaWYgYW55LlxyXG4gICAqXHJcbiAgICogT25seSB0aGUgZG93bmxvYWQgY2FuIGJlIGludGVycnVwdGVkOiBwYXJzZSgpIHJ1bnMgc3luY2hyb25vdXNseSBhbmQgaG9sZHMgdGhlIG1haW4gdGhyZWFkIHVudGlsXHJcbiAgICogaXQgZmluaXNoZXMsIHNvIG9uY2UgaXQgaGFzIGJlZ3VuIHRoZXJlIGlzIG5vdGhpbmcgdG8gY2FuY2VsLiBJbiBwcmFjdGljZSB0aGUgZG93bmxvYWQgaXMgdGhlXHJcbiAgICogbG9uZyBwYXJ0LCB3aGljaCBpcyB3aGVyZSBzb21lb25lIHJlYWNoZXMgZm9yIHRoaXMuXHJcbiAgICovXHJcbiAgY2FuY2VsTW9kZWxMb2FkKCk6IHZvaWQge1xyXG4gICAgdGhpcy5sb2FkQWJvcnRDb250cm9sbGVyPy5hYm9ydCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQWJhbmRvbnMgdGhlIGxvYWQgaW4gcHJvZ3Jlc3Mgd2l0aG91dCByZXBvcnRpbmcgaXQgYXMgY2FuY2VsbGVkLlxyXG4gICAqXHJcbiAgICogRHJvcHBpbmcgdGhlIGNvbnRyb2xsZXIgaXMgd2hhdCBtYWtlcyB0aGUgZGlmZmVyZW5jZTogb25FcnJvciB0cmVhdHMgYW4gYWJvcnQgYXMgdXNlci1pbml0aWF0ZWRcclxuICAgKiBvbmx5IHdoaWxlIHRoZSBjb250cm9sbGVyIHRoYXQgYWJvcnRlZCBpcyBzdGlsbCB0aGUgY3VycmVudCBvbmUuIFRlYXJpbmcgZG93biBvciByZWJ1aWxkaW5nIHRoZVxyXG4gICAqIHNjZW5lIGlzIG5vdCBzb21ldGhpbmcgdGhlIHBlcnNvbiBhc2tlZCBmb3IsIHNvIGl0IG11c3Qgbm90IHN1cmZhY2UgYXMgXCJsb2FkaW5nIGNhbmNlbGxlZFwiLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgZGlzY2FyZEN1cnJlbnRMb2FkKCk6IHZvaWQge1xyXG4gICAgdGhpcy5sb2FkQWJvcnRDb250cm9sbGVyPy5hYm9ydCgpO1xyXG4gICAgdGhpcy5sb2FkQWJvcnRDb250cm9sbGVyID0gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVzb2x2ZXMgb25jZSB0aGUgYnJvd3NlciBoYXMgcGFpbnRlZCBhdCBsZWFzdCBvbmUgZnJhbWUuXHJcbiAgICpcclxuICAgKiBBIHJlcXVlc3RBbmltYXRpb25GcmFtZSBjYWxsYmFjayBydW5zICpiZWZvcmUqIHRoYXQgZnJhbWUgaXMgcGFpbnRlZCwgc28gYSBzaW5nbGUgb25lIGlzIG5vdFxyXG4gICAqIGVub3VnaCB0byBndWFyYW50ZWUgcGVuZGluZyBET00gY2hhbmdlcyBhcmUgb24gc2NyZWVuOyB0aGUgc2Vjb25kIGZpcmVzIGFmdGVyIHRoZSBmaXJzdCBmcmFtZVxyXG4gICAqIGhhcyBnb25lIG91dC4gRmFsbHMgYmFjayB0byBhIHRpbWVvdXQgd2hlcmUgckFGIGlzbid0IGF2YWlsYWJsZSAoU1NSLCB0ZXN0cykuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhZnRlck5leHRQYWludCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICh0eXBlb2YgcmVxdWVzdEFuaW1hdGlvbkZyYW1lICE9PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCAwKSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcclxuICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiByZXNvbHZlKCkpKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRG93bmxvYWRzIGEgZmlsZSwgcmVwb3J0aW5nIHByb2dyZXNzIG9uIG1vZGVsTG9hZFByb2dyZXNzJCBhcyBpdCBhcnJpdmVzLlxyXG4gICAqXHJcbiAgICogR0xURkxvYWRlci5sb2FkKCkgd291bGQgcmVwb3J0IHByb2dyZXNzIHRocm91Z2ggWEhSLCBidXQgdGhpcyBwYXRoIGRlbGliZXJhdGVseSB1c2VzIGZldGNoKCkgK1xyXG4gICAqIHBhcnNlKCkgaW5zdGVhZCAoc2VlIGxvYWRHTFRGTW9kZWwgZm9yIHdoeSksIHNvIHByb2dyZXNzIGlzIHJlYWQgb2ZmIHRoZSByZXNwb25zZSBzdHJlYW0gaGVyZS5cclxuICAgKiBUaGF0IGlzIGFsc28gdGhlIG1vcmUgdXNlZnVsIG51bWJlcjogb24gYSBtb2RlbCBvZiB0aGlzIHNpemUgdGhlIGRvd25sb2FkIGRvbWluYXRlcywgYW5kIHRoZVxyXG4gICAqIHN0cmVhbSByZXBvcnRzIGl0IGFzIGl0IGhhcHBlbnMgcmF0aGVyIHRoYW4gaW4gb25lIGp1bXAgYXQgdGhlIGVuZC5cclxuICAgKi9cclxuICBwcml2YXRlIGFzeW5jIGZldGNoV2l0aFByb2dyZXNzKHVybDogc3RyaW5nLCBjYWNoZUtleT86IHN0cmluZyk6IFByb21pc2U8QXJyYXlCdWZmZXI+IHtcclxuICAgIC8vIEEgbG9hZCBhbHJlYWR5IHJ1bm5pbmcgaXMgcmVwbGFjZWQsIG5vdCByYWNlZDogd2hpY2hldmVyIGZpbmlzaGVkIGxhc3Qgd291bGQgb3RoZXJ3aXNlIHdpbi5cclxuICAgIHRoaXMubG9hZEFib3J0Q29udHJvbGxlcj8uYWJvcnQoKTtcclxuICAgIHRoaXMubG9hZEFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcclxuICAgIGNvbnN0IHsgc2lnbmFsIH0gPSB0aGlzLmxvYWRBYm9ydENvbnRyb2xsZXI7XHJcblxyXG4gICAgY29uc3QgY2FjaGVkID0gYXdhaXQgdGhpcy5yZWFkTW9kZWxGcm9tQ2FjaGUoY2FjaGVLZXkpO1xyXG4gICAgaWYgKGNhY2hlZCkge1xyXG4gICAgICB0aGlzLm1vZGVsTG9hZFByb2dyZXNzJC5uZXh0KDEpO1xyXG4gICAgICByZXR1cm4gY2FjaGVkO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7IHNpZ25hbCB9KTtcclxuICAgIGlmICghcmVzcG9uc2Uub2spIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZmV0Y2ggJHt1cmx9OiAke3Jlc3BvbnNlLnN0YXR1c30gJHtyZXNwb25zZS5zdGF0dXNUZXh0fWApO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGNvbnRlbnRMZW5ndGggPSBOdW1iZXIocmVzcG9uc2UuaGVhZGVycy5nZXQoJ0NvbnRlbnQtTGVuZ3RoJykpO1xyXG4gICAgY29uc3QgdG90YWwgPSBOdW1iZXIuaXNGaW5pdGUoY29udGVudExlbmd0aCkgJiYgY29udGVudExlbmd0aCA+IDAgPyBjb250ZW50TGVuZ3RoIDogMDtcclxuXHJcbiAgICAvLyBXaXRob3V0IGEgcmVhZGFibGUgc3RyZWFtIChvbGRlciBicm93c2Vycywgc29tZSBwb2x5ZmlsbHMpIHRoZXJlIGlzIG5vdGhpbmcgdG8gbWVhc3VyZSwgc29cclxuICAgIC8vIGZhbGwgYmFjayB0byBhIHBsYWluIGJ1ZmZlcmVkIHJlYWQgYW5kIGxldCB0aGUgVUkgc2hvdyBhbiBpbmRldGVybWluYXRlIGluZGljYXRvci5cclxuICAgIGlmICghcmVzcG9uc2UuYm9keT8uZ2V0UmVhZGVyKSB7XHJcbiAgICAgIHRoaXMubW9kZWxMb2FkUHJvZ3Jlc3MkLm5leHQobnVsbCk7XHJcbiAgICAgIHJldHVybiByZXNwb25zZS5hcnJheUJ1ZmZlcigpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHJlYWRlciA9IHJlc3BvbnNlLmJvZHkuZ2V0UmVhZGVyKCk7XHJcblxyXG4gICAgLy8gV2l0aCBhIGtub3duIHNpemUsIHdyaXRlIGNodW5rcyBzdHJhaWdodCBpbnRvIG9uZSBwcmUtYWxsb2NhdGVkIGJ1ZmZlci4gQ29sbGVjdGluZyB0aGVtIGluIGFuXHJcbiAgICAvLyBhcnJheSBhbmQgY29uY2F0ZW5hdGluZyBhZnRlcndhcmRzIHdvdWxkIGhvbGQgYm90aCBjb3BpZXMgYXQgb25jZSAtIG9uIGEgMTY0IE1CIG1vZGVsIHRoYXQgaXNcclxuICAgIC8vIGFuIGF2b2lkYWJsZSAzMDArIE1CIHBlYWsuXHJcbiAgICBjb25zdCBidWZmZXIgPSB0b3RhbCA+IDAgPyBuZXcgVWludDhBcnJheSh0b3RhbCkgOiBudWxsO1xyXG4gICAgY29uc3QgY2h1bmtzOiBVaW50OEFycmF5W10gPSBbXTtcclxuICAgIGxldCB1c2luZ0J1ZmZlciA9IGJ1ZmZlciAhPT0gbnVsbDtcclxuICAgIGxldCByZWNlaXZlZCA9IDA7XHJcbiAgICAvLyBDaHVua3MgYXJyaXZlIGluIHRlbnMgb2Yga2lsb2J5dGVzLCBzbyBhIDE2NCBNQiBtb2RlbCBwcm9kdWNlcyB0aG91c2FuZHMgb2YgdGhlbS4gRW1pdHRpbmcgb25cclxuICAgIC8vIGV2ZXJ5IG9uZSB3b3VsZCBydW4gY2hhbmdlIGRldGVjdGlvbiBqdXN0IGFzIG9mdGVuIHRvIG1vdmUgYSBiYXIgdGhhdCBpcyBtZWFzdXJlZCBpbiB3aG9sZVxyXG4gICAgLy8gcGVyY2VudCwgc28gb25seSByZXBvcnQgd2hlbiB0aGUgZGlzcGxheWVkIHZhbHVlIHdvdWxkIGFjdHVhbGx5IGNoYW5nZS5cclxuICAgIGxldCBsYXN0UmVwb3J0ZWQgPSAtMTtcclxuXHJcbiAgICBpZiAodG90YWwgPT09IDApIHtcclxuICAgICAgdGhpcy5tb2RlbExvYWRQcm9ncmVzcyQubmV4dChudWxsKTtcclxuICAgIH1cclxuXHJcbiAgICBmb3IgKDs7KSB7XHJcbiAgICAgIGNvbnN0IHsgZG9uZSwgdmFsdWUgfSA9IGF3YWl0IHJlYWRlci5yZWFkKCk7XHJcbiAgICAgIGlmIChkb25lKSB7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHNpZ25hbC5hYm9ydGVkKSB7XHJcbiAgICAgICAgLy8gRnJlZSB0aGUgY29ubmVjdGlvbiByYXRoZXIgdGhhbiBsZWF2aW5nIGl0IGRyYWluaW5nIGluIHRoZSBiYWNrZ3JvdW5kLlxyXG4gICAgICAgIGF3YWl0IHJlYWRlci5jYW5jZWwoKTtcclxuICAgICAgICB0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKCdNb2RlbCBsb2FkIGNhbmNlbGxlZCcsICdBYm9ydEVycm9yJyk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHVzaW5nQnVmZmVyICYmIHJlY2VpdmVkICsgdmFsdWUubGVuZ3RoID4gdG90YWwpIHtcclxuICAgICAgICAvLyBDb250ZW50LUxlbmd0aCB1bmRlcnN0YXRlZCB0aGUgcmVhbCBzaXplLiBNb3ZlIHdoYXQgd2UgaGF2ZSBpbnRvIHRoZSBjaHVuayBsaXN0IGFuZCBzdGF5XHJcbiAgICAgICAgLy8gdGhlcmUgZm9yIHRoZSByZXN0IG9mIHRoZSByZXNwb25zZSwgcmF0aGVyIHRoYW4gdHJ1bmNhdGluZyB0aGUgdGFpbC5cclxuICAgICAgICBjaHVua3MucHVzaChidWZmZXIuc2xpY2UoMCwgcmVjZWl2ZWQpKTtcclxuICAgICAgICB1c2luZ0J1ZmZlciA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh1c2luZ0J1ZmZlcikge1xyXG4gICAgICAgIGJ1ZmZlci5zZXQodmFsdWUsIHJlY2VpdmVkKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjaHVua3MucHVzaCh2YWx1ZSk7XHJcbiAgICAgIH1cclxuICAgICAgcmVjZWl2ZWQgKz0gdmFsdWUubGVuZ3RoO1xyXG4gICAgICBpZiAodG90YWwgPiAwKSB7XHJcbiAgICAgICAgY29uc3QgcGVyY2VudCA9IE1hdGgubWluKE1hdGgucm91bmQoKHJlY2VpdmVkIC8gdG90YWwpICogMTAwKSwgMTAwKTtcclxuICAgICAgICBpZiAocGVyY2VudCAhPT0gbGFzdFJlcG9ydGVkKSB7XHJcbiAgICAgICAgICBsYXN0UmVwb3J0ZWQgPSBwZXJjZW50O1xyXG4gICAgICAgICAgdGhpcy5tb2RlbExvYWRQcm9ncmVzcyQubmV4dChwZXJjZW50IC8gMTAwKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBUaGUgc3RyZWFtIGNhbiBlbmQgYmVsb3cgdGhlIGFkdmVydGlzZWQgc2l6ZSAob3Igd2l0aCBubyBzaXplIGF0IGFsbCkuIExhbmQgb24gYSBmdWxsIGJhclxyXG4gICAgLy8gcmF0aGVyIHRoYW4gbGVhdmluZyBpdCBzdHVjayBhdCB3aGF0ZXZlciB0aGUgbGFzdCBjaHVuayBoYXBwZW5lZCB0byByZWFjaC5cclxuICAgIGlmICh0b3RhbCA+IDAgJiYgbGFzdFJlcG9ydGVkICE9PSAxMDApIHtcclxuICAgICAgdGhpcy5tb2RlbExvYWRQcm9ncmVzcyQubmV4dCgxKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgcmVzdWx0OiBBcnJheUJ1ZmZlcjtcclxuICAgIGlmICh1c2luZ0J1ZmZlciAmJiByZWNlaXZlZCA9PT0gdG90YWwpIHtcclxuICAgICAgcmVzdWx0ID0gYnVmZmVyLmJ1ZmZlcjtcclxuICAgIH0gZWxzZSBpZiAodXNpbmdCdWZmZXIpIHtcclxuICAgICAgLy8gRmV3ZXIgYnl0ZXMgdGhhbiBhZHZlcnRpc2VkOiBoYW5kIGJhY2sgZXhhY3RseSB3aGF0IGFycml2ZWQuXHJcbiAgICAgIHJlc3VsdCA9IGJ1ZmZlci5idWZmZXIuc2xpY2UoMCwgcmVjZWl2ZWQpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgbWVyZ2VkID0gbmV3IFVpbnQ4QXJyYXkocmVjZWl2ZWQpO1xyXG4gICAgICBsZXQgb2Zmc2V0ID0gMDtcclxuICAgICAgY2h1bmtzLmZvckVhY2goKGNodW5rKSA9PiB7XHJcbiAgICAgICAgbWVyZ2VkLnNldChjaHVuaywgb2Zmc2V0KTtcclxuICAgICAgICBvZmZzZXQgKz0gY2h1bmsubGVuZ3RoO1xyXG4gICAgICB9KTtcclxuICAgICAgcmVzdWx0ID0gbWVyZ2VkLmJ1ZmZlcjtcclxuICAgIH1cclxuXHJcbiAgICBhd2FpdCB0aGlzLndyaXRlTW9kZWxUb0NhY2hlKGNhY2hlS2V5LCByZXN1bHQpO1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBtb2RlbCBzdG9yZSwgb3IgbnVsbCB3aGVyZSB0aGUgYnJvd3NlciB3aWxsIG5vdCBnaXZlIHVzIG9uZS5cclxuICAgKlxyXG4gICAqIENhY2hlIFN0b3JhZ2UgbmVlZHMgYSBzZWN1cmUgY29udGV4dCwgc28gaXQgaXMgYWJzZW50IG92ZXIgcGxhaW4gaHR0cCBhbmQgaW4gc29tZSBlbWJlZGRlZFxyXG4gICAqIHdlYnZpZXdzLiBFdmVyeSBjYWxsZXIgdHJlYXRzIHRoYXQgYXMgYSBtaXNzIC0gY2FjaGluZyBpcyBhbiBvcHRpbWlzYXRpb24sIG5ldmVyIGEgcmVxdWlyZW1lbnQuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhc3luYyBvcGVuTW9kZWxDYWNoZSgpOiBQcm9taXNlPENhY2hlIHwgbnVsbD4ge1xyXG4gICAgaWYgKHR5cGVvZiBjYWNoZXMgPT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgdHJ5IHtcclxuICAgICAgcmV0dXJuIGF3YWl0IGNhY2hlcy5vcGVuKFRocmVlSnNTZXJ2aWNlLk1PREVMX0NBQ0hFKTtcclxuICAgIH0gY2F0Y2gge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEEgY2FjaGVkIGNvcHkgb2YgdGhpcyBtb2RlbCwgaWYgb25lIHdhcyBzdG9yZWQuXHJcbiAgICpcclxuICAgKiBLZXllZCBieSB0aGUgUzMga2V5IHJhdGhlciB0aGFuIHRoZSBVUkwgaXQgaXMgZmV0Y2hlZCBmcm9tOiB0aGF0IFVSTCBpcyBzaWduZWQsIHNvIGl0IGNhcnJpZXMgYVxyXG4gICAqIGZyZXNoIHNpZ25hdHVyZSBhbmQgZXhwaXJ5IGV2ZXJ5IHRpbWUgYW5kIHdvdWxkIG5ldmVyIG1hdGNoIHR3aWNlLiBUaGUgYnJvd3NlcidzIG93biBIVFRQIGNhY2hlXHJcbiAgICogbWlzc2VzIGZvciB0aGUgc2FtZSByZWFzb24sIHdoaWNoIGlzIHdoeSB0aGlzIGV4aXN0cyBhdCBhbGwuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhc3luYyByZWFkTW9kZWxGcm9tQ2FjaGUoY2FjaGVLZXk/OiBzdHJpbmcpOiBQcm9taXNlPEFycmF5QnVmZmVyIHwgbnVsbD4ge1xyXG4gICAgaWYgKCFjYWNoZUtleSkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IGNhY2hlID0gYXdhaXQgdGhpcy5vcGVuTW9kZWxDYWNoZSgpO1xyXG4gICAgICBjb25zdCBoaXQgPSBhd2FpdCBjYWNoZT8ubWF0Y2godGhpcy5tb2RlbENhY2hlVXJsKGNhY2hlS2V5KSk7XHJcbiAgICAgIHJldHVybiBoaXQgPyBhd2FpdCBoaXQuYXJyYXlCdWZmZXIoKSA6IG51bGw7XHJcbiAgICB9IGNhdGNoIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogU3RvcmVzIGEgbW9kZWwgZm9yIG5leHQgdGltZSwgZXZpY3RpbmcgdGhlIG9sZGVzdCBvbmNlIGEgZmV3IGFyZSBoZWxkLiAqL1xyXG4gIHByaXZhdGUgYXN5bmMgd3JpdGVNb2RlbFRvQ2FjaGUoY2FjaGVLZXk6IHN0cmluZyB8IHVuZGVmaW5lZCwgbW9kZWw6IEFycmF5QnVmZmVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAoIWNhY2hlS2V5KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IGNhY2hlID0gYXdhaXQgdGhpcy5vcGVuTW9kZWxDYWNoZSgpO1xyXG4gICAgICBpZiAoIWNhY2hlKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGF3YWl0IGNhY2hlLnB1dCh0aGlzLm1vZGVsQ2FjaGVVcmwoY2FjaGVLZXkpLCBuZXcgUmVzcG9uc2UobW9kZWwpKTtcclxuXHJcbiAgICAgIC8vIE1vZGVscyBydW4gdG8gaHVuZHJlZHMgb2YgbWVnYWJ5dGVzLCBzbyB0aGlzIGNhbm5vdCBncm93IHdpdGhvdXQgbGltaXQuIENhY2hlIFN0b3JhZ2Uga2VlcHNcclxuICAgICAgLy8gaW5zZXJ0aW9uIG9yZGVyLCB3aGljaCBtYWtlcyB0aGUgZnJvbnQgb2YgdGhlIGxpc3QgdGhlIGxlYXN0IHJlY2VudGx5IHN0b3JlZC5cclxuICAgICAgY29uc3Qga2V5cyA9IGF3YWl0IGNhY2hlLmtleXMoKTtcclxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXHJcbiAgICAgICAga2V5cy5zbGljZSgwLCBNYXRoLm1heCgwLCBrZXlzLmxlbmd0aCAtIFRocmVlSnNTZXJ2aWNlLk1PREVMX0NBQ0hFX1NJWkUpKVxyXG4gICAgICAgICAgLm1hcCgoa2V5KSA9PiBjYWNoZS5kZWxldGUoa2V5KSlcclxuICAgICAgKTtcclxuICAgIH0gY2F0Y2gge1xyXG4gICAgICAvLyBPdXQgb2YgcXVvdGEsIHByaXZhdGUgYnJvd3NpbmcsIHN0b3JhZ2UgZGlzYWJsZWQ6IHRoZSBtb2RlbCBpcyBhbHJlYWR5IGxvYWRlZCBlaXRoZXIgd2F5LlxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIENhY2hlIFN0b3JhZ2Uga2V5cyBvbiBhIFVSTCwgc28gdGhlIFMzIGtleSBpcyBleHByZXNzZWQgYXMgb25lLiBJdCBpcyBuZXZlciByZXF1ZXN0ZWQuICovXHJcbiAgcHJpdmF0ZSBtb2RlbENhY2hlVXJsKGNhY2hlS2V5OiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIGBodHRwczovLzNkLW1vZGVsLWNhY2hlLnNtYXJ0ZXJwbGFuLmxvY2FsLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGNhY2hlS2V5KX1gO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRml0cyB0aGUgY2FtZXJhJ3MgY2xpcHBpbmcgcGxhbmVzIHRvIGhvdyBiaWcgdGhlIG1vZGVsIGFjdHVhbGx5IGlzLlxyXG4gICAqXHJcbiAgICogRGVwdGggcHJlY2lzaW9uIGRlcGVuZHMgb24gdGhlIGZhci9uZWFyIHJhdGlvLCBhbmQgdGhlIGZpeGVkIDAuMSAvIDEwMDAwIHRoZSBjYW1lcmEgc3RhcnRzIHdpdGhcclxuICAgKiBpcyBhIHJhdGlvIG9mIDEwMDAwMCBmb3IgYSBtb2RlbCBvbmx5IH4xMCB1bml0cyBhY3Jvc3MuIFRoYXQgd2FzdGVzIG1vc3Qgb2YgdGhlIGRlcHRoIGJ1ZmZlciBvblxyXG4gICAqIGVtcHR5IHNwYWNlIGFuZCBsZXRzIG5lYXJseSBjb2luY2lkZW50IHN1cmZhY2VzIC0gd2hpY2ggY2FwdHVyZWQgbWVzaGVzIGhhdmUgZXZlcnl3aGVyZSAtXHJcbiAgICogZmxpY2tlciBhZ2FpbnN0IGVhY2ggb3RoZXIuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhZGp1c3RDbGlwcGluZ1BsYW5lcyhyYWRpdXM6IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKHJhZGl1cyA8IDEwKSB7XHJcbiAgICAgIHRoaXMuY2FtZXJhLm5lYXIgPSAwLjAxO1xyXG4gICAgICB0aGlzLmNhbWVyYS5mYXIgPSAxMDA7XHJcbiAgICB9IGVsc2UgaWYgKHJhZGl1cyA8IDEwMCkge1xyXG4gICAgICB0aGlzLmNhbWVyYS5uZWFyID0gMC4xO1xyXG4gICAgICB0aGlzLmNhbWVyYS5mYXIgPSAxMDAwO1xyXG4gICAgfSBlbHNlIGlmIChyYWRpdXMgPCAxMDAwKSB7XHJcbiAgICAgIHRoaXMuY2FtZXJhLm5lYXIgPSAxMDtcclxuICAgICAgdGhpcy5jYW1lcmEuZmFyID0gMTAwMDA7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmNhbWVyYS5uZWFyID0gMTAwO1xyXG4gICAgICB0aGlzLmNhbWVyYS5mYXIgPSAxMDAwMDAwO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU3dhcHMgdGhlIFBCUiBtYXRlcmlhbHMgR0xURkxvYWRlciBidWlsZHMgZm9yIHRoZSBwbGFpbiBQaG9uZyBvbmVzIHRoZSAub2JqIHBhdGggcHJvZHVjZXMuXHJcbiAgICpcclxuICAgKiBNZXNoU3RhbmRhcmRNYXRlcmlhbCBrZWVwcyBhIHNwZWN1bGFyIHJlZmxlY3Rpb24gZXZlbiBhdCBtZXRhbG5lc3MgMCwgc2luY2UgZXZlcnkgZGllbGVjdHJpY1xyXG4gICAqIHJlZmxlY3RzIHNvbWUgbGlnaHQsIGFuZCBGcmVzbmVsIGRyaXZlcyB0aGF0IHJlZmxlY3Rpb24gdG93YXJkcyB3aGl0ZSBhcyBhIHN1cmZhY2UgdHVybnMgYXdheVxyXG4gICAqIGZyb20gdGhlIHZpZXdlci4gT24gYW4gYWVyaWFsIHZpZXcgb2YgYSBmYWNhZGUgbW9zdCBzdXJmYWNlcyBzaXQgYXQgZXhhY3RseSB0aG9zZSBncmF6aW5nXHJcbiAgICogYW5nbGVzLCB3aGljaCBwYWludHMgd2hpdGUgaGlnaGxpZ2h0cyBvdmVyIHdpbmRvdyBmcmFtZXMgYW5kIHJvb2YgZWRnZXMgLSB0aGUgc2FtZSBtb2RlbFxyXG4gICAqIGxvYWRlZCBhcyAub2JqIG5ldmVyIHNob3dzIHRoZW0sIGJlY2F1c2UgTVRMTG9hZGVyIGJ1aWxkcyBQaG9uZyBtYXRlcmlhbHMgYW5kIE9CSkxvYWRlciB6ZXJvZXNcclxuICAgKiB0aGVpciBzcGVjdWxhciB3aGVuIHRoZSAubXRsIGRlY2xhcmVzIE5zIDAuXHJcbiAgICpcclxuICAgKiBDYXB0dXJlZCBtb2RlbHMgY2FycnkgdGhlaXIgbGlnaHRpbmcgaW4gdGhlIHRleHR1cmUgYW5kIHdhbnQgbm8gc3BlY3VsYXIgcmVzcG9uc2UgYXQgYWxsLCBzb1xyXG4gICAqIG1hdGNoaW5nIHRoZSAub2JqIHBhdGggaGVyZSBpcyBib3RoIHRoZSBmaXggYW5kIHRoZSBtb3JlIGZhaXRoZnVsIGNob2ljZS5cclxuICAgKi9cclxuICBwcml2YXRlIGNvbnZlcnRUb1Bob25nTWF0ZXJpYWxzKHJvb3Q6IFRIUkVFLk9iamVjdDNEKTogdm9pZCB7XHJcbiAgICBjb25zdCBjb252ZXJ0ZWQgPSBuZXcgTWFwPGFueSwgVEhSRUUuTWVzaFBob25nTWF0ZXJpYWw+KCk7XHJcblxyXG4gICAgcm9vdC50cmF2ZXJzZSgoY2hpbGQpID0+IHtcclxuICAgICAgY29uc3QgbWVzaCA9IGNoaWxkIGFzIFRIUkVFLk1lc2g7XHJcbiAgICAgIGlmICghKG1lc2ggYXMgYW55KS5pc01lc2gpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IGNvbnZlcnQgPSAoc291cmNlOiBhbnkpOiBhbnkgPT4ge1xyXG4gICAgICAgIGlmICghc291cmNlIHx8ICEoc291cmNlIGFzIGFueSkuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbCkge1xyXG4gICAgICAgICAgcmV0dXJuIHNvdXJjZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFjb252ZXJ0ZWQuaGFzKHNvdXJjZSkpIHtcclxuICAgICAgICAgIGNvbnN0IHBob25nID0gbmV3IFRIUkVFLk1lc2hQaG9uZ01hdGVyaWFsKHtcclxuICAgICAgICAgICAgbWFwOiBzb3VyY2UubWFwLFxyXG4gICAgICAgICAgICBjb2xvcjogc291cmNlLmNvbG9yLFxyXG4gICAgICAgICAgICB0cmFuc3BhcmVudDogc291cmNlLnRyYW5zcGFyZW50LFxyXG4gICAgICAgICAgICBvcGFjaXR5OiBzb3VyY2Uub3BhY2l0eSxcclxuICAgICAgICAgICAgYWxwaGFUZXN0OiBzb3VyY2UuYWxwaGFUZXN0LFxyXG4gICAgICAgICAgICBzaWRlOiBzb3VyY2Uuc2lkZSxcclxuICAgICAgICAgICAgc3BlY3VsYXI6IG5ldyBUSFJFRS5Db2xvcigweDAwMDAwMCksXHJcbiAgICAgICAgICAgIHNoaW5pbmVzczogMCxcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgcGhvbmcubmFtZSA9IHNvdXJjZS5uYW1lO1xyXG4gICAgICAgICAgY29udmVydGVkLnNldChzb3VyY2UsIHBob25nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGNvbnZlcnRlZC5nZXQoc291cmNlKTtcclxuICAgICAgfTtcclxuXHJcbiAgICAgIG1lc2gubWF0ZXJpYWwgPSBBcnJheS5pc0FycmF5KG1lc2gubWF0ZXJpYWwpXHJcbiAgICAgICAgPyBtZXNoLm1hdGVyaWFsLm1hcChjb252ZXJ0KVxyXG4gICAgICAgIDogY29udmVydChtZXNoLm1hdGVyaWFsKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVuZGVycyBldmVyeSBtYXRlcmlhbCBkb3VibGUtc2lkZWQuXHJcbiAgICpcclxuICAgKiBSZWFsaXR5IGNhcHR1cmUgbWVzaGVzIHJvdXRpbmVseSBjb250YWluIHRyaWFuZ2xlcyB3aXRoIHJldmVyc2VkIHdpbmRpbmcgLSBhbiBhcnRlZmFjdCBvZiB0aGVcclxuICAgKiByZWNvbnN0cnVjdGlvbiwgbm90IG9mIHRoZSBmaWxlLiBXaXRoIHRoZSBkZWZhdWx0IEZyb250U2lkZSB0aG9zZSB0cmlhbmdsZXMgYXJlIGN1bGxlZCwgbGVhdmluZ1xyXG4gICAqIHNjYXR0ZXJlZCBob2xlcyB0aGF0IHNob3cgdGhlIHNjZW5lIGJhY2tncm91bmQgdGhyb3VnaCB0aGUgbW9kZWwuIEFnYWluc3QgYSBsaWdodCBiYWNrZ3JvdW5kXHJcbiAgICogdGhleSByZWFkIGFzIHdoaXRlIHNwZWNrcyB3aXRoIG5vIGRpc2Nlcm5pYmxlIHBhdHRlcm4uXHJcbiAgICpcclxuICAgKiBEcmF3aW5nIGJvdGggc2lkZXMgY29zdHMgYSBsaXR0bGUgZmlsbCByYXRlIGJ1dCBpcyB3aGF0IG1ha2VzIGNhcHR1cmVkIGdlb21ldHJ5IHJlbmRlciBhc1xyXG4gICAqIHNvbGlkOyBvdGhlciB2aWV3ZXJzIG9mIHRoaXMga2luZCBvZiBjb250ZW50IGRvIHRoZSBzYW1lIHVuY29uZGl0aW9uYWxseS5cclxuICAgKi9cclxuICBwcml2YXRlIGZvcmNlRG91YmxlU2lkZWRNYXRlcmlhbHMocm9vdDogVEhSRUUuT2JqZWN0M0QpOiB2b2lkIHtcclxuICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0PGFueT4oKTtcclxuICAgIHJvb3QudHJhdmVyc2UoKGNoaWxkKSA9PiB7XHJcbiAgICAgIGNvbnN0IG1lc2ggPSBjaGlsZCBhcyBUSFJFRS5NZXNoO1xyXG4gICAgICBpZiAoIShtZXNoIGFzIGFueSkuaXNNZXNoKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IG1hdGVyaWFscyA9IEFycmF5LmlzQXJyYXkobWVzaC5tYXRlcmlhbCkgPyBtZXNoLm1hdGVyaWFsIDogW21lc2gubWF0ZXJpYWxdO1xyXG4gICAgICBtYXRlcmlhbHMuZm9yRWFjaCgobWF0ZXJpYWw6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChtYXRlcmlhbCAmJiAhc2Vlbi5oYXMobWF0ZXJpYWwpKSB7XHJcbiAgICAgICAgICBzZWVuLmFkZChtYXRlcmlhbCk7XHJcbiAgICAgICAgICBtYXRlcmlhbC5zaWRlID0gVEhSRUUuRG91YmxlU2lkZTtcclxuICAgICAgICAgIG1hdGVyaWFsLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDb21wdXRlcyByZWFsIHZlcnRleCBub3JtYWxzIGZvciBhbnkgZ2VvbWV0cnkgdGhhdCBhcnJpdmVkIHdpdGhvdXQgdGhlbS5cclxuICAgKlxyXG4gICAqIEEgZ2xURiB3aXRob3V0IGEgTk9STUFMIGF0dHJpYnV0ZSBpcyBzcGVjLWNvbXBsaWFudCwgYW5kIEdMVEZMb2FkZXIgaGFuZGxlcyBpdCBieSBzd2l0Y2hpbmcgdGhlXHJcbiAgICogbWF0ZXJpYWwgdG8gZmxhdFNoYWRpbmcsIHdoaWNoIG1ha2VzIHRoZSBzaGFkZXIgZGVyaXZlIHRoZSBub3JtYWwgcGVyIHBpeGVsIGZyb20gc2NyZWVuLXNwYWNlXHJcbiAgICogZGVyaXZhdGl2ZXMuIFRoYXQgZGVyaXZhdGlvbiBjb2xsYXBzZXMgb24gdGhlIGRlZ2VuZXJhdGUsIG5lZWRsZS10aGluIHRyaWFuZ2xlcyB0aGF0IHJlYWxpdHlcclxuICAgKiBjYXB0dXJlIG1lc2hlcyBhcmUgZnVsbCBvZjogdGhlIGZhY2UgaGFzIGFsbW9zdCBubyBhcmVhLCB0aGUgZGVyaXZlZCBub3JtYWwgaXMgbWVhbmluZ2xlc3MsIGFuZFxyXG4gICAqIGxpZ2h0aW5nIGJsb3dzIHRob3NlIGZyYWdtZW50cyBvdXQgdG8gd2hpdGUgc3BlY2tzIC0gZGVuc2VzdCBleGFjdGx5IHdoZXJlIGZpbmUgZGV0YWlsIGlzLlxyXG4gICAqXHJcbiAgICogQ29tcHV0aW5nIG5vcm1hbHMgZnJvbSB0aGUgZ2VvbWV0cnkgaW5zdGVhZCBpcyByb2J1c3QgdG8gdGhvc2UgdHJpYW5nbGVzLCBzaW5jZSBhIGRlZ2VuZXJhdGVcclxuICAgKiBmYWNlIGNvbnRyaWJ1dGVzIGFsbW9zdCBub3RoaW5nIHRvIHRoZSBhdmVyYWdlIGFuZCBpdHMgbmVpZ2hib3VycyBkb21pbmF0ZS5cclxuICAgKi9cclxuICBwcml2YXRlIGVuc3VyZVZlcnRleE5vcm1hbHMocm9vdDogVEhSRUUuT2JqZWN0M0QpOiB2b2lkIHtcclxuICAgIHJvb3QudHJhdmVyc2UoKGNoaWxkKSA9PiB7XHJcbiAgICAgIGNvbnN0IG1lc2ggPSBjaGlsZCBhcyBUSFJFRS5NZXNoO1xyXG4gICAgICBpZiAoIShtZXNoIGFzIGFueSkuaXNNZXNoKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IGdlb21ldHJ5ID0gbWVzaC5nZW9tZXRyeSBhcyBUSFJFRS5CdWZmZXJHZW9tZXRyeTtcclxuICAgICAgaWYgKGdlb21ldHJ5LmdldEF0dHJpYnV0ZSgnbm9ybWFsJykpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGdlb21ldHJ5LmNvbXB1dGVWZXJ0ZXhOb3JtYWxzKCk7XHJcblxyXG4gICAgICAvLyBHTFRGTG9hZGVyIGFscmVhZHkgc3dpdGNoZWQgdGhlc2UgbWF0ZXJpYWxzIHRvIGZsYXRTaGFkaW5nIGJlY2F1c2Ugbm9ybWFscyB3ZXJlIG1pc3Npbmc7XHJcbiAgICAgIC8vIG5vdyB0aGF0IHJlYWwgb25lcyBleGlzdCwgbGV0IHRoZW0gYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSBkZXJpdmF0aXZlIGZhbGxiYWNrLlxyXG4gICAgICBjb25zdCBtYXRlcmlhbHMgPSBBcnJheS5pc0FycmF5KG1lc2gubWF0ZXJpYWwpID8gbWVzaC5tYXRlcmlhbCA6IFttZXNoLm1hdGVyaWFsXTtcclxuICAgICAgbWF0ZXJpYWxzLmZvckVhY2goKG1hdGVyaWFsOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAobWF0ZXJpYWwgJiYgbWF0ZXJpYWwuZmxhdFNoYWRpbmcpIHtcclxuICAgICAgICAgIG1hdGVyaWFsLmZsYXRTaGFkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICBtYXRlcmlhbC5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ29uZmlndXJlcyBob3cgZXZlcnkgdGV4dHVyZSBpbiBhIG1vZGVsIGlzIHNhbXBsZWQ6IG1heGltdW0gYW5pc290cm9weSwgYW5kIG5vIG1pcG1hcHBpbmcuXHJcbiAgICpcclxuICAgKiBQaG90b2dyYW1tZXRyeSBhdGxhc2VzIHBhY2sgdGhlaXIgVVYgaXNsYW5kcyB3aXRoIHVudXNlZCBndXR0ZXIgcGl4ZWxzIGJldHdlZW4gdGhlbS4gTWlwbWFwcGluZ1xyXG4gICAqIGF2ZXJhZ2VzIG5laWdoYm91cmluZyBwaXhlbHMgYXQgZWFjaCBsZXZlbCwgc28gdGhvc2UgZ3V0dGVycyBibGVlZCBmdXJ0aGVyIGludG8gdGhlIGlzbGFuZHMgdGhlXHJcbiAgICogc21hbGxlciB0aGUgbGV2ZWwgZ2V0cyAtIGFuZCB2aWV3aW5nIHRoZSB3aG9sZSBtb2RlbCBhdCBvbmNlIHVzZXMgdGhlIHNtYWxsZXN0IGxldmVscywgcGFpbnRpbmdcclxuICAgKiBicmlnaHQgZ3V0dGVyIHBpeGVscyBvdmVyIHRoZSBlZGdlcyBvZiBmaW5lIGRldGFpbC4gU2FtcGxpbmcgdGhlIGZ1bGwtcmVzb2x1dGlvbiBpbWFnZSBhdm9pZHNcclxuICAgKiB0aGF0LCBhdCB0aGUgY29zdCBvZiBzb21lIHNoaW1tZXIgb24gbWluaWZpZWQgc3VyZmFjZXMuXHJcbiAgICpcclxuICAgKiBOb3RlIHRoYXQgYW5pc290cm9weSBvbmx5IHRha2VzIGVmZmVjdCB3aGlsZSBtaXBtYXBwaW5nIGlzIG9uLCBzbyB3aXRoIHRoZSBzZXR0aW5ncyBiZWxvdyBpdCBpc1xyXG4gICAqIGluZXJ0OyBpdCBpcyBzZXQgYW55d2F5IHNvIHRoZSBzYW1wbGluZyBzdGF5cyBjb3JyZWN0IGZvciBhbnlvbmUgd2hvIHJlLWVuYWJsZXMgbWlwbWFwcyBoZXJlLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgdHVuZVRleHR1cmVTYW1wbGluZyhyb290OiBUSFJFRS5PYmplY3QzRCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLnJlbmRlcmVyKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IG1heEFuaXNvdHJvcHkgPSB0aGlzLnJlbmRlcmVyLmNhcGFiaWxpdGllcy5nZXRNYXhBbmlzb3Ryb3B5KCk7XHJcbiAgICBpZiAoIW1heEFuaXNvdHJvcHkgfHwgbWF4QW5pc290cm9weSA8PSAxKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBzZWVuID0gbmV3IFNldDxhbnk+KCk7XHJcbiAgICByb290LnRyYXZlcnNlKChjaGlsZCkgPT4ge1xyXG4gICAgICBjb25zdCBtZXNoID0gY2hpbGQgYXMgVEhSRUUuTWVzaDtcclxuICAgICAgaWYgKCEobWVzaCBhcyBhbnkpLmlzTWVzaCkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBtYXRlcmlhbHMgPSBBcnJheS5pc0FycmF5KG1lc2gubWF0ZXJpYWwpID8gbWVzaC5tYXRlcmlhbCA6IFttZXNoLm1hdGVyaWFsXTtcclxuICAgICAgbWF0ZXJpYWxzLmZvckVhY2goKG1hdGVyaWFsOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAoIW1hdGVyaWFsKSB7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFNhbWUgdGV4dHVyZSBpcyByZXVzZWQgYWNyb3NzIHRoZSBtb2RlbCdzIG1hdGVyaWFsczsgb25seSB0b3VjaCBlYWNoIG9uZSBvbmNlLlxyXG4gICAgICAgIFsnbWFwJywgJ25vcm1hbE1hcCcsICdyb3VnaG5lc3NNYXAnLCAnbWV0YWxuZXNzTWFwJywgJ2VtaXNzaXZlTWFwJywgJ2FvTWFwJ10uZm9yRWFjaCgoc2xvdCkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgdGV4dHVyZSA9IG1hdGVyaWFsW3Nsb3RdO1xyXG4gICAgICAgICAgaWYgKHRleHR1cmUgJiYgIXNlZW4uaGFzKHRleHR1cmUpKSB7XHJcbiAgICAgICAgICAgIHNlZW4uYWRkKHRleHR1cmUpO1xyXG4gICAgICAgICAgICB0ZXh0dXJlLmFuaXNvdHJvcHkgPSBtYXhBbmlzb3Ryb3B5O1xyXG4gICAgICAgICAgICB0ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0ZXh0dXJlLm1pbkZpbHRlciA9IFRIUkVFLkxpbmVhckZpbHRlcjtcclxuICAgICAgICAgICAgdGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBMb2FkcyBhbiBPQkogbW9kZWwgd2l0aCBNVEwuXHJcbiAgICogVGhlIGhlYXZ5IHRleHQtcGFyc2luZyBzdGVwIHJ1bnMgaW4gYSBXZWIgV29ya2VyIHdoZW4gb25lIGhhcyBiZWVuIHJlZ2lzdGVyZWQgdmlhXHJcbiAgICogc2V0T2JqUGFyc2VyV29ya2VyIChzZWUgdGhlcmUgZm9yIHdoeSB0aGUgYXBwLCBub3QgdGhpcyBsaWJyYXJ5LCBwcm92aWRlcyBpdCk7IHRoaXMga2VlcHNcclxuICAgKiB0aGUgbWFpbiB0aHJlYWQgZnJlZSB3aGlsZSBsYXJnZSBhcmNoaXRlY3R1cmUgbW9kZWxzIChtaWxsaW9ucyBvZiB2ZXJ0aWNlcykgYXJlIHBhcnNlZC5cclxuICAgKiBGYWxscyBiYWNrIHRvIHBhcnNpbmcgb24gdGhlIG1haW4gdGhyZWFkIG90aGVyd2lzZS5cclxuICAgKi9cclxuICBsb2FkT2JqTW9kZWwobXRsVXJsOiBzdHJpbmcsIG9ialVybDogc3RyaW5nLCBjYW1lcmFQb3NpdGlvbj86IHt4OiBudW1iZXIsIHk6IG51bWJlciwgejogbnVtYmVyfSwgcm90YXRpb24/OiB7eDogbnVtYmVyLCB5OiBudW1iZXIsIHo6IG51bWJlcn0pOiB2b2lkIHtcclxuICAgIGNvbnN0IG10bExvYWRlciA9IG5ldyBNVExMb2FkZXIoKTtcclxuICAgIGNvbnN0IGJhc2VQYXRoID0gbXRsVXJsLnN1YnN0cmluZygwLCBtdGxVcmwubGFzdEluZGV4T2YoJy8nKSArIDEpO1xyXG4gICAgbXRsTG9hZGVyLnNldFBhdGgoYmFzZVBhdGgpO1xyXG4gICAgY29uc3QgbXRsRmlsZU5hbWUgPSBtdGxVcmwuc3Vic3RyaW5nKG10bFVybC5sYXN0SW5kZXhPZignLycpICsgMSk7XHJcblxyXG4gICAgdGhpcy5tb2RlbExvYWRpbmckLm5leHQodHJ1ZSk7XHJcblxyXG4gICAgbXRsTG9hZGVyLmxvYWQobXRsRmlsZU5hbWUsIChtYXRlcmlhbHMpID0+IHtcclxuICAgICAgbWF0ZXJpYWxzLnByZWxvYWQoKTtcclxuXHJcbiAgICAgIGlmICh0aGlzLm9ialBhcnNlcldvcmtlcikge1xyXG4gICAgICAgIHRoaXMucmVxdWVzdE9ialBhcnNlSW5Xb3JrZXIob2JqVXJsKVxyXG4gICAgICAgICAgLnRoZW4oKG1lc2hlcykgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBncm91cCA9IG5ldyBUSFJFRS5Hcm91cCgpO1xyXG4gICAgICAgICAgICBtZXNoZXMuZm9yRWFjaCgobWVzaERhdGEpID0+IHtcclxuICAgICAgICAgICAgICBncm91cC5hZGQodGhpcy5tZXNoRnJvbVBhcnNlZERhdGEobWVzaERhdGEsIG1hdGVyaWFscykpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdGhpcy5wbGFjZUxvYWRlZE9iamVjdEluU2NlbmUoZ3JvdXAsIGNhbWVyYVBvc2l0aW9uLCByb3RhdGlvbik7XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBwYXJzaW5nIE9CSiBtb2RlbCBpbiB3b3JrZXI6JywgZXJyb3IpO1xyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIC5maW5hbGx5KCgpID0+IHRoaXMubW9kZWxMb2FkaW5nJC5uZXh0KGZhbHNlKSk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBvYmpMb2FkZXIgPSBuZXcgT0JKTG9hZGVyKCk7XHJcbiAgICAgIG9iakxvYWRlci5zZXRNYXRlcmlhbHMobWF0ZXJpYWxzKTtcclxuXHJcbiAgICAgIG9iakxvYWRlci5sb2FkKG9ialVybCwgKG9iamVjdCkgPT4ge1xyXG4gICAgICAgIHRoaXMucGxhY2VMb2FkZWRPYmplY3RJblNjZW5lKG9iamVjdCwgY2FtZXJhUG9zaXRpb24sIHJvdGF0aW9uKTtcclxuICAgICAgICB0aGlzLm1vZGVsTG9hZGluZyQubmV4dChmYWxzZSk7XHJcbiAgICAgIH0sIHVuZGVmaW5lZCwgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgbG9hZGluZyBPQkogbW9kZWw6JywgZXJyb3IpO1xyXG4gICAgICAgIHRoaXMubW9kZWxMb2FkaW5nJC5uZXh0KGZhbHNlKTtcclxuICAgICAgfSk7XHJcbiAgICB9LCB1bmRlZmluZWQsIChlcnJvcikgPT4ge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBsb2FkaW5nIE1UTCBmaWxlOicsIGVycm9yKTtcclxuICAgICAgdGhpcy5tb2RlbExvYWRpbmckLm5leHQoZmFsc2UpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKiogQ2VudGVycywgc2NhbGVzIGFuZCBhZGRzIGEgbG9hZGVkIG9iamVjdCB0byB0aGUgc2NlbmUsIHRoZW4gZnJhbWVzIHRoZSBjYW1lcmEgb24gaXQuICovXHJcbiAgcHJpdmF0ZSBwbGFjZUxvYWRlZE9iamVjdEluU2NlbmUob2JqZWN0OiBUSFJFRS5PYmplY3QzRCwgY2FtZXJhUG9zaXRpb24/OiB7eDogbnVtYmVyLCB5OiBudW1iZXIsIHo6IG51bWJlcn0sIHJvdGF0aW9uPzoge3g6IG51bWJlciwgeTogbnVtYmVyLCB6OiBudW1iZXJ9LCB1cD86IFRocmVlSnNNb2RlbFVwKTogdm9pZCB7XHJcbiAgICBjb25zdCBib3ggPSBuZXcgVEhSRUUuQm94MygpLnNldEZyb21PYmplY3Qob2JqZWN0KTtcclxuICAgIGNvbnN0IGNlbnRlciA9IGJveC5nZXRDZW50ZXIobmV3IFRIUkVFLlZlY3RvcjMoKSk7XHJcbiAgICBjb25zdCBzaXplID0gYm94LmdldFNpemUobmV3IFRIUkVFLlZlY3RvcjMoKSk7XHJcbiAgICBjb25zdCBtYXhEaW0gPSBNYXRoLm1heChzaXplLngsIHNpemUueSwgc2l6ZS56KTtcclxuICAgIGNvbnN0IHNjYWxlID0gbWF4RGltID4gMCA/IDEwIC8gbWF4RGltIDogMTtcclxuXHJcbiAgICAvLyBUd28gbmVzdGVkIGdyb3VwcyBzbyB0YWdzIGNhbiBzaGFyZSB0aGUgbW9kZWwncyBmcmFtZTogYGNlbnRlcmVkYCBjYXJyaWVzIHRoZSBvZmZzZXQgdGhhdFxyXG4gICAgLy8gbW92ZXMgdGhlIG1vZGVsJ3Mgb3duIG9yaWdpbiB0byB0aGUgc2NlbmUgb3JpZ2luLCBgZ3JvdXBgIGNhcnJpZXMgdGhlIHNjYWxlLiBBIHRhZyBwb3NpdGlvbmVkXHJcbiAgICAvLyB3aXRoIHJhdyBQT0kgY29vcmRpbmF0ZXMgdGhlbiBsYW5kcyBpbiB0aGUgc2FtZSBwbGFjZSB0aGUgbW9kZWwncyBnZW9tZXRyeSBkb2VzLlxyXG4gICAgY29uc3QgZ3JvdXAgPSBuZXcgVEhSRUUuR3JvdXAoKTtcclxuICAgIGNvbnN0IGNlbnRlcmVkID0gbmV3IFRIUkVFLkdyb3VwKCk7XHJcbiAgICBjZW50ZXJlZC5wb3NpdGlvbi5zdWIoY2VudGVyKTtcclxuXHJcbiAgICBpZiAocm90YXRpb24pIHtcclxuICAgICAgb2JqZWN0LnJvdGF0aW9uLnNldChyb3RhdGlvbi54LCByb3RhdGlvbi55LCByb3RhdGlvbi56KTtcclxuICAgIH1cclxuICAgIC8vIFdoaWNoIHdheSBpcyB1cC4gQSBjaG9pY2Ugc29tZW9uZSBtYWRlIGJ5IGhhbmQgYWx3YXlzIHdpbnM7IG90aGVyd2lzZSwgdW5sZXNzIHRoZSBtb2RlbCBjYW1lXHJcbiAgICAvLyB3aXRoIGFuIG9yaWVudGF0aW9uIG9mIGl0cyBvd24sIGl0IGlzIHdvcmtlZCBvdXQgZnJvbSB0aGUgZ2VvbWV0cnkuIEFwcGxpZWQgdG8gdGhlIG91dGVyXHJcbiAgICAvLyBncm91cCwgYWJvdmUgYm90aCB0aGUgbW9kZWwgYW5kIHRoZSB0YWdzOiB0aGV5IHR1cm4gdG9nZXRoZXIsIGFuZCBldmVyeSBjb29yZGluYXRlIGFscmVhZHlcclxuICAgIC8vIHN0b3JlZCAtIHRhZyBwb3NpdGlvbnMsIHRoZSBjYWxpYnJhdGlvbiAtIGtlZXBzIG1lYW5pbmcgd2hhdCBpdCBtZWFudC5cclxuICAgIHRoaXMubW9kZWxHcm91cCA9IGdyb3VwO1xyXG4gICAgdGhpcy5tb2RlbFVwID0gdXAgPz8gKHJvdGF0aW9uID8gJ3knIDogdGhpcy5kZXRlY3RNb2RlbFVwKG9iamVjdCwgc2l6ZSkpO1xyXG4gICAgZ3JvdXAucXVhdGVybmlvbi5jb3B5KHRoaXMudXByaWdodFJvdGF0aW9uKHRoaXMubW9kZWxVcCkpO1xyXG5cclxuICAgIHRoaXMubW9kZWxSb290ID0gb2JqZWN0O1xyXG4gICAgdGhpcy5tb2RlbFdvcmxkUmFkaXVzID0gKHNpemUubGVuZ3RoKCkgLyAyKSAqIHNjYWxlO1xyXG4gICAgLy8gVGhlIGJveCBhYm92ZSB3YXMgbWVhc3VyZWQgYmVmb3JlIGFueSByb3RhdGlvbiBmcm9tIHRoZSBtZXRhZGF0YSB3YXMgYXBwbGllZDsgd2l0aCBvbmUsIGl0XHJcbiAgICAvLyBoYXMgdG8gYmUgbWVhc3VyZWQgYWdhaW4gdG8gYmUgdGhlIG1vZGVsIGFzIGl0IGFjdHVhbGx5IHNpdHMuXHJcbiAgICB0aGlzLmJ1aWxkU3VyZmFjZUdyaWQob2JqZWN0LCByb3RhdGlvbiA/IG5ldyBUSFJFRS5Cb3gzKCkuc2V0RnJvbU9iamVjdChvYmplY3QpIDogYm94KTtcclxuICAgIHRoaXMucmVmcmVzaFRhZ1Zpc2liaWxpdHkoKTtcclxuICAgIC8vIE1hcmtzIHRoZSBtb2RlbCBmb3IgdGhlIGRlcHRoIHBpY2ssIHdoaWNoIHJlbmRlcnMgdGhpcyBsYXllciBhbG9uZSAtIHNvIHRhZ3MgYW5kIHRoZSBnaG9zdFxyXG4gICAgLy8gaXRzZWxmIGNhbm5vdCBlbmQgdXAgYmVpbmcgd2hhdCB0aGUgY3Vyc29yIHJlcG9ydHMgYXMgdGhlIHN1cmZhY2UgdW5kZXIgaXQuXHJcbiAgICBvYmplY3QudHJhdmVyc2UoKGNoaWxkKSA9PiBjaGlsZC5sYXllcnMuZW5hYmxlKFRocmVlSnNTZXJ2aWNlLlBJQ0tfTEFZRVIpKTtcclxuICAgIGNlbnRlcmVkLmFkZChvYmplY3QpO1xyXG4gICAgY2VudGVyZWQuYWRkKHRoaXMudGFnR3JvdXApO1xyXG4gICAgY2VudGVyZWQuYWRkKHRoaXMubW9kZWxUYWdHcm91cCk7XHJcbiAgICBncm91cC5hZGQoY2VudGVyZWQpO1xyXG4gICAgZ3JvdXAuc2NhbGUuc2V0U2NhbGFyKHNjYWxlKTtcclxuXHJcbiAgICB0aGlzLnNjZW5lLmFkZChncm91cCk7XHJcblxyXG4gICAgLy8gVGFncyByZWdpc3RlcmVkIGJlZm9yZSB0aGUgbW9kZWwgZmluaXNoZWQgbG9hZGluZyB3ZXJlIHNpemVkIGFnYWluc3QgdGhlIG9sZCBzY2FsZS5cclxuICAgIHRoaXMudGFnU3ByaXRlcy5mb3JFYWNoKChzcHJpdGUpID0+IHRoaXMuc2NhbGVUYWdGb3JNb2RlbChzcHJpdGUpKTtcclxuXHJcbiAgICB0aGlzLmFkanVzdENsaXBwaW5nUGxhbmVzKChzaXplLmxlbmd0aCgpIC8gMikgKiBzY2FsZSk7XHJcblxyXG4gICAgaWYgKGNhbWVyYVBvc2l0aW9uKSB7XHJcbiAgICAgIHRoaXMuY2FtZXJhLnBvc2l0aW9uLnNldChjYW1lcmFQb3NpdGlvbi54LCBjYW1lcmFQb3NpdGlvbi55LCBjYW1lcmFQb3NpdGlvbi56KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuY2FtZXJhLnBvc2l0aW9uLnNldCgwLCA1LCAxNSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmNvbnRyb2xzLnRhcmdldC5zZXQoMCwgMCwgMCk7XHJcbiAgICB0aGlzLmNvbnRyb2xzLnVwZGF0ZSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogV2hpY2ggb2YgdGhlIG1vZGVsJ3MgYXhlcyBpcyBpdHMgdmVydGljYWw6ICd5JyB3aGVuIGl0IGFscmVhZHkgc3RhbmRzIHVwcmlnaHQsIG9yIHdoZW4gaXQgaXNcclxuICAgKiBub3QgY2xlYXIgZW5vdWdoIHRvIGFjdCBvbi5cclxuICAgKlxyXG4gICAqIE1vZGVscyBhcnJpdmUgaW4gdHdvIGNvbnZlbnRpb25zOiBZIHVwIChnbFRGLCBhbmQgd2hhdCB0aGlzIHZpZXdlciBhc3N1bWVzKSBhbmQgWiB1cCAobW9zdCBDQURcclxuICAgKiBhbmQgc2Nhbm5pbmcgZXhwb3J0cykuIEEgWi11cCBtb2RlbCBsb2FkcyBseWluZyBvbiBpdHMgc2lkZS4gVHdvIGluZGVwZW5kZW50IGN1ZXMgc2F5IHdoaWNoXHJcbiAgICogYXhpcyBpcyB0aGUgdmVydGljYWwgb25lLCBhbmQgYm90aCBoYXZlIHRvIGFncmVlIGJlZm9yZSBhbnl0aGluZyBpcyB0dXJuZWQ6XHJcbiAgICpcclxuICAgKiAgLSBTdXJmYWNlIGFyZWEuIEZsb29ycyBhbmQgY2VpbGluZ3MgYWxsIGZhY2UgYWxvbmcgdGhlIHZlcnRpY2FsLCB3aGlsZSB3YWxscyBhcmUgc2hhcmVkIG91dFxyXG4gICAqICAgIGJldHdlZW4gdGhlIHR3byBob3Jpem9udGFsIGF4ZXMsIHNvIHRoZSB2ZXJ0aWNhbCB1c3VhbGx5IGNvbGxlY3RzIHRoZSBtb3N0IGFyZWEuXHJcbiAgICogIC0gRXh0ZW50LiBBIGJ1aWxkaW5nIGlzIG5vcm1hbGx5IHdpZGVyIHRoYW4gaXQgaXMgdGFsbCwgc28gdGhlIHZlcnRpY2FsIGlzIGl0cyBzaG9ydGVzdCBzaWRlLlxyXG4gICAqXHJcbiAgICogRWl0aGVyIGFsb25lIGlzIHdyb25nIG9mdGVuIGVub3VnaCB0byBtYXR0ZXIgLSBhIGxvbmcgY29ycmlkb3IgaGFzIG1vcmUgd2FsbCB0aGFuIGZsb29yLCBhXHJcbiAgICogdG93ZXIgaXMgdGFsbGVyIHRoYW4gaXQgaXMgd2lkZSAtIGFuZCB0dXJuaW5nIGEgbW9kZWwgdGhhdCB3YXMgZmluZSBpcyB3b3JzZSB0aGFuIGxlYXZpbmcgb25lXHJcbiAgICogdGhhdCB3YXMgbm90LiBBIG1vZGVsIHRoYXQgYWxyZWFkeSBoYXMgWSBhcyBpdHMgdmVydGljYWwgaXMgbmV2ZXIgdG91Y2hlZC5cclxuICAgKi9cclxuICBwcml2YXRlIGRldGVjdE1vZGVsVXAob2JqZWN0OiBUSFJFRS5PYmplY3QzRCwgc2l6ZTogVEhSRUUuVmVjdG9yMyk6IFRocmVlSnNNb2RlbFVwIHtcclxuICAgIGNvbnN0IGF4ZXMgPSBbJ3gnLCAneScsICd6J10gYXMgY29uc3Q7XHJcbiAgICAvLyBQcm9qZWN0ZWQgYXJlYSBmYWNpbmcgZWFjaCB3YXkgYWxvbmcgZWFjaCBheGlzOiBbcG9zaXRpdmUsIG5lZ2F0aXZlXS5cclxuICAgIGNvbnN0IGFyZWEgPSB7IHg6IFswLCAwXSwgeTogWzAsIDBdLCB6OiBbMCwgMF0gfTtcclxuXHJcbiAgICBsZXQgdHJpYW5nbGVDb3VudCA9IDA7XHJcbiAgICBvYmplY3QudXBkYXRlTWF0cml4V29ybGQodHJ1ZSk7XHJcbiAgICBvYmplY3QudHJhdmVyc2UoKGNoaWxkOiBhbnkpID0+IHtcclxuICAgICAgY29uc3QgcG9zaXRpb24gPSBjaGlsZC5pc01lc2ggJiYgY2hpbGQuZ2VvbWV0cnk/LmF0dHJpYnV0ZXM/LnBvc2l0aW9uO1xyXG4gICAgICBpZiAocG9zaXRpb24pIHtcclxuICAgICAgICB0cmlhbmdsZUNvdW50ICs9IChjaGlsZC5nZW9tZXRyeS5pbmRleCA/IGNoaWxkLmdlb21ldHJ5LmluZGV4LmNvdW50IDogcG9zaXRpb24uY291bnQpIC8gMztcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICBpZiAodHJpYW5nbGVDb3VudCA9PT0gMCkge1xyXG4gICAgICByZXR1cm4gJ3knO1xyXG4gICAgfVxyXG4gICAgLy8gQSBzYW1wbGUgaXMgcGxlbnR5IHRvIHNlZSB3aGVyZSB0aGUgYXJlYSBsaWVzLCBhbmQga2VlcHMgdGhpcyBjaGVhcCBvbiBtb2RlbHMgd2l0aCBtaWxsaW9uc1xyXG4gICAgLy8gb2YgdHJpYW5nbGVzLlxyXG4gICAgY29uc3Qgc3RyaWRlID0gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKHRyaWFuZ2xlQ291bnQgLyAyMDAwMDApKTtcclxuXHJcbiAgICBjb25zdCBhID0gbmV3IFRIUkVFLlZlY3RvcjMoKTtcclxuICAgIGNvbnN0IGIgPSBuZXcgVEhSRUUuVmVjdG9yMygpO1xyXG4gICAgY29uc3QgYyA9IG5ldyBUSFJFRS5WZWN0b3IzKCk7XHJcbiAgICBjb25zdCBub3JtYWwgPSBuZXcgVEhSRUUuVmVjdG9yMygpO1xyXG4gICAgb2JqZWN0LnRyYXZlcnNlKChjaGlsZDogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IHBvc2l0aW9uID0gY2hpbGQuaXNNZXNoICYmIGNoaWxkLmdlb21ldHJ5Py5hdHRyaWJ1dGVzPy5wb3NpdGlvbjtcclxuICAgICAgaWYgKCFwb3NpdGlvbikge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBpbmRleCA9IGNoaWxkLmdlb21ldHJ5LmluZGV4O1xyXG4gICAgICBjb25zdCBjb3VudCA9IChpbmRleCA/IGluZGV4LmNvdW50IDogcG9zaXRpb24uY291bnQpIC8gMztcclxuICAgICAgZm9yIChsZXQgdHJpYW5nbGUgPSAwOyB0cmlhbmdsZSA8IGNvdW50OyB0cmlhbmdsZSArPSBzdHJpZGUpIHtcclxuICAgICAgICBjb25zdCBvZmZzZXQgPSB0cmlhbmdsZSAqIDM7XHJcbiAgICAgICAgYS5mcm9tQnVmZmVyQXR0cmlidXRlKHBvc2l0aW9uLCBpbmRleCA/IGluZGV4LmdldFgob2Zmc2V0KSA6IG9mZnNldCkuYXBwbHlNYXRyaXg0KGNoaWxkLm1hdHJpeFdvcmxkKTtcclxuICAgICAgICBiLmZyb21CdWZmZXJBdHRyaWJ1dGUocG9zaXRpb24sIGluZGV4ID8gaW5kZXguZ2V0WChvZmZzZXQgKyAxKSA6IG9mZnNldCArIDEpLmFwcGx5TWF0cml4NChjaGlsZC5tYXRyaXhXb3JsZCk7XHJcbiAgICAgICAgYy5mcm9tQnVmZmVyQXR0cmlidXRlKHBvc2l0aW9uLCBpbmRleCA/IGluZGV4LmdldFgob2Zmc2V0ICsgMikgOiBvZmZzZXQgKyAyKS5hcHBseU1hdHJpeDQoY2hpbGQubWF0cml4V29ybGQpO1xyXG4gICAgICAgIC8vIFRoZSBjcm9zcyBwcm9kdWN0J3MgbGVuZ3RoIGlzIHR3aWNlIHRoZSB0cmlhbmdsZSdzIGFyZWEsIHNvIGl0cyBjb21wb25lbnRzIGFyZSB0aGVcclxuICAgICAgICAvLyBhcmVhIHRoZSB0cmlhbmdsZSBzaG93cyBhbG9uZyBlYWNoIGF4aXMuXHJcbiAgICAgICAgbm9ybWFsLmNyb3NzVmVjdG9ycyhiLnN1YihhKSwgYy5zdWIoYSkpO1xyXG4gICAgICAgIGF4ZXMuZm9yRWFjaCgoYXhpcykgPT4ge1xyXG4gICAgICAgICAgYXJlYVtheGlzXVtub3JtYWxbYXhpc10gPj0gMCA/IDAgOiAxXSArPSBNYXRoLmFicyhub3JtYWxbYXhpc10pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCB0b3RhbCA9IHsgeDogYXJlYS54WzBdICsgYXJlYS54WzFdLCB5OiBhcmVhLnlbMF0gKyBhcmVhLnlbMV0sIHo6IGFyZWEuelswXSArIGFyZWEuelsxXSB9O1xyXG4gICAgY29uc3QgYnlBcmVhID0gYXhlcy5yZWR1Y2UoKGJlc3QsIGF4aXMpID0+ICh0b3RhbFtheGlzXSA+IHRvdGFsW2Jlc3RdID8gYXhpcyA6IGJlc3QpLCAneScgYXMgdHlwZW9mIGF4ZXNbbnVtYmVyXSk7XHJcbiAgICBjb25zdCBieUV4dGVudCA9IGF4ZXMucmVkdWNlKChiZXN0LCBheGlzKSA9PiAoc2l6ZVtheGlzXSA8IHNpemVbYmVzdF0gPyBheGlzIDogYmVzdCksICd5JyBhcyB0eXBlb2YgYXhlc1tudW1iZXJdKTtcclxuICAgIGlmIChieUFyZWEgPT09ICd5JyB8fCBieUFyZWEgIT09IGJ5RXh0ZW50IHx8IHRvdGFsW2J5QXJlYV0gPCAxLjI1ICogdG90YWwueSkge1xyXG4gICAgICByZXR1cm4gJ3knO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFdoaWNoIHdheSBhbG9uZyB0aGF0IGF4aXMgaXMgdXAuIFJvb2ZzIGFuZCBncm91bmQgbWFrZSBhbiBvdXRkb29yIG1vZGVsIGZhY2UgbW9zdGx5IHVwd2FyZCxcclxuICAgIC8vIHdoaWNoIHNldHRsZXMgaXQ7IGluZG9vcnMgZmxvb3JzIGFuZCBjZWlsaW5ncyBiYWxhbmNlIG91dCwgYW5kIHRoZSBjb252ZW50aW9uIC0gcG9zaXRpdmUgaXNcclxuICAgIC8vIHVwIC0gaXMgdGhlIGJldHRlciBndWVzcy5cclxuICAgIGNvbnN0IFtwb3NpdGl2ZSwgbmVnYXRpdmVdID0gYXJlYVtieUFyZWFdO1xyXG4gICAgY29uc3QgdXAgPSBgJHtuZWdhdGl2ZSA+IDAuNjUgKiAocG9zaXRpdmUgKyBuZWdhdGl2ZSkgPyAnLScgOiAnJ30ke2J5QXJlYX1gIGFzIFRocmVlSnNNb2RlbFVwO1xyXG4gICAgY29uc29sZS5pbmZvKGBUaHJlZUpzU2VydmljZTogdGhpcyBtb2RlbCdzIHZlcnRpY2FsIGF4aXMgbG9va3MgbGlrZSAke3VwfSwgbm90IHkgLSBzdGFuZGluZyBpdCB1cHJpZ2h0LmApO1xyXG4gICAgcmV0dXJuIHVwO1xyXG4gIH1cclxuXHJcbiAgLyoqIFRoZSByb3RhdGlvbiB0aGF0IGJyaW5ncyB0aGUgZ2l2ZW4gbW9kZWwgYXhpcyB0byBwb2ludCB1cC4gKi9cclxuICBwcml2YXRlIHVwcmlnaHRSb3RhdGlvbih1cDogVGhyZWVKc01vZGVsVXApOiBUSFJFRS5RdWF0ZXJuaW9uIHtcclxuICAgIGNvbnN0IGF4aXMgPSBuZXcgVEhSRUUuVmVjdG9yMygpO1xyXG4gICAgYXhpc1t1cC5yZXBsYWNlKCctJywgJycpIGFzICd4JyB8ICd5JyB8ICd6J10gPSB1cC5zdGFydHNXaXRoKCctJykgPyAtMSA6IDE7XHJcbiAgICByZXR1cm4gbmV3IFRIUkVFLlF1YXRlcm5pb24oKS5zZXRGcm9tVW5pdFZlY3RvcnMoYXhpcywgbmV3IFRIUkVFLlZlY3RvcjMoMCwgMSwgMCkpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFdoaWNoIG9mIHRoZSBtb2RlbCdzIGF4ZXMgaXMgY3VycmVudGx5IHRyZWF0ZWQgYXMgdXAsIHdoZXRoZXIgY2hvc2VuIG9yIHdvcmtlZCBvdXQuICovXHJcbiAgZ2V0TW9kZWxVcCgpOiBUaHJlZUpzTW9kZWxVcCB7XHJcbiAgICByZXR1cm4gdGhpcy5tb2RlbFVwO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVHVybnMgdGhlIG1vZGVsIHNvIHRoZSBnaXZlbiBheGlzIHBvaW50cyB1cCwgYXQgb25jZS5cclxuICAgKlxyXG4gICAqIFRoZSBtb2RlbCBhbmQgaXRzIHRhZ3MgdHVybiBhcyBvbmUsIHNvIG5vdGhpbmcgc3RvcmVkIGhhcyB0byBiZSByZWNvbXB1dGVkLiBUaGUgY2FsbGVyIGlzXHJcbiAgICogZXhwZWN0ZWQgdG8gc3RvcmUgdGhlIGNob2ljZSwgb3IgdGhlIG5leHQgbG9hZCBnb2VzIGJhY2sgdG8gd29ya2luZyBpdCBvdXQuXHJcbiAgICovXHJcbiAgc2V0TW9kZWxVcCh1cDogVGhyZWVKc01vZGVsVXApOiB2b2lkIHtcclxuICAgIHRoaXMubW9kZWxVcCA9IHVwO1xyXG4gICAgdGhpcy5tb2RlbEdyb3VwPy5xdWF0ZXJuaW9uLmNvcHkodGhpcy51cHJpZ2h0Um90YXRpb24odXApKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEtlZXBzIHRoZSBkcmF3aW5nIGJ1ZmZlciBhbmQgY2FtZXJhIG1hdGNoZWQgdG8gdGhlIGNhbnZhcyBhcyBpdCBpcyByZXNpemVkLlxyXG4gICAqXHJcbiAgICogcmVuZGVyZXIuc2V0U2l6ZSgpIHdyaXRlcyBleHBsaWNpdCBwaXhlbCB3aWR0aC9oZWlnaHQgaW50byB0aGUgY2FudmFzJ3Mgc3R5bGUsIG92ZXJyaWRpbmcgdGhlXHJcbiAgICogMTAwJS8xMDAlIGl0IHN0YXJ0cyB3aXRoLiBXaXRob3V0IHRoaXMsIHRoZSBjYW52YXMga2VlcHMgd2hhdGV2ZXIgc2l6ZSBpdCBoYWQgYXQgc3RhcnR1cDogaGlkaW5nXHJcbiAgICogdGhlIHRvcCBtZW51IGdyb3dzIHRoZSBjb250YWluZXIsIHRoZSBjYW52YXMgZG9lcyBub3QgZm9sbG93LCBhbmQgdGhlIHN0cmlwIHRoYXQgb3BlbnMgdXAgc2hvd3NcclxuICAgKiB0aGUgcGFnZSBiZWhpbmQgaXQgaW5zdGVhZCBvZiB0aGUgc2NlbmUuXHJcbiAgICpcclxuICAgKiBUaGUgcGFyZW50IGlzIG9ic2VydmVkIHJhdGhlciB0aGFuIHRoZSBjYW52YXMsIGJlY2F1c2UgcmVzaXppbmcgdGhlIGNhbnZhcyBpcyB3aGF0IHRoaXMgcmVhY3RzXHJcbiAgICogdG8gLSB3YXRjaGluZyB0aGUgZWxlbWVudCB3ZSByZXNpemUgd291bGQgcmV0cmlnZ2VyIHRoZSBvYnNlcnZlci5cclxuICAgKi9cclxuICBwcml2YXRlIG9ic2VydmVDYW52YXNSZXNpemUoY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCk6IHZvaWQge1xyXG4gICAgY29uc3QgY29udGFpbmVyID0gY2FudmFzLnBhcmVudEVsZW1lbnQ7XHJcbiAgICBpZiAoIWNvbnRhaW5lciB8fCB0eXBlb2YgUmVzaXplT2JzZXJ2ZXIgPT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmNhbnZhc1Jlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKCgpID0+IHtcclxuICAgICAgY29uc3Qgd2lkdGggPSBjb250YWluZXIuY2xpZW50V2lkdGg7XHJcbiAgICAgIGNvbnN0IGhlaWdodCA9IGNvbnRhaW5lci5jbGllbnRIZWlnaHQ7XHJcbiAgICAgIGlmICh3aWR0aCA9PT0gMCB8fCBoZWlnaHQgPT09IDApIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5jYW1lcmEuYXNwZWN0ID0gd2lkdGggLyBoZWlnaHQ7XHJcbiAgICAgIHRoaXMuY2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTtcclxuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTaXplKHdpZHRoLCBoZWlnaHQpO1xyXG4gICAgICB0aGlzLnVwZGF0ZU1lYXN1cmVMaW5lUmVzb2x1dGlvbigpO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLmNhbnZhc1Jlc2l6ZU9ic2VydmVyLm9ic2VydmUoY29udGFpbmVyKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFN0YXJ0cyB0aGUgYWxpZ25tZW50IHdhbGt0aHJvdWdoOiBwaWNrIGEgdGFnLCB0aGVuIGNsaWNrIHdoZXJlIGl0IHJlYWxseSBpcywgdGhyZWUgdGltZXMuXHJcbiAgICpcclxuICAgKiBFeGlzdGluZyB0YWdzIGFyZSB0aGUgY29ycmVzcG9uZGVuY2VzIC0gdGhleSBhbHJlYWR5IGNhcnJ5IHRoZSBzdG9yZWQgY29vcmRpbmF0ZSwgc28gdGhlIHBlcnNvblxyXG4gICAqIG9ubHkgaGFzIHRvIHN1cHBseSB0aGUgbWF0Y2hpbmcgc3BvdCBvbiB0aGUgbW9kZWwuIE5vIG5ldyByZWNvcmRzIGFyZSB3cml0dGVuOyBub3RoaW5nIGlzXHJcbiAgICogYXBwbGllZCB1bnRpbCBzb2x2ZUFsaWdubWVudEZyb21QYWlycygpIHN1Y2NlZWRzLlxyXG4gICAqL1xyXG4gIHN0YXJ0VGFnQWxpZ25tZW50KCk6IHZvaWQge1xyXG4gICAgLy8gT25lIHBvaW50ZXIgbW9kZSBhdCBhIHRpbWUsIHRoZSBzYW1lIHJ1bGUgc3RhcnRNZWFzdXJpbmcoKSBhcHBsaWVzIHRoZSBvdGhlciB3YXkgcm91bmQuXHJcbiAgICBpZiAodGhpcy5tZWFzdXJpbmcpIHtcclxuICAgICAgdGhpcy5jYW5jZWxNZWFzdXJpbmcoKTtcclxuICAgIH1cclxuICAgIHRoaXMuYWxpZ25pbmcgPSB0cnVlO1xyXG4gICAgdGhpcy5hbGlnbm1lbnRQYWlycyA9IFtdO1xyXG4gICAgdGhpcy5hbGlnbm1lbnRTb3VyY2UgPSBudWxsO1xyXG4gICAgLy8gV2hpbGUgY2FsaWJyYXRpbmcsIHRoZSB0YWdzIGZyb20gZWxzZXdoZXJlIGFyZSBhbGwgc2hvd24gLSBpbmNsdWRpbmcgdGhlIG9uZXMgb2ZmIHRoZSBtb2RlbCxcclxuICAgIC8vIHdoaWNoIGFyZSBleGFjdGx5IHRoZSBvbmVzIGEgY2FsaWJyYXRpb24gaXMgZm9yLlxyXG4gICAgdGhpcy5yZWZyZXNoVGFnVmlzaWJpbGl0eSgpO1xyXG4gICAgaWYgKHRoaXMucmVuZGVyZXIpIHtcclxuICAgICAgdGhpcy5yZW5kZXJlci5kb21FbGVtZW50LnN0eWxlLmN1cnNvciA9ICdjcm9zc2hhaXInO1xyXG4gICAgfVxyXG4gICAgdGhpcy5hbGlnbm1lbnRQcm9ncmVzcyQubmV4dCh7IHBhaXJzOiAwLCBhd2FpdGluZzogJ3RhZycgfSk7XHJcbiAgfVxyXG5cclxuICBjYW5jZWxUYWdBbGlnbm1lbnQoKTogdm9pZCB7XHJcbiAgICBjb25zdCB3YXNBbGlnbmluZyA9IHRoaXMuYWxpZ25pbmc7XHJcbiAgICB0aGlzLmFsaWduaW5nID0gZmFsc2U7XHJcbiAgICB0aGlzLmFsaWdubWVudFBhaXJzID0gW107XHJcbiAgICB0aGlzLmFsaWdubWVudFNvdXJjZSA9IG51bGw7XHJcbiAgICB0aGlzLnBlbmRpbmdQcmV2aWV3RXZlbnQgPSBudWxsO1xyXG4gICAgdGhpcy5yZW1vdmVQbGFjZW1lbnRQcmV2aWV3KCk7XHJcbiAgICB0aGlzLnJlZnJlc2hUYWdWaXNpYmlsaXR5KCk7XHJcbiAgICBpZiAodGhpcy5yZW5kZXJlcikge1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLmRvbUVsZW1lbnQuc3R5bGUuY3Vyc29yID0gJ2RlZmF1bHQnO1xyXG4gICAgfVxyXG4gICAgdGhpcy5hbGlnbm1lbnRQcm9ncmVzcyQubmV4dCh7IHBhaXJzOiAwLCBhd2FpdGluZzogbnVsbCB9KTtcclxuICAgIGlmICh3YXNBbGlnbmluZykge1xyXG4gICAgICB0aGlzLmFsaWdubWVudENhbmNlbGxlZCQubmV4dCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaXNBbGlnbmluZ1RhZ3MoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5hbGlnbmluZztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFdoZXRoZXIgdGhlIHBvaW50ZXIgc2hvdWxkIGJlIHNob3dpbmcgdGhlIHBsYWNlbWVudCBnaG9zdC5cclxuICAgKlxyXG4gICAqIFRydWUgd2hpbGUgcGxhY2luZyBhIHRhZywgYW5kIHdoaWxlIGNhbGlicmF0aW5nIG9uY2UgYSB0YWcgaGFzIGJlZW4gcGlja2VkIC0gdGhhdCBzZWNvbmQgY2xpY2tcclxuICAgKiBpcyB0aGUgc2FtZSBxdWVzdGlvbiAoXCJ3aGVyZSBvbiB0aGUgbW9kZWw/XCIpIGFuZCBkZXNlcnZlcyB0aGUgc2FtZSBhaW1pbmcgYWlkLiBOb3QgdHJ1ZSBmb3IgdGhlXHJcbiAgICogZmlyc3QgaGFsZiBvZiBhIHBhaXIsIHdoaWNoIGlzIGEgY2xpY2sgb24gYSB0YWcsIG5vdCBvbiB0aGUgbW9kZWwuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBpc1ByZXZpZXdpbmdQbGFjZW1lbnQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5wbGFjaW5nVGFnIHx8IHRoaXMubWVhc3VyaW5nIHx8ICh0aGlzLmFsaWduaW5nICYmICEhdGhpcy5hbGlnbm1lbnRTb3VyY2UpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFdoZXRoZXIgYSB0YWcgaXMgY3VycmVudGx5IHJlZ2lzdGVyZWQgZm9yIHRoaXMgZWxlbWVudC4gKi9cclxuICBoYXNUYWcoZWxlbWVudElkOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnRhZ1Nwcml0ZXMuaGFzKGVsZW1lbnRJZCk7XHJcbiAgfVxyXG5cclxuICAvKiogSG93IG1hbnkgdGFncyBhcmUgb24gc2hvdyAtIHRoZSBvbmVzIGEgcGVyc29uIGNvdWxkIGFjdHVhbGx5IGNsaWNrLiAqL1xyXG4gIGdldFRhZ0NvdW50KCk6IG51bWJlciB7XHJcbiAgICBsZXQgdmlzaWJsZSA9IDA7XHJcbiAgICB0aGlzLnRhZ1Nwcml0ZXMuZm9yRWFjaCgoc3ByaXRlKSA9PiB7XHJcbiAgICAgIGlmIChzcHJpdGUudmlzaWJsZSkge1xyXG4gICAgICAgIHZpc2libGUgKz0gMTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gdmlzaWJsZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNvbHZlcyBhbmQgYXBwbGllcyB0aGUgYWxpZ25tZW50IGNvbGxlY3RlZCBzbyBmYXIsIHJldHVybmluZyBpdCBzbyB0aGUgY2FsbGVyIGNhbiBwZXJzaXN0IGl0LlxyXG4gICAqXHJcbiAgICogUmV0dXJucyBudWxsIHdoZW4gdGhlIHRocmVlIHRhZ3MgdHVybiBvdXQgdG8gYmUgY29sbGluZWFyLCBpbiB3aGljaCBjYXNlIG5vdGhpbmcgaXMgYXBwbGllZCBhbmRcclxuICAgKiB0aGUgd2Fsa3Rocm91Z2ggc3RheXMgb3BlbiBmb3IgdGhlIHBlcnNvbiB0byBwaWNrIGEgYmV0dGVyIHRoaXJkIHBvaW50LlxyXG4gICAqL1xyXG4gIHNvbHZlQWxpZ25tZW50RnJvbVBhaXJzKCk6IFRocmVlSnNBbGlnbm1lbnQgfCBudWxsIHtcclxuICAgIGNvbnN0IHVwID0gbmV3IFRIUkVFLlZlY3RvcjMoKTtcclxuICAgIHVwW3RoaXMubW9kZWxVcC5yZXBsYWNlKCctJywgJycpIGFzICd4JyB8ICd5JyB8ICd6J10gPSB0aGlzLm1vZGVsVXAuc3RhcnRzV2l0aCgnLScpID8gLTEgOiAxO1xyXG4gICAgY29uc3QgYWxpZ25tZW50ID0gc29sdmVUaHJlZUpzQWxpZ25tZW50KHRoaXMuYWxpZ25tZW50UGFpcnMsIHVwKTtcclxuICAgIGlmICghYWxpZ25tZW50KSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgLy8gT3V0IG9mIGNhbGlicmF0aW5nIG1vZGUgZmlyc3Q6IGFwcGx5aW5nIHRoZSByZXN1bHQgcmUtZGVjaWRlcyB3aGljaCB0YWdzIHNob3csIGFuZCBmcm9tIGhlcmVcclxuICAgIC8vIG9uIHRoYXQgaXMgdGhlIG9uZXMgb24gdGhlIG1vZGVsIGFnYWluLCBub3QgYWxsIG9mIHRoZW0uXHJcbiAgICB0aGlzLmFsaWduaW5nID0gZmFsc2U7XHJcbiAgICB0aGlzLmFwcGx5QWxpZ25tZW50S2VlcGluZ093blRhZ3MoYWxpZ25tZW50KTtcclxuICAgIHRoaXMucGVuZGluZ1ByZXZpZXdFdmVudCA9IG51bGw7XHJcbiAgICB0aGlzLnJlbW92ZVBsYWNlbWVudFByZXZpZXcoKTtcclxuICAgIHRoaXMucmVuZGVyZXIuZG9tRWxlbWVudC5zdHlsZS5jdXJzb3IgPSAnZGVmYXVsdCc7XHJcbiAgICB0aGlzLmFsaWdubWVudFByb2dyZXNzJC5uZXh0KHsgcGFpcnM6IHRoaXMuYWxpZ25tZW50UGFpcnMubGVuZ3RoLCBhd2FpdGluZzogbnVsbCB9KTtcclxuICAgIHJldHVybiBhbGlnbm1lbnQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBcHBsaWVzIGEgbmV3IGNhbGlicmF0aW9uIHdoaWxlIGtlZXBpbmcgZXZlcnkgdGFnIHBsYWNlZCBpbiB0aGlzIG1vZGVsIGV4YWN0bHkgd2hlcmUgaXQgaXMuXHJcbiAgICpcclxuICAgKiBBIGNhbGlicmF0aW9uIGlzIHdvcmtlZCBvdXQgZm9yIHRoZSB0YWdzIHRoYXQgY2FtZSBmcm9tIGVsc2V3aGVyZS4gVGhlIG1vZGVsJ3Mgb3duIHRhZ3Mgd2VyZSBwdXRcclxuICAgKiB3aGVyZSB0aGV5IGFyZSBieSBzb21lb25lIGNsaWNraW5nIHRoZSBtb2RlbCwgc28gdGhleSBtdXN0IG5vdCBmb2xsb3cgaXQuIFRoZWlyIHN0b3JlZFxyXG4gICAqIGNvb3JkaW5hdGVzIGFyZSByZXdyaXR0ZW4gaW5zdGVhZDogaW50byB0aGUgc2hhcmVkIHNwYWNlIGFzIHRoZSBuZXcgY2FsaWJyYXRpb24gZGVmaW5lcyBpdC5cclxuICAgKiBUaGF0IGlzIGFsc28gd2hhdCBtYWtlcyB0aGVtIGNvbXBhcmFibGUgd2l0aCBvdGhlciB2aXNpdHMgZnJvbSBoZXJlIG9uIC0gYSB0YWcgcGxhY2VkIGJlZm9yZVxyXG4gICAqIHRoZSBtb2RlbCB3YXMgY2FsaWJyYXRlZCB3YXMgaW4gdGhlIG1vZGVsJ3Mgb3duIGNvb3JkaW5hdGVzLCB2aXNpYmxlIG5vd2hlcmUgZWxzZS5cclxuICAgKlxyXG4gICAqIFRoZSByZXdyaXR0ZW4gdGFncyBhcmUga2VwdCBmb3IgdGhlIGNhbGxlciB0byBzdG9yZTsgc2VlIHRha2VSZWJhc2VkVGFncygpLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgYXBwbHlBbGlnbm1lbnRLZWVwaW5nT3duVGFncyhhbGlnbm1lbnQ6IFRocmVlSnNBbGlnbm1lbnQpOiB2b2lkIHtcclxuICAgIGNvbnN0IG93biA9IFsuLi50aGlzLnRhZ1Nwcml0ZXMudmFsdWVzKCldLmZpbHRlcigoc3ByaXRlKSA9PiB0aGlzLmlzT3duZWRCeVZpc2l0KHNwcml0ZSkpO1xyXG4gICAgLy8gV2hlcmUgZWFjaCBvbmUgaXMgbm93LCBpbiB0aGUgc3BhY2UgdGhlIG1vZGVsIHNpdHMgaW4sIGFuZCBob3cgaXRzIHBhcmVudCB3YXMgdHVybmVkLlxyXG4gICAgY29uc3QgcGxhY2VkID0gb3duLm1hcCgoc3ByaXRlKSA9PiB7XHJcbiAgICAgIHNwcml0ZS5wYXJlbnQ/LnVwZGF0ZU1hdHJpeCgpO1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIHNwcml0ZSxcclxuICAgICAgICBwb3NpdGlvbjogc3ByaXRlLnBvc2l0aW9uLmNsb25lKCkuYXBwbHlNYXRyaXg0KHNwcml0ZS5wYXJlbnQ/Lm1hdHJpeCA/PyBuZXcgVEhSRUUuTWF0cml4NCgpKSxcclxuICAgICAgICB0dXJuOiBzcHJpdGUucGFyZW50Py5xdWF0ZXJuaW9uLmNsb25lKCkgPz8gbmV3IFRIUkVFLlF1YXRlcm5pb24oKSxcclxuICAgICAgfTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuc2V0VGFnQWxpZ25tZW50KGFsaWdubWVudCk7XHJcblxyXG4gICAgY29uc3QgaW52ZXJzZSA9IHRoaXMudGFnR3JvdXAubWF0cml4LmNsb25lKCkuaW52ZXJ0KCk7XHJcbiAgICBjb25zdCB1bnR1cm4gPSB0aGlzLnRhZ0dyb3VwLnF1YXRlcm5pb24uY2xvbmUoKS5pbnZlcnQoKTtcclxuICAgIHRoaXMucmViYXNlZFRhZ3MgPSBwbGFjZWQubWFwKCh7IHNwcml0ZSwgcG9zaXRpb24sIHR1cm4gfSkgPT4ge1xyXG4gICAgICBzcHJpdGUucG9zaXRpb24uY29weShwb3NpdGlvbi5hcHBseU1hdHJpeDQoaW52ZXJzZSkpO1xyXG4gICAgICBzcHJpdGUudXNlckRhdGEuZnJhbWUgPSBudWxsO1xyXG4gICAgICB0aGlzLnBhcmVudFRhZyhzcHJpdGUpO1xyXG4gICAgICB0aGlzLnNjYWxlVGFnRm9yTW9kZWwoc3ByaXRlKTtcclxuICAgICAgY29uc3Qgcm90YXRpb24gPSB1bnR1cm4uY2xvbmUoKS5tdWx0aXBseSh0dXJuKTtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBpZDogc3ByaXRlLm5hbWUsXHJcbiAgICAgICAgcG9zaXRpb246IHsgeDogc3ByaXRlLnBvc2l0aW9uLngsIHk6IHNwcml0ZS5wb3NpdGlvbi55LCB6OiBzcHJpdGUucG9zaXRpb24ueiB9LFxyXG4gICAgICAgIHJvdGF0ZURpcmVjdGlvbjogKHsgeCwgeSwgeiB9KSA9PiB7XHJcbiAgICAgICAgICBjb25zdCB0dXJuZWQgPSBuZXcgVEhSRUUuVmVjdG9yMyh4LCB5LCB6KS5hcHBseVF1YXRlcm5pb24ocm90YXRpb24pO1xyXG4gICAgICAgICAgcmV0dXJuIHsgeDogdHVybmVkLngsIHk6IHR1cm5lZC55LCB6OiB0dXJuZWQueiB9O1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH07XHJcbiAgICB9KTtcclxuICAgIHRoaXMucmVmcmVzaFRhZ1Zpc2liaWxpdHkoKTtcclxuICB9XHJcblxyXG4gIC8qKiBIYW5kcyBvdmVyIHRoZSB0YWdzIHRoZSBsYXN0IGNhbGlicmF0aW9uIHJld3JvdGUsIG9uY2UsIGZvciB0aGVtIHRvIGJlIHN0b3JlZC4gKi9cclxuICB0YWtlUmViYXNlZFRhZ3MoKTogVGhyZWVKc1JlYmFzZWRUYWdbXSB7XHJcbiAgICBjb25zdCByZWJhc2VkID0gdGhpcy5yZWJhc2VkVGFncztcclxuICAgIHRoaXMucmViYXNlZFRhZ3MgPSBbXTtcclxuICAgIHJldHVybiByZWJhc2VkO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2hvb3NlcyB0aGUgdGFnIGZvciB0aGUgcGFpciBiZWluZyBtYXRjaGVkIGJ5IGlkLCBpbnN0ZWFkIG9mIGJ5IGNsaWNraW5nIGl0LlxyXG4gICAqXHJcbiAgICogQ2xpY2tpbmcgYSB0YWcgc3VwcG9zZXMgaXQgY2FuIGJlIGZvdW5kLiBPbiBhIG1vZGVsIHRoYXQgaGFzIG5ldmVyIGJlZW4gY2FsaWJyYXRlZCB0aGUgdGFncyBtYXlcclxuICAgKiBzaXQgZmFyIGZyb20gaXQsIG9yIGFsbCBvbiB0b3Agb2Ygb25lIGFub3RoZXI7IGEgbGlzdCBoYXMgbmVpdGhlciBwcm9ibGVtLlxyXG4gICAqL1xyXG4gIHNlbGVjdEFsaWdubWVudFRhZyhlbGVtZW50SWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3Qgc3ByaXRlID0gdGhpcy50YWdTcHJpdGVzLmdldChlbGVtZW50SWQpO1xyXG4gICAgaWYgKCF0aGlzLmFsaWduaW5nIHx8IHRoaXMuYWxpZ25tZW50U291cmNlIHx8ICFzcHJpdGUgfHwgIXRoaXMuY2FsaWJyYXRpb25DYW5kaWRhdGVzKCkuaW5jbHVkZXMoc3ByaXRlKSkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICB0aGlzLnNldEFsaWdubWVudFNvdXJjZShzcHJpdGUpO1xyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldEFsaWdubWVudFNvdXJjZShzcHJpdGU6IFRIUkVFLk9iamVjdDNEKTogdm9pZCB7XHJcbiAgICAvLyBUaGUgc3ByaXRlJ3Mgb3duIHBvc2l0aW9uIGlzIHRoZSBzdG9yZWQgY29vcmRpbmF0ZSwgdW50b3VjaGVkIGJ5IGFueSBhbGlnbm1lbnQgYWxyZWFkeVxyXG4gICAgLy8gYXBwbGllZCAtIHRoYXQgdHJhbnNmb3JtIGxpdmVzIG9uIHRoZSBncm91cCwgbm90IG9uIHRoZSBzcHJpdGUuXHJcbiAgICBjb25zdCBzdG9yZWQgPSBzcHJpdGUucG9zaXRpb247XHJcbiAgICB0aGlzLmFsaWdubWVudFNvdXJjZSA9IHsgeDogc3RvcmVkLngsIHk6IHN0b3JlZC55LCB6OiBzdG9yZWQueiB9O1xyXG4gICAgdGhpcy5hbGlnbm1lbnRTb3VyY2VUYWdJZCA9IHNwcml0ZS5uYW1lO1xyXG4gICAgdGhpcy5hbGlnbm1lbnRQcm9ncmVzcyQubmV4dCh7XHJcbiAgICAgIHBhaXJzOiB0aGlzLmFsaWdubWVudFBhaXJzLmxlbmd0aCxcclxuICAgICAgYXdhaXRpbmc6ICdwb2ludCcsXHJcbiAgICAgIHRhZ0lkOiBzcHJpdGUubmFtZSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqIEhhbmRsZXMgYSBjbGljayB3aGlsZSB0aGUgYWxpZ25tZW50IHdhbGt0aHJvdWdoIGlzIHJ1bm5pbmcuICovXHJcbiAgcHJpdmF0ZSBoYW5kbGVBbGlnbm1lbnRDbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmFsaWdubWVudFNvdXJjZSkge1xyXG4gICAgICAvLyBGaXJzdCBoYWxmIG9mIGEgcGFpcjogd2hpY2ggdGFnIGFyZSB3ZSB0YWxraW5nIGFib3V0P1xyXG4gICAgICBjb25zdCBoaXQgPSB0aGlzLnJheWNhc3Rlci5pbnRlcnNlY3RPYmplY3RzKHRoaXMuY2FsaWJyYXRpb25DYW5kaWRhdGVzKCksIGZhbHNlKVswXTtcclxuICAgICAgaWYgKCFoaXQpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5zZXRBbGlnbm1lbnRTb3VyY2UoaGl0Lm9iamVjdCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBTZWNvbmQgaGFsZjogd2hlcmUgdGhhdCB0YWcgYWN0dWFsbHkgYmVsb25ncyBvbiB0aGUgbW9kZWwuXHJcbiAgICBjb25zdCB0YXJnZXQgPSB0aGlzLnBpY2tBbGlnbm1lbnRUYXJnZXQoZXZlbnQpO1xyXG4gICAgaWYgKCF0YXJnZXQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5hbGlnbm1lbnRQYWlycy5wdXNoKHsgdGFnSWQ6IHRoaXMuYWxpZ25tZW50U291cmNlVGFnSWQsIHNvdXJjZTogdGhpcy5hbGlnbm1lbnRTb3VyY2UsIHRhcmdldCB9KTtcclxuICAgIHRoaXMuYWxpZ25tZW50U291cmNlID0gbnVsbDtcclxuICAgIC8vIFRoZSBnaG9zdCBiZWxvbmdzIHRvIHRoZSBjbGljayB0aGF0IGp1c3QgaGFwcGVuZWQ7IHRoZSBuZXh0IGhhbGYgaXMgYSBjbGljayBvbiBhIHRhZy5cclxuICAgIHRoaXMucGVuZGluZ1ByZXZpZXdFdmVudCA9IG51bGw7XHJcbiAgICB0aGlzLnJlbW92ZVBsYWNlbWVudFByZXZpZXcoKTtcclxuICAgIHRoaXMuYWxpZ25tZW50UHJvZ3Jlc3MkLm5leHQoe1xyXG4gICAgICBwYWlyczogdGhpcy5hbGlnbm1lbnRQYWlycy5sZW5ndGgsXHJcbiAgICAgIC8vIERvbmUgYXQgdGhyZWUsIG9yIHNvb25lciB3aGVuIHRoZXJlIGFyZSBubyBtb3JlIHRhZ3MgdG8gbWF0Y2g6IGZld2VyIHBhaXJzIHN0aWxsIGNhbGlicmF0ZSxcclxuICAgICAgLy8gb25seSBsZXNzIGNvbXBsZXRlbHkuXHJcbiAgICAgIGF3YWl0aW5nOiB0aGlzLmFsaWdubWVudFBhaXJzLmxlbmd0aCA+PSAzIHx8IHRoaXMuY2FsaWJyYXRpb25DYW5kaWRhdGVzKCkubGVuZ3RoID09PSAwID8gbnVsbCA6ICd0YWcnLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTdGFydHMgYSBtZWFzdXJlbWVudDogZXZlcnkgY2xpY2sgb24gdGhlIG1vZGVsIGFkZHMgYSBwb2ludCwgYW5kIGVhY2ggcGFpciBvZiBjb25zZWN1dGl2ZVxyXG4gICAqIHBvaW50cyBpcyBhIG1lYXN1cmVkIHNlZ21lbnQuXHJcbiAgICpcclxuICAgKiBJdCBlbmRzIHRocm91Z2ggZmluaXNoTWVhc3VyaW5nKCkgb3IgY2FuY2VsTWVhc3VyaW5nKCkgcmF0aGVyIHRoYW4gb24gaXRzIG93biBhZnRlciB0d28gcG9pbnRzLFxyXG4gICAqIGJlY2F1c2UgYSBtZWFzdXJlbWVudCBtYXkgaGF2ZSBzZXZlcmFsIHNlZ21lbnRzIC0gdGhlIHNhbWUgYXMgTWF0dGVycG9ydCdzLCB3aG9zZSByZXN1bHRzIGFyZVxyXG4gICAqIHN0b3JlZCBhcyBhIGxpc3Qgb2YgZGlzdGFuY2VzLlxyXG4gICAqL1xyXG4gIHN0YXJ0TWVhc3VyaW5nKCk6IHZvaWQge1xyXG4gICAgLy8gT25lIHBvaW50ZXIgbW9kZSBhdCBhIHRpbWU6IGEgY2xpY2sgY2Fubm90IGJlIGJvdGggYSB0YWcgcG9zaXRpb24gYW5kIGEgbWVhc3VyZWQgcG9pbnQuXHJcbiAgICB0aGlzLmNhbmNlbFRhZ1BsYWNlbWVudCgpO1xyXG4gICAgaWYgKHRoaXMuYWxpZ25pbmcpIHtcclxuICAgICAgdGhpcy5jYW5jZWxUYWdBbGlnbm1lbnQoKTtcclxuICAgIH1cclxuICAgIHRoaXMuY2xlYXJNZWFzdXJlbWVudCgpO1xyXG4gICAgaWYgKHRoaXMubWVhc3VyZUdyb3VwLnBhcmVudCAhPT0gdGhpcy50YWdHcm91cCkge1xyXG4gICAgICB0aGlzLnRhZ0dyb3VwLmFkZCh0aGlzLm1lYXN1cmVHcm91cCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLm1lYXN1cmluZyA9IHRydWU7XHJcbiAgICBpZiAodGhpcy5yZW5kZXJlcikge1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLmRvbUVsZW1lbnQuc3R5bGUuY3Vyc29yID0gJ2Nyb3NzaGFpcic7XHJcbiAgICB9XHJcbiAgICB0aGlzLm1lYXN1cmVtZW50UHJvZ3Jlc3MkLm5leHQoeyBwb2ludHM6IDAsIGRpc3RhbmNlczogW10gfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBYmFuZG9ucyB0aGUgbWVhc3VyZW1lbnQgYW5kIHJlbW92ZXMgd2hhdCB3YXMgZHJhd24uXHJcbiAgICpcclxuICAgKiBBbHNvIHdoYXQgY2xlYXJzIGEgZmluaXNoZWQgbWVhc3VyZW1lbnQgb2ZmIHRoZSBtb2RlbCBvbmNlIGl0cyBmb3JtIGlzIHNhdmVkIG9yIGNsb3NlZCwgd2hpY2hcclxuICAgKiBpcyB3aHkgaXQgb25seSByZXBvcnRzIGFuIGFiYW5kb25tZW50IHdoZW4gb25lIHdhcyBhY3R1YWxseSBpbiBwcm9ncmVzcy5cclxuICAgKi9cclxuICBjYW5jZWxNZWFzdXJpbmcoKTogdm9pZCB7XHJcbiAgICBjb25zdCB3YXNNZWFzdXJpbmcgPSB0aGlzLm1lYXN1cmluZztcclxuICAgIHRoaXMubWVhc3VyaW5nID0gZmFsc2U7XHJcbiAgICB0aGlzLnBlbmRpbmdQcmV2aWV3RXZlbnQgPSBudWxsO1xyXG4gICAgdGhpcy5yZW1vdmVQbGFjZW1lbnRQcmV2aWV3KCk7XHJcbiAgICB0aGlzLmNsZWFyTWVhc3VyZW1lbnQoKTtcclxuICAgIC8vIEZvcmdvdHRlbiBoZXJlIHNvIHRoYXQgYSBmb3JtIG9wZW5lZCBsYXRlciBjYW5ub3QgcGljayB1cCBhIG1lYXN1cmVtZW50IGFscmVhZHkgZGVhbHQgd2l0aC5cclxuICAgIHRoaXMubGFzdE1lYXN1cmVtZW50ID0gbnVsbDtcclxuICAgIGlmICh0aGlzLnJlbmRlcmVyKSB7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIuZG9tRWxlbWVudC5zdHlsZS5jdXJzb3IgPSAnZGVmYXVsdCc7XHJcbiAgICB9XHJcbiAgICBpZiAod2FzTWVhc3VyaW5nKSB7XHJcbiAgICAgIHRoaXMubWVhc3VyZW1lbnRQcm9ncmVzcyQubmV4dChudWxsKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEVuZHMgdGhlIG1lYXN1cmVtZW50IGFuZCByZXR1cm5zIGl0LCBvciBudWxsIHdoZW4gdGhlcmUgYXJlIG5vdCB5ZXQgdHdvIHBvaW50cyB0byBtZWFzdXJlXHJcbiAgICogYmV0d2VlbiAtIGluIHdoaWNoIGNhc2UgbWVhc3VyaW5nIHNpbXBseSBjYXJyaWVzIG9uLlxyXG4gICAqXHJcbiAgICogVGhlIGRyYXdpbmcgc3RheXMgb24gdGhlIG1vZGVsIHNvIGl0IGlzIHN0aWxsIHZpc2libGUgd2hpbGUgdGhlIHBlcnNvbiBuYW1lcyB0aGUgbWVhc3VyZW1lbnQ7XHJcbiAgICogY2FuY2VsTWVhc3VyaW5nKCkgdGFrZXMgaXQgYXdheSBhZnRlcndhcmRzLlxyXG4gICAqL1xyXG4gIGZpbmlzaE1lYXN1cmluZygpOiBUaHJlZUpzTWVhc3VyZW1lbnQgfCBudWxsIHtcclxuICAgIGlmICghdGhpcy5tZWFzdXJpbmcgfHwgdGhpcy5tZWFzdXJlUG9pbnRzLmxlbmd0aCA8IDIpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICB0aGlzLm1lYXN1cmluZyA9IGZhbHNlO1xyXG4gICAgdGhpcy5wZW5kaW5nUHJldmlld0V2ZW50ID0gbnVsbDtcclxuICAgIHRoaXMucmVtb3ZlUGxhY2VtZW50UHJldmlldygpO1xyXG4gICAgdGhpcy51cGRhdGVNZWFzdXJlUnViYmVyQmFuZChudWxsKTtcclxuICAgIHRoaXMucmVuZGVyZXIuZG9tRWxlbWVudC5zdHlsZS5jdXJzb3IgPSAnZGVmYXVsdCc7XHJcblxyXG4gICAgdGhpcy5sYXN0TWVhc3VyZW1lbnQgPSB7XHJcbiAgICAgIHBvaW50czogdGhpcy5tZWFzdXJlUG9pbnRzLm1hcCgocG9pbnQpID0+ICh7IHg6IHBvaW50LngsIHk6IHBvaW50LnksIHo6IHBvaW50LnogfSkpLFxyXG4gICAgICBkaXN0YW5jZXM6IHRoaXMubWVhc3VyZURpc3RhbmNlcygpLFxyXG4gICAgICBzY3JlZW5zaG90OiB0aGlzLmNhcHR1cmVNZWFzdXJlbWVudFNjcmVlbnNob3QoKSxcclxuICAgIH07XHJcbiAgICByZXR1cm4gdGhpcy5sYXN0TWVhc3VyZW1lbnQ7XHJcbiAgfVxyXG5cclxuICBpc01lYXN1cmluZygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLm1lYXN1cmluZztcclxuICB9XHJcblxyXG4gIC8qKiBUaGUgbWVhc3VyZW1lbnQgZmluaXNoTWVhc3VyaW5nKCkgbGFzdCBwcm9kdWNlZCwgZm9yIHRoZSBmb3JtIHRoYXQgc2F2ZXMgaXQuICovXHJcbiAgZ2V0TGFzdE1lYXN1cmVtZW50KCk6IFRocmVlSnNNZWFzdXJlbWVudCB8IG51bGwge1xyXG4gICAgcmV0dXJuIHRoaXMubGFzdE1lYXN1cmVtZW50O1xyXG4gIH1cclxuXHJcbiAgLyoqIE1ldHJlcyBiZXR3ZWVuIGNvbnNlY3V0aXZlIHBvaW50cy4gVGFnIHNwYWNlIGlzIGluIG1ldHJlcywgc28gbm8gY29udmVyc2lvbiBpcyBpbnZvbHZlZC4gKi9cclxuICBwcml2YXRlIG1lYXN1cmVEaXN0YW5jZXMoKTogbnVtYmVyW10ge1xyXG4gICAgY29uc3QgZGlzdGFuY2VzOiBudW1iZXJbXSA9IFtdO1xyXG4gICAgZm9yIChsZXQgaW5kZXggPSAxOyBpbmRleCA8IHRoaXMubWVhc3VyZVBvaW50cy5sZW5ndGg7IGluZGV4ICs9IDEpIHtcclxuICAgICAgY29uc3QgZGlzdGFuY2UgPSB0aGlzLm1lYXN1cmVQb2ludHNbaW5kZXggLSAxXS5kaXN0YW5jZVRvKHRoaXMubWVhc3VyZVBvaW50c1tpbmRleF0pO1xyXG4gICAgICAvLyBUd28gZGVjaW1hbHMsIHRoZSBwcmVjaXNpb24gTWF0dGVycG9ydCdzIG93biBtZWFzdXJlbWVudHMgYXJlIHN0b3JlZCB3aXRoLlxyXG4gICAgICBkaXN0YW5jZXMucHVzaChNYXRoLnJvdW5kKGRpc3RhbmNlICogMTAwKSAvIDEwMCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZGlzdGFuY2VzO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhZGRNZWFzdXJlUG9pbnQocG9pbnQ6IFRIUkVFLlZlY3RvcjMpOiB2b2lkIHtcclxuICAgIGNvbnN0IHByZXZpb3VzID0gdGhpcy5tZWFzdXJlUG9pbnRzW3RoaXMubWVhc3VyZVBvaW50cy5sZW5ndGggLSAxXTtcclxuICAgIHRoaXMubWVhc3VyZVBvaW50cy5wdXNoKHBvaW50KTtcclxuXHJcbiAgICBjb25zdCBtYXJrZXIgPSBuZXcgVEhSRUUuU3ByaXRlKFxyXG4gICAgICBuZXcgVEhSRUUuU3ByaXRlTWF0ZXJpYWwoe1xyXG4gICAgICAgIG1hcDogdGhpcy5jcmVhdGVUYWdUZXh0dXJlKFRocmVlSnNTZXJ2aWNlLk1FQVNVUkVfQ09MT1IpLFxyXG4gICAgICAgIGRlcHRoVGVzdDogZmFsc2UsXHJcbiAgICAgICAgdHJhbnNwYXJlbnQ6IHRydWUsXHJcbiAgICAgICAgLy8gU2l6ZWQgYWdhaW5zdCB0aGUgdmlld3BvcnQsIG5vdCB0aGUgbW9kZWw6IG1lYXN1cmluZyBpcyBkb25lIHpvb21lZCByaWdodCBpbiwgd2hlcmVcclxuICAgICAgICAvLyBhbnl0aGluZyBzaXplZCBpbiBtZXRyZXMgd291bGQgY292ZXIgdGhlIHZlcnkgdGhpbmcgYmVpbmcgbWVhc3VyZWQuXHJcbiAgICAgICAgc2l6ZUF0dGVudWF0aW9uOiBmYWxzZSxcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgICBtYXJrZXIuc2NhbGUuc2V0KDAuMDIyLCAwLjAyMiwgMSk7XHJcbiAgICBtYXJrZXIucG9zaXRpb24uY29weShwb2ludCk7XHJcbiAgICBtYXJrZXIucmVuZGVyT3JkZXIgPSAxMDAxO1xyXG4gICAgdGhpcy5tZWFzdXJlR3JvdXAuYWRkKG1hcmtlcik7XHJcblxyXG4gICAgaWYgKHByZXZpb3VzKSB7XHJcbiAgICAgIHRoaXMubWVhc3VyZUdyb3VwLmFkZCh0aGlzLmNyZWF0ZU1lYXN1cmVMaW5lKHByZXZpb3VzLCBwb2ludCkpO1xyXG5cclxuICAgICAgY29uc3QgZGlzdGFuY2UgPSBNYXRoLnJvdW5kKHByZXZpb3VzLmRpc3RhbmNlVG8ocG9pbnQpICogMTAwKSAvIDEwMDtcclxuICAgICAgY29uc3QgbGFiZWwgPSBuZXcgVEhSRUUuU3ByaXRlKFxyXG4gICAgICAgIG5ldyBUSFJFRS5TcHJpdGVNYXRlcmlhbCh7XHJcbiAgICAgICAgICBtYXA6IHRoaXMuY3JlYXRlTWVhc3VyZUxhYmVsVGV4dHVyZShgJHtkaXN0YW5jZS50b0ZpeGVkKDIpfSBtYCksXHJcbiAgICAgICAgICBkZXB0aFRlc3Q6IGZhbHNlLFxyXG4gICAgICAgICAgdHJhbnNwYXJlbnQ6IHRydWUsXHJcbiAgICAgICAgICBzaXplQXR0ZW51YXRpb246IGZhbHNlLFxyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgICAgIGxhYmVsLnNjYWxlLnNldCgwLjE1LCAwLjA1LCAxKTtcclxuICAgICAgbGFiZWwucG9zaXRpb24uY29weShwcmV2aW91cykuYWRkKHBvaW50KS5tdWx0aXBseVNjYWxhcigwLjUpO1xyXG4gICAgICBsYWJlbC5yZW5kZXJPcmRlciA9IDEwMDI7XHJcbiAgICAgIHRoaXMubWVhc3VyZUdyb3VwLmFkZChsYWJlbCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5tZWFzdXJlbWVudFByb2dyZXNzJC5uZXh0KHtcclxuICAgICAgcG9pbnRzOiB0aGlzLm1lYXN1cmVQb2ludHMubGVuZ3RoLFxyXG4gICAgICBkaXN0YW5jZXM6IHRoaXMubWVhc3VyZURpc3RhbmNlcygpLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBIHNlZ21lbnQgd2l0aCBhIHdpZHRoIGluIHBpeGVscy5cclxuICAgKlxyXG4gICAqIFdlYkdMJ3Mgb3duIGxpbmVzIGFyZSBvbmUgcGl4ZWwgd2lkZSB3aGF0ZXZlciBpcyBhc2tlZCBmb3IsIHdoaWNoIGFsbCBidXQgZGlzYXBwZWFycyBvdmVyIGFcclxuICAgKiBwaG90b2dyYXBoaWMgdGV4dHVyZS4gVGhpcyBraW5kIGlzIGRyYXduIGFzIHNjcmVlbi1mYWNpbmcgZ2VvbWV0cnksIHNvIHRoZSB3aWR0aCBob2xkcy5cclxuICAgKi9cclxuICBwcml2YXRlIGNyZWF0ZU1lYXN1cmVMaW5lKGZyb206IFRIUkVFLlZlY3RvcjMsIHRvOiBUSFJFRS5WZWN0b3IzKTogYW55IHtcclxuICAgIGNvbnN0IGdlb21ldHJ5ID0gbmV3IExpbmVHZW9tZXRyeSgpO1xyXG4gICAgZ2VvbWV0cnkuc2V0UG9zaXRpb25zKFtmcm9tLngsIGZyb20ueSwgZnJvbS56LCB0by54LCB0by55LCB0by56XSk7XHJcbiAgICBjb25zdCBtYXRlcmlhbCA9IG5ldyBMaW5lTWF0ZXJpYWwoe1xyXG4gICAgICBjb2xvcjogbmV3IFRIUkVFLkNvbG9yKFRocmVlSnNTZXJ2aWNlLk1FQVNVUkVfQ09MT1IpLmdldEhleCgpLFxyXG4gICAgICBsaW5ld2lkdGg6IDMsXHJcbiAgICAgIGRlcHRoVGVzdDogZmFsc2UsXHJcbiAgICAgIHRyYW5zcGFyZW50OiB0cnVlLFxyXG4gICAgfSk7XHJcbiAgICBjb25zdCBzaXplID0gdGhpcy5yZW5kZXJlci5nZXRTaXplKG5ldyBUSFJFRS5WZWN0b3IyKCkpO1xyXG4gICAgbWF0ZXJpYWwucmVzb2x1dGlvbi5zZXQoc2l6ZS54LCBzaXplLnkpO1xyXG4gICAgY29uc3QgbGluZSA9IG5ldyBMaW5lMihnZW9tZXRyeSwgbWF0ZXJpYWwpO1xyXG4gICAgbGluZS5yZW5kZXJPcmRlciA9IDEwMDA7XHJcbiAgICByZXR1cm4gbGluZTtcclxuICB9XHJcblxyXG4gIC8qKiBMaW5lIHdpZHRocyBhcmUgaW4gcGl4ZWxzLCB3aGljaCB0aGUgbWF0ZXJpYWwgY2FuIG9ubHkgaG9ub3VyIGlmIGl0IGtub3dzIHRoZSBjYW52YXMgc2l6ZS4gKi9cclxuICBwcml2YXRlIHVwZGF0ZU1lYXN1cmVMaW5lUmVzb2x1dGlvbigpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5yZW5kZXJlcikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBzaXplID0gdGhpcy5yZW5kZXJlci5nZXRTaXplKG5ldyBUSFJFRS5WZWN0b3IyKCkpO1xyXG4gICAgdGhpcy5tZWFzdXJlR3JvdXAuY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQ6IGFueSkgPT4ge1xyXG4gICAgICBpZiAoY2hpbGQubWF0ZXJpYWw/LnJlc29sdXRpb24pIHtcclxuICAgICAgICBjaGlsZC5tYXRlcmlhbC5yZXNvbHV0aW9uLnNldChzaXplLngsIHNpemUueSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqIFN0cmV0Y2hlcyBhIHNlZ21lbnQgZnJvbSB0aGUgbGFzdCBwb2ludCB0byB0aGUgcG9pbnRlciwgb3IgaGlkZXMgaXQgd2hlbiBnaXZlbiBudWxsLiAqL1xyXG4gIHByaXZhdGUgdXBkYXRlTWVhc3VyZVJ1YmJlckJhbmQodGFyZ2V0OiBUSFJFRS5WZWN0b3IzIHwgbnVsbCk6IHZvaWQge1xyXG4gICAgY29uc3QgbGFzdCA9IHRoaXMubWVhc3VyZVBvaW50c1t0aGlzLm1lYXN1cmVQb2ludHMubGVuZ3RoIC0gMV07XHJcbiAgICBpZiAoIXRoaXMubWVhc3VyaW5nIHx8ICFsYXN0IHx8ICF0YXJnZXQpIHtcclxuICAgICAgaWYgKHRoaXMubWVhc3VyZVJ1YmJlckJhbmQpIHtcclxuICAgICAgICB0aGlzLm1lYXN1cmVSdWJiZXJCYW5kLnZpc2libGUgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAoIXRoaXMubWVhc3VyZVJ1YmJlckJhbmQpIHtcclxuICAgICAgdGhpcy5tZWFzdXJlUnViYmVyQmFuZCA9IHRoaXMuY3JlYXRlTWVhc3VyZUxpbmUobGFzdCwgdGFyZ2V0KTtcclxuICAgICAgdGhpcy5tZWFzdXJlUnViYmVyQmFuZC5tYXRlcmlhbC5vcGFjaXR5ID0gMC42O1xyXG4gICAgICB0aGlzLm1lYXN1cmVHcm91cC5hZGQodGhpcy5tZWFzdXJlUnViYmVyQmFuZCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLm1lYXN1cmVSdWJiZXJCYW5kLmdlb21ldHJ5LnNldFBvc2l0aW9ucyhbXHJcbiAgICAgIGxhc3QueCwgbGFzdC55LCBsYXN0LnosXHJcbiAgICAgIHRhcmdldC54LCB0YXJnZXQueSwgdGFyZ2V0LnosXHJcbiAgICBdKTtcclxuICAgIHRoaXMubWVhc3VyZVJ1YmJlckJhbmQudmlzaWJsZSA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZU1lYXN1cmVMYWJlbFRleHR1cmUodGV4dDogc3RyaW5nKTogVEhSRUUuQ2FudmFzVGV4dHVyZSB7XHJcbiAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcclxuICAgIGNhbnZhcy53aWR0aCA9IDM4NDtcclxuICAgIGNhbnZhcy5oZWlnaHQgPSAxMjg7XHJcbiAgICBjb25zdCBjb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XHJcblxyXG4gICAgY29uc3QgcmFkaXVzID0gMjg7XHJcbiAgICBjb250ZXh0LmZpbGxTdHlsZSA9ICdyZ2JhKDAsIDAsIDAsIDAuNzgpJztcclxuICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7XHJcbiAgICBjb250ZXh0Lm1vdmVUbyhyYWRpdXMsIDgpO1xyXG4gICAgY29udGV4dC5hcmNUbyhjYW52YXMud2lkdGggLSA4LCA4LCBjYW52YXMud2lkdGggLSA4LCBjYW52YXMuaGVpZ2h0IC0gOCwgcmFkaXVzKTtcclxuICAgIGNvbnRleHQuYXJjVG8oY2FudmFzLndpZHRoIC0gOCwgY2FudmFzLmhlaWdodCAtIDgsIDgsIGNhbnZhcy5oZWlnaHQgLSA4LCByYWRpdXMpO1xyXG4gICAgY29udGV4dC5hcmNUbyg4LCBjYW52YXMuaGVpZ2h0IC0gOCwgOCwgOCwgcmFkaXVzKTtcclxuICAgIGNvbnRleHQuYXJjVG8oOCwgOCwgY2FudmFzLndpZHRoIC0gOCwgOCwgcmFkaXVzKTtcclxuICAgIGNvbnRleHQuY2xvc2VQYXRoKCk7XHJcbiAgICBjb250ZXh0LmZpbGwoKTtcclxuXHJcbiAgICBjb250ZXh0LmZpbGxTdHlsZSA9ICcjRkZGRkZGJztcclxuICAgIGNvbnRleHQuZm9udCA9ICdib2xkIDYwcHggc2Fucy1zZXJpZic7XHJcbiAgICBjb250ZXh0LnRleHRBbGlnbiA9ICdjZW50ZXInO1xyXG4gICAgY29udGV4dC50ZXh0QmFzZWxpbmUgPSAnbWlkZGxlJztcclxuICAgIGNvbnRleHQuZmlsbFRleHQodGV4dCwgY2FudmFzLndpZHRoIC8gMiwgY2FudmFzLmhlaWdodCAvIDIgKyA0KTtcclxuXHJcbiAgICByZXR1cm4gbmV3IFRIUkVFLkNhbnZhc1RleHR1cmUoY2FudmFzKTtcclxuICB9XHJcblxyXG4gIC8qKiBSZW1vdmVzIGV2ZXJ5dGhpbmcgZHJhd24gZm9yIGEgbWVhc3VyZW1lbnQgYW5kIGZvcmdldHMgaXRzIHBvaW50cy4gKi9cclxuICBwcml2YXRlIGNsZWFyTWVhc3VyZW1lbnQoKTogdm9pZCB7XHJcbiAgICBbLi4udGhpcy5tZWFzdXJlR3JvdXAuY2hpbGRyZW5dLmZvckVhY2goKGNoaWxkOiBhbnkpID0+IHtcclxuICAgICAgdGhpcy5tZWFzdXJlR3JvdXAucmVtb3ZlKGNoaWxkKTtcclxuICAgICAgY2hpbGQuZ2VvbWV0cnk/LmRpc3Bvc2U/LigpO1xyXG4gICAgICBjaGlsZC5tYXRlcmlhbD8ubWFwPy5kaXNwb3NlPy4oKTtcclxuICAgICAgY2hpbGQubWF0ZXJpYWw/LmRpc3Bvc2U/LigpO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLm1lYXN1cmVSdWJiZXJCYW5kID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy5tZWFzdXJlUG9pbnRzID0gW107XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBIHBpY3R1cmUgb2YgdGhlIHNjZW5lIHdpdGggdGhlIG1lYXN1cmVtZW50IG9uIGl0LCBhcyBNYXR0ZXJwb3J0IGF0dGFjaGVzIHRvIGl0cyBvd24uXHJcbiAgICpcclxuICAgKiBUYWdzIGFyZSBsZWZ0IG91dCwgYXMgdGhleSBhcmUgdGhlcmU6IHRoZSBwaWN0dXJlIGlzIGFib3V0IHRoZSBtZWFzdXJlbWVudC4gSXQgaXMgdGFrZW4gc3RyYWlnaHRcclxuICAgKiBhZnRlciBhIHJlbmRlciBiZWNhdXNlIHRoZSBkcmF3aW5nIGJ1ZmZlciBpcyBvbmx5IGd1YXJhbnRlZWQgdG8gaG9sZCB0aGUgZnJhbWUgdW50aWwgdGhlXHJcbiAgICogYnJvd3NlciBwcmVzZW50cyBpdCwgYW5kIHNjYWxlZCBkb3duIHNpbmNlIGl0IGlzIHVwbG9hZGVkIGFuZCBzaG93biBhcyBhIHRodW1ibmFpbC5cclxuICAgKi9cclxuICBwcml2YXRlIGNhcHR1cmVNZWFzdXJlbWVudFNjcmVlbnNob3QoKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGhpZGRlbjogVEhSRUUuU3ByaXRlW10gPSBbXTtcclxuICAgIHRoaXMudGFnU3ByaXRlcy5mb3JFYWNoKChzcHJpdGUpID0+IHtcclxuICAgICAgaWYgKHNwcml0ZS52aXNpYmxlKSB7XHJcbiAgICAgICAgc3ByaXRlLnZpc2libGUgPSBmYWxzZTtcclxuICAgICAgICBoaWRkZW4ucHVzaChzcHJpdGUpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLnJlbmRlcmVyLnJlbmRlcih0aGlzLnNjZW5lLCB0aGlzLmNhbWVyYSk7XHJcbiAgICBjb25zdCBzb3VyY2UgPSB0aGlzLnJlbmRlcmVyLmRvbUVsZW1lbnQ7XHJcbiAgICBjb25zdCBzY2FsZSA9IE1hdGgubWluKDEsIDgwMCAvIHNvdXJjZS53aWR0aCwgNjAwIC8gc291cmNlLmhlaWdodCk7XHJcbiAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcclxuICAgIGNhbnZhcy53aWR0aCA9IE1hdGgubWF4KDEsIE1hdGgucm91bmQoc291cmNlLndpZHRoICogc2NhbGUpKTtcclxuICAgIGNhbnZhcy5oZWlnaHQgPSBNYXRoLm1heCgxLCBNYXRoLnJvdW5kKHNvdXJjZS5oZWlnaHQgKiBzY2FsZSkpO1xyXG4gICAgY2FudmFzLmdldENvbnRleHQoJzJkJykuZHJhd0ltYWdlKHNvdXJjZSwgMCwgMCwgY2FudmFzLndpZHRoLCBjYW52YXMuaGVpZ2h0KTtcclxuXHJcbiAgICBoaWRkZW4uZm9yRWFjaCgoc3ByaXRlKSA9PiB7XHJcbiAgICAgIHNwcml0ZS52aXNpYmxlID0gdHJ1ZTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGNhbnZhcy50b0RhdGFVUkwoJ2ltYWdlL2pwZWcnLCAwLjg1KTtcclxuICB9XHJcblxyXG4gIC8qKiBBcm1zIHRhZyBwbGFjZW1lbnQ6IHRoZSBuZXh0IGNsaWNrIG9uIHRoZSBtb2RlbCBkcm9wcyBhIHRhZyBpbnN0ZWFkIG9mIGJlaW5nIGlnbm9yZWQuICovXHJcbiAgc3RhcnRUYWdQbGFjZW1lbnQocG9pVHlwZTogUG9pVHlwZSB8IG51bGwgPSBudWxsKTogdm9pZCB7XHJcbiAgICB0aGlzLnBsYWNpbmdUYWcgPSB0cnVlO1xyXG4gICAgdGhpcy5wbGFjZW1lbnRQb2lUeXBlID0gcG9pVHlwZTtcclxuICAgIHRoaXMucGVuZGluZ1RhZ1BsYWNlbWVudCA9IG51bGw7XHJcbiAgICBpZiAodGhpcy5yZW5kZXJlcikge1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLmRvbUVsZW1lbnQuc3R5bGUuY3Vyc29yID0gJ2Nyb3NzaGFpcic7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogTGVhdmVzIHBsYWNlbWVudCBtb2RlIHdpdGhvdXQgcGxhY2luZyBhbnl0aGluZy4gKi9cclxuICBjYW5jZWxUYWdQbGFjZW1lbnQoKTogdm9pZCB7XHJcbiAgICB0aGlzLnBsYWNpbmdUYWcgPSBmYWxzZTtcclxuICAgIHRoaXMucGVuZGluZ1RhZ1BsYWNlbWVudCA9IG51bGw7XHJcbiAgICB0aGlzLnBlbmRpbmdQcmV2aWV3RXZlbnQgPSBudWxsO1xyXG4gICAgdGhpcy5yZW1vdmVQbGFjZW1lbnRQcmV2aWV3KCk7XHJcbiAgICBpZiAodGhpcy5yZW5kZXJlcikge1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLmRvbUVsZW1lbnQuc3R5bGUuY3Vyc29yID0gJ2RlZmF1bHQnO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2hvd3MgYSB0cmFuc2x1Y2VudCB0YWcgdW5kZXIgdGhlIGN1cnNvciB3aGlsZSBwbGFjaW5nLCBzbyB0aGUgc3BvdCBpcyB2aXNpYmxlIGJlZm9yZSBjb21taXRpbmcuXHJcbiAgICpcclxuICAgKiBNYXR0ZXJwb3J0IGRvZXMgdGhpcyB3aXRoIGEgdGFnIHRoYXQgZm9sbG93cyB0aGUgcG9pbnRlcjsgdGhlIGVxdWl2YWxlbnQgaGVyZSBpcyBhIHByZXZpZXdcclxuICAgKiBzcHJpdGUgdGhhdCBnZXRzIHJlbW92ZWQgdGhlIG1vbWVudCB0aGUgcmVhbCB0YWcgdGFrZXMgaXRzIHBsYWNlLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgdXBkYXRlUGxhY2VtZW50UHJldmlldyhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xyXG4gICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLnBpY2tQb2ludE9uR3B1KGV2ZW50KTtcclxuICAgIGlmICghcG9zaXRpb24pIHtcclxuICAgICAgdGhpcy5yZW1vdmVQbGFjZW1lbnRQcmV2aWV3KCk7XHJcbiAgICAgIHRoaXMudXBkYXRlTWVhc3VyZVJ1YmJlckJhbmQobnVsbCk7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIuZG9tRWxlbWVudC5zdHlsZS5jdXJzb3IgPSAnbm90LWFsbG93ZWQnO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5yZW5kZXJlci5kb21FbGVtZW50LnN0eWxlLmN1cnNvciA9ICdjcm9zc2hhaXInO1xyXG4gICAgaWYgKCF0aGlzLnBsYWNlbWVudFByZXZpZXcpIHtcclxuICAgICAgdGhpcy5wbGFjZW1lbnRQcmV2aWV3ID0gbmV3IFRIUkVFLlNwcml0ZShcclxuICAgICAgICBuZXcgVEhSRUUuU3ByaXRlTWF0ZXJpYWwoe1xyXG4gICAgICAgICAgbWFwOiB0aGlzLmNyZWF0ZVRhZ1RleHR1cmUoJyM5RTlFOUUnKSxcclxuICAgICAgICAgIGRlcHRoVGVzdDogZmFsc2UsXHJcbiAgICAgICAgICB0cmFuc3BhcmVudDogdHJ1ZSxcclxuICAgICAgICAgIG9wYWNpdHk6IDAuNixcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gICAgICB0aGlzLnBsYWNlbWVudFByZXZpZXcucmVuZGVyT3JkZXIgPSA5OTk7XHJcbiAgICAgIHRoaXMudGFnR3JvdXAuYWRkKHRoaXMucGxhY2VtZW50UHJldmlldyk7XHJcbiAgICAgIHRoaXMuc2NhbGVUYWdGb3JNb2RlbCh0aGlzLnBsYWNlbWVudFByZXZpZXcpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5wbGFjZW1lbnRQcmV2aWV3LnBvc2l0aW9uLmNvcHkocG9zaXRpb24pO1xyXG4gICAgdGhpcy51cGRhdGVNZWFzdXJlUnViYmVyQmFuZChwb3NpdGlvbik7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGUgcG9pbnQgdW5kZXIgdGhlIGN1cnNvciwgcmVhZCBmcm9tIHRoZSBkZXB0aCBidWZmZXIgaW5zdGVhZCBvZiByYXljYXN0LCBpbiB0YWcgc3BhY2UuXHJcbiAgICpcclxuICAgKiBBIHJheWNhc3Qgd2Fsa3MgZXZlcnkgdHJpYW5nbGUgb2YgdGhlIG1lc2ggaXQgaGl0czogb24gYSBjYXB0dXJlZCBtb2RlbCB0aGF0IGlzIG1pbGxpb25zIG9mXHJcbiAgICogdGhlbSwgdGVucyBvZiBtaWxsaXNlY29uZHMsIGV2ZXJ5IHRpbWUgdGhlIHBvaW50ZXIgbW92ZXMuIENvYWxlc2NpbmcgdG8gb25lIHBlciBmcmFtZSBkaWQgbm90XHJcbiAgICogaGVscCwgYmVjYXVzZSB0aGUgY29zdCBpcyB0aGUgcGljayBpdHNlbGYgLSBpdCBzaW1wbHkgYmVjYW1lIG9uZSBzbG93IGZyYW1lIGluc3RlYWQgb2Ygc2V2ZXJhbC5cclxuICAgKlxyXG4gICAqIFJlbmRlcmluZyB0aGUgbW9kZWwncyBkZXB0aCBpbnRvIGEgc2luZ2xlIHBpeGVsIHVuZGVyIHRoZSBjdXJzb3IgYW5zd2VycyB0aGUgc2FtZSBxdWVzdGlvbiBvblxyXG4gICAqIHRoZSBHUFUgaW4gY29uc3RhbnQgdGltZSwgd2hhdGV2ZXIgdGhlIG1vZGVsJ3Mgc2l6ZS4gVGhlIGNhbWVyYSdzIHZpZXcgb2Zmc2V0IGlzIHdoYXQgbmFycm93c1xyXG4gICAqIHRoZSB3aG9sZSBpbWFnZSBkb3duIHRvIHRoYXQgb25lIHBpeGVsLCBzbyB0aGUgdmFsdWUgcmVhZCBiYWNrIGlzIHRoZSBkZXB0aCB0aGUgY3Vyc29yIGlzIG92ZXIuXHJcbiAgICpcclxuICAgKiBVc2VkIGZvciB0aGUgZ2hvc3Qgb25seS4gVGhlIGNsaWNrIHRoYXQgYWN0dWFsbHkgcGxhY2VzIGEgdGFnIHN0aWxsIHJheWNhc3RzOiBpdCBpcyBvbmUgcGljayxcclxuICAgKiBpdHMgY29zdCBkb2VzIG5vdCBtYXR0ZXIsIGFuZCBpdCB5aWVsZHMgdGhlIHN1cmZhY2Ugbm9ybWFsLCB3aGljaCBkZXB0aCBhbG9uZSBjYW5ub3QgZ2l2ZS5cclxuICAgKi9cclxuICBwcml2YXRlIHBpY2tQb2ludE9uR3B1KGV2ZW50OiBNb3VzZUV2ZW50KTogVEhSRUUuVmVjdG9yMyB8IG51bGwge1xyXG4gICAgaWYgKCF0aGlzLm1vZGVsUm9vdCB8fCAhdGhpcy5yZW5kZXJlciB8fCAhdGhpcy5jYW1lcmEpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF0aGlzLnBpY2tUYXJnZXQpIHtcclxuICAgICAgdGhpcy5waWNrVGFyZ2V0ID0gbmV3IFRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0KDEsIDEpO1xyXG4gICAgICB0aGlzLnBpY2tDYW1lcmEgPSBuZXcgVEhSRUUuUGVyc3BlY3RpdmVDYW1lcmEoKTtcclxuICAgICAgdGhpcy5waWNrQ2FtZXJhLmxheWVycy5zZXQoVGhyZWVKc1NlcnZpY2UuUElDS19MQVlFUik7XHJcbiAgICAgIHRoaXMucGlja0RlcHRoTWF0ZXJpYWwgPSBuZXcgVEhSRUUuTWVzaERlcHRoTWF0ZXJpYWwoe1xyXG4gICAgICAgIGRlcHRoUGFja2luZzogVEhSRUUuUkdCQURlcHRoUGFja2luZyxcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcmVjdCA9IHRoaXMucmVuZGVyZXIuZG9tRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgIGNvbnN0IHggPSBldmVudC5jbGllbnRYIC0gcmVjdC5sZWZ0O1xyXG4gICAgY29uc3QgeSA9IGV2ZW50LmNsaWVudFkgLSByZWN0LnRvcDtcclxuICAgIGlmICh4IDwgMCB8fCB5IDwgMCB8fCB4ID4gcmVjdC53aWR0aCB8fCB5ID4gcmVjdC5oZWlnaHQpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5waWNrQ2FtZXJhLmNvcHkodGhpcy5jYW1lcmEpO1xyXG4gICAgdGhpcy5waWNrQ2FtZXJhLmxheWVycy5zZXQoVGhyZWVKc1NlcnZpY2UuUElDS19MQVlFUik7XHJcbiAgICAvLyBSZW5kZXJzIHRoZSBvbmUgcGl4ZWwgdGhlIGN1cnNvciBpcyBvdmVyIGFzIGlmIGl0IHdlcmUgdGhlIHdob2xlIGltYWdlIC0gb2Zmc2V0IGJ5IGhhbGYgYVxyXG4gICAgLy8gcGl4ZWwgc28gdGhlIGN1cnNvciBzaXRzIGF0IHRoYXQgcGl4ZWwncyBjZW50cmUsIHdoaWNoIGlzIHdoZXJlIE5EQyAoMCwgMCkgbGFuZHMuXHJcbiAgICB0aGlzLnBpY2tDYW1lcmEuc2V0Vmlld09mZnNldChyZWN0LndpZHRoLCByZWN0LmhlaWdodCwgeCAtIDAuNSwgeSAtIDAuNSwgMSwgMSk7XHJcblxyXG4gICAgLy8gV2hlcmUgdGhlIG1vZGVsIGlzIG5vdCwgdGhlIHBpeGVsIG11c3QgcmVhZCBhcyBcIm5vdGhpbmdcIiwgc28gaXQgaXMgY2xlYXJlZCB0byB3aGl0ZSAtIGEgdmFsdWVcclxuICAgIC8vIG5vIHJlYWwgZGVwdGggcGFja3MgdG8uIFR3byB0aGluZ3Mgd291bGQgb3RoZXJ3aXNlIHBhaW50IG92ZXIgdGhhdDogdGhlIGRlZmF1bHQgYmxhY2sgY2xlYXIsXHJcbiAgICAvLyB3aGljaCBkZWNvZGVzIGFzIGRlcHRoIDAgKGEgaGl0IGFnYWluc3QgdGhlIGxlbnMpLCBhbmQgdGhlIHNjZW5lIGJhY2tncm91bmQsIHdoaWNoIHRocmVlLmpzXHJcbiAgICAvLyBkcmF3cyBpbiBwbGFjZSBvZiB0aGUgY2xlYXIgY29sb3VyIHdoZW5ldmVyIG9uZSBpcyBzZXQuXHJcbiAgICBjb25zdCBwcmV2aW91c0NsZWFyQ29sb3IgPSB0aGlzLnJlbmRlcmVyLmdldENsZWFyQ29sb3IobmV3IFRIUkVFLkNvbG9yKCkpO1xyXG4gICAgY29uc3QgcHJldmlvdXNDbGVhckFscGhhID0gdGhpcy5yZW5kZXJlci5nZXRDbGVhckFscGhhKCk7XHJcbiAgICBjb25zdCBwcmV2aW91c1RhcmdldCA9IHRoaXMucmVuZGVyZXIuZ2V0UmVuZGVyVGFyZ2V0KCk7XHJcbiAgICBjb25zdCBwcmV2aW91c0JhY2tncm91bmQgPSB0aGlzLnNjZW5lLmJhY2tncm91bmQ7XHJcblxyXG4gICAgdGhpcy5zY2VuZS5iYWNrZ3JvdW5kID0gbnVsbDtcclxuICAgIHRoaXMuc2NlbmUub3ZlcnJpZGVNYXRlcmlhbCA9IHRoaXMucGlja0RlcHRoTWF0ZXJpYWw7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldENsZWFyQ29sb3IoMHhmZmZmZmYsIDEpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQodGhpcy5waWNrVGFyZ2V0KTtcclxuICAgIHRoaXMucmVuZGVyZXIuY2xlYXIoKTtcclxuICAgIHRoaXMucmVuZGVyZXIucmVuZGVyKHRoaXMuc2NlbmUsIHRoaXMucGlja0NhbWVyYSk7XHJcblxyXG4gICAgdGhpcy5yZW5kZXJlci5yZWFkUmVuZGVyVGFyZ2V0UGl4ZWxzKHRoaXMucGlja1RhcmdldCwgMCwgMCwgMSwgMSwgdGhpcy5waWNrUGl4ZWwpO1xyXG5cclxuICAgIHRoaXMucmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KHByZXZpb3VzVGFyZ2V0KTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0Q2xlYXJDb2xvcihwcmV2aW91c0NsZWFyQ29sb3IsIHByZXZpb3VzQ2xlYXJBbHBoYSk7XHJcbiAgICB0aGlzLnNjZW5lLm92ZXJyaWRlTWF0ZXJpYWwgPSBudWxsO1xyXG4gICAgdGhpcy5zY2VuZS5iYWNrZ3JvdW5kID0gcHJldmlvdXNCYWNrZ3JvdW5kO1xyXG5cclxuICAgIGNvbnN0IFtyLCBnLCBiLCBhXSA9IHRoaXMucGlja1BpeGVsO1xyXG4gICAgaWYgKHIgPT09IDI1NSAmJiBnID09PSAyNTUgJiYgYiA9PT0gMjU1ICYmIGEgPT09IDI1NSkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBUaGUgaW52ZXJzZSBvZiB0aHJlZSdzIHBhY2tEZXB0aFRvUkdCQSwgd2hpY2ggc3RvcmVzIHRoZSB2YWx1ZSBpdHNlbGYgaW4gYWxwaGEgYW5kIGV2ZXIgZmluZXJcclxuICAgIC8vIGZyYWN0aW9ucyBvZiBpdCBpbiBibHVlLCBncmVlbiBhbmQgcmVkIC0gYWxwaGEgaXMgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYnl0ZSwgbm90IHJlZC4gUmVhZCB0aGVcclxuICAgIC8vIG90aGVyIHdheSByb3VuZCwgdGhlIHJlc3VsdCBpcyBtb3N0bHkgdGhlIGxvdy1vcmRlciBub2lzZSwgb2Z0ZW4gbmVhciB6ZXJvLCB3aGljaCB1bnByb2plY3RzXHJcbiAgICAvLyBvbnRvIHRoZSBuZWFyIHBsYW5lOiBhIGdob3N0IHByZXNzZWQgYWdhaW5zdCB0aGUgbGVucywgZmlsbGluZyB0aGUgd2hvbGUgc2NyZWVuLlxyXG4gICAgY29uc3QgZG93bnNjYWxlID0gMjU1IC8gMjU2O1xyXG4gICAgY29uc3QgZGVwdGggPVxyXG4gICAgICAociAvIDI1NSkgKiBkb3duc2NhbGUgLyAoMjU2ICogMjU2ICogMjU2KSArXHJcbiAgICAgIChnIC8gMjU1KSAqIGRvd25zY2FsZSAvICgyNTYgKiAyNTYpICtcclxuICAgICAgKGIgLyAyNTUpICogZG93bnNjYWxlIC8gMjU2ICtcclxuICAgICAgKGEgLyAyNTUpICogZG93bnNjYWxlO1xyXG5cclxuICAgIC8vIE5EQyB4IGFuZCB5IGFyZSB6ZXJvIGJlY2F1c2UgdGhlIHBpeGVsIHJlYWQgaXMgdGhlIGNlbnRyZSBvZiB0aGF0IG9uZS1waXhlbCBpbWFnZSAtIHdoaWNoIG9ubHlcclxuICAgIC8vIGhvbGRzIHdoaWxlIHRoZSB2aWV3IG9mZnNldCBpcyBpbiBlZmZlY3QuIENsZWFyaW5nIGl0IGZpcnN0IHdvdWxkIHVucHJvamVjdCB0aHJvdWdoIHRoZSBmdWxsXHJcbiAgICAvLyB2aWV3IGluc3RlYWQsIGxhbmRpbmcgdGhlIHBvaW50IG9uIHRoZSByYXkgdGhyb3VnaCB0aGUgbWlkZGxlIG9mIHRoZSBzY3JlZW4uIFRoZSBvZmZzZXQgaXNcclxuICAgIC8vIHNpbXBseSByZXBsYWNlZCBieSB0aGUgbmV4dCBwaWNrLCBzbyBpdCBpcyBuZXZlciBjbGVhcmVkLlxyXG4gICAgY29uc3Qgd29ybGQgPSBuZXcgVEhSRUUuVmVjdG9yMygwLCAwLCBkZXB0aCAqIDIgLSAxKS51bnByb2plY3QodGhpcy5waWNrQ2FtZXJhKTtcclxuICAgIHRoaXMudGFnR3JvdXAudXBkYXRlV29ybGRNYXRyaXgodHJ1ZSwgZmFsc2UpO1xyXG4gICAgcmV0dXJuIHRoaXMudGFnR3JvdXAud29ybGRUb0xvY2FsKHdvcmxkKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVtb3ZlUGxhY2VtZW50UHJldmlldygpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5wbGFjZW1lbnRQcmV2aWV3KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMudGFnR3JvdXAucmVtb3ZlKHRoaXMucGxhY2VtZW50UHJldmlldyk7XHJcbiAgICB0aGlzLnBsYWNlbWVudFByZXZpZXcubWF0ZXJpYWwubWFwPy5kaXNwb3NlKCk7XHJcbiAgICB0aGlzLnBsYWNlbWVudFByZXZpZXcubWF0ZXJpYWwuZGlzcG9zZSgpO1xyXG4gICAgdGhpcy5wbGFjZW1lbnRQcmV2aWV3ID0gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgLyoqIFNob3dzIG9yIGhpZGVzIG9uZSB0YWcsIGxlYXZpbmcgaXQgcmVnaXN0ZXJlZCBzbyBpdCBjYW4gYmUgYnJvdWdodCBiYWNrIHdpdGhvdXQgcmVsb2FkaW5nLiAqL1xyXG4gIHNldFRhZ1Zpc2liaWxpdHkoZWxlbWVudElkOiBzdHJpbmcsIHZpc2libGU6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGNvbnN0IHNwcml0ZSA9IHRoaXMudGFnU3ByaXRlcy5nZXQoZWxlbWVudElkKTtcclxuICAgIGlmIChzcHJpdGUpIHtcclxuICAgICAgc3ByaXRlLnZpc2libGUgPSB2aXNpYmxlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2hvd3Mgb25seSB0YWdzIG9mIHRoZSBnaXZlbiB0eXBlcywgaGlkaW5nIHRoZSByZXN0LlxyXG4gICAqXHJcbiAgICogUGFzc2luZyBudWxsIHNob3dzIGV2ZXJ5dGhpbmcgLSB0aGUgXCJubyBmaWx0ZXJcIiBzdGF0ZSwgZGlzdGluY3QgZnJvbSBhbiBlbXB0eSBhcnJheSwgd2hpY2ggaXMgYVxyXG4gICAqIGZpbHRlciB0aGF0IGhhcHBlbnMgdG8gbWF0Y2ggbm90aGluZy5cclxuICAgKi9cclxuICBzZXRWaXNpYmxlVGFnVHlwZXModHlwZXM6IFBvaVR5cGVbXSB8IG51bGwpOiB2b2lkIHtcclxuICAgIHRoaXMudmlzaWJsZVRhZ1R5cGVzID0gdHlwZXM7XHJcbiAgICB0aGlzLnRhZ1Nwcml0ZXMuZm9yRWFjaCgoc3ByaXRlKSA9PiB0aGlzLmFwcGx5VGFnVmlzaWJpbGl0eShzcHJpdGUpKTtcclxuICB9XHJcblxyXG4gIC8qKiBTYXlzIHdoaWNoIGNhcHR1cmUgaXMgb24gc2NyZWVuLCBzbyB0aGUgdGFncyBwbGFjZWQgaW4gaXQgY2FuIGJlIHRvbGQgZnJvbSB0aGUgcmVzdC4gKi9cclxuICBzZXRDdXJyZW50Q2FwdHVyZShjYXB0dXJlSUQ6IHN0cmluZyB8IG51bGwpOiB2b2lkIHtcclxuICAgIHRoaXMuY3VycmVudENhcHR1cmVJRCA9IGNhcHR1cmVJRDtcclxuICAgIHRoaXMudGFnU3ByaXRlcy5mb3JFYWNoKChzcHJpdGUpID0+IHtcclxuICAgICAgdGhpcy5wYXJlbnRUYWcoc3ByaXRlKTtcclxuICAgICAgdGhpcy5hcHBseVRhZ1Zpc2liaWxpdHkoc3ByaXRlKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqIEV2ZXJ5IHRhZyByZWdpc3RlcmVkIGluIHRoZSBzY2VuZSwgc2hvd24gb3Igbm90LiAqL1xyXG4gIGdldFRhZ3MoKToge1xyXG4gICAgaWQ6IHN0cmluZztcclxuICAgIGxhYmVsOiBzdHJpbmcgfCBudWxsO1xyXG4gICAgcG9pVHlwZTogUG9pVHlwZSB8IG51bGw7XHJcbiAgICB2aXNpYmxlOiBib29sZWFuO1xyXG4gICAgLyoqIFdoZXRoZXIgdGhlIGNhbGlicmF0aW9uIHdhbGt0aHJvdWdoIGNhbiB1c2UgaXQuICovXHJcbiAgICBjYWxpYnJhdGFibGU6IGJvb2xlYW47XHJcbiAgfVtdIHtcclxuICAgIGNvbnN0IGNhbmRpZGF0ZXMgPSBuZXcgU2V0KHRoaXMuY2FsaWJyYXRpb25DYW5kaWRhdGVzKCkpO1xyXG4gICAgcmV0dXJuIFsuLi50aGlzLnRhZ1Nwcml0ZXMudmFsdWVzKCldLm1hcCgoc3ByaXRlKSA9PiAoe1xyXG4gICAgICBpZDogc3ByaXRlLm5hbWUsXHJcbiAgICAgIGxhYmVsOiBzcHJpdGUudXNlckRhdGEubGFiZWwgPz8gbnVsbCxcclxuICAgICAgcG9pVHlwZTogc3ByaXRlLnVzZXJEYXRhLnBvaVR5cGUgPz8gbnVsbCxcclxuICAgICAgdmlzaWJsZTogc3ByaXRlLnZpc2libGUsXHJcbiAgICAgIGNhbGlicmF0YWJsZTogY2FuZGlkYXRlcy5oYXMoc3ByaXRlKSxcclxuICAgIH0pKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhvdyBmYXIgdGhlIHRhZ3MgZnJvbSBlbHNld2hlcmUgc2l0IGZyb20gdGhlIG1vZGVsLCBtZWFzdXJlZCBpbiBtb2RlbCByYWRpaS4gTnVsbCB3aXRob3V0IGJvdGguXHJcbiAgICpcclxuICAgKiBCZWZvcmUgYSBtb2RlbCBpcyBjYWxpYnJhdGVkIHRob3NlIHRhZ3MgYXJlIHdoZXJldmVyIHRoZWlyIG93biBjb29yZGluYXRlcyBwdXQgdGhlbSwgd2hpY2ggZm9yXHJcbiAgICogYSBtb2RlbCB3aXRoIGEgZGlmZmVyZW50IG9yaWdpbiBjYW4gYmUgYSBsb25nIHdheSBvZmYgLSB0b28gZmFyIHRvIGZpbmQsIGxldCBhbG9uZSBjbGljay5cclxuICAgKi9cclxuICBnZXRUYWdEaXN0YW5jZUZyb21Nb2RlbCgpOiBudW1iZXIgfCBudWxsIHtcclxuICAgIGlmICghdGhpcy5tb2RlbFJvb3QgfHwgIXRoaXMubW9kZWxXb3JsZFJhZGl1cykge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIGNvbnN0IGNlbnRyb2lkID0gbmV3IFRIUkVFLlZlY3RvcjMoKTtcclxuICAgIGNvbnN0IGNhbmRpZGF0ZXMgPSB0aGlzLmNhbGlicmF0aW9uQ2FuZGlkYXRlcygpO1xyXG4gICAgY2FuZGlkYXRlcy5mb3JFYWNoKChzcHJpdGUpID0+IGNlbnRyb2lkLmFkZChzcHJpdGUuZ2V0V29ybGRQb3NpdGlvbihuZXcgVEhSRUUuVmVjdG9yMygpKSkpO1xyXG4gICAgY29uc3QgY291bnQgPSBjYW5kaWRhdGVzLmxlbmd0aDtcclxuICAgIGlmIChjb3VudCA9PT0gMCkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIC8vIFRoZSBtb2RlbCBpcyBjZW50cmVkIG9uIHRoZSB3b3JsZCBvcmlnaW4gd2hlbiBpdCBpcyBwbGFjZWQuXHJcbiAgICByZXR1cm4gY2VudHJvaWQuZGl2aWRlU2NhbGFyKGNvdW50KS5sZW5ndGgoKSAvIHRoaXMubW9kZWxXb3JsZFJhZGl1cztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmdzIGEgdGFnIGZyb20gdGhlIGdyb3VwIGl0cyBjb29yZGluYXRlcyBiZWxvbmcgdG86IG91dHNpZGUgdGhlIGNhbGlicmF0aW9uIHdoZW4gdGhleSBhcmUgaW5cclxuICAgKiB0aGlzIG1vZGVsJ3Mgb3duIGNvb3JkaW5hdGVzLCB1bmRlciBpdCBvdGhlcndpc2UuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBwYXJlbnRUYWcoc3ByaXRlOiBUSFJFRS5PYmplY3QzRCk6IHZvaWQge1xyXG4gICAgY29uc3QgcGFyZW50ID0gc3ByaXRlLnVzZXJEYXRhLmZyYW1lID09PSAnbW9kZWwnICYmIHRoaXMuaXNPd25lZEJ5VmlzaXQoc3ByaXRlKVxyXG4gICAgICA/IHRoaXMubW9kZWxUYWdHcm91cFxyXG4gICAgICA6IHRoaXMudGFnR3JvdXA7XHJcbiAgICBpZiAoc3ByaXRlLnBhcmVudCAhPT0gcGFyZW50KSB7XHJcbiAgICAgIHBhcmVudC5hZGQoc3ByaXRlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSB0YWdzIGEgY2FsaWJyYXRpb24gY2FuIGJlIHdvcmtlZCBvdXQgZnJvbTogdGhvc2UgdGhhdCBjYW1lIGZyb20gc29tZXdoZXJlIGVsc2UsIHdoZXRoZXIgb3JcclxuICAgKiBub3QgdGhleSBhcmUgb24gc2hvdyAtIGJlZm9yZSBjYWxpYnJhdGluZywgbW9zdCBvZiB0aGVtIHdpbGwgbm90IGJlLlxyXG4gICAqXHJcbiAgICogVGFncyBwbGFjZWQgaW4gdGhpcyBtb2RlbCBhcmUgd2hlcmUgdGhleSBhcmUgYmVjYXVzZSBzb21lb25lIGNsaWNrZWQgdGhlcmU7IG1hdGNoaW5nIHRoZW0gdG9cclxuICAgKiBcIndoZXJlIHRoZXkgcmVhbGx5IGFyZVwiIHdvdWxkIGJlIGNpcmN1bGFyLiBBIHRhZyBpbiBhbm90aGVyIG1vZGVsJ3Mgb3duIGNvb3JkaW5hdGVzIGNhbm5vdCBiZVxyXG4gICAqIHBsYWNlZCBoZXJlIGF0IGFsbC4gQW5kIGEgdGFnIGFscmVhZHkgdXNlZCBpbiB0aGlzIGNhbGlicmF0aW9uIGNhbm5vdCBiZSB1c2VkIGFnYWluIC0gdHdvXHJcbiAgICogcGFpcnMgZnJvbSBvbmUgdGFnIGNhcnJ5IG5vIG1vcmUgdGhhbiBvbmUuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBjYWxpYnJhdGlvbkNhbmRpZGF0ZXMoKTogVEhSRUUuT2JqZWN0M0RbXSB7XHJcbiAgICBjb25zdCB1c2VkID0gbmV3IFNldCh0aGlzLmFsaWdubWVudFBhaXJzLm1hcCgocGFpcikgPT4gcGFpci50YWdJZCkpO1xyXG4gICAgcmV0dXJuIFsuLi50aGlzLnRhZ1Nwcml0ZXMudmFsdWVzKCldLmZpbHRlcigoc3ByaXRlKSA9PlxyXG4gICAgICBzcHJpdGUucGFyZW50ID09PSB0aGlzLnRhZ0dyb3VwXHJcbiAgICAgICYmIHNwcml0ZS51c2VyRGF0YS5mcmFtZSAhPT0gJ21vZGVsJ1xyXG4gICAgICAmJiAhdGhpcy5pc093bmVkQnlWaXNpdChzcHJpdGUpXHJcbiAgICAgICYmICF1c2VkLmhhcyhzcHJpdGUubmFtZSkpO1xyXG4gIH1cclxuXHJcbiAgLyoqIEhvdyBtYW55IHRhZ3MgdGhlcmUgYXJlIHRvIGNhbGlicmF0ZSB3aXRoLCBub3QgY291bnRpbmcgdGhvc2UgYWxyZWFkeSB1c2VkLiAqL1xyXG4gIGdldENhbGlicmF0aW9uQ2FuZGlkYXRlQ291bnQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLmNhbGlicmF0aW9uQ2FuZGlkYXRlcygpLmxlbmd0aDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhvdyBtYW55IHRhZ3MgZnJvbSBlbHNld2hlcmUgYXJlIG5vdCBvbiB0aGlzIG1vZGVsLCBhbmQgc28gbm90IHNob3duIG9uIGl0LlxyXG4gICAqXHJcbiAgICogT24gYSBtb2RlbCB0aGF0IGhhcyBub3QgYmVlbiBjYWxpYnJhdGVkLCB0aGlzIGlzIHdoYXQgc3VnZ2VzdHMgaXQgc2hvdWxkIGJlOiB0aGUgdGFncyBhcmUgb3V0XHJcbiAgICogdGhlcmUsIGp1c3Qgbm90IHdoZXJlIHRoZSBtb2RlbCBpcy5cclxuICAgKi9cclxuICBnZXRPZmZNb2RlbFRhZ0NvdW50KCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5jYWxpYnJhdGlvbkNhbmRpZGF0ZXMoKS5maWx0ZXIoKHNwcml0ZSkgPT4gIXRoaXMuaXNPbk1vZGVsKHNwcml0ZSkpLmxlbmd0aDtcclxuICB9XHJcblxyXG4gIC8qKiBXaGV0aGVyIHRoZSB0YWcgd2FzIHBsYWNlZCBpbiB0aGUgdmlzaXQgb24gc2NyZWVuLiAqL1xyXG4gIHByaXZhdGUgaXNPd25lZEJ5VmlzaXQoc3ByaXRlOiBUSFJFRS5PYmplY3QzRCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICEhc3ByaXRlLnVzZXJEYXRhLm9yaWdpbkNhcHR1cmVJRFxyXG4gICAgICAmJiBzcHJpdGUudXNlckRhdGEub3JpZ2luQ2FwdHVyZUlEID09PSB0aGlzLmN1cnJlbnRDYXB0dXJlSUQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBIHRhZyBzaG93cyB3aGVuIGl0cyB0eXBlIGlzIG5vdCBmaWx0ZXJlZCBvdXQgYW5kIGl0IGJlbG9uZ3Mgb24gdGhpcyBtb2RlbC5cclxuICAgKlxyXG4gICAqIE9uZSBwbGFjZSBkZWNpZGVzLCBiZWNhdXNlIHRoZSB0d28gdXNlZCB0byBzZXQgYHZpc2libGVgIHNlcGFyYXRlbHkgYW5kIHdoaWNoZXZlciByYW4gbGFzdFxyXG4gICAqIHVuZGlkIHRoZSBvdGhlci5cclxuICAgKi9cclxuICBwcml2YXRlIGFwcGx5VGFnVmlzaWJpbGl0eShzcHJpdGU6IFRIUkVFLk9iamVjdDNEKTogdm9pZCB7XHJcbiAgICBjb25zdCB0eXBlQWxsb3dlZCA9IHRoaXMudmlzaWJsZVRhZ1R5cGVzID09PSBudWxsXHJcbiAgICAgIHx8IHRoaXMudmlzaWJsZVRhZ1R5cGVzLmluY2x1ZGVzKHNwcml0ZS51c2VyRGF0YS5wb2lUeXBlKTtcclxuICAgIHNwcml0ZS52aXNpYmxlID0gdHlwZUFsbG93ZWQgJiYgdGhpcy5iZWxvbmdzT25UaGlzTW9kZWwoc3ByaXRlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFdoZXRoZXIgYSB0YWcgaGFzIGEgcGxhY2Ugb24gdGhpcyBtb2RlbC5cclxuICAgKlxyXG4gICAqIEV2ZXJ5IHRhZyBvZiB0aGUgc3BhY2UgaXMgb2ZmZXJlZCB0byBldmVyeSBtb2RlbCAtIHRoZXJlIGlzIG9uZSBzZXQgb2YgdGFncywgbm90IG9uZSBwZXIgbW9kZWwuXHJcbiAgICogV2hhdCBhIG1vZGVsIHNob3dzIG9mIGl0IGlzIHRoZSBwYXJ0IHRoYXQgc2l0cyBvbiB0aGUgbW9kZWwuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBiZWxvbmdzT25UaGlzTW9kZWwoc3ByaXRlOiBUSFJFRS5PYmplY3QzRCk6IGJvb2xlYW4ge1xyXG4gICAgLy8gUGxhY2VkIGhlcmUgYnkgYSBjbGljayBvbiB0aGlzIHZlcnkgc3VyZmFjZS5cclxuICAgIGlmICh0aGlzLmlzT3duZWRCeVZpc2l0KHNwcml0ZSkpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICAvLyBQbGFjZWQgaW4gYW5vdGhlciBtb2RlbCBiZWZvcmUgdGhhdCBvbmUgd2FzIGNhbGlicmF0ZWQ6IGl0cyBjb29yZGluYXRlcyBhcmUgdGhhdCBtb2RlbCdzIG93blxyXG4gICAgLy8gYW5kIHNheSBub3RoaW5nIGFib3V0IHdoZXJlIGl0IHdvdWxkIGJlIGluIHRoaXMgb25lLlxyXG4gICAgaWYgKHNwcml0ZS51c2VyRGF0YS5mcmFtZSA9PT0gJ21vZGVsJykge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICAvLyBDYWxpYnJhdGluZyBpcyBtYXRjaGluZyB0YWdzIHRvIHdoZXJlIHRoZXkgYmVsb25nLCBzbyB0aGV5IGFsbCBoYXZlIHRvIGJlIG9uIG9mZmVyLlxyXG4gICAgaWYgKHRoaXMuYWxpZ25pbmcpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5pc09uTW9kZWwoc3ByaXRlKTtcclxuICB9XHJcblxyXG4gIC8qKiBXaGV0aGVyIGEgdGFnLCBkcmF3biB3aGVyZSBpdHMgY29vcmRpbmF0ZXMgYW5kIHRoZSBjYWxpYnJhdGlvbiBwdXQgaXQsIHNpdHMgb24gdGhlIG1vZGVsLiAqL1xyXG4gIHByaXZhdGUgaXNPbk1vZGVsKHNwcml0ZTogVEhSRUUuT2JqZWN0M0QpOiBib29sZWFuIHtcclxuICAgIGlmICghdGhpcy5zdXJmYWNlQ2VsbHMpIHtcclxuICAgICAgLy8gTm8gbW9kZWwgdG8gYmUgb24geWV0LlxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBjb25zdCBwYXJlbnQgPSBzcHJpdGUucGFyZW50ID8/IHRoaXMudGFnR3JvdXA7XHJcbiAgICBwYXJlbnQudXBkYXRlTWF0cml4KCk7XHJcbiAgICAvLyBUaGUgZ3JpZCBpcyBpbiB0aGUgbW9kZWwncyBvd24gdW5pdHM7IHRoZSBjYWxpYnJhdGlvbidzIHNjYWxlIGlzIGhvdyBtYW55IG9mIHRob3NlIGEgbWV0cmUgaXMuXHJcbiAgICBjb25zdCByZWFjaCA9IFRocmVlSnNTZXJ2aWNlLk9OX01PREVMX01FVFJFUyAqIChwYXJlbnQuc2NhbGUueCB8fCAxKTtcclxuICAgIHJldHVybiB0aGlzLmlzTmVhclN1cmZhY2Uoc3ByaXRlLnBvc2l0aW9uLmNsb25lKCkuYXBwbHlNYXRyaXg0KHBhcmVudC5tYXRyaXgpLCByZWFjaCk7XHJcbiAgfVxyXG5cclxuICAvKiogUmUtZGVjaWRlcyBldmVyeSB0YWcncyB2aXNpYmlsaXR5OiB0aGUgbW9kZWwsIHRoZSBjYWxpYnJhdGlvbiBvciB0aGUgbW9kZSBjaGFuZ2VkLiAqL1xyXG4gIHByaXZhdGUgcmVmcmVzaFRhZ1Zpc2liaWxpdHkoKTogdm9pZCB7XHJcbiAgICB0aGlzLnRhZ1Nwcml0ZXMuZm9yRWFjaCgoc3ByaXRlKSA9PiB0aGlzLmFwcGx5VGFnVmlzaWJpbGl0eShzcHJpdGUpKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3VyZmFjZUtleSh4OiBudW1iZXIsIHk6IG51bWJlciwgejogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGNvbnN0IHNwYW4gPSBUaHJlZUpzU2VydmljZS5TVVJGQUNFX0dSSURfU1BBTjtcclxuICAgIGNvbnN0IHBhZCA9IFRocmVlSnNTZXJ2aWNlLlNVUkZBQ0VfR1JJRF9QQUQ7XHJcbiAgICBjb25zdCBbaSwgaiwga10gPSBbeCArIHBhZCwgeSArIHBhZCwgeiArIHBhZF07XHJcbiAgICBpZiAoaSA8IDAgfHwgaiA8IDAgfHwgayA8IDAgfHwgaSA+PSBzcGFuIHx8IGogPj0gc3BhbiB8fCBrID49IHNwYW4pIHtcclxuICAgICAgcmV0dXJuIC0xO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGkgKyBzcGFuICogKGogKyBzcGFuICogayk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBMYXlzIHRoZSBncmlkIG92ZXIgdGhlIG1vZGVsJ3Mgc3VyZmFjZS5cclxuICAgKlxyXG4gICAqIFJ1bnMgb25jZSBwZXIgbW9kZWwsIGluIG9uZSBwYXNzIG92ZXIgaXRzIHRyaWFuZ2xlcy4gQSB0cmlhbmdsZSBzbWFsbGVyIHRoYW4gYSBjZWxsIGlzIG1hcmtlZFxyXG4gICAqIGJ5IGl0cyBjZW50cmUsIHdoaWNoIGlzIGV2ZXJ5IHRyaWFuZ2xlIG9mIGEgc2Nhbm5lZCBtb2RlbDsgYSBsYXJnZXIgb25lIC0gdGhlIHR3byB0cmlhbmdsZXMgb2ZcclxuICAgKiBhIGRyYXduIHdhbGwgLSBpcyBzYW1wbGVkIGFjcm9zcyBpdHMgZmFjZSwgb3IgdGhlIG1pZGRsZSBvZiB0aGUgd2FsbCB3b3VsZCByZWFkIGFzIGVtcHR5LlxyXG4gICAqL1xyXG4gIHByaXZhdGUgYnVpbGRTdXJmYWNlR3JpZChvYmplY3Q6IFRIUkVFLk9iamVjdDNELCBib3g6IFRIUkVFLkJveDMpOiB2b2lkIHtcclxuICAgIGNvbnN0IHNpemUgPSBib3guZ2V0U2l6ZShuZXcgVEhSRUUuVmVjdG9yMygpKTtcclxuICAgIGNvbnN0IGxvbmdlc3QgPSBNYXRoLm1heChzaXplLngsIHNpemUueSwgc2l6ZS56KTtcclxuICAgIGlmICghKGxvbmdlc3QgPiAwKSkge1xyXG4gICAgICB0aGlzLnN1cmZhY2VDZWxscyA9IG51bGw7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIC8vIEEgcXVhcnRlciBvZiBhIG1ldHJlIHdoZXJlIHRoZSBtb2RlbCBpcyBpbiBtZXRyZXM7IGNvYXJzZXIgb24gYSB2ZXJ5IGxhcmdlIG9uZSwgc28gdGhlIGdyaWRcclxuICAgIC8vIHN0YXlzIGFkZHJlc3NhYmxlIGFuZCBpdHMgbWVtb3J5IGJvdW5kZWQuXHJcbiAgICBjb25zdCBjZWxsID0gTWF0aC5tYXgoMC4yNSwgbG9uZ2VzdCAvIDM4NCk7XHJcbiAgICBjb25zdCBvcmlnaW4gPSBib3gubWluLmNsb25lKCk7XHJcbiAgICBjb25zdCBjZWxscyA9IG5ldyBTZXQ8bnVtYmVyPigpO1xyXG4gICAgY29uc3QgbWFyayA9IChwb2ludDogVEhSRUUuVmVjdG9yMykgPT4ge1xyXG4gICAgICBjb25zdCBrZXkgPSB0aGlzLnN1cmZhY2VLZXkoXHJcbiAgICAgICAgTWF0aC5mbG9vcigocG9pbnQueCAtIG9yaWdpbi54KSAvIGNlbGwpLFxyXG4gICAgICAgIE1hdGguZmxvb3IoKHBvaW50LnkgLSBvcmlnaW4ueSkgLyBjZWxsKSxcclxuICAgICAgICBNYXRoLmZsb29yKChwb2ludC56IC0gb3JpZ2luLnopIC8gY2VsbCksXHJcbiAgICAgICk7XHJcbiAgICAgIGlmIChrZXkgPj0gMCkge1xyXG4gICAgICAgIGNlbGxzLmFkZChrZXkpO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIGxldCB0cmlhbmdsZUNvdW50ID0gMDtcclxuICAgIG9iamVjdC51cGRhdGVNYXRyaXhXb3JsZCh0cnVlKTtcclxuICAgIG9iamVjdC50cmF2ZXJzZSgoY2hpbGQ6IGFueSkgPT4ge1xyXG4gICAgICBjb25zdCBwb3NpdGlvbiA9IGNoaWxkLmlzTWVzaCAmJiBjaGlsZC5nZW9tZXRyeT8uYXR0cmlidXRlcz8ucG9zaXRpb247XHJcbiAgICAgIGlmIChwb3NpdGlvbikge1xyXG4gICAgICAgIHRyaWFuZ2xlQ291bnQgKz0gKGNoaWxkLmdlb21ldHJ5LmluZGV4ID8gY2hpbGQuZ2VvbWV0cnkuaW5kZXguY291bnQgOiBwb3NpdGlvbi5jb3VudCkgLyAzO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIC8vIFBhc3QgYSBmZXcgbWlsbGlvbiB0cmlhbmdsZXMgdGhleSBhcmUgZmFyIHNtYWxsZXIgdGhhbiBhIGNlbGwsIGFuZCBldmVyeSBjZWxsIGlzIGhpdCBtYW55XHJcbiAgICAvLyB0aW1lcyBvdmVyOyBhIHNhbXBsZSBtYXJrcyB0aGUgc2FtZSBjZWxscy5cclxuICAgIGNvbnN0IHN0cmlkZSA9IE1hdGgubWF4KDEsIE1hdGguY2VpbCh0cmlhbmdsZUNvdW50IC8gMzAwMDAwMCkpO1xyXG5cclxuICAgIGNvbnN0IGEgPSBuZXcgVEhSRUUuVmVjdG9yMygpO1xyXG4gICAgY29uc3QgYiA9IG5ldyBUSFJFRS5WZWN0b3IzKCk7XHJcbiAgICBjb25zdCBjID0gbmV3IFRIUkVFLlZlY3RvcjMoKTtcclxuICAgIGNvbnN0IHBvaW50ID0gbmV3IFRIUkVFLlZlY3RvcjMoKTtcclxuICAgIG9iamVjdC50cmF2ZXJzZSgoY2hpbGQ6IGFueSkgPT4ge1xyXG4gICAgICBjb25zdCBwb3NpdGlvbiA9IGNoaWxkLmlzTWVzaCAmJiBjaGlsZC5nZW9tZXRyeT8uYXR0cmlidXRlcz8ucG9zaXRpb247XHJcbiAgICAgIGlmICghcG9zaXRpb24pIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgaW5kZXggPSBjaGlsZC5nZW9tZXRyeS5pbmRleDtcclxuICAgICAgY29uc3QgY291bnQgPSAoaW5kZXggPyBpbmRleC5jb3VudCA6IHBvc2l0aW9uLmNvdW50KSAvIDM7XHJcbiAgICAgIGZvciAobGV0IHRyaWFuZ2xlID0gMDsgdHJpYW5nbGUgPCBjb3VudDsgdHJpYW5nbGUgKz0gc3RyaWRlKSB7XHJcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdHJpYW5nbGUgKiAzO1xyXG4gICAgICAgIGEuZnJvbUJ1ZmZlckF0dHJpYnV0ZShwb3NpdGlvbiwgaW5kZXggPyBpbmRleC5nZXRYKG9mZnNldCkgOiBvZmZzZXQpLmFwcGx5TWF0cml4NChjaGlsZC5tYXRyaXhXb3JsZCk7XHJcbiAgICAgICAgYi5mcm9tQnVmZmVyQXR0cmlidXRlKHBvc2l0aW9uLCBpbmRleCA/IGluZGV4LmdldFgob2Zmc2V0ICsgMSkgOiBvZmZzZXQgKyAxKS5hcHBseU1hdHJpeDQoY2hpbGQubWF0cml4V29ybGQpO1xyXG4gICAgICAgIGMuZnJvbUJ1ZmZlckF0dHJpYnV0ZShwb3NpdGlvbiwgaW5kZXggPyBpbmRleC5nZXRYKG9mZnNldCArIDIpIDogb2Zmc2V0ICsgMikuYXBwbHlNYXRyaXg0KGNoaWxkLm1hdHJpeFdvcmxkKTtcclxuICAgICAgICBjb25zdCBlZGdlID0gTWF0aC5tYXgoYS5kaXN0YW5jZVRvKGIpLCBiLmRpc3RhbmNlVG8oYyksIGMuZGlzdGFuY2VUbyhhKSk7XHJcbiAgICAgICAgaWYgKGVkZ2UgPD0gY2VsbCkge1xyXG4gICAgICAgICAgbWFyayhwb2ludC5jb3B5KGEpLmFkZChiKS5hZGQoYykubXVsdGlwbHlTY2FsYXIoMSAvIDMpKTtcclxuICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBIYWxmLWNlbGwgc3RlcHMgYWNyb3NzIHRoZSBmYWNlLiBDYXBwZWQsIHNvIG9uZSBlbm9ybW91cyB0cmlhbmdsZSBjYW5ub3Qgc3RhbGwgdGhlIGxvYWQ7XHJcbiAgICAgICAgLy8gdGhlIHJlYWNoIGEgdGFnIGlzIHRlc3RlZCB3aXRoIHNwYW5zIHNldmVyYWwgY2VsbHMgYW5kIGJyaWRnZXMgd2hhdCB0aGUgY2FwIGxlYXZlcy5cclxuICAgICAgICBjb25zdCBzdGVwcyA9IE1hdGgubWluKDk2LCBNYXRoLmNlaWwoKDIgKiBlZGdlKSAvIGNlbGwpKTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8PSBzdGVwczsgaSArPSAxKSB7XHJcbiAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8PSBzdGVwcyAtIGk7IGogKz0gMSkge1xyXG4gICAgICAgICAgICBwb2ludC5jb3B5KGEpXHJcbiAgICAgICAgICAgICAgLmFkZFNjYWxlZFZlY3RvcihiLmNsb25lKCkuc3ViKGEpLCBpIC8gc3RlcHMpXHJcbiAgICAgICAgICAgICAgLmFkZFNjYWxlZFZlY3RvcihjLmNsb25lKCkuc3ViKGEpLCBqIC8gc3RlcHMpO1xyXG4gICAgICAgICAgICBtYXJrKHBvaW50KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuc3VyZmFjZUNlbGxzID0gY2VsbHM7XHJcbiAgICB0aGlzLnN1cmZhY2VPcmlnaW4uY29weShvcmlnaW4pO1xyXG4gICAgdGhpcy5zdXJmYWNlQ2VsbFNpemUgPSBjZWxsO1xyXG4gIH1cclxuXHJcbiAgLyoqIFdoZXRoZXIgc29tZSBwYXJ0IG9mIHRoZSBtb2RlbCdzIHN1cmZhY2UgbGllcyB3aXRoaW4gYHJlYWNoYCBvZiBhIHBvaW50LCBpbiBtb2RlbCB1bml0cy4gKi9cclxuICBwcml2YXRlIGlzTmVhclN1cmZhY2UocG9pbnQ6IFRIUkVFLlZlY3RvcjMsIHJlYWNoOiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGNlbGwgPSB0aGlzLnN1cmZhY2VDZWxsU2l6ZTtcclxuICAgIGNvbnN0IG9yaWdpbiA9IHRoaXMuc3VyZmFjZU9yaWdpbjtcclxuICAgIGNvbnN0IHggPSAocG9pbnQueCAtIG9yaWdpbi54KSAvIGNlbGw7XHJcbiAgICBjb25zdCB5ID0gKHBvaW50LnkgLSBvcmlnaW4ueSkgLyBjZWxsO1xyXG4gICAgY29uc3QgeiA9IChwb2ludC56IC0gb3JpZ2luLnopIC8gY2VsbDtcclxuICAgIC8vIEluIGNlbGxzLiBDYXBwZWQ6IGJleW9uZCB0aGlzIHRoZSBjYWxpYnJhdGlvbidzIHNjYWxlIG1ha2VzIGEgbWV0cmUgc28gbWFueSBjZWxscyB0aGF0IHRoZVxyXG4gICAgLy8gc2VhcmNoIHdvdWxkIGR3YXJmIHRoZSBtb2RlbCwgYW5kIGEgdGFnIHRoYXQgZmFyIG9mZiBpcyBub3Qgb24gaXQgYnkgYW55IHJlYWRpbmcuXHJcbiAgICBjb25zdCBzcGFuID0gTWF0aC5taW4oMTYsIE1hdGguY2VpbChyZWFjaCAvIGNlbGwpKTtcclxuICAgIC8vIEEgY2VsbCBpcyBcIndpdGhpbiByZWFjaFwiIHdoZW4gaXRzIGNlbnRyZSBpcywgZ2l2ZSBvciB0YWtlIHRoZSBoYWxmLWRpYWdvbmFsIG9mIHRoZSBjZWxsLlxyXG4gICAgY29uc3QgbGltaXQgPSAocmVhY2ggLyBjZWxsICsgMC44NykgKiogMjtcclxuICAgIGNvbnN0IFtjeCwgY3ksIGN6XSA9IFtNYXRoLmZsb29yKHgpLCBNYXRoLmZsb29yKHkpLCBNYXRoLmZsb29yKHopXTtcclxuICAgIGZvciAobGV0IGsgPSBjeiAtIHNwYW47IGsgPD0gY3ogKyBzcGFuOyBrICs9IDEpIHtcclxuICAgICAgZm9yIChsZXQgaiA9IGN5IC0gc3BhbjsgaiA8PSBjeSArIHNwYW47IGogKz0gMSkge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSBjeCAtIHNwYW47IGkgPD0gY3ggKyBzcGFuOyBpICs9IDEpIHtcclxuICAgICAgICAgIGNvbnN0IGRpc3RhbmNlID0gKGkgKyAwLjUgLSB4KSAqKiAyICsgKGogKyAwLjUgLSB5KSAqKiAyICsgKGsgKyAwLjUgLSB6KSAqKiAyO1xyXG4gICAgICAgICAgaWYgKGRpc3RhbmNlIDw9IGxpbWl0ICYmIHRoaXMuc3VyZmFjZUNlbGxzLmhhcyh0aGlzLnN1cmZhY2VLZXkoaSwgaiwgaykpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTW92ZXMgdGhlIGNhbWVyYSB0byBsb29rIGF0IGEgdGFnLCBtaXJyb3JpbmcgTWF0dGVycG9ydCdzIGdvVG9UYWcuXHJcbiAgICpcclxuICAgKiBBbmltYXRlZCByYXRoZXIgdGhhbiB0ZWxlcG9ydGVkOiBqdW1waW5nIHRoZSBjYW1lcmEgbG9zZXMgdGhlIHZpZXdlcidzIHNlbnNlIG9mIHdoZXJlIHRoZXkgd2VyZVxyXG4gICAqIHJlbGF0aXZlIHRvIHRoZSBtb2RlbC4gVGhlIGFwcHJvYWNoIGRpc3RhbmNlIGZvbGxvd3MgdGhlIG1vZGVsJ3Mgc2l6ZSBzbyBpdCBmcmFtZXMgc2Vuc2libHlcclxuICAgKiB3aGF0ZXZlciB0aGUgdW5pdHMgYXJlLlxyXG4gICAqL1xyXG4gIGdvVG9UYWcoZWxlbWVudElkOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGNvbnN0IHNwcml0ZSA9IHRoaXMudGFnU3ByaXRlcy5nZXQoZWxlbWVudElkKTtcclxuICAgIGlmICghc3ByaXRlIHx8ICF0aGlzLmNhbWVyYSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdGFyZ2V0ID0gc3ByaXRlLmdldFdvcmxkUG9zaXRpb24obmV3IFRIUkVFLlZlY3RvcjMoKSk7XHJcbiAgICBjb25zdCBkaXN0YW5jZSA9IHRoaXMubW9kZWxSb290XHJcbiAgICAgID8gbmV3IFRIUkVFLkJveDMoKS5zZXRGcm9tT2JqZWN0KHRoaXMubW9kZWxSb290KS5nZXRTaXplKG5ldyBUSFJFRS5WZWN0b3IzKCkpLmxlbmd0aCgpICogMC4xNVxyXG4gICAgICA6IDU7XHJcblxyXG4gICAgLy8gQXBwcm9hY2ggYWxvbmcgdGhlIGN1cnJlbnQgdmlld2luZyBkaXJlY3Rpb24sIHNvIHRoZSBjYW1lcmEgY2xvc2VzIGluIHJhdGhlciB0aGFuIHN3aW5naW5nXHJcbiAgICAvLyBhcm91bmQgdG8gYW4gYXJiaXRyYXJ5IHNpZGUuXHJcbiAgICBjb25zdCBkaXJlY3Rpb24gPSB0aGlzLmNhbWVyYS5wb3NpdGlvbi5jbG9uZSgpLnN1Yih0aGlzLmNvbnRyb2xzLnRhcmdldCkubm9ybWFsaXplKCk7XHJcbiAgICB0aGlzLmNhbWVyYVR3ZWVuID0ge1xyXG4gICAgICBmcm9tUG9zaXRpb246IHRoaXMuY2FtZXJhLnBvc2l0aW9uLmNsb25lKCksXHJcbiAgICAgIHRvUG9zaXRpb246IHRhcmdldC5jbG9uZSgpLmFkZChkaXJlY3Rpb24ubXVsdGlwbHlTY2FsYXIoZGlzdGFuY2UpKSxcclxuICAgICAgZnJvbVRhcmdldDogdGhpcy5jb250cm9scy50YXJnZXQuY2xvbmUoKSxcclxuICAgICAgdG9UYXJnZXQ6IHRhcmdldCxcclxuICAgICAgc3RhcnRlZEF0OiBwZXJmb3JtYW5jZS5ub3coKSxcclxuICAgICAgZHVyYXRpb25NczogNjAwLFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIC8qKiBBZHZhbmNlcyB0aGUgY2FtZXJhIGFuaW1hdGlvbiBzdGFydGVkIGJ5IGdvVG9UYWcsIGlmIG9uZSBpcyBydW5uaW5nLiAqL1xyXG4gIHByaXZhdGUgc3RlcENhbWVyYVR3ZWVuKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmNhbWVyYVR3ZWVuKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IHsgZnJvbVBvc2l0aW9uLCB0b1Bvc2l0aW9uLCBmcm9tVGFyZ2V0LCB0b1RhcmdldCwgc3RhcnRlZEF0LCBkdXJhdGlvbk1zIH0gPSB0aGlzLmNhbWVyYVR3ZWVuO1xyXG4gICAgY29uc3QgbGluZWFyID0gTWF0aC5taW4oKHBlcmZvcm1hbmNlLm5vdygpIC0gc3RhcnRlZEF0KSAvIGR1cmF0aW9uTXMsIDEpO1xyXG4gICAgLy8gRWFzZSBvdXQsIHNvIHRoZSBtb3ZlIHNldHRsZXMgaW5zdGVhZCBvZiBzdG9wcGluZyBkZWFkLlxyXG4gICAgY29uc3QgdCA9IDEgLSBNYXRoLnBvdygxIC0gbGluZWFyLCAzKTtcclxuXHJcbiAgICB0aGlzLmNhbWVyYS5wb3NpdGlvbi5sZXJwVmVjdG9ycyhmcm9tUG9zaXRpb24sIHRvUG9zaXRpb24sIHQpO1xyXG4gICAgdGhpcy5jb250cm9scy50YXJnZXQubGVycFZlY3RvcnMoZnJvbVRhcmdldCwgdG9UYXJnZXQsIHQpO1xyXG5cclxuICAgIGlmIChsaW5lYXIgPj0gMSkge1xyXG4gICAgICB0aGlzLmNhbWVyYVR3ZWVuID0gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGlzUGxhY2luZ1RhZygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnBsYWNpbmdUYWc7XHJcbiAgfVxyXG5cclxuICAvKiogVGhlIHNwb3QgcGlja2VkIGJ5IHRoZSBsYXN0IHBsYWNlbWVudCwgZm9yIHdob2V2ZXIgY29tbWl0cyBpdCB0byBhIFBPSS4gKi9cclxuICBnZXRQZW5kaW5nVGFnUGxhY2VtZW50KCk6IFRocmVlSnNUYWdQbGFjZW1lbnQgfCBudWxsIHtcclxuICAgIHJldHVybiB0aGlzLnBlbmRpbmdUYWdQbGFjZW1lbnQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSYXljYXN0cyBhIGNsaWNrIGFnYWluc3QgdGhlIG1vZGVsJ3MgZ2VvbWV0cnkgYW5kIHJldHVybnMgdGhlIGhpdCwgaW4gd29ybGQgc3BhY2UuXHJcbiAgICpcclxuICAgKiBSZXR1cm5zIG51bGwgd2hlbiB0aGUgY2xpY2sgbWlzc2VkLCB3aGljaCBpcyBhIG5vcm1hbCBvdXRjb21lIC0gdGhlIHVzZXIgY2xpY2tlZCB0aGUgc2t5IC0gYW5kXHJcbiAgICogbGVhdmVzIHdoYXRldmVyIG1vZGUgaXMgYXJtZWQgc3RpbGwgYXJtZWQsIHNvIHRoZXkgY2FuIHNpbXBseSB0cnkgYWdhaW4uXHJcbiAgICovXHJcbiAgcHJpdmF0ZSByYXljYXN0TW9kZWwoZXZlbnQ6IE1vdXNlRXZlbnQpOiBUSFJFRS5JbnRlcnNlY3Rpb24gfCBudWxsIHtcclxuICAgIGlmICghdGhpcy5tb2RlbFJvb3QpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcmVjdCA9IHRoaXMucmVuZGVyZXIuZG9tRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgIHRoaXMubW91c2UueCA9ICgoZXZlbnQuY2xpZW50WCAtIHJlY3QubGVmdCkgLyByZWN0LndpZHRoKSAqIDIgLSAxO1xyXG4gICAgdGhpcy5tb3VzZS55ID0gLSgoZXZlbnQuY2xpZW50WSAtIHJlY3QudG9wKSAvIHJlY3QuaGVpZ2h0KSAqIDIgKyAxO1xyXG4gICAgdGhpcy5yYXljYXN0ZXIuc2V0RnJvbUNhbWVyYSh0aGlzLm1vdXNlLCB0aGlzLmNhbWVyYSk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMucmF5Y2FzdGVyLmludGVyc2VjdE9iamVjdCh0aGlzLm1vZGVsUm9vdCwgdHJ1ZSlbMF0gPz8gbnVsbDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFR1cm5zIGEgY2xpY2sgaW50byBhIHBvaW50IG9uIHRoZSBtb2RlbCwgaW4gdGhlIGZyYW1lIHRhZyBjb29yZGluYXRlcyBhcmUgcGVyc2lzdGVkIGluLlxyXG4gICAqXHJcbiAgICogVGhhdCBmcmFtZSBpcyB0aGUgdGFnIGdyb3VwJ3MsIG5vdCB0aGUgbW9kZWwncy4gQSBzdG9yZWQgY29vcmRpbmF0ZSBpcyByZWFkIGJhY2sgYXMgYSBzcHJpdGVcclxuICAgKiBwb3NpdGlvbiBpbnNpZGUgdGhhdCBncm91cCwgc28gYSBjb29yZGluYXRlIGNhcHR1cmVkIGluIGFueSBvdGhlciBmcmFtZSBjb21lcyBiYWNrIGRpc3BsYWNlZCBieVxyXG4gICAqIGV4YWN0bHkgaG93ZXZlciBmYXIgdGhlIGFsaWdubWVudCBtb3ZlcyB0aGUgZ3JvdXAuIFRoZSB0d28gZnJhbWVzIGFncmVlIG9ubHkgd2hpbGUgdGhlXHJcbiAgICogYWxpZ25tZW50IGlzIGlkZW50aXR5LCB3aGljaCBpcyB3aHkgdGhpcyBzdGF5ZWQgaW52aXNpYmxlIHVudGlsIGEgbW9kZWwgd2FzIGNhbGlicmF0ZWQuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBwaWNrUGxhY2VtZW50T25Nb2RlbChldmVudDogTW91c2VFdmVudCk6IFRocmVlSnNUYWdQbGFjZW1lbnQgfCBudWxsIHtcclxuICAgIGNvbnN0IGhpdCA9IHRoaXMucmF5Y2FzdE1vZGVsKGV2ZW50KTtcclxuICAgIGlmICghaGl0KSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudGFnR3JvdXAudXBkYXRlV29ybGRNYXRyaXgodHJ1ZSwgZmFsc2UpO1xyXG4gICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLnRhZ0dyb3VwLndvcmxkVG9Mb2NhbChoaXQucG9pbnQuY2xvbmUoKSk7XHJcblxyXG4gICAgLy8gQSBmYWNlIG5vcm1hbCBpcyBpbiB0aGUgZ2VvbWV0cnkncyBsb2NhbCBzcGFjZSBhbHJlYWR5LCBidXQgdGhlIG1lc2ggaXQgYmVsb25ncyB0byBtYXkgc2l0XHJcbiAgICAvLyB1bmRlciB0cmFuc2Zvcm1zIG9mIGl0cyBvd24sIHNvIHRha2UgaXQgb3V0IHRocm91Z2ggdGhvc2UgYW5kIGJhY2sgaW50byB0aGUgdGFnIGZyYW1lLCBzbyBpdFxyXG4gICAgLy8gZGVzY3JpYmVzIHRoZSBzYW1lIG9yaWVudGF0aW9uIHRoZSBwb3NpdGlvbiBkb2VzLlxyXG4gICAgbGV0IG5vcm1hbCA9IG5ldyBUSFJFRS5WZWN0b3IzKDAsIDEsIDApO1xyXG4gICAgaWYgKGhpdC5mYWNlKSB7XHJcbiAgICAgIG5vcm1hbCA9IGhpdC5mYWNlLm5vcm1hbFxyXG4gICAgICAgIC5jbG9uZSgpXHJcbiAgICAgICAgLnRyYW5zZm9ybURpcmVjdGlvbihoaXQub2JqZWN0Lm1hdHJpeFdvcmxkKVxyXG4gICAgICAgIC50cmFuc2Zvcm1EaXJlY3Rpb24obmV3IFRIUkVFLk1hdHJpeDQoKS5jb3B5KHRoaXMudGFnR3JvdXAubWF0cml4V29ybGQpLmludmVydCgpKVxyXG4gICAgICAgIC5ub3JtYWxpemUoKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBwb3NpdGlvbjogeyB4OiBwb3NpdGlvbi54LCB5OiBwb3NpdGlvbi55LCB6OiBwb3NpdGlvbi56IH0sXHJcbiAgICAgIG5vcm1hbDogeyB4OiBub3JtYWwueCwgeTogbm9ybWFsLnksIHo6IG5vcm1hbC56IH0sXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogV2hlcmUgdGhlIHVzZXIgc2F5cyBhIHRhZyByZWFsbHkgYmVsb25ncywgaW4gdGhlIHNwYWNlIHRoZSBzb2x2ZWQgYWxpZ25tZW50IG1hcHMgb250by5cclxuICAgKlxyXG4gICAqIHNldFRhZ0FsaWdubWVudCB3cml0ZXMgdGhlIHNvbHV0aW9uIHRvIHRoZSB0YWcgZ3JvdXAncyBvd24gdHJhbnNmb3JtLCB3aGljaCBpcyBleHByZXNzZWRcclxuICAgKiByZWxhdGl2ZSB0byBpdHMgcGFyZW50IC0gc28gdGhlIHRhcmdldCBoYXMgdG8gYmUgaW4gdGhlIHBhcmVudCdzIGZyYW1lLiBNZWFzdXJpbmcgaXQgaW4gdGhlXHJcbiAgICogZ3JvdXAncyBvd24gZnJhbWUgaW5zdGVhZCB3b3VsZCBmb2xkIHRoZSBjdXJyZW50IGFsaWdubWVudCBpbnRvIHRoZSBhbnN3ZXIsIG1ha2luZyBlYWNoXHJcbiAgICogY2FsaWJyYXRpb24gZGVwZW5kIG9uIHRoZSBvbmUgYmVmb3JlIGl0LlxyXG4gICAqL1xyXG4gIHByaXZhdGUgcGlja0FsaWdubWVudFRhcmdldChldmVudDogTW91c2VFdmVudCk6IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHo6IG51bWJlciB9IHwgbnVsbCB7XHJcbiAgICBjb25zdCBoaXQgPSB0aGlzLnJheWNhc3RNb2RlbChldmVudCk7XHJcbiAgICBpZiAoIWhpdCkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIGNvbnN0IGZyYW1lID0gdGhpcy50YWdHcm91cC5wYXJlbnQgPz8gdGhpcy5zY2VuZTtcclxuICAgIGZyYW1lLnVwZGF0ZVdvcmxkTWF0cml4KHRydWUsIGZhbHNlKTtcclxuICAgIGNvbnN0IHBvaW50ID0gZnJhbWUud29ybGRUb0xvY2FsKGhpdC5wb2ludC5jbG9uZSgpKTtcclxuICAgIHJldHVybiB7IHg6IHBvaW50LngsIHk6IHBvaW50LnksIHo6IHBvaW50LnogfTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHMgdGhlIHRyYW5zZm9ybSBtYXBwaW5nIGNhcHR1cmVkIHRhZyBjb29yZGluYXRlcyBvbnRvIHRoaXMgbW9kZWwncyBzcGFjZS5cclxuICAgKlxyXG4gICAqIEV2ZXJ5IHRhZyBjb21lcyBmcm9tIHRoZSBzYW1lIHNvdXJjZSBzcGFjZSwgc28gdGhpcyBpcyBvbmUgdHJhbnNmb3JtIG9uIHRoZSBncm91cCByYXRoZXIgdGhhblxyXG4gICAqIHBlci10YWcgbWF0aHMgLSB3aGljaCBhbHNvIG1lYW5zIGl0IGFwcGxpZXMgcmV0cm9hY3RpdmVseSB0byB0YWdzIGFscmVhZHkgcGxhY2VkLCBhbmQgY2FuIGJlXHJcbiAgICogYWRqdXN0ZWQgbGl2ZSB3aGlsZSBzb21lb25lIGRpYWxzIHRoZSBudW1iZXJzIGluLlxyXG4gICAqXHJcbiAgICogUGFzc2luZyBudWxsIHJlc2V0cyB0byBpZGVudGl0eSwgaS5lLiB0YWcgY29vcmRpbmF0ZXMgYXJlIGFscmVhZHkgaW4gbW9kZWwgc3BhY2UuXHJcbiAgICovXHJcbiAgc2V0VGFnQWxpZ25tZW50KGFsaWdubWVudDogVGhyZWVKc0FsaWdubWVudCB8IG51bGwpOiB2b2lkIHtcclxuICAgIGNvbnN0IHsgdHJhbnNsYXRpb24sIHJvdGF0aW9uLCBzY2FsZSB9ID0gYWxpZ25tZW50ID8/IHt9O1xyXG4gICAgdGhpcy50YWdHcm91cC5wb3NpdGlvbi5zZXQodHJhbnNsYXRpb24/LnggPz8gMCwgdHJhbnNsYXRpb24/LnkgPz8gMCwgdHJhbnNsYXRpb24/LnogPz8gMCk7XHJcbiAgICB0aGlzLnRhZ0dyb3VwLnJvdGF0aW9uLnNldChyb3RhdGlvbj8ueCA/PyAwLCByb3RhdGlvbj8ueSA/PyAwLCByb3RhdGlvbj8ueiA/PyAwKTtcclxuICAgIHRoaXMudGFnR3JvdXAuc2NhbGUuc2V0U2NhbGFyKHNjYWxlID8/IDEpO1xyXG4gICAgdGhpcy50YWdHcm91cC51cGRhdGVNYXRyaXgoKTtcclxuXHJcbiAgICAvLyBUYWcgc2l6ZSBpcyBkZXJpdmVkIGZyb20gdGhlIHdvcmxkIHNjYWxlIGl0IGluaGVyaXRzLCB3aGljaCB0aGlzIGNhbGwganVzdCBjaGFuZ2VkIC0gYW5kIHNvXHJcbiAgICAvLyBpcyB3aGljaCB0YWdzIGxhbmQgb24gdGhlIG1vZGVsLlxyXG4gICAgdGhpcy50YWdTcHJpdGVzLmZvckVhY2goKHNwcml0ZSkgPT4gdGhpcy5zY2FsZVRhZ0Zvck1vZGVsKHNwcml0ZSkpO1xyXG4gICAgdGhpcy5yZWZyZXNoVGFnVmlzaWJpbGl0eSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQWRkcyBhIHRhZywgb3IgbW92ZXMvcmVzdHlsZXMgdGhlIG9uZSBhbHJlYWR5IHJlZ2lzdGVyZWQgZm9yIHRoaXMgZWxlbWVudC5cclxuICAgKlxyXG4gICAqIFVwc2VydCByYXRoZXIgdGhhbiBhIGRlY2xhcmF0aXZlIFwiaGVyZSBpcyB0aGUgZnVsbCBsaXN0XCIgY2FsbCwgYmVjYXVzZSB0YWdzIGFycml2ZSBwZXIgdHlwZVxyXG4gICAqIChlcXVpcG1lbnQsIHRoZW4gdGlja2V0cywgdGhlbiBtZWFzdXJlbWVudHMuLi4pIGZyb20gc2VwYXJhdGUgc3Vic2NyaXB0aW9ucyAtIHJlcGxhY2luZyB0aGUgc2V0XHJcbiAgICogb24gZWFjaCBvZiB0aG9zZSB3b3VsZCB3aXBlIHRoZSB0eXBlcyB0aGF0IGNhbWUgYmVmb3JlLlxyXG4gICAqL1xyXG4gIHVwc2VydFRhZyh0YWc6IFRocmVlSnNUYWcpOiB2b2lkIHtcclxuICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy50YWdTcHJpdGVzLmdldCh0YWcuaWQpO1xyXG4gICAgaWYgKGV4aXN0aW5nKSB7XHJcbiAgICAgIGV4aXN0aW5nLnBvc2l0aW9uLnNldCh0YWcucG9zaXRpb24ueCwgdGFnLnBvc2l0aW9uLnksIHRhZy5wb3NpdGlvbi56KTtcclxuICAgICAgZXhpc3RpbmcudXNlckRhdGEucG9pVHlwZSA9IHRhZy5wb2lUeXBlID8/IGV4aXN0aW5nLnVzZXJEYXRhLnBvaVR5cGU7XHJcbiAgICAgIGV4aXN0aW5nLnVzZXJEYXRhLmxhYmVsID0gdGFnLmxhYmVsID8/IGV4aXN0aW5nLnVzZXJEYXRhLmxhYmVsO1xyXG4gICAgICBleGlzdGluZy51c2VyRGF0YS5vcmlnaW5DYXB0dXJlSUQgPSB0YWcub3JpZ2luQ2FwdHVyZUlEID8/IGV4aXN0aW5nLnVzZXJEYXRhLm9yaWdpbkNhcHR1cmVJRDtcclxuICAgICAgZXhpc3RpbmcudXNlckRhdGEuZnJhbWUgPSB0YWcuZnJhbWUgPz8gZXhpc3RpbmcudXNlckRhdGEuZnJhbWU7XHJcbiAgICAgIHRoaXMucGFyZW50VGFnKGV4aXN0aW5nKTtcclxuICAgICAgdGhpcy5hcHBseVRhZ1Zpc2liaWxpdHkoZXhpc3RpbmcpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgc3ByaXRlID0gbmV3IFRIUkVFLlNwcml0ZShcclxuICAgICAgbmV3IFRIUkVFLlNwcml0ZU1hdGVyaWFsKHtcclxuICAgICAgICBtYXA6IHRoaXMuY3JlYXRlVGFnVGV4dHVyZSh0YWcuY29sb3IpLFxyXG4gICAgICAgIC8vIFRhZ3MgcmVhZCBhcyBVSSByYXRoZXIgdGhhbiBnZW9tZXRyeSwgc28gdGhleSBzdGF5IHZpc2libGUgdGhyb3VnaCB0aGUgbW9kZWwgaW5zdGVhZCBvZlxyXG4gICAgICAgIC8vIGJlaW5nIG9jY2x1ZGVkIGJ5IHdoYXRldmVyIHdhbGwgaGFwcGVucyB0byBiZSBiZXR3ZWVuIHRoZW0gYW5kIHRoZSBjYW1lcmEuXHJcbiAgICAgICAgZGVwdGhUZXN0OiBmYWxzZSxcclxuICAgICAgICB0cmFuc3BhcmVudDogdHJ1ZSxcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgICBzcHJpdGUubmFtZSA9IHRhZy5pZDtcclxuICAgIHNwcml0ZS51c2VyRGF0YS5wb2lUeXBlID0gdGFnLnBvaVR5cGUgPz8gbnVsbDtcclxuICAgIHNwcml0ZS51c2VyRGF0YS5sYWJlbCA9IHRhZy5sYWJlbCA/PyBudWxsO1xyXG4gICAgc3ByaXRlLnVzZXJEYXRhLm9yaWdpbkNhcHR1cmVJRCA9IHRhZy5vcmlnaW5DYXB0dXJlSUQgPz8gbnVsbDtcclxuICAgIHNwcml0ZS51c2VyRGF0YS5mcmFtZSA9IHRhZy5mcmFtZSA/PyBudWxsO1xyXG4gICAgc3ByaXRlLnBvc2l0aW9uLnNldCh0YWcucG9zaXRpb24ueCwgdGFnLnBvc2l0aW9uLnksIHRhZy5wb3NpdGlvbi56KTtcclxuICAgIHNwcml0ZS5yZW5kZXJPcmRlciA9IDk5OTtcclxuICAgIHRoaXMucGFyZW50VGFnKHNwcml0ZSk7XHJcbiAgICB0aGlzLnNjYWxlVGFnRm9yTW9kZWwoc3ByaXRlKTtcclxuICAgIHRoaXMuYXBwbHlUYWdWaXNpYmlsaXR5KHNwcml0ZSk7XHJcblxyXG4gICAgdGhpcy50YWdTcHJpdGVzLnNldCh0YWcuaWQsIHNwcml0ZSk7XHJcblxyXG4gICAgaWYgKHRhZy5pY29uVXJsKSB7XHJcbiAgICAgIHRoaXMuYXBwbHlUYWdJY29uKHNwcml0ZSwgdGFnLmljb25VcmwpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIFJlbW92ZXMgdGhlIHRhZyByZWdpc3RlcmVkIGZvciBhbiBlbGVtZW50LCBpZiB0aGVyZSBpcyBvbmUuICovXHJcbiAgcmVtb3ZlVGFnKGVsZW1lbnRJZDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBjb25zdCBzcHJpdGUgPSB0aGlzLnRhZ1Nwcml0ZXMuZ2V0KGVsZW1lbnRJZCk7XHJcbiAgICBpZiAoIXNwcml0ZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBzcHJpdGUucGFyZW50Py5yZW1vdmUoc3ByaXRlKTtcclxuICAgIHNwcml0ZS5tYXRlcmlhbC5tYXA/LmRpc3Bvc2UoKTtcclxuICAgIHNwcml0ZS5tYXRlcmlhbC5kaXNwb3NlKCk7XHJcbiAgICB0aGlzLnRhZ1Nwcml0ZXMuZGVsZXRlKGVsZW1lbnRJZCk7XHJcbiAgfVxyXG5cclxuICAvKiogUmVtb3ZlcyBldmVyeSB0YWcgZnJvbSB0aGUgc2NlbmUuICovXHJcbiAgY2xlYXJUYWdzKCk6IHZvaWQge1xyXG4gICAgWy4uLnRoaXMudGFnU3ByaXRlcy5rZXlzKCldLmZvckVhY2goKGlkKSA9PiB0aGlzLnJlbW92ZVRhZyhpZCkpO1xyXG4gIH1cclxuXHJcbiAgLyoqIExvYWRzIGFuIGljb24gaW50byBhbiBleGlzdGluZyB0YWcsIGxlYXZpbmcgdGhlIGZhbGxiYWNrIGRpc2MgaW4gcGxhY2UgaWYgaXQgZmFpbHMuICovXHJcbiAgcHJpdmF0ZSBhcHBseVRhZ0ljb24oc3ByaXRlOiBUSFJFRS5TcHJpdGUsIGljb25Vcmw6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgbmV3IFRIUkVFLlRleHR1cmVMb2FkZXIoKS5sb2FkKFxyXG4gICAgICBpY29uVXJsLFxyXG4gICAgICAodGV4dHVyZSkgPT4ge1xyXG4gICAgICAgIHNwcml0ZS5tYXRlcmlhbC5tYXA/LmRpc3Bvc2UoKTtcclxuICAgICAgICBzcHJpdGUubWF0ZXJpYWwubWFwID0gdGV4dHVyZTtcclxuICAgICAgICBzcHJpdGUubWF0ZXJpYWwubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG4gICAgICB9LFxyXG4gICAgICB1bmRlZmluZWQsXHJcbiAgICAgICgpID0+IGNvbnNvbGUud2FybihgVGhyZWVKc1NlcnZpY2U6IGNvdWxkIG5vdCBsb2FkIHRhZyBpY29uIFwiJHtpY29uVXJsfVwiLCBrZWVwaW5nIHRoZSBkZWZhdWx0IG1hcmtlci5gKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKiBEcmF3cyB0aGUgZGVmYXVsdCB0YWcgbWFya2VyOiBhIGZpbGxlZCBkaXNjIHdpdGggYSB3aGl0ZSByaW5nLCBzbyBpdCByZWFkcyBvbiBhbnkgYmFja2dyb3VuZC4gKi9cclxuICBwcml2YXRlIGNyZWF0ZVRhZ1RleHR1cmUoY29sb3IgPSAnIzFFODhFNScpOiBUSFJFRS5DYW52YXNUZXh0dXJlIHtcclxuICAgIGNvbnN0IHNpemUgPSAxMjg7XHJcbiAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcclxuICAgIGNhbnZhcy53aWR0aCA9IHNpemU7XHJcbiAgICBjYW52YXMuaGVpZ2h0ID0gc2l6ZTtcclxuICAgIGNvbnN0IGNvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcclxuXHJcbiAgICBjb250ZXh0LmJlZ2luUGF0aCgpO1xyXG4gICAgY29udGV4dC5hcmMoc2l6ZSAvIDIsIHNpemUgLyAyLCBzaXplIC8gMiAtIDgsIDAsIE1hdGguUEkgKiAyKTtcclxuICAgIGNvbnRleHQuZmlsbFN0eWxlID0gY29sb3I7XHJcbiAgICBjb250ZXh0LmZpbGwoKTtcclxuICAgIGNvbnRleHQubGluZVdpZHRoID0gODtcclxuICAgIGNvbnRleHQuc3Ryb2tlU3R5bGUgPSAnI0ZGRkZGRic7XHJcbiAgICBjb250ZXh0LnN0cm9rZSgpO1xyXG5cclxuICAgIHJldHVybiBuZXcgVEhSRUUuQ2FudmFzVGV4dHVyZShjYW52YXMpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2l6ZXMgYSB0YWcgcmVsYXRpdmUgdG8gdGhlIG1vZGVsLlxyXG4gICAqXHJcbiAgICogQSBzcHJpdGUgaW5oZXJpdHMgdGhlIG1vZGVsJ3Mgc2NhbGUgYW5kIHRoZSBhbGlnbm1lbnQncywgc28gYSBmaXhlZCBzaXplIHdvdWxkIGNvbWUgb3V0IHRpbnkgb25cclxuICAgKiBhIGxhcmdlIG1vZGVsIGFuZCBodWdlIG9uIGEgc21hbGwgb25lLiBEaXZpZGluZyBieSB0aGUgZ3JvdXAncyB3b3JsZCBzY2FsZSBrZWVwcyB0YWdzIHRoZSBzYW1lXHJcbiAgICogc2l6ZSBvbiBzY3JlZW4gd2hhdGV2ZXIgdGhlIG1vZGVsJ3MgdW5pdHMgYXJlLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgc2NhbGVUYWdGb3JNb2RlbChzcHJpdGU6IFRIUkVFLlNwcml0ZSk6IHZvaWQge1xyXG4gICAgLy8gSXRzIG93biBwYXJlbnQncyBzY2FsZTogdGFncyBpbiB0aGUgbW9kZWwncyBjb29yZGluYXRlcyBkbyBub3QgaW5oZXJpdCB0aGUgY2FsaWJyYXRpb24ncy5cclxuICAgIGNvbnN0IHdvcmxkU2NhbGUgPSAoc3ByaXRlLnBhcmVudCA/PyB0aGlzLnRhZ0dyb3VwKS5nZXRXb3JsZFNjYWxlKG5ldyBUSFJFRS5WZWN0b3IzKCkpLnggfHwgMTtcclxuICAgIGNvbnN0IHNpemUgPSAwLjQgLyB3b3JsZFNjYWxlO1xyXG4gICAgc3ByaXRlLnNjYWxlLnNldChzaXplLCBzaXplLCAxKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFkZHMgc2Vjb25kYXJ5IGludGVyYWN0aXZlIG9iamVjdHMgKGUuZy4sIFBPSXMsIHNlbnNvcnMpIHRvIHRoZSBzY2VuZS5cclxuICAgKi9cclxuICB1cGRhdGVPYmpzVG9TY2VuZShvYmpzQWRkZWQ6IE9iakFkZGVkW10pOiB2b2lkIHtcclxuICAgIGNvbnN0IGV4aXN0aW5nSWRzID0gdGhpcy5jbGlja2FibGVPYmplY3RzLm1hcCgob2JqKSA9PiBvYmoubmFtZSk7XHJcbiAgICBjb25zdCBvYmpMb2FkZXIgPSBuZXcgT0JKTG9hZGVyKCk7XHJcblxyXG4gICAgLy8gZGVsZXRlIG9iamVjdHMgdGhhdCBhcmUgbm90IGluIHRoZSBwcm92aWRlZCBhcnJheVxyXG4gICAgdGhpcy5jbGlja2FibGVPYmplY3RzLmZvckVhY2goKG9iaikgPT4ge1xyXG4gICAgICBpZiAoIW9ianNBZGRlZC5maW5kKChvYmpEYXRhKSA9PiBvYmpEYXRhLmlkID09PSBvYmoubmFtZSkpIHtcclxuICAgICAgICB0aGlzLnNjZW5lLnJlbW92ZShvYmopO1xyXG4gICAgICAgIHRoaXMuY2xpY2thYmxlT2JqZWN0cyA9IHRoaXMuY2xpY2thYmxlT2JqZWN0cy5maWx0ZXIoXHJcbiAgICAgICAgICAob2JqZWN0KSA9PiBvYmplY3QubmFtZSAhPT0gb2JqLm5hbWVcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBvYmpzQWRkZWQuZm9yRWFjaCgob2JqZWN0RGF0YTogT2JqQWRkZWQpID0+IHtcclxuICAgICAgaWYgKCFleGlzdGluZ0lkcy5pbmNsdWRlcyhvYmplY3REYXRhLmlkKSkge1xyXG4gICAgICAgIG9iakxvYWRlci5sb2FkKG9iamVjdERhdGEuZmlsZSwgKG5ld09iamVjdCkgPT4ge1xyXG4gICAgICAgICAgbmV3T2JqZWN0Lm5hbWUgPSBvYmplY3REYXRhLmlkO1xyXG5cclxuICAgICAgICAgIG5ld09iamVjdC50cmF2ZXJzZSgoY2hpbGQpID0+IHtcclxuICAgICAgICAgICAgaWYgKChjaGlsZCBhcyBUSFJFRS5NZXNoKS5pc01lc2gpIHtcclxuICAgICAgICAgICAgICBjb25zdCBtZXNoID0gY2hpbGQgYXMgVEhSRUUuTWVzaDtcclxuICAgICAgICAgICAgICBpZiAobWVzaC5tYXRlcmlhbCBpbnN0YW5jZW9mIFRIUkVFLk1hdGVyaWFsKSB7XHJcbiAgICAgICAgICAgICAgICBtZXNoLm1hdGVyaWFsLnRyYW5zcGFyZW50ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIG1lc2gubWF0ZXJpYWwub3BhY2l0eSA9IDAuODtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgIC8vIHNldCBvYmplY3QgcG9zaXRpb24gYW5kIHJvdGF0aW9uXHJcbiAgICAgICAgICBuZXdPYmplY3QucG9zaXRpb24uc2V0KFxyXG4gICAgICAgICAgICBvYmplY3REYXRhLnBvc2l0aW9uLngsXHJcbiAgICAgICAgICAgIG9iamVjdERhdGEucG9zaXRpb24ueSxcclxuICAgICAgICAgICAgb2JqZWN0RGF0YS5wb3NpdGlvbi56XHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgXHJcbiAgICAgICAgICAvLyBUaGUgSlNPTiBjb25maWd1cmF0aW9uIGhhcyByb3RhdGlvbiBhbHJlYWR5IGluIHJhZGlhbnMgKGUuZy4gMy4xNDE1Li4uKVxyXG4gICAgICAgICAgbmV3T2JqZWN0LnJvdGF0aW9uLnNldChcclxuICAgICAgICAgICAgb2JqZWN0RGF0YS5yb3RhdGlvbi54LFxyXG4gICAgICAgICAgICBvYmplY3REYXRhLnJvdGF0aW9uLnksXHJcbiAgICAgICAgICAgIG9iamVjdERhdGEucm90YXRpb24uelxyXG4gICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICBuZXdPYmplY3Quc2NhbGUuc2V0KG9iamVjdERhdGEuc2NhbGUueCwgb2JqZWN0RGF0YS5zY2FsZS55LCBvYmplY3REYXRhLnNjYWxlLnopO1xyXG5cclxuICAgICAgICAgIHRoaXMuc2NlbmUuYWRkKG5ld09iamVjdCk7XHJcbiAgICAgICAgICB0aGlzLmNsaWNrYWJsZU9iamVjdHMucHVzaChuZXdPYmplY3QpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgb25Nb3VzZU1vdmUoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5pc0RyYWdnaW5nQ2FtZXJhKSB7XHJcbiAgICAgIGNvbnN0IHJlY3QgPSB0aGlzLnJlbmRlcmVyLmRvbUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgIHRoaXMubW91c2UueCA9ICgoZXZlbnQuY2xpZW50WCAtIHJlY3QubGVmdCkgLyByZWN0LndpZHRoKSAqIDIgLSAxO1xyXG4gICAgICB0aGlzLm1vdXNlLnkgPSAtKChldmVudC5jbGllbnRZIC0gcmVjdC50b3ApIC8gcmVjdC5oZWlnaHQpICogMiArIDE7XHJcblxyXG4gICAgICB0aGlzLnJheWNhc3Rlci5zZXRGcm9tQ2FtZXJhKHRoaXMubW91c2UsIHRoaXMuY2FtZXJhKTtcclxuXHJcbiAgICAgIC8vIFdoaWxlIHRoZSBnaG9zdCBpcyB1cCBpdCBmb2xsb3dzIHRoZSBwb2ludGVyIGFuZCBub3RoaW5nIGVsc2Ugc2hvdWxkIHJlYWN0IHRvIGl0LiBUaGUgbW92ZVxyXG4gICAgICAvLyBpcyBvbmx5IHJlY29yZGVkIGhlcmU6IHBvaW50ZXIgZXZlbnRzIGZpcmUgZmFyIG1vcmUgb2Z0ZW4gdGhhbiBmcmFtZXMsIGFuZCBwaWNraW5nIGEgcG9pbnRcclxuICAgICAgLy8gY29zdHMgYSByYXljYXN0IGFnYWluc3QgdGhlIHdob2xlIG1vZGVsLCBzbyBkb2luZyBpdCBwZXIgZXZlbnQgaXMgd2hhdCBtYWRlIHRoZSBnaG9zdCB0cmFpbFxyXG4gICAgICAvLyBiZWhpbmQgdGhlIGN1cnNvci4gVGhlIHJlbmRlciBsb29wIHBpY2tzIHVwIHRoZSBsYXRlc3QgcG9zaXRpb24sIG9uY2UsIHBlciBmcmFtZS5cclxuICAgICAgaWYgKHRoaXMuaXNQcmV2aWV3aW5nUGxhY2VtZW50KCkpIHtcclxuICAgICAgICB0aGlzLnBlbmRpbmdQcmV2aWV3RXZlbnQgPSBldmVudDtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIE5vdCBwcmV2aWV3aW5nIGFueSBtb3JlIChhIHBhaXIgd2FzIGp1c3QgY29tcGxldGVkLCBzYXkpOiBkcm9wIGEgZ2hvc3QgbGVmdCBvdmVyIGZyb20gaXQuXHJcbiAgICAgIHRoaXMucmVtb3ZlUGxhY2VtZW50UHJldmlldygpO1xyXG5cclxuICAgICAgLy8gVGFncyBmaXJzdDogdGhleSBkcmF3IG9uIHRvcCBvZiB0aGUgbW9kZWwsIHNvIHRoZXkgaGF2ZSB0byBhbnN3ZXIgdGhlIHBvaW50ZXIgZmlyc3QgdG9vLlxyXG4gICAgICBjb25zdCBob3ZlcmVkVGFnID0gdGhpcy5yYXljYXN0ZXJcclxuICAgICAgICAuaW50ZXJzZWN0T2JqZWN0cyhbLi4udGhpcy50YWdTcHJpdGVzLnZhbHVlcygpXSwgZmFsc2UpXHJcbiAgICAgICAgLmZpbmQoKGhpdCkgPT4gaGl0Lm9iamVjdC52aXNpYmxlKT8ub2JqZWN0O1xyXG4gICAgICBpZiAoaG92ZXJlZFRhZykge1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuZG9tRWxlbWVudC5zdHlsZS5jdXJzb3IgPSAncG9pbnRlcic7XHJcbiAgICAgICAgdGhpcy5vYmplY3RIb3ZlcmVkJC5uZXh0KG51bGwpO1xyXG4gICAgICAgIGNvbnN0IGxhYmVsID0gaG92ZXJlZFRhZy51c2VyRGF0YS5sYWJlbDtcclxuICAgICAgICB0aGlzLnRhZ0hvdmVyZWQkLm5leHQobGFiZWwgPyB7IGxhYmVsLCBldmVudCB9IDogbnVsbCk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMudGFnSG92ZXJlZCQubmV4dChudWxsKTtcclxuXHJcbiAgICAgIGNvbnN0IGludGVyc2VjdHMgPSB0aGlzLnJheWNhc3Rlci5pbnRlcnNlY3RPYmplY3RzKHRoaXMuY2xpY2thYmxlT2JqZWN0cywgdHJ1ZSk7XHJcblxyXG4gICAgICBpZiAoaW50ZXJzZWN0cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5kb21FbGVtZW50LnN0eWxlLmN1cnNvciA9ICdwb2ludGVyJztcclxuICAgICAgICBjb25zdCBpbnRlcnNlY3RlZE9iamVjdElkID0gaW50ZXJzZWN0c1swXS5vYmplY3Q/LnBhcmVudD8ubmFtZTtcclxuICAgICAgICBpZiAoaW50ZXJzZWN0ZWRPYmplY3RJZCkge1xyXG4gICAgICAgICAgICB0aGlzLm9iamVjdEhvdmVyZWQkLm5leHQoeyBpZDogaW50ZXJzZWN0ZWRPYmplY3RJZCwgZXZlbnQgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuZG9tRWxlbWVudC5zdHlsZS5jdXJzb3IgPSAnZGVmYXVsdCc7XHJcbiAgICAgICAgdGhpcy5vYmplY3RIb3ZlcmVkJC5uZXh0KG51bGwpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLmRvbUVsZW1lbnQuc3R5bGUuY3Vyc29yID0gJ2dyYWJiaW5nJztcclxuICAgICAgdGhpcy5vYmplY3RIb3ZlcmVkJC5uZXh0KG51bGwpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvbk1vdXNlQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5pc0RyYWdnaW5nQ2FtZXJhKSB7XHJcbiAgICAgIGNvbnN0IHJlY3QgPSB0aGlzLnJlbmRlcmVyLmRvbUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgIHRoaXMubW91c2UueCA9ICgoZXZlbnQuY2xpZW50WCAtIHJlY3QubGVmdCkgLyByZWN0LndpZHRoKSAqIDIgLSAxO1xyXG4gICAgICB0aGlzLm1vdXNlLnkgPSAtKChldmVudC5jbGllbnRZIC0gcmVjdC50b3ApIC8gcmVjdC5oZWlnaHQpICogMiArIDE7XHJcblxyXG4gICAgICAvLyBBbGlnbm1lbnQgYW5kIHBsYWNlbWVudCBib3RoIHRha2UgdGhlIGNsaWNrIGJlZm9yZSBhbnl0aGluZyBjYW4gYmUgb3BlbmVkIGJ5IGl0LlxyXG4gICAgICBpZiAodGhpcy5hbGlnbmluZykge1xyXG4gICAgICAgIHRoaXMucmF5Y2FzdGVyLnNldEZyb21DYW1lcmEodGhpcy5tb3VzZSwgdGhpcy5jYW1lcmEpO1xyXG4gICAgICAgIHRoaXMuaGFuZGxlQWxpZ25tZW50Q2xpY2soZXZlbnQpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gTWVhc3VyaW5nIHRha2VzIGV2ZXJ5IGNsaWNrIGFzIGEgcG9pbnQsIHRoZSBzYW1lIHdheSBwbGFjZW1lbnQgdGFrZXMgaXQgYXMgYSBwb3NpdGlvbi5cclxuICAgICAgaWYgKHRoaXMubWVhc3VyaW5nKSB7XHJcbiAgICAgICAgY29uc3QgcGxhY2VtZW50ID0gdGhpcy5waWNrUGxhY2VtZW50T25Nb2RlbChldmVudCk7XHJcbiAgICAgICAgaWYgKHBsYWNlbWVudCkge1xyXG4gICAgICAgICAgY29uc3QgeyB4LCB5LCB6IH0gPSBwbGFjZW1lbnQucG9zaXRpb247XHJcbiAgICAgICAgICB0aGlzLmFkZE1lYXN1cmVQb2ludChuZXcgVEhSRUUuVmVjdG9yMyh4LCB5LCB6KSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gUGxhY2VtZW50IHdpbnMgb3ZlciBldmVyeXRoaW5nOiB3aGlsZSBhcm1lZCwgYSBjbGljayBtZWFucyBcInB1dCBpdCBoZXJlXCIsIG5vdCBcIm9wZW4gdGhhdFwiLlxyXG4gICAgICBpZiAodGhpcy5wbGFjaW5nVGFnKSB7XHJcbiAgICAgICAgY29uc3QgcGxhY2VtZW50ID0gdGhpcy5waWNrUGxhY2VtZW50T25Nb2RlbChldmVudCk7XHJcbiAgICAgICAgaWYgKHBsYWNlbWVudCkge1xyXG4gICAgICAgICAgcGxhY2VtZW50LnBvaVR5cGUgPSB0aGlzLnBsYWNlbWVudFBvaVR5cGU7XHJcbiAgICAgICAgICB0aGlzLnBlbmRpbmdUYWdQbGFjZW1lbnQgPSBwbGFjZW1lbnQ7XHJcbiAgICAgICAgICB0aGlzLnBsYWNpbmdUYWcgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMucmVtb3ZlUGxhY2VtZW50UHJldmlldygpO1xyXG4gICAgICAgICAgdGhpcy5yZW5kZXJlci5kb21FbGVtZW50LnN0eWxlLmN1cnNvciA9ICdkZWZhdWx0JztcclxuICAgICAgICAgIHRoaXMudGFnUGxhY2VkJC5uZXh0KHBsYWNlbWVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5yYXljYXN0ZXIuc2V0RnJvbUNhbWVyYSh0aGlzLm1vdXNlLCB0aGlzLmNhbWVyYSk7XHJcblxyXG4gICAgICAvLyBTYW1lIHByZWNlZGVuY2UgYXMgaG92ZXI6IGEgdGFnIGRyYXduIG92ZXIgdGhlIG1vZGVsIGNsYWltcyB0aGUgY2xpY2suXHJcbiAgICAgIGNvbnN0IHRhZ0hpdHMgPSB0aGlzLnJheWNhc3Rlci5pbnRlcnNlY3RPYmplY3RzKFsuLi50aGlzLnRhZ1Nwcml0ZXMudmFsdWVzKCldLCBmYWxzZSlcclxuICAgICAgICAuZmlsdGVyKChoaXQpID0+IGhpdC5vYmplY3QudmlzaWJsZSk7XHJcbiAgICAgIGlmICh0YWdIaXRzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBjb25zdCB0YWcgPSB0YWdIaXRzWzBdLm9iamVjdDtcclxuICAgICAgICB0aGlzLnRhZ0NsaWNrZWQkLm5leHQoeyBlbGVtZW50SWQ6IHRhZy5uYW1lLCBwb2lUeXBlOiB0YWcudXNlckRhdGEucG9pVHlwZSA/PyBudWxsIH0pO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgaW50ZXJzZWN0cyA9IHRoaXMucmF5Y2FzdGVyLmludGVyc2VjdE9iamVjdHModGhpcy5jbGlja2FibGVPYmplY3RzLCB0cnVlKTtcclxuXHJcbiAgICAgIGlmIChpbnRlcnNlY3RzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBjb25zdCBjbGlja2VkT2JqZWN0ID0gaW50ZXJzZWN0c1swXS5vYmplY3Q7XHJcbiAgICAgICAgY29uc3QgaWQgPSBjbGlja2VkT2JqZWN0Py5wYXJlbnQ/Lm5hbWU7XHJcbiAgICAgICAgaWYgKGlkKSB7XHJcbiAgICAgICAgICAgIHRoaXMub2JqZWN0Q2xpY2tlZCQubmV4dChpZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMub2JqZWN0Q2xpY2tlZCQubmV4dChudWxsKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRXNjYXBlIGNhbmNlbHMgd2hhdGV2ZXIgdGhlIHBvaW50ZXIgaXMgY3VycmVudGx5IGNvbW1pdHRlZCB0by5cclxuICAgKlxyXG4gICAqIEVtaXRzIHRocm91Z2ggdGhlIHNhbWUgc3ViamVjdHMgdGhlIGV4cGxpY2l0IENhbmNlbCBidXR0b25zIHVzZSwgc28gdGhlIFVJIGRyaXZpbmcgdGhlbSBmb2xsb3dzXHJcbiAgICogYWxvbmcgaW5zdGVhZCBvZiBiZWluZyBsZWZ0IHNob3dpbmcgYSBtb2RlIHRoYXQgaXMgbm8gbG9uZ2VyIGFybWVkLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgb25LZXlEb3duID0gKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCA9PiB7XHJcbiAgICBpZiAoZXZlbnQua2V5ICE9PSAnRXNjYXBlJykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5wbGFjaW5nVGFnKSB7XHJcbiAgICAgIC8vIE5vdGhpbmcgb3V0c2lkZSB0aGUgc2NlbmUgdHJhY2tzIHBsYWNlbWVudCwgc28gY2xlYXJpbmcgaXQgaGVyZSBpcyB0aGUgd2hvbGUgb2YgaXQuXHJcbiAgICAgIHRoaXMuY2FuY2VsVGFnUGxhY2VtZW50KCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLm1lYXN1cmluZykge1xyXG4gICAgICB0aGlzLmNhbmNlbE1lYXN1cmluZygpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5hbGlnbmluZykge1xyXG4gICAgICB0aGlzLmNhbmNlbFRhZ0FsaWdubWVudCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhbmltYXRlID0gKCk6IHZvaWQgPT4ge1xyXG4gICAgdGhpcy5hbmltYXRpb25GcmFtZUlkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRoaXMuYW5pbWF0ZSk7XHJcbiAgICB0aGlzLnN0ZXBDYW1lcmFUd2VlbigpO1xyXG4gICAgdGhpcy5jb250cm9scy51cGRhdGUoKTtcclxuXHJcbiAgICAvLyBPbmUgcGljayBwZXIgZnJhbWUsIGFnYWluc3QgdGhlIHBvaW50ZXIncyBsYXRlc3QgcG9zaXRpb24gLSBzZWUgb25Nb3VzZU1vdmUuXHJcbiAgICBpZiAodGhpcy5wZW5kaW5nUHJldmlld0V2ZW50KSB7XHJcbiAgICAgIGNvbnN0IGV2ZW50ID0gdGhpcy5wZW5kaW5nUHJldmlld0V2ZW50O1xyXG4gICAgICB0aGlzLnBlbmRpbmdQcmV2aWV3RXZlbnQgPSBudWxsO1xyXG4gICAgICB0aGlzLnVwZGF0ZVBsYWNlbWVudFByZXZpZXcoZXZlbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucmVuZGVyZXIucmVuZGVyKHRoaXMuc2NlbmUsIHRoaXMuY2FtZXJhKTtcclxuICB9XHJcblxyXG4gIGRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5hbmltYXRpb25GcmFtZUlkKSB7XHJcbiAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuYW5pbWF0aW9uRnJhbWVJZCk7XHJcbiAgICB9XHJcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMub25LZXlEb3duKTtcclxuICAgIGlmICh0aGlzLmNhbnZhc1Jlc2l6ZU9ic2VydmVyKSB7XHJcbiAgICAgIHRoaXMuY2FudmFzUmVzaXplT2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xyXG4gICAgICB0aGlzLmNhbnZhc1Jlc2l6ZU9ic2VydmVyID0gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG4gICAgdGhpcy5kaXNjYXJkQ3VycmVudExvYWQoKTtcclxuICAgIHRoaXMuY2xlYXJUYWdzKCk7XHJcbiAgICB0aGlzLm1lYXN1cmluZyA9IGZhbHNlO1xyXG4gICAgdGhpcy5jbGVhck1lYXN1cmVtZW50KCk7XHJcbiAgICBpZiAodGhpcy5yZW5kZXJlcikge1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLmRpc3Bvc2UoKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmNvbnRyb2xzKSB7XHJcbiAgICAgIHRoaXMuY29udHJvbHMuZGlzcG9zZSgpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=
3164
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhyZWVqcy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWNvcmUvc3JjL2xpYi9zZXJ2aWNlcy90aHJlZWpzLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEtBQUssS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMvQixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDMUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUNqRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDbkUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtREFBbUQsQ0FBQztBQUNuRixPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDdkQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUNyRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDOztBQXlIL0I7Ozs7OztHQU1HO0FBQ0gsU0FBUyxlQUFlLENBQUMsQ0FBZ0IsRUFBRSxDQUFnQixFQUFFLENBQWdCO0lBQzNFLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDNUIsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFLEdBQUcsS0FBSyxFQUFFLENBQUM7UUFDMUIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQ0QsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBRWYsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM3QixNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbkUsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFLEdBQUcsS0FBSyxFQUFFLENBQUM7UUFDMUIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQ0QsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBRWYsT0FBTyxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDckUsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBQ0gsTUFBTSxVQUFVLHFCQUFxQixDQUNuQyxLQUE2QixFQUM3QixXQUFnRCxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0lBRXBFLElBQUksQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNqQyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFDRCxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDckIsT0FBTyxxQkFBcUIsQ0FBQyxLQUFLLEVBQUUsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztJQUN6RyxDQUFDO0lBRUQsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2hILE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVoSCxNQUFNLFdBQVcsR0FBRyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN4RSxNQUFNLFdBQVcsR0FBRyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN4RSxJQUFJLENBQUMsV0FBVyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDakMsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsb0dBQW9HO0lBQ3BHLE1BQU0sUUFBUSxHQUFHLFdBQVcsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7SUFFdkUsbUdBQW1HO0lBQ25HLDJDQUEyQztJQUMzQyxNQUFNLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdkMsSUFBSSxRQUFRLEdBQUcsQ0FBQyxDQUFDO0lBQ2pCLElBQUksVUFBVSxHQUFHLENBQUMsQ0FBQztJQUNuQixLQUFLLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksS0FBSyxFQUFFLENBQUM7UUFDM0IsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN2RCxNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3ZELElBQUksWUFBWSxHQUFHLElBQUksRUFBRSxDQUFDO1lBQ3hCLFFBQVEsSUFBSSxZQUFZLEdBQUcsWUFBWSxDQUFDO1lBQ3hDLFVBQVUsSUFBSSxDQUFDLENBQUM7UUFDbEIsQ0FBQztJQUNILENBQUM7SUFDRCxJQUFJLFVBQVUsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNyQixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFDRCxNQUFNLEtBQUssR0FBRyxRQUFRLEdBQUcsVUFBVSxDQUFDO0lBRXBDLGdHQUFnRztJQUNoRyxxREFBcUQ7SUFDckQsTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3pHLE1BQU0sY0FBYyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUN6RyxNQUFNLFdBQVcsR0FBRyxjQUFjO1NBQy9CLEtBQUssRUFBRTtTQUNQLEdBQUcsQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBRTVFLE1BQU0sS0FBSyxHQUFHLElBQUksS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDLHFCQUFxQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBRWhFLE9BQU87UUFDTCxXQUFXLEVBQUUsRUFBRSxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUMsRUFBRTtRQUNyRSxRQUFRLEVBQUUsRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRTtRQUNoRCxLQUFLO0tBQ04sQ0FBQztBQUNKLENBQUM7QUFFRCx3R0FBd0c7QUFDeEcsU0FBUyxxQkFBcUIsQ0FBQyxLQUE2QixFQUFFLEVBQWlCO0lBQzdFLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEcsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVwRywrRUFBK0U7SUFDL0UsTUFBTSxRQUFRLEdBQUcsSUFBSSxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUMsa0JBQWtCLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDM0YsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO0lBRWQsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3ZCLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEQsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0RCxJQUFJLFVBQVUsQ0FBQyxNQUFNLEVBQUUsR0FBRyxJQUFJLElBQUksVUFBVSxDQUFDLE1BQU0sRUFBRSxHQUFHLElBQUksRUFBRSxDQUFDO1lBQzdELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUNELEtBQUssR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLEdBQUcsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBRWxELCtGQUErRjtRQUMvRix3RkFBd0Y7UUFDeEYsTUFBTSxPQUFPLEdBQUcsQ0FBQyxDQUFnQixFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUYsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUNuRSxNQUFNLEVBQUUsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDL0IsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsSUFBSSxHQUFHLFVBQVUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsTUFBTSxFQUFFLEdBQUcsSUFBSSxHQUFHLFVBQVUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDO1lBQzNGLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUNELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzdGLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDN0UsQ0FBQztJQUVELHdGQUF3RjtJQUN4RixNQUFNLFFBQVEsR0FBRyxDQUFDLE1BQXVCLEVBQUUsRUFBRSxDQUMzQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQy9GLE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUM3RyxNQUFNLEtBQUssR0FBRyxJQUFJLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUU1RCxPQUFPO1FBQ0wsV0FBVyxFQUFFLEVBQUUsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDLEVBQUU7UUFDckUsUUFBUSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUU7UUFDaEQsS0FBSztLQUNOLENBQUM7QUFDSixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsU0FBUyxDQUFDO0FBRTNDLDJFQUEyRTtBQUMzRSxTQUFTLGdCQUFnQixDQUFDLE9BQWdCO0lBQ3hDLE9BQU8sZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsaUNBQWlDLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxpQkFBaUIsQ0FBQztBQUNuSCxDQUFDO0FBeUNELE1BQU0sT0FBTyxjQUFjO0lBNFNMO0lBM1NaLEtBQUssQ0FBZTtJQUNwQixNQUFNLENBQTJCO0lBQ2pDLFFBQVEsQ0FBdUI7SUFDL0IsUUFBUSxDQUFpQjtJQUN6QixnQkFBZ0IsQ0FBVTtJQUVsQyw2QkFBNkI7SUFDckIsU0FBUyxHQUFHLElBQUksS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ2xDLEtBQUssR0FBRyxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUM1QixnQkFBZ0IsR0FBWSxLQUFLLENBQUM7SUFDbEMsZUFBZSxDQUFNO0lBQ3JCLGdCQUFnQixHQUFxQixFQUFFLENBQUM7SUFFaEQsdUNBQXVDO0lBQ2hDLGNBQWMsR0FBRyxJQUFJLE9BQU8sRUFBNEMsQ0FBQztJQUN6RSxjQUFjLEdBQUcsSUFBSSxPQUFPLEVBQWlCLENBQUM7SUFFckQsMEVBQTBFO0lBQ25FLFdBQVcsR0FBRyxJQUFJLE9BQU8sRUFBbUIsQ0FBQztJQUVwRDs7O09BR0c7SUFDSSxXQUFXLEdBQUcsSUFBSSxPQUFPLEVBQVUsQ0FBQztJQUUzQzs7O09BR0c7SUFDSSxZQUFZLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztJQUVsQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7SUFFakMsaUZBQWlGO0lBQzFFLFdBQVcsR0FBRyxJQUFJLE9BQU8sRUFBK0MsQ0FBQztJQUVoRixpR0FBaUc7SUFDakcsc0ZBQXNGO0lBQzlFLFFBQVEsR0FBRyxJQUFJLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUM3QixVQUFVLEdBQUcsSUFBSSxHQUFHLEVBQXdCLENBQUM7SUFFN0Msb0JBQW9CLENBQWtCO0lBRTlDLDRGQUE0RjtJQUNwRixtQkFBbUIsQ0FBbUI7SUFFOUM7Ozs7Ozs7O09BUUc7SUFDSyxjQUFjLEdBQUcsQ0FBQyxDQUFDO0lBRTNCLDZGQUE2RjtJQUNyRixjQUFjLEdBQUcsS0FBSyxDQUFDO0lBRS9CLG9GQUFvRjtJQUM1RSxJQUFJLEdBQUcsS0FBSyxDQUFDO0lBRXJCLHdEQUF3RDtJQUNoRCxlQUFlLEdBQW1CLEVBQUUsQ0FBQztJQUU3QyxpRkFBaUY7SUFDekUsU0FBUyxDQUFrQjtJQUVuQywrRUFBK0U7SUFDdkUsVUFBVSxHQUFHLEtBQUssQ0FBQztJQUUzQiw0RUFBNEU7SUFDcEUsZ0JBQWdCLEdBQW1CLElBQUksQ0FBQztJQUVoRCw0RkFBNEY7SUFDcEYsbUJBQW1CLEdBQStCLElBQUksQ0FBQztJQUUvRCwrRUFBK0U7SUFDdkUsbUJBQW1CLEdBQXNCLElBQUksQ0FBQztJQUV0RDs7OztPQUlHO0lBQ0ssYUFBYSxHQUFHLElBQUksS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBRTFDOzs7T0FHRztJQUNLLGdCQUFnQixHQUFrQixJQUFJLENBQUM7SUFFL0M7Ozs7T0FJRztJQUNLLFNBQVMsR0FBRyxLQUFLLENBQUM7SUFFMUI7Ozs7O09BS0c7SUFDSyxZQUFZLEdBQXVCLElBQUksQ0FBQztJQUV4QyxhQUFhLEdBQUcsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7SUFFcEMsZUFBZSxHQUFHLENBQUMsQ0FBQztJQUU1Qjs7Ozs7Ozs7T0FRRztJQUNLLE1BQU0sQ0FBVSxlQUFlLEdBQUcsSUFBSSxDQUFDO0lBRS9DLGtHQUFrRztJQUMxRixNQUFNLENBQVUsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO0lBRXpDLE1BQU0sQ0FBVSxnQkFBZ0IsR0FBRyxHQUFHLENBQUM7SUFFL0MsMkZBQTJGO0lBQ25GLFdBQVcsR0FBd0IsRUFBRSxDQUFDO0lBRTlDLHVEQUF1RDtJQUMvQyxlQUFlLEdBQXFCLElBQUksQ0FBQztJQUV6QyxTQUFTLEdBQUcsS0FBSyxDQUFDO0lBRTFCLDJDQUEyQztJQUNuQyxhQUFhLEdBQW9CLEVBQUUsQ0FBQztJQUU1Qzs7O09BR0c7SUFDSyxZQUFZLEdBQUcsSUFBSSxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7SUFFekMsd0VBQXdFO0lBQ2hFLGlCQUFpQixDQUFPO0lBRXhCLGVBQWUsR0FBOEIsSUFBSSxDQUFDO0lBRTFELDJGQUEyRjtJQUNuRixnQkFBZ0IsR0FBRyxDQUFDLENBQUM7SUFFN0IsZ0dBQWdHO0lBQ3hGLFVBQVUsQ0FBZTtJQUV6QixPQUFPLEdBQW1CLEdBQUcsQ0FBQztJQUV0Qyw2RkFBNkY7SUFDdEYsb0JBQW9CLEdBQUcsSUFBSSxPQUFPLEVBQWtELENBQUM7SUFFNUY7OztPQUdHO0lBQ0ksaUJBQWlCLEdBQUcsSUFBSSxPQUFPLEVBQVcsQ0FBQztJQUVsRDs7OztPQUlHO0lBQ0ksbUJBQW1CLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztJQUVqRDs7Ozs7T0FLRztJQUNLLE1BQU0sQ0FBVSxVQUFVLEdBQUcsQ0FBQyxDQUFDO0lBRXZDLHVGQUF1RjtJQUMvRSxNQUFNLENBQVUsYUFBYSxHQUFHLEVBQUUsQ0FBQztJQUUzQyx3RkFBd0Y7SUFDaEYsTUFBTSxDQUFVLGFBQWEsR0FBRyxTQUFTLENBQUM7SUFFbEQsNkZBQTZGO0lBQ3JGLE1BQU0sQ0FBVSxzQkFBc0IsR0FBRyxTQUFTLENBQUM7SUFFM0QsK0ZBQStGO0lBQ3ZGLE1BQU0sQ0FBVSxrQkFBa0IsR0FBRyxFQUFFLENBQUM7SUFFaEQsaUZBQWlGO0lBQ3pFLE1BQU0sQ0FBVSxnQkFBZ0IsR0FBRyxHQUFHLENBQUM7SUFFL0MsNkZBQTZGO0lBQ3JGLE1BQU0sQ0FBVSxpQkFBaUIsR0FBRyxDQUFDLENBQUM7SUFFOUMsNEVBQTRFO0lBQ3BFLE1BQU0sQ0FBVSxXQUFXLEdBQUcsdUJBQXVCLENBQUM7SUFFdEQsTUFBTSxDQUFVLGdCQUFnQixHQUFHLENBQUMsQ0FBQztJQUVyQyxVQUFVLENBQTJCO0lBRXJDLFVBQVUsQ0FBMkI7SUFFckMsaUJBQWlCLENBQTJCO0lBRW5DLFNBQVMsR0FBRyxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUUvQyxzRkFBc0Y7SUFDL0UsVUFBVSxHQUFHLElBQUksT0FBTyxFQUF1QixDQUFDO0lBRXZELDhGQUE4RjtJQUN2RixtQkFBbUIsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO0lBRWpELCtEQUErRDtJQUN2RCxnQkFBZ0IsQ0FBZ0I7SUFFaEMsUUFBUSxHQUFHLEtBQUssQ0FBQztJQUV6Qjs7OztPQUlHO0lBQ0ssd0JBQXdCLEdBQUcsS0FBSyxDQUFDO0lBRWpDLGNBQWMsR0FBMkIsRUFBRSxDQUFDO0lBQzVDLGVBQWUsR0FBK0MsSUFBSSxDQUFDO0lBRTNFLDBGQUEwRjtJQUNsRixvQkFBb0IsQ0FBcUI7SUFFakQ7Ozs7Ozs7T0FPRztJQUNLLGdCQUFnQixHQUFHLElBQUksS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBRTdDLDZFQUE2RTtJQUNyRSxNQUFNLEdBQWtELEVBQUUsQ0FBQztJQUVuRSw2RkFBNkY7SUFDdEYsa0JBQWtCLEdBQUcsSUFBSSxPQUFPLEVBQTRCLENBQUM7SUFFcEU7Ozs7O09BS0c7SUFDSSxzQkFBc0IsR0FBRyxJQUFJLE9BQU8sRUFBbUIsQ0FBQztJQUUvRCw2RUFBNkU7SUFDckUsV0FBVyxHQU9SLElBQUksQ0FBQztJQUVoQix3R0FBd0c7SUFDakcsYUFBYSxHQUFHLElBQUksT0FBTyxFQUFXLENBQUM7SUFFOUM7Ozs7O09BS0c7SUFDSSxrQkFBa0IsR0FBRyxJQUFJLE9BQU8sRUFBaUIsQ0FBQztJQUV6RDs7Ozs7O09BTUc7SUFDSSxtQkFBbUIsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO0lBRWpELGdHQUFnRztJQUNoRyw4RkFBOEY7SUFDOUYsOEZBQThGO0lBQ3RGLGVBQWUsQ0FBVTtJQUN6Qix3QkFBd0IsR0FBRyxJQUFJLEdBQUcsRUFBMkYsQ0FBQztJQUV0SSxZQUFvQixNQUFjO1FBQWQsV0FBTSxHQUFOLE1BQU0sQ0FBUTtJQUFJLENBQUM7SUFFdkM7Ozs7O09BS0c7SUFDSCxrQkFBa0IsQ0FBQyxNQUFjO1FBQy9CLElBQUksQ0FBQyxlQUFlLEdBQUcsTUFBTSxDQUFDO1FBQzlCLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxHQUFHLENBQUMsRUFBRSxJQUFJLEVBQXlDLEVBQUUsRUFBRTtZQUNuRixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNsRSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ2IsT0FBTztZQUNULENBQUM7WUFDRCxJQUFJLENBQUMsd0JBQXdCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNyRCxJQUFJLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNoQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUMvQixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLGdEQUFnRCxDQUFDLENBQUMsQ0FBQztZQUM1RixDQUFDO1FBQ0gsQ0FBQyxDQUFDO0lBQ0osQ0FBQztJQUVPLHVCQUF1QixDQUFDLE1BQWM7UUFDNUMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUNyQyxNQUFNLFNBQVMsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3pFLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7WUFDbEUsSUFBSSxDQUFDLGVBQWdCLENBQUMsV0FBVyxDQUFDLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7WUFDekQsdUZBQXVGO1lBQ3ZGLHNGQUFzRjtZQUN0RixVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUNkLElBQUksSUFBSSxDQUFDLHdCQUF3QixDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO29CQUNqRCxPQUFPLENBQUMsSUFBSSxDQUFDLDJFQUEyRSxTQUFTLFlBQVksTUFBTSwrR0FBK0csQ0FBQyxDQUFDO2dCQUN0TyxDQUFDO1lBQ0gsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ1osQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsc0ZBQXNGO0lBQzlFLGtCQUFrQixDQUFDLElBQW9CLEVBQUUsU0FBZTtRQUM5RCxNQUFNLFFBQVEsR0FBRyxJQUFJLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUM1QyxRQUFRLENBQUMsWUFBWSxDQUFDLFVBQVUsRUFBRSxJQUFJLEtBQUssQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQy9FLElBQUksSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ1osUUFBUSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsSUFBSSxLQUFLLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyRSxDQUFDO1FBQ0QsNkZBQTZGO1FBQzdGLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2YsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEtBQUssQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlELENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNoQixRQUFRLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxJQUFJLEtBQUssQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzdFLENBQUM7YUFBTSxDQUFDO1lBQ04sUUFBUSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDbEMsQ0FBQztRQUNELDBGQUEwRjtRQUMxRiwyRkFBMkY7UUFDM0YsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDckIsUUFBUSxDQUFDLFdBQVcsR0FBRyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQ25DLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLEVBQzFDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQzNDLENBQUM7UUFDSixDQUFDO1FBRUQsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ3hELE1BQU0sUUFBUSxHQUFHLFNBQVMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUN4RSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ2QsT0FBTyxDQUFDLElBQUksQ0FBQywwQ0FBMEMsSUFBSSxlQUFlLElBQUksQ0FBQyxJQUFJLHlDQUF5QyxDQUFDLENBQUM7WUFDaEksQ0FBQztZQUNELE9BQU8sUUFBUSxJQUFJLElBQUksS0FBSyxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDbkQsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLElBQWdCLENBQUM7UUFDckIsSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztZQUNqRyxJQUFJLEdBQUcsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1FBQ3JELENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxHQUFHLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4RCxDQUFDO1FBQ0QsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQ3RCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELElBQUksQ0FBQyxNQUF5QjtRQUM1QixnR0FBZ0c7UUFDaEcscUZBQXFGO1FBQ3JGLEVBQUU7UUFDRiwrRkFBK0Y7UUFDL0YscUZBQXFGO1FBQ3JGLGdHQUFnRztRQUNoRyx5REFBeUQ7UUFDekQsNEZBQTRGO1FBQzVGLDBGQUEwRjtRQUMxRiw2RkFBNkY7UUFDN0YsZUFBZTtRQUNmLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2QsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2pCLENBQUM7UUFDRCxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDakIsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDdkIsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDeEIsK0ZBQStGO1FBQy9GLHNGQUFzRjtRQUN0RixJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztRQUN0QixJQUFJLENBQUMsd0JBQXdCLEdBQUcsS0FBSyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxjQUFjLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQzdCLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1FBRXhCLGlCQUFpQjtRQUNqQixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQy9CLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxHQUFHLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBRWxFLGtCQUFrQjtRQUNsQixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksS0FBSyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsV0FBVyxHQUFHLE1BQU0sQ0FBQyxZQUFZLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3BHLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMscUNBQXFDO1FBRXpFLDBCQUEwQjtRQUMxQixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksS0FBSyxDQUFDLGFBQWEsQ0FBQyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNyRSxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUMvRCxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3BFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUVqQyxrREFBa0Q7UUFDbEQsSUFBSSxrQkFBa0IsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDdkMsSUFBSSxDQUFDLFFBQWdCLENBQUMsZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLENBQUMsdUJBQXVCO1FBQzNFLENBQUM7YUFBTSxDQUFDO1lBQ0wsSUFBSSxDQUFDLFFBQWdCLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxDQUFDLHFCQUFxQjtRQUNyRSxDQUFDO1FBRUQsNEZBQTRGO1FBQzVGLDJGQUEyRjtRQUMzRiw2RkFBNkY7UUFDN0YsOEZBQThGO1FBQzlGLHVDQUF1QztRQUN2QyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUMscUJBQXFCLENBQUM7UUFDeEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsR0FBRyxHQUFHLENBQUM7UUFFeEMseURBQXlEO1FBQ3pELEVBQUU7UUFDRiw4RkFBOEY7UUFDOUYsK0ZBQStGO1FBQy9GLGdHQUFnRztRQUNoRyxnR0FBZ0c7UUFDaEcsa0ZBQWtGO1FBQ2xGLEVBQUU7UUFDRixpR0FBaUc7UUFDakcsbURBQW1EO1FBQ25ELE1BQU0sWUFBWSxHQUFHLElBQUksS0FBSyxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDM0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUM7UUFFN0IsK0ZBQStGO1FBQy9GLGlHQUFpRztRQUNqRyw4RkFBOEY7UUFDOUYsNkJBQTZCO1FBQzdCLE1BQU0sU0FBUyxHQUFHLElBQUksS0FBSyxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUM3RCxTQUFTLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzNCLG1HQUFtRztRQUNuRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFNUIsK0JBQStCO1FBQy9CLEVBQUU7UUFDRiw2RkFBNkY7UUFDN0YsNEZBQTRGO1FBQzVGLDBGQUEwRjtRQUMxRiwyRkFBMkY7UUFDM0YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUU7WUFDakMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLGFBQWEsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDM0UsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsR0FBRyxHQUFHLENBQUM7UUFDaEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLEdBQUcsR0FBRyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztRQUNuQyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksR0FBRztZQUMzQixJQUFJLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNO1lBQ3hCLE1BQU0sRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUs7WUFDekIsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRztTQUN2QixDQUFDO1FBQ0YsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFbEMsb0VBQW9FO1FBQ3BFLElBQUksQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRTtZQUMzQyxJQUFJLENBQUMsZUFBZSxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ3JDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7WUFDL0IsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ1YsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUU7WUFDekMsWUFBWSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUNuQyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO2dCQUMxQixVQUFVLENBQUMsR0FBRyxFQUFFO29CQUNkLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7Z0JBQ2hDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUNWLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILDZGQUE2RjtRQUM3RiwwRkFBMEY7UUFDMUYsNENBQTRDO1FBQzVDLE1BQU0sTUFBTSxHQUFHLENBQUMsSUFBWSxFQUFFLE9BQW9DLEVBQUUsRUFBRTtZQUNwRSxNQUFNLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLE9BQXdCLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDL0QsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLG1CQUFtQixDQUFDLElBQUksRUFBRSxPQUF3QixFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDckcsQ0FBQyxDQUFDO1FBQ0YsK0ZBQStGO1FBQy9GLHNEQUFzRDtRQUN0RCxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM1RSxvRkFBb0Y7UUFDcEYsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUU3Riw2RkFBNkY7UUFDN0YsNkZBQTZGO1FBQzdGLDZGQUE2RjtRQUM3RiwrREFBK0Q7UUFDL0QsTUFBTSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDdEQsSUFBSSxDQUFDLFVBQVUsRUFBRSxPQUFPLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQztRQUM1QixJQUFJLENBQUMsaUJBQWlCLEVBQUUsT0FBTyxFQUFFLENBQUM7UUFDbEMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFNBQVMsQ0FBQztRQUNuQyxJQUFJLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQztRQUM1QixNQUFNLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUVuRCwyQkFBMkI7UUFDM0IsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUU7WUFDakMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2pCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNLLGtCQUFrQixHQUFHLGVBQWUsQ0FBQztJQUU3QyxrRUFBa0U7SUFDbEUscUJBQXFCLENBQUMsSUFBWTtRQUNoQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDO0lBQ2pDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILGFBQWEsQ0FBQyxHQUFXLEVBQUUsY0FBa0QsRUFBRSxRQUE0QyxFQUFFLFFBQWlCLEVBQUUsRUFBbUI7UUFDakssTUFBTSxNQUFNLEdBQUcsSUFBSSxVQUFVLEVBQUUsQ0FBQztRQUVoQyw4RkFBOEY7UUFDOUYsNkZBQTZGO1FBQzdGLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2xCLElBQUksQ0FBQztnQkFDSCxNQUFNLFVBQVUsR0FBRyxJQUFJLFVBQVUsRUFBRTtxQkFDaEMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDO3FCQUMxQyxhQUFhLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUNoQyxNQUFNLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ25DLENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLE9BQU8sQ0FBQyxJQUFJLENBQUMsK0ZBQStGLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDdkgsQ0FBQztRQUNILENBQUM7UUFDRCw4RkFBOEY7UUFDOUYsTUFBTSxDQUFDLGlCQUFpQixDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBRXpDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNoQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRWhDLDJGQUEyRjtRQUMzRix1RkFBdUY7UUFDdkYsTUFBTSxRQUFRLEdBQUcsQ0FBQyxJQUFTLEVBQUUsRUFBRTtZQUM3QixJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQztnQkFDZCx5RkFBeUY7Z0JBQ3pGLDhEQUE4RDtnQkFDOUQsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQzlCLE9BQU87WUFDVCxDQUFDO1lBQ0QsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN6QyxJQUFJLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzNDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDckMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNyQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3hFLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNqQixDQUFDLENBQUM7UUFDRixNQUFNLE9BQU8sR0FBRyxDQUFDLEtBQVUsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBRTdFLCtGQUErRjtRQUMvRiwrRkFBK0Y7UUFDL0YsOEZBQThGO1FBQzlGLDZGQUE2RjtRQUM3RixxRkFBcUY7UUFDckYsRUFBRTtRQUNGLDJGQUEyRjtRQUMzRiw0RkFBNEY7UUFDNUYsMEJBQTBCO1FBQzFCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDO1lBQ25DLDBGQUEwRjtZQUMxRiwyRkFBMkY7WUFDM0YsNkNBQTZDO2FBQzVDLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQzthQUMxRCxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtZQUNmLHlGQUF5RjtZQUN6Rix5RkFBeUY7WUFDekYsMkRBQTJEO1lBQzNELElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUMxRCxNQUFNLElBQUksWUFBWSxDQUFDLHNCQUFzQixFQUFFLFlBQVksQ0FBQyxDQUFDO1lBQy9ELENBQUM7WUFDRCxNQUFNLFdBQVcsR0FBRyxVQUFpQixDQUFDO1lBQ3RDLE1BQU0seUJBQXlCLEdBQUcsV0FBVyxDQUFDLGlCQUFpQixDQUFDO1lBQ2hFLFdBQVcsQ0FBQyxpQkFBaUIsR0FBRyxTQUFTLENBQUM7WUFDMUMsSUFBSSxDQUFDO2dCQUNILE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ3RGLENBQUM7b0JBQVMsQ0FBQztnQkFDVCxXQUFXLENBQUMsaUJBQWlCLEdBQUcseUJBQXlCLENBQUM7WUFDNUQsQ0FBQztRQUNILENBQUMsQ0FBQzthQUNELEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNwQixDQUFDO0lBRUQsb0ZBQW9GO0lBQzVFLFVBQVUsQ0FBQyxNQUFxQixFQUFFLEtBQVUsRUFBRSxJQUFZO1FBQ2hFLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDO1lBQ2Qsd0ZBQXdGO1lBQ3hGLCtEQUErRDtZQUMvRCxPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDO1FBQzVCLDhGQUE4RjtRQUM5RixJQUFJLEtBQUssRUFBRSxJQUFJLEtBQUssWUFBWSxFQUFFLENBQUM7WUFDakMsNEZBQTRGO1lBQzVGLDRDQUE0QztZQUM1QyxJQUFJLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQzdDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNsQyxDQUFDO1FBQ0gsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLENBQUMsS0FBSyxDQUFDLGlCQUFpQixJQUFJLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNqRCxDQUFDO1FBQ0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0IsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsZUFBZTtRQUNiLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxLQUFLLEVBQUUsQ0FBQztJQUNwQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ssa0JBQWtCO1FBQ3hCLElBQUksQ0FBQyxjQUFjLElBQUksQ0FBQyxDQUFDO1FBQ3pCLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxLQUFLLEVBQUUsQ0FBQztRQUNsQyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsU0FBUyxDQUFDO1FBQ3JDLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDO1lBQzVCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQy9CLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckMsQ0FBQztJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSyxTQUFTO1FBQ2YsSUFBSSxDQUFDLGNBQWMsSUFBSSxDQUFDLENBQUM7UUFDekIsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQztRQUN2QyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztRQUMzQixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM5QixPQUFPLEdBQUcsRUFBRSxDQUFDLFVBQVUsS0FBSyxJQUFJLENBQUMsY0FBYyxDQUFDO0lBQ2xELENBQUM7SUFFRCw2REFBNkQ7SUFDckQsT0FBTztRQUNiLElBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDO1FBQzVCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSyxjQUFjO1FBQ3BCLElBQUksT0FBTyxxQkFBcUIsS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUNoRCxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUQsQ0FBQztRQUNELE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUM3QixxQkFBcUIsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDdEUsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNLLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxHQUFXLEVBQUUsUUFBaUI7UUFDNUQsOEZBQThGO1FBQzlGLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxLQUFLLEVBQUUsQ0FBQztRQUNsQyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxlQUFlLEVBQUUsQ0FBQztRQUNqRCxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDO1FBRTVDLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3ZELElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ25CLDRGQUE0RjtZQUM1RixvRUFBb0U7WUFDcEUsTUFBTSxJQUFJLFlBQVksQ0FBQyxzQkFBc0IsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUMvRCxDQUFDO1FBQ0QsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNYLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDaEMsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQztRQUVELE1BQU0sUUFBUSxHQUFHLE1BQU0sS0FBSyxDQUFDLEdBQUcsRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDOUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLG1CQUFtQixHQUFHLEtBQUssUUFBUSxDQUFDLE1BQU0sSUFBSSxRQUFRLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztRQUN2RixDQUFDO1FBRUQsTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQztRQUNyRSxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxJQUFJLGFBQWEsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXRGLDZGQUE2RjtRQUM3RixxRkFBcUY7UUFDckYsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUM7WUFDOUIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNuQyxPQUFPLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNoQyxDQUFDO1FBRUQsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUV6QyxnR0FBZ0c7UUFDaEcsZ0dBQWdHO1FBQ2hHLDZCQUE2QjtRQUM3QixNQUFNLE1BQU0sR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ3hELE1BQU0sTUFBTSxHQUFpQixFQUFFLENBQUM7UUFDaEMsSUFBSSxXQUFXLEdBQUcsTUFBTSxLQUFLLElBQUksQ0FBQztRQUNsQyxJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUM7UUFDakIsZ0dBQWdHO1FBQ2hHLDZGQUE2RjtRQUM3RiwwRUFBMEU7UUFDMUUsSUFBSSxZQUFZLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFFdEIsSUFBSSxLQUFLLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDaEIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyQyxDQUFDO1FBRUQsU0FBUyxDQUFDO1lBQ1IsTUFBTSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxNQUFNLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUM1QyxJQUFJLElBQUksRUFBRSxDQUFDO2dCQUNULE1BQU07WUFDUixDQUFDO1lBQ0QsSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ25CLHlFQUF5RTtnQkFDekUsTUFBTSxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ3RCLE1BQU0sSUFBSSxZQUFZLENBQUMsc0JBQXNCLEVBQUUsWUFBWSxDQUFDLENBQUM7WUFDL0QsQ0FBQztZQUNELElBQUksV0FBVyxJQUFJLFFBQVEsR0FBRyxLQUFLLENBQUMsTUFBTSxHQUFHLEtBQUssRUFBRSxDQUFDO2dCQUNuRCwyRkFBMkY7Z0JBQzNGLHVFQUF1RTtnQkFDdkUsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO2dCQUN2QyxXQUFXLEdBQUcsS0FBSyxDQUFDO1lBQ3RCLENBQUM7WUFDRCxJQUFJLFdBQVcsRUFBRSxDQUFDO2dCQUNoQixNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQztZQUM5QixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNyQixDQUFDO1lBQ0QsUUFBUSxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUM7WUFDekIsSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ2QsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUNwRSxJQUFJLE9BQU8sS0FBSyxZQUFZLEVBQUUsQ0FBQztvQkFDN0IsWUFBWSxHQUFHLE9BQU8sQ0FBQztvQkFDdkIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsR0FBRyxDQUFDLENBQUM7Z0JBQzlDLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUVELDRGQUE0RjtRQUM1Riw2RUFBNkU7UUFDN0UsSUFBSSxLQUFLLEdBQUcsQ0FBQyxJQUFJLFlBQVksS0FBSyxHQUFHLEVBQUUsQ0FBQztZQUN0QyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xDLENBQUM7UUFFRCxJQUFJLE1BQW1CLENBQUM7UUFDeEIsSUFBSSxXQUFXLElBQUksUUFBUSxLQUFLLEtBQUssRUFBRSxDQUFDO1lBQ3RDLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO1FBQ3pCLENBQUM7YUFBTSxJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQ3ZCLCtEQUErRDtZQUMvRCxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQzVDLENBQUM7YUFBTSxDQUFDO1lBQ04sTUFBTSxNQUFNLEdBQUcsSUFBSSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDeEMsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDO1lBQ2YsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO2dCQUN2QixNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFDMUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUM7WUFDekIsQ0FBQyxDQUFDLENBQUM7WUFDSCxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUN6QixDQUFDO1FBRUQsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQy9DLE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNLLEtBQUssQ0FBQyxjQUFjO1FBQzFCLElBQUksT0FBTyxNQUFNLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDbEMsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBQ0QsSUFBSSxDQUFDO1lBQ0gsT0FBTyxNQUFNLE1BQU0sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3ZELENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ssS0FBSyxDQUFDLGtCQUFrQixDQUFDLFFBQWlCO1FBQ2hELElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNkLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUNELElBQUksQ0FBQztZQUNILE1BQU0sS0FBSyxHQUFHLE1BQU0sSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQzFDLE1BQU0sR0FBRyxHQUFHLE1BQU0sS0FBSyxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDN0QsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDOUMsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztJQUNILENBQUM7SUFFRCw2RUFBNkU7SUFDckUsS0FBSyxDQUFDLGlCQUFpQixDQUFDLFFBQTRCLEVBQUUsS0FBa0I7UUFDOUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2QsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLENBQUM7WUFDSCxNQUFNLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUMxQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ1gsT0FBTztZQUNULENBQUM7WUFDRCxNQUFNLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsRUFBRSxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBRW5FLDhGQUE4RjtZQUM5RixnRkFBZ0Y7WUFDaEYsTUFBTSxJQUFJLEdBQUcsTUFBTSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDaEMsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUNmLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLEdBQUcsY0FBYyxDQUFDLGdCQUFnQixDQUFDLENBQUM7aUJBQ3RFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUNuQyxDQUFDO1FBQ0osQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLDRGQUE0RjtRQUM5RixDQUFDO0lBQ0gsQ0FBQztJQUVELDZGQUE2RjtJQUNyRixhQUFhLENBQUMsUUFBZ0I7UUFDcEMsT0FBTyw0Q0FBNEMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztJQUNwRixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNLLG9CQUFvQixDQUFDLE1BQWM7UUFDekMsSUFBSSxNQUFNLEdBQUcsRUFBRSxFQUFFLENBQUM7WUFDaEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUN4QixDQUFDO2FBQU0sSUFBSSxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQztRQUN6QixDQUFDO2FBQU0sSUFBSSxNQUFNLEdBQUcsSUFBSSxFQUFFLENBQUM7WUFDekIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDO1lBQ3RCLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQztRQUMxQixDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQztZQUN2QixJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxPQUFPLENBQUM7UUFDNUIsQ0FBQztRQUNELElBQUksQ0FBQyxNQUFNLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztJQUN2QyxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7OztPQVlHO0lBQ0ssdUJBQXVCLENBQUMsSUFBb0I7UUFDbEQsTUFBTSxTQUFTLEdBQUcsSUFBSSxHQUFHLEVBQWdDLENBQUM7UUFFMUQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ3RCLE1BQU0sSUFBSSxHQUFHLEtBQW1CLENBQUM7WUFDakMsSUFBSSxDQUFFLElBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDMUIsT0FBTztZQUNULENBQUM7WUFFRCxNQUFNLE9BQU8sR0FBRyxDQUFDLE1BQVcsRUFBTyxFQUFFO2dCQUNuQyxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUUsTUFBYyxDQUFDLHNCQUFzQixFQUFFLENBQUM7b0JBQ3ZELE9BQU8sTUFBTSxDQUFDO2dCQUNoQixDQUFDO2dCQUNELElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7b0JBQzNCLE1BQU0sS0FBSyxHQUFHLElBQUksS0FBSyxDQUFDLGlCQUFpQixDQUFDO3dCQUN4QyxHQUFHLEVBQUUsTUFBTSxDQUFDLEdBQUc7d0JBQ2YsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLO3dCQUNuQixXQUFXLEVBQUUsTUFBTSxDQUFDLFdBQVc7d0JBQy9CLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTzt3QkFDdkIsU0FBUyxFQUFFLE1BQU0sQ0FBQyxTQUFTO3dCQUMzQixJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUk7d0JBQ2pCLFFBQVEsRUFBRSxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDO3dCQUNuQyxTQUFTLEVBQUUsQ0FBQztxQkFDYixDQUFDLENBQUM7b0JBQ0gsS0FBSyxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO29CQUN6QixTQUFTLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDL0IsQ0FBQztnQkFDRCxPQUFPLFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDL0IsQ0FBQyxDQUFDO1lBRUYsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7Z0JBQzFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUM7Z0JBQzVCLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzdCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7Ozs7Ozs7O09BVUc7SUFDSyx5QkFBeUIsQ0FBQyxJQUFvQjtRQUNwRCxNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBTyxDQUFDO1FBQzVCLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUN0QixNQUFNLElBQUksR0FBRyxLQUFtQixDQUFDO1lBQ2pDLElBQUksQ0FBRSxJQUFZLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQzFCLE9BQU87WUFDVCxDQUFDO1lBQ0QsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2pGLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFhLEVBQUUsRUFBRTtnQkFDbEMsSUFBSSxRQUFRLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7b0JBQ3BDLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7b0JBQ25CLFFBQVEsQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQztvQkFDakMsUUFBUSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7Z0JBQzlCLENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7Ozs7Ozs7OztPQVdHO0lBQ0ssbUJBQW1CLENBQUMsSUFBb0I7UUFDOUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ3RCLE1BQU0sSUFBSSxHQUFHLEtBQW1CLENBQUM7WUFDakMsSUFBSSxDQUFFLElBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDMUIsT0FBTztZQUNULENBQUM7WUFDRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBZ0MsQ0FBQztZQUN2RCxJQUFJLFFBQVEsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztnQkFDcEMsT0FBTztZQUNULENBQUM7WUFFRCxRQUFRLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztZQUVoQywyRkFBMkY7WUFDM0YsaUZBQWlGO1lBQ2pGLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNqRixTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBYSxFQUFFLEVBQUU7Z0JBQ2xDLElBQUksUUFBUSxJQUFJLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztvQkFDckMsUUFBUSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7b0JBQzdCLFFBQVEsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO2dCQUM5QixDQUFDO1lBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7T0FXRztJQUNLLG1CQUFtQixDQUFDLElBQW9CO1FBQzlDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbkIsT0FBTztRQUNULENBQUM7UUFDRCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3BFLElBQUksQ0FBQyxhQUFhLElBQUksYUFBYSxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3pDLE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQU8sQ0FBQztRQUM1QixJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDdEIsTUFBTSxJQUFJLEdBQUcsS0FBbUIsQ0FBQztZQUNqQyxJQUFJLENBQUUsSUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUMxQixPQUFPO1lBQ1QsQ0FBQztZQUNELE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNqRixTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBYSxFQUFFLEVBQUU7Z0JBQ2xDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFDZCxPQUFPO2dCQUNULENBQUM7Z0JBQ0QsaUZBQWlGO2dCQUNqRixDQUFDLEtBQUssRUFBRSxXQUFXLEVBQUUsY0FBYyxFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQUUsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7b0JBQzVGLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDL0IsSUFBSSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7d0JBQ2xDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7d0JBQ2xCLE9BQU8sQ0FBQyxVQUFVLEdBQUcsYUFBYSxDQUFDO3dCQUNuQyxPQUFPLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQzt3QkFDaEMsT0FBTyxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUMsWUFBWSxDQUFDO3dCQUN2QyxPQUFPLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztvQkFDN0IsQ0FBQztnQkFDSCxDQUFDLENBQUMsQ0FBQztZQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsWUFBWSxDQUFDLE1BQWMsRUFBRSxNQUFjLEVBQUUsY0FBa0QsRUFBRSxRQUE0QztRQUMzSSxNQUFNLFNBQVMsR0FBRyxJQUFJLFNBQVMsRUFBRSxDQUFDO1FBQ2xDLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDbEUsU0FBUyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM1QixNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFFbEUsOEZBQThGO1FBQzlGLHlDQUF5QztRQUN6QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDaEMsTUFBTSxNQUFNLEdBQUcsR0FBRyxFQUFFO1lBQ2xCLElBQUksTUFBTSxFQUFFLEVBQUUsQ0FBQztnQkFDYixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDakIsQ0FBQztRQUNILENBQUMsQ0FBQztRQUVGLFNBQVMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsU0FBUyxFQUFFLEVBQUU7WUFDeEMsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUM7Z0JBQ2QsT0FBTztZQUNULENBQUM7WUFDRCxTQUFTLENBQUMsT0FBTyxFQUFFLENBQUM7WUFFcEIsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7Z0JBQ3pCLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxNQUFNLENBQUM7cUJBQ2pDLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO29CQUNmLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDO3dCQUNkLE9BQU87b0JBQ1QsQ0FBQztvQkFDRCxNQUFNLEtBQUssR0FBRyxJQUFJLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztvQkFDaEMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFO3dCQUMxQixLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQztvQkFDMUQsQ0FBQyxDQUFDLENBQUM7b0JBQ0gsSUFBSSxDQUFDLHdCQUF3QixDQUFDLEtBQUssRUFBRSxjQUFjLEVBQUUsUUFBUSxDQUFDLENBQUM7Z0JBQ2pFLENBQUMsQ0FBQztxQkFDRCxLQUFLLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtvQkFDZixPQUFPLENBQUMsS0FBSyxDQUFDLG9DQUFvQyxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUM3RCxDQUFDLENBQUM7cUJBQ0QsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUNuQixPQUFPO1lBQ1QsQ0FBQztZQUVELE1BQU0sU0FBUyxHQUFHLElBQUksU0FBUyxFQUFFLENBQUM7WUFDbEMsU0FBUyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUVsQyxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFO2dCQUNoQyxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQztvQkFDZCxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUMxQixPQUFPO2dCQUNULENBQUM7Z0JBQ0QsSUFBSSxDQUFDLHdCQUF3QixDQUFDLE1BQU0sRUFBRSxjQUFjLEVBQUUsUUFBUSxDQUFDLENBQUM7Z0JBQ2hFLE1BQU0sRUFBRSxDQUFDO1lBQ1gsQ0FBQyxFQUFFLFNBQVMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO2dCQUN0QixPQUFPLENBQUMsS0FBSyxDQUFDLDBCQUEwQixFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUNqRCxNQUFNLEVBQUUsQ0FBQztZQUNYLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxFQUFFLFNBQVMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ3RCLE9BQU8sQ0FBQyxLQUFLLENBQUMseUJBQXlCLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDaEQsTUFBTSxFQUFFLENBQUM7UUFDWCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCwyRkFBMkY7SUFDbkYsd0JBQXdCLENBQUMsTUFBc0IsRUFBRSxjQUFrRCxFQUFFLFFBQTRDLEVBQUUsRUFBbUI7UUFDNUssZ0dBQWdHO1FBQ2hHLCtFQUErRTtRQUMvRSxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNuQiw0RkFBNEY7WUFDNUYsd0RBQXdEO1lBQ3hELElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUNsQixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUM1QixDQUFDO1lBQ0QsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQ25CLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUN6QixDQUFDO1FBQ0gsQ0FBQztRQUNELElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUVuQixNQUFNLEdBQUcsR0FBRyxJQUFJLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbkQsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ2xELE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUM5QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEQsTUFBTSxLQUFLLEdBQUcsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRTNDLDRGQUE0RjtRQUM1RixnR0FBZ0c7UUFDaEcsbUZBQW1GO1FBQ25GLE1BQU0sS0FBSyxHQUFHLElBQUksS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2hDLE1BQU0sUUFBUSxHQUFHLElBQUksS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ25DLFFBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRTlCLElBQUksUUFBUSxFQUFFLENBQUM7WUFDYixNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFELENBQUM7UUFDRCwrRkFBK0Y7UUFDL0YsMkZBQTJGO1FBQzNGLDZGQUE2RjtRQUM3Rix5RUFBeUU7UUFDekUsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7UUFDeEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUN6RSxLQUFLLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBRTFELElBQUksQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7UUFDcEQsNkZBQTZGO1FBQzdGLGdFQUFnRTtRQUNoRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN2RixJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUM1Qiw2RkFBNkY7UUFDN0YsOEVBQThFO1FBQzlFLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1FBQzNFLFFBQVEsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDckIsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDNUIsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDakMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNwQixLQUFLLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUU3QixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0QixJQUFJLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBRW5DLHlGQUF5RjtRQUN6RixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUUxQixJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUM7UUFFdkQsSUFBSSxjQUFjLEVBQUUsQ0FBQztZQUNuQixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUMsRUFBRSxjQUFjLENBQUMsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqRixDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3JDLENBQUM7UUFDRCxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNsQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09Bd0JHO0lBQ0ssYUFBYSxDQUFDLE1BQXNCLEVBQUUsSUFBbUI7UUFDL0QsTUFBTSxJQUFJLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBVSxDQUFDO1FBQ3RDLHdFQUF3RTtRQUN4RSxNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFFakQsSUFBSSxhQUFhLEdBQUcsQ0FBQyxDQUFDO1FBQ3RCLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMvQixNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBVSxFQUFFLEVBQUU7WUFDN0IsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxRQUFRLENBQUM7WUFDdEUsSUFBSSxRQUFRLEVBQUUsQ0FBQztnQkFDYixhQUFhLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzVGLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksYUFBYSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3hCLCtDQUErQztZQUMvQyxPQUFPLEdBQUcsQ0FBQztRQUNiLENBQUM7UUFDRCw4RkFBOEY7UUFDOUYsZ0JBQWdCO1FBQ2hCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFFOUQsTUFBTSxDQUFDLEdBQUcsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDOUIsTUFBTSxDQUFDLEdBQUcsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDOUIsTUFBTSxDQUFDLEdBQUcsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDOUIsTUFBTSxNQUFNLEdBQUcsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDbkMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQVUsRUFBRSxFQUFFO1lBQzdCLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLFFBQVEsRUFBRSxVQUFVLEVBQUUsUUFBUSxDQUFDO1lBQ3RFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDZCxPQUFPO1lBQ1QsQ0FBQztZQUNELE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1lBQ25DLE1BQU0sS0FBSyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3pELEtBQUssSUFBSSxRQUFRLEdBQUcsQ0FBQyxFQUFFLFFBQVEsR0FBRyxLQUFLLEVBQUUsUUFBUSxJQUFJLE1BQU0sRUFBRSxDQUFDO2dCQUM1RCxNQUFNLE1BQU0sR0FBRyxRQUFRLEdBQUcsQ0FBQyxDQUFDO2dCQUM1QixDQUFDLENBQUMsbUJBQW1CLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDckcsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDN0csQ0FBQyxDQUFDLG1CQUFtQixDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDN0cscUZBQXFGO2dCQUNyRiwyQ0FBMkM7Z0JBQzNDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3hDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtvQkFDcEIsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztnQkFDbEUsQ0FBQyxDQUFDLENBQUM7WUFDTCxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFHSCxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDL0YsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ25ELDRGQUE0RjtRQUM1RiwwQkFBMEI7UUFDMUIsTUFBTSxRQUFRLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQ3RDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNwQixRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDL0YsQ0FBQyxDQUFDLENBQUM7UUFDSCxvREFBb0Q7UUFDcEQsTUFBTSxNQUFNLEdBQUcsQ0FBQyxPQUE2QixFQUFVLEVBQUUsQ0FDdkQsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUV0RSxNQUFNLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMzQyxNQUFNLENBQUMsRUFBRSxZQUFZLEVBQUUsUUFBUSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2xELE1BQU0sQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRTlDLGlGQUFpRjtRQUNqRixNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksSUFBSSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDN0UsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxJQUFJLEdBQUcsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ3BGLE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxHQUFHO2VBQ3pDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQztZQUMvQywyRkFBMkY7ZUFDeEYsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLElBQUksR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDO1lBQzVDLENBQUMsQ0FBQyxRQUFRO1lBQ1YsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUVULE1BQU0sS0FBSyxHQUFHLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxZQUFZLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQWdCLEVBQUUsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUM7UUFDakcsSUFBSSxRQUFRLEdBQVMsR0FBRyxDQUFDO1FBQ3pCLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNyQiwwREFBMEQ7WUFDMUQsUUFBUSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7UUFDdkUsQ0FBQzthQUFNLElBQUksUUFBUSxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUN0RSw0RUFBNEU7WUFDNUUsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN0QixDQUFDO1FBQ0QsSUFBSSxRQUFRLEtBQUssR0FBRyxFQUFFLENBQUM7WUFDckIsT0FBTyxHQUFHLENBQUM7UUFDYixDQUFDO1FBRUQsOEZBQThGO1FBQzlGLDhGQUE4RjtRQUM5Riw0QkFBNEI7UUFDNUIsTUFBTSxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDNUMsTUFBTSxFQUFFLEdBQUcsR0FBRyxRQUFRLEdBQUcsSUFBSSxHQUFHLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxRQUFRLEVBQW9CLENBQUM7UUFDaEcsT0FBTyxDQUFDLElBQUksQ0FBQyx5REFBeUQsRUFBRSxnQ0FBZ0MsQ0FBQyxDQUFDO1FBQzFHLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVELGlFQUFpRTtJQUN6RCxlQUFlLENBQUMsRUFBa0I7UUFDeEMsTUFBTSxJQUFJLEdBQUcsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDakMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBb0IsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0UsT0FBTyxJQUFJLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyRixDQUFDO0lBRUQsMEZBQTBGO0lBQzFGLFVBQVU7UUFDUixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDdEIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsVUFBVSxDQUFDLEVBQWtCO1FBQzNCLElBQUksQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUVEOzs7Ozs7Ozs7O09BVUc7SUFDSyxtQkFBbUIsQ0FBQyxNQUF5QjtRQUNuRCxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxTQUFTLElBQUksT0FBTyxjQUFjLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDeEQsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxjQUFjLENBQUMsR0FBRyxFQUFFO1lBQ2xELE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxXQUFXLENBQUM7WUFDcEMsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLFlBQVksQ0FBQztZQUN0QyxJQUFJLEtBQUssS0FBSyxDQUFDLElBQUksTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUNoQyxPQUFPO1lBQ1QsQ0FBQztZQUNELElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLEtBQUssR0FBRyxNQUFNLENBQUM7WUFDcEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1lBQ3JDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztZQUNyQyxJQUFJLENBQUMsMkJBQTJCLEVBQUUsQ0FBQztZQUNuQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUM1QixDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNIOzs7Ozs7T0FNRztJQUNILHFCQUFxQixDQUFDLFFBQVEsR0FBRyxJQUFJO1FBQ25DLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxRQUFRLENBQUM7UUFDekMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDNUIscUZBQXFGO1FBQ3JGLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsb0JBQW9CO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsd0JBQXdCLENBQUM7SUFDeEQsQ0FBQztJQUVELG1HQUFtRztJQUNuRyxRQUFRLENBQUMsU0FBaUI7UUFDeEIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDOUMsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNYLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsUUFBUSxDQUFDLE9BQU8sSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ2pGLENBQUM7SUFDSCxDQUFDO0lBRUQsaUJBQWlCO1FBQ2YsMEZBQTBGO1FBQzFGLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN6QixDQUFDO1FBQ0QsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFDckIsSUFBSSxDQUFDLGNBQWMsR0FBRyxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDNUIsK0ZBQStGO1FBQy9GLG1EQUFtRDtRQUNuRCxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUM1QixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNsQixJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLFdBQVcsQ0FBQztRQUN0RCxDQUFDO1FBQ0QsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVELGtCQUFrQjtRQUNoQixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ3RCLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxLQUFLLENBQUM7UUFDdEMsSUFBSSxDQUFDLGNBQWMsR0FBRyxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDNUIsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDNUIsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUM7UUFDcEQsQ0FBQztRQUNELElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQzNCLElBQUksV0FBVyxFQUFFLENBQUM7WUFDaEIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2xDLENBQUM7SUFDSCxDQUFDO0lBRUQsY0FBYztRQUNaLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN2QixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0sscUJBQXFCO1FBQzNCLE9BQU8sSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQ3hGLENBQUM7SUFFRCw4REFBOEQ7SUFDOUQsTUFBTSxDQUFDLFNBQWlCO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVELDBFQUEwRTtJQUMxRSxXQUFXO1FBQ1QsSUFBSSxPQUFPLEdBQUcsQ0FBQyxDQUFDO1FBQ2hCLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDakMsSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ25CLE9BQU8sSUFBSSxDQUFDLENBQUM7WUFDZixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCx1QkFBdUI7UUFDckIsTUFBTSxFQUFFLEdBQUcsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDL0IsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQW9CLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3RixNQUFNLFNBQVMsR0FBRyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2pFLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNmLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUNELCtGQUErRjtRQUMvRiwyREFBMkQ7UUFDM0QsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7UUFDdEIsSUFBSSxDQUFDLHdCQUF3QixHQUFHLEtBQUssQ0FBQztRQUN0QyxJQUFJLENBQUMsNEJBQTRCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDN0MsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUM7UUFDbEQsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDeEIsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVEOzs7Ozs7Ozs7O09BVUc7SUFDSyw0QkFBNEIsQ0FBQyxTQUEyQjtRQUM5RCxNQUFNLEdBQUcsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQzFGLHdGQUF3RjtRQUN4RixNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDaEMsTUFBTSxDQUFDLE1BQU0sRUFBRSxZQUFZLEVBQUUsQ0FBQztZQUM5QixPQUFPO2dCQUNMLE1BQU07Z0JBQ04sUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxJQUFJLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUM1RixJQUFJLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsS0FBSyxFQUFFLElBQUksSUFBSSxLQUFLLENBQUMsVUFBVSxFQUFFO2FBQ2xFLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFaEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDdEQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDekQsSUFBSSxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUU7WUFDM0QsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQ3JELE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztZQUM3QixJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM5QixNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQy9DLE9BQU87Z0JBQ0wsRUFBRSxFQUFFLE1BQU0sQ0FBQyxJQUFJO2dCQUNmLFFBQVEsRUFBRSxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFO2dCQUM5RSxlQUFlLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRTtvQkFDL0IsTUFBTSxNQUFNLEdBQUcsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxDQUFDO29CQUNwRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDbkQsQ0FBQzthQUNGLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFFRCxxRkFBcUY7SUFDckYsZUFBZTtRQUNiLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDakMsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7UUFDdEIsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsa0JBQWtCLENBQUMsU0FBaUI7UUFDbEMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDOUMsSUFDRSxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLGVBQWUsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRTtlQUNqRSxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFDNUQsQ0FBQztZQUNELE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUNELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNoQyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFTyxrQkFBa0IsQ0FBQyxNQUFzQjtRQUMvQyx5RkFBeUY7UUFDekYsa0VBQWtFO1FBQ2xFLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUM7UUFDL0IsSUFBSSxDQUFDLGVBQWUsR0FBRyxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDakUsSUFBSSxDQUFDLG9CQUFvQixHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7UUFDeEMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFTyxvQkFBb0I7UUFDMUIsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7UUFDNUIsSUFBSSxDQUFDLG9CQUFvQixHQUFHLFNBQVMsQ0FBQztJQUN4QyxDQUFDO0lBRUQsbUZBQW1GO0lBQzNFLGtCQUFrQjtRQUN4QixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxHQUFHLGNBQWMsQ0FBQyxpQkFBaUI7ZUFDL0QsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRUQsa0VBQWtFO0lBQzFELG9CQUFvQixDQUFDLEtBQWlCO1FBQzVDLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDMUIsd0RBQXdEO1lBQ3hELElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsRUFBRSxDQUFDO2dCQUMvQiwwRUFBMEU7Z0JBQzFFLE9BQU87WUFDVCxDQUFDO1lBQ0QsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMscUJBQXFCLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwRixJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQ1QsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDeEMsT0FBTztZQUNULENBQUM7WUFDRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3BDLE9BQU87UUFDVCxDQUFDO1FBRUQsNkRBQTZEO1FBQzdELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMvQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDWixJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzFDLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLG9CQUFvQixFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsZUFBZSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDckcsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDNUIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsNkJBQTZCLENBQUMsS0FBMEM7UUFDdEUsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDNUMsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBQ0QsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUM7WUFDdkIsS0FBSyxFQUFFLElBQUksQ0FBQyxvQkFBb0I7WUFDaEMsTUFBTSxFQUFFLElBQUksQ0FBQyxlQUFlO1lBQzVCLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFO1NBQy9DLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMvQixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxpQkFBaUI7UUFDZixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ25CLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQzlCLENBQUM7YUFBTSxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzFDLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDNUIsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFDRCxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUN4QixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILG1CQUFtQixDQUFDLEtBQWE7UUFDL0IsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssR0FBRyxDQUFDLElBQUksS0FBSyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDbkcsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBQ0QsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3hCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELCtGQUErRjtJQUMvRixpQkFBaUI7UUFDZixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDdEMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQy9DLE9BQU87Z0JBQ0wsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO2dCQUNqQixLQUFLLEVBQUUsTUFBTSxFQUFFLFFBQVEsQ0FBQyxLQUFLLElBQUksSUFBSTtnQkFDckMsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLENBQUMsT0FBTyxJQUFJLElBQUk7Z0JBQ3pDLE1BQU0sRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRTthQUMzQixDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyxnQkFBZ0IsQ0FBQyxPQUF5QjtRQUNoRCwrRkFBK0Y7UUFDL0YseUVBQXlFO1FBQ3pFLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUM7UUFDaEMsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7UUFDOUIsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNuQyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLFdBQVcsQ0FBQztRQUN0RCxDQUFDO1FBQ0QsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRXJDLElBQUksUUFBUSxHQUEyQixJQUFJLENBQUM7UUFDNUMsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbEIsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7Z0JBQ3pCLFFBQVEsR0FBRyxPQUFPLENBQUM7WUFDckIsQ0FBQztpQkFBTSxJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxFQUFFLENBQUM7Z0JBQ3JDLHVGQUF1RjtnQkFDdkYseUNBQXlDO2dCQUN6QyxRQUFRLEdBQUcsS0FBSyxDQUFDO1lBQ25CLENBQUM7UUFDSCxDQUFDO1FBQ0QsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQztZQUMzQixLQUFLLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNO1lBQ2pDLFFBQVE7WUFDUixLQUFLLEVBQUUsUUFBUSxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxTQUFTO1lBQ25FLE9BQU8sRUFBRSxJQUFJLENBQUMsaUJBQWlCLEVBQUU7U0FDbEMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ssc0JBQXNCLENBQUMsT0FBeUI7UUFDdEQsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDN0IsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNuQixPQUFPO1FBQ1QsQ0FBQztRQUNELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDakQsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxLQUFLLEtBQUssRUFBRSxDQUFDO1lBQzNDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDbkMsQ0FBQztRQUNELElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDN0IsMkVBQTJFO1FBQzNFLE1BQU0sT0FBTyxHQUFHLENBQUMsTUFBMkMsRUFBRSxFQUFFLENBQzlELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRXJGLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQzFDLE1BQU0sTUFBTSxHQUFHLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRTlFLHNGQUFzRjtZQUN0RixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxNQUFNLEVBQUUsY0FBYyxDQUFDLHNCQUFzQixFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzVHLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztZQUM3QixvRUFBb0U7WUFDcEUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUMxQyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7WUFDakMsMEZBQTBGO1lBQzFGLGtDQUFrQztZQUNsQyxJQUFJLENBQUMsV0FBVyxHQUFHLEdBQUcsQ0FBQztZQUN2QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBRWhDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FDcEMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUUsY0FBYyxDQUFDLHNCQUFzQixDQUFDLEVBQUUsSUFBSSxDQUNuRixDQUFDO1lBQ0YsR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDMUIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMvQixJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxjQUFjLENBQUMsa0JBQWtCLENBQUMsQ0FBQztZQUMzRCxJQUFJLE9BQU8sS0FBSyxPQUFPLElBQUksS0FBSyxLQUFLLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNwRSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2xCLENBQUM7WUFFRCwyRkFBMkY7WUFDM0YsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2hELElBQUksT0FBTyxFQUFFLENBQUM7Z0JBQ1osT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPLEdBQUcsR0FBRyxDQUFDO1lBQ2pDLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3pCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ25HLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQztZQUNsRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2hDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLGNBQWMsQ0FBQyxhQUFhLEdBQUcsR0FBRyxDQUFDLENBQUM7WUFDN0QsSUFBSSxPQUFPLEtBQUssS0FBSyxFQUFFLENBQUM7Z0JBQ3RCLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbkIsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsZ0dBQWdHO0lBQ3hGLHFCQUFxQjtRQUMzQixDQUFDLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQVUsRUFBRSxFQUFFO1lBQ3pELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDcEMsS0FBSyxDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsRUFBRSxDQUFDO1lBQzVCLEtBQUssQ0FBQyxRQUFRLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUM7WUFDakMsS0FBSyxDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsRUFBRSxDQUFDO1FBQzlCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtZQUNqQyxNQUFNLENBQUMsUUFBUSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7UUFDOUIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNLLHFCQUFxQixDQUFDLEdBQWtCLEVBQUUsV0FBbUI7UUFDbkUsK0ZBQStGO1FBQy9GLElBQUksWUFBWSxJQUFJLEdBQUcsRUFBRSxDQUFDO1lBQ3ZCLEdBQVcsQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDLENBQUMsOEJBQThCO1FBQ2xFLENBQUM7YUFBTSxDQUFDO1lBQ0wsR0FBVyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsQ0FBQyxxQkFBcUI7UUFDckQsQ0FBQztRQUNELE1BQU0sSUFBSSxHQUFHLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FDM0IsSUFBSSxLQUFLLENBQUMsY0FBYyxDQUFDO1lBQ3ZCLEdBQUcsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsS0FBSztTQUNwRixDQUFDLENBQ0gsQ0FBQztRQUNGLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO1FBQy9CLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELDhEQUE4RDtJQUN0RCxLQUFLLENBQUMsTUFBb0I7UUFDaEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFdBQVcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUVPLFVBQVU7UUFDaEIsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUM3QixPQUFPO1FBQ1QsQ0FBQztRQUNELE1BQU0sR0FBRyxHQUFHLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUM5QixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRTtZQUN6RCxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQztZQUN4QyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUM1QixzQ0FBc0M7Z0JBQ3RDLE9BQU8sS0FBSyxDQUFDO1lBQ2YsQ0FBQztZQUNELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLFNBQVMsQ0FBQyxHQUFHLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQ2xGLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM3QyxrRkFBa0Y7WUFDbEYsTUFBTSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUMzRCxPQUFPLFFBQVEsR0FBRyxDQUFDLENBQUM7UUFDdEIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILGNBQWM7UUFDWiwwRkFBMEY7UUFDMUYsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDMUIsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbEIsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDNUIsQ0FBQztRQUNELElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3hCLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQy9DLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN2QyxDQUFDO1FBQ0QsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7UUFDdEIsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxXQUFXLENBQUM7UUFDdEQsQ0FBQztRQUNELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsZUFBZTtRQUNiLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDcEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDdkIsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQztRQUNoQyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUM5QixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUN4Qiw4RkFBOEY7UUFDOUYsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7UUFDNUIsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUM7UUFDcEQsQ0FBQztRQUNELElBQUksWUFBWSxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNuQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3ZDLENBQUM7UUFDRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDbEMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILGVBQWUsQ0FBQyxVQUFtQjtRQUNqQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNyRCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFDRCxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztRQUN2QixJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ25DLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUM7UUFDaEMsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7UUFDOUIsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ25DLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDO1FBRWxELElBQUksQ0FBQyxlQUFlLEdBQUc7WUFDckIsTUFBTSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ25GLFNBQVMsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7WUFDbEMsc0ZBQXNGO1lBQ3RGLFVBQVUsRUFBRSxVQUFVLElBQUksSUFBSSxDQUFDLDRCQUE0QixFQUFFO1NBQzlELENBQUM7UUFDRixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDOUIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCwyQkFBMkIsQ0FBQyxLQUEwQztRQUNwRSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3BCLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUNELElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDN0IsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3ZILE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELDBIQUEwSDtJQUMxSCw0QkFBNEI7UUFDMUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUM3QixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDdEMsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3JFLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQ3JCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFdBQVc7UUFDVCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDeEIsQ0FBQztJQUVELG1GQUFtRjtJQUNuRixrQkFBa0I7UUFDaEIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDO0lBQzlCLENBQUM7SUFFRCwrRkFBK0Y7SUFDdkYsZ0JBQWdCO1FBQ3RCLE1BQU0sU0FBUyxHQUFhLEVBQUUsQ0FBQztRQUMvQixLQUFLLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxLQUFLLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsS0FBSyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ2xFLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDckYsNkVBQTZFO1lBQzdFLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDbkQsQ0FBQztRQUNELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFTyxlQUFlLENBQUMsS0FBb0I7UUFDMUMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNuRSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUUvQixNQUFNLE1BQU0sR0FBRyxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQzdCLElBQUksS0FBSyxDQUFDLGNBQWMsQ0FBQztZQUN2QixHQUFHLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUM7WUFDeEQsU0FBUyxFQUFFLEtBQUs7WUFDaEIsV0FBVyxFQUFFLElBQUk7WUFDakIsc0ZBQXNGO1lBQ3RGLHNFQUFzRTtZQUN0RSxlQUFlLEVBQUUsS0FBSztTQUN2QixDQUFDLENBQ0gsQ0FBQztRQUNGLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzVCLE1BQU0sQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1FBQzFCLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzlCLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRS9CLElBQUksUUFBUSxFQUFFLENBQUM7WUFDYixJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFFL0QsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztZQUNwRSxNQUFNLEtBQUssR0FBRyxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQzVCLElBQUksS0FBSyxDQUFDLGNBQWMsQ0FBQztnQkFDdkIsR0FBRyxFQUFFLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztnQkFDL0QsU0FBUyxFQUFFLEtBQUs7Z0JBQ2hCLFdBQVcsRUFBRSxJQUFJO2dCQUNqQixlQUFlLEVBQUUsS0FBSzthQUN2QixDQUFDLENBQ0gsQ0FBQztZQUNGLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDN0QsS0FBSyxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7WUFDekIsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDN0IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3BDLENBQUM7UUFFRCxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDO1lBQzdCLE1BQU0sRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU07WUFDakMsU0FBUyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtTQUNuQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyxpQkFBaUIsQ0FDdkIsSUFBbUIsRUFBRSxFQUFpQixFQUFFLFFBQWdCLGNBQWMsQ0FBQyxhQUFhLEVBQUUsS0FBSyxHQUFHLENBQUM7UUFFL0YsTUFBTSxRQUFRLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNwQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xFLE1BQU0sUUFBUSxHQUFHLElBQUksWUFBWSxDQUFDO1lBQ2hDLEtBQUssRUFBRSxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxFQUFFO1lBQ3RDLFNBQVMsRUFBRSxLQUFLO1lBQ2hCLFNBQVMsRUFBRSxLQUFLO1lBQ2hCLFdBQVcsRUFBRSxJQUFJO1NBQ2xCLENBQUMsQ0FBQztRQUNILE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDeEQsUUFBUSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEMsTUFBTSxJQUFJLEdBQUcsSUFBSSxLQUFLLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQzNDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1FBQ3hCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELGlHQUFpRztJQUN6RiwyQkFBMkI7UUFDakMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNuQixPQUFPO1FBQ1QsQ0FBQztRQUNELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDeEQsQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQVUsRUFBRSxFQUFFO1lBQ3hGLElBQUksS0FBSyxDQUFDLFFBQVEsRUFBRSxVQUFVLEVBQUUsQ0FBQztnQkFDL0IsS0FBSyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2hELENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCwyRkFBMkY7SUFDbkYsdUJBQXVCLENBQUMsTUFBNEI7UUFDMUQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUMvRCxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3hDLElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7Z0JBQzNCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1lBQ3pDLENBQUM7WUFDRCxPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUM1QixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztZQUM5RCxJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUM7WUFDOUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDaEQsQ0FBQztRQUNELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDO1lBQzNDLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUN0QixNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7U0FDN0IsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7SUFDeEMsQ0FBQztJQUVPLHlCQUF5QixDQUFDLElBQVk7UUFDNUMsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNoRCxNQUFNLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQztRQUNuQixNQUFNLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQztRQUNwQixNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXhDLE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQztRQUNsQixPQUFPLENBQUMsU0FBUyxHQUFHLHFCQUFxQixDQUFDO1FBQzFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNwQixPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMxQixPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsS0FBSyxHQUFHLENBQUMsRUFBRSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNoRixPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNqRixPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ2xELE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsS0FBSyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDakQsT0FBTyxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ3BCLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUVmLE9BQU8sQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1FBQzlCLE9BQU8sQ0FBQyxJQUFJLEdBQUcsc0JBQXNCLENBQUM7UUFDdEMsT0FBTyxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUM7UUFDN0IsT0FBTyxDQUFDLFlBQVksR0FBRyxRQUFRLENBQUM7UUFDaEMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUUsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFFaEUsT0FBTyxJQUFJLEtBQUssQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVELHlFQUF5RTtJQUNqRSxnQkFBZ0I7UUFDdEIsQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBVSxFQUFFLEVBQUU7WUFDckQsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDaEMsS0FBSyxDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsRUFBRSxDQUFDO1lBQzVCLEtBQUssQ0FBQyxRQUFRLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUM7WUFDakMsS0FBSyxDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsRUFBRSxDQUFDO1FBQzlCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFNBQVMsQ0FBQztRQUNuQyxJQUFJLENBQUMsYUFBYSxHQUFHLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ssNEJBQTRCO1FBQ2xDLE1BQU0sTUFBTSxHQUFtQixFQUFFLENBQUM7UUFDbEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtZQUNqQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDbkIsTUFBTSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7Z0JBQ3ZCLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDdEIsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDOUMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUM7UUFDeEMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLE1BQU0sQ0FBQyxLQUFLLEVBQUUsR0FBRyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNuRSxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2hELE1BQU0sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDN0QsTUFBTSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUMvRCxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUU3RSxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDeEIsTUFBTSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDeEIsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRDs7OztPQUlHO0lBQ00saUJBQWlCLEdBQUcsSUFBSSxPQUFPLEVBQVcsQ0FBQztJQUVwRCw0RkFBNEY7SUFDNUYsaUJBQWlCLENBQUMsVUFBMEIsSUFBSTtRQUM5QyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztRQUN2QixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsT0FBTyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUM7UUFDaEMsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxXQUFXLENBQUM7UUFDdEQsQ0FBQztRQUNELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxvQkFBb0IsQ0FDbEIsS0FBMEMsRUFDMUMsU0FBcUQsSUFBSTtRQUV6RCxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3JCLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUNELElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDN0IsTUFBTSxRQUFRLEdBQUcsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDbEgsNkRBQTZEO1FBQzdELE1BQU0sTUFBTSxHQUFHLE1BQU07WUFDbkIsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLFNBQVMsRUFBRTtZQUN4SCxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDL0IsTUFBTSxTQUFTLEdBQXdCO1lBQ3JDLFFBQVEsRUFBRSxFQUFFLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxFQUFFO1lBQ3pELE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFO1lBQ2pELE9BQU8sRUFBRSxJQUFJLENBQUMsZ0JBQWdCO1NBQy9CLENBQUM7UUFDRixJQUFJLENBQUMsbUJBQW1CLEdBQUcsU0FBUyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBQzlCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbkMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDaEMsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVELHNEQUFzRDtJQUN0RCxrQkFBa0I7UUFDaEIsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDcEIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNyQyxDQUFDO1FBQ0QsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7UUFDeEIsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQztRQUNoQyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBQzlCLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2xCLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDO1FBQ3BELENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyxzQkFBc0IsQ0FBQyxLQUFpQjtRQUM5QyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzVDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNkLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1lBQzlCLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNuQyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLGFBQWEsQ0FBQztZQUN0RCxPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsV0FBVyxDQUFDO1FBQ3BELElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUMzQix3RkFBd0Y7WUFDeEYseUNBQXlDO1lBQ3pDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsUUFBUTtnQkFDbkMsQ0FBQyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FDMUIsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxjQUFjLENBQUMsc0JBQXNCLENBQUMsRUFBRSxHQUFHLENBQ3ZHO2dCQUNELENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQ2hCLElBQUksS0FBSyxDQUFDLGNBQWMsQ0FBQztvQkFDdkIsR0FBRyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUM7b0JBQ3JDLFNBQVMsRUFBRSxLQUFLO29CQUNoQixXQUFXLEVBQUUsSUFBSTtvQkFDakIsZUFBZSxFQUFFLEtBQUs7aUJBQ3ZCLENBQUMsQ0FDSCxDQUFDO1lBQ0osSUFBSSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsR0FBRyxHQUFHLENBQUM7WUFDeEMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxPQUFPLEdBQUcsR0FBRyxDQUFDO1lBQzdDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQ3pDLElBQUksQ0FBQyxhQUFhLENBQ2hCLElBQUksQ0FBQyxnQkFBZ0IsRUFDckIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUNqRixDQUFDO1FBQ0osQ0FBQztRQUNELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7T0FhRztJQUNLLGNBQWMsQ0FBQyxLQUFpQjtRQUN0QyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDdEQsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNyQixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNwRCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksS0FBSyxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDaEQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUN0RCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxLQUFLLENBQUMsaUJBQWlCLENBQUM7Z0JBQ25ELFlBQVksRUFBRSxLQUFLLENBQUMsZ0JBQWdCO2FBQ3JDLENBQUMsQ0FBQztRQUNMLENBQUM7UUFFRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQzlELE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztRQUNwQyxNQUFNLENBQUMsR0FBRyxLQUFLLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7UUFDbkMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUN4RCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFRCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN0RCw0RkFBNEY7UUFDNUYsb0ZBQW9GO1FBQ3BGLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRS9FLGdHQUFnRztRQUNoRywrRkFBK0Y7UUFDL0YsOEZBQThGO1FBQzlGLDBEQUEwRDtRQUMxRCxNQUFNLGtCQUFrQixHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLElBQUksS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDMUUsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3pELE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDdkQsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQztRQUVqRCxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7UUFDN0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUM7UUFDckQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMvQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRWxELElBQUksQ0FBQyxRQUFRLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRWxGLElBQUksQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLGtCQUFrQixFQUFFLGtCQUFrQixDQUFDLENBQUM7UUFDcEUsSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7UUFDbkMsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLEdBQUcsa0JBQWtCLENBQUM7UUFFM0MsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDcEMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7WUFDckQsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQsZ0dBQWdHO1FBQ2hHLGlHQUFpRztRQUNqRywrRkFBK0Y7UUFDL0YsbUZBQW1GO1FBQ25GLE1BQU0sU0FBUyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFDNUIsTUFBTSxLQUFLLEdBQ1QsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsU0FBUyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7WUFDekMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsU0FBUyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztZQUNuQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxTQUFTLEdBQUcsR0FBRztZQUMzQixDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxTQUFTLENBQUM7UUFFeEIsaUdBQWlHO1FBQ2pHLCtGQUErRjtRQUMvRiw2RkFBNkY7UUFDN0YsNERBQTREO1FBQzVELE1BQU0sS0FBSyxHQUFHLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNoRixJQUFJLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztRQUM3QyxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFTyxzQkFBc0I7UUFDNUIsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQzNCLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDNUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLENBQUM7UUFDOUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUN6QyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsU0FBUyxDQUFDO0lBQ3BDLENBQUM7SUFFRCxpR0FBaUc7SUFDakcsZ0JBQWdCLENBQUMsU0FBaUIsRUFBRSxPQUFnQjtRQUNsRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM5QyxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ1gsTUFBTSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDM0IsQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILGtCQUFrQixDQUFDLEtBQXVCO1FBQ3hDLElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO1FBQzdCLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUNyRSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRUQsOEVBQThFO0lBQzlFLFlBQVksQ0FBQyxJQUFhO1FBQ3hCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDakMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN2QixJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbEMsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRUQsMkZBQTJGO0lBQzNGLGlCQUFpQixDQUFDLFNBQXdCO1FBQ3hDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxTQUFTLENBQUM7UUFDbEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtZQUNqQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNsQyxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFRCx1REFBdUQ7SUFDdkQsT0FBTztRQVFMLE1BQU0sVUFBVSxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLENBQUM7UUFDekQsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNwRCxFQUFFLEVBQUUsTUFBTSxDQUFDLElBQUk7WUFDZixLQUFLLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLElBQUksSUFBSTtZQUNwQyxPQUFPLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLElBQUksSUFBSTtZQUN4QyxPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU87WUFDdkIsWUFBWSxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDO1NBQ3JDLENBQUMsQ0FBQyxDQUFDO0lBQ04sQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsdUJBQXVCO1FBQ3JCLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDOUMsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBQ0QsTUFBTSxRQUFRLEdBQUcsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDckMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDaEQsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0YsTUFBTSxLQUFLLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQztRQUNoQyxJQUFJLEtBQUssS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNoQixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFDRCw4REFBOEQ7UUFDOUQsT0FBTyxRQUFRLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztJQUN2RSxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssU0FBUyxDQUFDLE1BQXNCO1FBQ3RDLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxLQUFLLE9BQU8sSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQztZQUM3RSxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWE7WUFDcEIsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDbEIsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLE1BQU0sRUFBRSxDQUFDO1lBQzdCLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDckIsQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNLLHFCQUFxQjtRQUMzQixNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDcEUsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQ3JELE1BQU0sQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLFFBQVE7ZUFDNUIsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEtBQUssT0FBTztlQUNqQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDO2VBQzVCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQsa0ZBQWtGO0lBQ2xGLDRCQUE0QjtRQUMxQixPQUFPLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLE1BQU0sQ0FBQztJQUM3QyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxtQkFBbUI7UUFDakIsT0FBTyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUN6RixDQUFDO0lBRUQseURBQXlEO0lBQ2pELGNBQWMsQ0FBQyxNQUFzQjtRQUMzQyxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQztRQUMvQyxPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUNwRSxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyxrQkFBa0IsQ0FBQyxNQUFzQjtRQUMvQyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsZUFBZSxLQUFLLElBQUk7ZUFDNUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM1RCxNQUFNLENBQUMsT0FBTyxHQUFHLFdBQVcsSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ssa0JBQWtCLENBQUMsTUFBc0I7UUFDL0MsK0NBQStDO1FBQy9DLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQ2hDLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUNELCtGQUErRjtRQUMvRix1REFBdUQ7UUFDdkQsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssS0FBSyxPQUFPLEVBQUUsQ0FBQztZQUN0QyxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFDRCw0RkFBNEY7UUFDNUYsaUZBQWlGO1FBQ2pGLElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztZQUNuRCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVELGdHQUFnRztJQUN4RixTQUFTLENBQUMsTUFBc0I7UUFDdEMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN2Qix5QkFBeUI7WUFDekIsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBQ0QsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQzlDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN0QixpR0FBaUc7UUFDakcsTUFBTSxLQUFLLEdBQUcsY0FBYyxDQUFDLGVBQWUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ3JFLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDeEYsQ0FBQztJQUVELHlGQUF5RjtJQUNqRixvQkFBb0I7UUFDMUIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7SUFFTyxVQUFVLENBQUMsQ0FBUyxFQUFFLENBQVMsRUFBRSxDQUFTO1FBQ2hELE1BQU0sSUFBSSxHQUFHLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQztRQUM5QyxNQUFNLEdBQUcsR0FBRyxjQUFjLENBQUMsZ0JBQWdCLENBQUM7UUFDNUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNuRSxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQ1osQ0FBQztRQUNELE9BQU8sQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNLLGdCQUFnQixDQUFDLE1BQXNCLEVBQUUsR0FBZTtRQUM5RCxNQUFNLElBQUksR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDOUMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pELElBQUksQ0FBQyxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1lBQ3pCLE9BQU87UUFDVCxDQUFDO1FBQ0QsOEZBQThGO1FBQzlGLDRDQUE0QztRQUM1QyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxPQUFPLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDM0MsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUMvQixNQUFNLEtBQUssR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO1FBQ2hDLE1BQU0sSUFBSSxHQUFHLENBQUMsS0FBb0IsRUFBRSxFQUFFO1lBQ3BDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQ3pCLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFDdkMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUN2QyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQ3hDLENBQUM7WUFDRixJQUFJLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDYixLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2pCLENBQUM7UUFDSCxDQUFDLENBQUM7UUFFRixJQUFJLGFBQWEsR0FBRyxDQUFDLENBQUM7UUFDdEIsTUFBTSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQy9CLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFVLEVBQUUsRUFBRTtZQUM3QixNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxRQUFRLEVBQUUsVUFBVSxFQUFFLFFBQVEsQ0FBQztZQUN0RSxJQUFJLFFBQVEsRUFBRSxDQUFDO2dCQUNiLGFBQWEsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDNUYsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0gsNEZBQTRGO1FBQzVGLDZDQUE2QztRQUM3QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBRS9ELE1BQU0sQ0FBQyxHQUFHLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzlCLE1BQU0sQ0FBQyxHQUFHLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzlCLE1BQU0sQ0FBQyxHQUFHLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzlCLE1BQU0sS0FBSyxHQUFHLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2xDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFVLEVBQUUsRUFBRTtZQUM3QixNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxRQUFRLEVBQUUsVUFBVSxFQUFFLFFBQVEsQ0FBQztZQUN0RSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ2QsT0FBTztZQUNULENBQUM7WUFDRCxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztZQUNuQyxNQUFNLEtBQUssR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN6RCxLQUFLLElBQUksUUFBUSxHQUFHLENBQUMsRUFBRSxRQUFRLEdBQUcsS0FBSyxFQUFFLFFBQVEsSUFBSSxNQUFNLEVBQUUsQ0FBQztnQkFDNUQsTUFBTSxNQUFNLEdBQUcsUUFBUSxHQUFHLENBQUMsQ0FBQztnQkFDNUIsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQ3JHLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQzdHLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQzdHLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLENB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YixNQUFNOzs0RkFFUCxjQUFjO2tCQUgxQixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIE5nWm9uZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0ICogYXMgVEhSRUUgZnJvbSAndGhyZWUnO1xuaW1wb3J0IHsgT3JiaXRDb250cm9scyB9IGZyb20gJ3RocmVlL2V4YW1wbGVzL2pzbS9jb250cm9scy9PcmJpdENvbnRyb2xzJztcbmltcG9ydCB7IE9CSkxvYWRlciB9IGZyb20gJ3RocmVlL2V4YW1wbGVzL2pzbS9sb2FkZXJzL09CSkxvYWRlcic7XG5pbXBvcnQgeyBNVExMb2FkZXIgfSBmcm9tICd0aHJlZS9leGFtcGxlcy9qc20vbG9hZGVycy9NVExMb2FkZXInO1xuaW1wb3J0IHsgR0xURkxvYWRlciB9IGZyb20gJ3RocmVlL2V4YW1wbGVzL2pzbS9sb2FkZXJzL0dMVEZMb2FkZXInO1xuaW1wb3J0IHsgS1RYMkxvYWRlciB9IGZyb20gJ3RocmVlL2V4YW1wbGVzL2pzbS9sb2FkZXJzL0tUWDJMb2FkZXInO1xuaW1wb3J0IHsgTWVzaG9wdERlY29kZXIgfSBmcm9tICd0aHJlZS9leGFtcGxlcy9qc20vbGlicy9tZXNob3B0X2RlY29kZXIubW9kdWxlLmpzJztcbmltcG9ydCB7IExpbmUyIH0gZnJvbSAndGhyZWUvZXhhbXBsZXMvanNtL2xpbmVzL0xpbmUyJztcbmltcG9ydCB7IExpbmVHZW9tZXRyeSB9IGZyb20gJ3RocmVlL2V4YW1wbGVzL2pzbS9saW5lcy9MaW5lR2VvbWV0cnknO1xuaW1wb3J0IHsgTGluZU1hdGVyaWFsIH0gZnJvbSAndGhyZWUvZXhhbXBsZXMvanNtL2xpbmVzL0xpbmVNYXRlcmlhbCc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBUaHJlZUpzQWxpZ25tZW50LCBUaHJlZUpzTW9kZWxVcCB9IGZyb20gJy4uL2hlbHBlcnMuc2VydmljZSc7XG5pbXBvcnQgeyBQb2lUeXBlIH0gZnJvbSAnLi4vdHlwZXMuc2VydmljZSc7XG5cbi8qKlxuICogQSB0YWcgdG8gZHJhdyBpbiB0aGUgVGhyZWUuanMgc2NlbmUsIG1pcnJvcmluZyBhIE1hdHRlcnRhZy5cbiAqXG4gKiBQb3NpdGlvbnMgYXJlIGluIHRoZSBtb2RlbCdzIG93biBjb29yZGluYXRlIHNwYWNlIC0gdGhlIHNhbWUgbnVtYmVycyBzdG9yZWQgaW4gUE9JLmNvb3JkaW5hdGUgLVxuICogbm90IHNjZW5lIHNwYWNlLiBUaGUgc2VydmljZSByZXBhcmVudHMgdGFncyB1bmRlciB0aGUgbW9kZWwgc28gdGhleSBpbmhlcml0IHRoZSBjZW50ZXJpbmcgYW5kXG4gKiBzY2FsaW5nIGFwcGxpZWQgYXQgbG9hZCwgd2hpY2ggbWVhbnMgY2FsbGVycyBuZXZlciBkZWFsIHdpdGggdGhhdCB0cmFuc2Zvcm0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGhyZWVKc1RhZyB7XG4gIC8qKiBUaGUgdGFnZ2VkIGVsZW1lbnQncyBpZCAoUE9JLmVsZW1lbnRJRCksIHVzZWQgdG8gdXBkYXRlIG9yIHJlbW92ZSB0aGUgdGFnIGxhdGVyLiAqL1xuICBpZDogc3RyaW5nO1xuICBwb3NpdGlvbjogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgejogbnVtYmVyIH07XG4gIC8qKiBEcml2ZXMgYm90aCB0aGUgY2xpY2sgcm91dGUgYW5kIHR5cGUgZmlsdGVyaW5nLCBzbyBpdCB0cmF2ZWxzIHdpdGggdGhlIHRhZy4gKi9cbiAgcG9pVHlwZT86IFBvaVR5cGUgfCBudWxsO1xuICAvKiogU2hvd24gb24gaG92ZXIuIEEgbWFya2VyIHdpdGggbm8gaWRlbnRpdHkgaXMganVzdCBhIGRvdCBvbiBhIHdhbGwuICovXG4gIGxhYmVsPzogc3RyaW5nIHwgbnVsbDtcbiAgLyoqIFRoZSBUaHJlZS5qcyBjYXB0dXJlIHRoaXMgdGFnIHdhcyBwbGFjZWQgaW4sIHdoZW4gaXQgd2FzIHBsYWNlZCBpbiBvbmUuICovXG4gIG9yaWdpbkNhcHR1cmVJRD86IHN0cmluZyB8IG51bGw7XG4gIC8qKlxuICAgKiAnbW9kZWwnIHdoZW4gdGhlIHBvc2l0aW9uIGlzIGluIHRoZSBtb2RlbCdzIG93biBjb29yZGluYXRlcyByYXRoZXIgdGhhbiB0aGUgc3BhY2UgdGFncyBzaGFyZTpcbiAgICogYSB0YWcgcGxhY2VkIGluIGEgbW9kZWwgYmVmb3JlIGl0IHdhcyBjYWxpYnJhdGVkLiBPbmx5IG1lYW5pbmdmdWwgaW4gdGhlIG1vZGVsIGl0IHdhcyBwbGFjZWQgaW4uXG4gICAqL1xuICBmcmFtZT86ICdtb2RlbCcgfCBudWxsO1xuICAvKiogSWNvbiBkcmF3biBvbiB0aGUgdGFnLiBGYWxscyBiYWNrIHRvIGEgcGxhaW4gZGlzYyB3aGVuIGFic2VudCBvciBpdCBmYWlscyB0byBsb2FkLiAqL1xuICBpY29uVXJsPzogc3RyaW5nIHwgbnVsbDtcbiAgLyoqIFRpbnQgZm9yIHRoZSBmYWxsYmFjayBkaXNjLCBhcyBhIENTUyBjb2xvdXIuICovXG4gIGNvbG9yPzogc3RyaW5nO1xuICAvKipcbiAgICogV2hpY2ggd2F5IHRoZSBzdXJmYWNlIHRoZSB0YWcgaXMgb24gZmFjZXMsIGluIHRoZSB0YWcncyBmcmFtZTogTWF0dGVycG9ydCdzIHN0ZW0sIHdoaWNoIHRoZVxuICAgKiBzcGxhdCB2aWV3ZXIgZHJhd3MgdGhlIHRhZyBhdCB0aGUgZW5kIG9mLlxuICAgKi9cbiAgbm9ybWFsPzogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgejogbnVtYmVyIH0gfCBudWxsO1xufVxuXG4vKiogQSB0YWcgYXMgYSB2aWV3ZXIgZHJhd2luZyB0aGUgc2NlbmUgZWxzZXdoZXJlIG5lZWRzIGl0IC0gdGhlIHNwbGF0IHZpZXdlciwgaW4gaXRzIGlmcmFtZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGhyZWVKc1RhZ1NuYXBzaG90IHtcbiAgaWQ6IHN0cmluZztcbiAgcG9zaXRpb246IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHo6IG51bWJlciB9O1xuICBsYWJlbDogc3RyaW5nIHwgbnVsbDtcbiAgcG9pVHlwZTogUG9pVHlwZSB8IG51bGw7XG4gIGljb25Vcmw6IHN0cmluZyB8IG51bGw7XG4gIC8qKiBJbiB0aGUgbW9kZWwncyBvd24gY29vcmRpbmF0ZXMsIHNvIG5vdCBtb3ZlZCBieSB0aGUgY2FsaWJyYXRpb24uICovXG4gIGluTW9kZWxGcmFtZTogYm9vbGVhbjtcbiAgLyoqIFdoaWNoIHdheSBpdHMgc3VyZmFjZSBmYWNlcywgaW4gdGhlIHNhbWUgZnJhbWUgYXMgaXRzIHBvc2l0aW9uOyBudWxsIHdoZW4gbm90IGtub3duLiAqL1xuICBub3JtYWw6IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHo6IG51bWJlciB9IHwgbnVsbDtcbn1cblxuLyoqIFdoYXQgYSBjbGljayBvbiBhIHRhZyByZXBvcnRzOiBlbm91Z2ggdG8gcm91dGUgdG8gdGhlIGVsZW1lbnQncyBkZXRhaWwgcGFnZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGhyZWVKc1RhZ0NsaWNrIHtcbiAgZWxlbWVudElkOiBzdHJpbmc7XG4gIHBvaVR5cGU6IFBvaVR5cGUgfCBudWxsO1xufVxuXG4vKipcbiAqIEEgc3BvdCBwaWNrZWQgb24gdGhlIG1vZGVsIGZvciBhIG5ldyB0YWcuXG4gKlxuICogQm90aCB2ZWN0b3JzIGFyZSBpbiB0aGUgbW9kZWwncyBvd24gY29vcmRpbmF0ZSBzcGFjZSwgd2hpY2ggaXMgd2hhdCBQT0kuY29vcmRpbmF0ZSBzdG9yZXMuIFNjZW5lXG4gKiBjb29yZGluYXRlcyBkZWxpYmVyYXRlbHkgbmV2ZXIgbGVhdmUgdGhpcyBzZXJ2aWNlOiB0aGUgbW9kZWwgaXMgc2NhbGVkIHRvIGEgZml4ZWQgc2l6ZSBvbiBsb2FkLCBzb1xuICogYSBzY2VuZS1zcGFjZSBwb3NpdGlvbiB3b3VsZCBzaWxlbnRseSBtZWFuIHNvbWV3aGVyZSBlbHNlIHRoZSBtb21lbnQgdGhlIC5nbGIgaXMgcmUtZXhwb3J0ZWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGhyZWVKc1RhZ1BsYWNlbWVudCB7XG4gIHBvc2l0aW9uOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB6OiBudW1iZXIgfTtcbiAgLyoqIFN1cmZhY2Ugbm9ybWFsIGF0IHRoZSBwaWNrZWQgcG9pbnQgLSBNYXR0ZXJwb3J0IHN0b3JlcyB0aGUgc2FtZSB0aGluZyBpbiBQT0kubWV0YWRhdGEuICovXG4gIG5vcm1hbDogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgejogbnVtYmVyIH07XG4gIC8qKiBXaGF0IHRoZSBwbGFjZW1lbnQgd2FzIGFybWVkIGZvciwgc28gdGhlIGNhbGxlciBrbm93cyB3aGljaCBjcmVhdGlvbiBmb3JtIHRvIG9wZW4uICovXG4gIHBvaVR5cGU/OiBQb2lUeXBlIHwgbnVsbDtcbn1cblxuLyoqIE9uZSB0YWcgc2VlbiBpbiBib3RoIHNwYWNlczogd2hlcmUgaXQgaXMgc3RvcmVkLCBhbmQgd2hlcmUgaXQgcmVhbGx5IHNpdHMgb24gdGhlIG1vZGVsLiAqL1xuLyoqIEEgZGlzdGFuY2UgbWVhc3VyZWQgb24gdGhlIG1vZGVsOiBpdHMgcG9pbnRzLCBlYWNoIHNlZ21lbnQncyBsZW5ndGgsIGFuZCBhIHBpY3R1cmUgb2YgaXQuICovXG5leHBvcnQgaW50ZXJmYWNlIFRocmVlSnNNZWFzdXJlbWVudCB7XG4gIC8qKiBJbiB0aGUgZnJhbWUgdGFnIGNvb3JkaW5hdGVzIGFyZSBzdG9yZWQgaW4sIHNvIHRoZSBsYXN0IG9uZSBjYW4gYmUgc2F2ZWQgYXMgdGhlIFBPSS4gKi9cbiAgcG9pbnRzOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB6OiBudW1iZXIgfVtdO1xuICAvKiogTWV0cmVzIGJldHdlZW4gY29uc2VjdXRpdmUgcG9pbnRzLCByb3VuZGVkIGxpa2UgTWF0dGVycG9ydCdzIG1lYXN1cmVtZW50cyBhcmUuICovXG4gIGRpc3RhbmNlczogbnVtYmVyW107XG4gIC8qKiBKUEVHIGRhdGEgVVJJIG9mIHRoZSBzY2VuZSB3aXRoIHRoZSBtZWFzdXJlbWVudCBkcmF3biBvbiBpdC4gKi9cbiAgc2NyZWVuc2hvdDogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgdGFnIHBsYWNlZCBpbiB0aGlzIG1vZGVsIHdob3NlIHN0b3JlZCBjb29yZGluYXRlcyBoYWQgdG8gY2hhbmdlIGZvciBpdCB0byBzdGF5IHdoZXJlIGl0IGlzLFxuICogYmVjYXVzZSB0aGUgY2FsaWJyYXRpb24gaXQgaXMgZHJhd24gdW5kZXIgY2hhbmdlZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUaHJlZUpzUmViYXNlZFRhZyB7XG4gIGlkOiBzdHJpbmc7XG4gIC8qKiBJdHMgY29vcmRpbmF0ZXMgaW4gdGhlIHNwYWNlIHRhZ3Mgc2hhcmUsIHVuZGVyIHRoZSBuZXcgY2FsaWJyYXRpb24uICovXG4gIHBvc2l0aW9uOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB6OiBudW1iZXIgfTtcbiAgLyoqIFR1cm5zIGEgZGlyZWN0aW9uIHN0b3JlZCB3aXRoIHRoZSB0YWcgLSBpdHMgc3VyZmFjZSBub3JtYWwgLSB0aGUgc2FtZSB3YXkuICovXG4gIHJvdGF0ZURpcmVjdGlvbjogKGRpcmVjdGlvbjogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgejogbnVtYmVyIH0pID0+IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHo6IG51bWJlciB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRocmVlSnNBbGlnbm1lbnRQYWlyIHtcbiAgLyoqIFRoZSB0YWcgdGhlIHBhaXIgd2FzIG1hZGUgZnJvbSwgd2hlbiBpdCBjYW1lIGZyb20gb25lLiAqL1xuICB0YWdJZD86IHN0cmluZztcbiAgc291cmNlOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB6OiBudW1iZXIgfTtcbiAgdGFyZ2V0OiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB6OiBudW1iZXIgfTtcbn1cblxuLyoqIEEgdGFnIGFscmVhZHkgbWF0Y2hlZCBpbiB0aGUgY2FsaWJyYXRpb24gdW5kZXIgd2F5LCBhcyB0aGUgcGFuZWwgbGlzdHMgaXQuICovXG5leHBvcnQgaW50ZXJmYWNlIFRocmVlSnNBbGlnbm1lbnRNYXRjaCB7XG4gIHRhZ0lkOiBzdHJpbmc7XG4gIGxhYmVsOiBzdHJpbmcgfCBudWxsO1xuICBwb2lUeXBlOiBQb2lUeXBlIHwgbnVsbDtcbiAgLyoqIFdoZXJlIGl0IHdhcyBzYWlkIHRvIHJlYWxseSBiZSwgaW4gdGhlIG1vZGVsJ3Mgb3duIGNvb3JkaW5hdGVzOiBmb3IgYW5vdGhlciB2aWV3ZXIgdG8gZHJhdyBpdHMgcGluLiAqL1xuICB0YXJnZXQ6IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHo6IG51bWJlciB9O1xufVxuXG4vKiogV2hlcmUgYSBjYWxpYnJhdGlvbiB1bmRlciB3YXkgaGFzIGdvdCB0bywgZm9yIHRoZSBwYW5lbCB0aGF0IGRyaXZlcyBpdC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGhyZWVKc0FsaWdubWVudFByb2dyZXNzIHtcbiAgcGFpcnM6IG51bWJlcjtcbiAgLyoqIFdoYXQgdGhlIG5leHQgY2xpY2sgaXMgZXhwZWN0ZWQgdG8gYmUsIG9yIG51bGwgd2hlbiB0aGVyZSBpcyBub3RoaW5nIGxlZnQgdG8gY2xpY2suICovXG4gIGF3YWl0aW5nOiAndGFnJyB8ICdwb2ludCcgfCBudWxsO1xuICAvKiogVGhlIHRhZyB3aG9zZSBwbGFjZSBvbiB0aGUgbW9kZWwgaXMgYmVpbmcgYXNrZWQgZm9yLCB3aGlsZSBgYXdhaXRpbmdgIGlzICdwb2ludCcuICovXG4gIHRhZ0lkPzogc3RyaW5nO1xuICAvKiogVGhlIHRhZ3MgbWF0Y2hlZCBzbyBmYXIsIGluIHRoZSBvcmRlciB0aGV5IHdlcmUgbWF0Y2hlZCAtIHRoZSBvcmRlciB0aGV5IGFyZSBudW1iZXJlZCBpbi4gKi9cbiAgbWF0Y2hlZDogVGhyZWVKc0FsaWdubWVudE1hdGNoW107XG59XG5cbi8qKlxuICogQnVpbGRzIGFuIG9ydGhvbm9ybWFsIGZyYW1lIGZyb20gdGhyZWUgcG9pbnRzLCBvciBudWxsIHdoZW4gdGhleSBhcmUgKG5lYXJseSkgY29sbGluZWFyLlxuICpcbiAqIFRocmVlIHBvaW50cyBkZWZpbmUgYSBwbGFuZSwgYW5kIGEgcGxhbmUgcGx1cyBhbiBvcmlnaW4gZGVmaW5lcyBhbiBvcmllbnRhdGlvbi4gQ29sbGluZWFyIHBvaW50c1xuICogZG8gbm90OiB0aGV5IGxlYXZlIHRoZSByb3RhdGlvbiBhYm91dCB0aGVpciBjb21tb24gbGluZSB1bmRldGVybWluZWQsIHdoaWNoIGlzIHdoeSB0aGUgY2FsbGVyIGhhc1xuICogdG8gcmVqZWN0IHRoZW0gcmF0aGVyIHRoYW4gcHJvZHVjZSBhIGNvbmZpZGVudCB3cm9uZyBhbnN3ZXIuXG4gKi9cbmZ1bmN0aW9uIGZyYW1lRnJvbVBvaW50cyhhOiBUSFJFRS5WZWN0b3IzLCBiOiBUSFJFRS5WZWN0b3IzLCBjOiBUSFJFRS5WZWN0b3IzKTogVEhSRUUuTWF0cml4NCB8IG51bGwge1xuICBjb25zdCBlMSA9IGIuY2xvbmUoKS5zdWIoYSk7XG4gIGlmIChlMS5sZW5ndGhTcSgpIDwgMWUtMTIpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBlMS5ub3JtYWxpemUoKTtcblxuICBjb25zdCB0b0MgPSBjLmNsb25lKCkuc3ViKGEpO1xuICBjb25zdCBlMiA9IHRvQy5jbG9uZSgpLnN1YihlMS5jbG9uZSgpLm11bHRpcGx5U2NhbGFyKHRvQy5kb3QoZTEpKSk7XG4gIGlmIChlMi5sZW5ndGhTcSgpIDwgMWUtMTIpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBlMi5ub3JtYWxpemUoKTtcblxuICByZXR1cm4gbmV3IFRIUkVFLk1hdHJpeDQoKS5tYWtlQmFzaXMoZTEsIGUyLCBlMS5jbG9uZSgpLmNyb3NzKGUyKSk7XG59XG5cbi8qKlxuICogU29sdmVzIHRoZSB0cmFuc2Zvcm0gdGhhdCBtYXBzIHN0b3JlZCB0YWcgY29vcmRpbmF0ZXMgb250byB0aGUgbG9hZGVkIG1vZGVsLCBmcm9tIGFzIG1hbnkgbWF0Y2hlZFxuICogdGFncyBhcyB0aGVyZSBhcmUgLSB1cCB0byB0aHJlZS5cbiAqXG4gKiBUaHJlZSBwYWlycyBwaW4gZG93biBldmVyeXRoaW5nOiBwb3NpdGlvbiwgb3JpZW50YXRpb24gYW5kIHNjYWxlLiBBIG1vZGVsIHRoYXQgc2hhcmVzIG9ubHkgYVxuICogY29ybmVyIHdpdGggdGhlIHRhZ3MnIHNwYWNlIG1heSBub3QgaGF2ZSB0aHJlZSB0YWdzIHRvIG9mZmVyLCBzbyBmZXdlciBhcmUgYWNjZXB0ZWQsIGVhY2hcbiAqIHNldHRsaW5nIHdoYXQgaXQgY2FuIGFuZCBhc3N1bWluZyB0aGUgcmVzdDpcbiAqXG4gKiAgLSBUd28gcGFpcnM6IHBvc2l0aW9uLCBoZWFkaW5nIGFuZCBzY2FsZS4gVGhlIG9uZSB0aGluZyB0d28gcG9pbnRzIGNhbm5vdCBzYXkgaXMgaG93IHRoZSBtb2RlbFxuICogICAgaXMgdGlsdGVkLCBzbyBib3RoIHNwYWNlcyBhcmUgdGFrZW4gdG8gYWdyZWUgb24gd2hpY2ggd2F5IGlzIHVwLlxuICogIC0gT25lIHBhaXI6IHBvc2l0aW9uIG9ubHkuIEhlYWRpbmcgYW5kIHNjYWxlIGFyZSB0YWtlbiB0byBtYXRjaCBhbHJlYWR5LlxuICpcbiAqIGB0YXJnZXRVcGAgaXMgdGhlIG1vZGVsJ3MgdmVydGljYWwgYXhpcywgd2hpY2ggdGhlIHRhZ3MnIG93biB2ZXJ0aWNhbCAoK1kpIGlzIG1hdGNoZWQgdG8gaW4gdGhvc2VcbiAqIHR3byBjYXNlcy4gUmV0dXJucyBudWxsIHdoZW4gdGhlIHBvaW50cyBjYW5ub3QgYW5zd2VyIHRoZSBxdWVzdGlvbiBhc2tlZCBvZiB0aGVtIC0gY29sbGluZWFyIGZvclxuICogdGhyZWUsIG9uZSBhYm92ZSB0aGUgb3RoZXIgZm9yIHR3byAtIGJlY2F1c2UgYSB3cm9uZyBjYWxpYnJhdGlvbiBhcHBsaWVkIHNpbGVudGx5IGlzIHdvcnNlIHRoYW5cbiAqIG5vbmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzb2x2ZVRocmVlSnNBbGlnbm1lbnQoXG4gIHBhaXJzOiBUaHJlZUpzQWxpZ25tZW50UGFpcltdLFxuICB0YXJnZXRVcDogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgejogbnVtYmVyIH0gPSB7IHg6IDAsIHk6IDEsIHo6IDAgfSxcbik6IFRocmVlSnNBbGlnbm1lbnQgfCBudWxsIHtcbiAgaWYgKCFwYWlycyB8fCBwYWlycy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBpZiAocGFpcnMubGVuZ3RoIDwgMykge1xuICAgIHJldHVybiBzb2x2ZVJlZHVjZWRBbGlnbm1lbnQocGFpcnMsIG5ldyBUSFJFRS5WZWN0b3IzKHRhcmdldFVwLngsIHRhcmdldFVwLnksIHRhcmdldFVwLnopLm5vcm1hbGl6ZSgpKTtcbiAgfVxuXG4gIGNvbnN0IHNvdXJjZXMgPSBwYWlycy5zbGljZSgwLCAzKS5tYXAoKHBhaXIpID0+IG5ldyBUSFJFRS5WZWN0b3IzKHBhaXIuc291cmNlLngsIHBhaXIuc291cmNlLnksIHBhaXIuc291cmNlLnopKTtcbiAgY29uc3QgdGFyZ2V0cyA9IHBhaXJzLnNsaWNlKDAsIDMpLm1hcCgocGFpcikgPT4gbmV3IFRIUkVFLlZlY3RvcjMocGFpci50YXJnZXQueCwgcGFpci50YXJnZXQueSwgcGFpci50YXJnZXQueikpO1xuXG4gIGNvbnN0IHNvdXJjZUZyYW1lID0gZnJhbWVGcm9tUG9pbnRzKHNvdXJjZXNbMF0sIHNvdXJjZXNbMV0sIHNvdXJjZXNbMl0pO1xuICBjb25zdCB0YXJnZXRGcmFtZSA9IGZyYW1lRnJvbVBvaW50cyh0YXJnZXRzWzBdLCB0YXJnZXRzWzFdLCB0YXJnZXRzWzJdKTtcbiAgaWYgKCFzb3VyY2VGcmFtZSB8fCAhdGFyZ2V0RnJhbWUpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vIEEgcm90YXRpb24ncyBpbnZlcnNlIGlzIGl0cyB0cmFuc3Bvc2UsIHNvIHRoaXMgaXMgdGhlIHJvdGF0aW9uIGNhcnJ5aW5nIG9uZSBmcmFtZSBvbnRvIHRoZSBvdGhlci5cbiAgY29uc3Qgcm90YXRpb24gPSB0YXJnZXRGcmFtZS5tdWx0aXBseShzb3VyY2VGcmFtZS5jbG9uZSgpLnRyYW5zcG9zZSgpKTtcblxuICAvLyBTY2FsZSBmcm9tIGhvdyBmYXIgYXBhcnQgdGhlIHBvaW50cyBhcmUgaW4gZWFjaCBzcGFjZSwgYXZlcmFnZWQgb3ZlciB0aGUgdGhyZWUgZWRnZXMgc28gYSBzaW5nbGVcbiAgLy8gc2xvcHB5IGNsaWNrIGRvZXMgbm90IHNldCBpdCBvbiBpdHMgb3duLlxuICBjb25zdCBlZGdlcyA9IFtbMCwgMV0sIFsxLCAyXSwgWzAsIDJdXTtcbiAgbGV0IHJhdGlvU3VtID0gMDtcbiAgbGV0IHJhdGlvQ291bnQgPSAwO1xuICBmb3IgKGNvbnN0IFtpLCBqXSBvZiBlZGdlcykge1xuICAgIGNvbnN0IHNvdXJjZUxlbmd0aCA9IHNvdXJjZXNbaV0uZGlzdGFuY2VUbyhzb3VyY2VzW2pdKTtcbiAgICBjb25zdCB0YXJnZXRMZW5ndGggPSB0YXJnZXRzW2ldLmRpc3RhbmNlVG8odGFyZ2V0c1tqXSk7XG4gICAgaWYgKHNvdXJjZUxlbmd0aCA+IDFlLTkpIHtcbiAgICAgIHJhdGlvU3VtICs9IHRhcmdldExlbmd0aCAvIHNvdXJjZUxlbmd0aDtcbiAgICAgIHJhdGlvQ291bnQgKz0gMTtcbiAgICB9XG4gIH1cbiAgaWYgKHJhdGlvQ291bnQgPT09IDApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBjb25zdCBzY2FsZSA9IHJhdGlvU3VtIC8gcmF0aW9Db3VudDtcblxuICAvLyBUaGUgZ3JvdXAgYXBwbGllcyBwb3NpdGlvbiwgdGhlbiByb3RhdGlvbiwgdGhlbiBzY2FsZSwgc28gYSBwb2ludCBsYW5kcyBhdCB0ICsgcypSKnAuIFNvbHZpbmdcbiAgLy8gdGhhdCBmb3IgdCBhdCB0aGUgY2VudHJvaWRzIGdpdmVzIHRoZSB0cmFuc2xhdGlvbi5cbiAgY29uc3Qgc291cmNlQ2VudHJvaWQgPSBzb3VyY2VzLnJlZHVjZSgoc3VtLCB2KSA9PiBzdW0uYWRkKHYpLCBuZXcgVEhSRUUuVmVjdG9yMygpKS5tdWx0aXBseVNjYWxhcigxIC8gMyk7XG4gIGNvbnN0IHRhcmdldENlbnRyb2lkID0gdGFyZ2V0cy5yZWR1Y2UoKHN1bSwgdikgPT4gc3VtLmFkZCh2KSwgbmV3IFRIUkVFLlZlY3RvcjMoKSkubXVsdGlwbHlTY2FsYXIoMSAvIDMpO1xuICBjb25zdCB0cmFuc2xhdGlvbiA9IHRhcmdldENlbnRyb2lkXG4gICAgLmNsb25lKClcbiAgICAuc3ViKHNvdXJjZUNlbnRyb2lkLmNsb25lKCkuYXBwbHlNYXRyaXg0KHJvdGF0aW9uKS5tdWx0aXBseVNjYWxhcihzY2FsZSkpO1xuXG4gIGNvbnN0IGV1bGVyID0gbmV3IFRIUkVFLkV1bGVyKCkuc2V0RnJvbVJvdGF0aW9uTWF0cml4KHJvdGF0aW9uKTtcblxuICByZXR1cm4ge1xuICAgIHRyYW5zbGF0aW9uOiB7IHg6IHRyYW5zbGF0aW9uLngsIHk6IHRyYW5zbGF0aW9uLnksIHo6IHRyYW5zbGF0aW9uLnogfSxcbiAgICByb3RhdGlvbjogeyB4OiBldWxlci54LCB5OiBldWxlci55LCB6OiBldWxlci56IH0sXG4gICAgc2NhbGUsXG4gIH07XG59XG5cbi8qKiBUaGUgb25lLSBhbmQgdHdvLXBhaXIgY2FzZXMgb2Ygc29sdmVUaHJlZUpzQWxpZ25tZW50LCB3aGljaCBzaGFyZSB0aGUgXCJzYW1lIHZlcnRpY2FsXCIgYXNzdW1wdGlvbi4gKi9cbmZ1bmN0aW9uIHNvbHZlUmVkdWNlZEFsaWdubWVudChwYWlyczogVGhyZWVKc0FsaWdubWVudFBhaXJbXSwgdXA6IFRIUkVFLlZlY3RvcjMpOiBUaHJlZUpzQWxpZ25tZW50IHwgbnVsbCB7XG4gIGNvbnN0IHNvdXJjZXMgPSBwYWlycy5tYXAoKHBhaXIpID0+IG5ldyBUSFJFRS5WZWN0b3IzKHBhaXIuc291cmNlLngsIHBhaXIuc291cmNlLnksIHBhaXIuc291cmNlLnopKTtcbiAgY29uc3QgdGFyZ2V0cyA9IHBhaXJzLm1hcCgocGFpcikgPT4gbmV3IFRIUkVFLlZlY3RvcjMocGFpci50YXJnZXQueCwgcGFpci50YXJnZXQueSwgcGFpci50YXJnZXQueikpO1xuXG4gIC8vIFN0YXJ0cyBmcm9tIHRoZSByb3RhdGlvbiB0aGF0IG9ubHkgc3RhbmRzIHRoZSB0YWdzJyB2ZXJ0aWNhbCBvbiB0aGUgbW9kZWwncy5cbiAgY29uc3Qgcm90YXRpb24gPSBuZXcgVEhSRUUuUXVhdGVybmlvbigpLnNldEZyb21Vbml0VmVjdG9ycyhuZXcgVEhSRUUuVmVjdG9yMygwLCAxLCAwKSwgdXApO1xuICBsZXQgc2NhbGUgPSAxO1xuXG4gIGlmIChwYWlycy5sZW5ndGggPT09IDIpIHtcbiAgICBjb25zdCBzb3VyY2VTcGFuID0gc291cmNlc1sxXS5jbG9uZSgpLnN1Yihzb3VyY2VzWzBdKTtcbiAgICBjb25zdCB0YXJnZXRTcGFuID0gdGFyZ2V0c1sxXS5jbG9uZSgpLnN1Yih0YXJnZXRzWzBdKTtcbiAgICBpZiAoc291cmNlU3Bhbi5sZW5ndGgoKSA8IDFlLTkgfHwgdGFyZ2V0U3Bhbi5sZW5ndGgoKSA8IDFlLTkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBzY2FsZSA9IHRhcmdldFNwYW4ubGVuZ3RoKCkgLyBzb3VyY2VTcGFuLmxlbmd0aCgpO1xuXG4gICAgLy8gSGVhZGluZyBpcyB0aGUgdHVybiBhYm91dCB0aGUgdmVydGljYWwgdGhhdCBsaW5lcyB0aGUgdHdvIHNwYW5zIHVwLCBzbyBvbmx5IHRoZWlyIGhvcml6b250YWxcbiAgICAvLyBwYXJ0cyBjb3VudC4gVHdvIHBvaW50cyBvbmUgYWJvdmUgdGhlIG90aGVyIGhhdmUgbm9uZSwgYW5kIHNheSBub3RoaW5nIGFib3V0IGhlYWRpbmcuXG4gICAgY29uc3QgZmxhdHRlbiA9ICh2OiBUSFJFRS5WZWN0b3IzKSA9PiB2LmNsb25lKCkuc3ViKHVwLmNsb25lKCkubXVsdGlwbHlTY2FsYXIodi5kb3QodXApKSk7XG4gICAgY29uc3QgZnJvbSA9IGZsYXR0ZW4oc291cmNlU3Bhbi5jbG9uZSgpLmFwcGx5UXVhdGVybmlvbihyb3RhdGlvbikpO1xuICAgIGNvbnN0IHRvID0gZmxhdHRlbih0YXJnZXRTcGFuKTtcbiAgICBpZiAoZnJvbS5sZW5ndGgoKSA8IDFlLTYgKiBzb3VyY2VTcGFuLmxlbmd0aCgpIHx8IHRvLmxlbmd0aCgpIDwgMWUtNiAqIHRhcmdldFNwYW4ubGVuZ3RoKCkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBoZWFkaW5nID0gTWF0aC5hdGFuMihuZXcgVEhSRUUuVmVjdG9yMygpLmNyb3NzVmVjdG9ycyhmcm9tLCB0bykuZG90KHVwKSwgZnJvbS5kb3QodG8pKTtcbiAgICByb3RhdGlvbi5wcmVtdWx0aXBseShuZXcgVEhSRUUuUXVhdGVybmlvbigpLnNldEZyb21BeGlzQW5nbGUodXAsIGhlYWRpbmcpKTtcbiAgfVxuXG4gIC8vIEEgcG9pbnQgbGFuZHMgYXQgdCArIHMqUipwOyBzb2x2ZWQgZm9yIHQgYXQgdGhlIGNlbnRyb2lkcywgYXMgaW4gdGhlIHRocmVlLXBhaXIgY2FzZS5cbiAgY29uc3QgY2VudHJvaWQgPSAocG9pbnRzOiBUSFJFRS5WZWN0b3IzW10pID0+XG4gICAgcG9pbnRzLnJlZHVjZSgoc3VtLCB2KSA9PiBzdW0uYWRkKHYpLCBuZXcgVEhSRUUuVmVjdG9yMygpKS5tdWx0aXBseVNjYWxhcigxIC8gcG9pbnRzLmxlbmd0aCk7XG4gIGNvbnN0IHRyYW5zbGF0aW9uID0gY2VudHJvaWQodGFyZ2V0cykuc3ViKGNlbnRyb2lkKHNvdXJjZXMpLmFwcGx5UXVhdGVybmlvbihyb3RhdGlvbikubXVsdGlwbHlTY2FsYXIoc2NhbGUpKTtcbiAgY29uc3QgZXVsZXIgPSBuZXcgVEhSRUUuRXVsZXIoKS5zZXRGcm9tUXVhdGVybmlvbihyb3RhdGlvbik7XG5cbiAgcmV0dXJuIHtcbiAgICB0cmFuc2xhdGlvbjogeyB4OiB0cmFuc2xhdGlvbi54LCB5OiB0cmFuc2xhdGlvbi55LCB6OiB0cmFuc2xhdGlvbi56IH0sXG4gICAgcm90YXRpb246IHsgeDogZXVsZXIueCwgeTogZXVsZXIueSwgejogZXVsZXIueiB9LFxuICAgIHNjYWxlLFxuICB9O1xufVxuXG4vKipcbiAqIFRoZSAzRCB2aWV3ZXJzJyBiYWNrZ3JvdW5kIHdoZXJlIHRoZXJlIGlzIG5vdGhpbmcgdG8gZHJhdywgdW5sZXNzIHRoZSBhcHAgc2V0cyBpdHMgb3duIGFzXG4gKiAtLXNtYXJ0ZXJwbGFuLXZpZXdlci1iYWNrZ3JvdW5kOiB0aGUgU21hcnRlclBsYW4gYXBwJ3MgbGlnaHQgYmx1ZSwgZnJvbSB0aGUgUE9DLlxuICovXG5leHBvcnQgY29uc3QgVklFV0VSX0JBQ0tHUk9VTkQgPSAnI2UwZjdmZic7XG5cbi8qKiBUaGUgM0Qgdmlld2VycycgYmFja2dyb3VuZCBhcyB0aGUgYXBwIHNldHMgaXQsIHdoZXJlIHRoZSBlbGVtZW50IGlzLiAqL1xuZnVuY3Rpb24gdmlld2VyQmFja2dyb3VuZChlbGVtZW50OiBFbGVtZW50KTogc3RyaW5nIHtcbiAgcmV0dXJuIGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkuZ2V0UHJvcGVydHlWYWx1ZSgnLS1zbWFydGVycGxhbi12aWV3ZXItYmFja2dyb3VuZCcpLnRyaW0oKSB8fCBWSUVXRVJfQkFDS0dST1VORDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBPYmpBZGRlZCB7XG4gIGlkOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgZmlsZTogc3RyaW5nOyAvLyBUaGUgVVJMIHRvIHRoZSAub2JqIGZpbGVcbiAgcG9zaXRpb246IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHo6IG51bWJlciB9O1xuICByb3RhdGlvbjogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgejogbnVtYmVyIH07XG4gIHNjYWxlOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB6OiBudW1iZXIgfTtcbn1cblxuaW50ZXJmYWNlIFBhcnNlZE1lc2hHcm91cCB7XG4gIHN0YXJ0OiBudW1iZXI7XG4gIGNvdW50OiBudW1iZXI7XG4gIG1hdGVyaWFsSW5kZXg6IG51bWJlcjtcbn1cblxuLyoqIFJhdyBnZW9tZXRyeSBkYXRhIGV4dHJhY3RlZCBmcm9tIGEgcGFyc2VkIE9CSiBtZXNoLCBzZW50IGJhY2sgYnkgdGhlIHBhcnNlciB3b3JrZXIuICovXG5pbnRlcmZhY2UgUGFyc2VkTWVzaERhdGEge1xuICBuYW1lOiBzdHJpbmc7XG4gIC8vIE9uZSBuYW1lIHBlciBtYXRlcmlhbCB1c2VkIGJ5IHRoaXMgbWVzaC4gQSBzaW5nbGUtbWF0ZXJpYWwgbWVzaCBoYXMgb25lIGVudHJ5O1xuICAvLyBhIG1lc2ggd2l0aCBtdWx0aXBsZSB1c2VtdGwgc3dpdGNoZXMgKGdlb21ldHJ5Lmdyb3VwcykgaGFzIG9uZSBwZXIgZ3JvdXAuXG4gIG1hdGVyaWFsTmFtZXM6IHN0cmluZ1tdO1xuICBncm91cHM6IFBhcnNlZE1lc2hHcm91cFtdIHwgbnVsbDtcbiAgcG9zaXRpb246IEZsb2F0MzJBcnJheTtcbiAgbm9ybWFsOiBGbG9hdDMyQXJyYXkgfCBudWxsO1xuICB1djogRmxvYXQzMkFycmF5IHwgbnVsbDtcbiAgaW5kZXg6IFVpbnQzMkFycmF5IHwgbnVsbDtcbiAgYm91bmRpbmdCb3g/OiB7IG1pbjogW251bWJlciwgbnVtYmVyLCBudW1iZXJdOyBtYXg6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSB9O1xufVxuXG5pbnRlcmZhY2UgT2JqUGFyc2VyV29ya2VyUmVzcG9uc2Uge1xuICByZXF1ZXN0SWQ6IHN0cmluZztcbiAgc3VjY2VzczogYm9vbGVhbjtcbiAgbWVzaGVzPzogUGFyc2VkTWVzaERhdGFbXTtcbiAgZXJyb3I/OiBzdHJpbmc7XG59XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIFRocmVlSnNTZXJ2aWNlIHtcbiAgcHJpdmF0ZSBzY2VuZSE6IFRIUkVFLlNjZW5lO1xuICBwcml2YXRlIGNhbWVyYSE6IFRIUkVFLlBlcnNwZWN0aXZlQ2FtZXJhO1xuICBwcml2YXRlIHJlbmRlcmVyITogVEhSRUUuV2ViR0xSZW5kZXJlcjtcbiAgcHJpdmF0ZSBjb250cm9scyE6IE9yYml0Q29udHJvbHM7XG4gIHByaXZhdGUgYW5pbWF0aW9uRnJhbWVJZCE6IG51bWJlcjtcblxuICAvLyBSYXljYXN0aW5nIGFuZCBpbnRlcmFjdGlvblxuICBwcml2YXRlIHJheWNhc3RlciA9IG5ldyBUSFJFRS5SYXljYXN0ZXIoKTtcbiAgcHJpdmF0ZSBtb3VzZSA9IG5ldyBUSFJFRS5WZWN0b3IyKCk7XG4gIHByaXZhdGUgaXNEcmFnZ2luZ0NhbWVyYTogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIGlzRHJhZ2dpbmdUaW1lcjogYW55O1xuICBwcml2YXRlIGNsaWNrYWJsZU9iamVjdHM6IFRIUkVFLk9iamVjdDNEW10gPSBbXTtcblxuICAvLyBPYnNlcnZhYmxlcyBmb3IgdGhlIHZpZXdlciBjb21wb25lbnRcbiAgcHVibGljIG9iamVjdEhvdmVyZWQkID0gbmV3IFN1YmplY3Q8eyBpZDogc3RyaW5nOyBldmVudDogTW91c2VFdmVudCB9IHwgbnVsbD4oKTtcbiAgcHVibGljIG9iamVjdENsaWNrZWQkID0gbmV3IFN1YmplY3Q8c3RyaW5nIHwgbnVsbD4oKTtcblxuICAvKiogRW1pdHMgd2hlbiB0aGUgdXNlciBjbGlja3MgYSB0YWcsIG1pcnJvcmluZyBNYXR0ZXJwb3J0J3MgdGFnIGNsaWNrLiAqL1xuICBwdWJsaWMgdGFnQ2xpY2tlZCQgPSBuZXcgU3ViamVjdDxUaHJlZUpzVGFnQ2xpY2s+KCk7XG5cbiAgLyoqXG4gICAqIEVtaXRzIHRoZSB0YWcgdGhlIGNhbWVyYSBpcyBzZW50IHRvIChnb1RvVGFnKTogZm9yIGEgdmlld2VyIGRyYXdpbmcgdGhlIG1vZGVsIGVsc2V3aGVyZSwgdGhlXG4gICAqIHNwbGF0IHZpZXdlciwgdG8gcG9pbnQgaXQgb3V0LlxuICAgKi9cbiAgcHVibGljIHRhZ0ZvY3VzZWQkID0gbmV3IFN1YmplY3Q8c3RyaW5nPigpO1xuXG4gIC8qKlxuICAgKiBFbWl0cyB3aGVuIHRoZSB0YWdzIGNoYW5nZSAtIGFkZGVkLCBtb3ZlZCwgcmVtb3ZlZCwgZmlsdGVyZWQsIGNhbGlicmF0ZWQgZGlmZmVyZW50bHkgLSBhdCBtb3N0XG4gICAqIG9uY2UgcGVyIHR1cm4gb2YgdGhlIGV2ZW50IGxvb3AsIGhvd2V2ZXIgbWFueSBjaGFuZ2VkIGluIGl0LlxuICAgKi9cbiAgcHVibGljIHRhZ3NDaGFuZ2VkJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgcHJpdmF0ZSB0YWdzQ2hhbmdlUXVldWVkID0gZmFsc2U7XG5cbiAgLyoqIEVtaXRzIGEgdGFnJ3MgbGFiZWwgd2hpbGUgdGhlIHBvaW50ZXIgaXMgb3ZlciBpdCwgYW5kIG51bGwgd2hlbiBpdCBsZWF2ZXMuICovXG4gIHB1YmxpYyB0YWdIb3ZlcmVkJCA9IG5ldyBTdWJqZWN0PHsgbGFiZWw6IHN0cmluZzsgZXZlbnQ6IE1vdXNlRXZlbnQgfSB8IG51bGw+KCk7XG5cbiAgLy8gVGFncyBsaXZlIHVuZGVyIHRoZSBtb2RlbCByYXRoZXIgdGhhbiB0aGUgc2NlbmUsIHNvIHRoZSBjZW50ZXJpbmcgYW5kIHNjYWxpbmcgYXBwbGllZCB3aGVuIHRoZVxuICAvLyBtb2RlbCBpcyBwbGFjZWQgY2FycmllcyBvdmVyIGFuZCBQT0kgY29vcmRpbmF0ZXMgY2FuIHN0YXkgaW4gdGhlIG1vZGVsJ3Mgb3duIHNwYWNlLlxuICBwcml2YXRlIHRhZ0dyb3VwID0gbmV3IFRIUkVFLkdyb3VwKCk7XG4gIHByaXZhdGUgdGFnU3ByaXRlcyA9IG5ldyBNYXA8c3RyaW5nLCBUSFJFRS5TcHJpdGU+KCk7XG5cbiAgcHJpdmF0ZSBjYW52YXNSZXNpemVPYnNlcnZlcj86IFJlc2l6ZU9ic2VydmVyO1xuXG4gIC8qKiBBYm9ydHMgdGhlIGluLWZsaWdodCBtb2RlbCBkb3dubG9hZC4gUGFyc2luZyBjYW5ub3QgYmUgaW50ZXJydXB0ZWQsIG9ubHkgbm90IHN0YXJ0ZWQuICovXG4gIHByaXZhdGUgbG9hZEFib3J0Q29udHJvbGxlcj86IEFib3J0Q29udHJvbGxlcjtcblxuICAvKipcbiAgICogV2hpY2ggbG9hZCBpcyB0aGUgd2FudGVkIG9uZS4gRXZlcnkgbG9hZCB0YWtlcyB0aGUgbmV4dCBudW1iZXIgYXMgaXQgc3RhcnRzLCBhbmQgYW55dGhpbmcgdGhhdFxuICAgKiBtYWtlcyBpdCB1bndhbnRlZCAtIGFub3RoZXIgbG9hZCwgdGhlIHNjZW5lIGJlaW5nIHJlYnVpbHQsIHRoZSB2aWV3ZXIgY2xvc2luZyAtIG1vdmVzIHRoZVxuICAgKiBudW1iZXIgb24uXG4gICAqXG4gICAqIEFib3J0aW5nIHRoZSBkb3dubG9hZCBpcyBub3QgZW5vdWdoIHRvIHN0b3AgYSBsb2FkLiBBIG1vZGVsIHJlYWQgZnJvbSB0aGUgY2FjaGUgaGFzIG5vXG4gICAqIGRvd25sb2FkIHRvIGFib3J0LCBhbmQgb25lIHRoYXQgaGFzIGZpbmlzaGVkIGRvd25sb2FkaW5nIHN0aWxsIGhhcyBzZWNvbmRzIG9mIHdvcmsgYWhlYWQgb2YgaXRcbiAgICogYmVmb3JlIGl0IHJlYWNoZXMgdGhlIHNjcmVlbi4gQSBsb2FkIHRoYXQgZmluZHMgdGhlIG51bWJlciBoYXMgbW92ZWQgb24gZHJvcHMgd2hhdCBpdCBoYXMuXG4gICAqL1xuICBwcml2YXRlIGxvYWRHZW5lcmF0aW9uID0gMDtcblxuICAvKiogV2hldGhlciB0aGUgd2FudGVkIGxvYWQgaXMgc3RpbGwgb24gaXRzIHdheSwgc28gYWJhbmRvbmluZyBpdCBjYW4gc2F5IHRoYXQgaXQgc3RvcHBlZC4gKi9cbiAgcHJpdmF0ZSBsb2FkSW5Qcm9ncmVzcyA9IGZhbHNlO1xuXG4gIC8qKiBXaGV0aGVyIGEgc2NlbmUgaXMgdXA6IHN0YXJ0ZWQgYnkgaW5pdCgpIGFuZCBub3QgeWV0IHRha2VuIGRvd24gYnkgZGVzdHJveSgpLiAqL1xuICBwcml2YXRlIGxpdmUgPSBmYWxzZTtcblxuICAvKiogVGFrZXMgb2ZmIGVhY2ggbGlzdGVuZXIgaW5pdCgpIHB1dCBvbiB0aGUgY2FudmFzLiAqL1xuICBwcml2YXRlIGNhbnZhc0xpc3RlbmVyczogKCgpID0+IHZvaWQpW10gPSBbXTtcblxuICAvLyBUaGUgbG9hZGVkIGJhc2UgbW9kZWwsIGtlcHQgc28gdGFnIHBsYWNlbWVudCBjYW4gcmF5Y2FzdCBhZ2FpbnN0IGl0cyBnZW9tZXRyeS5cbiAgcHJpdmF0ZSBtb2RlbFJvb3Q/OiBUSFJFRS5PYmplY3QzRDtcblxuICAvKiogVHJ1ZSB3aGlsZSB0aGUgbmV4dCBjbGljayBvbiB0aGUgbW9kZWwgcGxhY2VzIGEgdGFnIGluc3RlYWQgb2Ygb3JiaXRpbmcuICovXG4gIHByaXZhdGUgcGxhY2luZ1RhZyA9IGZhbHNlO1xuXG4gIC8qKiBXaGF0IHRoZSBhcm1lZCBwbGFjZW1lbnQgaXMgZm9yLCBlY2hvZWQgYmFjayB3aGVuIHRoZSBzcG90IGlzIHBpY2tlZC4gKi9cbiAgcHJpdmF0ZSBwbGFjZW1lbnRQb2lUeXBlOiBQb2lUeXBlIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIFBvc2l0aW9uIGFuZCBub3JtYWwgb2YgdGhlIGxhc3QgcGxhY2VkIHRhZywgaW4gbW9kZWwgc3BhY2UsIGF3YWl0aW5nIGNvbW1pdCB0byBhIFBPSS4gKi9cbiAgcHJpdmF0ZSBwZW5kaW5nVGFnUGxhY2VtZW50OiBUaHJlZUpzVGFnUGxhY2VtZW50IHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIFBvaW50ZXIgcG9zaXRpb24gd2FpdGluZyBmb3IgYSBwcmV2aWV3IHBpY2ssIGNvYWxlc2NlZCB0byBvbmUgcGVyIGZyYW1lLiAqL1xuICBwcml2YXRlIHBlbmRpbmdQcmV2aWV3RXZlbnQ6IE1vdXNlRXZlbnQgfCBudWxsID0gbnVsbDtcblxuICAvKipcbiAgICogVGFncyB3aG9zZSBwb3NpdGlvbiBpcyBpbiB0aGlzIG1vZGVsJ3Mgb3duIGNvb3JkaW5hdGVzLiBBIHNpYmxpbmcgb2YgdGhlIHRhZyBncm91cCB0aGF0IGRvZXMgbm90XG4gICAqIGNhcnJ5IHRoZSBjYWxpYnJhdGlvbjogY2FsaWJyYXRpbmcgYSBtb2RlbCBmb3IgdGhlIHRhZ3MgaXQgaW1wb3J0cyBtdXN0IG5vdCBtb3ZlIHRoZSBvbmVzIHRoYXRcbiAgICogd2VyZSBwbGFjZWQgc3RyYWlnaHQgb250byBpdC5cbiAgICovXG4gIHByaXZhdGUgbW9kZWxUYWdHcm91cCA9IG5ldyBUSFJFRS5Hcm91cCgpO1xuXG4gIC8qKlxuICAgKiBUaGUgY2FwdHVyZSBvbiBzY3JlZW4uIEEgdGFnIHBsYWNlZCBpbiBhIDNEIG1vZGVsIGlzIHJlY29yZGVkIHdpdGggaXQsIHdoaWNoIGlzIGhvdyB0aGUgdGFnc1xuICAgKiBwbGFjZWQgaW4gdGhpcyBvbmUgYXJlIHRvbGQgZnJvbSB0aG9zZSB0aGF0IGNhbWUgZnJvbSBlbHNld2hlcmUuXG4gICAqL1xuICBwcml2YXRlIGN1cnJlbnRDYXB0dXJlSUQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSB2aXNpdCBvbiBzY3JlZW4gaXMgdGhlIG9ubHkgb25lIHRoZSBzaXRlIGhhcy4gQSB0YWcgcmVjb3JkcyB0aGUgdmlzaXQgaXQgd2FzIHBsYWNlZFxuICAgKiBpbiwgYnV0IHNvbWUgZG8gbm90IC0gcGxhY2VkIGJlZm9yZSB0aGF0IHdhcyByZWNvcmRlZCwgb3IgaW4gdGhlIGRldmVsb3BtZW50IG1vZGVsLiBXaXRoXG4gICAqIGFub3RoZXIgdmlzaXQgYXJvdW5kLCBzdWNoIGEgdGFnIGlzIHRha2VuIHRvIGNvbWUgZnJvbSBpdC4gV2l0aCBub25lLCBpdCBjYW4gb25seSBiZSB0aGlzIG9uZSdzLlxuICAgKi9cbiAgcHJpdmF0ZSBzb2xlVmlzaXQgPSBmYWxzZTtcblxuICAvKipcbiAgICogVGhlIG1vZGVsJ3Mgc3VyZmFjZSBhcyBhIGdyaWQ6IGV2ZXJ5IGNlbGwgc29tZSBwYXJ0IG9mIHRoZSBzdXJmYWNlIHBhc3NlcyB0aHJvdWdoLlxuICAgKlxuICAgKiBJdCBhbnN3ZXJzIFwiaXMgdGhpcyBwb2ludCBuZWFyIHRoZSBtb2RlbD9cIiB3aXRob3V0IHZpc2l0aW5nIHRoZSB0cmlhbmdsZXMsIG9mIHdoaWNoIGEgY2FwdHVyZWRcbiAgICogbW9kZWwgaGFzIG1pbGxpb25zIC0gdGhlIHF1ZXN0aW9uIGlzIGFza2VkIGZvciBldmVyeSB0YWcsIGV2ZXJ5IHRpbWUgdGhlIGNhbGlicmF0aW9uIGNoYW5nZXMuXG4gICAqL1xuICBwcml2YXRlIHN1cmZhY2VDZWxsczogU2V0PG51bWJlcj4gfCBudWxsID0gbnVsbDtcblxuICBwcml2YXRlIHN1cmZhY2VPcmlnaW4gPSBuZXcgVEhSRUUuVmVjdG9yMygpO1xuXG4gIHByaXZhdGUgc3VyZmFjZUNlbGxTaXplID0gMTtcblxuICAvKipcbiAgICogSG93IGZhciBmcm9tIHRoZSBtb2RlbCdzIHN1cmZhY2UgYSB0YWcgbWF5IGJlIGFuZCBzdGlsbCBjb3VudCBhcyBvbiBpdCwgaW4gbWV0cmVzLlxuICAgKlxuICAgKiBFdmVyeSB0YWcgb2YgdGhlIHNwYWNlIGlzIG9mZmVyZWQgdG8gZXZlcnkgbW9kZWw7IHRoaXMgaXMgd2hhdCBkZWNpZGVzIHdoaWNoIG9uZXMgYSBtb2RlbFxuICAgKiBzaG93cy4gQSB0YWcgbWFya3Mgc29tZXRoaW5nIG9uIGEgc3VyZmFjZSwgc28gb25lIHRoYXQgYmVsb25ncyBoZXJlIHNpdHMgb24gdGhlIHN1cmZhY2Ugb3JcbiAgICogY2xvc2UgdG8gaXQuIE9uZSB0aGF0IGxhbmRzIGRlZXAgaW5zaWRlIHRoZSBtb2RlbCwgb3Igd2VsbCBhd2F5IGZyb20gaXQsIG1hcmtzIHNvbWV0aGluZyB0aGF0XG4gICAqIGlzIG5vdCBwYXJ0IG9mIHRoaXMgbW9kZWwuIFRoZSBhbGxvd2FuY2UgY292ZXJzIGEgY2FsaWJyYXRpb24gZG9uZSBieSBoYW5kIGFuZCB0aGUgbW9kZWwgbm90XG4gICAqIG1hdGNoaW5nIHRoZSBzY2FuIGV4YWN0bHksIHdoaWNoIHRvZ2V0aGVyIHJ1biB0byBhIGZldyB0ZW5zIG9mIGNlbnRpbWV0cmVzLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgT05fTU9ERUxfTUVUUkVTID0gMC43NTtcblxuICAvKiogQ2VsbHMgcGVyIGF4aXMgdGhlIGdyaWQncyBrZXlzIGNhbiBhZGRyZXNzLCB3aXRoIHJvb20gZWl0aGVyIHNpZGUgZm9yIHBvaW50cyBvZmYgdGhlIG1vZGVsLiAqL1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBTVVJGQUNFX0dSSURfU1BBTiA9IDEwMjQ7XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgU1VSRkFDRV9HUklEX1BBRCA9IDEyODtcblxuICAvKiogT3duIHRhZ3MgbW92ZWQgdG8ga2VlcCB0aGVpciBwbGFjZSB1bmRlciB0aGUgbGFzdCBjYWxpYnJhdGlvbiwgd2FpdGluZyB0byBiZSBzdG9yZWQuICovXG4gIHByaXZhdGUgcmViYXNlZFRhZ3M6IFRocmVlSnNSZWJhc2VkVGFnW10gPSBbXTtcblxuICAvKiogVGhlIHR5cGUgZmlsdGVyIGluIGZvcmNlLiBOdWxsIHNob3dzIGV2ZXJ5IHR5cGUuICovXG4gIHByaXZhdGUgdmlzaWJsZVRhZ1R5cGVzOiBQb2lUeXBlW10gfCBudWxsID0gbnVsbDtcblxuICBwcml2YXRlIG1lYXN1cmluZyA9IGZhbHNlO1xuXG4gIC8qKiBQb2ludHMgY2xpY2tlZCBzbyBmYXIsIGluIHRhZyBzcGFjZS4gKi9cbiAgcHJpdmF0ZSBtZWFzdXJlUG9pbnRzOiBUSFJFRS5WZWN0b3IzW10gPSBbXTtcblxuICAvKipcbiAgICogRXZlcnl0aGluZyBkcmF3biBmb3IgdGhlIG1lYXN1cmVtZW50LiBBIGNoaWxkIG9mIHRoZSB0YWcgZ3JvdXAsIHNvIGl0cyBwb2ludHMgc2hhcmUgdGhlIGZyYW1lXG4gICAqIHRhZyBjb29yZGluYXRlcyBhcmUgc3RvcmVkIGluIC0gd2hpY2ggaXMgbWV0cmVzLCBhbmQgd2hhdCB0aGUgc2F2ZWQgUE9JIGhhcyB0byBiZSBpbi5cbiAgICovXG4gIHByaXZhdGUgbWVhc3VyZUdyb3VwID0gbmV3IFRIUkVFLkdyb3VwKCk7XG5cbiAgLyoqIFRoZSBzZWdtZW50IHRoYXQgZm9sbG93cyB0aGUgcG9pbnRlciBmcm9tIHRoZSBsYXN0IHBvaW50IGNsaWNrZWQuICovXG4gIHByaXZhdGUgbWVhc3VyZVJ1YmJlckJhbmQ/OiBhbnk7XG5cbiAgcHJpdmF0ZSBsYXN0TWVhc3VyZW1lbnQ6IFRocmVlSnNNZWFzdXJlbWVudCB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBIYWxmIHRoZSBtb2RlbCdzIGRpYWdvbmFsIGFzIHBsYWNlZCBpbiB0aGUgc2NlbmUsIHdoZXJlIGl0IGlzIGNlbnRyZWQgb24gdGhlIG9yaWdpbi4gKi9cbiAgcHJpdmF0ZSBtb2RlbFdvcmxkUmFkaXVzID0gMDtcblxuICAvKiogVGhlIG91dGVybW9zdCBncm91cCB0aGUgbW9kZWwgYW5kIGl0cyB0YWdzIGhhbmcgZnJvbTogd2hlcmUgXCJ3aGljaCB3YXkgaXMgdXBcIiBpcyBhcHBsaWVkLiAqL1xuICBwcml2YXRlIG1vZGVsR3JvdXA/OiBUSFJFRS5Hcm91cDtcblxuICBwcml2YXRlIG1vZGVsVXA6IFRocmVlSnNNb2RlbFVwID0gJ3knO1xuXG4gIC8qKiBXaGlsZSBtZWFzdXJpbmc6IGhvdyBtYW55IHBvaW50cyBhbmQgZWFjaCBzZWdtZW50J3MgbGVuZ3RoLiBOdWxsIHdoZW4gaXQgaXMgYWJhbmRvbmVkLiAqL1xuICBwdWJsaWMgbWVhc3VyZW1lbnRQcm9ncmVzcyQgPSBuZXcgU3ViamVjdDx7IHBvaW50czogbnVtYmVyOyBkaXN0YW5jZXM6IG51bWJlcltdIH0gfCBudWxsPigpO1xuXG4gIC8qKlxuICAgKiBUcnVlIHdoZW4gYSBtZWFzdXJlbWVudCBzdGFydHMgdGFraW5nIGNsaWNrcywgZmFsc2Ugd2hlbiBpdCBzdG9wcyAtIGZpbmlzaGVkIG9yIGFiYW5kb25lZC4gRm9yIGFcbiAgICogdmlld2VyIGRyYXdpbmcgdGhlIG1vZGVsIGVsc2V3aGVyZSwgd2hpY2ggdGFrZXMgdGhlIGNsaWNrcyBpdHNlbGY7IHNlZSBhZGRNZWFzdXJlUG9pbnRBdE1vZGVsUG9pbnQuXG4gICAqL1xuICBwdWJsaWMgbWVhc3VyaW5nQ2hhbmdlZCQgPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xuXG4gIC8qKlxuICAgKiBBIG1lYXN1cmVtZW50IC0gdW5kZXIgd2F5IG9yIGZpbmlzaGVkIC0gd2FzIHRha2VuIG9mZiB0aGUgbW9kZWwuIEZvciBhIHZpZXdlciBkcmF3aW5nIGl0XG4gICAqIGVsc2V3aGVyZSwgdGhlIHNwbGF0IHZpZXdlcjogYSBmaW5pc2hlZCBvbmUgc3RheXMgZHJhd24gd2hpbGUgaXRzIGZvcm0gaXMgb3Blbiwgd2hpY2hcbiAgICogbWVhc3VyZW1lbnRQcm9ncmVzcyQgZG9lcyBub3Qgc2F5IHRoZSBlbmQgb2YuXG4gICAqL1xuICBwdWJsaWMgbWVhc3VyZW1lbnRDbGVhcmVkJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgLyoqXG4gICAqIExheWVyIGNhcnJ5aW5nIHRoZSBtb2RlbCBhbG9uZSwgc28gdGhlIGRlcHRoIHBpY2sgY2FuIHJlbmRlciBpdCB3aXRob3V0IHRoZSB0YWdzLlxuICAgKlxuICAgKiBMYXllcnMgYXJlIHRlc3RlZCBwZXIgb2JqZWN0IGF0IHJlbmRlciB0aW1lIGFuZCBjaGlsZHJlbiBhcmUgdHJhdmVyc2VkIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlclxuICAgKiB0aGVpciBwYXJlbnQgcGFzc2VkLCBzbyBtYXJraW5nIHRoZSBtb2RlbCdzIG93biBtZXNoZXMgaXMgZW5vdWdoIC0gbm8gcmUtcGFyZW50aW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgUElDS19MQVlFUiA9IDE7XG5cbiAgLyoqIEhvdyBsYXJnZSBhIHRhZyBpcyBkcmF3biwgaW4gQ1NTIHBpeGVscy4gQWJvdXQgd2hhdCBNYXR0ZXJwb3J0IGRyYXdzIGl0cyBvd24gYXQuICovXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRBR19TQ1JFRU5fUFggPSAyODtcblxuICAvKiogVGhlIGFwcCdzIGhpZ2hsaWdodCBjb2xvdXIsIHNvIGEgbWVhc3VyZW1lbnQgcmVhZHMgYXMgdGhlIGFjdGl2ZSB0aGluZyBvbiBzY3JlZW4uICovXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE1FQVNVUkVfQ09MT1IgPSAnI0ZGQjEwMyc7XG5cbiAgLyoqIEdyZWVuIGZvciB0aGUgcG9pbnRzIG9mIGEgY2FsaWJyYXRpb24gdGhhdCBhcmUgc2V0dGxlZCwgYXMgb3Bwb3NlZCB0byB0aGUgb25lIGluIGhhbmQuICovXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IENBTElCUkFUSU9OX0RPTkVfQ09MT1IgPSAnIzFFOUU1QSc7XG5cbiAgLyoqIFNpemUgb24gc2NyZWVuIG9mIHRoZSBudW1iZXJlZCBwaW4gbGVmdCB3aGVyZSBhIHRhZyB3YXMgbWF0Y2hlZDogYSBsaXR0bGUgdW5kZXIgYSB0YWcncy4gKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQ0FMSUJSQVRJT05fUElOX1BYID0gMjQ7XG5cbiAgLyoqIEhvdyBsb25nIGEgbWFyayBqdXN0IGRyb3BwZWQgdGFrZXMgdG8gc2V0dGxlIHRvIGl0cyBzaXplLCBpbiBtaWxsaXNlY29uZHMuICovXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IENPTkZJUk1fUFVMU0VfTVMgPSAzNTA7XG5cbiAgLyoqIEhvdyBtYW55IG1hdGNoZWQgdGFncyBhIGNhbGlicmF0aW9uIHRha2VzLiBUaHJlZSBzZXR0bGUgZXZlcnl0aGluZyB0aGVyZSBpcyB0byBzZXR0bGUuICovXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IENBTElCUkFUSU9OX1BBSVJTID0gMztcblxuICAvKiogQ2FjaGUgU3RvcmFnZSBidWNrZXQgaG9sZGluZyBkb3dubG9hZGVkIG1vZGVscywgYW5kIGhvdyBtYW55IHRvIGtlZXAuICovXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE1PREVMX0NBQ0hFID0gJ3NtYXJ0ZXJwbGFuLTNkLW1vZGVscyc7XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgTU9ERUxfQ0FDSEVfU0laRSA9IDM7XG5cbiAgcHJpdmF0ZSBwaWNrVGFyZ2V0PzogVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ7XG5cbiAgcHJpdmF0ZSBwaWNrQ2FtZXJhPzogVEhSRUUuUGVyc3BlY3RpdmVDYW1lcmE7XG5cbiAgcHJpdmF0ZSBwaWNrRGVwdGhNYXRlcmlhbD86IFRIUkVFLk1lc2hEZXB0aE1hdGVyaWFsO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgcGlja1BpeGVsID0gbmV3IFVpbnQ4QXJyYXkoNCk7XG5cbiAgLyoqIEVtaXRzIG9uY2UgYSB0YWcgaXMgZHJvcHBlZCBvbiB0aGUgbW9kZWwsIHNvIHRoZSBVSSBjYW4gY29uZmlybSBhbmQgcGVyc2lzdCBpdC4gKi9cbiAgcHVibGljIHRhZ1BsYWNlZCQgPSBuZXcgU3ViamVjdDxUaHJlZUpzVGFnUGxhY2VtZW50PigpO1xuXG4gIC8qKiBFbWl0cyB3aGVuIHRoZSBjYWxpYnJhdGlvbiB3YWxrdGhyb3VnaCBpcyBhYmFuZG9uZWQsIHNvIHRoZSBwYW5lbCBkcml2aW5nIGl0IGNhbiBjbG9zZS4gKi9cbiAgcHVibGljIGFsaWdubWVudENhbmNlbGxlZCQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIC8qKiBUcmFuc2x1Y2VudCBtYXJrZXIgc2hvd24gdW5kZXIgdGhlIGN1cnNvciB3aGlsZSBwbGFjaW5nLiAqL1xuICBwcml2YXRlIHBsYWNlbWVudFByZXZpZXc/OiBUSFJFRS5TcHJpdGU7XG5cbiAgcHJpdmF0ZSBhbGlnbmluZyA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBUcnVlIGZyb20gdGhlIG1vbWVudCB0aGUgY2FsaWJyYXRpb24gcGFuZWwgb3BlbnMsIGJlZm9yZSB0aGUgd2Fsa3Rocm91Z2ggaXMgYXJtZWQ6IHRoZSB0YWdzXG4gICAqIGZyb20gZWxzZXdoZXJlIGFyZSBhbGwgb24gc2hvdywgYXMgdGhleSBhcmUgd2hpbGUgY2FsaWJyYXRpbmcsIHNvIHRoYXQgd2hhdCB0aGVyZSBpcyB0b1xuICAgKiBjYWxpYnJhdGUgd2l0aCBjYW4gYmUgc2VlbiB3aGlsZSByZWFkaW5nIHdoYXQgY2FsaWJyYXRpbmcgaW52b2x2ZXMuXG4gICAqL1xuICBwcml2YXRlIHJldmVhbGluZ0NhbGlicmF0aW9uVGFncyA9IGZhbHNlO1xuXG4gIHByaXZhdGUgYWxpZ25tZW50UGFpcnM6IFRocmVlSnNBbGlnbm1lbnRQYWlyW10gPSBbXTtcbiAgcHJpdmF0ZSBhbGlnbm1lbnRTb3VyY2U6IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHo6IG51bWJlciB9IHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIFRoZSB0YWcgYGFsaWdubWVudFNvdXJjZWAgd2FzIHJlYWQgZnJvbSwga2VwdCBzbyB0aGUgc2FtZSB0YWcgaXMgbm90IG1hdGNoZWQgdHdpY2UuICovXG4gIHByaXZhdGUgYWxpZ25tZW50U291cmNlVGFnSWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogRXZlcnl0aGluZyBkcmF3biBmb3IgdGhlIGNhbGlicmF0aW9uIHVuZGVyIHdheTogYSBudW1iZXJlZCBwaW4gd2hlcmUgZWFjaCB0YWcgd2FzIG1hdGNoZWQsIGFcbiAgICogbGluZSBmcm9tIHRoZSBwaW4gdG8gaXRzIHRhZywgYW5kIGEgcmluZyByb3VuZCB0aGUgdGFnIGJlaW5nIG1hdGNoZWQuXG4gICAqXG4gICAqIEEgc2libGluZyBvZiB0aGUgdGFnIGdyb3VwIHJhdGhlciB0aGFuIGEgY2hpbGQgb2YgaXQuIFRoZSBwb2ludHMgY2xpY2tlZCBhcmUgd2hlcmUgdGhlIHRhZ3MgYXJlXG4gICAqIHRvIGVuZCB1cCwgaW4gdGhlIGZyYW1lIHRoZSBjYWxpYnJhdGlvbiBtYXBzIG9udG8gKHNlZSBwaWNrQWxpZ25tZW50VGFyZ2V0KSAtIG5vdCBpbiB0aGUgdGFncydcbiAgICogb3duIGZyYW1lLCB3aGljaCBpcyB0aGUgb25lIGFib3V0IHRvIGNoYW5nZS5cbiAgICovXG4gIHByaXZhdGUgY2FsaWJyYXRpb25Hcm91cCA9IG5ldyBUSFJFRS5Hcm91cCgpO1xuXG4gIC8qKiBNYXJrcyBzdGlsbCBzZXR0bGluZyBhZnRlciBiZWluZyBkcm9wcGVkLCBhZHZhbmNlZCBieSB0aGUgcmVuZGVyIGxvb3AuICovXG4gIHByaXZhdGUgcHVsc2VzOiB7IHNwcml0ZTogVEhSRUUuU3ByaXRlOyBzdGFydGVkQXQ6IG51bWJlciB9W10gPSBbXTtcblxuICAvKiogRHJpdmVzIHRoZSBhbGlnbm1lbnQgd2Fsa3Rocm91Z2gncyBVSTogaG93IG1hbnkgcGFpcnMgYXJlIGRvbmUgYW5kIHdoYXQgaXQgd2FudHMgbmV4dC4gKi9cbiAgcHVibGljIGFsaWdubWVudFByb2dyZXNzJCA9IG5ldyBTdWJqZWN0PFRocmVlSnNBbGlnbm1lbnRQcm9ncmVzcz4oKTtcblxuICAvKipcbiAgICogRW1pdHMgd2hlbiBhIGNsaWNrIGR1cmluZyBjYWxpYnJhdGlvbiBkaWQgbm90aGluZywgd2l0aCB3aGF0IGl0IHdhcyBleHBlY3RlZCB0byBsYW5kIG9uLlxuICAgKlxuICAgKiBBIGNsaWNrIHRoYXQgY2hhbmdlcyBub3RoaW5nIGxvb2tzIHRoZSBzYW1lIGFzIGEgY2xpY2sgdGhhdCB3YXMgbm90IHJlY2VpdmVkLiBUaGlzIGxldHMgdGhlXG4gICAqIHBhbmVsIHBvaW50IGF0IHdoYXQgaXQgaXMgd2FpdGluZyBmb3IgaW5zdGVhZC5cbiAgICovXG4gIHB1YmxpYyBhbGlnbm1lbnRDbGlja0lnbm9yZWQkID0gbmV3IFN1YmplY3Q8J3RhZycgfCAncG9pbnQnPigpO1xuXG4gIC8qKiBJbi1mbGlnaHQgY2FtZXJhIG1vdmUgc3RhcnRlZCBieSBnb1RvVGFnLCBhZHZhbmNlZCBieSB0aGUgcmVuZGVyIGxvb3AuICovXG4gIHByaXZhdGUgY2FtZXJhVHdlZW46IHtcbiAgICBmcm9tUG9zaXRpb246IFRIUkVFLlZlY3RvcjM7XG4gICAgdG9Qb3NpdGlvbjogVEhSRUUuVmVjdG9yMztcbiAgICBmcm9tVGFyZ2V0OiBUSFJFRS5WZWN0b3IzO1xuICAgIHRvVGFyZ2V0OiBUSFJFRS5WZWN0b3IzO1xuICAgIHN0YXJ0ZWRBdDogbnVtYmVyO1xuICAgIGR1cmF0aW9uTXM6IG51bWJlcjtcbiAgfSB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBFbWl0cyB0cnVlIHdoaWxlIGEgaGVhdnkgT0JKIGZpbGUgaXMgYmVpbmcgcGFyc2VkIChpbiBhIHdvcmtlciwgd2hlbiBhdmFpbGFibGUpLCBmYWxzZSBvbmNlIGRvbmUuICovXG4gIHB1YmxpYyBtb2RlbExvYWRpbmckID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcblxuICAvKipcbiAgICogRG93bmxvYWQgcHJvZ3Jlc3MgZm9yIEdMQiBtb2RlbHMsIGFzIGEgMC0xIGZyYWN0aW9uLCBvciBudWxsIHdoZW4gdGhlIHRvdGFsIHNpemUgaXMgdW5rbm93bi5cbiAgICpcbiAgICogQSBudWxsIG1lYW5zIHRoZSBzZXJ2ZXIgZGlkIG5vdCBzZW5kIENvbnRlbnQtTGVuZ3RoIChjaHVua2VkIHJlc3BvbnNlcywgc29tZSBwcm94aWVzKSBhbmQgbm9cbiAgICogcGVyY2VudGFnZSBjYW4gYmUgZGVyaXZlZDsgc2hvdyBhbiBpbmRldGVybWluYXRlIGluZGljYXRvciByYXRoZXIgdGhhbiBndWVzc2luZyBhdCBvbmUuXG4gICAqL1xuICBwdWJsaWMgbW9kZWxMb2FkUHJvZ3Jlc3MkID0gbmV3IFN1YmplY3Q8bnVtYmVyIHwgbnVsbD4oKTtcblxuICAvKipcbiAgICogRW1pdHMgd2hlbiBhIGxvYWQgYWN0dWFsbHkgc3RvcHBlZCBzaG9ydCwgd2hpY2ggaXMgbm90IHRoZSBzYW1lIGFzIGFza2luZyBpdCB0by5cbiAgICpcbiAgICogY2FuY2VsTW9kZWxMb2FkKCkgY2FuIGFycml2ZSBhZnRlciBwYXJzZSgpIGhhcyB0YWtlbiB0aGUgbWFpbiB0aHJlYWQsIGFuZCBwYXJzZSBjYW5ub3QgYmVcbiAgICogaW50ZXJydXB0ZWQgLSB0aGUgbW9kZWwgZmluaXNoZXMgbG9hZGluZyByZWdhcmRsZXNzLiBPbmx5IHRoaXMgdGVsbHMgdGhlIFVJIHdoaWNoIG9mIHRoZSB0d29cbiAgICogaGFwcGVuZWQsIHNvIGl0IGRvZXMgbm90IG9mZmVyIHRvIHJlbG9hZCBzb21ldGhpbmcgdGhhdCBpcyBhbHJlYWR5IG9uIHNjcmVlbi5cbiAgICovXG4gIHB1YmxpYyBtb2RlbExvYWRDYW5jZWxsZWQkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAvLyBCYWNrZ3JvdW5kIHBhcnNpbmcgb2YgaGVhdnkgLm9iaiBmaWxlcywgcHJvdmlkZWQgYnkgdGhlIGhvc3RpbmcgYXBwIChzZWUgc2V0T2JqUGFyc2VyV29ya2VyKS5cbiAgLy8gQW5ndWxhciBsaWJyYXJpZXMgYnVpbHQgd2l0aCBuZy1wYWNrYWdyIGNhbid0IGJ1bmRsZSBgbmV3IFdvcmtlcihuZXcgVVJMKC4uLikpYCB0aGVtc2VsdmVzLFxuICAvLyBzbyB0aGUgYXBwIGluc3RhbnRpYXRlcyB0aGUgd29ya2VyIChpdHMgYnVpbGQgcGlwZWxpbmUgc3VwcG9ydHMgaXQpIGFuZCBoYW5kcyBpdCBvdmVyIGhlcmUuXG4gIHByaXZhdGUgb2JqUGFyc2VyV29ya2VyPzogV29ya2VyO1xuICBwcml2YXRlIG9ialBhcnNlclBlbmRpbmdSZXF1ZXN0cyA9IG5ldyBNYXA8c3RyaW5nLCB7IHJlc29sdmU6IChtZXNoZXM6IFBhcnNlZE1lc2hEYXRhW10pID0+IHZvaWQ7IHJlamVjdDogKGVycm9yOiBFcnJvcikgPT4gdm9pZCB9PigpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgbmdab25lOiBOZ1pvbmUpIHsgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBXZWIgV29ya2VyIHVzZWQgdG8gcGFyc2UgaGVhdnkgLm9iaiBmaWxlcyBvZmYgdGhlIG1haW4gdGhyZWFkLlxuICAgKiBNdXN0IGJlIGluc3RhbnRpYXRlZCBieSB0aGUgY29uc3VtaW5nIGFwcCAoZS5nLiBgbmV3IFdvcmtlcihuZXcgVVJMKCcuL29iai1wYXJzZXIud29ya2VyJywgaW1wb3J0Lm1ldGEudXJsKSlgKSxcbiAgICogc2luY2UgYSBsaWJyYXJ5IHBhY2thZ2VkIHdpdGggbmctcGFja2FnciBjYW5ub3QgYnVuZGxlIHdvcmtlciBmaWxlcyBpdHNlbGYuXG4gICAqIFdoZW4gbm8gd29ya2VyIGlzIHByb3ZpZGVkLCBsb2FkT2JqTW9kZWwgZmFsbHMgYmFjayB0byBwYXJzaW5nIG9uIHRoZSBtYWluIHRocmVhZC5cbiAgICovXG4gIHNldE9ialBhcnNlcldvcmtlcih3b3JrZXI6IFdvcmtlcik6IHZvaWQge1xuICAgIHRoaXMub2JqUGFyc2VyV29ya2VyID0gd29ya2VyO1xuICAgIHRoaXMub2JqUGFyc2VyV29ya2VyLm9ubWVzc2FnZSA9ICh7IGRhdGEgfTogTWVzc2FnZUV2ZW50PE9ialBhcnNlcldvcmtlclJlc3BvbnNlPikgPT4ge1xuICAgICAgY29uc3QgcGVuZGluZyA9IHRoaXMub2JqUGFyc2VyUGVuZGluZ1JlcXVlc3RzLmdldChkYXRhLnJlcXVlc3RJZCk7XG4gICAgICBpZiAoIXBlbmRpbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5vYmpQYXJzZXJQZW5kaW5nUmVxdWVzdHMuZGVsZXRlKGRhdGEucmVxdWVzdElkKTtcbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MgJiYgZGF0YS5tZXNoZXMpIHtcbiAgICAgICAgcGVuZGluZy5yZXNvbHZlKGRhdGEubWVzaGVzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlbmRpbmcucmVqZWN0KG5ldyBFcnJvcihkYXRhLmVycm9yIHx8ICdVbmtub3duIGVycm9yIHdoaWxlIHBhcnNpbmcgT0JKIGZpbGUgaW4gd29ya2VyJykpO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHJlcXVlc3RPYmpQYXJzZUluV29ya2VyKG9ialVybDogc3RyaW5nKTogUHJvbWlzZTxQYXJzZWRNZXNoRGF0YVtdPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IHJlcXVlc3RJZCA9IGAke0RhdGUubm93KCl9LSR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMil9YDtcbiAgICAgIHRoaXMub2JqUGFyc2VyUGVuZGluZ1JlcXVlc3RzLnNldChyZXF1ZXN0SWQsIHsgcmVzb2x2ZSwgcmVqZWN0IH0pO1xuICAgICAgdGhpcy5vYmpQYXJzZXJXb3JrZXIhLnBvc3RNZXNzYWdlKHsgcmVxdWVzdElkLCBvYmpVcmwgfSk7XG4gICAgICAvLyBEaWFnbm9zdGljIG9ubHk6IGxhcmdlIG1vZGVscyBsZWdpdGltYXRlbHkgdGFrZSBhIHdoaWxlLCB0aGlzIGlzbid0IGEgdGltZW91dC9hYm9ydCxcbiAgICAgIC8vIGp1c3QgYSBzaWduYWwgaW4gY2FzZSB0aGUgd29ya2VyIHdlbnQgc2lsZW50IChlLmcuIGl0IHJhbiBvdXQgb2YgbWVtb3J5IG1pZC1wYXJzZSkuXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMub2JqUGFyc2VyUGVuZGluZ1JlcXVlc3RzLmhhcyhyZXF1ZXN0SWQpKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGBUaHJlZUpzU2VydmljZTogb2JqLXBhcnNlciB3b3JrZXIgaGFzIG5vdCByZXBsaWVkIGFmdGVyIDYwcyBmb3IgcmVxdWVzdCAke3JlcXVlc3RJZH0gKG9ialVybD0ke29ialVybH0pLiBTdGlsbCB3YWl0aW5nIC0gbGFyZ2UgZmlsZXMgY2FuIHRha2UgYSB3aGlsZSwgYnV0IHRoaXMgbWF5IGFsc28gbWVhbiB0aGUgd29ya2VyIGh1bmcgb3IgcmFuIG91dCBvZiBtZW1vcnkuYCk7XG4gICAgICAgIH1cbiAgICAgIH0sIDYwMDAwKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBSZWJ1aWxkcyBhIFRIUkVFLk1lc2ggZnJvbSB0aGUgcmF3IHR5cGVkIGFycmF5cyBzZW50IGJhY2sgYnkgdGhlIHBhcnNlciB3b3JrZXIuICovXG4gIHByaXZhdGUgbWVzaEZyb21QYXJzZWREYXRhKGRhdGE6IFBhcnNlZE1lc2hEYXRhLCBtYXRlcmlhbHM/OiBhbnkpOiBUSFJFRS5NZXNoIHtcbiAgICBjb25zdCBnZW9tZXRyeSA9IG5ldyBUSFJFRS5CdWZmZXJHZW9tZXRyeSgpO1xuICAgIGdlb21ldHJ5LnNldEF0dHJpYnV0ZSgncG9zaXRpb24nLCBuZXcgVEhSRUUuQnVmZmVyQXR0cmlidXRlKGRhdGEucG9zaXRpb24sIDMpKTtcbiAgICBpZiAoZGF0YS51dikge1xuICAgICAgZ2VvbWV0cnkuc2V0QXR0cmlidXRlKCd1dicsIG5ldyBUSFJFRS5CdWZmZXJBdHRyaWJ1dGUoZGF0YS51diwgMikpO1xuICAgIH1cbiAgICAvLyBJbmRleCBoYXMgdG8gYmUgc2V0IGJlZm9yZSBhbnkgbm9ybWFsIGNvbXB1dGF0aW9uLCB3aGljaCByZWFkcyBpdCB0byBhdmVyYWdlIHNoYXJlZCBmYWNlcy5cbiAgICBpZiAoZGF0YS5pbmRleCkge1xuICAgICAgZ2VvbWV0cnkuc2V0SW5kZXgobmV3IFRIUkVFLkJ1ZmZlckF0dHJpYnV0ZShkYXRhLmluZGV4LCAxKSk7XG4gICAgfVxuICAgIGlmIChkYXRhLm5vcm1hbCkge1xuICAgICAgZ2VvbWV0cnkuc2V0QXR0cmlidXRlKCdub3JtYWwnLCBuZXcgVEhSRUUuQnVmZmVyQXR0cmlidXRlKGRhdGEubm9ybWFsLCAzKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdlb21ldHJ5LmNvbXB1dGVWZXJ0ZXhOb3JtYWxzKCk7XG4gICAgfVxuICAgIC8vIEJveDMuc2V0RnJvbU9iamVjdCgpIHJldXNlcyBhbiBhbHJlYWR5LXNldCBib3VuZGluZ0JveCBpbnN0ZWFkIG9mIHdhbGtpbmcgZXZlcnkgdmVydGV4LFxuICAgIC8vIHNvIGFkb3B0aW5nIHRoZSB3b3JrZXIncyBtYWtlcyBmcmFtaW5nIHRoZSBjYW1lcmEgY2hlYXAgbm8gbWF0dGVyIGhvdyBkZW5zZSB0aGUgbWVzaCBpcy5cbiAgICBpZiAoZGF0YS5ib3VuZGluZ0JveCkge1xuICAgICAgZ2VvbWV0cnkuYm91bmRpbmdCb3ggPSBuZXcgVEhSRUUuQm94MyhcbiAgICAgICAgbmV3IFRIUkVFLlZlY3RvcjMoLi4uZGF0YS5ib3VuZGluZ0JveC5taW4pLFxuICAgICAgICBuZXcgVEhSRUUuVmVjdG9yMyguLi5kYXRhLmJvdW5kaW5nQm94Lm1heCksXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc29sdmVkTWF0ZXJpYWxzID0gZGF0YS5tYXRlcmlhbE5hbWVzLm1hcCgobmFtZSkgPT4ge1xuICAgICAgY29uc3QgbWF0ZXJpYWwgPSBtYXRlcmlhbHMgJiYgbmFtZSA/IG1hdGVyaWFscy5jcmVhdGUobmFtZSkgOiB1bmRlZmluZWQ7XG4gICAgICBpZiAoIW1hdGVyaWFsKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgVGhyZWVKc1NlcnZpY2U6IG5vIE1UTCBtYXRlcmlhbCBuYW1lZCBcIiR7bmFtZX1cIiBmb3IgbWVzaCBcIiR7ZGF0YS5uYW1lfVwiLCB1c2luZyBhIHBsYWluIGZhbGxiYWNrIChubyB0ZXh0dXJlKS5gKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBtYXRlcmlhbCB8fCBuZXcgVEhSRUUuTWVzaFBob25nTWF0ZXJpYWwoKTtcbiAgICB9KTtcblxuICAgIGxldCBtZXNoOiBUSFJFRS5NZXNoO1xuICAgIGlmIChkYXRhLmdyb3VwcyAmJiBkYXRhLmdyb3Vwcy5sZW5ndGggPiAwKSB7XG4gICAgICBkYXRhLmdyb3Vwcy5mb3JFYWNoKChncm91cCkgPT4gZ2VvbWV0cnkuYWRkR3JvdXAoZ3JvdXAuc3RhcnQsIGdyb3VwLmNvdW50LCBncm91cC5tYXRlcmlhbEluZGV4KSk7XG4gICAgICBtZXNoID0gbmV3IFRIUkVFLk1lc2goZ2VvbWV0cnksIHJlc29sdmVkTWF0ZXJpYWxzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbWVzaCA9IG5ldyBUSFJFRS5NZXNoKGdlb21ldHJ5LCByZXNvbHZlZE1hdGVyaWFsc1swXSk7XG4gICAgfVxuICAgIG1lc2gubmFtZSA9IGRhdGEubmFtZTtcbiAgICByZXR1cm4gbWVzaDtcbiAgfVxuXG4gIGluaXQoY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCk6IHZvaWQge1xuICAgIC8vIFRoaXMgc2VydmljZSBpcyBhIHNpbmdsZXRvbiBidXQgdGhlIHZpZXdlciBjb21wb25lbnQgaXMgcmVidWlsdCBvbiBldmVyeSBuYXZpZ2F0aW9uLCBzbyBzdGF0ZVxuICAgIC8vIGZyb20gdGhlIHByZXZpb3VzIHNjZW5lIGlzIHN0aWxsIGhlcmUuIFR3byB0aGluZ3Mgb3V0bGl2ZSBpdCBhbmQgaGF2ZSB0byBnbyBmaXJzdDpcbiAgICAvL1xuICAgIC8vICAtIEEgZG93bmxvYWQgc3RpbGwgaW4gZmxpZ2h0LiBJdHMgb25Mb2FkZWQgcmVzb2x2ZXMgYWdhaW5zdCB3aGF0ZXZlciBgdGhpcy5zY2VuZWAgcG9pbnRzIGF0XG4gICAgLy8gICAgYnkgdGhlbiwgc28gdGhlIG1vZGVsIGJlaW5nIGFiYW5kb25lZCB3b3VsZCBiZSBoYW5kZWQgdG8gdGhlIHNjZW5lIGJ1aWx0IGJlbG93LlxuICAgIC8vICAtIFRoZSB0YWcgZ3JvdXAsIHdoaWNoIGlzIGEgZmllbGQgYW5kIGtlZXBzIGl0cyBzcHJpdGVzLiBUaGV5IHdvdWxkIGJlIHJlLXBhcmVudGVkIHVuZGVyIHRoZVxuICAgIC8vICAgIG5ldyBtb2RlbCBhbmQgc2hvdyB0aGUgcHJldmlvdXMgdmlzaXQncyB0YWdzIG9uIGl0LlxuICAgIC8vIFVzdWFsbHkgZGVzdHJveSgpIHJhbiBiZWZvcmUgdGhpcyBhbmQgdGhlcmUgaXMgbm90aGluZyBsZWZ0IHRvIHN0b3AuIFdoZW4gaXQgZGlkIG5vdCwgdGhlXG4gICAgLy8gc2NlbmUgYmVmb3JlIHdvdWxkIGNhcnJ5IG9uIGJlc2lkZSB0aGUgb25lIHN0YXJ0ZWQgYmVsb3c6IGl0cyByZW5kZXIgbG9vcCBkcmF3aW5nIGV2ZXJ5XG4gICAgLy8gZnJhbWUgYXMgd2VsbCwgaXRzIG1vZGVsIHN0aWxsIG9uIHRoZSBncmFwaGljcyBjYXJkLCBpdHMgbGlzdGVuZXJzIGFuc3dlcmluZyBldmVyeSBjbGljayBhXG4gICAgLy8gc2Vjb25kIHRpbWUuXG4gICAgaWYgKHRoaXMubGl2ZSkge1xuICAgICAgdGhpcy5kZXN0cm95KCk7XG4gICAgfVxuICAgIHRoaXMuZGlzY2FyZEN1cnJlbnRMb2FkKCk7XG4gICAgdGhpcy5jbGVhclRhZ3MoKTtcbiAgICB0aGlzLm1lYXN1cmluZyA9IGZhbHNlO1xuICAgIHRoaXMuY2xlYXJNZWFzdXJlbWVudCgpO1xuICAgIC8vIEEgY2FsaWJyYXRpb24gbGVmdCBoYWxmLWRvbmUgYmVsb25ncyB0byB0aGUgc2NlbmUgaXQgd2FzIHN0YXJ0ZWQgaW46IGl0cyBwb2ludHMgbWVhbiBub3RoaW5nXG4gICAgLy8gaW4gdGhlIG5leHQgb25lLCBhbmQgbGVmdCBhcm1lZCBpdCB3b3VsZCB0YWtlIHRoYXQgc2NlbmUncyBmaXJzdCBjbGlja3MgZm9yIGl0c2VsZi5cbiAgICB0aGlzLmFsaWduaW5nID0gZmFsc2U7XG4gICAgdGhpcy5yZXZlYWxpbmdDYWxpYnJhdGlvblRhZ3MgPSBmYWxzZTtcbiAgICB0aGlzLnNvbGVWaXNpdCA9IGZhbHNlO1xuICAgIHRoaXMuYWxpZ25tZW50UGFpcnMgPSBbXTtcbiAgICB0aGlzLmNsZWFyQWxpZ25tZW50U291cmNlKCk7XG4gICAgdGhpcy5jbGVhckNhbGlicmF0aW9uTWFya3MoKTtcbiAgICB0aGlzLnB1bHNlcyA9IFtdO1xuICAgIHRoaXMuY2FtZXJhVHdlZW4gPSBudWxsO1xuXG4gICAgLy8gMS4gU2V0dXAgU2NlbmVcbiAgICB0aGlzLnNjZW5lID0gbmV3IFRIUkVFLlNjZW5lKCk7XG4gICAgdGhpcy5zY2VuZS5iYWNrZ3JvdW5kID0gbmV3IFRIUkVFLkNvbG9yKHZpZXdlckJhY2tncm91bmQoY2FudmFzKSk7XG5cbiAgICAvLyAyLiBTZXR1cCBDYW1lcmFcbiAgICB0aGlzLmNhbWVyYSA9IG5ldyBUSFJFRS5QZXJzcGVjdGl2ZUNhbWVyYSg3NSwgY2FudmFzLmNsaWVudFdpZHRoIC8gY2FudmFzLmNsaWVudEhlaWdodCwgMC4xLCAxMDAwMCk7XG4gICAgdGhpcy5jYW1lcmEucG9zaXRpb24uc2V0KDAsIDUsIDEwKTsgLy8gd2lsbCBiZSBvdmVycmlkZGVuIGxhdGVyIGlmIHBhc3NlZFxuXG4gICAgLy8gMy4gU2V0dXAgV2ViR0wgUmVuZGVyZXJcbiAgICB0aGlzLnJlbmRlcmVyID0gbmV3IFRIUkVFLldlYkdMUmVuZGVyZXIoeyBjYW52YXMsIGFudGlhbGlhczogdHJ1ZSB9KTtcbiAgICB0aGlzLnJlbmRlcmVyLnNldFNpemUoY2FudmFzLmNsaWVudFdpZHRoLCBjYW52YXMuY2xpZW50SGVpZ2h0KTtcbiAgICB0aGlzLnJlbmRlcmVyLnNldFBpeGVsUmF0aW8oTWF0aC5taW4od2luZG93LmRldmljZVBpeGVsUmF0aW8sIDEuNSkpO1xuICAgIHRoaXMub2JzZXJ2ZUNhbnZhc1Jlc2l6ZShjYW52YXMpO1xuICAgIFxuICAgIC8vIEZpeCBmb3IgVGhyZWUuanMgcjE0NyB2cyByMTUyKyBjb2xvciBtYW5hZ2VtZW50XG4gICAgaWYgKCdvdXRwdXRDb2xvclNwYWNlJyBpbiB0aGlzLnJlbmRlcmVyKSB7XG4gICAgICAodGhpcy5yZW5kZXJlciBhcyBhbnkpLm91dHB1dENvbG9yU3BhY2UgPSAnc3JnYic7IC8vIFRIUkVFLlNSR0JDb2xvclNwYWNlXG4gICAgfSBlbHNlIHtcbiAgICAgICh0aGlzLnJlbmRlcmVyIGFzIGFueSkub3V0cHV0RW5jb2RpbmcgPSAzMDAxOyAvLyBUSFJFRS5zUkdCRW5jb2RpbmdcbiAgICB9XG5cbiAgICAvLyBXaXRob3V0IHRvbmUgbWFwcGluZyBhbnl0aGluZyBicmlnaHRlciB0aGFuIDEuMCBpcyBzaW1wbHkgY3V0IG9mZiB0byBwdXJlIHdoaXRlLiBDYXB0dXJlZFxuICAgIC8vIHRleHR1cmVzIGNhcnJ5IGEgc21hbGwgZnJhY3Rpb24gb2YgdmVyeSBicmlnaHQgcGl4ZWxzIC0gc2t5IHJlZmxlY3RlZCBpbiB3aW5kb3dzLCBzdW5saXRcbiAgICAvLyByZW5kZXIgLSBhbmQgb25jZSBsaWdodGluZyBwdXNoZXMgdGhvc2UgcGFzdCB0aGUgbGltaXQgdGhleSBmbGF0dGVuIGludG8gd2hpdGUgc3BlY2tzIHdpdGhcbiAgICAvLyBubyBkZXRhaWwgbGVmdC4gUm9sbGluZyB0aGUgaGlnaGxpZ2h0cyBvZmYgaW5zdGVhZCBrZWVwcyB0aGF0IGRldGFpbCBhbmQga2VlcHMgYnJpZ2h0IGFyZWFzXG4gICAgLy8gcmVhZGluZyBhcyBicmlnaHQgcmF0aGVyIHRoYW4gYmxvd24uXG4gICAgdGhpcy5yZW5kZXJlci50b25lTWFwcGluZyA9IFRIUkVFLkFDRVNGaWxtaWNUb25lTWFwcGluZztcbiAgICB0aGlzLnJlbmRlcmVyLnRvbmVNYXBwaW5nRXhwb3N1cmUgPSAxLjA7XG5cbiAgICAvLyA0LiBMaWdodGluZywga2VwdCBkZWxpYmVyYXRlbHkgcmVzdHJhaW5lZCBhbmQgbmV1dHJhbC5cbiAgICAvL1xuICAgIC8vIENhcHR1cmVkL3Bob3RvZ3JhbW1ldHJ5IG1vZGVscyBhbHJlYWR5IGhhdmUgbGlnaHRpbmcgYmFrZWQgaW50byB0aGVpciB0ZXh0dXJlcyAodGhlIHN1biBhbmRcbiAgICAvLyBzaGFkb3dzIGNhbWUgd2l0aCB0aGUgcGhvdG9zKSwgc28gbGlnaHRpbmcgdGhlbSBhZ2FpbiBkaXN0b3J0cyB3aGF0IHRoZXkgYWN0dWFsbHkgbG9vayBsaWtlLlxuICAgIC8vIFRoZSBpbnRlbnNpdGllcyBiZWxvdyBhZGQgdXAgdG8gcm91Z2hseSAxLjAgb24gYSBzdXJmYWNlIGZhY2luZyB0aGUgdmlld2VyLCB3aGljaCByZW5kZXJzIHRoZVxuICAgIC8vIHRleHR1cmUgYXQgaXRzIHRydWUgdmFsdWUuIEFueXRoaW5nIGFib3ZlIDEuMCBpcyBjbGlwcGVkIHRvIHB1cmUgd2hpdGUgYnkgdGhlIHJlbmRlcmVyLCB3aGljaFxuICAgIC8vIGlzIHdoYXQgdHVybnMgYnJpZ2h0IGFyZWFzIGludG8gZmxhdCB3aGl0ZSBwYXRjaGVzIHdpdGggbm8gZGV0YWlsIGxlZnQgaW4gdGhlbS5cbiAgICAvL1xuICAgIC8vIE5ldXRyYWwgd2hpdGUgaXMgdXNlZCByYXRoZXIgdGhhbiBhIHdhcm0gdGludCBmb3IgdGhlIHNhbWUgcmVhc29uOiBhIHRpbnRlZCBsaWdodCBzaGlmdHMgZXZlcnlcbiAgICAvLyBjb2xvdXIgaW4gdGhlIG1vZGVsIGF3YXkgZnJvbSB3aGF0IHdhcyBjYXB0dXJlZC5cbiAgICBjb25zdCBhbWJpZW50TGlnaHQgPSBuZXcgVEhSRUUuQW1iaWVudExpZ2h0KDB4ZmZmZmZmLCAwLjcpO1xuICAgIHRoaXMuc2NlbmUuYWRkKGFtYmllbnRMaWdodCk7XG5cbiAgICAvLyBIZWFkbGlnaHQgcmF0aGVyIHRoYW4gYSBmaXhlZCBzdW46IHBhcmVudGVkIHRvIHRoZSBjYW1lcmEgc28gaXQgYWx3YXlzIHBvaW50cyBhdCB3aGF0ZXZlciBpc1xuICAgIC8vIGJlaW5nIGxvb2tlZCBhdCwgZ2l2aW5nIHNoYXBlIHRvIHN1cmZhY2VzIHdpdGhvdXQgZXZlciBsZWF2aW5nIGEgZmFjZSB1bmxpdC4gTm8gc2hhZG93IGNhc3RpbmdcbiAgICAvLyAtIHNoYWRvd3Mgd291bGQgZG91YmxlIHVwIHdpdGggdGhlIG9uZXMgYWxyZWFkeSBiYWtlZCBpbnRvIHRoZSB0ZXh0dXJlcywgYW5kIHRoZSBzaGFkb3cgbWFwXG4gICAgLy8gd2FzIGEgcmVhbCBjb3N0IHBlciBmcmFtZS5cbiAgICBjb25zdCBoZWFkTGlnaHQgPSBuZXcgVEhSRUUuRGlyZWN0aW9uYWxMaWdodCgweGZmZmZmZiwgMC4zNSk7XG4gICAgaGVhZExpZ2h0LnBvc2l0aW9uLnNldCgwLCAwLCAxKTtcbiAgICB0aGlzLmNhbWVyYS5hZGQoaGVhZExpZ2h0KTtcbiAgICAvLyBBIGxpZ2h0IG9ubHkgY29udHJpYnV0ZXMgd2hpbGUgaXQgaXMgcGFydCBvZiB0aGUgc2NlbmUgZ3JhcGgsIGFuZCB0aGlzIG9uZSBoYW5ncyBvZmYgdGhlIGNhbWVyYS5cbiAgICB0aGlzLnNjZW5lLmFkZCh0aGlzLmNhbWVyYSk7XG5cbiAgICAvLyA1LiBTZXR1cCBDb250cm9scyAoZnJvbSBQT0MpXG4gICAgLy9cbiAgICAvLyBDcmVhdGVkIG91dHNpZGUgQW5ndWxhcidzIHpvbmUsIGFzIGlzIHRoZSBwb2ludGVyLW1vdmUgbGlzdGVuZXIgZnVydGhlciBkb3duLiBUaGUgY29udHJvbHNcbiAgICAvLyBsaXN0ZW4gdG8gZXZlcnkgcG9pbnRlciBtb3ZlIGFuZCB3aGVlbCB0aWNrLCBhbmQgaW5zaWRlIHRoZSB6b25lIGVhY2ggb2YgdGhvc2UgZXZlbnRzIGhhZFxuICAgIC8vIEFuZ3VsYXIgcmUtY2hlY2sgdGhlIHdob2xlIHBhZ2UgLSBkb3plbnMgb2YgdGltZXMgYSBzZWNvbmQgd2hpbGUgdGhlIGNhbWVyYSBpcyBkcmFnZ2VkLFxuICAgIC8vIGNvbXBldGluZyB3aXRoIHRoZSBmcmFtZXMgYmVpbmcgZHJhd24gLSBmb3IgYSBjaGFuZ2UgdGhhdCBvbmx5IGV2ZXIgY29uY2VybnMgdGhlIGNhbnZhcy5cbiAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICB0aGlzLmNvbnRyb2xzID0gbmV3IE9yYml0Q29udHJvbHModGhpcy5jYW1lcmEsIHRoaXMucmVuZGVyZXIuZG9tRWxlbWVudCk7XG4gICAgfSk7XG4gICAgdGhpcy5jb250cm9scy5yb3RhdGVTcGVlZCA9IDEuMDtcbiAgICB0aGlzLmNvbnRyb2xzLmRhbXBpbmdGYWN0b3IgPSAwLjE7XG4gICAgdGhpcy5jb250cm9scy5lbmFibGVEYW1waW5nID0gdHJ1ZTtcbiAgICB0aGlzLmNvbnRyb2xzLm1vdXNlQnV0dG9ucyA9IHtcbiAgICAgIExFRlQ6IFRIUkVFLk1PVVNFLlJPVEFURSxcbiAgICAgIE1JRERMRTogVEhSRUUuTU9VU0UuRE9MTFksXG4gICAgICBSSUdIVDogVEhSRUUuTU9VU0UuUEFOLFxuICAgIH07XG4gICAgdGhpcy5jb250cm9scy50YXJnZXQuc2V0KDAsIDAsIDApO1xuXG4gICAgLy8gRXZlbnQgbGlzdGVuZXJzIG9uIGNvbnRyb2xzIHRvIGRpZmZlcmVudGlhdGUgZHJhZ2dpbmcgdnMgY2xpY2tpbmdcbiAgICB0aGlzLmNvbnRyb2xzLmFkZEV2ZW50TGlzdGVuZXIoJ3N0YXJ0JywgKCkgPT4ge1xuICAgICAgdGhpcy5pc0RyYWdnaW5nVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5pc0RyYWdnaW5nQ2FtZXJhID0gdHJ1ZTtcbiAgICAgIH0sIDE1MCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmNvbnRyb2xzLmFkZEV2ZW50TGlzdGVuZXIoJ2VuZCcsICgpID0+IHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLmlzRHJhZ2dpbmdUaW1lcik7XG4gICAgICBpZiAodGhpcy5pc0RyYWdnaW5nQ2FtZXJhKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuaXNEcmFnZ2luZ0NhbWVyYSA9IGZhbHNlO1xuICAgICAgICB9LCAyNTApO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gSW50ZXJhY3Rpb24gRXZlbnQgTGlzdGVuZXJzIG9uIGNhbnZhcy4gS2VwdCBzbyB0aGF0IGRlc3Ryb3koKSBjYW4gdGFrZSB0aGVtIG9mZiBhZ2FpbjogdGhlXG4gICAgLy8gc2FtZSBjYW52YXMgaXMgdXNlZCBhZ2FpbiB3aGVuIG9uZSAzRCBtb2RlbCBpcyBzd2FwcGVkIGZvciBhbm90aGVyLCBhbmQgYSBzZWNvbmQgc2V0IG9mXG4gICAgLy8gbGlzdGVuZXJzIHdvdWxkIGFuc3dlciBldmVyeSBjbGljayB0d2ljZS5cbiAgICBjb25zdCBsaXN0ZW4gPSAodHlwZTogc3RyaW5nLCBoYW5kbGVyOiAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHZvaWQpID0+IHtcbiAgICAgIGNhbnZhcy5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGhhbmRsZXIgYXMgRXZlbnRMaXN0ZW5lciwgZmFsc2UpO1xuICAgICAgdGhpcy5jYW52YXNMaXN0ZW5lcnMucHVzaCgoKSA9PiBjYW52YXMucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBoYW5kbGVyIGFzIEV2ZW50TGlzdGVuZXIsIGZhbHNlKSk7XG4gICAgfTtcbiAgICAvLyBBIGNsaWNrIGNoYW5nZXMgd2hhdCB0aGUgcGFnZSBzaG93cyAtIGEgcGFuZWwgb3BlbnMsIGEgcG9pbnQgaXMgcmVjb3JkZWQgLSBzbyBBbmd1bGFyIGhhcyB0b1xuICAgIC8vIGhlYXIgb2YgaXQsIHdoZXJldmVyIGluaXQoKSBpdHNlbGYgd2FzIGNhbGxlZCBmcm9tLlxuICAgIGxpc3RlbignY2xpY2snLCAoZXZlbnQpID0+IHRoaXMubmdab25lLnJ1bigoKSA9PiB0aGlzLm9uTW91c2VDbGljayhldmVudCkpKTtcbiAgICAvLyBNb3ZpbmcgdGhlIHBvaW50ZXIgZG9lcyBub3Q6IGl0IG1vdmVzIHRoZSBnaG9zdCBhbmQgdGhlIHRvb2x0aXAsIGJvdGggZHJhd24gaGVyZS5cbiAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiBsaXN0ZW4oJ21vdXNlbW92ZScsIChldmVudCkgPT4gdGhpcy5vbk1vdXNlTW92ZShldmVudCkpKTtcblxuICAgIC8vIEVzY2FwZSBiYWNrcyBvdXQgb2YgcGxhY2VtZW50IGFuZCBjYWxpYnJhdGlvbi4gT24gdGhlIHdpbmRvdyByYXRoZXIgdGhhbiB0aGUgY2FudmFzLCB3aGljaFxuICAgIC8vIHdvdWxkIG5lZWQgZm9jdXMgdGhlIHVzZXIgaGFzIG5vIHJlYXNvbiB0byBoYXZlIGdpdmVuIGl0IC0gdGhleSBhcmUgYWltaW5nIHdpdGggdGhlIG1vdXNlLlxuICAgIC8vIFJlbW92ZWQgZmlyc3QgYmVjYXVzZSB0aGlzIHNlcnZpY2UgaXMgYSBzaW5nbGV0b246IGluaXQoKSBydW5zIGFnYWluIGZvciBldmVyeSBjYW52YXMsIGFuZFxuICAgIC8vIHRoZSBwcmV2aW91cyByZWdpc3RyYXRpb24gd291bGQgb3RoZXJ3aXNlIHN0aWxsIGJlIGF0dGFjaGVkLlxuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5vbktleURvd24pO1xuICAgIHRoaXMucGlja1RhcmdldD8uZGlzcG9zZSgpO1xuICAgIHRoaXMucGlja1RhcmdldCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnBpY2tEZXB0aE1hdGVyaWFsPy5kaXNwb3NlKCk7XG4gICAgdGhpcy5waWNrRGVwdGhNYXRlcmlhbCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnBpY2tDYW1lcmEgPSB1bmRlZmluZWQ7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLm9uS2V5RG93bik7XG5cbiAgICAvLyA2LiBTdGFydCB0aGUgcmVuZGVyIGxvb3BcbiAgICB0aGlzLmxpdmUgPSB0cnVlO1xuICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHRoaXMuYW5pbWF0ZSgpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhdGggKHNlcnZlZCBieSB0aGUgYXBwKSBob2xkaW5nIGJhc2lzX3RyYW5zY29kZXIuanMvLndhc20sIHdoaWNoIEtUWDJMb2FkZXIgbmVlZHMgdG8gdHVyblxuICAgKiBCYXNpcyBVbml2ZXJzYWwgdGV4dHVyZXMgaW50byB3aGF0ZXZlciBjb21wcmVzc2VkIGZvcm1hdCB0aGUgbG9jYWwgR1BVIGFjdHVhbGx5IHN1cHBvcnRzLlxuICAgKi9cbiAgcHJpdmF0ZSBrdHgyVHJhbnNjb2RlclBhdGggPSAnYXNzZXRzL2Jhc2lzLyc7XG5cbiAgLyoqIE92ZXJyaWRlcyB3aGVyZSB0aGUgQmFzaXMgdHJhbnNjb2RlciBmaWxlcyBhcmUgc2VydmVkIGZyb20uICovXG4gIHNldEt0eDJUcmFuc2NvZGVyUGF0aChwYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmt0eDJUcmFuc2NvZGVyUGF0aCA9IHBhdGg7XG4gIH1cblxuICAvKipcbiAgICogTG9hZHMgYSBiYXNlIDNEIG1vZGVsIGluIEdMVEYvR0xCIGZvcm1hdCAtIHRoZSBwcmVmZXJyZWQgZm9ybWF0IGZvciBsYXJnZSBtb2RlbHMuXG4gICAqIFVubGlrZSAub2JqLCBnZW9tZXRyeSBhcnJpdmVzIGFzIGJpbmFyeSB0eXBlZCBhcnJheXMgKG5vIHRleHQgcGFyc2luZyB0byBvZmZsb2FkIHRvIGEgd29ya2VyKVxuICAgKiBhbmQgc3RheXMgaW5kZXhlZCwgc28gZmFyIGxlc3MgZGF0YSByZWFjaGVzIHRoZSBHUFUuIEtUWDIgdGV4dHVyZXMgYXJlIHN1cHBvcnRlZCB0b286IHRoZXlcbiAgICogc3RheSBjb21wcmVzc2VkIGluIFZSQU0gaW5zdGVhZCBvZiBiZWluZyBkZWNvZGVkIHRvIHJhdyBwaXhlbHMgbGlrZSBKUEVHL1BORy5cbiAgICovXG4gIGxvYWRHTFRGTW9kZWwodXJsOiBzdHJpbmcsIGNhbWVyYVBvc2l0aW9uPzoge3g6IG51bWJlciwgeTogbnVtYmVyLCB6OiBudW1iZXJ9LCByb3RhdGlvbj86IHt4OiBudW1iZXIsIHk6IG51bWJlciwgejogbnVtYmVyfSwgY2FjaGVLZXk/OiBzdHJpbmcsIHVwPzogVGhyZWVKc01vZGVsVXApOiB2b2lkIHtcbiAgICBjb25zdCBsb2FkZXIgPSBuZXcgR0xURkxvYWRlcigpO1xuXG4gICAgLy8gS1RYMiBuZWVkcyB0aGUgcmVuZGVyZXIgdG8gcmVwb3J0IHdoaWNoIGNvbXByZXNzZWQgZm9ybWF0cyB0aGlzIEdQVSBhY2NlcHRzLCBzbyB0aGlzIGhhcyB0b1xuICAgIC8vIGhhcHBlbiBhZnRlciBpbml0KCkuIEd1YXJkZWQgc28gYSBtb2RlbCB3aXRob3V0IEtUWDIgdGV4dHVyZXMgc3RpbGwgbG9hZHMgaWYgaXQncyBtaXNzaW5nLlxuICAgIGlmICh0aGlzLnJlbmRlcmVyKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBrdHgyTG9hZGVyID0gbmV3IEtUWDJMb2FkZXIoKVxuICAgICAgICAgIC5zZXRUcmFuc2NvZGVyUGF0aCh0aGlzLmt0eDJUcmFuc2NvZGVyUGF0aClcbiAgICAgICAgICAuZGV0ZWN0U3VwcG9ydCh0aGlzLnJlbmRlcmVyKTtcbiAgICAgICAgbG9hZGVyLnNldEtUWDJMb2FkZXIoa3R4MkxvYWRlcik7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1RocmVlSnNTZXJ2aWNlOiBjb3VsZCBub3Qgc2V0IHVwIEtUWDIgdGV4dHVyZSBzdXBwb3J0LCBmYWxsaW5nIGJhY2sgdG8gdW5jb21wcmVzc2VkIHRleHR1cmVzLicsIGVycm9yKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gTGV0cyBnbHRmcGFjay9nbHRmLXRyYW5zZm9ybSBvdXRwdXQgdXNpbmcgRVhUX21lc2hvcHRfY29tcHJlc3Npb24gbG9hZCB3aXRob3V0IGV4dHJhIHNldHVwLlxuICAgIGxvYWRlci5zZXRNZXNob3B0RGVjb2RlcihNZXNob3B0RGVjb2Rlcik7XG5cbiAgICBjb25zdCB3YW50ZWQgPSB0aGlzLmJlZ2luTG9hZCgpO1xuICAgIHRoaXMubW9kZWxMb2FkUHJvZ3Jlc3MkLm5leHQoMCk7XG5cbiAgICAvLyBPcmRlciBtYXR0ZXJzOiBub3JtYWxzIG11c3QgZXhpc3QgYmVmb3JlIGFuaXNvdHJvcHksIGFuZCB0aGUgUGhvbmcgY29udmVyc2lvbiBoYXMgdG8gcnVuXG4gICAgLy8gYmVmb3JlIHNpZGUvZmxhdFNoYWRpbmcgYXJlIHRvdWNoZWQgc28gdGhvc2Ugc2V0dGluZ3MgbGFuZCBvbiB0aGUgbWF0ZXJpYWxzIHdlIGtlZXAuXG4gICAgY29uc3Qgb25Mb2FkZWQgPSAoZ2x0ZjogYW55KSA9PiB7XG4gICAgICBpZiAoIXdhbnRlZCgpKSB7XG4gICAgICAgIC8vIEJ1aWx0IGZvciBhIHJlcXVlc3QgdGhhdCBoYXMgc2luY2UgYmVlbiByZXBsYWNlZCBvciBhYmFuZG9uZWQuIEl0IHdhcyBuZXZlciBvbiBzY3JlZW47XG4gICAgICAgIC8vIHdoYXQgaXQgaG9sZHMgaXMgZnJlZWQgaGVyZSBiZWNhdXNlIG5vdGhpbmcgZWxzZSBldmVyIHdpbGwuXG4gICAgICAgIHRoaXMuZGlzcG9zZU1vZGVsKGdsdGYuc2NlbmUpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLmNvbnZlcnRUb1Bob25nTWF0ZXJpYWxzKGdsdGYuc2NlbmUpO1xuICAgICAgdGhpcy5mb3JjZURvdWJsZVNpZGVkTWF0ZXJpYWxzKGdsdGYuc2NlbmUpO1xuICAgICAgdGhpcy5lbnN1cmVWZXJ0ZXhOb3JtYWxzKGdsdGYuc2NlbmUpO1xuICAgICAgdGhpcy50dW5lVGV4dHVyZVNhbXBsaW5nKGdsdGYuc2NlbmUpO1xuICAgICAgdGhpcy5wbGFjZUxvYWRlZE9iamVjdEluU2NlbmUoZ2x0Zi5zY2VuZSwgY2FtZXJhUG9zaXRpb24sIHJvdGF0aW9uLCB1cCk7XG4gICAgICB0aGlzLmVuZExvYWQoKTtcbiAgICB9O1xuICAgIGNvbnN0IG9uRXJyb3IgPSAoZXJyb3I6IGFueSkgPT4gdGhpcy5sb2FkRmFpbGVkKHdhbnRlZCwgZXJyb3IsICdHTFRGIG1vZGVsJyk7XG5cbiAgICAvLyBHTFRGTG9hZGVyIGRlY29kZXMgZW1iZWRkZWQgaW1hZ2VzIHdpdGggY3JlYXRlSW1hZ2VCaXRtYXAgd2hlbiB0aGUgYnJvd3NlciBvZmZlcnMgaXQsIGFuZCBvblxuICAgIC8vIGxhcmdlIHRleHR1cmUgYXRsYXNlcyB0aGF0IHBhdGggcmV0dXJucyB2aXNpYmx5IGNvcnJ1cHQgZGF0YSAtIHNjYXR0ZXJlZCB3aGl0ZSBibG9ja3MgYWNyb3NzXG4gICAgLy8gdGhlIG1vZGVsLiBUaGUgZXhhY3Qgc2FtZSBieXRlcyBkZWNvZGVkIHRocm91Z2ggYW4gSFRNTEltYWdlRWxlbWVudCwgd2hpY2ggaXMgd2hhdCB0aGUgLm9ialxuICAgIC8vIHBhdGggdXNlcyB2aWEgTVRMTG9hZGVyLCBjb21lIG91dCBjbGVhbi4gR0xURkxvYWRlciBhbHJlYWR5IGZhbGxzIGJhY2sgdG8gdGhhdCBkZWNvZGVyIGZvclxuICAgIC8vIFNhZmFyaSBhbmQgb2xkZXIgRmlyZWZveDsgdGhpcyBzaW1wbHkgZXh0ZW5kcyB0aGUgZmFsbGJhY2sgdG8gY292ZXIgdGhpcyBjYXNlIHRvby5cbiAgICAvL1xuICAgIC8vIFRoZSBkZWNvZGVyIGlzIGNob3NlbiB3aGlsZSBHTFRGUGFyc2VyIGlzIGJlaW5nIGNvbnN0cnVjdGVkLCB3aGljaCBoYXBwZW5zIHN5bmNocm9ub3VzbHlcbiAgICAvLyBpbnNpZGUgcGFyc2UoKSwgc28gaGlkaW5nIGNyZWF0ZUltYWdlQml0bWFwIG9ubHkgaGFzIHRvIGhvbGQgYWNyb3NzIHRoYXQgY2FsbCByYXRoZXIgdGhhblxuICAgIC8vIGZvciB0aGUgd2hvbGUgZG93bmxvYWQuXG4gICAgdGhpcy5mZXRjaFdpdGhQcm9ncmVzcyh1cmwsIGNhY2hlS2V5KVxuICAgICAgLy8gcGFyc2UoKSBob2xkcyB0aGUgbWFpbiB0aHJlYWQgZm9yIHNlY29uZHMgb24gYSBsYXJnZSBtb2RlbC4gWWllbGQgdW50aWwgdGhlIGJyb3dzZXIgaGFzXG4gICAgICAvLyBhY3R1YWxseSBwYWludGVkIGZpcnN0LCBvdGhlcndpc2UgdGhlIGZpbmFsIHByb2dyZXNzIHVwZGF0ZSBuZXZlciByZWFjaGVzIHRoZSBzY3JlZW4gYW5kXG4gICAgICAvLyB0aGUgYmFyIGFwcGVhcnMgdG8gc3RhbGwgc2hvcnQgb2YgdGhlIGVuZC5cbiAgICAgIC50aGVuKChidWZmZXIpID0+IHRoaXMuYWZ0ZXJOZXh0UGFpbnQoKS50aGVuKCgpID0+IGJ1ZmZlcikpXG4gICAgICAudGhlbigoYnVmZmVyKSA9PiB7XG4gICAgICAgIC8vIHBhcnNlKCkgY2Fubm90IGJlIGludGVycnVwdGVkLCBzbyBhIGNhbmNlbCB0aGF0IGxhbmRzIGR1cmluZyB0aGUgcGFpbnQgeWllbGQgaGFzIHRvIGJlXG4gICAgICAgIC8vIGNhdWdodCBoZXJlIC0gdGhlIGxhc3QgbW9tZW50IGJlZm9yZSB0aGUgbWFpbiB0aHJlYWQgaXMgY29tbWl0dGVkIGZvciBzZXZlcmFsIHNlY29uZHMuXG4gICAgICAgIC8vIFRoZSBzYW1lIGdvZXMgZm9yIGEgbG9hZCBub2JvZHkgaXMgd2FpdGluZyBmb3IgYW55IG1vcmUuXG4gICAgICAgIGlmICghd2FudGVkKCkgfHwgdGhpcy5sb2FkQWJvcnRDb250cm9sbGVyPy5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgICAgIHRocm93IG5ldyBET01FeGNlcHRpb24oJ01vZGVsIGxvYWQgY2FuY2VsbGVkJywgJ0Fib3J0RXJyb3InKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBnbG9iYWxTY29wZSA9IGdsb2JhbFRoaXMgYXMgYW55O1xuICAgICAgICBjb25zdCBvcmlnaW5hbENyZWF0ZUltYWdlQml0bWFwID0gZ2xvYmFsU2NvcGUuY3JlYXRlSW1hZ2VCaXRtYXA7XG4gICAgICAgIGdsb2JhbFNjb3BlLmNyZWF0ZUltYWdlQml0bWFwID0gdW5kZWZpbmVkO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGxvYWRlci5wYXJzZShidWZmZXIsIHVybC5zdWJzdHJpbmcoMCwgdXJsLmxhc3RJbmRleE9mKCcvJykgKyAxKSwgb25Mb2FkZWQsIG9uRXJyb3IpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIGdsb2JhbFNjb3BlLmNyZWF0ZUltYWdlQml0bWFwID0gb3JpZ2luYWxDcmVhdGVJbWFnZUJpdG1hcDtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIC5jYXRjaChvbkVycm9yKTtcbiAgfVxuXG4gIC8qKiBFbmRzIGEgbG9hZCB0aGF0IGZhaWxlZCwgdW5sZXNzIGFub3RoZXIgbG9hZCBoYXMgcmVwbGFjZWQgaXQgaW4gdGhlIG1lYW50aW1lLiAqL1xuICBwcml2YXRlIGxvYWRGYWlsZWQod2FudGVkOiAoKSA9PiBib29sZWFuLCBlcnJvcjogYW55LCB3aGF0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIXdhbnRlZCgpKSB7XG4gICAgICAvLyBXaGF0ZXZlciByZXBsYWNlZCB0aGlzIGxvYWQgb3ducyB0aGUgbG9hZGluZyBpbmRpY2F0b3Igbm93OyBlbmRpbmcgaXQgZnJvbSBoZXJlIHdvdWxkXG4gICAgICAvLyBzd2l0Y2ggdGhlIGluZGljYXRvciBvZmYgd2hpbGUgdGhhdCBvbmUgaXMgc3RpbGwgb24gaXRzIHdheS5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5sb2FkSW5Qcm9ncmVzcyA9IGZhbHNlO1xuICAgIC8vIENhbmNlbGxpbmcgaXMgYSBkZWNpc2lvbiwgbm90IGEgZmFpbHVyZTogY2xlYXIgdGhlIG92ZXJsYXkgd2l0aG91dCBhbiBlcnJvciBpbiB0aGUgY29uc29sZS5cbiAgICBpZiAoZXJyb3I/Lm5hbWUgPT09ICdBYm9ydEVycm9yJykge1xuICAgICAgLy8gT25seSBhIGNhbmNlbCBvZiB0aGUgbG9hZCB0aGF0IGlzIHN0aWxsIGN1cnJlbnQgY2FtZSBmcm9tIHRoZSB1c2VyOyBhbnl0aGluZyBlbHNlIGlzIHRoaXNcbiAgICAgIC8vIGxvYWQgaGF2aW5nIGJlZW4gc3VwZXJzZWRlZCBvciBkaXNjYXJkZWQuXG4gICAgICBpZiAodGhpcy5sb2FkQWJvcnRDb250cm9sbGVyPy5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgICB0aGlzLm1vZGVsTG9hZENhbmNlbGxlZCQubmV4dCgpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBFcnJvciBsb2FkaW5nICR7d2hhdH06YCwgZXJyb3IpO1xuICAgIH1cbiAgICB0aGlzLm1vZGVsTG9hZGluZyQubmV4dChmYWxzZSk7XG4gICAgdGhpcy5tb2RlbExvYWRQcm9ncmVzcyQubmV4dChudWxsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9wcyB0aGUgbW9kZWwgZG93bmxvYWQgaW4gcHJvZ3Jlc3MsIGlmIGFueS5cbiAgICpcbiAgICogT25seSB0aGUgZG93bmxvYWQgY2FuIGJlIGludGVycnVwdGVkOiBwYXJzZSgpIHJ1bnMgc3luY2hyb25vdXNseSBhbmQgaG9sZHMgdGhlIG1haW4gdGhyZWFkIHVudGlsXG4gICAqIGl0IGZpbmlzaGVzLCBzbyBvbmNlIGl0IGhhcyBiZWd1biB0aGVyZSBpcyBub3RoaW5nIHRvIGNhbmNlbC4gSW4gcHJhY3RpY2UgdGhlIGRvd25sb2FkIGlzIHRoZVxuICAgKiBsb25nIHBhcnQsIHdoaWNoIGlzIHdoZXJlIHNvbWVvbmUgcmVhY2hlcyBmb3IgdGhpcy5cbiAgICovXG4gIGNhbmNlbE1vZGVsTG9hZCgpOiB2b2lkIHtcbiAgICB0aGlzLmxvYWRBYm9ydENvbnRyb2xsZXI/LmFib3J0KCk7XG4gIH1cblxuICAvKipcbiAgICogQWJhbmRvbnMgdGhlIGxvYWQgaW4gcHJvZ3Jlc3Mgd2l0aG91dCByZXBvcnRpbmcgaXQgYXMgY2FuY2VsbGVkLlxuICAgKlxuICAgKiBEcm9wcGluZyB0aGUgY29udHJvbGxlciBpcyB3aGF0IG1ha2VzIHRoZSBkaWZmZXJlbmNlOiBvbkVycm9yIHRyZWF0cyBhbiBhYm9ydCBhcyB1c2VyLWluaXRpYXRlZFxuICAgKiBvbmx5IHdoaWxlIHRoZSBjb250cm9sbGVyIHRoYXQgYWJvcnRlZCBpcyBzdGlsbCB0aGUgY3VycmVudCBvbmUuIFRlYXJpbmcgZG93biBvciByZWJ1aWxkaW5nIHRoZVxuICAgKiBzY2VuZSBpcyBub3Qgc29tZXRoaW5nIHRoZSBwZXJzb24gYXNrZWQgZm9yLCBzbyBpdCBtdXN0IG5vdCBzdXJmYWNlIGFzIFwibG9hZGluZyBjYW5jZWxsZWRcIi5cbiAgICovXG4gIHByaXZhdGUgZGlzY2FyZEN1cnJlbnRMb2FkKCk6IHZvaWQge1xuICAgIHRoaXMubG9hZEdlbmVyYXRpb24gKz0gMTtcbiAgICB0aGlzLmxvYWRBYm9ydENvbnRyb2xsZXI/LmFib3J0KCk7XG4gICAgdGhpcy5sb2FkQWJvcnRDb250cm9sbGVyID0gdW5kZWZpbmVkO1xuICAgIGlmICh0aGlzLmxvYWRJblByb2dyZXNzKSB7XG4gICAgICB0aGlzLmxvYWRJblByb2dyZXNzID0gZmFsc2U7XG4gICAgICB0aGlzLm1vZGVsTG9hZGluZyQubmV4dChmYWxzZSk7XG4gICAgICB0aGlzLm1vZGVsTG9hZFByb2dyZXNzJC5uZXh0KG51bGwpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydHMgYSBsb2FkLCByZXBsYWNpbmcgd2hpY2hldmVyIHdhcyB1bmRlciB3YXksIGFuZCByZXR1cm5zIHRoZSBxdWVzdGlvbiBpdCBoYXMgdG8ga2VlcFxuICAgKiBhc2tpbmc6IGlzIGl0IHN0aWxsIHRoZSBvbmUgdGhhdCBpcyB3YW50ZWQ/XG4gICAqL1xuICBwcml2YXRlIGJlZ2luTG9hZCgpOiAoKSA9PiBib29sZWFuIHtcbiAgICB0aGlzLmxvYWRHZW5lcmF0aW9uICs9IDE7XG4gICAgY29uc3QgZ2VuZXJhdGlvbiA9IHRoaXMubG9hZEdlbmVyYXRpb247XG4gICAgdGhpcy5sb2FkSW5Qcm9ncmVzcyA9IHRydWU7XG4gICAgdGhpcy5tb2RlbExvYWRpbmckLm5leHQodHJ1ZSk7XG4gICAgcmV0dXJuICgpID0+IGdlbmVyYXRpb24gPT09IHRoaXMubG9hZEdlbmVyYXRpb247XG4gIH1cblxuICAvKiogTWFya3MgdGhlIHdhbnRlZCBsb2FkIGFzIG92ZXIsIHdoaWNoZXZlciB3YXkgaXQgZW5kZWQuICovXG4gIHByaXZhdGUgZW5kTG9hZCgpOiB2b2lkIHtcbiAgICB0aGlzLmxvYWRJblByb2dyZXNzID0gZmFsc2U7XG4gICAgdGhpcy5tb2RlbExvYWRpbmckLm5leHQoZmFsc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIG9uY2UgdGhlIGJyb3dzZXIgaGFzIHBhaW50ZWQgYXQgbGVhc3Qgb25lIGZyYW1lLlxuICAgKlxuICAgKiBBIHJlcXVlc3RBbmltYXRpb25GcmFtZSBjYWxsYmFjayBydW5zICpiZWZvcmUqIHRoYXQgZnJhbWUgaXMgcGFpbnRlZCwgc28gYSBzaW5nbGUgb25lIGlzIG5vdFxuICAgKiBlbm91Z2ggdG8gZ3VhcmFudGVlIHBlbmRpbmcgRE9NIGNoYW5nZXMgYXJlIG9uIHNjcmVlbjsgdGhlIHNlY29uZCBmaXJlcyBhZnRlciB0aGUgZmlyc3QgZnJhbWVcbiAgICogaGFzIGdvbmUgb3V0LiBGYWxscyBiYWNrIHRvIGEgdGltZW91dCB3aGVyZSByQUYgaXNuJ3QgYXZhaWxhYmxlIChTU1IsIHRlc3RzKS5cbiAgICovXG4gIHByaXZhdGUgYWZ0ZXJOZXh0UGFpbnQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHR5cGVvZiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCAwKSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiByZXNvbHZlKCkpKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEb3dubG9hZHMgYSBmaWxlLCByZXBvcnRpbmcgcHJvZ3Jlc3Mgb24gbW9kZWxMb2FkUHJvZ3Jlc3MkIGFzIGl0IGFycml2ZXMuXG4gICAqXG4gICAqIEdMVEZMb2FkZXIubG9hZCgpIHdvdWxkIHJlcG9ydCBwcm9ncmVzcyB0aHJvdWdoIFhIUiwgYnV0IHRoaXMgcGF0aCBkZWxpYmVyYXRlbHkgdXNlcyBmZXRjaCgpICtcbiAgICogcGFyc2UoKSBpbnN0ZWFkIChzZWUgbG9hZEdMVEZNb2RlbCBmb3Igd2h5KSwgc28gcHJvZ3Jlc3MgaXMgcmVhZCBvZmYgdGhlIHJlc3BvbnNlIHN0cmVhbSBoZXJlLlxuICAgKiBUaGF0IGlzIGFsc28gdGhlIG1vcmUgdXNlZnVsIG51bWJlcjogb24gYSBtb2RlbCBvZiB0aGlzIHNpemUgdGhlIGRvd25sb2FkIGRvbWluYXRlcywgYW5kIHRoZVxuICAgKiBzdHJlYW0gcmVwb3J0cyBpdCBhcyBpdCBoYXBwZW5zIHJhdGhlciB0aGFuIGluIG9uZSBqdW1wIGF0IHRoZSBlbmQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGZldGNoV2l0aFByb2dyZXNzKHVybDogc3RyaW5nLCBjYWNoZUtleT86IHN0cmluZyk6IFByb21pc2U8QXJyYXlCdWZmZXI+IHtcbiAgICAvLyBBIGxvYWQgYWxyZWFkeSBydW5uaW5nIGlzIHJlcGxhY2VkLCBub3QgcmFjZWQ6IHdoaWNoZXZlciBmaW5pc2hlZCBsYXN0IHdvdWxkIG90aGVyd2lzZSB3aW4uXG4gICAgdGhpcy5sb2FkQWJvcnRDb250cm9sbGVyPy5hYm9ydCgpO1xuICAgIHRoaXMubG9hZEFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICBjb25zdCB7IHNpZ25hbCB9ID0gdGhpcy5sb2FkQWJvcnRDb250cm9sbGVyO1xuXG4gICAgY29uc3QgY2FjaGVkID0gYXdhaXQgdGhpcy5yZWFkTW9kZWxGcm9tQ2FjaGUoY2FjaGVLZXkpO1xuICAgIGlmIChzaWduYWwuYWJvcnRlZCkge1xuICAgICAgLy8gUmVwbGFjZWQgb3IgYWJhbmRvbmVkIHdoaWxlIHRoZSBjYWNoZSB3YXMgYmVpbmcgcmVhZC4gV2l0aCBub3RoaW5nIGJlaW5nIGRvd25sb2FkZWQsIHRoaXNcbiAgICAgIC8vIGlzIHRoZSBvbmx5IHBsYWNlIGEgbG9hZCBzZXJ2ZWQgZnJvbSB0aGUgY2FjaGUgY2FuIGZpbmQgdGhhdCBvdXQuXG4gICAgICB0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKCdNb2RlbCBsb2FkIGNhbmNlbGxlZCcsICdBYm9ydEVycm9yJyk7XG4gICAgfVxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHRoaXMubW9kZWxMb2FkUHJvZ3Jlc3MkLm5leHQoMSk7XG4gICAgICByZXR1cm4gY2FjaGVkO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7IHNpZ25hbCB9KTtcbiAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBmZXRjaCAke3VybH06ICR7cmVzcG9uc2Uuc3RhdHVzfSAke3Jlc3BvbnNlLnN0YXR1c1RleHR9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgY29udGVudExlbmd0aCA9IE51bWJlcihyZXNwb25zZS5oZWFkZXJzLmdldCgnQ29udGVudC1MZW5ndGgnKSk7XG4gICAgY29uc3QgdG90YWwgPSBOdW1iZXIuaXNGaW5pdGUoY29udGVudExlbmd0aCkgJiYgY29udGVudExlbmd0aCA+IDAgPyBjb250ZW50TGVuZ3RoIDogMDtcblxuICAgIC8vIFdpdGhvdXQgYSByZWFkYWJsZSBzdHJlYW0gKG9sZGVyIGJyb3dzZXJzLCBzb21lIHBvbHlmaWxscykgdGhlcmUgaXMgbm90aGluZyB0byBtZWFzdXJlLCBzb1xuICAgIC8vIGZhbGwgYmFjayB0byBhIHBsYWluIGJ1ZmZlcmVkIHJlYWQgYW5kIGxldCB0aGUgVUkgc2hvdyBhbiBpbmRldGVybWluYXRlIGluZGljYXRvci5cbiAgICBpZiAoIXJlc3BvbnNlLmJvZHk/LmdldFJlYWRlcikge1xuICAgICAgdGhpcy5tb2RlbExvYWRQcm9ncmVzcyQubmV4dChudWxsKTtcbiAgICAgIHJldHVybiByZXNwb25zZS5hcnJheUJ1ZmZlcigpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlYWRlciA9IHJlc3BvbnNlLmJvZHkuZ2V0UmVhZGVyKCk7XG5cbiAgICAvLyBXaXRoIGEga25vd24gc2l6ZSwgd3JpdGUgY2h1bmtzIHN0cmFpZ2h0IGludG8gb25lIHByZS1hbGxvY2F0ZWQgYnVmZmVyLiBDb2xsZWN0aW5nIHRoZW0gaW4gYW5cbiAgICAvLyBhcnJheSBhbmQgY29uY2F0ZW5hdGluZyBhZnRlcndhcmRzIHdvdWxkIGhvbGQgYm90aCBjb3BpZXMgYXQgb25jZSAtIG9uIGEgMTY0IE1CIG1vZGVsIHRoYXQgaXNcbiAgICAvLyBhbiBhdm9pZGFibGUgMzAwKyBNQiBwZWFrLlxuICAgIGNvbnN0IGJ1ZmZlciA9IHRvdGFsID4gMCA/IG5ldyBVaW50OEFycmF5KHRvdGFsKSA6IG51bGw7XG4gICAgY29uc3QgY2h1bmtzOiBVaW50OEFycmF5W10gPSBbXTtcbiAgICBsZXQgdXNpbmdCdWZmZXIgPSBidWZmZXIgIT09IG51bGw7XG4gICAgbGV0IHJlY2VpdmVkID0gMDtcbiAgICAvLyBDaHVua3MgYXJyaXZlIGluIHRlbnMgb2Yga2lsb2J5dGVzLCBzbyBhIDE2NCBNQiBtb2RlbCBwcm9kdWNlcyB0aG91c2FuZHMgb2YgdGhlbS4gRW1pdHRpbmcgb25cbiAgICAvLyBldmVyeSBvbmUgd291bGQgcnVuIGNoYW5nZSBkZXRlY3Rpb24ganVzdCBhcyBvZnRlbiB0byBtb3ZlIGEgYmFyIHRoYXQgaXMgbWVhc3VyZWQgaW4gd2hvbGVcbiAgICAvLyBwZXJjZW50LCBzbyBvbmx5IHJlcG9ydCB3aGVuIHRoZSBkaXNwbGF5ZWQgdmFsdWUgd291bGQgYWN0dWFsbHkgY2hhbmdlLlxuICAgIGxldCBsYXN0UmVwb3J0ZWQgPSAtMTtcblxuICAgIGlmICh0b3RhbCA9PT0gMCkge1xuICAgICAgdGhpcy5tb2RlbExvYWRQcm9ncmVzcyQubmV4dChudWxsKTtcbiAgICB9XG5cbiAgICBmb3IgKDs7KSB7XG4gICAgICBjb25zdCB7IGRvbmUsIHZhbHVlIH0gPSBhd2FpdCByZWFkZXIucmVhZCgpO1xuICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAoc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgLy8gRnJlZSB0aGUgY29ubmVjdGlvbiByYXRoZXIgdGhhbiBsZWF2aW5nIGl0IGRyYWluaW5nIGluIHRoZSBiYWNrZ3JvdW5kLlxuICAgICAgICBhd2FpdCByZWFkZXIuY2FuY2VsKCk7XG4gICAgICAgIHRocm93IG5ldyBET01FeGNlcHRpb24oJ01vZGVsIGxvYWQgY2FuY2VsbGVkJywgJ0Fib3J0RXJyb3InKTtcbiAgICAgIH1cbiAgICAgIGlmICh1c2luZ0J1ZmZlciAmJiByZWNlaXZlZCArIHZhbHVlLmxlbmd0aCA+IHRvdGFsKSB7XG4gICAgICAgIC8vIENvbnRlbnQtTGVuZ3RoIHVuZGVyc3RhdGVkIHRoZSByZWFsIHNpemUuIE1vdmUgd2hhdCB3ZSBoYXZlIGludG8gdGhlIGNodW5rIGxpc3QgYW5kIHN0YXlcbiAgICAgICAgLy8gdGhlcmUgZm9yIHRoZSByZXN0IG9mIHRoZSByZXNwb25zZSwgcmF0aGVyIHRoYW4gdHJ1bmNhdGluZyB0aGUgdGFpbC5cbiAgICAgICAgY2h1bmtzLnB1c2goYnVmZmVyLnNsaWNlKDAsIHJlY2VpdmVkKSk7XG4gICAgICAgIHVzaW5nQnVmZmVyID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAodXNpbmdCdWZmZXIpIHtcbiAgICAgICAgYnVmZmVyLnNldCh2YWx1ZSwgcmVjZWl2ZWQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2h1bmtzLnB1c2godmFsdWUpO1xuICAgICAgfVxuICAgICAgcmVjZWl2ZWQgKz0gdmFsdWUubGVuZ3RoO1xuICAgICAgaWYgKHRvdGFsID4gMCkge1xuICAgICAgICBjb25zdCBwZXJjZW50ID0gTWF0aC5taW4oTWF0aC5yb3VuZCgocmVjZWl2ZWQgLyB0b3RhbCkgKiAxMDApLCAxMDApO1xuICAgICAgICBpZiAocGVyY2VudCAhPT0gbGFzdFJlcG9ydGVkKSB7XG4gICAgICAgICAgbGFzdFJlcG9ydGVkID0gcGVyY2VudDtcbiAgICAgICAgICB0aGlzLm1vZGVsTG9hZFByb2dyZXNzJC5uZXh0KHBlcmNlbnQgLyAxMDApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVGhlIHN0cmVhbSBjYW4gZW5kIGJlbG93IHRoZSBhZHZlcnRpc2VkIHNpemUgKG9yIHdpdGggbm8gc2l6ZSBhdCBhbGwpLiBMYW5kIG9uIGEgZnVsbCBiYXJcbiAgICAvLyByYXRoZXIgdGhhbiBsZWF2aW5nIGl0IHN0dWNrIGF0IHdoYXRldmVyIHRoZSBsYXN0IGNodW5rIGhhcHBlbmVkIHRvIHJlYWNoLlxuICAgIGlmICh0b3RhbCA+IDAgJiYgbGFzdFJlcG9ydGVkICE9PSAxMDApIHtcbiAgICAgIHRoaXMubW9kZWxMb2FkUHJvZ3Jlc3MkLm5leHQoMSk7XG4gICAgfVxuXG4gICAgbGV0IHJlc3VsdDogQXJyYXlCdWZmZXI7XG4gICAgaWYgKHVzaW5nQnVmZmVyICYmIHJlY2VpdmVkID09PSB0b3RhbCkge1xuICAgICAgcmVzdWx0ID0gYnVmZmVyLmJ1ZmZlcjtcbiAgICB9IGVsc2UgaWYgKHVzaW5nQnVmZmVyKSB7XG4gICAgICAvLyBGZXdlciBieXRlcyB0aGFuIGFkdmVydGlzZWQ6IGhhbmQgYmFjayBleGFjdGx5IHdoYXQgYXJyaXZlZC5cbiAgICAgIHJlc3VsdCA9IGJ1ZmZlci5idWZmZXIuc2xpY2UoMCwgcmVjZWl2ZWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBtZXJnZWQgPSBuZXcgVWludDhBcnJheShyZWNlaXZlZCk7XG4gICAgICBsZXQgb2Zmc2V0ID0gMDtcbiAgICAgIGNodW5rcy5mb3JFYWNoKChjaHVuaykgPT4ge1xuICAgICAgICBtZXJnZWQuc2V0KGNodW5rLCBvZmZzZXQpO1xuICAgICAgICBvZmZzZXQgKz0gY2h1bmsubGVuZ3RoO1xuICAgICAgfSk7XG4gICAgICByZXN1bHQgPSBtZXJnZWQuYnVmZmVyO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMud3JpdGVNb2RlbFRvQ2FjaGUoY2FjaGVLZXksIHJlc3VsdCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgbW9kZWwgc3RvcmUsIG9yIG51bGwgd2hlcmUgdGhlIGJyb3dzZXIgd2lsbCBub3QgZ2l2ZSB1cyBvbmUuXG4gICAqXG4gICAqIENhY2hlIFN0b3JhZ2UgbmVlZHMgYSBzZWN1cmUgY29udGV4dCwgc28gaXQgaXMgYWJzZW50IG92ZXIgcGxhaW4gaHR0cCBhbmQgaW4gc29tZSBlbWJlZGRlZFxuICAgKiB3ZWJ2aWV3cy4gRXZlcnkgY2FsbGVyIHRyZWF0cyB0aGF0IGFzIGEgbWlzcyAtIGNhY2hpbmcgaXMgYW4gb3B0aW1pc2F0aW9uLCBuZXZlciBhIHJlcXVpcmVtZW50LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBvcGVuTW9kZWxDYWNoZSgpOiBQcm9taXNlPENhY2hlIHwgbnVsbD4ge1xuICAgIGlmICh0eXBlb2YgY2FjaGVzID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgY2FjaGVzLm9wZW4oVGhyZWVKc1NlcnZpY2UuTU9ERUxfQ0FDSEUpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEEgY2FjaGVkIGNvcHkgb2YgdGhpcyBtb2RlbCwgaWYgb25lIHdhcyBzdG9yZWQuXG4gICAqXG4gICAqIEtleWVkIGJ5IHRoZSBTMyBrZXkgcmF0aGVyIHRoYW4gdGhlIFVSTCBpdCBpcyBmZXRjaGVkIGZyb206IHRoYXQgVVJMIGlzIHNpZ25lZCwgc28gaXQgY2FycmllcyBhXG4gICAqIGZyZXNoIHNpZ25hdHVyZSBhbmQgZXhwaXJ5IGV2ZXJ5IHRpbWUgYW5kIHdvdWxkIG5ldmVyIG1hdGNoIHR3aWNlLiBUaGUgYnJvd3NlcidzIG93biBIVFRQIGNhY2hlXG4gICAqIG1pc3NlcyBmb3IgdGhlIHNhbWUgcmVhc29uLCB3aGljaCBpcyB3aHkgdGhpcyBleGlzdHMgYXQgYWxsLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZWFkTW9kZWxGcm9tQ2FjaGUoY2FjaGVLZXk/OiBzdHJpbmcpOiBQcm9taXNlPEFycmF5QnVmZmVyIHwgbnVsbD4ge1xuICAgIGlmICghY2FjaGVLZXkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgY29uc3QgY2FjaGUgPSBhd2FpdCB0aGlzLm9wZW5Nb2RlbENhY2hlKCk7XG4gICAgICBjb25zdCBoaXQgPSBhd2FpdCBjYWNoZT8ubWF0Y2godGhpcy5tb2RlbENhY2hlVXJsKGNhY2hlS2V5KSk7XG4gICAgICByZXR1cm4gaGl0ID8gYXdhaXQgaGl0LmFycmF5QnVmZmVyKCkgOiBudWxsO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqIFN0b3JlcyBhIG1vZGVsIGZvciBuZXh0IHRpbWUsIGV2aWN0aW5nIHRoZSBvbGRlc3Qgb25jZSBhIGZldyBhcmUgaGVsZC4gKi9cbiAgcHJpdmF0ZSBhc3luYyB3cml0ZU1vZGVsVG9DYWNoZShjYWNoZUtleTogc3RyaW5nIHwgdW5kZWZpbmVkLCBtb2RlbDogQXJyYXlCdWZmZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIWNhY2hlS2V5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBjYWNoZSA9IGF3YWl0IHRoaXMub3Blbk1vZGVsQ2FjaGUoKTtcbiAgICAgIGlmICghY2FjaGUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgYXdhaXQgY2FjaGUucHV0KHRoaXMubW9kZWxDYWNoZVVybChjYWNoZUtleSksIG5ldyBSZXNwb25zZShtb2RlbCkpO1xuXG4gICAgICAvLyBNb2RlbHMgcnVuIHRvIGh1bmRyZWRzIG9mIG1lZ2FieXRlcywgc28gdGhpcyBjYW5ub3QgZ3JvdyB3aXRob3V0IGxpbWl0LiBDYWNoZSBTdG9yYWdlIGtlZXBzXG4gICAgICAvLyBpbnNlcnRpb24gb3JkZXIsIHdoaWNoIG1ha2VzIHRoZSBmcm9udCBvZiB0aGUgbGlzdCB0aGUgbGVhc3QgcmVjZW50bHkgc3RvcmVkLlxuICAgICAgY29uc3Qga2V5cyA9IGF3YWl0IGNhY2hlLmtleXMoKTtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBrZXlzLnNsaWNlKDAsIE1hdGgubWF4KDAsIGtleXMubGVuZ3RoIC0gVGhyZWVKc1NlcnZpY2UuTU9ERUxfQ0FDSEVfU0laRSkpXG4gICAgICAgICAgLm1hcCgoa2V5KSA9PiBjYWNoZS5kZWxldGUoa2V5KSlcbiAgICAgICk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBPdXQgb2YgcXVvdGEsIHByaXZhdGUgYnJvd3NpbmcsIHN0b3JhZ2UgZGlzYWJsZWQ6IHRoZSBtb2RlbCBpcyBhbHJlYWR5IGxvYWRlZCBlaXRoZXIgd2F5LlxuICAgIH1cbiAgfVxuXG4gIC8qKiBDYWNoZSBTdG9yYWdlIGtleXMgb24gYSBVUkwsIHNvIHRoZSBTMyBrZXkgaXMgZXhwcmVzc2VkIGFzIG9uZS4gSXQgaXMgbmV2ZXIgcmVxdWVzdGVkLiAqL1xuICBwcml2YXRlIG1vZGVsQ2FjaGVVcmwoY2FjaGVLZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBodHRwczovLzNkLW1vZGVsLWNhY2hlLnNtYXJ0ZXJwbGFuLmxvY2FsLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGNhY2hlS2V5KX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpdHMgdGhlIGNhbWVyYSdzIGNsaXBwaW5nIHBsYW5lcyB0byBob3cgYmlnIHRoZSBtb2RlbCBhY3R1YWxseSBpcy5cbiAgICpcbiAgICogRGVwdGggcHJlY2lzaW9uIGRlcGVuZHMgb24gdGhlIGZhci9uZWFyIHJhdGlvLCBhbmQgdGhlIGZpeGVkIDAuMSAvIDEwMDAwIHRoZSBjYW1lcmEgc3RhcnRzIHdpdGhcbiAgICogaXMgYSByYXRpbyBvZiAxMDAwMDAgZm9yIGEgbW9kZWwgb25seSB+MTAgdW5pdHMgYWNyb3NzLiBUaGF0IHdhc3RlcyBtb3N0IG9mIHRoZSBkZXB0aCBidWZmZXIgb25cbiAgICogZW1wdHkgc3BhY2UgYW5kIGxldHMgbmVhcmx5IGNvaW5jaWRlbnQgc3VyZmFjZXMgLSB3aGljaCBjYXB0dXJlZCBtZXNoZXMgaGF2ZSBldmVyeXdoZXJlIC1cbiAgICogZmxpY2tlciBhZ2FpbnN0IGVhY2ggb3RoZXIuXG4gICAqL1xuICBwcml2YXRlIGFkanVzdENsaXBwaW5nUGxhbmVzKHJhZGl1czogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHJhZGl1cyA8IDEwKSB7XG4gICAgICB0aGlzLmNhbWVyYS5uZWFyID0gMC4wMTtcbiAgICAgIHRoaXMuY2FtZXJhLmZhciA9IDEwMDtcbiAgICB9IGVsc2UgaWYgKHJhZGl1cyA8IDEwMCkge1xuICAgICAgdGhpcy5jYW1lcmEubmVhciA9IDAuMTtcbiAgICAgIHRoaXMuY2FtZXJhLmZhciA9IDEwMDA7XG4gICAgfSBlbHNlIGlmIChyYWRpdXMgPCAxMDAwKSB7XG4gICAgICB0aGlzLmNhbWVyYS5uZWFyID0gMTA7XG4gICAgICB0aGlzLmNhbWVyYS5mYXIgPSAxMDAwMDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jYW1lcmEubmVhciA9IDEwMDtcbiAgICAgIHRoaXMuY2FtZXJhLmZhciA9IDEwMDAwMDA7XG4gICAgfVxuICAgIHRoaXMuY2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTd2FwcyB0aGUgUEJSIG1hdGVyaWFscyBHTFRGTG9hZGVyIGJ1aWxkcyBmb3IgdGhlIHBsYWluIFBob25nIG9uZXMgdGhlIC5vYmogcGF0aCBwcm9kdWNlcy5cbiAgICpcbiAgICogTWVzaFN0YW5kYXJkTWF0ZXJpYWwga2VlcHMgYSBzcGVjdWxhciByZWZsZWN0aW9uIGV2ZW4gYXQgbWV0YWxuZXNzIDAsIHNpbmNlIGV2ZXJ5IGRpZWxlY3RyaWNcbiAgICogcmVmbGVjdHMgc29tZSBsaWdodCwgYW5kIEZyZXNuZWwgZHJpdmVzIHRoYXQgcmVmbGVjdGlvbiB0b3dhcmRzIHdoaXRlIGFzIGEgc3VyZmFjZSB0dXJucyBhd2F5XG4gICAqIGZyb20gdGhlIHZpZXdlci4gT24gYW4gYWVyaWFsIHZpZXcgb2YgYSBmYWNhZGUgbW9zdCBzdXJmYWNlcyBzaXQgYXQgZXhhY3RseSB0aG9zZSBncmF6aW5nXG4gICAqIGFuZ2xlcywgd2hpY2ggcGFpbnRzIHdoaXRlIGhpZ2hsaWdodHMgb3ZlciB3aW5kb3cgZnJhbWVzIGFuZCByb29mIGVkZ2VzIC0gdGhlIHNhbWUgbW9kZWxcbiAgICogbG9hZGVkIGFzIC5vYmogbmV2ZXIgc2hvd3MgdGhlbSwgYmVjYXVzZSBNVExMb2FkZXIgYnVpbGRzIFBob25nIG1hdGVyaWFscyBhbmQgT0JKTG9hZGVyIHplcm9lc1xuICAgKiB0aGVpciBzcGVjdWxhciB3aGVuIHRoZSAubXRsIGRlY2xhcmVzIE5zIDAuXG4gICAqXG4gICAqIENhcHR1cmVkIG1vZGVscyBjYXJyeSB0aGVpciBsaWdodGluZyBpbiB0aGUgdGV4dHVyZSBhbmQgd2FudCBubyBzcGVjdWxhciByZXNwb25zZSBhdCBhbGwsIHNvXG4gICAqIG1hdGNoaW5nIHRoZSAub2JqIHBhdGggaGVyZSBpcyBib3RoIHRoZSBmaXggYW5kIHRoZSBtb3JlIGZhaXRoZnVsIGNob2ljZS5cbiAgICovXG4gIHByaXZhdGUgY29udmVydFRvUGhvbmdNYXRlcmlhbHMocm9vdDogVEhSRUUuT2JqZWN0M0QpOiB2b2lkIHtcbiAgICBjb25zdCBjb252ZXJ0ZWQgPSBuZXcgTWFwPGFueSwgVEhSRUUuTWVzaFBob25nTWF0ZXJpYWw+KCk7XG5cbiAgICByb290LnRyYXZlcnNlKChjaGlsZCkgPT4ge1xuICAgICAgY29uc3QgbWVzaCA9IGNoaWxkIGFzIFRIUkVFLk1lc2g7XG4gICAgICBpZiAoIShtZXNoIGFzIGFueSkuaXNNZXNoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY29udmVydCA9IChzb3VyY2U6IGFueSk6IGFueSA9PiB7XG4gICAgICAgIGlmICghc291cmNlIHx8ICEoc291cmNlIGFzIGFueSkuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbCkge1xuICAgICAgICAgIHJldHVybiBzb3VyY2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFjb252ZXJ0ZWQuaGFzKHNvdXJjZSkpIHtcbiAgICAgICAgICBjb25zdCBwaG9uZyA9IG5ldyBUSFJFRS5NZXNoUGhvbmdNYXRlcmlhbCh7XG4gICAgICAgICAgICBtYXA6IHNvdXJjZS5tYXAsXG4gICAgICAgICAgICBjb2xvcjogc291cmNlLmNvbG9yLFxuICAgICAgICAgICAgdHJhbnNwYXJlbnQ6IHNvdXJjZS50cmFuc3BhcmVudCxcbiAgICAgICAgICAgIG9wYWNpdHk6IHNvdXJjZS5vcGFjaXR5LFxuICAgICAgICAgICAgYWxwaGFUZXN0OiBzb3VyY2UuYWxwaGFUZXN0LFxuICAgICAgICAgICAgc2lkZTogc291cmNlLnNpZGUsXG4gICAgICAgICAgICBzcGVjdWxhcjogbmV3IFRIUkVFLkNvbG9yKDB4MDAwMDAwKSxcbiAgICAgICAgICAgIHNoaW5pbmVzczogMCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBwaG9uZy5uYW1lID0gc291cmNlLm5hbWU7XG4gICAgICAgICAgY29udmVydGVkLnNldChzb3VyY2UsIHBob25nKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29udmVydGVkLmdldChzb3VyY2UpO1xuICAgICAgfTtcblxuICAgICAgbWVzaC5tYXRlcmlhbCA9IEFycmF5LmlzQXJyYXkobWVzaC5tYXRlcmlhbClcbiAgICAgICAgPyBtZXNoLm1hdGVyaWFsLm1hcChjb252ZXJ0KVxuICAgICAgICA6IGNvbnZlcnQobWVzaC5tYXRlcmlhbCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyBldmVyeSBtYXRlcmlhbCBkb3VibGUtc2lkZWQuXG4gICAqXG4gICAqIFJlYWxpdHkgY2FwdHVyZSBtZXNoZXMgcm91dGluZWx5IGNvbnRhaW4gdHJpYW5nbGVzIHdpdGggcmV2ZXJzZWQgd2luZGluZyAtIGFuIGFydGVmYWN0IG9mIHRoZVxuICAgKiByZWNvbnN0cnVjdGlvbiwgbm90IG9mIHRoZSBmaWxlLiBXaXRoIHRoZSBkZWZhdWx0IEZyb250U2lkZSB0aG9zZSB0cmlhbmdsZXMgYXJlIGN1bGxlZCwgbGVhdmluZ1xuICAgKiBzY2F0dGVyZWQgaG9sZXMgdGhhdCBzaG93IHRoZSBzY2VuZSBiYWNrZ3JvdW5kIHRocm91Z2ggdGhlIG1vZGVsLiBBZ2FpbnN0IGEgbGlnaHQgYmFja2dyb3VuZFxuICAgKiB0aGV5IHJlYWQgYXMgd2hpdGUgc3BlY2tzIHdpdGggbm8gZGlzY2VybmlibGUgcGF0dGVybi5cbiAgICpcbiAgICogRHJhd2luZyBib3RoIHNpZGVzIGNvc3RzIGEgbGl0dGxlIGZpbGwgcmF0ZSBidXQgaXMgd2hhdCBtYWtlcyBjYXB0dXJlZCBnZW9tZXRyeSByZW5kZXIgYXNcbiAgICogc29saWQ7IG90aGVyIHZpZXdlcnMgb2YgdGhpcyBraW5kIG9mIGNvbnRlbnQgZG8gdGhlIHNhbWUgdW5jb25kaXRpb25hbGx5LlxuICAgKi9cbiAgcHJpdmF0ZSBmb3JjZURvdWJsZVNpZGVkTWF0ZXJpYWxzKHJvb3Q6IFRIUkVFLk9iamVjdDNEKTogdm9pZCB7XG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8YW55PigpO1xuICAgIHJvb3QudHJhdmVyc2UoKGNoaWxkKSA9PiB7XG4gICAgICBjb25zdCBtZXNoID0gY2hpbGQgYXMgVEhSRUUuTWVzaDtcbiAgICAgIGlmICghKG1lc2ggYXMgYW55KS5pc01lc2gpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgbWF0ZXJpYWxzID0gQXJyYXkuaXNBcnJheShtZXNoLm1hdGVyaWFsKSA/IG1lc2gubWF0ZXJpYWwgOiBbbWVzaC5tYXRlcmlhbF07XG4gICAgICBtYXRlcmlhbHMuZm9yRWFjaCgobWF0ZXJpYWw6IGFueSkgPT4ge1xuICAgICAgICBpZiAobWF0ZXJpYWwgJiYgIXNlZW4uaGFzKG1hdGVyaWFsKSkge1xuICAgICAgICAgIHNlZW4uYWRkKG1hdGVyaWFsKTtcbiAgICAgICAgICBtYXRlcmlhbC5zaWRlID0gVEhSRUUuRG91YmxlU2lkZTtcbiAgICAgICAgICBtYXRlcmlhbC5uZWVkc1VwZGF0ZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbXB1dGVzIHJlYWwgdmVydGV4IG5vcm1hbHMgZm9yIGFueSBnZW9tZXRyeSB0aGF0IGFycml2ZWQgd2l0aG91dCB0aGVtLlxuICAgKlxuICAgKiBBIGdsVEYgd2l0aG91dCBhIE5PUk1BTCBhdHRyaWJ1dGUgaXMgc3BlYy1jb21wbGlhbnQsIGFuZCBHTFRGTG9hZGVyIGhhbmRsZXMgaXQgYnkgc3dpdGNoaW5nIHRoZVxuICAgKiBtYXRlcmlhbCB0byBmbGF0U2hhZGluZywgd2hpY2ggbWFrZXMgdGhlIHNoYWRlciBkZXJpdmUgdGhlIG5vcm1hbCBwZXIgcGl4ZWwgZnJvbSBzY3JlZW4tc3BhY2VcbiAgICogZGVyaXZhdGl2ZXMuIFRoYXQgZGVyaXZhdGlvbiBjb2xsYXBzZXMgb24gdGhlIGRlZ2VuZXJhdGUsIG5lZWRsZS10aGluIHRyaWFuZ2xlcyB0aGF0IHJlYWxpdHlcbiAgICogY2FwdHVyZSBtZXNoZXMgYXJlIGZ1bGwgb2Y6IHRoZSBmYWNlIGhhcyBhbG1vc3Qgbm8gYXJlYSwgdGhlIGRlcml2ZWQgbm9ybWFsIGlzIG1lYW5pbmdsZXNzLCBhbmRcbiAgICogbGlnaHRpbmcgYmxvd3MgdGhvc2UgZnJhZ21lbnRzIG91dCB0byB3aGl0ZSBzcGVja3MgLSBkZW5zZXN0IGV4YWN0bHkgd2hlcmUgZmluZSBkZXRhaWwgaXMuXG4gICAqXG4gICAqIENvbXB1dGluZyBub3JtYWxzIGZyb20gdGhlIGdlb21ldHJ5IGluc3RlYWQgaXMgcm9idXN0IHRvIHRob3NlIHRyaWFuZ2xlcywgc2luY2UgYSBkZWdlbmVyYXRlXG4gICAqIGZhY2UgY29udHJpYnV0ZXMgYWxtb3N0IG5vdGhpbmcgdG8gdGhlIGF2ZXJhZ2UgYW5kIGl0cyBuZWlnaGJvdXJzIGRvbWluYXRlLlxuICAgKi9cbiAgcHJpdmF0ZSBlbnN1cmVWZXJ0ZXhOb3JtYWxzKHJvb3Q6IFRIUkVFLk9iamVjdDNEKTogdm9pZCB7XG4gICAgcm9vdC50cmF2ZXJzZSgoY2hpbGQpID0+IHtcbiAgICAgIGNvbnN0IG1lc2ggPSBjaGlsZCBhcyBUSFJFRS5NZXNoO1xuICAgICAgaWYgKCEobWVzaCBhcyBhbnkpLmlzTWVzaCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBnZW9tZXRyeSA9IG1lc2guZ2VvbWV0cnkgYXMgVEhSRUUuQnVmZmVyR2VvbWV0cnk7XG4gICAgICBpZiAoZ2VvbWV0cnkuZ2V0QXR0cmlidXRlKCdub3JtYWwnKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGdlb21ldHJ5LmNvbXB1dGVWZXJ0ZXhOb3JtYWxzKCk7XG5cbiAgICAgIC8vIEdMVEZMb2FkZXIgYWxyZWFkeSBzd2l0Y2hlZCB0aGVzZSBtYXRlcmlhbHMgdG8gZmxhdFNoYWRpbmcgYmVjYXVzZSBub3JtYWxzIHdlcmUgbWlzc2luZztcbiAgICAgIC8vIG5vdyB0aGF0IHJlYWwgb25lcyBleGlzdCwgbGV0IHRoZW0gYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSBkZXJpdmF0aXZlIGZhbGxiYWNrLlxuICAgICAgY29uc3QgbWF0ZXJpYWxzID0gQXJyYXkuaXNBcnJheShtZXNoLm1hdGVyaWFsKSA/IG1lc2gubWF0ZXJpYWwgOiBbbWVzaC5tYXRlcmlhbF07XG4gICAgICBtYXRlcmlhbHMuZm9yRWFjaCgobWF0ZXJpYWw6IGFueSkgPT4ge1xuICAgICAgICBpZiAobWF0ZXJpYWwgJiYgbWF0ZXJpYWwuZmxhdFNoYWRpbmcpIHtcbiAgICAgICAgICBtYXRlcmlhbC5mbGF0U2hhZGluZyA9IGZhbHNlO1xuICAgICAgICAgIG1hdGVyaWFsLm5lZWRzVXBkYXRlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ29uZmlndXJlcyBob3cgZXZlcnkgdGV4dHVyZSBpbiBhIG1vZGVsIGlzIHNhbXBsZWQ6IG1heGltdW0gYW5pc290cm9weSwgYW5kIG5vIG1pcG1hcHBpbmcuXG4gICAqXG4gICAqIFBob3RvZ3JhbW1ldHJ5IGF0bGFzZXMgcGFjayB0aGVpciBVViBpc2xhbmRzIHdpdGggdW51c2VkIGd1dHRlciBwaXhlbHMgYmV0d2VlbiB0aGVtLiBNaXBtYXBwaW5nXG4gICAqIGF2ZXJhZ2VzIG5laWdoYm91cmluZyBwaXhlbHMgYXQgZWFjaCBsZXZlbCwgc28gdGhvc2UgZ3V0dGVycyBibGVlZCBmdXJ0aGVyIGludG8gdGhlIGlzbGFuZHMgdGhlXG4gICAqIHNtYWxsZXIgdGhlIGxldmVsIGdldHMgLSBhbmQgdmlld2luZyB0aGUgd2hvbGUgbW9kZWwgYXQgb25jZSB1c2VzIHRoZSBzbWFsbGVzdCBsZXZlbHMsIHBhaW50aW5nXG4gICAqIGJyaWdodCBndXR0ZXIgcGl4ZWxzIG92ZXIgdGhlIGVkZ2VzIG9mIGZpbmUgZGV0YWlsLiBTYW1wbGluZyB0aGUgZnVsbC1yZXNvbHV0aW9uIGltYWdlIGF2b2lkc1xuICAgKiB0aGF0LCBhdCB0aGUgY29zdCBvZiBzb21lIHNoaW1tZXIgb24gbWluaWZpZWQgc3VyZmFjZXMuXG4gICAqXG4gICAqIE5vdGUgdGhhdCBhbmlzb3Ryb3B5IG9ubHkgdGFrZXMgZWZmZWN0IHdoaWxlIG1pcG1hcHBpbmcgaXMgb24sIHNvIHdpdGggdGhlIHNldHRpbmdzIGJlbG93IGl0IGlzXG4gICAqIGluZXJ0OyBpdCBpcyBzZXQgYW55d2F5IHNvIHRoZSBzYW1wbGluZyBzdGF5cyBjb3JyZWN0IGZvciBhbnlvbmUgd2hvIHJlLWVuYWJsZXMgbWlwbWFwcyBoZXJlLlxuICAgKi9cbiAgcHJpdmF0ZSB0dW5lVGV4dHVyZVNhbXBsaW5nKHJvb3Q6IFRIUkVFLk9iamVjdDNEKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnJlbmRlcmVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG1heEFuaXNvdHJvcHkgPSB0aGlzLnJlbmRlcmVyLmNhcGFiaWxpdGllcy5nZXRNYXhBbmlzb3Ryb3B5KCk7XG4gICAgaWYgKCFtYXhBbmlzb3Ryb3B5IHx8IG1heEFuaXNvdHJvcHkgPD0gMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0PGFueT4oKTtcbiAgICByb290LnRyYXZlcnNlKChjaGlsZCkgPT4ge1xuICAgICAgY29uc3QgbWVzaCA9IGNoaWxkIGFzIFRIUkVFLk1lc2g7XG4gICAgICBpZiAoIShtZXNoIGFzIGFueSkuaXNNZXNoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG1hdGVyaWFscyA9IEFycmF5LmlzQXJyYXkobWVzaC5tYXRlcmlhbCkgPyBtZXNoLm1hdGVyaWFsIDogW21lc2gubWF0ZXJpYWxdO1xuICAgICAgbWF0ZXJpYWxzLmZvckVhY2goKG1hdGVyaWFsOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKCFtYXRlcmlhbCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBTYW1lIHRleHR1cmUgaXMgcmV1c2VkIGFjcm9zcyB0aGUgbW9kZWwncyBtYXRlcmlhbHM7IG9ubHkgdG91Y2ggZWFjaCBvbmUgb25jZS5cbiAgICAgICAgWydtYXAnLCAnbm9ybWFsTWFwJywgJ3JvdWdobmVzc01hcCcsICdtZXRhbG5lc3NNYXAnLCAnZW1pc3NpdmVNYXAnLCAnYW9NYXAnXS5mb3JFYWNoKChzbG90KSA9PiB7XG4gICAgICAgICAgY29uc3QgdGV4dHVyZSA9IG1hdGVyaWFsW3Nsb3RdO1xuICAgICAgICAgIGlmICh0ZXh0dXJlICYmICFzZWVuLmhhcyh0ZXh0dXJlKSkge1xuICAgICAgICAgICAgc2Vlbi5hZGQodGV4dHVyZSk7XG4gICAgICAgICAgICB0ZXh0dXJlLmFuaXNvdHJvcHkgPSBtYXhBbmlzb3Ryb3B5O1xuICAgICAgICAgICAgdGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgPSBmYWxzZTtcbiAgICAgICAgICAgIHRleHR1cmUubWluRmlsdGVyID0gVEhSRUUuTGluZWFyRmlsdGVyO1xuICAgICAgICAgICAgdGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWRzIGFuIE9CSiBtb2RlbCB3aXRoIE1UTC5cbiAgICogVGhlIGhlYXZ5IHRleHQtcGFyc2luZyBzdGVwIHJ1bnMgaW4gYSBXZWIgV29ya2VyIHdoZW4gb25lIGhhcyBiZWVuIHJlZ2lzdGVyZWQgdmlhXG4gICAqIHNldE9ialBhcnNlcldvcmtlciAoc2VlIHRoZXJlIGZvciB3aHkgdGhlIGFwcCwgbm90IHRoaXMgbGlicmFyeSwgcHJvdmlkZXMgaXQpOyB0aGlzIGtlZXBzXG4gICAqIHRoZSBtYWluIHRocmVhZCBmcmVlIHdoaWxlIGxhcmdlIGFyY2hpdGVjdHVyZSBtb2RlbHMgKG1pbGxpb25zIG9mIHZlcnRpY2VzKSBhcmUgcGFyc2VkLlxuICAgKiBGYWxscyBiYWNrIHRvIHBhcnNpbmcgb24gdGhlIG1haW4gdGhyZWFkIG90aGVyd2lzZS5cbiAgICovXG4gIGxvYWRPYmpNb2RlbChtdGxVcmw6IHN0cmluZywgb2JqVXJsOiBzdHJpbmcsIGNhbWVyYVBvc2l0aW9uPzoge3g6IG51bWJlciwgeTogbnVtYmVyLCB6OiBudW1iZXJ9LCByb3RhdGlvbj86IHt4OiBudW1iZXIsIHk6IG51bWJlciwgejogbnVtYmVyfSk6IHZvaWQge1xuICAgIGNvbnN0IG10bExvYWRlciA9IG5ldyBNVExMb2FkZXIoKTtcbiAgICBjb25zdCBiYXNlUGF0aCA9IG10bFVybC5zdWJzdHJpbmcoMCwgbXRsVXJsLmxhc3RJbmRleE9mKCcvJykgKyAxKTtcbiAgICBtdGxMb2FkZXIuc2V0UGF0aChiYXNlUGF0aCk7XG4gICAgY29uc3QgbXRsRmlsZU5hbWUgPSBtdGxVcmwuc3Vic3RyaW5nKG10bFVybC5sYXN0SW5kZXhPZignLycpICsgMSk7XG5cbiAgICAvLyBUaGVzZSBsb2FkZXJzIGNhbm5vdCBiZSBpbnRlcnJ1cHRlZCwgc28gYSBsb2FkIHRoYXQgaXMgbm8gbG9uZ2VyIHdhbnRlZCBydW5zIHRvIGl0cyBlbmQgYW5kXG4gICAgLy8gaXMgZHJvcHBlZCB0aGVyZSAtIHNlZSBsb2FkR2VuZXJhdGlvbi5cbiAgICBjb25zdCB3YW50ZWQgPSB0aGlzLmJlZ2luTG9hZCgpO1xuICAgIGNvbnN0IGZpbmlzaCA9ICgpID0+IHtcbiAgICAgIGlmICh3YW50ZWQoKSkge1xuICAgICAgICB0aGlzLmVuZExvYWQoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgbXRsTG9hZGVyLmxvYWQobXRsRmlsZU5hbWUsIChtYXRlcmlhbHMpID0+IHtcbiAgICAgIGlmICghd2FudGVkKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgbWF0ZXJpYWxzLnByZWxvYWQoKTtcblxuICAgICAgaWYgKHRoaXMub2JqUGFyc2VyV29ya2VyKSB7XG4gICAgICAgIHRoaXMucmVxdWVzdE9ialBhcnNlSW5Xb3JrZXIob2JqVXJsKVxuICAgICAgICAgIC50aGVuKChtZXNoZXMpID0+IHtcbiAgICAgICAgICAgIGlmICghd2FudGVkKCkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZ3JvdXAgPSBuZXcgVEhSRUUuR3JvdXAoKTtcbiAgICAgICAgICAgIG1lc2hlcy5mb3JFYWNoKChtZXNoRGF0YSkgPT4ge1xuICAgICAgICAgICAgICBncm91cC5hZGQodGhpcy5tZXNoRnJvbVBhcnNlZERhdGEobWVzaERhdGEsIG1hdGVyaWFscykpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnBsYWNlTG9hZGVkT2JqZWN0SW5TY2VuZShncm91cCwgY2FtZXJhUG9zaXRpb24sIHJvdGF0aW9uKTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHBhcnNpbmcgT0JKIG1vZGVsIGluIHdvcmtlcjonLCBlcnJvcik7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuZmluYWxseShmaW5pc2gpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG9iakxvYWRlciA9IG5ldyBPQkpMb2FkZXIoKTtcbiAgICAgIG9iakxvYWRlci5zZXRNYXRlcmlhbHMobWF0ZXJpYWxzKTtcblxuICAgICAgb2JqTG9hZGVyLmxvYWQob2JqVXJsLCAob2JqZWN0KSA9PiB7XG4gICAgICAgIGlmICghd2FudGVkKCkpIHtcbiAgICAgICAgICB0aGlzLmRpc3Bvc2VNb2RlbChvYmplY3QpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBsYWNlTG9hZGVkT2JqZWN0SW5TY2VuZShvYmplY3QsIGNhbWVyYVBvc2l0aW9uLCByb3RhdGlvbik7XG4gICAgICAgIGZpbmlzaCgpO1xuICAgICAgfSwgdW5kZWZpbmVkLCAoZXJyb3IpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgbG9hZGluZyBPQkogbW9kZWw6JywgZXJyb3IpO1xuICAgICAgICBmaW5pc2goKTtcbiAgICAgIH0pO1xuICAgIH0sIHVuZGVmaW5lZCwgKGVycm9yKSA9PiB7XG4gICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBsb2FkaW5nIE1UTCBmaWxlOicsIGVycm9yKTtcbiAgICAgIGZpbmlzaCgpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIENlbnRlcnMsIHNjYWxlcyBhbmQgYWRkcyBhIGxvYWRlZCBvYmplY3QgdG8gdGhlIHNjZW5lLCB0aGVuIGZyYW1lcyB0aGUgY2FtZXJhIG9uIGl0LiAqL1xuICBwcml2YXRlIHBsYWNlTG9hZGVkT2JqZWN0SW5TY2VuZShvYmplY3Q6IFRIUkVFLk9iamVjdDNELCBjYW1lcmFQb3NpdGlvbj86IHt4OiBudW1iZXIsIHk6IG51bWJlciwgejogbnVtYmVyfSwgcm90YXRpb24/OiB7eDogbnVtYmVyLCB5OiBudW1iZXIsIHo6IG51bWJlcn0sIHVwPzogVGhyZWVKc01vZGVsVXApOiB2b2lkIHtcbiAgICAvLyBBIHNjZW5lIHNob3dzIG9uZSBtb2RlbC4gV2hhdGV2ZXIgd2FzIHRoZXJlIGlzIHRha2VuIG91dCBhbmQgZnJlZWQgZmlyc3QsIG9yIHRoZSB0d28gd291bGQgYmVcbiAgICAvLyBkcmF3biB0aHJvdWdoIGVhY2ggb3RoZXIsIGV2ZXJ5IGZyYW1lLCBmb3IgYXMgbG9uZyBhcyB0aGUgdmlld2VyIHN0YXlzIG9wZW4uXG4gICAgaWYgKHRoaXMubW9kZWxSb290KSB7XG4gICAgICAvLyBQb2ludHMgYmVpbmcgY2xpY2tlZCBmb3IgYSBjYWxpYnJhdGlvbiBvciBhIG1lYXN1cmVtZW50IHdlcmUgY2xpY2tlZCBvbiB0aGUgbW9kZWwgdGhhdCBpc1xuICAgICAgLy8gYWJvdXQgdG8gZ287IHRoZXkgc2F5IG5vdGhpbmcgYWJvdXQgdGhlIG9uZSBhcnJpdmluZy5cbiAgICAgIGlmICh0aGlzLmFsaWduaW5nKSB7XG4gICAgICAgIHRoaXMuY2FuY2VsVGFnQWxpZ25tZW50KCk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5tZWFzdXJpbmcpIHtcbiAgICAgICAgdGhpcy5jYW5jZWxNZWFzdXJpbmcoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5yZW1vdmVNb2RlbCgpO1xuXG4gICAgY29uc3QgYm94ID0gbmV3IFRIUkVFLkJveDMoKS5zZXRGcm9tT2JqZWN0KG9iamVjdCk7XG4gICAgY29uc3QgY2VudGVyID0gYm94LmdldENlbnRlcihuZXcgVEhSRUUuVmVjdG9yMygpKTtcbiAgICBjb25zdCBzaXplID0gYm94LmdldFNpemUobmV3IFRIUkVFLlZlY3RvcjMoKSk7XG4gICAgY29uc3QgbWF4RGltID0gTWF0aC5tYXgoc2l6ZS54LCBzaXplLnksIHNpemUueik7XG4gICAgY29uc3Qgc2NhbGUgPSBtYXhEaW0gPiAwID8gMTAgLyBtYXhEaW0gOiAxO1xuXG4gICAgLy8gVHdvIG5lc3RlZCBncm91cHMgc28gdGFncyBjYW4gc2hhcmUgdGhlIG1vZGVsJ3MgZnJhbWU6IGBjZW50ZXJlZGAgY2FycmllcyB0aGUgb2Zmc2V0IHRoYXRcbiAgICAvLyBtb3ZlcyB0aGUgbW9kZWwncyBvd24gb3JpZ2luIHRvIHRoZSBzY2VuZSBvcmlnaW4sIGBncm91cGAgY2FycmllcyB0aGUgc2NhbGUuIEEgdGFnIHBvc2l0aW9uZWRcbiAgICAvLyB3aXRoIHJhdyBQT0kgY29vcmRpbmF0ZXMgdGhlbiBsYW5kcyBpbiB0aGUgc2FtZSBwbGFjZSB0aGUgbW9kZWwncyBnZW9tZXRyeSBkb2VzLlxuICAgIGNvbnN0IGdyb3VwID0gbmV3IFRIUkVFLkdyb3VwKCk7XG4gICAgY29uc3QgY2VudGVyZWQgPSBuZXcgVEhSRUUuR3JvdXAoKTtcbiAgICBjZW50ZXJlZC5wb3NpdGlvbi5zdWIoY2VudGVyKTtcblxuICAgIGlmIChyb3RhdGlvbikge1xuICAgICAgb2JqZWN0LnJvdGF0aW9uLnNldChyb3RhdGlvbi54LCByb3RhdGlvbi55LCByb3RhdGlvbi56KTtcbiAgICB9XG4gICAgLy8gV2hpY2ggd2F5IGlzIHVwLiBBIGNob2ljZSBzb21lb25lIG1hZGUgYnkgaGFuZCBhbHdheXMgd2luczsgb3RoZXJ3aXNlLCB1bmxlc3MgdGhlIG1vZGVsIGNhbWVcbiAgICAvLyB3aXRoIGFuIG9yaWVudGF0aW9uIG9mIGl0cyBvd24sIGl0IGlzIHdvcmtlZCBvdXQgZnJvbSB0aGUgZ2VvbWV0cnkuIEFwcGxpZWQgdG8gdGhlIG91dGVyXG4gICAgLy8gZ3JvdXAsIGFib3ZlIGJvdGggdGhlIG1vZGVsIGFuZCB0aGUgdGFnczogdGhleSB0dXJuIHRvZ2V0aGVyLCBhbmQgZXZlcnkgY29vcmRpbmF0ZSBhbHJlYWR5XG4gICAgLy8gc3RvcmVkIC0gdGFnIHBvc2l0aW9ucywgdGhlIGNhbGlicmF0aW9uIC0ga2VlcHMgbWVhbmluZyB3aGF0IGl0IG1lYW50LlxuICAgIHRoaXMubW9kZWxHcm91cCA9IGdyb3VwO1xuICAgIHRoaXMubW9kZWxVcCA9IHVwID8/IChyb3RhdGlvbiA/ICd5JyA6IHRoaXMuZGV0ZWN0TW9kZWxVcChvYmplY3QsIHNpemUpKTtcbiAgICBncm91cC5xdWF0ZXJuaW9uLmNvcHkodGhpcy51cHJpZ2h0Um90YXRpb24odGhpcy5tb2RlbFVwKSk7XG5cbiAgICB0aGlzLm1vZGVsUm9vdCA9IG9iamVjdDtcbiAgICB0aGlzLm1vZGVsV29ybGRSYWRpdXMgPSAoc2l6ZS5sZW5ndGgoKSAvIDIpICogc2NhbGU7XG4gICAgLy8gVGhlIGJveCBhYm92ZSB3YXMgbWVhc3VyZWQgYmVmb3JlIGFueSByb3RhdGlvbiBmcm9tIHRoZSBtZXRhZGF0YSB3YXMgYXBwbGllZDsgd2l0aCBvbmUsIGl0XG4gICAgLy8gaGFzIHRvIGJlIG1lYXN1cmVkIGFnYWluIHRvIGJlIHRoZSBtb2RlbCBhcyBpdCBhY3R1YWxseSBzaXRzLlxuICAgIHRoaXMuYnVpbGRTdXJmYWNlR3JpZChvYmplY3QsIHJvdGF0aW9uID8gbmV3IFRIUkVFLkJveDMoKS5zZXRGcm9tT2JqZWN0KG9iamVjdCkgOiBib3gpO1xuICAgIHRoaXMucmVmcmVzaFRhZ1Zpc2liaWxpdHkoKTtcbiAgICAvLyBNYXJrcyB0aGUgbW9kZWwgZm9yIHRoZSBkZXB0aCBwaWNrLCB3aGljaCByZW5kZXJzIHRoaXMgbGF5ZXIgYWxvbmUgLSBzbyB0YWdzIGFuZCB0aGUgZ2hvc3RcbiAgICAvLyBpdHNlbGYgY2Fubm90IGVuZCB1cCBiZWluZyB3aGF0IHRoZSBjdXJzb3IgcmVwb3J0cyBhcyB0aGUgc3VyZmFjZSB1bmRlciBpdC5cbiAgICBvYmplY3QudHJhdmVyc2UoKGNoaWxkKSA9PiBjaGlsZC5sYXllcnMuZW5hYmxlKFRocmVlSnNTZXJ2aWNlLlBJQ0tfTEFZRVIpKTtcbiAgICBjZW50ZXJlZC5hZGQob2JqZWN0KTtcbiAgICBjZW50ZXJlZC5hZGQodGhpcy50YWdHcm91cCk7XG4gICAgY2VudGVyZWQuYWRkKHRoaXMubW9kZWxUYWdHcm91cCk7XG4gICAgZ3JvdXAuYWRkKGNlbnRlcmVkKTtcbiAgICBncm91cC5zY2FsZS5zZXRTY2FsYXIoc2NhbGUpO1xuXG4gICAgdGhpcy5zY2VuZS5hZGQoZ3JvdXApO1xuICAgIHRoaXMuc2NlbmUudXBkYXRlTWF0cml4V29ybGQodHJ1ZSk7XG5cbiAgICAvLyBNYXJrZXJzIHJlZ2lzdGVyZWQgYmVmb3JlIHRoZSBtb2RlbCBmaW5pc2hlZCBsb2FkaW5nIHdlcmUgc2l6ZWQgYWdhaW5zdCB0aGUgb2xkIHNjYWxlLlxuICAgIHRoaXMucmVmcmVzaFNjcmVlblNpemVzKCk7XG5cbiAgICB0aGlzLmFkanVzdENsaXBwaW5nUGxhbmVzKChzaXplLmxlbmd0aCgpIC8gMikgKiBzY2FsZSk7XG5cbiAgICBpZiAoY2FtZXJhUG9zaXRpb24pIHtcbiAgICAgIHRoaXMuY2FtZXJhLnBvc2l0aW9uLnNldChjYW1lcmFQb3NpdGlvbi54LCBjYW1lcmFQb3NpdGlvbi55LCBjYW1lcmFQb3NpdGlvbi56KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jYW1lcmEucG9zaXRpb24uc2V0KDAsIDUsIDE1KTtcbiAgICB9XG4gICAgdGhpcy5jb250cm9scy50YXJnZXQuc2V0KDAsIDAsIDApO1xuICAgIHRoaXMuY29udHJvbHMudXBkYXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogV2hpY2ggb2YgdGhlIG1vZGVsJ3MgYXhlcyBpcyBpdHMgdmVydGljYWw6ICd5JyB3aGVuIGl0IGFscmVhZHkgc3RhbmRzIHVwcmlnaHQsIG9yIHdoZW4gaXQgaXNcbiAgICogbm90IGNsZWFyIGVub3VnaCB0byBhY3Qgb24uXG4gICAqXG4gICAqIE1vZGVscyBhcnJpdmUgaW4gdHdvIGNvbnZlbnRpb25zOiBZIHVwIChnbFRGLCBhbmQgd2hhdCB0aGlzIHZpZXdlciBhc3N1bWVzKSBhbmQgWiB1cCAobW9zdCBDQURcbiAgICogYW5kIHNjYW5uaW5nIGV4cG9ydHMpLiBBIFotdXAgbW9kZWwgbG9hZHMgbHlpbmcgb24gaXRzIHNpZGUuIFRocmVlIGluZGVwZW5kZW50IGN1ZXMgc2F5IHdoaWNoXG4gICAqIGF4aXMgaXMgdGhlIHZlcnRpY2FsIG9uZTpcbiAgICpcbiAgICogIC0gU3VyZmFjZSBhcmVhLiBGbG9vcnMgYW5kIGNlaWxpbmdzIGFsbCBmYWNlIGFsb25nIHRoZSB2ZXJ0aWNhbCwgd2hpbGUgd2FsbHMgYXJlIHNoYXJlZCBvdXRcbiAgICogICAgYmV0d2VlbiB0aGUgdHdvIGhvcml6b250YWwgYXhlcywgc28gdGhlIHZlcnRpY2FsIHVzdWFsbHkgY29sbGVjdHMgdGhlIG1vc3QgYXJlYS5cbiAgICogIC0gRXh0ZW50LiBBIGJ1aWxkaW5nIGlzIG5vcm1hbGx5IHdpZGVyIHRoYW4gaXQgaXMgdGFsbCwgc28gdGhlIHZlcnRpY2FsIGlzIGl0cyBzaG9ydGVzdCBzaWRlLlxuICAgKiAgLSBPcGVubmVzcy4gQSBjYXB0dXJlIG1hZGUgZnJvbSBvdXRzaWRlIGhhcyBncm91bmQgYW5kIHJvb2ZzIGJ1dCBub3RoaW5nIHVuZGVybmVhdGggdGhlbSwgc29cbiAgICogICAgYWxvbmcgdGhlIHZlcnRpY2FsIG5lYXJseSBhbGwgb2YgaXRzIHN1cmZhY2UgZmFjZXMgb25lIHdheTsgd2FsbHMgZmFjZSBib3RoIHdheXMgZXZlbmx5LlxuICAgKlxuICAgKiBFYWNoIGlzIHdyb25nIG9mdGVuIGVub3VnaCBvbiBpdHMgb3duIC0gYSBsb25nIGNvcnJpZG9yIGhhcyBtb3JlIHdhbGwgdGhhbiBmbG9vciwgYSB0b3dlciBpc1xuICAgKiB0YWxsZXIgdGhhbiBpdCBpcyB3aWRlIC0gc28gYSBjdWUgb25seSBjb3VudHMgd2hlbiBpdHMgYW5zd2VyIGlzIGNsZWFyLWN1dCwgYW5kIHRoZSBtb2RlbCBpc1xuICAgKiB0dXJuZWQgd2hlbiB0aGUgY2xlYXIgYW5zd2VycyBhZ3JlZS4gSXQgdXNlZCB0byB0YWtlIGFyZWEgYW5kIGV4dGVudCBhZ3JlZWluZyB3aXRoIGVhY2ggb3RoZXIsXG4gICAqIHdoaWNoIGZhaWxlZCBvbiBleGFjdGx5IHRoZSBtb2RlbHMgdGhhdCBuZWVkIHRoaXMgbW9zdDogaW4gYSB3aG9sZSBidWlsZGluZyBvciBhIGNpdHkgYmxvY2tcbiAgICogdGhlcmUgaXMgYXMgbXVjaCB3YWxsIGFzIGZsb29yLCB0aGUgYXJlYSBjdWUgY29tZXMgb3V0IGEgdGhyZWUtd2F5IHRpZSwgYW5kIGEgbW9kZWwgMTMwIG0gd2lkZVxuICAgKiBhbmQgMzQgbSB0YWxsIHdpdGggODYlIG9mIGl0cyBzdXJmYWNlIGZhY2luZyBvbmUgd2F5IHdhcyBsZWZ0IGx5aW5nIG9uIGl0cyBzaWRlLlxuICAgKlxuICAgKiBUdXJuaW5nIGEgbW9kZWwgdGhhdCB3YXMgZmluZSBpcyB3b3JzZSB0aGFuIGxlYXZpbmcgb25lIHRoYXQgd2FzIG5vdDogd2hlbiB0aGUgY2xlYXIgYW5zd2Vyc1xuICAgKiBjb250cmFkaWN0IGVhY2ggb3RoZXIsIG9yIHRoZXJlIGlzIG5vbmUsIG5vdGhpbmcgaXMgdHVybmVkLiBBIG1vZGVsIHRoYXQgYWxyZWFkeSBoYXMgWSBhcyBpdHNcbiAgICogdmVydGljYWwgaXMgbmV2ZXIgdG91Y2hlZC5cbiAgICovXG4gIHByaXZhdGUgZGV0ZWN0TW9kZWxVcChvYmplY3Q6IFRIUkVFLk9iamVjdDNELCBzaXplOiBUSFJFRS5WZWN0b3IzKTogVGhyZWVKc01vZGVsVXAge1xuICAgIGNvbnN0IGF4ZXMgPSBbJ3gnLCAneScsICd6J10gYXMgY29uc3Q7XG4gICAgLy8gUHJvamVjdGVkIGFyZWEgZmFjaW5nIGVhY2ggd2F5IGFsb25nIGVhY2ggYXhpczogW3Bvc2l0aXZlLCBuZWdhdGl2ZV0uXG4gICAgY29uc3QgYXJlYSA9IHsgeDogWzAsIDBdLCB5OiBbMCwgMF0sIHo6IFswLCAwXSB9O1xuXG4gICAgbGV0IHRyaWFuZ2xlQ291bnQgPSAwO1xuICAgIG9iamVjdC51cGRhdGVNYXRyaXhXb3JsZCh0cnVlKTtcbiAgICBvYmplY3QudHJhdmVyc2UoKGNoaWxkOiBhbnkpID0+IHtcbiAgICAgIGNvbnN0IHBvc2l0aW9uID0gY2hpbGQuaXNNZXNoICYmIGNoaWxkLmdlb21ldHJ5Py5hdHRyaWJ1dGVzPy5wb3NpdGlvbjtcbiAgICAgIGlmIChwb3NpdGlvbikge1xuICAgICAgICB0cmlhbmdsZUNvdW50ICs9IChjaGlsZC5nZW9tZXRyeS5pbmRleCA/IGNoaWxkLmdlb21ldHJ5LmluZGV4LmNvdW50IDogcG9zaXRpb24uY291bnQpIC8gMztcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAodHJpYW5nbGVDb3VudCA9PT0gMCkge1xuICAgICAgLy8gTm90aGluZyB3aXRoIGZhY2VzIHRvIHdlaWdoOiB0aGUgY29udmVudGlvbi5cbiAgICAgIHJldHVybiAneSc7XG4gICAgfVxuICAgIC8vIEEgc2FtcGxlIGlzIHBsZW50eSB0byBzZWUgd2hlcmUgdGhlIGFyZWEgbGllcywgYW5kIGtlZXBzIHRoaXMgY2hlYXAgb24gbW9kZWxzIHdpdGggbWlsbGlvbnNcbiAgICAvLyBvZiB0cmlhbmdsZXMuXG4gICAgY29uc3Qgc3RyaWRlID0gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKHRyaWFuZ2xlQ291bnQgLyAyMDAwMDApKTtcblxuICAgIGNvbnN0IGEgPSBuZXcgVEhSRUUuVmVjdG9yMygpO1xuICAgIGNvbnN0IGIgPSBuZXcgVEhSRUUuVmVjdG9yMygpO1xuICAgIGNvbnN0IGMgPSBuZXcgVEhSRUUuVmVjdG9yMygpO1xuICAgIGNvbnN0IG5vcm1hbCA9IG5ldyBUSFJFRS5WZWN0b3IzKCk7XG4gICAgb2JqZWN0LnRyYXZlcnNlKChjaGlsZDogYW55KSA9PiB7XG4gICAgICBjb25zdCBwb3NpdGlvbiA9IGNoaWxkLmlzTWVzaCAmJiBjaGlsZC5nZW9tZXRyeT8uYXR0cmlidXRlcz8ucG9zaXRpb247XG4gICAgICBpZiAoIXBvc2l0aW9uKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGluZGV4ID0gY2hpbGQuZ2VvbWV0cnkuaW5kZXg7XG4gICAgICBjb25zdCBjb3VudCA9IChpbmRleCA/IGluZGV4LmNvdW50IDogcG9zaXRpb24uY291bnQpIC8gMztcbiAgICAgIGZvciAobGV0IHRyaWFuZ2xlID0gMDsgdHJpYW5nbGUgPCBjb3VudDsgdHJpYW5nbGUgKz0gc3RyaWRlKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHRyaWFuZ2xlICogMztcbiAgICAgICAgYS5mcm9tQnVmZmVyQXR0cmlidXRlKHBvc2l0aW9uLCBpbmRleCA/IGluZGV4LmdldFgob2Zmc2V0KSA6IG9mZnNldCkuYXBwbHlNYXRyaXg0KGNoaWxkLm1hdHJpeFdvcmxkKTtcbiAgICAgICAgYi5mcm9tQnVmZmVyQXR0cmlidXRlKHBvc2l0aW9uLCBpbmRleCA/IGluZGV4LmdldFgob2Zmc2V0ICsgMSkgOiBvZmZzZXQgKyAxKS5hcHBseU1hdHJpeDQoY2hpbGQubWF0cml4V29ybGQpO1xuICAgICAgICBjLmZyb21CdWZmZXJBdHRyaWJ1dGUocG9zaXRpb24sIGluZGV4ID8gaW5kZXguZ2V0WChvZmZzZXQgKyAyKSA6IG9mZnNldCArIDIpLmFwcGx5TWF0cml4NChjaGlsZC5tYXRyaXhXb3JsZCk7XG4gICAgICAgIC8vIFRoZSBjcm9zcyBwcm9kdWN0J3MgbGVuZ3RoIGlzIHR3aWNlIHRoZSB0cmlhbmdsZSdzIGFyZWEsIHNvIGl0cyBjb21wb25lbnRzIGFyZSB0aGVcbiAgICAgICAgLy8gYXJlYSB0aGUgdHJpYW5nbGUgc2hvd3MgYWxvbmcgZWFjaCBheGlzLlxuICAgICAgICBub3JtYWwuY3Jvc3NWZWN0b3JzKGIuc3ViKGEpLCBjLnN1YihhKSk7XG4gICAgICAgIGF4ZXMuZm9yRWFjaCgoYXhpcykgPT4ge1xuICAgICAgICAgIGFyZWFbYXhpc11bbm9ybWFsW2F4aXNdID49IDAgPyAwIDogMV0gKz0gTWF0aC5hYnMobm9ybWFsW2F4aXNdKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0eXBlIEF4aXMgPSB0eXBlb2YgYXhlc1tudW1iZXJdO1xuICAgIGNvbnN0IHRvdGFsID0geyB4OiBhcmVhLnhbMF0gKyBhcmVhLnhbMV0sIHk6IGFyZWEueVswXSArIGFyZWEueVsxXSwgejogYXJlYS56WzBdICsgYXJlYS56WzFdIH07XG4gICAgY29uc3QgZXh0ZW50ID0geyB4OiBzaXplLngsIHk6IHNpemUueSwgejogc2l6ZS56IH07XG4gICAgLy8gSG93IG9uZS1zaWRlZCB0aGUgc3VyZmFjZSBpcyBhbG9uZyBlYWNoIGF4aXM6IDAgd2hlbiBpdCBmYWNlcyBib3RoIHdheXMgZXZlbmx5LCAxIHdoZW4gaXRcbiAgICAvLyBhbGwgZmFjZXMgdGhlIHNhbWUgd2F5LlxuICAgIGNvbnN0IGxvcHNpZGVkID0geyB4OiAwLCB5OiAwLCB6OiAwIH07XG4gICAgYXhlcy5mb3JFYWNoKChheGlzKSA9PiB7XG4gICAgICBsb3BzaWRlZFtheGlzXSA9IHRvdGFsW2F4aXNdID4gMCA/IE1hdGguYWJzKGFyZWFbYXhpc11bMF0gLSBhcmVhW2F4aXNdWzFdKSAvIHRvdGFsW2F4aXNdIDogMDtcbiAgICB9KTtcbiAgICAvKiogVGhlIGF4ZXMgb3JkZXJlZCBieSBhIG1lYXN1cmUsIGxhcmdlc3QgZmlyc3QuICovXG4gICAgY29uc3QgcmFua2VkID0gKG1lYXN1cmU6IFJlY29yZDxBeGlzLCBudW1iZXI+KTogQXhpc1tdID0+XG4gICAgICBbLi4uYXhlc10uc29ydCgoZmlyc3QsIHNlY29uZCkgPT4gbWVhc3VyZVtzZWNvbmRdIC0gbWVhc3VyZVtmaXJzdF0pO1xuXG4gICAgY29uc3QgW21vc3RBcmVhLCBuZXh0QXJlYV0gPSByYW5rZWQodG90YWwpO1xuICAgIGNvbnN0IFssIG1pZGRsZUV4dGVudCwgc2hvcnRlc3RdID0gcmFua2VkKGV4dGVudCk7XG4gICAgY29uc3QgW21vc3RPcGVuLCBuZXh0T3Blbl0gPSByYW5rZWQobG9wc2lkZWQpO1xuXG4gICAgLy8gV2hhdCBlYWNoIGN1ZSBzYXlzLCB3aGVuIGl0IHNheXMgaXQgY2xlYXJseTsgbnVsbCB3aGVuIGl0IGhhcyBubyBjbGVhciBhbnN3ZXIuXG4gICAgY29uc3QgYXJlYVNheXMgPSB0b3RhbFttb3N0QXJlYV0gPj0gMS4yNSAqIHRvdGFsW25leHRBcmVhXSA/IG1vc3RBcmVhIDogbnVsbDtcbiAgICBjb25zdCBleHRlbnRTYXlzID0gZXh0ZW50W21pZGRsZUV4dGVudF0gPj0gMS41ICogZXh0ZW50W3Nob3J0ZXN0XSA/IHNob3J0ZXN0IDogbnVsbDtcbiAgICBjb25zdCBvcGVubmVzc1NheXMgPSBsb3BzaWRlZFttb3N0T3Blbl0gPj0gMC41XG4gICAgICAmJiBsb3BzaWRlZFttb3N0T3Blbl0gPj0gMiAqIGxvcHNpZGVkW25leHRPcGVuXVxuICAgICAgLy8gTm90IG9uIHRoZSBzdHJlbmd0aCBvZiBhIGZldyBzdHJheSB0cmlhbmdsZXM6IHRoZSBzdXJmYWNlIGFsb25nIHRoYXQgYXhpcyBoYXMgdG8gbWF0dGVyLlxuICAgICAgJiYgdG90YWxbbW9zdE9wZW5dID49IDAuMjUgKiB0b3RhbFttb3N0QXJlYV1cbiAgICAgID8gbW9zdE9wZW5cbiAgICAgIDogbnVsbDtcblxuICAgIGNvbnN0IGNsZWFyID0gW2FyZWFTYXlzLCBleHRlbnRTYXlzLCBvcGVubmVzc1NheXNdLmZpbHRlcigoYXhpcyk6IGF4aXMgaXMgQXhpcyA9PiBheGlzICE9PSBudWxsKTtcbiAgICBsZXQgdmVydGljYWw6IEF4aXMgPSAneSc7XG4gICAgaWYgKGNsZWFyLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIENsZWFyIGFuc3dlcnMgdGhhdCBjb250cmFkaWN0IGVhY2ggb3RoZXIgYXJlIG5vIGFuc3dlci5cbiAgICAgIHZlcnRpY2FsID0gY2xlYXIuZXZlcnkoKGF4aXMpID0+IGF4aXMgPT09IGNsZWFyWzBdKSA/IGNsZWFyWzBdIDogJ3knO1xuICAgIH0gZWxzZSBpZiAobW9zdEFyZWEgPT09IHNob3J0ZXN0ICYmIHRvdGFsW21vc3RBcmVhXSA+PSAxLjI1ICogdG90YWwueSkge1xuICAgICAgLy8gTm90aGluZyBjbGVhci1jdXQsIGJ1dCBhcmVhIGFuZCBleHRlbnQgbGVhbiB0aGUgc2FtZSB3YXkgYW5kIGF3YXkgZnJvbSBZLlxuICAgICAgdmVydGljYWwgPSBtb3N0QXJlYTtcbiAgICB9XG4gICAgaWYgKHZlcnRpY2FsID09PSAneScpIHtcbiAgICAgIHJldHVybiAneSc7XG4gICAgfVxuXG4gICAgLy8gV2hpY2ggd2F5IGFsb25nIHRoYXQgYXhpcyBpcyB1cC4gUm9vZnMgYW5kIGdyb3VuZCBtYWtlIGFuIG91dGRvb3IgbW9kZWwgZmFjZSBtb3N0bHkgdXB3YXJkLFxuICAgIC8vIHdoaWNoIHNldHRsZXMgaXQ7IGluZG9vcnMgZmxvb3JzIGFuZCBjZWlsaW5ncyBiYWxhbmNlIG91dCwgYW5kIHRoZSBjb252ZW50aW9uIC0gcG9zaXRpdmUgaXNcbiAgICAvLyB1cCAtIGlzIHRoZSBiZXR0ZXIgZ3Vlc3MuXG4gICAgY29uc3QgW3Bvc2l0aXZlLCBuZWdhdGl2ZV0gPSBhcmVhW3ZlcnRpY2FsXTtcbiAgICBjb25zdCB1cCA9IGAke25lZ2F0aXZlID4gMC42NSAqIChwb3NpdGl2ZSArIG5lZ2F0aXZlKSA/ICctJyA6ICcnfSR7dmVydGljYWx9YCBhcyBUaHJlZUpzTW9kZWxVcDtcbiAgICBjb25zb2xlLmluZm8oYFRocmVlSnNTZXJ2aWNlOiB0aGlzIG1vZGVsJ3MgdmVydGljYWwgYXhpcyBsb29rcyBsaWtlICR7dXB9LCBub3QgeSAtIHN0YW5kaW5nIGl0IHVwcmlnaHQuYCk7XG4gICAgcmV0dXJuIHVwO1xuICB9XG5cbiAgLyoqIFRoZSByb3RhdGlvbiB0aGF0IGJyaW5ncyB0aGUgZ2l2ZW4gbW9kZWwgYXhpcyB0byBwb2ludCB1cC4gKi9cbiAgcHJpdmF0ZSB1cHJpZ2h0Um90YXRpb24odXA6IFRocmVlSnNNb2RlbFVwKTogVEhSRUUuUXVhdGVybmlvbiB7XG4gICAgY29uc3QgYXhpcyA9IG5ldyBUSFJFRS5WZWN0b3IzKCk7XG4gICAgYXhpc1t1cC5yZXBsYWNlKCctJywgJycpIGFzICd4JyB8ICd5JyB8ICd6J10gPSB1cC5zdGFydHNXaXRoKCctJykgPyAtMSA6IDE7XG4gICAgcmV0dXJuIG5ldyBUSFJFRS5RdWF0ZXJuaW9uKCkuc2V0RnJvbVVuaXRWZWN0b3JzKGF4aXMsIG5ldyBUSFJFRS5WZWN0b3IzKDAsIDEsIDApKTtcbiAgfVxuXG4gIC8qKiBXaGljaCBvZiB0aGUgbW9kZWwncyBheGVzIGlzIGN1cnJlbnRseSB0cmVhdGVkIGFzIHVwLCB3aGV0aGVyIGNob3NlbiBvciB3b3JrZWQgb3V0LiAqL1xuICBnZXRNb2RlbFVwKCk6IFRocmVlSnNNb2RlbFVwIHtcbiAgICByZXR1cm4gdGhpcy5tb2RlbFVwO1xuICB9XG5cbiAgLyoqXG4gICAqIFR1cm5zIHRoZSBtb2RlbCBzbyB0aGUgZ2l2ZW4gYXhpcyBwb2ludHMgdXAsIGF0IG9uY2UuXG4gICAqXG4gICAqIFRoZSBtb2RlbCBhbmQgaXRzIHRhZ3MgdHVybiBhcyBvbmUsIHNvIG5vdGhpbmcgc3RvcmVkIGhhcyB0byBiZSByZWNvbXB1dGVkLiBUaGUgY2FsbGVyIGlzXG4gICAqIGV4cGVjdGVkIHRvIHN0b3JlIHRoZSBjaG9pY2UsIG9yIHRoZSBuZXh0IGxvYWQgZ29lcyBiYWNrIHRvIHdvcmtpbmcgaXQgb3V0LlxuICAgKi9cbiAgc2V0TW9kZWxVcCh1cDogVGhyZWVKc01vZGVsVXApOiB2b2lkIHtcbiAgICB0aGlzLm1vZGVsVXAgPSB1cDtcbiAgICB0aGlzLm1vZGVsR3JvdXA/LnF1YXRlcm5pb24uY29weSh0aGlzLnVwcmlnaHRSb3RhdGlvbih1cCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEtlZXBzIHRoZSBkcmF3aW5nIGJ1ZmZlciBhbmQgY2FtZXJhIG1hdGNoZWQgdG8gdGhlIGNhbnZhcyBhcyBpdCBpcyByZXNpemVkLlxuICAgKlxuICAgKiByZW5kZXJlci5zZXRTaXplKCkgd3JpdGVzIGV4cGxpY2l0IHBpeGVsIHdpZHRoL2hlaWdodCBpbnRvIHRoZSBjYW52YXMncyBzdHlsZSwgb3ZlcnJpZGluZyB0aGVcbiAgICogMTAwJS8xMDAlIGl0IHN0YXJ0cyB3aXRoLiBXaXRob3V0IHRoaXMsIHRoZSBjYW52YXMga2VlcHMgd2hhdGV2ZXIgc2l6ZSBpdCBoYWQgYXQgc3RhcnR1cDogaGlkaW5nXG4gICAqIHRoZSB0b3AgbWVudSBncm93cyB0aGUgY29udGFpbmVyLCB0aGUgY2FudmFzIGRvZXMgbm90IGZvbGxvdywgYW5kIHRoZSBzdHJpcCB0aGF0IG9wZW5zIHVwIHNob3dzXG4gICAqIHRoZSBwYWdlIGJlaGluZCBpdCBpbnN0ZWFkIG9mIHRoZSBzY2VuZS5cbiAgICpcbiAgICogVGhlIHBhcmVudCBpcyBvYnNlcnZlZCByYXRoZXIgdGhhbiB0aGUgY2FudmFzLCBiZWNhdXNlIHJlc2l6aW5nIHRoZSBjYW52YXMgaXMgd2hhdCB0aGlzIHJlYWN0c1xuICAgKiB0byAtIHdhdGNoaW5nIHRoZSBlbGVtZW50IHdlIHJlc2l6ZSB3b3VsZCByZXRyaWdnZXIgdGhlIG9ic2VydmVyLlxuICAgKi9cbiAgcHJpdmF0ZSBvYnNlcnZlQ2FudmFzUmVzaXplKGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQpOiB2b2lkIHtcbiAgICBjb25zdCBjb250YWluZXIgPSBjYW52YXMucGFyZW50RWxlbWVudDtcbiAgICBpZiAoIWNvbnRhaW5lciB8fCB0eXBlb2YgUmVzaXplT2JzZXJ2ZXIgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5jYW52YXNSZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoKSA9PiB7XG4gICAgICBjb25zdCB3aWR0aCA9IGNvbnRhaW5lci5jbGllbnRXaWR0aDtcbiAgICAgIGNvbnN0IGhlaWdodCA9IGNvbnRhaW5lci5jbGllbnRIZWlnaHQ7XG4gICAgICBpZiAod2lkdGggPT09IDAgfHwgaGVpZ2h0ID09PSAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2FtZXJhLmFzcGVjdCA9IHdpZHRoIC8gaGVpZ2h0O1xuICAgICAgdGhpcy5jYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTaXplKHdpZHRoLCBoZWlnaHQpO1xuICAgICAgdGhpcy51cGRhdGVNZWFzdXJlTGluZVJlc29sdXRpb24oKTtcbiAgICAgIHRoaXMucmVmcmVzaFNjcmVlblNpemVzKCk7XG4gICAgfSk7XG4gICAgdGhpcy5jYW52YXNSZXNpemVPYnNlcnZlci5vYnNlcnZlKGNvbnRhaW5lcik7XG4gIH1cblxuICAvKipcbiAgICogU3RhcnRzIHRoZSBhbGlnbm1lbnQgd2Fsa3Rocm91Z2g6IHBpY2sgYSB0YWcsIHRoZW4gY2xpY2sgd2hlcmUgaXQgcmVhbGx5IGlzLCB0aHJlZSB0aW1lcy5cbiAgICpcbiAgICogRXhpc3RpbmcgdGFncyBhcmUgdGhlIGNvcnJlc3BvbmRlbmNlcyAtIHRoZXkgYWxyZWFkeSBjYXJyeSB0aGUgc3RvcmVkIGNvb3JkaW5hdGUsIHNvIHRoZSBwZXJzb25cbiAgICogb25seSBoYXMgdG8gc3VwcGx5IHRoZSBtYXRjaGluZyBzcG90IG9uIHRoZSBtb2RlbC4gTm8gbmV3IHJlY29yZHMgYXJlIHdyaXR0ZW47IG5vdGhpbmcgaXNcbiAgICogYXBwbGllZCB1bnRpbCBzb2x2ZUFsaWdubWVudEZyb21QYWlycygpIHN1Y2NlZWRzLlxuICAgKi9cbiAgLyoqXG4gICAqIFNob3dzIGV2ZXJ5IHRhZyB0aGF0IGNhbWUgZnJvbSBlbHNld2hlcmUsIHdoZXRoZXIgb3Igbm90IGl0IGxhbmRzIG9uIHRoZSBtb2RlbCwgd2l0aG91dCBhcm1pbmdcbiAgICogYW55dGhpbmc6IGNsaWNrcyBzdGlsbCBkbyB3aGF0IHRoZXkgYWx3YXlzIGRvLlxuICAgKlxuICAgKiBDYWxpYnJhdGluZyBzaG93cyB0aGVtIHRvbywgYW5kIGVuZGluZyBhIGNhbGlicmF0aW9uIC0gc2F2ZWQgb3IgYWJhbmRvbmVkIC0gcHV0cyB0aGVtIGJhY2tcbiAgICogdW5kZXIgdGhlIHVzdWFsIHJ1bGUsIHNvIHRoaXMgb25seSBldmVyIGhhcyB0byBiZSBzd2l0Y2hlZCBvbi5cbiAgICovXG4gIHJldmVhbENhbGlicmF0aW9uVGFncyhyZXZlYWxlZCA9IHRydWUpOiB2b2lkIHtcbiAgICB0aGlzLnJldmVhbGluZ0NhbGlicmF0aW9uVGFncyA9IHJldmVhbGVkO1xuICAgIHRoaXMucmVmcmVzaFRhZ1Zpc2liaWxpdHkoKTtcbiAgICAvLyBBbm90aGVyIHZpZXdlciBzaG93aW5nIHRoZSB0YWdzIHNob3dzIHRoZXNlIGFzIHdlbGwgbm93OyBzZWUgc2hvd3NDYWxpYnJhdGlvblRhZ3MuXG4gICAgdGhpcy5hbm5vdW5jZVRhZ3NDaGFuZ2VkKCk7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGUgdGFncyBhIGNhbGlicmF0aW9uIHdvcmtzIHdpdGggYXJlIG9uIHNob3cgLSB3aGlsZSBvbmUgaXMgdW5kZXIgd2F5LCBvciBpdHMgcGFuZWxcbiAgICogb3BlbiAtIGluY2x1ZGluZyB0aG9zZSB0aGF0IGRvIG5vdCBsYW5kIG9uIHRoZSBtb2RlbC4gRm9yIGFub3RoZXIgdmlld2VyIHNob3dpbmcgdGhlIHRhZ3MsXG4gICAqIHdoaWNoIG90aGVyd2lzZSBsZWF2ZXMgb3V0IHRoZSBvbmVzIGZyb20gZWxzZXdoZXJlIHVudGlsIHRoZSBtb2RlbCBpcyBjYWxpYnJhdGVkLlxuICAgKi9cbiAgc2hvd3NDYWxpYnJhdGlvblRhZ3MoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuYWxpZ25pbmcgfHwgdGhpcy5yZXZlYWxpbmdDYWxpYnJhdGlvblRhZ3M7XG4gIH1cblxuICAvKiogU2F5cyBhIHRhZyB3YXMgY2xpY2tlZCBpbiBhIHZpZXdlciBkcmF3aW5nIHRoZSBtb2RlbCBlbHNld2hlcmUsIGFzIGEgY2xpY2sgb24gaXQgaGVyZSB3b3VsZC4gKi9cbiAgY2xpY2tUYWcoZWxlbWVudElkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBzcHJpdGUgPSB0aGlzLnRhZ1Nwcml0ZXMuZ2V0KGVsZW1lbnRJZCk7XG4gICAgaWYgKHNwcml0ZSkge1xuICAgICAgdGhpcy50YWdDbGlja2VkJC5uZXh0KHsgZWxlbWVudElkLCBwb2lUeXBlOiBzcHJpdGUudXNlckRhdGEucG9pVHlwZSA/PyBudWxsIH0pO1xuICAgIH1cbiAgfVxuXG4gIHN0YXJ0VGFnQWxpZ25tZW50KCk6IHZvaWQge1xuICAgIC8vIE9uZSBwb2ludGVyIG1vZGUgYXQgYSB0aW1lLCB0aGUgc2FtZSBydWxlIHN0YXJ0TWVhc3VyaW5nKCkgYXBwbGllcyB0aGUgb3RoZXIgd2F5IHJvdW5kLlxuICAgIGlmICh0aGlzLm1lYXN1cmluZykge1xuICAgICAgdGhpcy5jYW5jZWxNZWFzdXJpbmcoKTtcbiAgICB9XG4gICAgdGhpcy5hbGlnbmluZyA9IHRydWU7XG4gICAgdGhpcy5hbGlnbm1lbnRQYWlycyA9IFtdO1xuICAgIHRoaXMuY2xlYXJBbGlnbm1lbnRTb3VyY2UoKTtcbiAgICAvLyBXaGlsZSBjYWxpYnJhdGluZywgdGhlIHRhZ3MgZnJvbSBlbHNld2hlcmUgYXJlIGFsbCBzaG93biAtIGluY2x1ZGluZyB0aGUgb25lcyBvZmYgdGhlIG1vZGVsLFxuICAgIC8vIHdoaWNoIGFyZSBleGFjdGx5IHRoZSBvbmVzIGEgY2FsaWJyYXRpb24gaXMgZm9yLlxuICAgIHRoaXMucmVmcmVzaFRhZ1Zpc2liaWxpdHkoKTtcbiAgICBpZiAodGhpcy5yZW5kZXJlcikge1xuICAgICAgdGhpcy5yZW5kZXJlci5kb21FbGVtZW50LnN0eWxlLmN1cnNvciA9ICdjcm9zc2hhaXInO1xuICAgIH1cbiAgICB0aGlzLmFsaWdubWVudENoYW5nZWQoKTtcbiAgICB0aGlzLmFubm91bmNlVGFnc0NoYW5nZWQoKTtcbiAgfVxuXG4gIGNhbmNlbFRhZ0FsaWdubWVudCgpOiB2b2lkIHtcbiAgICBjb25zdCB3YXNBbGlnbmluZyA9IHRoaXMuYWxpZ25pbmc7XG4gICAgdGhpcy5hbGlnbmluZyA9IGZhbHNlO1xuICAgIHRoaXMucmV2ZWFsaW5nQ2FsaWJyYXRpb25UYWdzID0gZmFsc2U7XG4gICAgdGhpcy5hbGlnbm1lbnRQYWlycyA9IFtdO1xuICAgIHRoaXMuY2xlYXJBbGlnbm1lbnRTb3VyY2UoKTtcbiAgICB0aGlzLnJlZnJlc2hUYWdWaXNpYmlsaXR5KCk7XG4gICAgaWYgKHRoaXMucmVuZGVyZXIpIHtcbiAgICAgIHRoaXMucmVuZGVyZXIuZG9tRWxlbWVudC5zdHlsZS5jdXJzb3IgPSAnZGVmYXVsdCc7XG4gICAgfVxuICAgIHRoaXMuYWxpZ25tZW50Q2hhbmdlZCgpO1xuICAgIHRoaXMuYW5ub3VuY2VUYWdzQ2hhbmdlZCgpO1xuICAgIGlmICh3YXNBbGlnbmluZykge1xuICAgICAgdGhpcy5hbGlnbm1lbnRDYW5jZWxsZWQkLm5leHQoKTtcbiAgICB9XG4gIH1cblxuICBpc0FsaWduaW5nVGFncygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5hbGlnbmluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBwb2ludGVyIHNob3VsZCBiZSBzaG93aW5nIHRoZSBwbGFjZW1lbnQgZ2hvc3QuXG4gICAqXG4gICAqIFRydWUgd2hpbGUgcGxhY2luZyBhIHRhZywgYW5kIHdoaWxlIGNhbGlicmF0aW5nIG9uY2UgYSB0YWcgaGFzIGJlZW4gcGlja2VkIC0gdGhhdCBzZWNvbmQgY2xpY2tcbiAgICogaXMgdGhlIHNhbWUgcXVlc3Rpb24gKFwid2hlcmUgb24gdGhlIG1vZGVsP1wiKSBhbmQgZGVzZXJ2ZXMgdGhlIHNhbWUgYWltaW5nIGFpZC4gTm90IHRydWUgZm9yIHRoZVxuICAgKiBmaXJzdCBoYWxmIG9mIGEgcGFpciwgd2hpY2ggaXMgYSBjbGljayBvbiBhIHRhZywgbm90IG9uIHRoZSBtb2RlbC5cbiAgICovXG4gIHByaXZhdGUgaXNQcmV2aWV3aW5nUGxhY2VtZW50KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnBsYWNpbmdUYWcgfHwgdGhpcy5tZWFzdXJpbmcgfHwgKHRoaXMuYWxpZ25pbmcgJiYgISF0aGlzLmFsaWdubWVudFNvdXJjZSk7XG4gIH1cblxuICAvKiogV2hldGhlciBhIHRhZyBpcyBjdXJyZW50bHkgcmVnaXN0ZXJlZCBmb3IgdGhpcyBlbGVtZW50LiAqL1xuICBoYXNUYWcoZWxlbWVudElkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50YWdTcHJpdGVzLmhhcyhlbGVtZW50SWQpO1xuICB9XG5cbiAgLyoqIEhvdyBtYW55IHRhZ3MgYXJlIG9uIHNob3cgLSB0aGUgb25lcyBhIHBlcnNvbiBjb3VsZCBhY3R1YWxseSBjbGljay4gKi9cbiAgZ2V0VGFnQ291bnQoKTogbnVtYmVyIHtcbiAgICBsZXQgdmlzaWJsZSA9IDA7XG4gICAgdGhpcy50YWdTcHJpdGVzLmZvckVhY2goKHNwcml0ZSkgPT4ge1xuICAgICAgaWYgKHNwcml0ZS52aXNpYmxlKSB7XG4gICAgICAgIHZpc2libGUgKz0gMTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gdmlzaWJsZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTb2x2ZXMgYW5kIGFwcGxpZXMgdGhlIGFsaWdubWVudCBjb2xsZWN0ZWQgc28gZmFyLCByZXR1cm5pbmcgaXQgc28gdGhlIGNhbGxlciBjYW4gcGVyc2lzdCBpdC5cbiAgICpcbiAgICogUmV0dXJucyBudWxsIHdoZW4gdGhlIHRocmVlIHRhZ3MgdHVybiBvdXQgdG8gYmUgY29sbGluZWFyLCBpbiB3aGljaCBjYXNlIG5vdGhpbmcgaXMgYXBwbGllZCBhbmRcbiAgICogdGhlIHdhbGt0aHJvdWdoIHN0YXlzIG9wZW4gZm9yIHRoZSBwZXJzb24gdG8gcGljayBhIGJldHRlciB0aGlyZCBwb2ludC5cbiAgICovXG4gIHNvbHZlQWxpZ25tZW50RnJvbVBhaXJzKCk6IFRocmVlSnNBbGlnbm1lbnQgfCBudWxsIHtcbiAgICBjb25zdCB1cCA9IG5ldyBUSFJFRS5WZWN0b3IzKCk7XG4gICAgdXBbdGhpcy5tb2RlbFVwLnJlcGxhY2UoJy0nLCAnJykgYXMgJ3gnIHwgJ3knIHwgJ3onXSA9IHRoaXMubW9kZWxVcC5zdGFydHNXaXRoKCctJykgPyAtMSA6IDE7XG4gICAgY29uc3QgYWxpZ25tZW50ID0gc29sdmVUaHJlZUpzQWxpZ25tZW50KHRoaXMuYWxpZ25tZW50UGFpcnMsIHVwKTtcbiAgICBpZiAoIWFsaWdubWVudCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIC8vIE91dCBvZiBjYWxpYnJhdGluZyBtb2RlIGZpcnN0OiBhcHBseWluZyB0aGUgcmVzdWx0IHJlLWRlY2lkZXMgd2hpY2ggdGFncyBzaG93LCBhbmQgZnJvbSBoZXJlXG4gICAgLy8gb24gdGhhdCBpcyB0aGUgb25lcyBvbiB0aGUgbW9kZWwgYWdhaW4sIG5vdCBhbGwgb2YgdGhlbS5cbiAgICB0aGlzLmFsaWduaW5nID0gZmFsc2U7XG4gICAgdGhpcy5yZXZlYWxpbmdDYWxpYnJhdGlvblRhZ3MgPSBmYWxzZTtcbiAgICB0aGlzLmFwcGx5QWxpZ25tZW50S2VlcGluZ093blRhZ3MoYWxpZ25tZW50KTtcbiAgICB0aGlzLnJlbmRlcmVyLmRvbUVsZW1lbnQuc3R5bGUuY3Vyc29yID0gJ2RlZmF1bHQnO1xuICAgIHRoaXMuYWxpZ25tZW50Q2hhbmdlZCgpO1xuICAgIHJldHVybiBhbGlnbm1lbnQ7XG4gIH1cblxuICAvKipcbiAgICogQXBwbGllcyBhIG5ldyBjYWxpYnJhdGlvbiB3aGlsZSBrZWVwaW5nIGV2ZXJ5IHRhZyBwbGFjZWQgaW4gdGhpcyBtb2RlbCBleGFjdGx5IHdoZXJlIGl0IGlzLlxuICAgKlxuICAgKiBBIGNhbGlicmF0aW9uIGlzIHdvcmtlZCBvdXQgZm9yIHRoZSB0YWdzIHRoYXQgY2FtZSBmcm9tIGVsc2V3aGVyZS4gVGhlIG1vZGVsJ3Mgb3duIHRhZ3Mgd2VyZSBwdXRcbiAgICogd2hlcmUgdGhleSBhcmUgYnkgc29tZW9uZSBjbGlja2luZyB0aGUgbW9kZWwsIHNvIHRoZXkgbXVzdCBub3QgZm9sbG93IGl0LiBUaGVpciBzdG9yZWRcbiAgICogY29vcmRpbmF0ZXMgYXJlIHJld3JpdHRlbiBpbnN0ZWFkOiBpbnRvIHRoZSBzaGFyZWQgc3BhY2UgYXMgdGhlIG5ldyBjYWxpYnJhdGlvbiBkZWZpbmVzIGl0LlxuICAgKiBUaGF0IGlzIGFsc28gd2hhdCBtYWtlcyB0aGVtIGNvbXBhcmFibGUgd2l0aCBvdGhlciB2aXNpdHMgZnJvbSBoZXJlIG9uIC0gYSB0YWcgcGxhY2VkIGJlZm9yZVxuICAgKiB0aGUgbW9kZWwgd2FzIGNhbGlicmF0ZWQgd2FzIGluIHRoZSBtb2RlbCdzIG93biBjb29yZGluYXRlcywgdmlzaWJsZSBub3doZXJlIGVsc2UuXG4gICAqXG4gICAqIFRoZSByZXdyaXR0ZW4gdGFncyBhcmUga2VwdCBmb3IgdGhlIGNhbGxlciB0byBzdG9yZTsgc2VlIHRha2VSZWJhc2VkVGFncygpLlxuICAgKi9cbiAgcHJpdmF0ZSBhcHBseUFsaWdubWVudEtlZXBpbmdPd25UYWdzKGFsaWdubWVudDogVGhyZWVKc0FsaWdubWVudCk6IHZvaWQge1xuICAgIGNvbnN0IG93biA9IFsuLi50aGlzLnRhZ1Nwcml0ZXMudmFsdWVzKCldLmZpbHRlcigoc3ByaXRlKSA9PiB0aGlzLmlzT3duZWRCeVZpc2l0KHNwcml0ZSkpO1xuICAgIC8vIFdoZXJlIGVhY2ggb25lIGlzIG5vdywgaW4gdGhlIHNwYWNlIHRoZSBtb2RlbCBzaXRzIGluLCBhbmQgaG93IGl0cyBwYXJlbnQgd2FzIHR1cm5lZC5cbiAgICBjb25zdCBwbGFjZWQgPSBvd24ubWFwKChzcHJpdGUpID0+IHtcbiAgICAgIHNwcml0ZS5wYXJlbnQ/LnVwZGF0ZU1hdHJpeCgpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3ByaXRlLFxuICAgICAgICBwb3NpdGlvbjogc3ByaXRlLnBvc2l0aW9uLmNsb25lKCkuYXBwbHlNYXRyaXg0KHNwcml0ZS5wYXJlbnQ/Lm1hdHJpeCA/PyBuZXcgVEhSRUUuTWF0cml4NCgpKSxcbiAgICAgICAgdHVybjogc3ByaXRlLnBhcmVudD8ucXVhdGVybmlvbi5jbG9uZSgpID8/IG5ldyBUSFJFRS5RdWF0ZXJuaW9uKCksXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgdGhpcy5zZXRUYWdBbGlnbm1lbnQoYWxpZ25tZW50KTtcblxuICAgIGNvbnN0IGludmVyc2UgPSB0aGlzLnRhZ0dyb3VwLm1hdHJpeC5jbG9uZSgpLmludmVydCgpO1xuICAgIGNvbnN0IHVudHVybiA9IHRoaXMudGFnR3JvdXAucXVhdGVybmlvbi5jbG9uZSgpLmludmVydCgpO1xuICAgIHRoaXMucmViYXNlZFRhZ3MgPSBwbGFjZWQubWFwKCh7IHNwcml0ZSwgcG9zaXRpb24sIHR1cm4gfSkgPT4ge1xuICAgICAgc3ByaXRlLnBvc2l0aW9uLmNvcHkocG9zaXRpb24uYXBwbHlNYXRyaXg0KGludmVyc2UpKTtcbiAgICAgIHNwcml0ZS51c2VyRGF0YS5mcmFtZSA9IG51bGw7XG4gICAgICB0aGlzLnBhcmVudFRhZyhzcHJpdGUpO1xuICAgICAgdGhpcy5zY2FsZVRhZ0Zvck1vZGVsKHNwcml0ZSk7XG4gICAgICBjb25zdCByb3RhdGlvbiA9IHVudHVybi5jbG9uZSgpLm11bHRpcGx5KHR1cm4pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaWQ6IHNwcml0ZS5uYW1lLFxuICAgICAgICBwb3NpdGlvbjogeyB4OiBzcHJpdGUucG9zaXRpb24ueCwgeTogc3ByaXRlLnBvc2l0aW9uLnksIHo6IHNwcml0ZS5wb3NpdGlvbi56IH0sXG4gICAgICAgIHJvdGF0ZURpcmVjdGlvbjogKHsgeCwgeSwgeiB9KSA9PiB7XG4gICAgICAgICAgY29uc3QgdHVybmVkID0gbmV3IFRIUkVFLlZlY3RvcjMoeCwgeSwgeikuYXBwbHlRdWF0ZXJuaW9uKHJvdGF0aW9uKTtcbiAgICAgICAgICByZXR1cm4geyB4OiB0dXJuZWQueCwgeTogdHVybmVkLnksIHo6IHR1cm5lZC56IH07XG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH0pO1xuICAgIHRoaXMucmVmcmVzaFRhZ1Zpc2liaWxpdHkoKTtcbiAgfVxuXG4gIC8qKiBIYW5kcyBvdmVyIHRoZSB0YWdzIHRoZSBsYXN0IGNhbGlicmF0aW9uIHJld3JvdGUsIG9uY2UsIGZvciB0aGVtIHRvIGJlIHN0b3JlZC4gKi9cbiAgdGFrZVJlYmFzZWRUYWdzKCk6IFRocmVlSnNSZWJhc2VkVGFnW10ge1xuICAgIGNvbnN0IHJlYmFzZWQgPSB0aGlzLnJlYmFzZWRUYWdzO1xuICAgIHRoaXMucmViYXNlZFRhZ3MgPSBbXTtcbiAgICByZXR1cm4gcmViYXNlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaG9vc2VzIHRoZSB0YWcgZm9yIHRoZSBwYWlyIGJlaW5nIG1hdGNoZWQgYnkgaWQsIGluc3RlYWQgb2YgYnkgY2xpY2tpbmcgaXQuXG4gICAqXG4gICAqIENsaWNraW5nIGEgdGFnIHN1cHBvc2VzIGl0IGNhbiBiZSBmb3VuZC4gT24gYSBtb2RlbCB0aGF0IGhhcyBuZXZlciBiZWVuIGNhbGlicmF0ZWQgdGhlIHRhZ3MgbWF5XG4gICAqIHNpdCBmYXIgZnJvbSBpdCwgb3IgYWxsIG9uIHRvcCBvZiBvbmUgYW5vdGhlcjsgYSBsaXN0IGhhcyBuZWl0aGVyIHByb2JsZW0uXG4gICAqL1xuICBzZWxlY3RBbGlnbm1lbnRUYWcoZWxlbWVudElkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBzcHJpdGUgPSB0aGlzLnRhZ1Nwcml0ZXMuZ2V0KGVsZW1lbnRJZCk7XG4gICAgaWYgKFxuICAgICAgIXRoaXMuYWxpZ25pbmcgfHwgdGhpcy5hbGlnbm1lbnRTb3VyY2UgfHwgIXRoaXMuY2FuTWF0Y2hBbm90aGVyVGFnKClcbiAgICAgIHx8ICFzcHJpdGUgfHwgIXRoaXMuY2FsaWJyYXRpb25DYW5kaWRhdGVzKCkuaW5jbHVkZXMoc3ByaXRlKVxuICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLnNldEFsaWdubWVudFNvdXJjZShzcHJpdGUpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRBbGlnbm1lbnRTb3VyY2Uoc3ByaXRlOiBUSFJFRS5PYmplY3QzRCk6IHZvaWQge1xuICAgIC8vIFRoZSBzcHJpdGUncyBvd24gcG9zaXRpb24gaXMgdGhlIHN0b3JlZCBjb29yZGluYXRlLCB1bnRvdWNoZWQgYnkgYW55IGFsaWdubWVudCBhbHJlYWR5XG4gICAgLy8gYXBwbGllZCAtIHRoYXQgdHJhbnNmb3JtIGxpdmVzIG9uIHRoZSBncm91cCwgbm90IG9uIHRoZSBzcHJpdGUuXG4gICAgY29uc3Qgc3RvcmVkID0gc3ByaXRlLnBvc2l0aW9uO1xuICAgIHRoaXMuYWxpZ25tZW50U291cmNlID0geyB4OiBzdG9yZWQueCwgeTogc3RvcmVkLnksIHo6IHN0b3JlZC56IH07XG4gICAgdGhpcy5hbGlnbm1lbnRTb3VyY2VUYWdJZCA9IHNwcml0ZS5uYW1lO1xuICAgIHRoaXMuYWxpZ25tZW50Q2hhbmdlZCgndGFnJyk7XG4gIH1cblxuICBwcml2YXRlIGNsZWFyQWxpZ25tZW50U291cmNlKCk6IHZvaWQge1xuICAgIHRoaXMuYWxpZ25tZW50U291cmNlID0gbnVsbDtcbiAgICB0aGlzLmFsaWdubWVudFNvdXJjZVRhZ0lkID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgdGhlIGNhbGlicmF0aW9uIHN0aWxsIGhhcyByb29tIGZvciBhIHBhaXIgYW5kIGEgdGFnIHRvIG1ha2UgaXQgZnJvbS4gKi9cbiAgcHJpdmF0ZSBjYW5NYXRjaEFub3RoZXJUYWcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuYWxpZ25tZW50UGFpcnMubGVuZ3RoIDwgVGhyZWVKc1NlcnZpY2UuQ0FMSUJSQVRJT05fUEFJUlNcbiAgICAgICYmIHRoaXMuY2FsaWJyYXRpb25DYW5kaWRhdGVzKCkubGVuZ3RoID4gMDtcbiAgfVxuXG4gIC8qKiBIYW5kbGVzIGEgY2xpY2sgd2hpbGUgdGhlIGFsaWdubWVudCB3YWxrdGhyb3VnaCBpcyBydW5uaW5nLiAqL1xuICBwcml2YXRlIGhhbmRsZUFsaWdubWVudENsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmFsaWdubWVudFNvdXJjZSkge1xuICAgICAgLy8gRmlyc3QgaGFsZiBvZiBhIHBhaXI6IHdoaWNoIHRhZyBhcmUgd2UgdGFsa2luZyBhYm91dD9cbiAgICAgIGlmICghdGhpcy5jYW5NYXRjaEFub3RoZXJUYWcoKSkge1xuICAgICAgICAvLyBOb3RoaW5nIGxlZnQgdG8gbWF0Y2g6IHdoYXQgcmVtYWlucyBpcyB0byBzYXZlLCBvciB0byB0YWtlIGEgcGFpciBiYWNrLlxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBoaXQgPSB0aGlzLnJheWNhc3Rlci5pbnRlcnNlY3RPYmplY3RzKHRoaXMuY2FsaWJyYXRpb25DYW5kaWRhdGVzKCksIGZhbHNlKVswXTtcbiAgICAgIGlmICghaGl0KSB7XG4gICAgICAgIHRoaXMuYWxpZ25tZW50Q2xpY2tJZ25vcmVkJC5uZXh0KCd0YWcnKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5zZXRBbGlnbm1lbnRTb3VyY2UoaGl0Lm9iamVjdCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gU2Vjb25kIGhhbGY6IHdoZXJlIHRoYXQgdGFnIGFjdHVhbGx5IGJlbG9uZ3Mgb24gdGhlIG1vZGVsLlxuICAgIGNvbnN0IHRhcmdldCA9IHRoaXMucGlja0FsaWdubWVudFRhcmdldChldmVudCk7XG4gICAgaWYgKCF0YXJnZXQpIHtcbiAgICAgIHRoaXMuYWxpZ25tZW50Q2xpY2tJZ25vcmVkJC5uZXh0KCdwb2ludCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmFsaWdubWVudFBhaXJzLnB1c2goeyB0YWdJZDogdGhpcy5hbGlnbm1lbnRTb3VyY2VUYWdJZCwgc291cmNlOiB0aGlzLmFsaWdubWVudFNvdXJjZSwgdGFyZ2V0IH0pO1xuICAgIHRoaXMuY2xlYXJBbGlnbm1lbnRTb3VyY2UoKTtcbiAgICB0aGlzLmFsaWdubWVudENoYW5nZWQoJ3BvaW50Jyk7XG4gIH1cblxuICAvKipcbiAgICogUmVjb3JkcyB3aGVyZSB0aGUgdGFnIGJlaW5nIG1hdGNoZWQgcmVhbGx5IGlzLCBmcm9tIGEgc3BvdCBhbm90aGVyIHZpZXdlciBwaWNrZWQgb24gdGhlIG1vZGVsIC1cbiAgICogdGhlIHNwbGF0IHZpZXdlciAtIGluIHRoZSBtb2RlbCdzIG93biBjb29yZGluYXRlczogdGhlIGZyYW1lIHBpY2tBbGlnbm1lbnRUYXJnZXQgbWVhc3VyZXMgYVxuICAgKiBjbGljayBpbiwgYXMgcGxhY2VUYWdBdE1vZGVsUG9pbnQgdGFrZXMgaXQuIEZhbHNlIHdoZW4gbm8gdGFnIGlzIHdhaXRpbmcgZm9yIGl0cyBzcG90LlxuICAgKi9cbiAgbWF0Y2hBbGlnbm1lbnRUYWdBdE1vZGVsUG9pbnQocG9pbnQ6IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHo6IG51bWJlciB9KTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmFsaWduaW5nIHx8ICF0aGlzLmFsaWdubWVudFNvdXJjZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLmFsaWdubWVudFBhaXJzLnB1c2goe1xuICAgICAgdGFnSWQ6IHRoaXMuYWxpZ25tZW50U291cmNlVGFnSWQsXG4gICAgICBzb3VyY2U6IHRoaXMuYWxpZ25tZW50U291cmNlLFxuICAgICAgdGFyZ2V0OiB7IHg6IHBvaW50LngsIHk6IHBvaW50LnksIHo6IHBvaW50LnogfSxcbiAgICB9KTtcbiAgICB0aGlzLmNsZWFyQWxpZ25tZW50U291cmNlKCk7XG4gICAgdGhpcy5hbGlnbm1lbnRDaGFuZ2VkKCdwb2ludCcpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRha2VzIGJhY2sgdGhlIGxhc3QgdGhpbmcgZG9uZSBpbiB0aGUgY2FsaWJyYXRpb24gdW5kZXIgd2F5OiB0aGUgY2hvaWNlIG9mIHRhZyB3aGlsZSBpdHMgcGxhY2VcbiAgICogb24gdGhlIG1vZGVsIGlzIGJlaW5nIGFza2VkIGZvciwgdGhlIGxhc3QgbWF0Y2hlZCBwYWlyIG90aGVyd2lzZS5cbiAgICpcbiAgICogT25lIHN0ZXAgYXQgYSB0aW1lLCBzbyBhIGNsaWNrIG1hZGUgYnkgbWlzdGFrZSBjb3N0cyB0aGF0IGNsaWNrIGFuZCBub3QgdGhlIHdob2xlIGNhbGlicmF0aW9uLlxuICAgKiBSZXR1cm5zIGZhbHNlIHdoZW4gdGhlcmUgaXMgbm90aGluZyB0byB0YWtlIGJhY2suXG4gICAqL1xuICB1bmRvQWxpZ25tZW50U3RlcCgpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuYWxpZ25pbmcpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuYWxpZ25tZW50U291cmNlKSB7XG4gICAgICB0aGlzLmNsZWFyQWxpZ25tZW50U291cmNlKCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmFsaWdubWVudFBhaXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuYWxpZ25tZW50UGFpcnMucG9wKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5hbGlnbm1lbnRDaGFuZ2VkKCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBvbmUgbWF0Y2hlZCBwYWlyLCB3aGljaGV2ZXIgaXQgaXMsIHB1dHRpbmcgaXRzIHRhZyBiYWNrIG9uIG9mZmVyLlxuICAgKlxuICAgKiBGb3IgdGhlIHBvaW50IG5vdGljZWQgdG8gYmUgd3Jvbmcgb25seSBhZnRlciBvdGhlcnMgd2VyZSBtYXRjaGVkOiB0YWtpbmcgc3RlcHMgYmFjayBvbmUgYnkgb25lXG4gICAqIHRvIHJlYWNoIGl0IHdvdWxkIHRocm93IGF3YXkgdGhlIGdvb2Qgb25lcyBtYWRlIHNpbmNlLlxuICAgKi9cbiAgcmVtb3ZlQWxpZ25tZW50UGFpcihpbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmFsaWduaW5nIHx8ICFOdW1iZXIuaXNJbnRlZ2VyKGluZGV4KSB8fCBpbmRleCA8IDAgfHwgaW5kZXggPj0gdGhpcy5hbGlnbm1lbnRQYWlycy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5hbGlnbm1lbnRQYWlycy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIHRoaXMuYWxpZ25tZW50Q2hhbmdlZCgpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqIFRoZSB0YWdzIG1hdGNoZWQgc28gZmFyIGluIHRoZSBjYWxpYnJhdGlvbiB1bmRlciB3YXksIGluIHRoZSBvcmRlciB0aGV5IGFyZSBudW1iZXJlZCBpbi4gKi9cbiAgZ2V0QWxpZ25tZW50UGFpcnMoKTogVGhyZWVKc0FsaWdubWVudE1hdGNoW10ge1xuICAgIHJldHVybiB0aGlzLmFsaWdubWVudFBhaXJzLm1hcCgocGFpcikgPT4ge1xuICAgICAgY29uc3Qgc3ByaXRlID0gdGhpcy50YWdTcHJpdGVzLmdldChwYWlyLnRhZ0lkKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRhZ0lkOiBwYWlyLnRhZ0lkLFxuICAgICAgICBsYWJlbDogc3ByaXRlPy51c2VyRGF0YS5sYWJlbCA/PyBudWxsLFxuICAgICAgICBwb2lUeXBlOiBzcHJpdGU/LnVzZXJEYXRhLnBvaVR5cGUgPz8gbnVsbCxcbiAgICAgICAgdGFyZ2V0OiB7IC4uLnBhaXIudGFyZ2V0IH0sXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEJyaW5ncyB0aGUgc2NlbmUgYW5kIHRoZSBwYW5lbCBpbiBsaW5lIHdpdGggdGhlIGNhbGlicmF0aW9uJ3Mgc3RhdGUsIGFmdGVyIGFueXRoaW5nIGNoYW5nZWQgaXQuXG4gICAqXG4gICAqIGBkcm9wcGVkYCBuYW1lcyB0aGUgbWFyayB0aGUgY2hhbmdlIHB1dCBkb3duLCBpZiBpdCBwdXQgb25lIGRvd24sIHNvIHRoYXQgaXQgY2FuIGJlIHNob3duXG4gICAqIGFycml2aW5nOiB0aGF0IG1vdmVtZW50IGlzIHdoYXQgdGVsbHMgc29tZW9uZSB0aGVpciBjbGljayB3YXMgdGFrZW4uXG4gICAqL1xuICBwcml2YXRlIGFsaWdubWVudENoYW5nZWQoZHJvcHBlZD86ICd0YWcnIHwgJ3BvaW50Jyk6IHZvaWQge1xuICAgIC8vIFRoZSBnaG9zdCBwcmV2aWV3cyB0aGUgcGluIGFib3V0IHRvIGJlIGRyb3BwZWQsIG51bWJlciBpbmNsdWRlZCwgc28gaXQgaXMgbmV2ZXIgY2FycmllZCBvdmVyXG4gICAgLy8gZnJvbSBvbmUgc3RhdGUgdG8gdGhlIG5leHQ7IHRoZSBuZXh0IHBvaW50ZXIgbW92ZSBkcmF3cyB0aGUgcmlnaHQgb25lLlxuICAgIHRoaXMucGVuZGluZ1ByZXZpZXdFdmVudCA9IG51bGw7XG4gICAgdGhpcy5yZW1vdmVQbGFjZW1lbnRQcmV2aWV3KCk7XG4gICAgaWYgKHRoaXMuYWxpZ25pbmcgJiYgdGhpcy5yZW5kZXJlcikge1xuICAgICAgdGhpcy5yZW5kZXJlci5kb21FbGVtZW50LnN0eWxlLmN1cnNvciA9ICdjcm9zc2hhaXInO1xuICAgIH1cbiAgICB0aGlzLnJlZHJhd0NhbGlicmF0aW9uTWFya3MoZHJvcHBlZCk7XG5cbiAgICBsZXQgYXdhaXRpbmc6ICd0YWcnIHwgJ3BvaW50JyB8IG51bGwgPSBudWxsO1xuICAgIGlmICh0aGlzLmFsaWduaW5nKSB7XG4gICAgICBpZiAodGhpcy5hbGlnbm1lbnRTb3VyY2UpIHtcbiAgICAgICAgYXdhaXRpbmcgPSAncG9pbnQnO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmNhbk1hdGNoQW5vdGhlclRhZygpKSB7XG4gICAgICAgIC8vIE90aGVyd2lzZSBkb25lIGF0IHRocmVlLCBvciBzb29uZXIgd2hlbiB0aGVyZSBhcmUgbm8gbW9yZSB0YWdzIHRvIG1hdGNoOiBmZXdlciBwYWlyc1xuICAgICAgICAvLyBzdGlsbCBjYWxpYnJhdGUsIG9ubHkgbGVzcyBjb21wbGV0ZWx5LlxuICAgICAgICBhd2FpdGluZyA9ICd0YWcnO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmFsaWdubWVudFByb2dyZXNzJC5uZXh0KHtcbiAgICAgIHBhaXJzOiB0aGlzLmFsaWdubWVudFBhaXJzLmxlbmd0aCxcbiAgICAgIGF3YWl0aW5nLFxuICAgICAgdGFnSWQ6IGF3YWl0aW5nID09PSAncG9pbnQnID8gdGhpcy5hbGlnbm1lbnRTb3VyY2VUYWdJZCA6IHVuZGVmaW5lZCxcbiAgICAgIG1hdGNoZWQ6IHRoaXMuZ2V0QWxpZ25tZW50UGFpcnMoKSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEcmF3cyB0aGUgY2FsaWJyYXRpb24gYXMgaXQgc3RhbmRzOiB3aGF0IGhhcyBiZWVuIG1hdGNoZWQsIGFuZCB3aGF0IGlzIGJlaW5nIG1hdGNoZWQuXG4gICAqXG4gICAqIFJlZHJhd24gd2hvbGUgb24gZXZlcnkgY2hhbmdlIHJhdGhlciB0aGFuIHBhdGNoZWQuIFRoZXJlIGFyZSBhdCBtb3N0IHRocmVlIHBhaXJzLCBhbmQgdW5kb2luZ1xuICAgKiBvciByZW1vdmluZyBvbmUgcmVudW1iZXJzIHRoZSBvdGhlcnMuXG4gICAqL1xuICBwcml2YXRlIHJlZHJhd0NhbGlicmF0aW9uTWFya3MoZHJvcHBlZD86ICd0YWcnIHwgJ3BvaW50Jyk6IHZvaWQge1xuICAgIHRoaXMuY2xlYXJDYWxpYnJhdGlvbk1hcmtzKCk7XG4gICAgaWYgKCF0aGlzLmFsaWduaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGZyYW1lID0gdGhpcy50YWdHcm91cC5wYXJlbnQgPz8gdGhpcy5zY2VuZTtcbiAgICBpZiAodGhpcy5jYWxpYnJhdGlvbkdyb3VwLnBhcmVudCAhPT0gZnJhbWUpIHtcbiAgICAgIGZyYW1lLmFkZCh0aGlzLmNhbGlicmF0aW9uR3JvdXApO1xuICAgIH1cbiAgICB0aGlzLnRhZ0dyb3VwLnVwZGF0ZU1hdHJpeCgpO1xuICAgIC8vIFdoZXJlIGEgdGFnIGlzIGRyYXduIGF0IHRoZSBtb21lbnQsIGluIHRoZSBmcmFtZSB0aGUgbWFya3MgYXJlIGRyYXduIGluLlxuICAgIGNvbnN0IGRyYXduQXQgPSAoc3RvcmVkOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB6OiBudW1iZXIgfSkgPT5cbiAgICAgIG5ldyBUSFJFRS5WZWN0b3IzKHN0b3JlZC54LCBzdG9yZWQueSwgc3RvcmVkLnopLmFwcGx5TWF0cml4NCh0aGlzLnRhZ0dyb3VwLm1hdHJpeCk7XG5cbiAgICB0aGlzLmFsaWdubWVudFBhaXJzLmZvckVhY2goKHBhaXIsIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCB0YXJnZXQgPSBuZXcgVEhSRUUuVmVjdG9yMyhwYWlyLnRhcmdldC54LCBwYWlyLnRhcmdldC55LCBwYWlyLnRhcmdldC56KTtcblxuICAgICAgLy8gRnJvbSB3aGVyZSB0aGUgdGFnIGlzIHRvIHdoZXJlIGl0IHdhcyBzYWlkIHRvIGJlbG9uZzogdGhlIGNvcnJlY3Rpb24sIG1hZGUgdmlzaWJsZS5cbiAgICAgIGNvbnN0IGxpbmsgPSB0aGlzLmNyZWF0ZU1lYXN1cmVMaW5lKGRyYXduQXQocGFpci5zb3VyY2UpLCB0YXJnZXQsIFRocmVlSnNTZXJ2aWNlLkNBTElCUkFUSU9OX0RPTkVfQ09MT1IsIDIpO1xuICAgICAgbGluay5tYXRlcmlhbC5vcGFjaXR5ID0gMC43NTtcbiAgICAgIC8vIFRoZSBzYW1lIGdyZWVuIGFzIHRoZSBwaW4gaXQgbGVhZHMgdG87IHNlZSBjcmVhdGVDYWxpYnJhdGlvbk1hcmsuXG4gICAgICBsaW5rLm1hdGVyaWFsLmNvbG9yLmNvbnZlcnRTUkdCVG9MaW5lYXIoKTtcbiAgICAgIGxpbmsubWF0ZXJpYWwudG9uZU1hcHBlZCA9IGZhbHNlO1xuICAgICAgLy8gQmVoaW5kIHRoZSB0YWdzOiBpdCBzZXRzIG9mZiBmcm9tIHRoZSBtaWRkbGUgb2Ygb25lLCBhbmQgc2hvdWxkIGNvbWUgb3V0IGZyb20gdW5kZXIgaXRzXG4gICAgICAvLyBpY29uIHJhdGhlciB0aGFuIHJ1biBhY3Jvc3MgaXQuXG4gICAgICBsaW5rLnJlbmRlck9yZGVyID0gOTk3O1xuICAgICAgdGhpcy5jYWxpYnJhdGlvbkdyb3VwLmFkZChsaW5rKTtcblxuICAgICAgY29uc3QgcGluID0gdGhpcy5jcmVhdGVDYWxpYnJhdGlvbk1hcmsoXG4gICAgICAgIHRoaXMuY3JlYXRlTnVtYmVyZWRUZXh0dXJlKGluZGV4ICsgMSwgVGhyZWVKc1NlcnZpY2UuQ0FMSUJSQVRJT05fRE9ORV9DT0xPUiksIDEwMDEsXG4gICAgICApO1xuICAgICAgcGluLnBvc2l0aW9uLmNvcHkodGFyZ2V0KTtcbiAgICAgIHRoaXMuY2FsaWJyYXRpb25Hcm91cC5hZGQocGluKTtcbiAgICAgIHRoaXMuc2V0U2NyZWVuU2l6ZShwaW4sIFRocmVlSnNTZXJ2aWNlLkNBTElCUkFUSU9OX1BJTl9QWCk7XG4gICAgICBpZiAoZHJvcHBlZCA9PT0gJ3BvaW50JyAmJiBpbmRleCA9PT0gdGhpcy5hbGlnbm1lbnRQYWlycy5sZW5ndGggLSAxKSB7XG4gICAgICAgIHRoaXMucHVsc2UocGluKTtcbiAgICAgIH1cblxuICAgICAgLy8gSXRzIHRhZyBpcyBzcG9rZW4gZm9yOyBpdCBzdGF5cyBpbiB2aWV3IHRvIHNob3cgd2hhdCB0aGUgcGluIHJlZmVycyB0bywgYnV0IHN0YW5kcyBiYWNrLlxuICAgICAgY29uc3QgbWF0Y2hlZCA9IHRoaXMudGFnU3ByaXRlcy5nZXQocGFpci50YWdJZCk7XG4gICAgICBpZiAobWF0Y2hlZCkge1xuICAgICAgICBtYXRjaGVkLm1hdGVyaWFsLm9wYWNpdHkgPSAwLjQ7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAodGhpcy5hbGlnbm1lbnRTb3VyY2UpIHtcbiAgICAgIGNvbnN0IHJpbmcgPSB0aGlzLmNyZWF0ZUNhbGlicmF0aW9uTWFyayh0aGlzLmNyZWF0ZVJpbmdUZXh0dXJlKFRocmVlSnNTZXJ2aWNlLk1FQVNVUkVfQ09MT1IpLCA5OTgpO1xuICAgICAgcmluZy5wb3NpdGlvbi5jb3B5KGRyYXduQXQodGhpcy5hbGlnbm1lbnRTb3VyY2UpKTtcbiAgICAgIHRoaXMuY2FsaWJyYXRpb25Hcm91cC5hZGQocmluZyk7XG4gICAgICB0aGlzLnNldFNjcmVlblNpemUocmluZywgVGhyZWVKc1NlcnZpY2UuVEFHX1NDUkVFTl9QWCAqIDEuNik7XG4gICAgICBpZiAoZHJvcHBlZCA9PT0gJ3RhZycpIHtcbiAgICAgICAgdGhpcy5wdWxzZShyaW5nKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiogUmVtb3ZlcyBldmVyeXRoaW5nIGRyYXduIGZvciBhIGNhbGlicmF0aW9uLCBhbmQgZ2l2ZXMgdGhlIHRhZ3MgaXQgZGltbWVkIHRoZWlyIGxvb2sgYmFjay4gKi9cbiAgcHJpdmF0ZSBjbGVhckNhbGlicmF0aW9uTWFya3MoKTogdm9pZCB7XG4gICAgWy4uLnRoaXMuY2FsaWJyYXRpb25Hcm91cC5jaGlsZHJlbl0uZm9yRWFjaCgoY2hpbGQ6IGFueSkgPT4ge1xuICAgICAgdGhpcy5jYWxpYnJhdGlvbkdyb3VwLnJlbW92ZShjaGlsZCk7XG4gICAgICBjaGlsZC5nZW9tZXRyeT8uZGlzcG9zZT8uKCk7XG4gICAgICBjaGlsZC5tYXRlcmlhbD8ubWFwPy5kaXNwb3NlPy4oKTtcbiAgICAgIGNoaWxkLm1hdGVyaWFsPy5kaXNwb3NlPy4oKTtcbiAgICB9KTtcbiAgICB0aGlzLnRhZ1Nwcml0ZXMuZm9yRWFjaCgoc3ByaXRlKSA9PiB7XG4gICAgICBzcHJpdGUubWF0ZXJpYWwub3BhY2l0eSA9IDE7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQSBjYWxpYnJhdGlvbiBtYXJrOiBhIGZpeGVkIHNpemUgb24gc2NyZWVuIGFuZCBzaG93aW5nIHRocm91Z2ggdGhlIG1vZGVsLCBhcyB0aGUgdGFncyBkbywgYW5kXG4gICAqIGRyYXduIGluIHRoZSBjb2xvdXJzIGl0IHdhcyBwYWludGVkIGluLlxuICAgKlxuICAgKiBUaGUgcmVuZGVyZXIncyB0b25lIG1hcHBpbmcgYW5kIG91dHB1dCBjb252ZXJzaW9uIGFyZSB0aGVyZSBmb3IgdGhlIG1vZGVsJ3MgbGlnaHRpbmcuIFB1dFxuICAgKiB0aHJvdWdoIHRoZW0gYSBtYXJrIGNvbWVzIG91dCBwYWxlIC0gdGhlIGFtYmVyIG5lYXJlciB0byBjcmVhbSAtIGFuZCBhIG1hcmsgdGhhdCBoYXMgdG8gYmVcbiAgICogcGlja2VkIG91dCBhZ2FpbnN0IGEgcGhvdG9ncmFwaCBvZiBhIGJ1aWxkaW5nIGlzIHRoZSBsYXN0IHRoaW5nIHRoYXQgc2hvdWxkIGJlLlxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVDYWxpYnJhdGlvbk1hcmsobWFwOiBUSFJFRS5UZXh0dXJlLCByZW5kZXJPcmRlcjogbnVtYmVyKTogVEhSRUUuU3ByaXRlIHtcbiAgICAvLyBTYXlzIHRoZSBjYW52YXMgaG9sZHMgc1JHQiwgd2hpY2ggaXQgZG9lcywgc28gdGhlIG91dHB1dCBjb252ZXJzaW9uIGdpdmVzIGl0IGJhY2sgdW5jaGFuZ2VkLlxuICAgIGlmICgnY29sb3JTcGFjZScgaW4gbWFwKSB7XG4gICAgICAobWFwIGFzIGFueSkuY29sb3JTcGFjZSA9ICdzcmdiJzsgLy8gVEhSRUUuU1JHQkNvbG9yU3BhY2UsIHIxNTIrXG4gICAgfSBlbHNlIHtcbiAgICAgIChtYXAgYXMgYW55KS5lbmNvZGluZyA9IDMwMDE7IC8vIFRIUkVFLnNSR0JFbmNvZGluZ1xuICAgIH1cbiAgICBjb25zdCBtYXJrID0gbmV3IFRIUkVFLlNwcml0ZShcbiAgICAgIG5ldyBUSFJFRS5TcHJpdGVNYXRlcmlhbCh7XG4gICAgICAgIG1hcCwgZGVwdGhUZXN0OiBmYWxzZSwgdHJhbnNwYXJlbnQ6IHRydWUsIHNpemVBdHRlbnVhdGlvbjogZmFsc2UsIHRvbmVNYXBwZWQ6IGZhbHNlLFxuICAgICAgfSlcbiAgICApO1xuICAgIG1hcmsucmVuZGVyT3JkZXIgPSByZW5kZXJPcmRlcjtcbiAgICByZXR1cm4gbWFyaztcbiAgfVxuXG4gIC8qKiBTaG93cyBhIG1hcmsgYXJyaXZpbmc6IGl0IHN0YXJ0cyBvdmVyc2l6ZWQgYW5kIHNldHRsZXMuICovXG4gIHByaXZhdGUgcHVsc2Uoc3ByaXRlOiBUSFJFRS5TcHJpdGUpOiB2b2lkIHtcbiAgICB0aGlzLnB1bHNlcy5wdXNoKHsgc3ByaXRlLCBzdGFydGVkQXQ6IHBlcmZvcm1hbmNlLm5vdygpIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGVwUHVsc2VzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnB1bHNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgbm93ID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgdGhpcy5wdWxzZXMgPSB0aGlzLnB1bHNlcy5maWx0ZXIoKHsgc3ByaXRlLCBzdGFydGVkQXQgfSkgPT4ge1xuICAgICAgY29uc3Qgc2l6ZSA9IHNwcml0ZS51c2VyRGF0YS5zY3JlZW5TaXplO1xuICAgICAgaWYgKCFzcHJpdGUucGFyZW50IHx8ICFzaXplKSB7XG4gICAgICAgIC8vIFJlZHJhd24gb3IgY2xlYXJlZCBpbiB0aGUgbWVhbnRpbWUuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHByb2dyZXNzID0gTWF0aC5taW4oMSwgKG5vdyAtIHN0YXJ0ZWRBdCkgLyBUaHJlZUpzU2VydmljZS5DT05GSVJNX1BVTFNFX01TKTtcbiAgICAgIHRoaXMuc2V0U2NyZWVuU2l6ZShzcHJpdGUsIHNpemVbMF0sIHNpemVbMV0pO1xuICAgICAgLy8gRWFzZWQgb3V0LCBzbyBtb3N0IG9mIHRoZSBzZXR0bGluZyBoYXBwZW5zIHdoaWxlIHRoZSBleWUgaXMgc3RpbGwgb24gdGhlIGNsaWNrLlxuICAgICAgc3ByaXRlLnNjYWxlLm11bHRpcGx5U2NhbGFyKDEgKyAwLjkgKiAoMSAtIHByb2dyZXNzKSAqKiAyKTtcbiAgICAgIHJldHVybiBwcm9ncmVzcyA8IDE7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU3RhcnRzIGEgbWVhc3VyZW1lbnQ6IGV2ZXJ5IGNsaWNrIG9uIHRoZSBtb2RlbCBhZGRzIGEgcG9pbnQsIGFuZCBlYWNoIHBhaXIgb2YgY29uc2VjdXRpdmVcbiAgICogcG9pbnRzIGlzIGEgbWVhc3VyZWQgc2VnbWVudC5cbiAgICpcbiAgICogSXQgZW5kcyB0aHJvdWdoIGZpbmlzaE1lYXN1cmluZygpIG9yIGNhbmNlbE1lYXN1cmluZygpIHJhdGhlciB0aGFuIG9uIGl0cyBvd24gYWZ0ZXIgdHdvIHBvaW50cyxcbiAgICogYmVjYXVzZSBhIG1lYXN1cmVtZW50IG1heSBoYXZlIHNldmVyYWwgc2VnbWVudHMgLSB0aGUgc2FtZSBhcyBNYXR0ZXJwb3J0J3MsIHdob3NlIHJlc3VsdHMgYXJlXG4gICAqIHN0b3JlZCBhcyBhIGxpc3Qgb2YgZGlzdGFuY2VzLlxuICAgKi9cbiAgc3RhcnRNZWFzdXJpbmcoKTogdm9pZCB7XG4gICAgLy8gT25lIHBvaW50ZXIgbW9kZSBhdCBhIHRpbWU6IGEgY2xpY2sgY2Fubm90IGJlIGJvdGggYSB0YWcgcG9zaXRpb24gYW5kIGEgbWVhc3VyZWQgcG9pbnQuXG4gICAgdGhpcy5jYW5jZWxUYWdQbGFjZW1lbnQoKTtcbiAgICBpZiAodGhpcy5hbGlnbmluZykge1xuICAgICAgdGhpcy5jYW5jZWxUYWdBbGlnbm1lbnQoKTtcbiAgICB9XG4gICAgdGhpcy5jbGVhck1lYXN1cmVtZW50KCk7XG4gICAgaWYgKHRoaXMubWVhc3VyZUdyb3VwLnBhcmVudCAhPT0gdGhpcy50YWdHcm91cCkge1xuICAgICAgdGhpcy50YWdHcm91cC5hZGQodGhpcy5tZWFzdXJlR3JvdXApO1xuICAgIH1cbiAgICB0aGlzLm1lYXN1cmluZyA9IHRydWU7XG4gICAgaWYgKHRoaXMucmVuZGVyZXIpIHtcbiAgICAgIHRoaXMucmVuZGVyZXIuZG9tRWxlbWVudC5zdHlsZS5jdXJzb3IgPSAnY3Jvc3NoYWlyJztcbiAgICB9XG4gICAgdGhpcy5tZWFzdXJpbmdDaGFuZ2VkJC5uZXh0KHRydWUpO1xuICAgIHRoaXMubWVhc3VyZW1lbnRQcm9ncmVzcyQubmV4dCh7IHBvaW50czogMCwgZGlzdGFuY2VzOiBbXSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBYmFuZG9ucyB0aGUgbWVhc3VyZW1lbnQgYW5kIHJlbW92ZXMgd2hhdCB3YXMgZHJhd24uXG4gICAqXG4gICAqIEFsc28gd2hhdCBjbGVhcnMgYSBmaW5pc2hlZCBtZWFzdXJlbWVudCBvZmYgdGhlIG1vZGVsIG9uY2UgaXRzIGZvcm0gaXMgc2F2ZWQgb3IgY2xvc2VkLCB3aGljaFxuICAgKiBpcyB3aHkgaXQgb25seSByZXBvcnRzIGFuIGFiYW5kb25tZW50IHdoZW4gb25lIHdhcyBhY3R1YWxseSBpbiBwcm9ncmVzcy5cbiAgICovXG4gIGNhbmNlbE1lYXN1cmluZygpOiB2b2lkIHtcbiAgICBjb25zdCB3YXNNZWFzdXJpbmcgPSB0aGlzLm1lYXN1cmluZztcbiAgICB0aGlzLm1lYXN1cmluZyA9IGZhbHNlO1xuICAgIHRoaXMucGVuZGluZ1ByZXZpZXdFdmVudCA9IG51bGw7XG4gICAgdGhpcy5yZW1vdmVQbGFjZW1lbnRQcmV2aWV3KCk7XG4gICAgdGhpcy5jbGVhck1lYXN1cmVtZW50KCk7XG4gICAgLy8gRm9yZ290dGVuIGhlcmUgc28gdGhhdCBhIGZvcm0gb3BlbmVkIGxhdGVyIGNhbm5vdCBwaWNrIHVwIGEgbWVhc3VyZW1lbnQgYWxyZWFkeSBkZWFsdCB3aXRoLlxuICAgIHRoaXMubGFzdE1lYXN1cmVtZW50ID0gbnVsbDtcbiAgICBpZiAodGhpcy5yZW5kZXJlcikge1xuICAgICAgdGhpcy5yZW5kZXJlci5kb21FbGVtZW50LnN0eWxlLmN1cnNvciA9ICdkZWZhdWx0JztcbiAgICB9XG4gICAgaWYgKHdhc01lYXN1cmluZykge1xuICAgICAgdGhpcy5tZWFzdXJpbmdDaGFuZ2VkJC5uZXh0KGZhbHNlKTtcbiAgICAgIHRoaXMubWVhc3VyZW1lbnRQcm9ncmVzcyQubmV4dChudWxsKTtcbiAgICB9XG4gICAgdGhpcy5tZWFzdXJlbWVudENsZWFyZWQkLm5leHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmRzIHRoZSBtZWFzdXJlbWVudCBhbmQgcmV0dXJucyBpdCwgb3IgbnVsbCB3aGVuIHRoZXJlIGFyZSBub3QgeWV0IHR3byBwb2ludHMgdG8gbWVhc3VyZVxuICAgKiBiZXR3ZWVuIC0gaW4gd2hpY2ggY2FzZSBtZWFzdXJpbmcgc2ltcGx5IGNhcnJpZXMgb24uXG4gICAqXG4gICAqIFRoZSBkcmF3aW5nIHN0YXlzIG9uIHRoZSBtb2RlbCBzbyBpdCBpcyBzdGlsbCB2aXNpYmxlIHdoaWxlIHRoZSBwZXJzb24gbmFtZXMgdGhlIG1lYXN1cmVtZW50O1xuICAgKiBjYW5jZWxNZWFzdXJpbmcoKSB0YWtlcyBpdCBhd2F5IGFmdGVyd2FyZHMuXG4gICAqL1xuICBmaW5pc2hNZWFzdXJpbmcoc2NyZWVuc2hvdD86IHN0cmluZyk6IFRocmVlSnNNZWFzdXJlbWVudCB8IG51bGwge1xuICAgIGlmICghdGhpcy5tZWFzdXJpbmcgfHwgdGhpcy5tZWFzdXJlUG9pbnRzLmxlbmd0aCA8IDIpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB0aGlzLm1lYXN1cmluZyA9IGZhbHNlO1xuICAgIHRoaXMubWVhc3VyaW5nQ2hhbmdlZCQubmV4dChmYWxzZSk7XG4gICAgdGhpcy5wZW5kaW5nUHJldmlld0V2ZW50ID0gbnVsbDtcbiAgICB0aGlzLnJlbW92ZVBsYWNlbWVudFByZXZpZXcoKTtcbiAgICB0aGlzLnVwZGF0ZU1lYXN1cmVSdWJiZXJCYW5kKG51bGwpO1xuICAgIHRoaXMucmVuZGVyZXIuZG9tRWxlbWVudC5zdHlsZS5jdXJzb3IgPSAnZGVmYXVsdCc7XG5cbiAgICB0aGlzLmxhc3RNZWFzdXJlbWVudCA9IHtcbiAgICAgIHBvaW50czogdGhpcy5tZWFzdXJlUG9pbnRzLm1hcCgocG9pbnQpID0+ICh7IHg6IHBvaW50LngsIHk6IHBvaW50LnksIHo6IHBvaW50LnogfSkpLFxuICAgICAgZGlzdGFuY2VzOiB0aGlzLm1lYXN1cmVEaXN0YW5jZXMoKSxcbiAgICAgIC8vIEZyb20gdGhlIHZpZXdlciB0aGUgbW9kZWwgaXMgZHJhd24gaW4sIHdoZW4gaXQgaXMgbm90IHRoaXMgc2NlbmU6IHRoZSBzcGxhdCB2aWV3ZXIuXG4gICAgICBzY3JlZW5zaG90OiBzY3JlZW5zaG90ID8/IHRoaXMuY2FwdHVyZU1lYXN1cmVtZW50U2NyZWVuc2hvdCgpLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMubGFzdE1lYXN1cmVtZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBwb2ludCB0byB0aGUgbWVhc3VyZW1lbnQgdW5kZXIgd2F5IGZyb20gYSBzcG90IGFub3RoZXIgdmlld2VyIHBpY2tlZCBvbiB0aGUgbW9kZWwgLSB0aGVcbiAgICogc3BsYXQgdmlld2VyIC0gaW4gdGhlIG1vZGVsJ3Mgb3duIGNvb3JkaW5hdGVzLiBJbnRvIHRoZSBmcmFtZSB0aGUgbWVhc3VyZW1lbnQgaXMga2VwdCBpbiwgdGhlXG4gICAqIHRhZ3MnLCB0aHJvdWdoIHRoZSBjYWxpYnJhdGlvbiwgYXMgcGxhY2VUYWdBdE1vZGVsUG9pbnQgZG9lcy4gRmFsc2Ugd2hlbiBub3QgbWVhc3VyaW5nLlxuICAgKi9cbiAgYWRkTWVhc3VyZVBvaW50QXRNb2RlbFBvaW50KHBvaW50OiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB6OiBudW1iZXIgfSk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5tZWFzdXJpbmcpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy50YWdHcm91cC51cGRhdGVNYXRyaXgoKTtcbiAgICB0aGlzLmFkZE1lYXN1cmVQb2ludChuZXcgVEhSRUUuVmVjdG9yMyhwb2ludC54LCBwb2ludC55LCBwb2ludC56KS5hcHBseU1hdHJpeDQodGhpcy50YWdHcm91cC5tYXRyaXguY2xvbmUoKS5pbnZlcnQoKSkpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqIFRoZSBtZWFzdXJlbWVudCdzIHBvaW50cywgdW5kZXIgd2F5IG9yIGZpbmlzaGVkLCBpbiB0aGUgbW9kZWwncyBvd24gY29vcmRpbmF0ZXM6IGZvciBhIHZpZXdlciBkcmF3aW5nIGl0IGVsc2V3aGVyZS4gKi9cbiAgZ2V0TWVhc3VyZVBvaW50c0luTW9kZWxGcmFtZSgpOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB6OiBudW1iZXIgfVtdIHtcbiAgICB0aGlzLnRhZ0dyb3VwLnVwZGF0ZU1hdHJpeCgpO1xuICAgIHJldHVybiB0aGlzLm1lYXN1cmVQb2ludHMubWFwKChwb2ludCkgPT4ge1xuICAgICAgY29uc3QgeyB4LCB5LCB6IH0gPSBwb2ludC5jbG9uZSgpLmFwcGx5TWF0cml4NCh0aGlzLnRhZ0dyb3VwLm1hdHJpeCk7XG4gICAgICByZXR1cm4geyB4LCB5LCB6IH07XG4gICAgfSk7XG4gIH1cblxuICBpc01lYXN1cmluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5tZWFzdXJpbmc7XG4gIH1cblxuICAvKiogVGhlIG1lYXN1cmVtZW50IGZpbmlzaE1lYXN1cmluZygpIGxhc3QgcHJvZHVjZWQsIGZvciB0aGUgZm9ybSB0aGF0IHNhdmVzIGl0LiAqL1xuICBnZXRMYXN0TWVhc3VyZW1lbnQoKTogVGhyZWVKc01lYXN1cmVtZW50IHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMubGFzdE1lYXN1cmVtZW50O1xuICB9XG5cbiAgLyoqIE1ldHJlcyBiZXR3ZWVuIGNvbnNlY3V0aXZlIHBvaW50cy4gVGFnIHNwYWNlIGlzIGluIG1ldHJlcywgc28gbm8gY29udmVyc2lvbiBpcyBpbnZvbHZlZC4gKi9cbiAgcHJpdmF0ZSBtZWFzdXJlRGlzdGFuY2VzKCk6IG51bWJlcltdIHtcbiAgICBjb25zdCBkaXN0YW5jZXM6IG51bWJlcltdID0gW107XG4gICAgZm9yIChsZXQgaW5kZXggPSAxOyBpbmRleCA8IHRoaXMubWVhc3VyZVBvaW50cy5sZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICAgIGNvbnN0IGRpc3RhbmNlID0gdGhpcy5tZWFzdXJlUG9pbnRzW2luZGV4IC0gMV0uZGlzdGFuY2VUbyh0aGlzLm1lYXN1cmVQb2ludHNbaW5kZXhdKTtcbiAgICAgIC8vIFR3byBkZWNpbWFscywgdGhlIHByZWNpc2lvbiBNYXR0ZXJwb3J0J3Mgb3duIG1lYXN1cmVtZW50cyBhcmUgc3RvcmVkIHdpdGguXG4gICAgICBkaXN0YW5jZXMucHVzaChNYXRoLnJvdW5kKGRpc3RhbmNlICogMTAwKSAvIDEwMCk7XG4gICAgfVxuICAgIHJldHVybiBkaXN0YW5jZXM7XG4gIH1cblxuICBwcml2YXRlIGFkZE1lYXN1cmVQb2ludChwb2ludDogVEhSRUUuVmVjdG9yMyk6IHZvaWQge1xuICAgIGNvbnN0IHByZXZpb3VzID0gdGhpcy5tZWFzdXJlUG9pbnRzW3RoaXMubWVhc3VyZVBvaW50cy5sZW5ndGggLSAxXTtcbiAgICB0aGlzLm1lYXN1cmVQb2ludHMucHVzaChwb2ludCk7XG5cbiAgICBjb25zdCBtYXJrZXIgPSBuZXcgVEhSRUUuU3ByaXRlKFxuICAgICAgbmV3IFRIUkVFLlNwcml0ZU1hdGVyaWFsKHtcbiAgICAgICAgbWFwOiB0aGlzLmNyZWF0ZVRhZ1RleHR1cmUoVGhyZWVKc1NlcnZpY2UuTUVBU1VSRV9DT0xPUiksXG4gICAgICAgIGRlcHRoVGVzdDogZmFsc2UsXG4gICAgICAgIHRyYW5zcGFyZW50OiB0cnVlLFxuICAgICAgICAvLyBTaXplZCBhZ2FpbnN0IHRoZSB2aWV3cG9ydCwgbm90IHRoZSBtb2RlbDogbWVhc3VyaW5nIGlzIGRvbmUgem9vbWVkIHJpZ2h0IGluLCB3aGVyZVxuICAgICAgICAvLyBhbnl0aGluZyBzaXplZCBpbiBtZXRyZXMgd291bGQgY292ZXIgdGhlIHZlcnkgdGhpbmcgYmVpbmcgbWVhc3VyZWQuXG4gICAgICAgIHNpemVBdHRlbnVhdGlvbjogZmFsc2UsXG4gICAgICB9KVxuICAgICk7XG4gICAgbWFya2VyLnBvc2l0aW9uLmNvcHkocG9pbnQpO1xuICAgIG1hcmtlci5yZW5kZXJPcmRlciA9IDEwMDE7XG4gICAgdGhpcy5tZWFzdXJlR3JvdXAuYWRkKG1hcmtlcik7XG4gICAgdGhpcy5zZXRTY3JlZW5TaXplKG1hcmtlciwgMTIpO1xuXG4gICAgaWYgKHByZXZpb3VzKSB7XG4gICAgICB0aGlzLm1lYXN1cmVHcm91cC5hZGQodGhpcy5jcmVhdGVNZWFzdXJlTGluZShwcmV2aW91cywgcG9pbnQpKTtcblxuICAgICAgY29uc3QgZGlzdGFuY2UgPSBNYXRoLnJvdW5kKHByZXZpb3VzLmRpc3RhbmNlVG8ocG9pbnQpICogMTAwKSAvIDEwMDtcbiAgICAgIGNvbnN0IGxhYmVsID0gbmV3IFRIUkVFLlNwcml0ZShcbiAgICAgICAgbmV3IFRIUkVFLlNwcml0ZU1hdGVyaWFsKHtcbiAgICAgICAgICBtYXA6IHRoaXMuY3JlYXRlTWVhc3VyZUxhYmVsVGV4dHVyZShgJHtkaXN0YW5jZS50b0ZpeGVkKDIpfSBtYCksXG4gICAgICAgICAgZGVwdGhUZXN0OiBmYWxzZSxcbiAgICAgICAgICB0cmFuc3BhcmVudDogdHJ1ZSxcbiAgICAgICAgICBzaXplQXR0ZW51YXRpb246IGZhbHNlLFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICAgIGxhYmVsLnBvc2l0aW9uLmNvcHkocHJldmlvdXMpLmFkZChwb2ludCkubXVsdGlwbHlTY2FsYXIoMC41KTtcbiAgICAgIGxhYmVsLnJlbmRlck9yZGVyID0gMTAwMjtcbiAgICAgIHRoaXMubWVhc3VyZUdyb3VwLmFkZChsYWJlbCk7XG4gICAgICB0aGlzLnNldFNjcmVlblNpemUobGFiZWwsIDg0LCAyOCk7XG4gICAgfVxuXG4gICAgdGhpcy5tZWFzdXJlbWVudFByb2dyZXNzJC5uZXh0KHtcbiAgICAgIHBvaW50czogdGhpcy5tZWFzdXJlUG9pbnRzLmxlbmd0aCxcbiAgICAgIGRpc3RhbmNlczogdGhpcy5tZWFzdXJlRGlzdGFuY2VzKCksXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQSBzZWdtZW50IHdpdGggYSB3aWR0aCBpbiBwaXhlbHMuXG4gICAqXG4gICAqIFdlYkdMJ3Mgb3duIGxpbmVzIGFyZSBvbmUgcGl4ZWwgd2lkZSB3aGF0ZXZlciBpcyBhc2tlZCBmb3IsIHdoaWNoIGFsbCBidXQgZGlzYXBwZWFycyBvdmVyIGFcbiAgICogcGhvdG9ncmFwaGljIHRleHR1cmUuIFRoaXMga2luZCBpcyBkcmF3biBhcyBzY3JlZW4tZmFjaW5nIGdlb21ldHJ5LCBzbyB0aGUgd2lkdGggaG9sZHMuXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZU1lYXN1cmVMaW5lKFxuICAgIGZyb206IFRIUkVFLlZlY3RvcjMsIHRvOiBUSFJFRS5WZWN0b3IzLCBjb2xvcjogc3RyaW5nID0gVGhyZWVKc1NlcnZpY2UuTUVBU1VSRV9DT0xPUiwgd2lkdGggPSAzLFxuICApOiBhbnkge1xuICAgIGNvbnN0IGdlb21ldHJ5ID0gbmV3IExpbmVHZW9tZXRyeSgpO1xuICAgIGdlb21ldHJ5LnNldFBvc2l0aW9ucyhbZnJvbS54LCBmcm9tLnksIGZyb20ueiwgdG8ueCwgdG8ueSwgdG8uel0pO1xuICAgIGNvbnN0IG1hdGVyaWFsID0gbmV3IExpbmVNYXRlcmlhbCh7XG4gICAgICBjb2xvcjogbmV3IFRIUkVFLkNvbG9yKGNvbG9yKS5nZXRIZXgoKSxcbiAgICAgIGxpbmV3aWR0aDogd2lkdGgsXG4gICAgICBkZXB0aFRlc3Q6IGZhbHNlLFxuICAgICAgdHJhbnNwYXJlbnQ6IHRydWUsXG4gICAgfSk7XG4gICAgY29uc3Qgc2l6ZSA9IHRoaXMucmVuZGVyZXIuZ2V0U2l6ZShuZXcgVEhSRUUuVmVjdG9yMigpKTtcbiAgICBtYXRlcmlhbC5yZXNvbHV0aW9uLnNldChzaXplLngsIHNpemUueSk7XG4gICAgY29uc3QgbGluZSA9IG5ldyBMaW5lMihnZW9tZXRyeSwgbWF0ZXJpYWwpO1xuICAgIGxpbmUucmVuZGVyT3JkZXIgPSAxMDAwO1xuICAgIHJldHVybiBsaW5lO1xuICB9XG5cbiAgLyoqIExpbmUgd2lkdGhzIGFyZSBpbiBwaXhlbHMsIHdoaWNoIHRoZSBtYXRlcmlhbCBjYW4gb25seSBob25vdXIgaWYgaXQga25vd3MgdGhlIGNhbnZhcyBzaXplLiAqL1xuICBwcml2YXRlIHVwZGF0ZU1lYXN1cmVMaW5lUmVzb2x1dGlvbigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucmVuZGVyZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc2l6ZSA9IHRoaXMucmVuZGVyZXIuZ2V0U2l6ZShuZXcgVEhSRUUuVmVjdG9yMigpKTtcbiAgICBbLi4udGhpcy5tZWFzdXJlR3JvdXAuY2hpbGRyZW4sIC4uLnRoaXMuY2FsaWJyYXRpb25Hcm91cC5jaGlsZHJlbl0uZm9yRWFjaCgoY2hpbGQ6IGFueSkgPT4ge1xuICAgICAgaWYgKGNoaWxkLm1hdGVyaWFsPy5yZXNvbHV0aW9uKSB7XG4gICAgICAgIGNoaWxkLm1hdGVyaWFsLnJlc29sdXRpb24uc2V0KHNpemUueCwgc2l6ZS55KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBTdHJldGNoZXMgYSBzZWdtZW50IGZyb20gdGhlIGxhc3QgcG9pbnQgdG8gdGhlIHBvaW50ZXIsIG9yIGhpZGVzIGl0IHdoZW4gZ2l2ZW4gbnVsbC4gKi9cbiAgcHJpdmF0ZSB1cGRhdGVNZWFzdXJlUnViYmVyQmFuZCh0YXJnZXQ6IFRIUkVFLlZlY3RvcjMgfCBudWxsKTogdm9pZCB7XG4gICAgY29uc3QgbGFzdCA9IHRoaXMubWVhc3VyZVBvaW50c1t0aGlzLm1lYXN1cmVQb2ludHMubGVuZ3RoIC0gMV07XG4gICAgaWYgKCF0aGlzLm1lYXN1cmluZyB8fCAhbGFzdCB8fCAhdGFyZ2V0KSB7XG4gICAgICBpZiAodGhpcy5tZWFzdXJlUnViYmVyQmFuZCkge1xuICAgICAgICB0aGlzLm1lYXN1cmVSdWJiZXJCYW5kLnZpc2libGUgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF0aGlzLm1lYXN1cmVSdWJiZXJCYW5kKSB7XG4gICAgICB0aGlzLm1lYXN1cmVSdWJiZXJCYW5kID0gdGhpcy5jcmVhdGVNZWFzdXJlTGluZShsYXN0LCB0YXJnZXQpO1xuICAgICAgdGhpcy5tZWFzdXJlUnViYmVyQmFuZC5tYXRlcmlhbC5vcGFjaXR5ID0gMC42O1xuICAgICAgdGhpcy5tZWFzdXJlR3JvdXAuYWRkKHRoaXMubWVhc3VyZVJ1YmJlckJhbmQpO1xuICAgIH1cbiAgICB0aGlzLm1lYXN1cmVSdWJiZXJCYW5kLmdlb21ldHJ5LnNldFBvc2l0aW9ucyhbXG4gICAgICBsYXN0LngsIGxhc3QueSwgbGFzdC56LFxuICAgICAgdGFyZ2V0LngsIHRhcmdldC55LCB0YXJnZXQueixcbiAgICBdKTtcbiAgICB0aGlzLm1lYXN1cmVSdWJiZXJCYW5kLnZpc2libGUgPSB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVNZWFzdXJlTGFiZWxUZXh0dXJlKHRleHQ6IHN0cmluZyk6IFRIUkVFLkNhbnZhc1RleHR1cmUge1xuICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgIGNhbnZhcy53aWR0aCA9IDM4NDtcbiAgICBjYW52YXMuaGVpZ2h0ID0gMTI4O1xuICAgIGNvbnN0IGNvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcblxuICAgIGNvbnN0IHJhZGl1cyA9IDI4O1xuICAgIGNvbnRleHQuZmlsbFN0eWxlID0gJ3JnYmEoMCwgMCwgMCwgMC43OCknO1xuICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7XG4gICAgY29udGV4dC5tb3ZlVG8ocmFkaXVzLCA4KTtcbiAgICBjb250ZXh0LmFyY1RvKGNhbnZhcy53aWR0aCAtIDgsIDgsIGNhbnZhcy53aWR0aCAtIDgsIGNhbnZhcy5oZWlnaHQgLSA4LCByYWRpdXMpO1xuICAgIGNvbnRleHQuYXJjVG8oY2FudmFzLndpZHRoIC0gOCwgY2FudmFzLmhlaWdodCAtIDgsIDgsIGNhbnZhcy5oZWlnaHQgLSA4LCByYWRpdXMpO1xuICAgIGNvbnRleHQuYXJjVG8oOCwgY2FudmFzLmhlaWdodCAtIDgsIDgsIDgsIHJhZGl1cyk7XG4gICAgY29udGV4dC5hcmNUbyg4LCA4LCBjYW52YXMud2lkdGggLSA4LCA4LCByYWRpdXMpO1xuICAgIGNvbnRleHQuY2xvc2VQYXRoKCk7XG4gICAgY29udGV4dC5maWxsKCk7XG5cbiAgICBjb250ZXh0LmZpbGxTdHlsZSA9ICcjRkZGRkZGJztcbiAgICBjb250ZXh0LmZvbnQgPSAnYm9sZCA2MHB4IHNhbnMtc2VyaWYnO1xuICAgIGNvbnRleHQudGV4dEFsaWduID0gJ2NlbnRlcic7XG4gICAgY29udGV4dC50ZXh0QmFzZWxpbmUgPSAnbWlkZGxlJztcbiAgICBjb250ZXh0LmZpbGxUZXh0KHRleHQsIGNhbnZhcy53aWR0aCAvIDIsIGNhbnZhcy5oZWlnaHQgLyAyICsgNCk7XG5cbiAgICByZXR1cm4gbmV3IFRIUkVFLkNhbnZhc1RleHR1cmUoY2FudmFzKTtcbiAgfVxuXG4gIC8qKiBSZW1vdmVzIGV2ZXJ5dGhpbmcgZHJhd24gZm9yIGEgbWVhc3VyZW1lbnQgYW5kIGZvcmdldHMgaXRzIHBvaW50cy4gKi9cbiAgcHJpdmF0ZSBjbGVhck1lYXN1cmVtZW50KCk6IHZvaWQge1xuICAgIFsuLi50aGlzLm1lYXN1cmVHcm91cC5jaGlsZHJlbl0uZm9yRWFjaCgoY2hpbGQ6IGFueSkgPT4ge1xuICAgICAgdGhpcy5tZWFzdXJlR3JvdXAucmVtb3ZlKGNoaWxkKTtcbiAgICAgIGNoaWxkLmdlb21ldHJ5Py5kaXNwb3NlPy4oKTtcbiAgICAgIGNoaWxkLm1hdGVyaWFsPy5tYXA/LmRpc3Bvc2U/LigpO1xuICAgICAgY2hpbGQubWF0ZXJpYWw/LmRpc3Bvc2U/LigpO1xuICAgIH0pO1xuICAgIHRoaXMubWVhc3VyZVJ1YmJlckJhbmQgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5tZWFzdXJlUG9pbnRzID0gW107XG4gIH1cblxuICAvKipcbiAgICogQSBwaWN0dXJlIG9mIHRoZSBzY2VuZSB3aXRoIHRoZSBtZWFzdXJlbWVudCBvbiBpdCwgYXMgTWF0dGVycG9ydCBhdHRhY2hlcyB0byBpdHMgb3duLlxuICAgKlxuICAgKiBUYWdzIGFyZSBsZWZ0IG91dCwgYXMgdGhleSBhcmUgdGhlcmU6IHRoZSBwaWN0dXJlIGlzIGFib3V0IHRoZSBtZWFzdXJlbWVudC4gSXQgaXMgdGFrZW4gc3RyYWlnaHRcbiAgICogYWZ0ZXIgYSByZW5kZXIgYmVjYXVzZSB0aGUgZHJhd2luZyBidWZmZXIgaXMgb25seSBndWFyYW50ZWVkIHRvIGhvbGQgdGhlIGZyYW1lIHVudGlsIHRoZVxuICAgKiBicm93c2VyIHByZXNlbnRzIGl0LCBhbmQgc2NhbGVkIGRvd24gc2luY2UgaXQgaXMgdXBsb2FkZWQgYW5kIHNob3duIGFzIGEgdGh1bWJuYWlsLlxuICAgKi9cbiAgcHJpdmF0ZSBjYXB0dXJlTWVhc3VyZW1lbnRTY3JlZW5zaG90KCk6IHN0cmluZyB7XG4gICAgY29uc3QgaGlkZGVuOiBUSFJFRS5TcHJpdGVbXSA9IFtdO1xuICAgIHRoaXMudGFnU3ByaXRlcy5mb3JFYWNoKChzcHJpdGUpID0+IHtcbiAgICAgIGlmIChzcHJpdGUudmlzaWJsZSkge1xuICAgICAgICBzcHJpdGUudmlzaWJsZSA9IGZhbHNlO1xuICAgICAgICBoaWRkZW4ucHVzaChzcHJpdGUpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5yZW5kZXJlci5yZW5kZXIodGhpcy5zY2VuZSwgdGhpcy5jYW1lcmEpO1xuICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMucmVuZGVyZXIuZG9tRWxlbWVudDtcbiAgICBjb25zdCBzY2FsZSA9IE1hdGgubWluKDEsIDgwMCAvIHNvdXJjZS53aWR0aCwgNjAwIC8gc291cmNlLmhlaWdodCk7XG4gICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgY2FudmFzLndpZHRoID0gTWF0aC5tYXgoMSwgTWF0aC5yb3VuZChzb3VyY2Uud2lkdGggKiBzY2FsZSkpO1xuICAgIGNhbnZhcy5oZWlnaHQgPSBNYXRoLm1heCgxLCBNYXRoLnJvdW5kKHNvdXJjZS5oZWlnaHQgKiBzY2FsZSkpO1xuICAgIGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpLmRyYXdJbWFnZShzb3VyY2UsIDAsIDAsIGNhbnZhcy53aWR0aCwgY2FudmFzLmhlaWdodCk7XG5cbiAgICBoaWRkZW4uZm9yRWFjaCgoc3ByaXRlKSA9PiB7XG4gICAgICBzcHJpdGUudmlzaWJsZSA9IHRydWU7XG4gICAgfSk7XG4gICAgcmV0dXJuIGNhbnZhcy50b0RhdGFVUkwoJ2ltYWdlL2pwZWcnLCAwLjg1KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcnVlIHdoZW4gdGFnIHBsYWNlbWVudCBpcyBhcm1lZCwgZmFsc2Ugd2hlbiBpdCBlbmRzIC0gcGxhY2VkIG9yIGFiYW5kb25lZC4gRm9yIGEgdmlld2VyIGRyYXdpbmdcbiAgICogdGhlIG1vZGVsIGluc3RlYWQgb2YgdGhpcyBzY2VuZSwgdGhlIHNwbGF0IHZpZXdlciwgd2hpY2ggcGlja3MgdGhlIHNwb3QgaXRzZWxmOyBzZWVcbiAgICogcGxhY2VUYWdBdE1vZGVsUG9pbnQuXG4gICAqL1xuICByZWFkb25seSBwbGFjZW1lbnRDaGFuZ2VkJCA9IG5ldyBTdWJqZWN0PGJvb2xlYW4+KCk7XG5cbiAgLyoqIEFybXMgdGFnIHBsYWNlbWVudDogdGhlIG5leHQgY2xpY2sgb24gdGhlIG1vZGVsIGRyb3BzIGEgdGFnIGluc3RlYWQgb2YgYmVpbmcgaWdub3JlZC4gKi9cbiAgc3RhcnRUYWdQbGFjZW1lbnQocG9pVHlwZTogUG9pVHlwZSB8IG51bGwgPSBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5wbGFjaW5nVGFnID0gdHJ1ZTtcbiAgICB0aGlzLnBsYWNlbWVudFBvaVR5cGUgPSBwb2lUeXBlO1xuICAgIHRoaXMucGVuZGluZ1RhZ1BsYWNlbWVudCA9IG51bGw7XG4gICAgaWYgKHRoaXMucmVuZGVyZXIpIHtcbiAgICAgIHRoaXMucmVuZGVyZXIuZG9tRWxlbWVudC5zdHlsZS5jdXJzb3IgPSAnY3Jvc3NoYWlyJztcbiAgICB9XG4gICAgdGhpcy5wbGFjZW1lbnRDaGFuZ2VkJC5uZXh0KHRydWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBsYWNlcyB0aGUgYXJtZWQgdGFnIGF0IGEgc3BvdCBhbm90aGVyIHZpZXdlciBwaWNrZWQgb24gdGhlIG1vZGVsIC0gdGhlIHNwbGF0IHZpZXdlciAtIGdpdmVuXG4gICAqIGluIHRoZSBtb2RlbCdzIG93biBjb29yZGluYXRlcywgYXMgYSBjbGljayBvbiB0aGUgbW9kZWwgaW4gdGhpcyBzY2VuZSB3b3VsZC4gSW50byB0aGUgZnJhbWUgdGFnXG4gICAqIGNvb3JkaW5hdGVzIGFyZSBzdG9yZWQgaW4sIHRocm91Z2ggdGhlIGNhbGlicmF0aW9uLCBhcyBwaWNrUGxhY2VtZW50T25Nb2RlbCBkb2VzLlxuICAgKi9cbiAgcGxhY2VUYWdBdE1vZGVsUG9pbnQoXG4gICAgcG9pbnQ6IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHo6IG51bWJlciB9LFxuICAgIG5vcm1hbDogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgejogbnVtYmVyIH0gfCBudWxsID0gbnVsbCxcbiAgKTogVGhyZWVKc1RhZ1BsYWNlbWVudCB8IG51bGwge1xuICAgIGlmICghdGhpcy5wbGFjaW5nVGFnKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgdGhpcy50YWdHcm91cC51cGRhdGVNYXRyaXgoKTtcbiAgICBjb25zdCBwb3NpdGlvbiA9IG5ldyBUSFJFRS5WZWN0b3IzKHBvaW50LngsIHBvaW50LnksIHBvaW50LnopLmFwcGx5TWF0cml4NCh0aGlzLnRhZ0dyb3VwLm1hdHJpeC5jbG9uZSgpLmludmVydCgpKTtcbiAgICAvLyBUdXJuZWQgb25seTogdGhlIGNhbGlicmF0aW9uJ3Mgc2NhbGUgY2hhbmdlcyBubyBkaXJlY3Rpb24uXG4gICAgY29uc3QgZmFjaW5nID0gbm9ybWFsXG4gICAgICA/IG5ldyBUSFJFRS5WZWN0b3IzKG5vcm1hbC54LCBub3JtYWwueSwgbm9ybWFsLnopLmFwcGx5UXVhdGVybmlvbih0aGlzLnRhZ0dyb3VwLnF1YXRlcm5pb24uY2xvbmUoKS5pbnZlcnQoKSkubm9ybWFsaXplKClcbiAgICAgIDogbmV3IFRIUkVFLlZlY3RvcjMoMCwgMSwgMCk7XG4gICAgY29uc3QgcGxhY2VtZW50OiBUaHJlZUpzVGFnUGxhY2VtZW50ID0ge1xuICAgICAgcG9zaXRpb246IHsgeDogcG9zaXRpb24ueCwgeTogcG9zaXRpb24ueSwgejogcG9zaXRpb24ueiB9LFxuICAgICAgbm9ybWFsOiB7IHg6IGZhY2luZy54LCB5OiBmYWNpbmcueSwgejogZmFjaW5nLnogfSxcbiAgICAgIHBvaVR5cGU6IHRoaXMucGxhY2VtZW50UG9pVHlwZSxcbiAgICB9O1xuICAgIHRoaXMucGVuZGluZ1RhZ1BsYWNlbWVudCA9IHBsYWNlbWVudDtcbiAgICB0aGlzLnBsYWNpbmdUYWcgPSBmYWxzZTtcbiAgICB0aGlzLnJlbW92ZVBsYWNlbWVudFByZXZpZXcoKTtcbiAgICB0aGlzLnBsYWNlbWVudENoYW5nZWQkLm5leHQoZmFsc2UpO1xuICAgIHRoaXMudGFnUGxhY2VkJC5uZXh0KHBsYWNlbWVudCk7XG4gICAgcmV0dXJuIHBsYWNlbWVudDtcbiAgfVxuXG4gIC8qKiBMZWF2ZXMgcGxhY2VtZW50IG1vZGUgd2l0aG91dCBwbGFjaW5nIGFueXRoaW5nLiAqL1xuICBjYW5jZWxUYWdQbGFjZW1lbnQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucGxhY2luZ1RhZykge1xuICAgICAgdGhpcy5wbGFjZW1lbnRDaGFuZ2VkJC5uZXh0KGZhbHNlKTtcbiAgICB9XG4gICAgdGhpcy5wbGFjaW5nVGFnID0gZmFsc2U7XG4gICAgdGhpcy5wZW5kaW5nVGFnUGxhY2VtZW50ID0gbnVsbDtcbiAgICB0aGlzLnBlbmRpbmdQcmV2aWV3RXZlbnQgPSBudWxsO1xuICAgIHRoaXMucmVtb3ZlUGxhY2VtZW50UHJldmlldygpO1xuICAgIGlmICh0aGlzLnJlbmRlcmVyKSB7XG4gICAgICB0aGlzLnJlbmRlcmVyLmRvbUVsZW1lbnQuc3R5bGUuY3Vyc29yID0gJ2RlZmF1bHQnO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93cyBhIHRyYW5zbHVjZW50IHRhZyB1bmRlciB0aGUgY3Vyc29yIHdoaWxlIHBsYWNpbmcsIHNvIHRoZSBzcG90IGlzIHZpc2libGUgYmVmb3JlIGNvbW1pdGluZy5cbiAgICpcbiAgICogTWF0dGVycG9ydCBkb2VzIHRoaXMgd2l0aCBhIHRhZyB0aGF0IGZvbGxvd3MgdGhlIHBvaW50ZXI7IHRoZSBlcXVpdmFsZW50IGhlcmUgaXMgYSBwcmV2aWV3XG4gICAqIHNwcml0ZSB0aGF0IGdldHMgcmVtb3ZlZCB0aGUgbW9tZW50IHRoZSByZWFsIHRhZyB0YWtlcyBpdHMgcGxhY2UuXG4gICAqL1xuICBwcml2YXRlIHVwZGF0ZVBsYWNlbWVudFByZXZpZXcoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBwb3NpdGlvbiA9IHRoaXMucGlja1BvaW50T25HcHUoZXZlbnQpO1xuICAgIGlmICghcG9zaXRpb24pIHtcbiAgICAgIHRoaXMucmVtb3ZlUGxhY2VtZW50UHJldmlldygpO1xuICAgICAgdGhpcy51cGRhdGVNZWFzdXJlUnViYmVyQmFuZChudWxsKTtcbiAgICAgIHRoaXMucmVuZGVyZXIuZG9tRWxlbWVudC5zdHlsZS5jdXJzb3IgPSAnbm90LWFsbG93ZWQnO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMucmVuZGVyZXIuZG9tRWxlbWVudC5zdHlsZS5jdXJzb3IgPSAnY3Jvc3NoYWlyJztcbiAgICBpZiAoIXRoaXMucGxhY2VtZW50UHJldmlldykge1xuICAgICAgLy8gV2hpbGUgY2FsaWJyYXRpbmcsIHRoZSBnaG9zdCBpcyB0aGUgcGluIHRoZSBjbGljayB3aWxsIGxlYXZlLCBudW1iZXIgYW5kIGFsbDogd2hhdCBpc1xuICAgICAgLy8gdW5kZXIgdGhlIHBvaW50ZXIgaXMgd2hhdCBzdGF5cyB0aGVyZS5cbiAgICAgIHRoaXMucGxhY2VtZW50UHJldmlldyA9IHRoaXMuYWxpZ25pbmdcbiAgICAgICAgPyB0aGlzLmNyZWF0ZUNhbGlicmF0aW9uTWFyayhcbiAgICAgICAgICB0aGlzLmNyZWF0ZU51bWJlcmVkVGV4dHVyZSh0aGlzLmFsaWdubWVudFBhaXJzLmxlbmd0aCArIDEsIFRocmVlSnNTZXJ2aWNlLkNBTElCUkFUSU9OX0RPTkVfQ09MT1IpLCA5OTksXG4gICAgICAgIClcbiAgICAgICAgOiBuZXcgVEhSRUUuU3ByaXRlKFxuICAgICAgICAgIG5ldyBUSFJFRS5TcHJpdGVNYXRlcmlhbCh7XG4gICAgICAgICAgICBtYXA6IHRoaXMuY3JlYXRlVGFnVGV4dHVyZSgnIzlFOUU5RScpLFxuICAgICAgICAgICAgZGVwdGhUZXN0OiBmYWxzZSxcbiAgICAgICAgICAgIHRyYW5zcGFyZW50OiB0cnVlLFxuICAgICAgICAgICAgc2l6ZUF0dGVudWF0aW9uOiBmYWxzZSxcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgdGhpcy5wbGFjZW1lbnRQcmV2aWV3LnJlbmRlck9yZGVyID0gOTk5O1xuICAgICAgdGhpcy5wbGFjZW1lbnRQcmV2aWV3Lm1hdGVyaWFsLm9wYWNpdHkgPSAwLjY7XG4gICAgICB0aGlzLnRhZ0dyb3VwLmFkZCh0aGlzLnBsYWNlbWVudFByZXZpZXcpO1xuICAgICAgdGhpcy5zZXRTY3JlZW5TaXplKFxuICAgICAgICB0aGlzLnBsYWNlbWVudFByZXZpZXcsXG4gICAgICAgIHRoaXMuYWxpZ25pbmcgPyBUaHJlZUpzU2VydmljZS5DQUxJQlJBVElPTl9QSU5fUFggOiBUaHJlZUpzU2VydmljZS5UQUdfU0NSRUVOX1BYLFxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5wbGFjZW1lbnRQcmV2aWV3LnBvc2l0aW9uLmNvcHkocG9zaXRpb24pO1xuICAgIHRoaXMudXBkYXRlTWVhc3VyZVJ1YmJlckJhbmQocG9zaXRpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBwb2ludCB1bmRlciB0aGUgY3Vyc29yLCByZWFkIGZyb20gdGhlIGRlcHRoIGJ1ZmZlciBpbnN0ZWFkIG9mIHJheWNhc3QsIGluIHRhZyBzcGFjZS5cbiAgICpcbiAgICogQSByYXljYXN0IHdhbGtzIGV2ZXJ5IHRyaWFuZ2xlIG9mIHRoZSBtZXNoIGl0IGhpdHM6IG9uIGEgY2FwdHVyZWQgbW9kZWwgdGhhdCBpcyBtaWxsaW9ucyBvZlxuICAgKiB0aGVtLCB0ZW5zIG9mIG1pbGxpc2Vjb25kcywgZXZlcnkgdGltZSB0aGUgcG9pbnRlciBtb3Zlcy4gQ29hbGVzY2luZyB0byBvbmUgcGVyIGZyYW1lIGRpZCBub3RcbiAgICogaGVscCwgYmVjYXVzZSB0aGUgY29zdCBpcyB0aGUgcGljayBpdHNlbGYgLSBpdCBzaW1wbHkgYmVjYW1lIG9uZSBzbG93IGZyYW1lIGluc3RlYWQgb2Ygc2V2ZXJhbC5cbiAgICpcbiAgICogUmVuZGVyaW5nIHRoZSBtb2RlbCdzIGRlcHRoIGludG8gYSBzaW5nbGUgcGl4ZWwgdW5kZXIgdGhlIGN1cnNvciBhbnN3ZXJzIHRoZSBzYW1lIHF1ZXN0aW9uIG9uXG4gICAqIHRoZSBHUFUgaW4gY29uc3RhbnQgdGltZSwgd2hhdGV2ZXIgdGhlIG1vZGVsJ3Mgc2l6ZS4gVGhlIGNhbWVyYSdzIHZpZXcgb2Zmc2V0IGlzIHdoYXQgbmFycm93c1xuICAgKiB0aGUgd2hvbGUgaW1hZ2UgZG93biB0byB0aGF0IG9uZSBwaXhlbCwgc28gdGhlIHZhbHVlIHJlYWQgYmFjayBpcyB0aGUgZGVwdGggdGhlIGN1cnNvciBpcyBvdmVyLlxuICAgKlxuICAgKiBVc2VkIGZvciB0aGUgZ2hvc3Qgb25seS4gVGhlIGNsaWNrIHRoYXQgYWN0dWFsbHkgcGxhY2VzIGEgdGFnIHN0aWxsIHJheWNhc3RzOiBpdCBpcyBvbmUgcGljayxcbiAgICogaXRzIGNvc3QgZG9lcyBub3QgbWF0dGVyLCBhbmQgaXQgeWllbGRzIHRoZSBzdXJmYWNlIG5vcm1hbCwgd2hpY2ggZGVwdGggYWxvbmUgY2Fubm90IGdpdmUuXG4gICAqL1xuICBwcml2YXRlIHBpY2tQb2ludE9uR3B1KGV2ZW50OiBNb3VzZUV2ZW50KTogVEhSRUUuVmVjdG9yMyB8IG51bGwge1xuICAgIGlmICghdGhpcy5tb2RlbFJvb3QgfHwgIXRoaXMucmVuZGVyZXIgfHwgIXRoaXMuY2FtZXJhKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMucGlja1RhcmdldCkge1xuICAgICAgdGhpcy5waWNrVGFyZ2V0ID0gbmV3IFRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0KDEsIDEpO1xuICAgICAgdGhpcy5waWNrQ2FtZXJhID0gbmV3IFRIUkVFLlBlcnNwZWN0aXZlQ2FtZXJhKCk7XG4gICAgICB0aGlzLnBpY2tDYW1lcmEubGF5ZXJzLnNldChUaHJlZUpzU2VydmljZS5QSUNLX0xBWUVSKTtcbiAgICAgIHRoaXMucGlja0RlcHRoTWF0ZXJpYWwgPSBuZXcgVEhSRUUuTWVzaERlcHRoTWF0ZXJpYWwoe1xuICAgICAgICBkZXB0aFBhY2tpbmc6IFRIUkVFLlJHQkFEZXB0aFBhY2tpbmcsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCByZWN0ID0gdGhpcy5yZW5kZXJlci5kb21FbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IHggPSBldmVudC5jbGllbnRYIC0gcmVjdC5sZWZ0O1xuICAgIGNvbnN0IHkgPSBldmVudC5jbGllbnRZIC0gcmVjdC50b3A7XG4gICAgaWYgKHggPCAwIHx8IHkgPCAwIHx8IHggPiByZWN0LndpZHRoIHx8IHkgPiByZWN0LmhlaWdodCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgdGhpcy5waWNrQ2FtZXJhLmNvcHkodGhpcy5jYW1lcmEpO1xuICAgIHRoaXMucGlja0NhbWVyYS5sYXllcnMuc2V0KFRocmVlSnNTZXJ2aWNlLlBJQ0tfTEFZRVIpO1xuICAgIC8vIFJlbmRlcnMgdGhlIG9uZSBwaXhlbCB0aGUgY3Vyc29yIGlzIG92ZXIgYXMgaWYgaXQgd2VyZSB0aGUgd2hvbGUgaW1hZ2UgLSBvZmZzZXQgYnkgaGFsZiBhXG4gICAgLy8gcGl4ZWwgc28gdGhlIGN1cnNvciBzaXRzIGF0IHRoYXQgcGl4ZWwncyBjZW50cmUsIHdoaWNoIGlzIHdoZXJlIE5EQyAoMCwgMCkgbGFuZHMuXG4gICAgdGhpcy5waWNrQ2FtZXJhLnNldFZpZXdPZmZzZXQocmVjdC53aWR0aCwgcmVjdC5oZWlnaHQsIHggLSAwLjUsIHkgLSAwLjUsIDEsIDEpO1xuXG4gICAgLy8gV2hlcmUgdGhlIG1vZGVsIGlzIG5vdCwgdGhlIHBpeGVsIG11c3QgcmVhZCBhcyBcIm5vdGhpbmdcIiwgc28gaXQgaXMgY2xlYXJlZCB0byB3aGl0ZSAtIGEgdmFsdWVcbiAgICAvLyBubyByZWFsIGRlcHRoIHBhY2tzIHRvLiBUd28gdGhpbmdzIHdvdWxkIG90aGVyd2lzZSBwYWludCBvdmVyIHRoYXQ6IHRoZSBkZWZhdWx0IGJsYWNrIGNsZWFyLFxuICAgIC8vIHdoaWNoIGRlY29kZXMgYXMgZGVwdGggMCAoYSBoaXQgYWdhaW5zdCB0aGUgbGVucyksIGFuZCB0aGUgc2NlbmUgYmFja2dyb3VuZCwgd2hpY2ggdGhyZWUuanNcbiAgICAvLyBkcmF3cyBpbiBwbGFjZSBvZiB0aGUgY2xlYXIgY29sb3VyIHdoZW5ldmVyIG9uZSBpcyBzZXQuXG4gICAgY29uc3QgcHJldmlvdXNDbGVhckNvbG9yID0gdGhpcy5yZW5kZXJlci5nZXRDbGVhckNvbG9yKG5ldyBUSFJFRS5Db2xvcigpKTtcbiAgICBjb25zdCBwcmV2aW91c0NsZWFyQWxwaGEgPSB0aGlzLnJlbmRlcmVyLmdldENsZWFyQWxwaGEoKTtcbiAgICBjb25zdCBwcmV2aW91c1RhcmdldCA9IHRoaXMucmVuZGVyZXIuZ2V0UmVuZGVyVGFyZ2V0KCk7XG4gICAgY29uc3QgcHJldmlvdXNCYWNrZ3JvdW5kID0gdGhpcy5zY2VuZS5iYWNrZ3JvdW5kO1xuXG4gICAgdGhpcy5zY2VuZS5iYWNrZ3JvdW5kID0gbnVsbDtcbiAgICB0aGlzLnNjZW5lLm92ZXJyaWRlTWF0ZXJpYWwgPSB0aGlzLnBpY2tEZXB0aE1hdGVyaWFsO1xuICAgIHRoaXMucmVuZGVyZXIuc2V0Q2xlYXJDb2xvcigweGZmZmZmZiwgMSk7XG4gICAgdGhpcy5yZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQodGhpcy5waWNrVGFyZ2V0KTtcbiAgICB0aGlzLnJlbmRlcmVyLmNsZWFyKCk7XG4gICAgdGhpcy5yZW5kZXJlci5yZW5kZXIodGhpcy5zY2VuZSwgdGhpcy5waWNrQ2FtZXJhKTtcblxuICAgIHRoaXMucmVuZGVyZXIucmVhZFJlbmRlclRhcmdldFBpeGVscyh0aGlzLnBpY2tUYXJnZXQsIDAsIDAsIDEsIDEsIHRoaXMucGlja1BpeGVsKTtcblxuICAgIHRoaXMucmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KHByZXZpb3VzVGFyZ2V0KTtcbiAgICB0aGlzLnJlbmRlcmVyLnNldENsZWFyQ29sb3IocHJldmlvdXNDbGVhckNvbG9yLCBwcmV2aW91c0NsZWFyQWxwaGEpO1xuICAgIHRoaXMuc2NlbmUub3ZlcnJpZGVNYXRlcmlhbCA9IG51bGw7XG4gICAgdGhpcy5zY2VuZS5iYWNrZ3JvdW5kID0gcHJldmlvdXNCYWNrZ3JvdW5kO1xuXG4gICAgY29uc3QgW3IsIGcsIGIsIGFdID0gdGhpcy5waWNrUGl4ZWw7XG4gICAgaWYgKHIgPT09IDI1NSAmJiBnID09PSAyNTUgJiYgYiA9PT0gMjU1ICYmIGEgPT09IDI1NSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gVGhlIGludmVyc2Ugb2YgdGhyZWUncyBwYWNrRGVwdGhUb1JHQkEsIHdoaWNoIHN0b3JlcyB0aGUgdmFsdWUgaXRzZWxmIGluIGFscGhhIGFuZCBldmVyIGZpbmVyXG4gICAgLy8gZnJhY3Rpb25zIG9mIGl0IGluIGJsdWUsIGdyZWVuIGFuZCByZWQgLSBhbHBoYSBpcyB0aGUgbW9zdCBzaWduaWZpY2FudCBieXRlLCBub3QgcmVkLiBSZWFkIHRoZVxuICAgIC8vIG90aGVyIHdheSByb3VuZCwgdGhlIHJlc3VsdCBpcyBtb3N0bHkgdGhlIGxvdy1vcmRlciBub2lzZSwgb2Z0ZW4gbmVhciB6ZXJvLCB3aGljaCB1bnByb2plY3RzXG4gICAgLy8gb250byB0aGUgbmVhciBwbGFuZTogYSBnaG9zdCBwcmVzc2VkIGFnYWluc3QgdGhlIGxlbnMsIGZpbGxpbmcgdGhlIHdob2xlIHNjcmVlbi5cbiAgICBjb25zdCBkb3duc2NhbGUgPSAyNTUgLyAyNTY7XG4gICAgY29uc3QgZGVwdGggPVxuICAgICAgKHIgLyAyNTUpICogZG93bnNjYWxlIC8gKDI1NiAqIDI1NiAqIDI1NikgK1xuICAgICAgKGcgLyAyNTUpICogZG93bnNjYWxlIC8gKDI1NiAqIDI1NikgK1xuICAgICAgKGIgLyAyNTUpICogZG93bnNjYWxlIC8gMjU2ICtcbiAgICAgIChhIC8gMjU1KSAqIGRvd25zY2FsZTtcblxuICAgIC8vIE5EQyB4IGFuZCB5IGFyZSB6ZXJvIGJlY2F1c2UgdGhlIHBpeGVsIHJlYWQgaXMgdGhlIGNlbnRyZSBvZiB0aGF0IG9uZS1waXhlbCBpbWFnZSAtIHdoaWNoIG9ubHlcbiAgICAvLyBob2xkcyB3aGlsZSB0aGUgdmlldyBvZmZzZXQgaXMgaW4gZWZmZWN0LiBDbGVhcmluZyBpdCBmaXJzdCB3b3VsZCB1bnByb2plY3QgdGhyb3VnaCB0aGUgZnVsbFxuICAgIC8vIHZpZXcgaW5zdGVhZCwgbGFuZGluZyB0aGUgcG9pbnQgb24gdGhlIHJheSB0aHJvdWdoIHRoZSBtaWRkbGUgb2YgdGhlIHNjcmVlbi4gVGhlIG9mZnNldCBpc1xuICAgIC8vIHNpbXBseSByZXBsYWNlZCBieSB0aGUgbmV4dCBwaWNrLCBzbyBpdCBpcyBuZXZlciBjbGVhcmVkLlxuICAgIGNvbnN0IHdvcmxkID0gbmV3IFRIUkVFLlZlY3RvcjMoMCwgMCwgZGVwdGggKiAyIC0gMSkudW5wcm9qZWN0KHRoaXMucGlja0NhbWVyYSk7XG4gICAgdGhpcy50YWdHcm91cC51cGRhdGVXb3JsZE1hdHJpeCh0cnVlLCBmYWxzZSk7XG4gICAgcmV0dXJuIHRoaXMudGFnR3JvdXAud29ybGRUb0xvY2FsKHdvcmxkKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlUGxhY2VtZW50UHJldmlldygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucGxhY2VtZW50UHJldmlldykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnRhZ0dyb3VwLnJlbW92ZSh0aGlzLnBsYWNlbWVudFByZXZpZXcpO1xuICAgIHRoaXMucGxhY2VtZW50UHJldmlldy5tYXRlcmlhbC5tYXA/LmRpc3Bvc2UoKTtcbiAgICB0aGlzLnBsYWNlbWVudFByZXZpZXcubWF0ZXJpYWwuZGlzcG9zZSgpO1xuICAgIHRoaXMucGxhY2VtZW50UHJldmlldyA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKiBTaG93cyBvciBoaWRlcyBvbmUgdGFnLCBsZWF2aW5nIGl0IHJlZ2lzdGVyZWQgc28gaXQgY2FuIGJlIGJyb3VnaHQgYmFjayB3aXRob3V0IHJlbG9hZGluZy4gKi9cbiAgc2V0VGFnVmlzaWJpbGl0eShlbGVtZW50SWQ6IHN0cmluZywgdmlzaWJsZTogYm9vbGVhbik6IHZvaWQge1xuICAgIGNvbnN0IHNwcml0ZSA9IHRoaXMudGFnU3ByaXRlcy5nZXQoZWxlbWVudElkKTtcbiAgICBpZiAoc3ByaXRlKSB7XG4gICAgICBzcHJpdGUudmlzaWJsZSA9IHZpc2libGU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNob3dzIG9ubHkgdGFncyBvZiB0aGUgZ2l2ZW4gdHlwZXMsIGhpZGluZyB0aGUgcmVzdC5cbiAgICpcbiAgICogUGFzc2luZyBudWxsIHNob3dzIGV2ZXJ5dGhpbmcgLSB0aGUgXCJubyBmaWx0ZXJcIiBzdGF0ZSwgZGlzdGluY3QgZnJvbSBhbiBlbXB0eSBhcnJheSwgd2hpY2ggaXMgYVxuICAgKiBmaWx0ZXIgdGhhdCBoYXBwZW5zIHRvIG1hdGNoIG5vdGhpbmcuXG4gICAqL1xuICBzZXRWaXNpYmxlVGFnVHlwZXModHlwZXM6IFBvaVR5cGVbXSB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLnZpc2libGVUYWdUeXBlcyA9IHR5cGVzO1xuICAgIHRoaXMudGFnU3ByaXRlcy5mb3JFYWNoKChzcHJpdGUpID0+IHRoaXMuYXBwbHlUYWdWaXNpYmlsaXR5KHNwcml0ZSkpO1xuICAgIHRoaXMuYW5ub3VuY2VUYWdzQ2hhbmdlZCgpO1xuICB9XG5cbiAgLyoqIFNheXMgd2hldGhlciB0aGUgdmlzaXQgb24gc2NyZWVuIGlzIHRoZSBzaXRlJ3Mgb25seSBvbmU7IHNlZSBzb2xlVmlzaXQuICovXG4gIHNldFNvbGVWaXNpdChzb2xlOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5zb2xlVmlzaXQgPSBzb2xlO1xuICAgIHRoaXMudGFnU3ByaXRlcy5mb3JFYWNoKChzcHJpdGUpID0+IHtcbiAgICAgIHRoaXMucGFyZW50VGFnKHNwcml0ZSk7XG4gICAgICB0aGlzLmFwcGx5VGFnVmlzaWJpbGl0eShzcHJpdGUpO1xuICAgIH0pO1xuICAgIHRoaXMuYW5ub3VuY2VUYWdzQ2hhbmdlZCgpO1xuICB9XG5cbiAgLyoqIFNheXMgd2hpY2ggY2FwdHVyZSBpcyBvbiBzY3JlZW4sIHNvIHRoZSB0YWdzIHBsYWNlZCBpbiBpdCBjYW4gYmUgdG9sZCBmcm9tIHRoZSByZXN0LiAqL1xuICBzZXRDdXJyZW50Q2FwdHVyZShjYXB0dXJlSUQ6IHN0cmluZyB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLmN1cnJlbnRDYXB0dXJlSUQgPSBjYXB0dXJlSUQ7XG4gICAgdGhpcy50YWdTcHJpdGVzLmZvckVhY2goKHNwcml0ZSkgPT4ge1xuICAgICAgdGhpcy5wYXJlbnRUYWcoc3ByaXRlKTtcbiAgICAgIHRoaXMuYXBwbHlUYWdWaXNpYmlsaXR5KHNwcml0ZSk7XG4gICAgfSk7XG4gICAgdGhpcy5hbm5vdW5jZVRhZ3NDaGFuZ2VkKCk7XG4gIH1cblxuICAvKiogRXZlcnkgdGFnIHJlZ2lzdGVyZWQgaW4gdGhlIHNjZW5lLCBzaG93biBvciBub3QuICovXG4gIGdldFRhZ3MoKToge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgbGFiZWw6IHN0cmluZyB8IG51bGw7XG4gICAgcG9pVHlwZTogUG9pVHlwZSB8IG51bGw7XG4gICAgdmlzaWJsZTogYm9vbGVhbjtcbiAgICAvKiogV2hldGhlciB0aGUgY2FsaWJyYXRpb24gd2Fsa3Rocm91Z2ggY2FuIHVzZSBpdC4gKi9cbiAgICBjYWxpYnJhdGFibGU6IGJvb2xlYW47XG4gIH1bXSB7XG4gICAgY29uc3QgY2FuZGlkYXRlcyA9IG5ldyBTZXQodGhpcy5jYWxpYnJhdGlvbkNhbmRpZGF0ZXMoKSk7XG4gICAgcmV0dXJuIFsuLi50aGlzLnRhZ1Nwcml0ZXMudmFsdWVzKCldLm1hcCgoc3ByaXRlKSA9PiAoe1xuICAgICAgaWQ6IHNwcml0ZS5uYW1lLFxuICAgICAgbGFiZWw6IHNwcml0ZS51c2VyRGF0YS5sYWJlbCA/PyBudWxsLFxuICAgICAgcG9pVHlwZTogc3ByaXRlLnVzZXJEYXRhLnBvaVR5cGUgPz8gbnVsbCxcbiAgICAgIHZpc2libGU6IHNwcml0ZS52aXNpYmxlLFxuICAgICAgY2FsaWJyYXRhYmxlOiBjYW5kaWRhdGVzLmhhcyhzcHJpdGUpLFxuICAgIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIb3cgZmFyIHRoZSB0YWdzIGZyb20gZWxzZXdoZXJlIHNpdCBmcm9tIHRoZSBtb2RlbCwgbWVhc3VyZWQgaW4gbW9kZWwgcmFkaWkuIE51bGwgd2l0aG91dCBib3RoLlxuICAgKlxuICAgKiBCZWZvcmUgYSBtb2RlbCBpcyBjYWxpYnJhdGVkIHRob3NlIHRhZ3MgYXJlIHdoZXJldmVyIHRoZWlyIG93biBjb29yZGluYXRlcyBwdXQgdGhlbSwgd2hpY2ggZm9yXG4gICAqIGEgbW9kZWwgd2l0aCBhIGRpZmZlcmVudCBvcmlnaW4gY2FuIGJlIGEgbG9uZyB3YXkgb2ZmIC0gdG9vIGZhciB0byBmaW5kLCBsZXQgYWxvbmUgY2xpY2suXG4gICAqL1xuICBnZXRUYWdEaXN0YW5jZUZyb21Nb2RlbCgpOiBudW1iZXIgfCBudWxsIHtcbiAgICBpZiAoIXRoaXMubW9kZWxSb290IHx8ICF0aGlzLm1vZGVsV29ybGRSYWRpdXMpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBjZW50cm9pZCA9IG5ldyBUSFJFRS5WZWN0b3IzKCk7XG4gICAgY29uc3QgY2FuZGlkYXRlcyA9IHRoaXMuY2FsaWJyYXRpb25DYW5kaWRhdGVzKCk7XG4gICAgY2FuZGlkYXRlcy5mb3JFYWNoKChzcHJpdGUpID0+IGNlbnRyb2lkLmFkZChzcHJpdGUuZ2V0V29ybGRQb3NpdGlvbihuZXcgVEhSRUUuVmVjdG9yMygpKSkpO1xuICAgIGNvbnN0IGNvdW50ID0gY2FuZGlkYXRlcy5sZW5ndGg7XG4gICAgaWYgKGNvdW50ID09PSAwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgLy8gVGhlIG1vZGVsIGlzIGNlbnRyZWQgb24gdGhlIHdvcmxkIG9yaWdpbiB3aGVuIGl0IGlzIHBsYWNlZC5cbiAgICByZXR1cm4gY2VudHJvaWQuZGl2aWRlU2NhbGFyKGNvdW50KS5sZW5ndGgoKSAvIHRoaXMubW9kZWxXb3JsZFJhZGl1cztcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5ncyBhIHRhZyBmcm9tIHRoZSBncm91cCBpdHMgY29vcmRpbmF0ZXMgYmVsb25nIHRvOiBvdXRzaWRlIHRoZSBjYWxpYnJhdGlvbiB3aGVuIHRoZXkgYXJlIGluXG4gICAqIHRoaXMgbW9kZWwncyBvd24gY29vcmRpbmF0ZXMsIHVuZGVyIGl0IG90aGVyd2lzZS5cbiAgICovXG4gIHByaXZhdGUgcGFyZW50VGFnKHNwcml0ZTogVEhSRUUuT2JqZWN0M0QpOiB2b2lkIHtcbiAgICBjb25zdCBwYXJlbnQgPSBzcHJpdGUudXNlckRhdGEuZnJhbWUgPT09ICdtb2RlbCcgJiYgdGhpcy5pc093bmVkQnlWaXNpdChzcHJpdGUpXG4gICAgICA/IHRoaXMubW9kZWxUYWdHcm91cFxuICAgICAgOiB0aGlzLnRhZ0dyb3VwO1xuICAgIGlmIChzcHJpdGUucGFyZW50ICE9PSBwYXJlbnQpIHtcbiAgICAgIHBhcmVudC5hZGQoc3ByaXRlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIHRhZ3MgYSBjYWxpYnJhdGlvbiBjYW4gYmUgd29ya2VkIG91dCBmcm9tOiB0aG9zZSB0aGF0IGNhbWUgZnJvbSBzb21ld2hlcmUgZWxzZSwgd2hldGhlciBvclxuICAgKiBub3QgdGhleSBhcmUgb24gc2hvdyAtIGJlZm9yZSBjYWxpYnJhdGluZywgbW9zdCBvZiB0aGVtIHdpbGwgbm90IGJlLlxuICAgKlxuICAgKiBUYWdzIHBsYWNlZCBpbiB0aGlzIG1vZGVsIGFyZSB3aGVyZSB0aGV5IGFyZSBiZWNhdXNlIHNvbWVvbmUgY2xpY2tlZCB0aGVyZTsgbWF0Y2hpbmcgdGhlbSB0b1xuICAgKiBcIndoZXJlIHRoZXkgcmVhbGx5IGFyZVwiIHdvdWxkIGJlIGNpcmN1bGFyLiBBIHRhZyBpbiBhbm90aGVyIG1vZGVsJ3Mgb3duIGNvb3JkaW5hdGVzIGNhbm5vdCBiZVxuICAgKiBwbGFjZWQgaGVyZSBhdCBhbGwuIEFuZCBhIHRhZyBhbHJlYWR5IHVzZWQgaW4gdGhpcyBjYWxpYnJhdGlvbiBjYW5ub3QgYmUgdXNlZCBhZ2FpbiAtIHR3b1xuICAgKiBwYWlycyBmcm9tIG9uZSB0YWcgY2Fycnkgbm8gbW9yZSB0aGFuIG9uZS5cbiAgICovXG4gIHByaXZhdGUgY2FsaWJyYXRpb25DYW5kaWRhdGVzKCk6IFRIUkVFLk9iamVjdDNEW10ge1xuICAgIGNvbnN0IHVzZWQgPSBuZXcgU2V0KHRoaXMuYWxpZ25tZW50UGFpcnMubWFwKChwYWlyKSA9PiBwYWlyLnRhZ0lkKSk7XG4gICAgcmV0dXJuIFsuLi50aGlzLnRhZ1Nwcml0ZXMudmFsdWVzKCldLmZpbHRlcigoc3ByaXRlKSA9PlxuICAgICAgc3ByaXRlLnBhcmVudCA9PT0gdGhpcy50YWdHcm91cFxuICAgICAgJiYgc3ByaXRlLnVzZXJEYXRhLmZyYW1lICE9PSAnbW9kZWwnXG4gICAgICAmJiAhdGhpcy5pc093bmVkQnlWaXNpdChzcHJpdGUpXG4gICAgICAmJiAhdXNlZC5oYXMoc3ByaXRlLm5hbWUpKTtcbiAgfVxuXG4gIC8qKiBIb3cgbWFueSB0YWdzIHRoZXJlIGFyZSB0byBjYWxpYnJhdGUgd2l0aCwgbm90IGNvdW50aW5nIHRob3NlIGFscmVhZHkgdXNlZC4gKi9cbiAgZ2V0Q2FsaWJyYXRpb25DYW5kaWRhdGVDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmNhbGlicmF0aW9uQ2FuZGlkYXRlcygpLmxlbmd0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBIb3cgbWFueSB0YWdzIGZyb20gZWxzZXdoZXJlIGFyZSBub3Qgb24gdGhpcyBtb2RlbCwgYW5kIHNvIG5vdCBzaG93biBvbiBpdC5cbiAgICpcbiAgICogT24gYSBtb2RlbCB0aGF0IGhhcyBub3QgYmVlbiBjYWxpYnJhdGVkLCB0aGlzIGlzIHdoYXQgc3VnZ2VzdHMgaXQgc2hvdWxkIGJlOiB0aGUgdGFncyBhcmUgb3V0XG4gICAqIHRoZXJlLCBqdXN0IG5vdCB3aGVyZSB0aGUgbW9kZWwgaXMuXG4gICAqL1xuICBnZXRPZmZNb2RlbFRhZ0NvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuY2FsaWJyYXRpb25DYW5kaWRhdGVzKCkuZmlsdGVyKChzcHJpdGUpID0+ICF0aGlzLmlzT25Nb2RlbChzcHJpdGUpKS5sZW5ndGg7XG4gIH1cblxuICAvKiogV2hldGhlciB0aGUgdGFnIHdhcyBwbGFjZWQgaW4gdGhlIHZpc2l0IG9uIHNjcmVlbi4gKi9cbiAgcHJpdmF0ZSBpc093bmVkQnlWaXNpdChzcHJpdGU6IFRIUkVFLk9iamVjdDNEKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgb3JpZ2luID0gc3ByaXRlLnVzZXJEYXRhLm9yaWdpbkNhcHR1cmVJRDtcbiAgICByZXR1cm4gb3JpZ2luID8gb3JpZ2luID09PSB0aGlzLmN1cnJlbnRDYXB0dXJlSUQgOiB0aGlzLnNvbGVWaXNpdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHRhZyBzaG93cyB3aGVuIGl0cyB0eXBlIGlzIG5vdCBmaWx0ZXJlZCBvdXQgYW5kIGl0IGJlbG9uZ3Mgb24gdGhpcyBtb2RlbC5cbiAgICpcbiAgICogT25lIHBsYWNlIGRlY2lkZXMsIGJlY2F1c2UgdGhlIHR3byB1c2VkIHRvIHNldCBgdmlzaWJsZWAgc2VwYXJhdGVseSBhbmQgd2hpY2hldmVyIHJhbiBsYXN0XG4gICAqIHVuZGlkIHRoZSBvdGhlci5cbiAgICovXG4gIHByaXZhdGUgYXBwbHlUYWdWaXNpYmlsaXR5KHNwcml0ZTogVEhSRUUuT2JqZWN0M0QpOiB2b2lkIHtcbiAgICBjb25zdCB0eXBlQWxsb3dlZCA9IHRoaXMudmlzaWJsZVRhZ1R5cGVzID09PSBudWxsXG4gICAgICB8fCB0aGlzLnZpc2libGVUYWdUeXBlcy5pbmNsdWRlcyhzcHJpdGUudXNlckRhdGEucG9pVHlwZSk7XG4gICAgc3ByaXRlLnZpc2libGUgPSB0eXBlQWxsb3dlZCAmJiB0aGlzLmJlbG9uZ3NPblRoaXNNb2RlbChzcHJpdGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgYSB0YWcgaGFzIGEgcGxhY2Ugb24gdGhpcyBtb2RlbC5cbiAgICpcbiAgICogRXZlcnkgdGFnIG9mIHRoZSBzcGFjZSBpcyBvZmZlcmVkIHRvIGV2ZXJ5IG1vZGVsIC0gdGhlcmUgaXMgb25lIHNldCBvZiB0YWdzLCBub3Qgb25lIHBlciBtb2RlbC5cbiAgICogV2hhdCBhIG1vZGVsIHNob3dzIG9mIGl0IGlzIHRoZSBwYXJ0IHRoYXQgc2l0cyBvbiB0aGUgbW9kZWwuXG4gICAqL1xuICBwcml2YXRlIGJlbG9uZ3NPblRoaXNNb2RlbChzcHJpdGU6IFRIUkVFLk9iamVjdDNEKTogYm9vbGVhbiB7XG4gICAgLy8gUGxhY2VkIGhlcmUgYnkgYSBjbGljayBvbiB0aGlzIHZlcnkgc3VyZmFjZS5cbiAgICBpZiAodGhpcy5pc093bmVkQnlWaXNpdChzcHJpdGUpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLy8gUGxhY2VkIGluIGFub3RoZXIgbW9kZWwgYmVmb3JlIHRoYXQgb25lIHdhcyBjYWxpYnJhdGVkOiBpdHMgY29vcmRpbmF0ZXMgYXJlIHRoYXQgbW9kZWwncyBvd25cbiAgICAvLyBhbmQgc2F5IG5vdGhpbmcgYWJvdXQgd2hlcmUgaXQgd291bGQgYmUgaW4gdGhpcyBvbmUuXG4gICAgaWYgKHNwcml0ZS51c2VyRGF0YS5mcmFtZSA9PT0gJ21vZGVsJykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvLyBDYWxpYnJhdGluZyBpcyBtYXRjaGluZyB0YWdzIHRvIHdoZXJlIHRoZXkgYmVsb25nLCBzbyB0aGV5IGFsbCBoYXZlIHRvIGJlIG9uIG9mZmVyIC0gZnJvbVxuICAgIC8vIHRoZSBtb21lbnQgdGhlIHBhbmVsIG9wZW5zLCBub3Qgb25seSBvbmNlIHRoZSBmaXJzdCBjbGljayBpcyBiZWluZyB3YWl0ZWQgZm9yLlxuICAgIGlmICh0aGlzLmFsaWduaW5nIHx8IHRoaXMucmV2ZWFsaW5nQ2FsaWJyYXRpb25UYWdzKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuaXNPbk1vZGVsKHNwcml0ZSk7XG4gIH1cblxuICAvKiogV2hldGhlciBhIHRhZywgZHJhd24gd2hlcmUgaXRzIGNvb3JkaW5hdGVzIGFuZCB0aGUgY2FsaWJyYXRpb24gcHV0IGl0LCBzaXRzIG9uIHRoZSBtb2RlbC4gKi9cbiAgcHJpdmF0ZSBpc09uTW9kZWwoc3ByaXRlOiBUSFJFRS5PYmplY3QzRCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5zdXJmYWNlQ2VsbHMpIHtcbiAgICAgIC8vIE5vIG1vZGVsIHRvIGJlIG9uIHlldC5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgcGFyZW50ID0gc3ByaXRlLnBhcmVudCA/PyB0aGlzLnRhZ0dyb3VwO1xuICAgIHBhcmVudC51cGRhdGVNYXRyaXgoKTtcbiAgICAvLyBUaGUgZ3JpZCBpcyBpbiB0aGUgbW9kZWwncyBvd24gdW5pdHM7IHRoZSBjYWxpYnJhdGlvbidzIHNjYWxlIGlzIGhvdyBtYW55IG9mIHRob3NlIGEgbWV0cmUgaXMuXG4gICAgY29uc3QgcmVhY2ggPSBUaHJlZUpzU2VydmljZS5PTl9NT0RFTF9NRVRSRVMgKiAocGFyZW50LnNjYWxlLnggfHwgMSk7XG4gICAgcmV0dXJuIHRoaXMuaXNOZWFyU3VyZmFjZShzcHJpdGUucG9zaXRpb24uY2xvbmUoKS5hcHBseU1hdHJpeDQocGFyZW50Lm1hdHJpeCksIHJlYWNoKTtcbiAgfVxuXG4gIC8qKiBSZS1kZWNpZGVzIGV2ZXJ5IHRhZydzIHZpc2liaWxpdHk6IHRoZSBtb2RlbCwgdGhlIGNhbGlicmF0aW9uIG9yIHRoZSBtb2RlIGNoYW5nZWQuICovXG4gIHByaXZhdGUgcmVmcmVzaFRhZ1Zpc2liaWxpdHkoKTogdm9pZCB7XG4gICAgdGhpcy50YWdTcHJpdGVzLmZvckVhY2goKHNwcml0ZSkgPT4gdGhpcy5hcHBseVRhZ1Zpc2liaWxpdHkoc3ByaXRlKSk7XG4gIH1cblxuICBwcml2YXRlIHN1cmZhY2VLZXkoeDogbnVtYmVyLCB5OiBudW1iZXIsIHo6IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3Qgc3BhbiA9IFRocmVlSnNTZXJ2aWNlLlNVUkZBQ0VfR1JJRF9TUEFOO1xuICAgIGNvbnN0IHBhZCA9IFRocmVlSnNTZXJ2aWNlLlNVUkZBQ0VfR1JJRF9QQUQ7XG4gICAgY29uc3QgW2ksIGosIGtdID0gW3ggKyBwYWQsIHkgKyBwYWQsIHogKyBwYWRdO1xuICAgIGlmIChpIDwgMCB8fCBqIDwgMCB8fCBrIDwgMCB8fCBpID49IHNwYW4gfHwgaiA+PSBzcGFuIHx8IGsgPj0gc3Bhbikge1xuICAgICAgcmV0dXJuIC0xO1xuICAgIH1cbiAgICByZXR1cm4gaSArIHNwYW4gKiAoaiArIHNwYW4gKiBrKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMYXlzIHRoZSBncmlkIG92ZXIgdGhlIG1vZGVsJ3Mgc3VyZmFjZS5cbiAgICpcbiAgICogUnVucyBvbmNlIHBlciBtb2RlbCwgaW4gb25lIHBhc3Mgb3ZlciBpdHMgdHJpYW5nbGVzLiBBIHRyaWFuZ2xlIHNtYWxsZXIgdGhhbiBhIGNlbGwgaXMgbWFya2VkXG4gICAqIGJ5IGl0cyBjZW50cmUsIHdoaWNoIGlzIGV2ZXJ5IHRyaWFuZ2xlIG9mIGEgc2Nhbm5lZCBtb2RlbDsgYSBsYXJnZXIgb25lIC0gdGhlIHR3byB0cmlhbmdsZXMgb2ZcbiAgICogYSBkcmF3biB3YWxsIC0gaXMgc2FtcGxlZCBhY3Jvc3MgaXRzIGZhY2UsIG9yIHRoZSBtaWRkbGUgb2YgdGhlIHdhbGwgd291bGQgcmVhZCBhcyBlbXB0eS5cbiAgICovXG4gIHByaXZhdGUgYnVpbGRTdXJmYWNlR3JpZChvYmplY3Q6IFRIUkVFLk9iamVjdDNELCBib3g6IFRIUkVFLkJveDMpOiB2b2lkIHtcbiAgICBjb25zdCBzaXplID0gYm94LmdldFNpemUobmV3IFRIUkVFLlZlY3RvcjMoKSk7XG4gICAgY29uc3QgbG9uZ2VzdCA9IE1hdGgubWF4KHNpemUueCwgc2l6ZS55LCBzaXplLnopO1xuICAgIGlmICghKGxvbmdlc3QgPiAwKSkge1xuICAgICAgdGhpcy5zdXJmYWNlQ2VsbHMgPSBudWxsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBBIHF1YXJ0ZXIgb2YgYSBtZXRyZSB3aGVyZSB0aGUgbW9kZWwgaXMgaW4gbWV0cmVzOyBjb2Fyc2VyIG9uIGEgdmVyeSBsYXJnZSBvbmUsIHNvIHRoZSBncmlkXG4gICAgLy8gc3RheXMgYWRkcmVzc2FibGUgYW5kIGl0cyBtZW1vcnkgYm91bmRlZC5cbiAgICBjb25zdCBjZWxsID0gTWF0aC5tYXgoMC4yNSwgbG9uZ2VzdCAvIDM4NCk7XG4gICAgY29uc3Qgb3JpZ2luID0gYm94Lm1pbi5jbG9uZSgpO1xuICAgIGNvbnN0IGNlbGxzID0gbmV3IFNldDxudW1iZXI+KCk7XG4gICAgY29uc3QgbWFyayA9IChwb2ludDogVEhSRUUuVmVjdG9yMykgPT4ge1xuICAgICAgY29uc3Qga2V5ID0gdGhpcy5zdXJmYWNlS2V5KFxuICAgICAgICBNYXRoLmZsb29yKChwb2ludC54IC0gb3JpZ2luLngpIC8gY2VsbCksXG4gICAgICAgIE1hdGguZmxvb3IoKHBvaW50LnkgLSBvcmlnaW4ueSkgLyBjZWxsKSxcbiAgICAgICAgTWF0aC5mbG9vcigocG9pbnQueiAtIG9yaWdpbi56KSAvIGNlbGwpLFxuICAgICAgKTtcbiAgICAgIGlmIChrZXkgPj0gMCkge1xuICAgICAgICBjZWxscy5hZGQoa2V5KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgbGV0IHRyaWFuZ2xlQ291bnQgPSAwO1xuICAgIG9iamVjdC51cGRhdGVNYXRyaXhXb3JsZCh0cnVlKTtcbiAgICBvYmplY3QudHJhdmVyc2UoKGNoaWxkOiBhbnkpID0+IHtcbiAgICAgIGNvbnN0IHBvc2l0aW9uID0gY2hpbGQuaXNNZXNoICYmIGNoaWxkLmdlb21ldHJ5Py5hdHRyaWJ1dGVzPy5wb3NpdGlvbjtcbiAgICAgIGlmIChwb3NpdGlvbikge1xuICAgICAgICB0cmlhbmdsZUNvdW50ICs9IChjaGlsZC5nZW9tZXRyeS5pbmRleCA/IGNoaWxkLmdlb21ldHJ5LmluZGV4LmNvdW50IDogcG9zaXRpb24uY291bnQpIC8gMztcbiAgICAgIH1cbiAgICB9KTtcbiAgICAvLyBQYXN0IGEgZmV3IG1pbGxpb24gdHJpYW5nbGVzIHRoZXkgYXJlIGZhciBzbWFsbGVyIHRoYW4gYSBjZWxsLCBhbmQgZXZlcnkgY2VsbCBpcyBoaXQgbWFueVxuICAgIC8vIHRpbWVzIG92ZXI7IGEgc2FtcGxlIG1hcmtzIHRoZSBzYW1lIGNlbGxzLlxuICAgIGNvbnN0IHN0cmlkZSA9IE1hdGgubWF4KDEsIE1hdGguY2VpbCh0cmlhbmdsZUNvdW50IC8gMzAwMDAwMCkpO1xuXG4gICAgY29uc3QgYSA9IG5ldyBUSFJFRS5WZWN0b3IzKCk7XG4gICAgY29uc3QgYiA9IG5ldyBUSFJFRS5WZWN0b3IzKCk7XG4gICAgY29uc3QgYyA9IG5ldyBUSFJFRS5WZWN0b3IzKCk7XG4gICAgY29uc3QgcG9pbnQgPSBuZXcgVEhSRUUuVmVjdG9yMygpO1xuICAgIG9iamVjdC50cmF2ZXJzZSgoY2hpbGQ6IGFueSkgPT4ge1xuICAgICAgY29uc3QgcG9zaXRpb24gPSBjaGlsZC5pc01lc2ggJiYgY2hpbGQuZ2VvbWV0cnk/LmF0dHJpYnV0ZXM/LnBvc2l0aW9uO1xuICAgICAgaWYgKCFwb3NpdGlvbikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBpbmRleCA9IGNoaWxkLmdlb21ldHJ5LmluZGV4O1xuICAgICAgY29uc3QgY291bnQgPSAoaW5kZXggPyBpbmRleC5jb3VudCA6IHBvc2l0aW9uLmNvdW50KSAvIDM7XG4gICAgICBmb3IgKGxldCB0cmlhbmdsZSA9IDA7IHRyaWFuZ2xlIDwgY291bnQ7IHRyaWFuZ2xlICs9IHN0cmlkZSkge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0cmlhbmdsZSAqIDM7XG4gICAgICAgIGEuZnJvbUJ1ZmZlckF0dHJpYnV0ZShwb3NpdGlvbiwgaW5kZXggPyBpbmRleC5nZXRYKG9mZnNldCkgOiBvZmZzZXQpLmFwcGx5TWF0cml4NChjaGlsZC5tYXRyaXhXb3JsZCk7XG4gICAgICAgIGIuZnJvbUJ1ZmZlckF0dHJpYnV0ZShwb3NpdGlvbiwgaW5kZXggPyBpbmRleC5nZXRYKG9mZnNldCArIDEpIDogb2Zmc2V0ICsgMSkuYXBwbHlNYXRyaXg0KGNoaWxkLm1hdHJpeFdvcmxkKTtcbiAgICAgICAgYy5mcm9tQnVmZmVyQXR0cmlidXRlKHBvc2l0aW9uLCBpbmRleCA/IGluZGV4LmdldFgob2Zmc2V0ICsgMikgOiBvZmZzZXQgKyAyKS5hcHBseU1hdHJpeDQoY2hpbGQubWF0cml4V29ybGQpO1xuICAgICAgICBjb25zdCBlZGdlID0gTWF0aC5tYXgoYS5kaXN0YW5jZVRvKGIpLCBiLmRpc3RhbmNlVG8oYyksIGMuZGlzdGFuY2VUbyhhKSk7XG4gICAgICAgIGlmIChlZGdlIDw9IGNlbGwpIHtcbiAgICAgICAgICBtYXJrKHBvaW50LmNvcHkoYSkuYWRkKGIpLmFkZChjKS5tdWx0aXBseVNjYWxhcigxIC8gMykpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIEhhbGYtY2VsbCBzdGVwcyBhY3Jvc3MgdGhlIGZhY2UuIENhcHBlZCwgc28gb25lIGVub3Jtb3VzIHRyaWFuZ2xlIGNhbm5vdCBzdGFsbCB0aGUgbG9hZDtcbiAgICAgICAgLy8gdGhlIHJlYWNoIGEgdGFnIGlzIHRlc3RlZCB3aXRoIHNwYW5zIHNldmVyYWwgY2VsbHMgYW5kIGJyaWRnZXMgd2hhdCB0aGUgY2FwIGxlYXZlcy5cbiAgICAgICAgY29uc3Qgc3RlcHMgPSBNYXRoLm1pbig5NiwgTWF0aC5jZWlsKCgyICogZWRnZSkgLyBjZWxsKSk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IHN0ZXBzOyBpICs9IDEpIHtcbiAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8PSBzdGVwcyAtIGk7IGogKz0gMSkge1xuICAgICAgICAgICAgcG9pbnQuY29weShhKVxuICAgICAgICAgICAgICAuYWRkU2NhbGVkVmVjdG9yKGIuY2xvbmUoKS5zdWIoYSksIGkgLyBzdGVwcylcbiAgICAgICAgICAgICAgLmFkZFNjYWxlZFZlY3RvcihjLmNsb25lKCkuc3ViKGEpLCBqIC8gc3RlcHMpO1xuICAgICAgICAgICAgbWFyayhwb2ludCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLnN1cmZhY2VDZWxscyA9IGNlbGxzO1xuICAgIHRoaXMuc3VyZmFjZU9yaWdpbi5jb3B5KG9yaWdpbik7XG4gICAgdGhpcy5zdXJmYWNlQ2VsbFNpemUgPSBjZWxsO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgc29tZSBwYXJ0IG9mIHRoZSBtb2RlbCdzIHN1cmZhY2UgbGllcyB3aXRoaW4gYHJlYWNoYCBvZiBhIHBvaW50LCBpbiBtb2RlbCB1bml0cy4gKi9cbiAgcHJpdmF0ZSBpc05lYXJTdXJmYWNlKHBvaW50OiBUSFJFRS5WZWN0b3IzLCByZWFjaDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgY29uc3QgY2VsbCA9IHRoaXMuc3VyZmFjZUNlbGxTaXplO1xuICAgIGNvbnN0IG9yaWdpbiA9IHRoaXMuc3VyZmFjZU9yaWdpbjtcbiAgICBjb25zdCB4ID0gKHBvaW50LnggLSBvcmlnaW4ueCkgLyBjZWxsO1xuICAgIGNvbnN0IHkgPSAocG9pbnQueSAtIG9yaWdpbi55KSAvIGNlbGw7XG4gICAgY29uc3QgeiA9IChwb2ludC56IC0gb3JpZ2luLnopIC8gY2VsbDtcbiAgICAvLyBJbiBjZWxscy4gQ2FwcGVkOiBiZXlvbmQgdGhpcyB0aGUgY2FsaWJyYXRpb24ncyBzY2FsZSBtYWtlcyBhIG1ldHJlIHNvIG1hbnkgY2VsbHMgdGhhdCB0aGVcbiAgICAvLyBzZWFyY2ggd291bGQgZHdhcmYgdGhlIG1vZGVsLCBhbmQgYSB0YWcgdGhhdCBmYXIgb2ZmIGlzIG5vdCBvbiBpdCBieSBhbnkgcmVhZGluZy5cbiAgICBjb25zdCBzcGFuID0gTWF0aC5taW4oMTYsIE1hdGguY2VpbChyZWFjaCAvIGNlbGwpKTtcbiAgICAvLyBBIGNlbGwgaXMgXCJ3aXRoaW4gcmVhY2hcIiB3aGVuIGl0cyBjZW50cmUgaXMsIGdpdmUgb3IgdGFrZSB0aGUgaGFsZi1kaWFnb25hbCBvZiB0aGUgY2VsbC5cbiAgICBjb25zdCBsaW1pdCA9IChyZWFjaCAvIGNlbGwgKyAwLjg3KSAqKiAyO1xuICAgIGNvbnN0IFtjeCwgY3ksIGN6XSA9IFtNYXRoLmZsb29yKHgpLCBNYXRoLmZsb29yKHkpLCBNYXRoLmZsb29yKHopXTtcbiAgICBmb3IgKGxldCBrID0gY3ogLSBzcGFuOyBrIDw9IGN6ICsgc3BhbjsgayArPSAxKSB7XG4gICAgICBmb3IgKGxldCBqID0gY3kgLSBzcGFuOyBqIDw9IGN5ICsgc3BhbjsgaiArPSAxKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSBjeCAtIHNwYW47IGkgPD0gY3ggKyBzcGFuOyBpICs9IDEpIHtcbiAgICAgICAgICBjb25zdCBkaXN0YW5jZSA9IChpICsgMC41IC0geCkgKiogMiArIChqICsgMC41IC0geSkgKiogMiArIChrICsgMC41IC0geikgKiogMjtcbiAgICAgICAgICBpZiAoZGlzdGFuY2UgPD0gbGltaXQgJiYgdGhpcy5zdXJmYWNlQ2VsbHMuaGFzKHRoaXMuc3VyZmFjZUtleShpLCBqLCBrKSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogTW92ZXMgdGhlIGNhbWVyYSB0byBsb29rIGF0IGEgdGFnLCBtaXJyb3JpbmcgTWF0dGVycG9ydCdzIGdvVG9UYWcuXG4gICAqXG4gICAqIEFuaW1hdGVkIHJhdGhlciB0aGFuIHRlbGVwb3J0ZWQ6IGp1bXBpbmcgdGhlIGNhbWVyYSBsb3NlcyB0aGUgdmlld2VyJ3Mgc2Vuc2Ugb2Ygd2hlcmUgdGhleSB3ZXJlXG4gICAqIHJlbGF0aXZlIHRvIHRoZSBtb2RlbC4gVGhlIGFwcHJvYWNoIGRpc3RhbmNlIGZvbGxvd3MgdGhlIG1vZGVsJ3Mgc2l6ZSBzbyBpdCBmcmFtZXMgc2Vuc2libHlcbiAgICogd2hhdGV2ZXIgdGhlIHVuaXRzIGFyZS5cbiAgICovXG4gIGdvVG9UYWcoZWxlbWVudElkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBzcHJpdGUgPSB0aGlzLnRhZ1Nwcml0ZXMuZ2V0KGVsZW1lbnRJZCk7XG4gICAgaWYgKHNwcml0ZSkge1xuICAgICAgdGhpcy50YWdGb2N1c2VkJC5uZXh0KGVsZW1lbnRJZCk7XG4gICAgfVxuICAgIGlmICghc3ByaXRlIHx8ICF0aGlzLmNhbWVyYSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHRhcmdldCA9IHNwcml0ZS5nZXRXb3JsZFBvc2l0aW9uKG5ldyBUSFJFRS5WZWN0b3IzKCkpO1xuICAgIGNvbnN0IGRpc3RhbmNlID0gdGhpcy5tb2RlbFJvb3RcbiAgICAgID8gbmV3IFRIUkVFLkJveDMoKS5zZXRGcm9tT2JqZWN0KHRoaXMubW9kZWxSb290KS5nZXRTaXplKG5ldyBUSFJFRS5WZWN0b3IzKCkpLmxlbmd0aCgpICogMC4xNVxuICAgICAgOiA1O1xuXG4gICAgLy8gQXBwcm9hY2ggYWxvbmcgdGhlIGN1cnJlbnQgdmlld2luZyBkaXJlY3Rpb24sIHNvIHRoZSBjYW1lcmEgY2xvc2VzIGluIHJhdGhlciB0aGFuIHN3aW5naW5nXG4gICAgLy8gYXJvdW5kIHRvIGFuIGFyYml0cmFyeSBzaWRlLlxuICAgIGNvbnN0IGRpcmVjdGlvbiA9IHRoaXMuY2FtZXJhLnBvc2l0aW9uLmNsb25lKCkuc3ViKHRoaXMuY29udHJvbHMudGFyZ2V0KS5ub3JtYWxpemUoKTtcbiAgICB0aGlzLmNhbWVyYVR3ZWVuID0ge1xuICAgICAgZnJvbVBvc2l0aW9uOiB0aGlzLmNhbWVyYS5wb3NpdGlvbi5jbG9uZSgpLFxuICAgICAgdG9Qb3NpdGlvbjogdGFyZ2V0LmNsb25lKCkuYWRkKGRpcmVjdGlvbi5tdWx0aXBseVNjYWxhcihkaXN0YW5jZSkpLFxuICAgICAgZnJvbVRhcmdldDogdGhpcy5jb250cm9scy50YXJnZXQuY2xvbmUoKSxcbiAgICAgIHRvVGFyZ2V0OiB0YXJnZXQsXG4gICAgICBzdGFydGVkQXQ6IHBlcmZvcm1hbmNlLm5vdygpLFxuICAgICAgZHVyYXRpb25NczogNjAwLFxuICAgIH07XG4gIH1cblxuICAvKiogQWR2YW5jZXMgdGhlIGNhbWVyYSBhbmltYXRpb24gc3RhcnRlZCBieSBnb1RvVGFnLCBpZiBvbmUgaXMgcnVubmluZy4gKi9cbiAgcHJpdmF0ZSBzdGVwQ2FtZXJhVHdlZW4oKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNhbWVyYVR3ZWVuKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHsgZnJvbVBvc2l0aW9uLCB0b1Bvc2l0aW9uLCBmcm9tVGFyZ2V0LCB0b1RhcmdldCwgc3RhcnRlZEF0LCBkdXJhdGlvbk1zIH0gPSB0aGlzLmNhbWVyYVR3ZWVuO1xuICAgIGNvbnN0IGxpbmVhciA9IE1hdGgubWluKChwZXJmb3JtYW5jZS5ub3coKSAtIHN0YXJ0ZWRBdCkgLyBkdXJhdGlvbk1zLCAxKTtcbiAgICAvLyBFYXNlIG91dCwgc28gdGhlIG1vdmUgc2V0dGxlcyBpbnN0ZWFkIG9mIHN0b3BwaW5nIGRlYWQuXG4gICAgY29uc3QgdCA9IDEgLSBNYXRoLnBvdygxIC0gbGluZWFyLCAzKTtcblxuICAgIHRoaXMuY2FtZXJhLnBvc2l0aW9uLmxlcnBWZWN0b3JzKGZyb21Qb3NpdGlvbiwgdG9Qb3NpdGlvbiwgdCk7XG4gICAgdGhpcy5jb250cm9scy50YXJnZXQubGVycFZlY3RvcnMoZnJvbVRhcmdldCwgdG9UYXJnZXQsIHQpO1xuXG4gICAgaWYgKGxpbmVhciA+PSAxKSB7XG4gICAgICB0aGlzLmNhbWVyYVR3ZWVuID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBpc1BsYWNpbmdUYWcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucGxhY2luZ1RhZztcbiAgfVxuXG4gIC8qKiBUaGUgc3BvdCBwaWNrZWQgYnkgdGhlIGxhc3QgcGxhY2VtZW50LCBmb3Igd2hvZXZlciBjb21taXRzIGl0IHRvIGEgUE9JLiAqL1xuICBnZXRQZW5kaW5nVGFnUGxhY2VtZW50KCk6IFRocmVlSnNUYWdQbGFjZW1lbnQgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5wZW5kaW5nVGFnUGxhY2VtZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIFJheWNhc3RzIGEgY2xpY2sgYWdhaW5zdCB0aGUgbW9kZWwncyBnZW9tZXRyeSBhbmQgcmV0dXJucyB0aGUgaGl0LCBpbiB3b3JsZCBzcGFjZS5cbiAgICpcbiAgICogUmV0dXJucyBudWxsIHdoZW4gdGhlIGNsaWNrIG1pc3NlZCwgd2hpY2ggaXMgYSBub3JtYWwgb3V0Y29tZSAtIHRoZSB1c2VyIGNsaWNrZWQgdGhlIHNreSAtIGFuZFxuICAgKiBsZWF2ZXMgd2hhdGV2ZXIgbW9kZSBpcyBhcm1lZCBzdGlsbCBhcm1lZCwgc28gdGhleSBjYW4gc2ltcGx5IHRyeSBhZ2Fpbi5cbiAgICovXG4gIHByaXZhdGUgcmF5Y2FzdE1vZGVsKGV2ZW50OiBNb3VzZUV2ZW50KTogVEhSRUUuSW50ZXJzZWN0aW9uIHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLm1vZGVsUm9vdCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgcmVjdCA9IHRoaXMucmVuZGVyZXIuZG9tRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICB0aGlzLm1vdXNlLnggPSAoKGV2ZW50LmNsaWVudFggLSByZWN0LmxlZnQpIC8gcmVjdC53aWR0aCkgKiAyIC0gMTtcbiAgICB0aGlzLm1vdXNlLnkgPSAtKChldmVudC5jbGllbnRZIC0gcmVjdC50b3ApIC8gcmVjdC5oZWlnaHQpICogMiArIDE7XG4gICAgdGhpcy5yYXljYXN0ZXIuc2V0RnJvbUNhbWVyYSh0aGlzLm1vdXNlLCB0aGlzLmNhbWVyYSk7XG5cbiAgICByZXR1cm4gdGhpcy5yYXljYXN0ZXIuaW50ZXJzZWN0T2JqZWN0KHRoaXMubW9kZWxSb290LCB0cnVlKVswXSA/PyBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFR1cm5zIGEgY2xpY2sgaW50byBhIHBvaW50IG9uIHRoZSBtb2RlbCwgaW4gdGhlIGZyYW1lIHRhZyBjb29yZGluYXRlcyBhcmUgcGVyc2lzdGVkIGluLlxuICAgKlxuICAgKiBUaGF0IGZyYW1lIGlzIHRoZSB0YWcgZ3JvdXAncywgbm90IHRoZSBtb2RlbCdzLiBBIHN0b3JlZCBjb29yZGluYXRlIGlzIHJlYWQgYmFjayBhcyBhIHNwcml0ZVxuICAgKiBwb3NpdGlvbiBpbnNpZGUgdGhhdCBncm91cCwgc28gYSBjb29yZGluYXRlIGNhcHR1cmVkIGluIGFueSBvdGhlciBmcmFtZSBjb21lcyBiYWNrIGRpc3BsYWNlZCBieVxuICAgKiBleGFjdGx5IGhvd2V2ZXIgZmFyIHRoZSBhbGlnbm1lbnQgbW92ZXMgdGhlIGdyb3VwLiBUaGUgdHdvIGZyYW1lcyBhZ3JlZSBvbmx5IHdoaWxlIHRoZVxuICAgKiBhbGlnbm1lbnQgaXMgaWRlbnRpdHksIHdoaWNoIGlzIHdoeSB0aGlzIHN0YXllZCBpbnZpc2libGUgdW50aWwgYSBtb2RlbCB3YXMgY2FsaWJyYXRlZC5cbiAgICovXG4gIHByaXZhdGUgcGlja1BsYWNlbWVudE9uTW9kZWwoZXZlbnQ6IE1vdXNlRXZlbnQpOiBUaHJlZUpzVGFnUGxhY2VtZW50IHwgbnVsbCB7XG4gICAgY29uc3QgaGl0ID0gdGhpcy5yYXljYXN0TW9kZWwoZXZlbnQpO1xuICAgIGlmICghaGl0KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB0aGlzLnRhZ0dyb3VwLnVwZGF0ZVdvcmxkTWF0cml4KHRydWUsIGZhbHNlKTtcbiAgICBjb25zdCBwb3NpdGlvbiA9IHRoaXMudGFnR3JvdXAud29ybGRUb0xvY2FsKGhpdC5wb2ludC5jbG9uZSgpKTtcblxuICAgIC8vIEEgZmFjZSBub3JtYWwgaXMgaW4gdGhlIGdlb21ldHJ5J3MgbG9jYWwgc3BhY2UgYWxyZWFkeSwgYnV0IHRoZSBtZXNoIGl0IGJlbG9uZ3MgdG8gbWF5IHNpdFxuICAgIC8vIHVuZGVyIHRyYW5zZm9ybXMgb2YgaXRzIG93biwgc28gdGFrZSBpdCBvdXQgdGhyb3VnaCB0aG9zZSBhbmQgYmFjayBpbnRvIHRoZSB0YWcgZnJhbWUsIHNvIGl0XG4gICAgLy8gZGVzY3JpYmVzIHRoZSBzYW1lIG9yaWVudGF0aW9uIHRoZSBwb3NpdGlvbiBkb2VzLlxuICAgIGxldCBub3JtYWwgPSBuZXcgVEhSRUUuVmVjdG9yMygwLCAxLCAwKTtcbiAgICBpZiAoaGl0LmZhY2UpIHtcbiAgICAgIG5vcm1hbCA9IGhpdC5mYWNlLm5vcm1hbFxuICAgICAgICAuY2xvbmUoKVxuICAgICAgICAudHJhbnNmb3JtRGlyZWN0aW9uKGhpdC5vYmplY3QubWF0cml4V29ybGQpXG4gICAgICAgIC50cmFuc2Zvcm1EaXJlY3Rpb24obmV3IFRIUkVFLk1hdHJpeDQoKS5jb3B5KHRoaXMudGFnR3JvdXAubWF0cml4V29ybGQpLmludmVydCgpKVxuICAgICAgICAubm9ybWFsaXplKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHBvc2l0aW9uOiB7IHg6IHBvc2l0aW9uLngsIHk6IHBvc2l0aW9uLnksIHo6IHBvc2l0aW9uLnogfSxcbiAgICAgIG5vcm1hbDogeyB4OiBub3JtYWwueCwgeTogbm9ybWFsLnksIHo6IG5vcm1hbC56IH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGVyZSB0aGUgdXNlciBzYXlzIGEgdGFnIHJlYWxseSBiZWxvbmdzLCBpbiB0aGUgc3BhY2UgdGhlIHNvbHZlZCBhbGlnbm1lbnQgbWFwcyBvbnRvLlxuICAgKlxuICAgKiBzZXRUYWdBbGlnbm1lbnQgd3JpdGVzIHRoZSBzb2x1dGlvbiB0byB0aGUgdGFnIGdyb3VwJ3Mgb3duIHRyYW5zZm9ybSwgd2hpY2ggaXMgZXhwcmVzc2VkXG4gICAqIHJlbGF0aXZlIHRvIGl0cyBwYXJlbnQgLSBzbyB0aGUgdGFyZ2V0IGhhcyB0byBiZSBpbiB0aGUgcGFyZW50J3MgZnJhbWUuIE1lYXN1cmluZyBpdCBpbiB0aGVcbiAgICogZ3JvdXAncyBvd24gZnJhbWUgaW5zdGVhZCB3b3VsZCBmb2xkIHRoZSBjdXJyZW50IGFsaWdubWVudCBpbnRvIHRoZSBhbnN3ZXIsIG1ha2luZyBlYWNoXG4gICAqIGNhbGlicmF0aW9uIGRlcGVuZCBvbiB0aGUgb25lIGJlZm9yZSBpdC5cbiAgICovXG4gIHByaXZhdGUgcGlja0FsaWdubWVudFRhcmdldChldmVudDogTW91c2VFdmVudCk6IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHo6IG51bWJlciB9IHwgbnVsbCB7XG4gICAgY29uc3QgaGl0ID0gdGhpcy5yYXljYXN0TW9kZWwoZXZlbnQpO1xuICAgIGlmICghaGl0KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgZnJhbWUgPSB0aGlzLnRhZ0dyb3VwLnBhcmVudCA/PyB0aGlzLnNjZW5lO1xuICAgIGZyYW1lLnVwZGF0ZVdvcmxkTWF0cml4KHRydWUsIGZhbHNlKTtcbiAgICBjb25zdCBwb2ludCA9IGZyYW1lLndvcmxkVG9Mb2NhbChoaXQucG9pbnQuY2xvbmUoKSk7XG4gICAgcmV0dXJuIHsgeDogcG9pbnQueCwgeTogcG9pbnQueSwgejogcG9pbnQueiB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHRyYW5zZm9ybSBtYXBwaW5nIGNhcHR1cmVkIHRhZyBjb29yZGluYXRlcyBvbnRvIHRoaXMgbW9kZWwncyBzcGFjZS5cbiAgICpcbiAgICogRXZlcnkgdGFnIGNvbWVzIGZyb20gdGhlIHNhbWUgc291cmNlIHNwYWNlLCBzbyB0aGlzIGlzIG9uZSB0cmFuc2Zvcm0gb24gdGhlIGdyb3VwIHJhdGhlciB0aGFuXG4gICAqIHBlci10YWcgbWF0aHMgLSB3aGljaCBhbHNvIG1lYW5zIGl0IGFwcGxpZXMgcmV0cm9hY3RpdmVseSB0byB0YWdzIGFscmVhZHkgcGxhY2VkLCBhbmQgY2FuIGJlXG4gICAqIGFkanVzdGVkIGxpdmUgd2hpbGUgc29tZW9uZSBkaWFscyB0aGUgbnVtYmVycyBpbi5cbiAgICpcbiAgICogUGFzc2luZyBudWxsIHJlc2V0cyB0byBpZGVudGl0eSwgaS5lLiB0YWcgY29vcmRpbmF0ZXMgYXJlIGFscmVhZHkgaW4gbW9kZWwgc3BhY2UuXG4gICAqL1xuICBzZXRUYWdBbGlnbm1lbnQoYWxpZ25tZW50OiBUaHJlZUpzQWxpZ25tZW50IHwgbnVsbCk6IHZvaWQge1xuICAgIGNvbnN0IHsgdHJhbnNsYXRpb24sIHJvdGF0aW9uLCBzY2FsZSB9ID0gYWxpZ25tZW50ID8/IHt9O1xuICAgIHRoaXMudGFnR3JvdXAucG9zaXRpb24uc2V0KHRyYW5zbGF0aW9uPy54ID8/IDAsIHRyYW5zbGF0aW9uPy55ID8/IDAsIHRyYW5zbGF0aW9uPy56ID8/IDApO1xuICAgIHRoaXMudGFnR3JvdXAucm90YXRpb24uc2V0KHJvdGF0aW9uPy54ID8/IDAsIHJvdGF0aW9uPy55ID8/IDAsIHJvdGF0aW9uPy56ID8/IDApO1xuICAgIHRoaXMudGFnR3JvdXAuc2NhbGUuc2V0U2NhbGFyKHNjYWxlID8/IDEpO1xuICAgIHRoaXMudGFnR3JvdXAudXBkYXRlTWF0cml4KCk7XG5cbiAgICAvLyBNYXJrZXIgc2l6ZXMgYXJlIHdvcmtlZCBiYWNrIGZyb20gdGhlIHNjYWxlIHRoZXkgaW5oZXJpdCwgd2hpY2ggdGhpcyBjYWxsIGp1c3QgY2hhbmdlZCAtIGFuZFxuICAgIC8vIHNvIGlzIHdoaWNoIHRhZ3MgbGFuZCBvbiB0aGUgbW9kZWwuXG4gICAgdGhpcy5yZWZyZXNoU2NyZWVuU2l6ZXMoKTtcbiAgICB0aGlzLnJlZnJlc2hUYWdWaXNpYmlsaXR5KCk7XG4gICAgdGhpcy5hbm5vdW5jZVRhZ3NDaGFuZ2VkKCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHRhZywgb3IgbW92ZXMvcmVzdHlsZXMgdGhlIG9uZSBhbHJlYWR5IHJlZ2lzdGVyZWQgZm9yIHRoaXMgZWxlbWVudC5cbiAgICpcbiAgICogVXBzZXJ0IHJhdGhlciB0aGFuIGEgZGVjbGFyYXRpdmUgXCJoZXJlIGlzIHRoZSBmdWxsIGxpc3RcIiBjYWxsLCBiZWNhdXNlIHRhZ3MgYXJyaXZlIHBlciB0eXBlXG4gICAqIChlcXVpcG1lbnQsIHRoZW4gdGlja2V0cywgdGhlbiBtZWFzdXJlbWVudHMuLi4pIGZyb20gc2VwYXJhdGUgc3Vic2NyaXB0aW9ucyAtIHJlcGxhY2luZyB0aGUgc2V0XG4gICAqIG9uIGVhY2ggb2YgdGhvc2Ugd291bGQgd2lwZSB0aGUgdHlwZXMgdGhhdCBjYW1lIGJlZm9yZS5cbiAgICovXG4gIHVwc2VydFRhZyh0YWc6IFRocmVlSnNUYWcpOiB2b2lkIHtcbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMudGFnU3ByaXRlcy5nZXQodGFnLmlkKTtcbiAgICBpZiAoZXhpc3RpbmcpIHtcbiAgICAgIGV4aXN0aW5nLnBvc2l0aW9uLnNldCh0YWcucG9zaXRpb24ueCwgdGFnLnBvc2l0aW9uLnksIHRhZy5wb3NpdGlvbi56KTtcbiAgICAgIGV4aXN0aW5nLnVzZXJEYXRhLnBvaVR5cGUgPSB0YWcucG9pVHlwZSA/PyBleGlzdGluZy51c2VyRGF0YS5wb2lUeXBlO1xuICAgICAgZXhpc3RpbmcudXNlckRhdGEubGFiZWwgPSB0YWcubGFiZWwgPz8gZXhpc3RpbmcudXNlckRhdGEubGFiZWw7XG4gICAgICBleGlzdGluZy51c2VyRGF0YS5vcmlnaW5DYXB0dXJlSUQgPSB0YWcub3JpZ2luQ2FwdHVyZUlEID8/IGV4aXN0aW5nLnVzZXJEYXRhLm9yaWdpbkNhcHR1cmVJRDtcbiAgICAgIGV4aXN0aW5nLnVzZXJEYXRhLmZyYW1lID0gdGFnLmZyYW1lID8/IGV4aXN0aW5nLnVzZXJEYXRhLmZyYW1lO1xuICAgICAgZXhpc3RpbmcudXNlckRhdGEuaWNvblVybCA9IHRhZy5pY29uVXJsID8/IGV4aXN0aW5nLnVzZXJEYXRhLmljb25Vcmw7XG4gICAgICBleGlzdGluZy51c2VyRGF0YS5ub3JtYWwgPSB0YWcubm9ybWFsID8/IGV4aXN0aW5nLnVzZXJEYXRhLm5vcm1hbDtcbiAgICAgIHRoaXMucGFyZW50VGFnKGV4aXN0aW5nKTtcbiAgICAgIHRoaXMuYXBwbHlUYWdWaXNpYmlsaXR5KGV4aXN0aW5nKTtcbiAgICAgIHRoaXMuYW5ub3VuY2VUYWdzQ2hhbmdlZCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHNwcml0ZSA9IG5ldyBUSFJFRS5TcHJpdGUoXG4gICAgICBuZXcgVEhSRUUuU3ByaXRlTWF0ZXJpYWwoe1xuICAgICAgICBtYXA6IHRoaXMuY3JlYXRlVGFnVGV4dHVyZSh0YWcuY29sb3IpLFxuICAgICAgICAvLyBUYWdzIHJlYWQgYXMgVUkgcmF0aGVyIHRoYW4gZ2VvbWV0cnksIHNvIHRoZXkgc3RheSB2aXNpYmxlIHRocm91Z2ggdGhlIG1vZGVsIGluc3RlYWQgb2ZcbiAgICAgICAgLy8gYmVpbmcgb2NjbHVkZWQgYnkgd2hhdGV2ZXIgd2FsbCBoYXBwZW5zIHRvIGJlIGJldHdlZW4gdGhlbSBhbmQgdGhlIGNhbWVyYSAtIGFuZCwgZm9yXG4gICAgICAgIC8vIHRoZSBzYW1lIHJlYXNvbiwga2VlcCBvbmUgc2l6ZSBvbiBzY3JlZW4gcmF0aGVyIHRoYW4gYSBzaXplIGluIHRoZSBtb2RlbC5cbiAgICAgICAgZGVwdGhUZXN0OiBmYWxzZSxcbiAgICAgICAgdHJhbnNwYXJlbnQ6IHRydWUsXG4gICAgICAgIHNpemVBdHRlbnVhdGlvbjogZmFsc2UsXG4gICAgICB9KVxuICAgICk7XG4gICAgc3ByaXRlLm5hbWUgPSB0YWcuaWQ7XG4gICAgc3ByaXRlLnVzZXJEYXRhLnBvaVR5cGUgPSB0YWcucG9pVHlwZSA/PyBudWxsO1xuICAgIHNwcml0ZS51c2VyRGF0YS5sYWJlbCA9IHRhZy5sYWJlbCA/PyBudWxsO1xuICAgIHNwcml0ZS51c2VyRGF0YS5vcmlnaW5DYXB0dXJlSUQgPSB0YWcub3JpZ2luQ2FwdHVyZUlEID8/IG51bGw7XG4gICAgc3ByaXRlLnVzZXJEYXRhLmZyYW1lID0gdGFnLmZyYW1lID8/IG51bGw7XG4gICAgc3ByaXRlLnVzZXJEYXRhLmljb25VcmwgPSB0YWcuaWNvblVybCA/PyBudWxsO1xuICAgIHNwcml0ZS51c2VyRGF0YS5ub3JtYWwgPSB0YWcubm9ybWFsID8/IG51bGw7XG4gICAgc3ByaXRlLnBvc2l0aW9uLnNldCh0YWcucG9zaXRpb24ueCwgdGFnLnBvc2l0aW9uLnksIHRhZy5wb3NpdGlvbi56KTtcbiAgICBzcHJpdGUucmVuZGVyT3JkZXIgPSA5OTk7XG4gICAgdGhpcy5wYXJlbnRUYWcoc3ByaXRlKTtcbiAgICB0aGlzLnNjYWxlVGFnRm9yTW9kZWwoc3ByaXRlKTtcbiAgICB0aGlzLmFwcGx5VGFnVmlzaWJpbGl0eShzcHJpdGUpO1xuXG4gICAgdGhpcy50YWdTcHJpdGVzLnNldCh0YWcuaWQsIHNwcml0ZSk7XG5cbiAgICBpZiAodGFnLmljb25VcmwpIHtcbiAgICAgIHRoaXMuYXBwbHlUYWdJY29uKHNwcml0ZSwgdGFnLmljb25VcmwpO1xuICAgIH1cbiAgICB0aGlzLmFubm91bmNlVGFnc0NoYW5nZWQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdGFncyBhbm90aGVyIHZpZXdlciBzaG91bGQgc2hvdywgYW5kIHRoZSBjYWxpYnJhdGlvbiB0aGV5IGFyZSBkcmF3biB1bmRlci5cbiAgICpcbiAgICogVGhlIHNhbWUgb25lcyB0aGlzIHNjZW5lIHdvdWxkIG9mZmVyLCBzaG9ydCBvZiB0aGUgdGVzdCBhZ2FpbnN0IHRoZSBtb2RlbCdzIHN1cmZhY2UsIHdoaWNoIG5lZWRzXG4gICAqIHRoZSBtb2RlbCBoZXJlOiB0aGUgdHlwZSBmaWx0ZXIgYXBwbGllcywgYW5kIGEgdGFnIHBsYWNlZCBpbiBhbm90aGVyIG1vZGVsIGJlZm9yZSBpdCB3YXNcbiAgICogY2FsaWJyYXRlZCBpcyBsZWZ0IG91dCwgaXRzIGNvb3JkaW5hdGVzIG1lYW5pbmcgbm90aGluZyBpbiB0aGlzIG9uZS5cbiAgICovXG4gIGdldFRhZ1NuYXBzaG90KCk6IHsgdGFnczogVGhyZWVKc1RhZ1NuYXBzaG90W107IGFsaWdubWVudDogVGhyZWVKc0FsaWdubWVudCB9IHtcbiAgICBjb25zdCB0YWdzOiBUaHJlZUpzVGFnU25hcHNob3RbXSA9IFtdO1xuICAgIHRoaXMudGFnU3ByaXRlcy5mb3JFYWNoKChzcHJpdGUpID0+IHtcbiAgICAgIGNvbnN0IG93bmVkID0gdGhpcy5pc093bmVkQnlWaXNpdChzcHJpdGUpO1xuICAgICAgY29uc3QgdHlwZUFsbG93ZWQgPSB0aGlzLnZpc2libGVUYWdUeXBlcyA9PT0gbnVsbCB8fCB0aGlzLnZpc2libGVUYWdUeXBlcy5pbmNsdWRlcyhzcHJpdGUudXNlckRhdGEucG9pVHlwZSk7XG4gICAgICBpZiAoIXR5cGVBbGxvd2VkIHx8IChzcHJpdGUudXNlckRhdGEuZnJhbWUgPT09ICdtb2RlbCcgJiYgIW93bmVkKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0YWdzLnB1c2goe1xuICAgICAgICBpZDogc3ByaXRlLm5hbWUsXG4gICAgICAgIHBvc2l0aW9uOiB7IHg6IHNwcml0ZS5wb3NpdGlvbi54LCB5OiBzcHJpdGUucG9zaXRpb24ueSwgejogc3ByaXRlLnBvc2l0aW9uLnogfSxcbiAgICAgICAgbGFiZWw6IHNwcml0ZS51c2VyRGF0YS5sYWJlbCA/PyBudWxsLFxuICAgICAgICBwb2lUeXBlOiBzcHJpdGUudXNlckRhdGEucG9pVHlwZSA/PyBudWxsLFxuICAgICAgICBpY29uVXJsOiBzcHJpdGUudXNlckRhdGEuaWNvblVybCA/PyBudWxsLFxuICAgICAgICBpbk1vZGVsRnJhbWU6IHNwcml0ZS51c2VyRGF0YS5mcmFtZSA9PT0gJ21vZGVsJyAmJiBvd25lZCxcbiAgICAgICAgbm9ybWFsOiBzcHJpdGUudXNlckRhdGEubm9ybWFsID8/IG51bGwsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBjb25zdCBncm91cCA9IHRoaXMudGFnR3JvdXA7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRhZ3MsXG4gICAgICBhbGlnbm1lbnQ6IHtcbiAgICAgICAgdHJhbnNsYXRpb246IHsgeDogZ3JvdXAucG9zaXRpb24ueCwgeTogZ3JvdXAucG9zaXRpb24ueSwgejogZ3JvdXAucG9zaXRpb24ueiB9LFxuICAgICAgICByb3RhdGlvbjogeyB4OiBncm91cC5yb3RhdGlvbi54LCB5OiBncm91cC5yb3RhdGlvbi55LCB6OiBncm91cC5yb3RhdGlvbi56IH0sXG4gICAgICAgIHNjYWxlOiBncm91cC5zY2FsZS54LFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhbm5vdW5jZVRhZ3NDaGFuZ2VkKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnRhZ3NDaGFuZ2VRdWV1ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy50YWdzQ2hhbmdlUXVldWVkID0gdHJ1ZTtcbiAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICB0aGlzLnRhZ3NDaGFuZ2VRdWV1ZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMudGFnc0NoYW5nZWQkLm5leHQoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBSZW1vdmVzIHRoZSB0YWcgcmVnaXN0ZXJlZCBmb3IgYW4gZWxlbWVudCwgaWYgdGhlcmUgaXMgb25lLiAqL1xuICByZW1vdmVUYWcoZWxlbWVudElkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBzcHJpdGUgPSB0aGlzLnRhZ1Nwcml0ZXMuZ2V0KGVsZW1lbnRJZCk7XG4gICAgaWYgKCFzcHJpdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc3ByaXRlLnBhcmVudD8ucmVtb3ZlKHNwcml0ZSk7XG4gICAgc3ByaXRlLm1hdGVyaWFsLm1hcD8uZGlzcG9zZSgpO1xuICAgIHNwcml0ZS5tYXRlcmlhbC5kaXNwb3NlKCk7XG4gICAgdGhpcy50YWdTcHJpdGVzLmRlbGV0ZShlbGVtZW50SWQpO1xuICAgIHRoaXMuYW5ub3VuY2VUYWdzQ2hhbmdlZCgpO1xuICB9XG5cbiAgLyoqIFJlbW92ZXMgZXZlcnkgdGFnIGZyb20gdGhlIHNjZW5lLiAqL1xuICBjbGVhclRhZ3MoKTogdm9pZCB7XG4gICAgWy4uLnRoaXMudGFnU3ByaXRlcy5rZXlzKCldLmZvckVhY2goKGlkKSA9PiB0aGlzLnJlbW92ZVRhZyhpZCkpO1xuICB9XG5cbiAgLyoqIExvYWRzIGFuIGljb24gaW50byBhbiBleGlzdGluZyB0YWcsIGxlYXZpbmcgdGhlIGZhbGxiYWNrIGRpc2MgaW4gcGxhY2UgaWYgaXQgZmFpbHMuICovXG4gIHByaXZhdGUgYXBwbHlUYWdJY29uKHNwcml0ZTogVEhSRUUuU3ByaXRlLCBpY29uVXJsOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBuZXcgVEhSRUUuVGV4dHVyZUxvYWRlcigpLmxvYWQoXG4gICAgICBpY29uVXJsLFxuICAgICAgKHRleHR1cmUpID0+IHtcbiAgICAgICAgc3ByaXRlLm1hdGVyaWFsLm1hcD8uZGlzcG9zZSgpO1xuICAgICAgICBzcHJpdGUubWF0ZXJpYWwubWFwID0gdGV4dHVyZTtcbiAgICAgICAgc3ByaXRlLm1hdGVyaWFsLm5lZWRzVXBkYXRlID0gdHJ1ZTtcbiAgICAgIH0sXG4gICAgICB1bmRlZmluZWQsXG4gICAgICAoKSA9PiBjb25zb2xlLndhcm4oYFRocmVlSnNTZXJ2aWNlOiBjb3VsZCBub3QgbG9hZCB0YWcgaWNvbiBcIiR7aWNvblVybH1cIiwga2VlcGluZyB0aGUgZGVmYXVsdCBtYXJrZXIuYClcbiAgICApO1xuICB9XG5cbiAgLyoqIERyYXdzIHRoZSBkZWZhdWx0IHRhZyBtYXJrZXI6IGEgZmlsbGVkIGRpc2Mgd2l0aCBhIHdoaXRlIHJpbmcsIHNvIGl0IHJlYWRzIG9uIGFueSBiYWNrZ3JvdW5kLiAqL1xuICBwcml2YXRlIGNyZWF0ZVRhZ1RleHR1cmUoY29sb3IgPSAnIzFFODhFNScpOiBUSFJFRS5DYW52YXNUZXh0dXJlIHtcbiAgICBjb25zdCBzaXplID0gMTI4O1xuICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgIGNhbnZhcy53aWR0aCA9IHNpemU7XG4gICAgY2FudmFzLmhlaWdodCA9IHNpemU7XG4gICAgY29uc3QgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuXG4gICAgY29udGV4dC5iZWdpblBhdGgoKTtcbiAgICBjb250ZXh0LmFyYyhzaXplIC8gMiwgc2l6ZSAvIDIsIHNpemUgLyAyIC0gOCwgMCwgTWF0aC5QSSAqIDIpO1xuICAgIGNvbnRleHQuZmlsbFN0eWxlID0gY29sb3I7XG4gICAgY29udGV4dC5maWxsKCk7XG4gICAgY29udGV4dC5saW5lV2lkdGggPSA4O1xuICAgIGNvbnRleHQuc3Ryb2tlU3R5bGUgPSAnI0ZGRkZGRic7XG4gICAgY29udGV4dC5zdHJva2UoKTtcblxuICAgIHJldHVybiBuZXcgVEhSRUUuQ2FudmFzVGV4dHVyZShjYW52YXMpO1xuICB9XG5cbiAgLyoqIFRoZSBkZWZhdWx0IG1hcmtlciB3aXRoIGEgbnVtYmVyIG9uIGl0OiB0aGUgbnRoIHBvaW50IG9mIGEgY2FsaWJyYXRpb24uICovXG4gIHByaXZhdGUgY3JlYXRlTnVtYmVyZWRUZXh0dXJlKG51bWJlcjogbnVtYmVyLCBjb2xvcjogc3RyaW5nKTogVEhSRUUuQ2FudmFzVGV4dHVyZSB7XG4gICAgY29uc3QgdGV4dHVyZSA9IHRoaXMuY3JlYXRlVGFnVGV4dHVyZShjb2xvcik7XG4gICAgY29uc3QgY2FudmFzID0gdGV4dHVyZS5pbWFnZSBhcyBIVE1MQ2FudmFzRWxlbWVudDtcbiAgICBjb25zdCBjb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgY29udGV4dC5maWxsU3R5bGUgPSAnI0ZGRkZGRic7XG4gICAgY29udGV4dC5mb250ID0gJ2JvbGQgNzZweCBzYW5zLXNlcmlmJztcbiAgICBjb250ZXh0LnRleHRBbGlnbiA9ICdjZW50ZXInO1xuICAgIGNvbnRleHQudGV4dEJhc2VsaW5lID0gJ21pZGRsZSc7XG4gICAgY29udGV4dC5maWxsVGV4dChTdHJpbmcobnVtYmVyKSwgY2FudmFzLndpZHRoIC8gMiwgY2FudmFzLmhlaWdodCAvIDIgKyA1KTtcbiAgICByZXR1cm4gdGV4dHVyZTtcbiAgfVxuXG4gIC8qKiBBIHJpbmcgd2l0aCBub3RoaW5nIGluIHRoZSBtaWRkbGUsIHRvIGdvIHJvdW5kIGEgdGFnIGFuZCBsZWF2ZSBpdCBzaG93aW5nLiAqL1xuICBwcml2YXRlIGNyZWF0ZVJpbmdUZXh0dXJlKGNvbG9yOiBzdHJpbmcpOiBUSFJFRS5DYW52YXNUZXh0dXJlIHtcbiAgICBjb25zdCBzaXplID0gMTI4O1xuICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgIGNhbnZhcy53aWR0aCA9IHNpemU7XG4gICAgY2FudmFzLmhlaWdodCA9IHNpemU7XG4gICAgY29uc3QgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuXG4gICAgLy8gV2hpdGUgdW5kZXIgdGhlIGNvbG91ciwgYSBsaXR0bGUgd2lkZXIsIGZvciB0aGUgc2FtZSByZWFzb24gdGhlIHRhZ3MgaGF2ZSBhIHdoaXRlIGVkZ2UuXG4gICAgY29udGV4dC5iZWdpblBhdGgoKTtcbiAgICBjb250ZXh0LmFyYyhzaXplIC8gMiwgc2l6ZSAvIDIsIHNpemUgLyAyIC0gMTAsIDAsIE1hdGguUEkgKiAyKTtcbiAgICBjb250ZXh0LmxpbmVXaWR0aCA9IDE2O1xuICAgIGNvbnRleHQuc3Ryb2tlU3R5bGUgPSAnI0ZGRkZGRic7XG4gICAgY29udGV4dC5zdHJva2UoKTtcbiAgICBjb250ZXh0LmxpbmVXaWR0aCA9IDEwO1xuICAgIGNvbnRleHQuc3Ryb2tlU3R5bGUgPSBjb2xvcjtcbiAgICBjb250ZXh0LnN0cm9rZSgpO1xuXG4gICAgcmV0dXJuIG5ldyBUSFJFRS5DYW52YXNUZXh0dXJlKGNhbnZhcyk7XG4gIH1cblxuICAvKipcbiAgICogR2l2ZXMgYSB0YWcgaXRzIHNpemU6IHRoZSBzYW1lIG51bWJlciBvZiBwaXhlbHMgb24gc2NyZWVuIHdoYXRldmVyIHRoZSBtb2RlbC5cbiAgICpcbiAgICogSXQgdXNlZCB0byBiZSBhIGZpeGVkIGZyYWN0aW9uIG9mIHRoZSBtb2RlbCBpbnN0ZWFkLiBUaGF0IHJlYWRzIGZpbmUgb24gYSByb29tLCBidXQgb24gYSBtb2RlbFxuICAgKiB0aGUgc2l6ZSBvZiBhIGNpdHkgYmxvY2sgaXQgaXMgYSB0YWcgc2V2ZXJhbCBtZXRyZXMgYWNyb3NzLCB3aGljaCBmaWxscyB0aGUgdmlldyBhcyBzb29uIGFzXG4gICAqIHRoZSBjYW1lcmEgbW92ZXMgaW4gdG8gbG9vayBhdCBhbnl0aGluZy5cbiAgICovXG4gIHByaXZhdGUgc2NhbGVUYWdGb3JNb2RlbChzcHJpdGU6IFRIUkVFLlNwcml0ZSk6IHZvaWQge1xuICAgIHRoaXMuc2V0U2NyZWVuU2l6ZShzcHJpdGUsIFRocmVlSnNTZXJ2aWNlLlRBR19TQ1JFRU5fUFgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpeGVzIGEgc3ByaXRlJ3Mgc2l6ZSBvbiBzY3JlZW4sIGluIENTUyBwaXhlbHMuXG4gICAqXG4gICAqIFRoZSBzcHJpdGUgbXVzdCBiZSBkcmF3biB3aXRob3V0IHNpemUgYXR0ZW51YXRpb24sIHdoaWNoIG1ha2VzIGl0cyBzaXplIGEgcHJvcG9ydGlvbiBvZiB0aGVcbiAgICogdmlld3BvcnQgaW5zdGVhZCBvZiBzb21ldGhpbmcgdGhhdCBzaHJpbmtzIHdpdGggZGlzdGFuY2UuIEl0cyBzY2FsZSBpcyB0aGVuIHdvcmtlZCBiYWNrIGZyb21cbiAgICogdGhlIHBpeGVscyB3YW50ZWQsIHRoZSB2aWV3cG9ydCdzIGhlaWdodCBhbmQgdGhlIHNjYWxlIGl0IGluaGVyaXRzIGZyb20gaXRzIHBhcmVudHMgLSB0aGVcbiAgICogbW9kZWwncyBub3JtYWxpc2F0aW9uIGFuZCwgZm9yIHRhZ3MsIHRoZSBjYWxpYnJhdGlvbiAtIHNvIG5vbmUgb2YgdGhvc2Ugc2hvdyBpbiB0aGUgcmVzdWx0LlxuICAgKiBUaGUgc2l6ZSBhc2tlZCBmb3IgaXMga2VwdCBvbiB0aGUgc3ByaXRlLCBzbyBpdCBjYW4gYmUgd29ya2VkIG91dCBhZ2FpbiB3aGVuIGFueSBvZiB0aGVtIGNoYW5nZXMuXG4gICAqL1xuICBwcml2YXRlIHNldFNjcmVlblNpemUoc3ByaXRlOiBUSFJFRS5TcHJpdGUsIHdpZHRoUHg6IG51bWJlciwgaGVpZ2h0UHg6IG51bWJlciA9IHdpZHRoUHgpOiB2b2lkIHtcbiAgICBzcHJpdGUudXNlckRhdGEuc2NyZWVuU2l6ZSA9IFt3aWR0aFB4LCBoZWlnaHRQeF07XG4gICAgY29uc3QgaW5oZXJpdGVkID0gKHNwcml0ZS5wYXJlbnQgPz8gdGhpcy50YWdHcm91cCkuZ2V0V29ybGRTY2FsZShuZXcgVEhSRUUuVmVjdG9yMygpKS54IHx8IDE7XG4gICAgY29uc3QgcGVyUGl4ZWwgPSB0aGlzLndvcmxkVW5pdHNQZXJQaXhlbCgpIC8gaW5oZXJpdGVkO1xuICAgIHNwcml0ZS5zY2FsZS5zZXQod2lkdGhQeCAqIHBlclBpeGVsLCBoZWlnaHRQeCAqIHBlclBpeGVsLCAxKTtcbiAgfVxuXG4gIC8qKiBXaGF0IG9uZSBzY3JlZW4gcGl4ZWwgaXMgd29ydGggaW4gdGhlIHNjYWxlIG9mIGEgc3ByaXRlIGRyYXduIHdpdGhvdXQgc2l6ZSBhdHRlbnVhdGlvbi4gKi9cbiAgcHJpdmF0ZSB3b3JsZFVuaXRzUGVyUGl4ZWwoKTogbnVtYmVyIHtcbiAgICBjb25zdCBoZWlnaHQgPSB0aGlzLnJlbmRlcmVyPy5nZXRTaXplPy4obmV3IFRIUkVFLlZlY3RvcjIoKSkueSB8fCA4MDA7XG4gICAgY29uc3QgZmllbGRPZlZpZXcgPSBUSFJFRS5NYXRoVXRpbHMuZGVnVG9SYWQodGhpcy5jYW1lcmE/LmZvdiA/PyA3NSk7XG4gICAgcmV0dXJuICgyICogTWF0aC50YW4oZmllbGRPZlZpZXcgLyAyKSkgLyBoZWlnaHQ7XG4gIH1cblxuICAvKiogUmUtYXBwbGllcyBldmVyeSBtYXJrZXIncyBvbi1zY3JlZW4gc2l6ZTogdGhlIHZpZXdwb3J0LCB0aGUgbW9kZWwgb3IgdGhlIGNhbGlicmF0aW9uIGNoYW5nZWQuICovXG4gIHByaXZhdGUgcmVmcmVzaFNjcmVlblNpemVzKCk6IHZvaWQge1xuICAgIGNvbnN0IHJlc2l6ZSA9IChvYmplY3Q6IGFueSkgPT4ge1xuICAgICAgaWYgKG9iamVjdD8udXNlckRhdGE/LnNjcmVlblNpemUpIHtcbiAgICAgICAgdGhpcy5zZXRTY3JlZW5TaXplKG9iamVjdCwgb2JqZWN0LnVzZXJEYXRhLnNjcmVlblNpemVbMF0sIG9iamVjdC51c2VyRGF0YS5zY3JlZW5TaXplWzFdKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHRoaXMudGFnU3ByaXRlcy5mb3JFYWNoKHJlc2l6ZSk7XG4gICAgdGhpcy5tZWFzdXJlR3JvdXAuY2hpbGRyZW4uZm9yRWFjaChyZXNpemUpO1xuICAgIHRoaXMuY2FsaWJyYXRpb25Hcm91cC5jaGlsZHJlbi5mb3JFYWNoKHJlc2l6ZSk7XG4gICAgcmVzaXplKHRoaXMucGxhY2VtZW50UHJldmlldyk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBzZWNvbmRhcnkgaW50ZXJhY3RpdmUgb2JqZWN0cyAoZS5nLiwgUE9Jcywgc2Vuc29ycykgdG8gdGhlIHNjZW5lLlxuICAgKi9cbiAgdXBkYXRlT2Jqc1RvU2NlbmUob2Jqc0FkZGVkOiBPYmpBZGRlZFtdKTogdm9pZCB7XG4gICAgY29uc3QgZXhpc3RpbmdJZHMgPSB0aGlzLmNsaWNrYWJsZU9iamVjdHMubWFwKChvYmopID0+IG9iai5uYW1lKTtcbiAgICBjb25zdCBvYmpMb2FkZXIgPSBuZXcgT0JKTG9hZGVyKCk7XG5cbiAgICAvLyBkZWxldGUgb2JqZWN0cyB0aGF0IGFyZSBub3QgaW4gdGhlIHByb3ZpZGVkIGFycmF5XG4gICAgdGhpcy5jbGlja2FibGVPYmplY3RzLmZvckVhY2goKG9iaikgPT4ge1xuICAgICAgaWYgKCFvYmpzQWRkZWQuZmluZCgob2JqRGF0YSkgPT4gb2JqRGF0YS5pZCA9PT0gb2JqLm5hbWUpKSB7XG4gICAgICAgIHRoaXMuc2NlbmUucmVtb3ZlKG9iaik7XG4gICAgICAgIHRoaXMuY2xpY2thYmxlT2JqZWN0cyA9IHRoaXMuY2xpY2thYmxlT2JqZWN0cy5maWx0ZXIoXG4gICAgICAgICAgKG9iamVjdCkgPT4gb2JqZWN0Lm5hbWUgIT09IG9iai5uYW1lXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBvYmpzQWRkZWQuZm9yRWFjaCgob2JqZWN0RGF0YTogT2JqQWRkZWQpID0+IHtcbiAgICAgIGlmICghZXhpc3RpbmdJZHMuaW5jbHVkZXMob2JqZWN0RGF0YS5pZCkpIHtcbiAgICAgICAgb2JqTG9hZGVyLmxvYWQob2JqZWN0RGF0YS5maWxlLCAobmV3T2JqZWN0KSA9PiB7XG4gICAgICAgICAgbmV3T2JqZWN0Lm5hbWUgPSBvYmplY3REYXRhLmlkO1xuXG4gICAgICAgICAgbmV3T2JqZWN0LnRyYXZlcnNlKChjaGlsZCkgPT4ge1xuICAgICAgICAgICAgaWYgKChjaGlsZCBhcyBUSFJFRS5NZXNoKS5pc01lc2gpIHtcbiAgICAgICAgICAgICAgY29uc3QgbWVzaCA9IGNoaWxkIGFzIFRIUkVFLk1lc2g7XG4gICAgICAgICAgICAgIGlmIChtZXNoLm1hdGVyaWFsIGluc3RhbmNlb2YgVEhSRUUuTWF0ZXJpYWwpIHtcbiAgICAgICAgICAgICAgICBtZXNoLm1hdGVyaWFsLnRyYW5zcGFyZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBtZXNoLm1hdGVyaWFsLm9wYWNpdHkgPSAwLjg7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIHNldCBvYmplY3QgcG9zaXRpb24gYW5kIHJvdGF0aW9uXG4gICAgICAgICAgbmV3T2JqZWN0LnBvc2l0aW9uLnNldChcbiAgICAgICAgICAgIG9iamVjdERhdGEucG9zaXRpb24ueCxcbiAgICAgICAgICAgIG9iamVjdERhdGEucG9zaXRpb24ueSxcbiAgICAgICAgICAgIG9iamVjdERhdGEucG9zaXRpb24uelxuICAgICAgICAgICk7XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gVGhlIEpTT04gY29uZmlndXJhdGlvbiBoYXMgcm90YXRpb24gYWxyZWFkeSBpbiByYWRpYW5zIChlLmcuIDMuMTQxNS4uLilcbiAgICAgICAgICBuZXdPYmplY3Qucm90YXRpb24uc2V0KFxuICAgICAgICAgICAgb2JqZWN0RGF0YS5yb3RhdGlvbi54LFxuICAgICAgICAgICAgb2JqZWN0RGF0YS5yb3RhdGlvbi55LFxuICAgICAgICAgICAgb2JqZWN0RGF0YS5yb3RhdGlvbi56XG4gICAgICAgICAgKTtcblxuICAgICAgICAgIG5ld09iamVjdC5zY2FsZS5zZXQob2JqZWN0RGF0YS5zY2FsZS54LCBvYmplY3REYXRhLnNjYWxlLnksIG9iamVjdERhdGEuc2NhbGUueik7XG5cbiAgICAgICAgICB0aGlzLnNjZW5lLmFkZChuZXdPYmplY3QpO1xuICAgICAgICAgIHRoaXMuY2xpY2thYmxlT2JqZWN0cy5wdXNoKG5ld09iamVjdCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBvbk1vdXNlTW92ZShldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc0RyYWdnaW5nQ2FtZXJhKSB7XG4gICAgICBjb25zdCByZWN0ID0gdGhpcy5yZW5kZXJlci5kb21FbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgdGhpcy5tb3VzZS54ID0gKChldmVudC5jbGllbnRYIC0gcmVjdC5sZWZ0KSAvIHJlY3Qud2lkdGgpICogMiAtIDE7XG4gICAgICB0aGlzLm1vdXNlLnkgPSAtKChldmVudC5jbGllbnRZIC0gcmVjdC50b3ApIC8gcmVjdC5oZWlnaHQpICogMiArIDE7XG5cbiAgICAgIHRoaXMucmF5Y2FzdGVyLnNldEZyb21DYW1lcmEodGhpcy5tb3VzZSwgdGhpcy5jYW1lcmEpO1xuXG4gICAgICAvLyBXaGlsZSB0aGUgZ2hvc3QgaXMgdXAgaXQgZm9sbG93cyB0aGUgcG9pbnRlciBhbmQgbm90aGluZyBlbHNlIHNob3VsZCByZWFjdCB0byBpdC4gVGhlIG1vdmVcbiAgICAgIC8vIGlzIG9ubHkgcmVjb3JkZWQgaGVyZTogcG9pbnRlciBldmVudHMgZmlyZSBmYXIgbW9yZSBvZnRlbiB0aGFuIGZyYW1lcywgYW5kIHBpY2tpbmcgYSBwb2ludFxuICAgICAgLy8gY29zdHMgYSByYXljYXN0IGFnYWluc3QgdGhlIHdob2xlIG1vZGVsLCBzbyBkb2luZyBpdCBwZXIgZXZlbnQgaXMgd2hhdCBtYWRlIHRoZSBnaG9zdCB0cmFpbFxuICAgICAgLy8gYmVoaW5kIHRoZSBjdXJzb3IuIFRoZSByZW5kZXIgbG9vcCBwaWNrcyB1cCB0aGUgbGF0ZXN0IHBvc2l0aW9uLCBvbmNlLCBwZXIgZnJhbWUuXG4gICAgICBpZiAodGhpcy5pc1ByZXZpZXdpbmdQbGFjZW1lbnQoKSkge1xuICAgICAgICB0aGlzLnBlbmRpbmdQcmV2aWV3RXZlbnQgPSBldmVudDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBOb3QgcHJldmlld2luZyBhbnkgbW9yZSAoYSBwYWlyIHdhcyBqdXN0IGNvbXBsZXRlZCwgc2F5KTogZHJvcCBhIGdob3N0IGxlZnQgb3ZlciBmcm9tIGl0LlxuICAgICAgdGhpcy5yZW1vdmVQbGFjZW1lbnRQcmV2aWV3KCk7XG5cbiAgICAgIC8vIFRhZ3MgZmlyc3Q6IHRoZXkgZHJhdyBvbiB0b3Agb2YgdGhlIG1vZGVsLCBzbyB0aGV5IGhhdmUgdG8gYW5zd2VyIHRoZSBwb2ludGVyIGZpcnN0IHRvby5cbiAgICAgIGNvbnN0IGhvdmVyZWRUYWcgPSB0aGlzLnJheWNhc3RlclxuICAgICAgICAuaW50ZXJzZWN0T2JqZWN0cyhbLi4udGhpcy50YWdTcHJpdGVzLnZhbHVlcygpXSwgZmFsc2UpXG4gICAgICAgIC5maW5kKChoaXQpID0+IGhpdC5vYmplY3QudmlzaWJsZSk/Lm9iamVjdDtcbiAgICAgIGlmIChob3ZlcmVkVGFnKSB7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuZG9tRWxlbWVudC5zdHlsZS5jdXJzb3IgPSAncG9pbnRlcic7XG4gICAgICAgIHRoaXMub2JqZWN0SG92ZXJlZCQubmV4dChudWxsKTtcbiAgICAgICAgY29uc3QgbGFiZWwgPSBob3ZlcmVkVGFnLnVzZXJEYXRhLmxhYmVsO1xuICAgICAgICB0aGlzLnRhZ0hvdmVyZWQkLm5leHQobGFiZWwgPyB7IGxhYmVsLCBldmVudCB9IDogbnVsbCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMudGFnSG92ZXJlZCQubmV4dChudWxsKTtcblxuICAgICAgY29uc3QgaW50ZXJzZWN0cyA9IHRoaXMucmF5Y2FzdGVyLmludGVyc2VjdE9iamVjdHModGhpcy5jbGlja2FibGVPYmplY3RzLCB0cnVlKTtcblxuICAgICAgaWYgKGludGVyc2VjdHMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLnJlbmRlcmVyLmRvbUVsZW1lbnQuc3R5bGUuY3Vyc29yID0gJ3BvaW50ZXInO1xuICAgICAgICBjb25zdCBpbnRlcnNlY3RlZE9iamVjdElkID0gaW50ZXJzZWN0c1swXS5vYmplY3Q/LnBhcmVudD8ubmFtZTtcbiAgICAgICAgaWYgKGludGVyc2VjdGVkT2JqZWN0SWQpIHtcbiAgICAgICAgICAgIHRoaXMub2JqZWN0SG92ZXJlZCQubmV4dCh7IGlkOiBpbnRlcnNlY3RlZE9iamVjdElkLCBldmVudCB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5kb21FbGVtZW50LnN0eWxlLmN1cnNvciA9ICdkZWZhdWx0JztcbiAgICAgICAgdGhpcy5vYmplY3RIb3ZlcmVkJC5uZXh0KG51bGwpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlbmRlcmVyLmRvbUVsZW1lbnQuc3R5bGUuY3Vyc29yID0gJ2dyYWJiaW5nJztcbiAgICAgIHRoaXMub2JqZWN0SG92ZXJlZCQubmV4dChudWxsKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG9uTW91c2VDbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc0RyYWdnaW5nQ2FtZXJhKSB7XG4gICAgICBjb25zdCByZWN0ID0gdGhpcy5yZW5kZXJlci5kb21FbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgdGhpcy5tb3VzZS54ID0gKChldmVudC5jbGllbnRYIC0gcmVjdC5sZWZ0KSAvIHJlY3Qud2lkdGgpICogMiAtIDE7XG4gICAgICB0aGlzLm1vdXNlLnkgPSAtKChldmVudC5jbGllbnRZIC0gcmVjdC50b3ApIC8gcmVjdC5oZWlnaHQpICogMiArIDE7XG5cbiAgICAgIC8vIEFsaWdubWVudCBhbmQgcGxhY2VtZW50IGJvdGggdGFrZSB0aGUgY2xpY2sgYmVmb3JlIGFueXRoaW5nIGNhbiBiZSBvcGVuZWQgYnkgaXQuXG4gICAgICBpZiAodGhpcy5hbGlnbmluZykge1xuICAgICAgICB0aGlzLnJheWNhc3Rlci5zZXRGcm9tQ2FtZXJhKHRoaXMubW91c2UsIHRoaXMuY2FtZXJhKTtcbiAgICAgICAgdGhpcy5oYW5kbGVBbGlnbm1lbnRDbGljayhldmVudCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gTWVhc3VyaW5nIHRha2VzIGV2ZXJ5IGNsaWNrIGFzIGEgcG9pbnQsIHRoZSBzYW1lIHdheSBwbGFjZW1lbnQgdGFrZXMgaXQgYXMgYSBwb3NpdGlvbi5cbiAgICAgIGlmICh0aGlzLm1lYXN1cmluZykge1xuICAgICAgICBjb25zdCBwbGFjZW1lbnQgPSB0aGlzLnBpY2tQbGFjZW1lbnRPbk1vZGVsKGV2ZW50KTtcbiAgICAgICAgaWYgKHBsYWNlbWVudCkge1xuICAgICAgICAgIGNvbnN0IHsgeCwgeSwgeiB9ID0gcGxhY2VtZW50LnBvc2l0aW9uO1xuICAgICAgICAgIHRoaXMuYWRkTWVhc3VyZVBvaW50KG5ldyBUSFJFRS5WZWN0b3IzKHgsIHksIHopKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFBsYWNlbWVudCB3aW5zIG92ZXIgZXZlcnl0aGluZzogd2hpbGUgYXJtZWQsIGEgY2xpY2sgbWVhbnMgXCJwdXQgaXQgaGVyZVwiLCBub3QgXCJvcGVuIHRoYXRcIi5cbiAgICAgIGlmICh0aGlzLnBsYWNpbmdUYWcpIHtcbiAgICAgICAgY29uc3QgcGxhY2VtZW50ID0gdGhpcy5waWNrUGxhY2VtZW50T25Nb2RlbChldmVudCk7XG4gICAgICAgIGlmIChwbGFjZW1lbnQpIHtcbiAgICAgICAgICBwbGFjZW1lbnQucG9pVHlwZSA9IHRoaXMucGxhY2VtZW50UG9pVHlwZTtcbiAgICAgICAgICB0aGlzLnBlbmRpbmdUYWdQbGFjZW1lbnQgPSBwbGFjZW1lbnQ7XG4gICAgICAgICAgdGhpcy5wbGFjaW5nVGFnID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5yZW1vdmVQbGFjZW1lbnRQcmV2aWV3KCk7XG4gICAgICAgICAgdGhpcy5yZW5kZXJlci5kb21FbGVtZW50LnN0eWxlLmN1cnNvciA9ICdkZWZhdWx0JztcbiAgICAgICAgICB0aGlzLnBsYWNlbWVudENoYW5nZWQkLm5leHQoZmFsc2UpO1xuICAgICAgICAgIHRoaXMudGFnUGxhY2VkJC5uZXh0KHBsYWNlbWVudCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnJheWNhc3Rlci5zZXRGcm9tQ2FtZXJhKHRoaXMubW91c2UsIHRoaXMuY2FtZXJhKTtcblxuICAgICAgLy8gU2FtZSBwcmVjZWRlbmNlIGFzIGhvdmVyOiBhIHRhZyBkcmF3biBvdmVyIHRoZSBtb2RlbCBjbGFpbXMgdGhlIGNsaWNrLlxuICAgICAgY29uc3QgdGFnSGl0cyA9IHRoaXMucmF5Y2FzdGVyLmludGVyc2VjdE9iamVjdHMoWy4uLnRoaXMudGFnU3ByaXRlcy52YWx1ZXMoKV0sIGZhbHNlKVxuICAgICAgICAuZmlsdGVyKChoaXQpID0+IGhpdC5vYmplY3QudmlzaWJsZSk7XG4gICAgICBpZiAodGFnSGl0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IHRhZyA9IHRhZ0hpdHNbMF0ub2JqZWN0O1xuICAgICAgICB0aGlzLnRhZ0NsaWNrZWQkLm5leHQoeyBlbGVtZW50SWQ6IHRhZy5uYW1lLCBwb2lUeXBlOiB0YWcudXNlckRhdGEucG9pVHlwZSA/PyBudWxsIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGludGVyc2VjdHMgPSB0aGlzLnJheWNhc3Rlci5pbnRlcnNlY3RPYmplY3RzKHRoaXMuY2xpY2thYmxlT2JqZWN0cywgdHJ1ZSk7XG5cbiAgICAgIGlmIChpbnRlcnNlY3RzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgY2xpY2tlZE9iamVjdCA9IGludGVyc2VjdHNbMF0ub2JqZWN0O1xuICAgICAgICBjb25zdCBpZCA9IGNsaWNrZWRPYmplY3Q/LnBhcmVudD8ubmFtZTtcbiAgICAgICAgaWYgKGlkKSB7XG4gICAgICAgICAgICB0aGlzLm9iamVjdENsaWNrZWQkLm5leHQoaWQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm9iamVjdENsaWNrZWQkLm5leHQobnVsbCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEVzY2FwZSBjYW5jZWxzIHdoYXRldmVyIHRoZSBwb2ludGVyIGlzIGN1cnJlbnRseSBjb21taXR0ZWQgdG8uIFdoaWxlIGNhbGlicmF0aW5nLCB0aGUgdW5kbyBrZXlzXG4gICAqIHRha2UgYmFjayBvbmUgc3RlcCBvZiBpdCBpbnN0ZWFkIG9mIGFsbCBvZiBpdC5cbiAgICpcbiAgICogRW1pdHMgdGhyb3VnaCB0aGUgc2FtZSBzdWJqZWN0cyB0aGUgZXhwbGljaXQgQ2FuY2VsIGJ1dHRvbnMgdXNlLCBzbyB0aGUgVUkgZHJpdmluZyB0aGVtIGZvbGxvd3NcbiAgICogYWxvbmcgaW5zdGVhZCBvZiBiZWluZyBsZWZ0IHNob3dpbmcgYSBtb2RlIHRoYXQgaXMgbm8gbG9uZ2VyIGFybWVkLlxuICAgKi9cbiAgcHJpdmF0ZSBvbktleURvd24gPSAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkID0+IHtcbiAgICBpZiAodGhpcy5hbGlnbmluZyAmJiB0aGlzLmlzVW5kb0tleShldmVudCkpIHtcbiAgICAgIGlmICh0aGlzLnVuZG9BbGlnbm1lbnRTdGVwKCkpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGV2ZW50LmtleSAhPT0gJ0VzY2FwZScpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMucGxhY2luZ1RhZykge1xuICAgICAgLy8gTm90aGluZyBvdXRzaWRlIHRoZSBzY2VuZSB0cmFja3MgcGxhY2VtZW50LCBzbyBjbGVhcmluZyBpdCBoZXJlIGlzIHRoZSB3aG9sZSBvZiBpdC5cbiAgICAgIHRoaXMuY2FuY2VsVGFnUGxhY2VtZW50KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLm1lYXN1cmluZykge1xuICAgICAgdGhpcy5jYW5jZWxNZWFzdXJpbmcoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuYWxpZ25pbmcpIHtcbiAgICAgIHRoaXMuY2FuY2VsVGFnQWxpZ25tZW50KCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEN0cmwrWiAoQ21kK1ogb24gYSBNYWMpIG9yIEJhY2tzcGFjZSwgdW5sZXNzIHR5cGVkIGludG8gYSBmaWVsZCAtIHdoZXJlIHRoZXkgbWVhbiBzb21ldGhpbmdcbiAgICogZWxzZSwgdG8gd2hhdGV2ZXIgdGhlIGZpZWxkIGlzLlxuICAgKi9cbiAgcHJpdmF0ZSBpc1VuZG9LZXkoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiBib29sZWFuIHtcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgIGlmICh0YXJnZXQ/LmlzQ29udGVudEVkaXRhYmxlIHx8IFsnSU5QVVQnLCAnVEVYVEFSRUEnXS5pbmNsdWRlcyh0YXJnZXQ/LnRhZ05hbWUgPz8gJycpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBldmVudC5rZXkgPT09ICdCYWNrc3BhY2UnXG4gICAgICB8fCAoKGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQubWV0YUtleSkgJiYgIWV2ZW50LnNoaWZ0S2V5ICYmIGV2ZW50LmtleS50b0xvd2VyQ2FzZSgpID09PSAneicpO1xuICB9XG5cbiAgcHJpdmF0ZSBhbmltYXRlID0gKCk6IHZvaWQgPT4ge1xuICAgIHRoaXMuYW5pbWF0aW9uRnJhbWVJZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSh0aGlzLmFuaW1hdGUpO1xuICAgIHRoaXMuc3RlcENhbWVyYVR3ZWVuKCk7XG4gICAgdGhpcy5zdGVwUHVsc2VzKCk7XG4gICAgdGhpcy5jb250cm9scy51cGRhdGUoKTtcblxuICAgIC8vIE9uZSBwaWNrIHBlciBmcmFtZSwgYWdhaW5zdCB0aGUgcG9pbnRlcidzIGxhdGVzdCBwb3NpdGlvbiAtIHNlZSBvbk1vdXNlTW92ZS5cbiAgICBpZiAodGhpcy5wZW5kaW5nUHJldmlld0V2ZW50KSB7XG4gICAgICBjb25zdCBldmVudCA9IHRoaXMucGVuZGluZ1ByZXZpZXdFdmVudDtcbiAgICAgIHRoaXMucGVuZGluZ1ByZXZpZXdFdmVudCA9IG51bGw7XG4gICAgICB0aGlzLnVwZGF0ZVBsYWNlbWVudFByZXZpZXcoZXZlbnQpO1xuICAgIH1cblxuICAgIHRoaXMucmVuZGVyZXIucmVuZGVyKHRoaXMuc2NlbmUsIHRoaXMuY2FtZXJhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9wcyBkcmF3aW5nIHRoZSBzY2VuZSwgb3Igc3RhcnRzIGFnYWluLiBGb3Igd2hpbGUgYW5vdGhlciB2aWV3ZXIgY292ZXJzIGl0IC0gdGhlIHNwbGF0IHZpZXdlclxuICAgKiAtIHdoZXJlIGl0IHdvdWxkIG90aGVyd2lzZSBnbyBvbiBkcmF3aW5nLCB1bnNlZW4sIGV2ZXJ5IGZyYW1lLCBvbiB0aGUgZ3JhcGhpY3MgY2FyZCB0aGUgb3RoZXJcbiAgICogdmlld2VyIG5lZWRzLiBUaGUgc2NlbmUga2VlcHMgaXRzIHRhZ3MgYW5kIGNhbGlicmF0aW9uIGFsbCB0aGUgc2FtZS5cbiAgICovXG4gIHNldFJlbmRlcmluZ1BhdXNlZChwYXVzZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAocGF1c2VkKSB7XG4gICAgICB0aGlzLnN0b3BSZW5kZXJpbmcoKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMubGl2ZSAmJiAhdGhpcy5hbmltYXRpb25GcmFtZUlkKSB7XG4gICAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB0aGlzLmFuaW1hdGUoKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFN0b3BzIHRoZSByZW5kZXIgbG9vcCwgaWYgb25lIGlzIHJ1bm5pbmcuICovXG4gIHByaXZhdGUgc3RvcFJlbmRlcmluZygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5hbmltYXRpb25GcmFtZUlkKSB7XG4gICAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLmFuaW1hdGlvbkZyYW1lSWQpO1xuICAgICAgdGhpcy5hbmltYXRpb25GcmFtZUlkID0gMDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGFrZXMgdGhlIG1vZGVsIG91dCBvZiB0aGUgc2NlbmUgYW5kIGZyZWVzIHdoYXQgaXQgaG9sZHMgb24gdGhlIGdyYXBoaWNzIGNhcmQuXG4gICAqXG4gICAqIFRoZSB0YWdzIGFyZSBrZXB0LiBUaGV5IGhhbmcgZnJvbSB0aGUgbW9kZWwncyBncm91cCBzbyBhcyB0byBzaGFyZSBpdHMgZnJhbWUsIGFuZCBhcmUgbW92ZWQgb3V0XG4gICAqIG9mIGl0IGZpcnN0OiB0aGV5IGJlbG9uZyB0byB0aGUgdmlzaXQsIG5vdCB0byB0aGUgZmlsZSB0aGF0IHdhcyBkcmF3biB1bmRlciB0aGVtLlxuICAgKi9cbiAgcHJpdmF0ZSByZW1vdmVNb2RlbCgpOiB2b2lkIHtcbiAgICBjb25zdCBncm91cCA9IHRoaXMubW9kZWxHcm91cDtcbiAgICBjb25zdCBtb2RlbCA9IHRoaXMubW9kZWxSb290O1xuICAgIHRoaXMubW9kZWxHcm91cCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLm1vZGVsUm9vdCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnN1cmZhY2VDZWxscyA9IG51bGw7XG4gICAgdGhpcy5tb2RlbFdvcmxkUmFkaXVzID0gMDtcbiAgICBbdGhpcy50YWdHcm91cCwgdGhpcy5tb2RlbFRhZ0dyb3VwLCB0aGlzLmNhbGlicmF0aW9uR3JvdXBdLmZvckVhY2goKGtlcHQpID0+IGtlcHQucGFyZW50Py5yZW1vdmUoa2VwdCkpO1xuICAgIGdyb3VwPy5wYXJlbnQ/LnJlbW92ZShncm91cCk7XG4gICAgaWYgKG1vZGVsKSB7XG4gICAgICB0aGlzLmRpc3Bvc2VNb2RlbChtb2RlbCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZyZWVzIGEgbW9kZWwncyBnZW9tZXRyeSwgbWF0ZXJpYWxzIGFuZCB0ZXh0dXJlcy5cbiAgICpcbiAgICogRHJvcHBpbmcgdGhlIGxhc3QgcmVmZXJlbmNlIHRvIGEgbW9kZWwgZG9lcyBub3QgZG8gdGhpcy4gV2hhdCBpdCB1cGxvYWRlZCBzdGF5cyBvbiB0aGUgZ3JhcGhpY3NcbiAgICogY2FyZCB1bnRpbCB0aGUgcGFnZSBpcyBjbG9zZWQgLSBodW5kcmVkcyBvZiBtZWdhYnl0ZXMgZm9yIGEgY2FwdHVyZWQgYnVpbGRpbmcgLSBhbmQgb24gYVxuICAgKiBtYWNoaW5lIHdob3NlIGdyYXBoaWNzIG1lbW9yeSBpcyBzaGFyZWQgd2l0aCB0aGUgcmVzdCBvZiB0aGUgc3lzdGVtLCBldmVyeXRoaW5nIHNsb3dzIGRvd25cbiAgICogbG9uZyBiZWZvcmUgYW55dGhpbmcgZmFpbHMuXG4gICAqL1xuICBwcml2YXRlIGRpc3Bvc2VNb2RlbChtb2RlbDogVEhSRUUuT2JqZWN0M0QpOiB2b2lkIHtcbiAgICBjb25zdCBmcmVlZCA9IG5ldyBTZXQ8YW55PigpO1xuICAgIGNvbnN0IGZyZWUgPSAocmVzb3VyY2U6IGFueSkgPT4ge1xuICAgICAgaWYgKHJlc291cmNlICYmIHR5cGVvZiByZXNvdXJjZS5kaXNwb3NlID09PSAnZnVuY3Rpb24nICYmICFmcmVlZC5oYXMocmVzb3VyY2UpKSB7XG4gICAgICAgIGZyZWVkLmFkZChyZXNvdXJjZSk7XG4gICAgICAgIHJlc291cmNlLmRpc3Bvc2UoKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIG1vZGVsLnRyYXZlcnNlKChjaGlsZDogYW55KSA9PiB7XG4gICAgICBmcmVlKGNoaWxkLmdlb21ldHJ5KTtcbiAgICAgIGNvbnN0IG1hdGVyaWFscyA9IEFycmF5LmlzQXJyYXkoY2hpbGQubWF0ZXJpYWwpID8gY2hpbGQubWF0ZXJpYWwgOiBbY2hpbGQubWF0ZXJpYWxdO1xuICAgICAgbWF0ZXJpYWxzLmZvckVhY2goKG1hdGVyaWFsOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKCFtYXRlcmlhbCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBXaGljaGV2ZXIgc2xvdHMgdGhpcyBraW5kIG9mIG1hdGVyaWFsIGhhczogbWFwLCBub3JtYWxNYXAsIGVtaXNzaXZlTWFwLi4uXG4gICAgICAgIE9iamVjdC52YWx1ZXMobWF0ZXJpYWwpLmZvckVhY2goKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAodmFsdWU/LmlzVGV4dHVyZSkge1xuICAgICAgICAgICAgZnJlZSh2YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgZnJlZShtYXRlcmlhbCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5saXZlID0gZmFsc2U7XG4gICAgdGhpcy5zdG9wUmVuZGVyaW5nKCk7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLm9uS2V5RG93bik7XG4gICAgdGhpcy5jYW52YXNMaXN0ZW5lcnMuZm9yRWFjaCgocmVtb3ZlKSA9PiByZW1vdmUoKSk7XG4gICAgdGhpcy5jYW52YXNMaXN0ZW5lcnMgPSBbXTtcbiAgICBpZiAodGhpcy5jYW52YXNSZXNpemVPYnNlcnZlcikge1xuICAgICAgdGhpcy5jYW52YXNSZXNpemVPYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICB0aGlzLmNhbnZhc1Jlc2l6ZU9ic2VydmVyID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICB0aGlzLmRpc2NhcmRDdXJyZW50TG9hZCgpO1xuICAgIHRoaXMuY2xlYXJUYWdzKCk7XG4gICAgdGhpcy5tZWFzdXJpbmcgPSBmYWxzZTtcbiAgICB0aGlzLmNsZWFyTWVhc3VyZW1lbnQoKTtcbiAgICB0aGlzLmNsZWFyQ2FsaWJyYXRpb25NYXJrcygpO1xuICAgIHRoaXMucHVsc2VzID0gW107XG4gICAgLy8gV2hpbGUgdGhlIHJlbmRlcmVyIGlzIHN0aWxsIHRoZXJlIHRvIGhhbmQgdGhlIG1lbW9yeSBiYWNrIHRocm91Z2guXG4gICAgdGhpcy5yZW1vdmVNb2RlbCgpO1xuICAgIC8vIFRoZXkgd2VyZSBpbiB0aGUgc2NlbmUgdGhhdCBpcyBnb2luZy4gS2VwdCwgdGhlIG5leHQgc2NlbmUgd291bGQgZ28gb24gdGVzdGluZyBldmVyeSBwb2ludGVyXG4gICAgLy8gbW92ZSBhZ2FpbnN0IG9iamVjdHMgbm9ib2R5IGNhbiBzZWUsIGFuZCB3b3VsZCBza2lwIGxvYWRpbmcgdGhlbSBhZ2FpbiBhcyBcImFscmVhZHkgdGhlcmVcIi5cbiAgICB0aGlzLmNsaWNrYWJsZU9iamVjdHMgPSBbXTtcbiAgICBpZiAodGhpcy5yZW5kZXJlcikge1xuICAgICAgdGhpcy5yZW5kZXJlci5kaXNwb3NlKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmNvbnRyb2xzKSB7XG4gICAgICB0aGlzLmNvbnRyb2xzLmRpc3Bvc2UoKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==