gridviz 3.0.30 → 3.0.32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/gridviz.js CHANGED
@@ -8273,6 +8273,7 @@ class Map {
8273
8273
  this.legend = opts.legendContainer
8274
8274
  ? (0,d3_selection__WEBPACK_IMPORTED_MODULE_4__["default"])(opts.legendContainer) // Wrap the provided HTML node in a D3 selection
8275
8275
  : null
8276
+ this._legendProvidedByUser = !!opts.legendContainer
8276
8277
  if (!this.legend) this.initialiseLegend()
8277
8278
 
8278
8279
  //tooltip
@@ -8733,7 +8734,10 @@ class Map {
8733
8734
  this.geoCanvas.canvas.remove()
8734
8735
 
8735
8736
  // remove legend
8736
- this.legend?.remove()
8737
+ // only remove legend if gridviz created it
8738
+ if (!this._legendProvidedByUser) {
8739
+ this.legend?.remove()
8740
+ }
8737
8741
 
8738
8742
  // remove tooltip
8739
8743
  this.tooltip.tooltip?.remove()
@@ -13459,14 +13463,25 @@ class ShadingStyle extends _SideStyle_js__WEBPACK_IMPORTED_MODULE_0__.SideStyle
13459
13463
  // compute maximum side value for normalization
13460
13464
  this.viewScale = sides => (0,d3_array__WEBPACK_IMPORTED_MODULE_1__["default"])(sides, s => sideValue(s))
13461
13465
 
13462
- const colorTopLeft = opts.colorTopLeft || '255,255,255'
13463
- const colorBottomRight = opts.colorBottomRight || '0,0,0'
13464
- const scale = opts.scale || (t=>t)
13466
+ // get colors
13467
+ let colorTopLeft = opts.colorTopLeft || '255,255,255'
13468
+ let colorBottomRight = opts.colorBottomRight || '0,0,0'
13469
+
13470
+ // revert colors (to revert the relief, show depressions as hills)
13471
+ const revert = opts.revert == undefined? false : opts.revert
13472
+ if(revert) {
13473
+ let a = colorTopLeft
13474
+ colorTopLeft = colorBottomRight
13475
+ colorBottomRight = a
13476
+ }
13477
+
13478
+ //
13479
+ const scale = opts.scale
13465
13480
 
13466
13481
  this.color = (side, resolution, z, max) => {
13467
13482
  if (side.v == 0) return
13468
13483
  let coeff = Math.abs(side.v / max)
13469
- coeff = scale(coeff)
13484
+ if(scale) coeff = scale(coeff)
13470
13485
  if ((side.v < 0 && side.or === 'h') || (side.v > 0 && side.or === 'v'))
13471
13486
  return 'rgba(' + colorTopLeft + ',' + coeff + ')'
13472
13487
  return 'rgba(' + colorBottomRight + ',' + coeff + ')'
@@ -13906,12 +13921,17 @@ class SideStyle extends _core_Style_js__WEBPACK_IMPORTED_MODULE_0__.Style {
13906
13921
  * @param {boolean} center Set to true so that the side coordinate are those of its center point rather than its left/bottom point (the side x,y coordinates are those of the left point for horizontal sides, and of the bottom point for vertical sides)
13907
13922
  * @returns { Array.<Side> }
13908
13923
  */
13909
- static buildSides(cells, resolution, withHorizontal = true, withVertical = true, center = true) {
13924
+ static buildSides(cells, resolution, withHorizontal = true, withVertical = true, center = true, eps = 0.01) {
13910
13925
  /** @type { Array.<Side> } */
13911
13926
  const sides = []
13912
13927
 
13928
+ // half resolution
13913
13929
  const r2 = center ? resolution / 2 : 0
13914
13930
 
13931
+ // epsilon
13932
+ eps = resolution * eps
13933
+ const abs = Math.abs
13934
+
13915
13935
  //make horizontal sides
13916
13936
  //sort cells by x and y
13917
13937
  cells.sort((c1, c2) => (c2.x == c1.x ? c1.y - c2.y : c1.x - c2.x))
@@ -13919,7 +13939,7 @@ class SideStyle extends _core_Style_js__WEBPACK_IMPORTED_MODULE_0__.Style {
13919
13939
  for (let i = 1; i < cells.length; i++) {
13920
13940
  let c2 = cells[i]
13921
13941
 
13922
- if (c1.y + resolution == c2.y && c1.x == c2.x)
13942
+ if (abs(c1.y + resolution - c2.y) < eps && abs(c1.x - c2.x) < eps)
13923
13943
  //cells in same column and touch along horizontal side
13924
13944
  //make shared side
13925
13945
  sides.push({
@@ -13958,7 +13978,7 @@ class SideStyle extends _core_Style_js__WEBPACK_IMPORTED_MODULE_0__.Style {
13958
13978
  for (let i = 1; i < cells.length; i++) {
13959
13979
  let c2 = cells[i]
13960
13980
 
13961
- if (c1.x + resolution == c2.x && c1.y == c2.y)
13981
+ if (abs(c1.x + resolution - c2.x) < eps && abs(c1.y - c2.y) < eps)
13962
13982
  //cells in same row and touch along vertical side
13963
13983
  //make shared side
13964
13984
  sides.push({
@@ -14020,6 +14040,8 @@ __webpack_require__.r(__webpack_exports__);
14020
14040
  * @typedef {function(Array.<Side>,number, number):*} SideViewScale */
14021
14041
 
14022
14042
  /**
14043
+ * @see https://manifold.net/doc/mfd9/example__tanaka_contours.htm
14044
+ *
14023
14045
  * @module style
14024
14046
  * @author Julien Gaffuri
14025
14047
  */
@@ -14035,7 +14057,7 @@ class SideTanakaStyle extends _core_Style_js__WEBPACK_IMPORTED_MODULE_0__.Style
14035
14057
 
14036
14058
  /** A function returning the width of a cell side, in geo unit
14037
14059
  * @type {function(Side, number, number, number, object):number} */
14038
- this.width = opts.width || ((side, sideValue, resolution, z, sidesScale) => Math.abs(sideValue) * Math.min(2 * z, resolution / 3))
14060
+ this.width = opts.width || ((side, sideValue, resolution, z, sidesScale) => Math.abs(sideValue) * z) //Math.min(2 * z, resolution / 3))
14039
14061
 
14040
14062
  /** A function returning the length of a cell side, in geo unit
14041
14063
  * @type {function(Side, number, number, object):number} */
@@ -14176,7 +14198,7 @@ __webpack_require__.r(__webpack_exports__);
14176
14198
  /* harmony export */ });
14177
14199
  /* harmony import */ var _core_Style_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../core/Style.js */ "./src/core/Style.js");
14178
14200
  /* harmony import */ var _utils_webGLUtils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/webGLUtils.js */ "./src/utils/webGLUtils.js");
14179
- /* harmony import */ var _utils_WebGLSquareColoringCatAdvanced_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/WebGLSquareColoringCatAdvanced.js */ "./src/utils/WebGLSquareColoringCatAdvanced.js");
14201
+ /* harmony import */ var d3_color__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! d3-color */ "./node_modules/d3-color/src/color.js");
14180
14202
  //@ts-check
14181
14203
 
14182
14204
 
@@ -14200,8 +14222,8 @@ class SquareColorCategoryWebGLStyle extends _core_Style_js__WEBPACK_IMPORTED_MOD
14200
14222
 
14201
14223
  /**
14202
14224
  * A function returning the category code of the cell, for coloring.
14203
- * @type {function(import('../core/Dataset.js').Cell):string} */
14204
- this.code = opts.code
14225
+ * @type {function(import('../core/Dataset.js').Cell, number, number, viewScale):string} */
14226
+ this.code = opts.code // (c, resolution, z, viewScale) => "code1"
14205
14227
 
14206
14228
  /**
14207
14229
  * The dictionary (code -> color) which gives the color of each category code.
@@ -14224,38 +14246,105 @@ class SquareColorCategoryWebGLStyle extends _core_Style_js__WEBPACK_IMPORTED_MOD
14224
14246
  * @type {function(number,number):number} */
14225
14247
  this.size = opts.size // (resolution, z) => ...
14226
14248
 
14227
- /**
14228
- * @private
14229
- * @type { WebGLSquareColoringCatAdvanced } */
14230
- this.wgp = new _utils_WebGLSquareColoringCatAdvanced_js__WEBPACK_IMPORTED_MODULE_2__.WebGLSquareColoringCatAdvanced(this.colors)
14249
+ /** * @type {{canvas:HTMLCanvasElement, gl:WebGLRenderingContext, width:number, height:number }}*/
14250
+ this.cvWGL = undefined
14251
+ this.programm = undefined
14252
+
14253
+ this.x = undefined
14254
+ this.y = undefined
14255
+ this.z = undefined
14256
+ this.cellsNb = undefined
14231
14257
  }
14232
14258
 
14233
- /**
14234
- * @param {Array.<import("../core/Dataset.js").Cell>} cells
14235
- * @param {import("../core/GeoCanvas.js").GeoCanvas} geoCanvas
14236
- * @param {number} resolution
14237
- */
14238
- draw(cells, geoCanvas, resolution) {
14239
- //filter
14240
- if (this.filter) cells = cells.filter(this.filter)
14259
+ init(w, h) {
14260
+ this.cvWGL = (0,_utils_webGLUtils_js__WEBPACK_IMPORTED_MODULE_1__.makeWebGLCanvas)(w + '', h + '')
14261
+ if (!this.cvWGL) { console.error('No webGL'); return }
14241
14262
 
14242
- //
14243
- const z = geoCanvas.view.z
14263
+ const gl = this.cvWGL.gl
14264
+
14265
+ //draw
14266
+ const vectorShader = `
14267
+ attribute vec2 pos;
14268
+ uniform float sizePix;
14269
+ uniform mat3 mat;
14270
+ attribute float i;
14271
+ varying float vi;
14272
+ void main() {
14273
+ gl_Position = vec4(mat * vec3(pos, 1.0), 1.0);
14274
+ gl_PointSize = sizePix;
14275
+ vi = i;
14276
+ }`
14277
+ /** @type {WebGLShader} */
14278
+ const vShader = (0,_utils_webGLUtils_js__WEBPACK_IMPORTED_MODULE_1__.createShader)(gl, gl.VERTEX_SHADER, vectorShader)
14244
14279
 
14280
+ const fragmentShader = `
14281
+ precision highp float;
14282
+ varying float vi;
14283
+ uniform sampler2D colorLUT;
14284
+ uniform float lutSize;
14285
+ void main(void) {
14286
+ float idx = floor(vi + 0.5);
14287
+ float u = (idx + 0.5) / lutSize;
14288
+ gl_FragColor = texture2D(colorLUT, vec2(u, 0.5));
14289
+ }`
14290
+ /** @type {WebGLShader} */
14291
+ const fShader = (0,_utils_webGLUtils_js__WEBPACK_IMPORTED_MODULE_1__.createShader)(gl, gl.FRAGMENT_SHADER, fragmentShader)
14292
+
14293
+ /** @type {WebGLProgram} */
14294
+ this.program = (0,_utils_webGLUtils_js__WEBPACK_IMPORTED_MODULE_1__.initShaderProgram)(gl, vShader, fShader)
14295
+ gl.useProgram(this.program)
14296
+ }
14297
+
14298
+ bindColors() {
14299
+ const gl = this.cvWGL.gl
14300
+ const lutSize = this.colors.length;
14301
+ const lutData = new Uint8Array(lutSize * 4); // RGBA for each entry
14302
+
14303
+ // Fill lutData with your color values (e.g., rainbow, grayscale, etc.)
14304
+ for (let i = 0; i < lutSize; i++) {
14305
+ const c = (0,d3_color__WEBPACK_IMPORTED_MODULE_2__["default"])(this.colors[i])
14306
+ lutData[i * 4] = +c.r; // R
14307
+ lutData[i * 4 + 1] = c.g; // G
14308
+ lutData[i * 4 + 2] = c.b; // B
14309
+ lutData[i * 4 + 3] = c?.opacity * 255; // A
14310
+ }
14311
+
14312
+ // Create and bind texture
14313
+ const lutTexture = gl.createTexture();
14314
+ gl.bindTexture(gl.TEXTURE_2D, lutTexture);
14315
+ gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, lutSize, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, lutData);
14316
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
14317
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
14318
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
14319
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
14320
+
14321
+ // Get uniform locations
14322
+ const uColorLUT = gl.getUniformLocation(this.program, 'colorLUT');
14323
+ const uLutSize = gl.getUniformLocation(this.program, 'lutSize');
14324
+
14325
+ // Set uniform values
14326
+ gl.uniform1i(uColorLUT, 0); // Texture unit 0
14327
+ gl.uniform1f(uLutSize, lutSize);
14328
+
14329
+ // Bind the texture to texture unit 0
14330
+ gl.activeTexture(gl.TEXTURE0);
14331
+ gl.bindTexture(gl.TEXTURE_2D, lutTexture);
14332
+ }
14333
+
14334
+ bindVertices(cells, resolution, z, viewScale) {
14335
+ const gl = this.cvWGL.gl
14245
14336
  //add vertice and fragment data
14246
14337
  const r2 = resolution / 2
14247
- let c,
14248
- nb = cells.length
14338
+ let c, nb = cells.length
14249
14339
  const verticesBuffer = []
14250
14340
  const iBuffer = []
14251
14341
  for (let i = 0; i < nb; i++) {
14252
14342
  c = cells[i]
14253
- const cat = this.code(c)
14343
+ const cat = this.code(c, resolution, z, viewScale)
14254
14344
  if (cat == undefined) {
14255
14345
  console.log('Unexpected category: ' + cat)
14256
14346
  continue
14257
14347
  }
14258
- /** @type {number} */
14259
14348
  const i_ = this.catToI[cat]
14260
14349
  if (isNaN(+i_)) {
14261
14350
  console.log('Unexpected category index: ' + cat + ' ' + i_)
@@ -14265,20 +14354,87 @@ class SquareColorCategoryWebGLStyle extends _core_Style_js__WEBPACK_IMPORTED_MOD
14265
14354
  iBuffer.push(+i_)
14266
14355
  }
14267
14356
 
14357
+ //bind vertice data
14358
+ gl.bindBuffer(gl.ARRAY_BUFFER, gl.createBuffer())
14359
+ gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(verticesBuffer), gl.STATIC_DRAW)
14360
+ const position = gl.getAttribLocation(this.program, 'pos')
14361
+ gl.vertexAttribPointer(
14362
+ position,
14363
+ 2, //numComponents
14364
+ gl.FLOAT, //type
14365
+ false, //normalise
14366
+ 0, //stride
14367
+ 0 //offset
14368
+ )
14369
+ gl.enableVertexAttribArray(position)
14370
+
14371
+ //i data
14372
+ gl.bindBuffer(gl.ARRAY_BUFFER, gl.createBuffer())
14373
+ gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(iBuffer), gl.STATIC_DRAW)
14374
+ const i = gl.getAttribLocation(this.program, 'i')
14375
+ gl.vertexAttribPointer(i, 1, gl.FLOAT, false, 0, 0)
14376
+ gl.enableVertexAttribArray(i)
14377
+ }
14378
+
14379
+
14380
+
14381
+ // check if the vertices have to be bound again
14382
+ mapContentChanged(v, cellsNb) {
14383
+ if (v.x == this.x && v.y == this.y && v.z == this.z && this.cellsNb == cellsNb) return false
14384
+ this.x = v.x
14385
+ this.y = v.y
14386
+ this.z = v.z
14387
+ this.cellsNb = cellsNb
14388
+ return true
14389
+ }
14390
+
14391
+
14392
+ /**
14393
+ * @param {Array.<import("../core/Dataset.js").Cell>} cells
14394
+ * @param {import("../core/GeoCanvas.js").GeoCanvas} geoCanvas
14395
+ * @param {number} resolution
14396
+ */
14397
+ draw(cells, geoCanvas, resolution) {
14398
+ //filter
14399
+ if (this.filter) cells = cells.filter(this.filter)
14400
+
14401
+ //
14402
+ const z = geoCanvas.view.z
14403
+
14404
+ //get view scale
14405
+ const viewScale = this.viewScale ? this.viewScale(cells, resolution, z) : undefined
14406
+
14268
14407
  //create canvas and webgl renderer
14269
- const cvWGL = (0,_utils_webGLUtils_js__WEBPACK_IMPORTED_MODULE_1__.makeWebGLCanvas)(geoCanvas.w + '', geoCanvas.h + '')
14270
- if (!cvWGL) {
14271
- console.error('No webGL')
14272
- return
14408
+ if (!this.cvWGL || geoCanvas.w != this.cvWGL.width || geoCanvas.h != this.cvWGL.height) {
14409
+ this.init(geoCanvas.w, geoCanvas.h)
14410
+ this.bindColors()
14273
14411
  }
14412
+ const gl = this.cvWGL.gl
14413
+ const canvas = this.cvWGL.canvas
14274
14414
 
14275
- //draw
14276
- const sizeGeo = this.size ? this.size(resolution, z) : resolution + 0.2 * z
14277
- this.wgp.draw(cvWGL.gl, verticesBuffer, iBuffer, geoCanvas.getWebGLTransform(), sizeGeo / z)
14415
+ //bind sizePix
14416
+ const sizePix = this.size ? this.size(resolution, z) / z : resolution / z + 0.2
14417
+ gl.uniform1f(gl.getUniformLocation(this.program, 'sizePix'), 1.0 * sizePix)
14418
+
14419
+ //
14420
+ if (this.mapContentChanged(geoCanvas.view, cells.length))
14421
+ //bind vertices
14422
+ this.bindVertices(cells, resolution, z, viewScale)
14423
+ //transformation
14424
+ gl.uniformMatrix3fv(gl.getUniformLocation(this.program, 'mat'), false, new Float32Array(geoCanvas.getWebGLTransform()))
14425
+
14426
+ // Enable the depth test
14427
+ //gl.enable(gl.DEPTH_TEST);
14428
+ // Clear the color buffer bit
14429
+ gl.clear(gl.COLOR_BUFFER_BIT)
14430
+ // Set the view port
14431
+ //gl.viewport(0, 0, cg.w, cg.h);
14432
+
14433
+ gl.drawArrays(gl.POINTS, 0, cells.length)
14278
14434
 
14279
14435
  //draw in canvas geo
14280
14436
  geoCanvas.initCanvasTransform()
14281
- geoCanvas.offscreenCtx.drawImage(cvWGL.canvas, 0, 0)
14437
+ geoCanvas.offscreenCtx.drawImage(canvas, 0, 0)
14282
14438
 
14283
14439
  //update legends
14284
14440
  this.updateLegends({ style: this, resolution: resolution, z: z })
@@ -14286,6 +14442,59 @@ class SquareColorCategoryWebGLStyle extends _core_Style_js__WEBPACK_IMPORTED_MOD
14286
14442
  }
14287
14443
 
14288
14444
 
14445
+
14446
+ // early tests for webgl2 migration
14447
+
14448
+ /*
14449
+ function getVectorShader2() {
14450
+ return `
14451
+ #version 300 es
14452
+ precision highp float;
14453
+
14454
+ in vec2 pos;
14455
+ in int i;
14456
+
14457
+ uniform float sizePix;
14458
+ uniform mat3 mat;
14459
+
14460
+ flat out int vi;
14461
+
14462
+ void main() {
14463
+ gl_Position = vec4(mat * vec3(pos, 1.0), 1.0);
14464
+ gl_PointSize = sizePix;
14465
+ vi = i;
14466
+ }
14467
+ `
14468
+ }
14469
+
14470
+
14471
+ function getFragmentShader2(colors) {
14472
+
14473
+ //prepare fragment shader code
14474
+ //declare the uniform and other variables
14475
+ const out = []
14476
+ out.push('#version 300 es\nprecision highp float;\nflat in int vi;\n')
14477
+
14478
+ //add color uniforms
14479
+ //uniform vec4 colors[12];
14480
+ out.push('uniform vec4 colors[')
14481
+ out.push(colors.length)
14482
+ out.push('];\n')
14483
+
14484
+ out.push('out vec4 fragColor;\n')
14485
+
14486
+ //start the main function
14487
+ //void main() { fragColor = colors[clamp(vi, 0, 11)]; }
14488
+ out.push('void main() { fragColor = colors[vi]; }\n')
14489
+
14490
+ /** Fragment shader program
14491
+ const fshString = out.join('')
14492
+ console.log(fshString)
14493
+ return fshString
14494
+ }
14495
+
14496
+ */
14497
+
14289
14498
  /***/ }),
14290
14499
 
14291
14500
  /***/ "./src/style/SquareColorWebGLStyle.js":
@@ -15144,86 +15353,85 @@ class WebGLSquareColoringAdvanced {
15144
15353
 
15145
15354
  //prepare fragment shader code
15146
15355
  //declare the uniform and other variables
15147
- let fshString =
15148
- '' +
15149
- 'precision mediump float;\n' +
15150
- 'varying float vt;\n' +
15151
- 'uniform float alpha;\n' +
15152
- (() => {
15153
- const out = []
15154
- for (let i = 0; i < colors.length; i++) out.push('uniform vec4 c' + i + ';\n')
15155
- return out.join('')
15156
- })() +
15157
- //start the main function, apply the stretching of t
15158
- 'void main(void) {\n'
15356
+ const fshBuff = []
15357
+ fshBuff.push('precision mediump float;')
15358
+ fshBuff.push('varying float vt;')
15359
+ fshBuff.push('uniform float alpha;')
15360
+ for (let i = 0; i < colors.length; i++) fshBuff.push('uniform vec4 c' + i + ';')
15361
+ //start the main function
15362
+ fshBuff.push('void main(void) {')
15159
15363
 
15364
+ // apply the stretching of t
15160
15365
  if (stretching) {
15161
15366
  if (stretching.fun == 'pow')
15162
15367
  //sPow = (t, alpha = 3) => Math.pow(t, alpha);
15163
- fshString += ' float t = pow(vt, alpha);\n'
15368
+ fshBuff.push(' float t = pow(vt, alpha);')
15164
15369
  else if (stretching.fun == 'powInv')
15165
15370
  //sPowRev = (t, alpha = 3) => 1 - Math.pow(1 - t, 1 / alpha);
15166
- fshString += ' float t = 1.0-pow(1.0-vt, 1.0/alpha);\n'
15371
+ fshBuff.push(' float t = 1.0-pow(1.0-vt, 1.0/alpha);')
15167
15372
  else if (stretching.fun == 'exp')
15168
15373
  //sExp = (t, alpha = 3) => alpha == 0 ? t : (Math.exp(t * alpha) - 1) / (Math.exp(alpha) - 1);
15169
- fshString +=
15374
+ fshBuff.push(
15170
15375
  stretching.alpha == 0
15171
15376
  ? `float t = vt;`
15172
- : ' float t = (exp(vt * alpha) - 1.0) / (exp(alpha) - 1.0);\n'
15377
+ : ' float t = (exp(vt * alpha) - 1.0) / (exp(alpha) - 1.0);')
15173
15378
  else if (stretching.fun == 'log')
15174
15379
  //sExpRev = (t, alpha = 3) => alpha == 0 ? t : 1 - (1 / alpha) * Math.log(Math.exp(alpha) * (1 - t) + t);
15175
- fshString +=
15380
+ fshBuff.push(
15176
15381
  stretching.alpha == 0
15177
15382
  ? `float t = vt;`
15178
- : ' float t = 1.0 - (1.0 / alpha) * log(exp(alpha) * (1.0 - vt) + vt);\n'
15383
+ : ' float t = 1.0 - (1.0 / alpha) * log(exp(alpha) * (1.0 - vt) + vt);')
15179
15384
  else if (stretching.fun == 'circle') {
15180
15385
  if (stretching.alpha == 0)
15181
15386
  //if (alpha == 0) return t;
15182
- fshString += ' float t = vt;\n'
15387
+ fshBuff.push(' float t = vt;')
15183
15388
  else if (stretching.alpha == 1)
15184
15389
  // if (alpha == 1) return Math.sqrt(2 * t - t * t);
15185
- fshString += ' float t = sqrt(vt * (2.0 - vt));\n'
15390
+ fshBuff.push(' float t = sqrt(vt * (2.0 - vt));')
15186
15391
  else {
15187
15392
  //const a = alpha / (1 - alpha);
15188
15393
  //return Math.sqrt(1 / (a * a) + t * (2 / a + 2 - t)) - 1 / a;
15189
- fshString +=
15190
- ' float a = alpha / (1.0 - alpha);\n' +
15191
- ' float t = sqrt(1.0 / (a * a) + vt * ( 2.0/a + 2.0 - vt )) - 1.0 / a;\n'
15394
+ fshBuff.push(' float a = alpha / (1.0 - alpha);')
15395
+ fshBuff.push(' float t = sqrt(1.0 / (a * a) + vt * ( 2.0/a + 2.0 - vt )) - 1.0 / a;')
15192
15396
  }
15193
15397
  } else if (stretching.fun == 'circleInv') {
15194
15398
  // 1 - sCircleLow(1 - t, alpha)
15195
15399
  if (stretching.alpha == 0)
15196
15400
  //if (alpha == 0) return t;
15197
- fshString += ' float t = vt;\n'
15401
+ fshBuff.push(' float t = vt;')
15198
15402
  else if (stretching.alpha == 1)
15199
15403
  // if (alpha == 1) return Math.sqrt(2 * t - t * t);
15200
- fshString += ' float t = 1.0 - sqrt((1.0 - vt) * (1.0 + vt));\n'
15404
+ fshBuff.push(' float t = 1.0 - sqrt((1.0 - vt) * (1.0 + vt));')
15201
15405
  else {
15202
15406
  //const a = alpha / (1 - alpha);
15203
15407
  //return Math.sqrt(1 / (a * a) + (2 * t) / a + 2 * t - t * t) - 1 / a;
15204
- fshString +=
15205
- ' float a = alpha / (1.0 - alpha);\n' +
15206
- ' float t = 1.0 - sqrt(1.0 / (a * a) + (1.0-vt) * ( 2.0/a + 1.0 + vt )) + 1.0 / a;\n'
15408
+ fshBuff.push(' float a = alpha / (1.0 - alpha);')
15409
+ fshBuff.push(' float t = 1.0 - sqrt(1.0 / (a * a) + (1.0-vt) * ( 2.0/a + 1.0 + vt )) + 1.0 / a;')
15207
15410
  }
15208
15411
  } else {
15209
15412
  console.error('Unexpected stretching function code: ' + stretching.fun)
15210
- fshString += ' float t = vt;\n'
15413
+ fshBuff.push(' float t = vt;')
15211
15414
  }
15212
15415
  } else {
15213
- fshString += ' float t = vt;\n'
15416
+ fshBuff.push(' float t = vt;')
15214
15417
  }
15215
15418
 
15216
15419
  //choose initial and final colors, and adjust t value
15217
- if (colors.length == 1) fshString += ' vec4 cI=c0;\n vec4 cF=c0;\n'
15218
- else if (colors.length == 2) fshString += ' vec4 cI=c0;\n vec4 cF=c1;\n'
15219
- else {
15420
+ if (colors.length == 1) {
15421
+ fshBuff.push(' vec4 cI=c0;')
15422
+ fshBuff.push(' vec4 cF=c0;')
15423
+ }
15424
+ else if (colors.length == 2) {
15425
+ fshBuff.push(' vec4 cI=c0;')
15426
+ fshBuff.push(' vec4 cF=c1;')
15427
+ } else {
15220
15428
  const nb = colors.length - 1
15221
15429
  const nbs = nb + '.0'
15222
- fshString += ' vec4 cI;\n'
15223
- fshString += ' vec4 cF;\n'
15224
- fshString += ' if(t<1.0/' + nbs + ') { cI=c0; cF=c1; t=t*' + nbs + '; }\n'
15430
+ fshBuff.push(' vec4 cI;')
15431
+ fshBuff.push(' vec4 cF;')
15432
+ fshBuff.push(' if(t<1.0/' + nbs + ') { cI=c0; cF=c1; t=t*' + nbs + '; }')
15225
15433
  for (let i = 2; i < nb; i++)
15226
- fshString +=
15434
+ fshBuff.push(
15227
15435
  ' else if(t<' +
15228
15436
  i +
15229
15437
  '.0/' +
@@ -15236,16 +15444,17 @@ class WebGLSquareColoringAdvanced {
15236
15444
  nbs +
15237
15445
  '*t-' +
15238
15446
  (i - 1) +
15239
- '.0; }\n'
15240
- fshString +=
15241
- ' else { cI=c' + (nb - 1) + '; cF=c' + nb + '; t=' + nbs + '*t-' + (nb - 1) + '.0; }\n'
15447
+ '.0; }')
15448
+ fshBuff.push(' else { cI=c' + (nb - 1) + '; cF=c' + nb + '; t=' + nbs + '*t-' + (nb - 1) + '.0; }')
15242
15449
  }
15243
15450
 
15244
15451
  //one single color
15245
- if (colors.length == 1) fshString += ' gl_FragColor = vec4(c0[0], c0[1], c0[2], c0[3]);}\n'
15452
+ if (colors.length == 1) fshBuff.push(' gl_FragColor = vec4(c0[0], c0[1], c0[2], c0[3]);}')
15246
15453
  //set interpolated color, between initial and final one
15247
- else fshString += ' gl_FragColor = mix(cI, cF, t);}\n'
15454
+ else fshBuff.push(' gl_FragColor = mix(cI, cF, t);}')
15248
15455
 
15456
+ let fshString = fshBuff.join("")
15457
+ //let fshString = fshBuff.join("\n")
15249
15458
  //console.log(fshString)
15250
15459
 
15251
15460
  /** @type {WebGLShader} */
@@ -15271,12 +15480,9 @@ class WebGLSquareColoringAdvanced {
15271
15480
  let opacity = c.opacity
15272
15481
  if (c.opacity == 1 && globalOpacity != undefined) opacity = globalOpacity
15273
15482
 
15274
- gl.uniform4fv(gl.getUniformLocation(this.program, 'c' + i), [
15275
- +c.r / 255.0,
15276
- +c.g / 255.0,
15277
- +c.b / 255.0,
15278
- +opacity,
15279
- ])
15483
+ const colData = [+c.r / 255.0, +c.g / 255.0, +c.b / 255.0, +opacity]
15484
+ //console.log(i, colors[i], c, colData)
15485
+ gl.uniform4fv(gl.getUniformLocation(this.program, 'c' + i), colData)
15280
15486
  }
15281
15487
  }
15282
15488
 
@@ -15321,155 +15527,6 @@ class WebGLSquareColoringAdvanced {
15321
15527
  }
15322
15528
 
15323
15529
 
15324
- /***/ }),
15325
-
15326
- /***/ "./src/utils/WebGLSquareColoringCatAdvanced.js":
15327
- /*!*****************************************************!*\
15328
- !*** ./src/utils/WebGLSquareColoringCatAdvanced.js ***!
15329
- \*****************************************************/
15330
- /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
15331
-
15332
- __webpack_require__.r(__webpack_exports__);
15333
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
15334
- /* harmony export */ WebGLSquareColoringCatAdvanced: () => (/* binding */ WebGLSquareColoringCatAdvanced)
15335
- /* harmony export */ });
15336
- /* harmony import */ var _webGLUtils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./webGLUtils.js */ "./src/utils/webGLUtils.js");
15337
- /* harmony import */ var d3_color__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! d3-color */ "./node_modules/d3-color/src/color.js");
15338
- //@ts-check
15339
-
15340
-
15341
- ;
15342
-
15343
-
15344
- /**
15345
- * Everything to easily draw colored squares with webGL.
15346
- * All the same size, but different fill color.
15347
- * Color based on categories.
15348
- */
15349
- class WebGLSquareColoringCatAdvanced {
15350
- /**
15351
- * @param {Array.<string>} colors
15352
- */
15353
- constructor(colors) {
15354
- /**
15355
- * @type {Array.<string>} */
15356
- this.colors = colors
15357
-
15358
- /** Vector shader program
15359
- * @type {string} */
15360
- this.vshString = `
15361
- attribute vec2 pos;
15362
- uniform float sizePix;
15363
- uniform mat3 mat;
15364
-
15365
- attribute float i;
15366
- varying float vi;
15367
-
15368
- void main() {
15369
- gl_Position = vec4(mat * vec3(pos, 1.0), 1.0);
15370
- gl_PointSize = sizePix;
15371
- vi = i;
15372
- }
15373
- `
15374
-
15375
- //prepare fragment shader code
15376
- //declare the uniform and other variables
15377
- const out = []
15378
- out.push('precision mediump float;\nvarying float vi;\n')
15379
- //add color uniforms
15380
- out.push('uniform vec4')
15381
- for (let i = 0; i < colors.length; i++) {
15382
- if (i > 0) out.push(',')
15383
- out.push(' c' + i)
15384
- }
15385
- out.push(';\n')
15386
- //start the main function
15387
- out.push('void main(void) {\n')
15388
- //choose color i
15389
- for (let i = 0; i < colors.length; i++) {
15390
- if (i > 0) out.push('else ')
15391
- out.push('if(vi==')
15392
- out.push(i)
15393
- out.push('.0) gl_FragColor = vec4(c')
15394
- out.push(i)
15395
- out.push('[0], c')
15396
- out.push(i)
15397
- out.push('[1], c')
15398
- out.push(i)
15399
- out.push('[2], c')
15400
- out.push(i)
15401
- out.push('[3]);\n')
15402
- }
15403
- out.push('else gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);\n}')
15404
- /** Fragment shader program
15405
- * @type {string} */
15406
- this.fshString = out.join('')
15407
- }
15408
-
15409
- /** */
15410
- draw(gl, verticesBuffer, iBuffer, transfoMat, sizePix = 10) {
15411
- /** @type {WebGLShader} */
15412
- const vShader = (0,_webGLUtils_js__WEBPACK_IMPORTED_MODULE_0__.createShader)(gl, gl.VERTEX_SHADER, this.vshString)
15413
-
15414
- /** @type {WebGLShader} */
15415
- const fShader = (0,_webGLUtils_js__WEBPACK_IMPORTED_MODULE_0__.createShader)(gl, gl.FRAGMENT_SHADER, this.fshString)
15416
-
15417
- /** @type {WebGLProgram} */
15418
- const program = (0,_webGLUtils_js__WEBPACK_IMPORTED_MODULE_0__.initShaderProgram)(gl, vShader, fShader)
15419
- gl.useProgram(program)
15420
-
15421
- //set uniforms
15422
-
15423
- //sizePix
15424
- gl.uniform1f(gl.getUniformLocation(program, 'sizePix'), 1.0 * sizePix)
15425
-
15426
- //colors
15427
- for (let i = 0; i < this.colors.length; i++) {
15428
- const c = (0,d3_color__WEBPACK_IMPORTED_MODULE_1__["default"])(this.colors[i])
15429
- gl.uniform4fv(gl.getUniformLocation(program, 'c' + i), [
15430
- +c.r / 255.0,
15431
- +c.g / 255.0,
15432
- +c.b / 255.0,
15433
- +c.opacity,
15434
- ])
15435
- }
15436
-
15437
- //vertice data
15438
- gl.bindBuffer(gl.ARRAY_BUFFER, gl.createBuffer())
15439
- gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(verticesBuffer), gl.STATIC_DRAW)
15440
- const position = gl.getAttribLocation(program, 'pos')
15441
- gl.vertexAttribPointer(
15442
- position,
15443
- 2, //numComponents
15444
- gl.FLOAT, //type
15445
- false, //normalise
15446
- 0, //stride
15447
- 0 //offset
15448
- )
15449
- gl.enableVertexAttribArray(position)
15450
-
15451
- //i data
15452
- gl.bindBuffer(gl.ARRAY_BUFFER, gl.createBuffer())
15453
- gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(iBuffer), gl.STATIC_DRAW)
15454
- const i = gl.getAttribLocation(program, 'i')
15455
- gl.vertexAttribPointer(i, 1, gl.FLOAT, false, 0, 0)
15456
- gl.enableVertexAttribArray(i)
15457
-
15458
- //transformation
15459
- gl.uniformMatrix3fv(gl.getUniformLocation(program, 'mat'), false, new Float32Array(transfoMat))
15460
-
15461
- // Enable the depth test
15462
- //gl.enable(gl.DEPTH_TEST);
15463
- // Clear the color buffer bit
15464
- gl.clear(gl.COLOR_BUFFER_BIT)
15465
- // Set the view port
15466
- //gl.viewport(0, 0, cg.w, cg.h);
15467
-
15468
- gl.drawArrays(gl.POINTS, 0, verticesBuffer.length / 2)
15469
- }
15470
- }
15471
-
15472
-
15473
15530
  /***/ }),
15474
15531
 
15475
15532
  /***/ "./src/utils/scale.js":
@@ -15488,7 +15545,8 @@ __webpack_require__.r(__webpack_exports__);
15488
15545
  /* harmony export */ viewScaleColor: () => (/* binding */ viewScaleColor),
15489
15546
  /* harmony export */ viewScaleColorQuantile: () => (/* binding */ viewScaleColorQuantile),
15490
15547
  /* harmony export */ viewScaleCombination: () => (/* binding */ viewScaleCombination),
15491
- /* harmony export */ viewScaleQuantile: () => (/* binding */ viewScaleQuantile)
15548
+ /* harmony export */ viewScaleQuantile: () => (/* binding */ viewScaleQuantile),
15549
+ /* harmony export */ viewScaleQuantileClassifer: () => (/* binding */ viewScaleQuantileClassifer)
15492
15550
  /* harmony export */ });
15493
15551
  /* harmony import */ var d3_array__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3-array */ "./node_modules/d3-array/src/max.js");
15494
15552
  /* harmony import */ var d3_array__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! d3-array */ "./node_modules/d3-array/src/extent.js");
@@ -15646,6 +15704,28 @@ const viewScaleColorQuantile = (opts) => {
15646
15704
  }
15647
15705
  }
15648
15706
 
15707
+
15708
+ /**
15709
+ * Generic function for view scale quantile classifier
15710
+ *
15711
+ * @param {{ valueFunction:function(import("../core/Dataset").Cell):number, classNumber?:number }} opts
15712
+ * @returns {function(Array.<import("../core/Dataset").Cell>):ColorScale}
15713
+ */
15714
+ const viewScaleQuantileClassifer = (opts) => {
15715
+ const valueFunction = opts.valueFunction // the function that return the cell value from a cell
15716
+ const classNumber = opts.classNumber || 12 // the class number
15717
+
15718
+ const scale = (0,d3_scale__WEBPACK_IMPORTED_MODULE_1__["default"])().range(Array.from( { length: classNumber }, (_, i) => i ))
15719
+ return (cells) => {
15720
+ scale.domain(cells.map(valueFunction))
15721
+ scale.breaks = scale.quantiles()
15722
+ return scale
15723
+ }
15724
+ }
15725
+
15726
+
15727
+
15728
+
15649
15729
  /**
15650
15730
  * Combine view scale functions
15651
15731
  *
@@ -16186,18 +16266,19 @@ __webpack_require__.r(__webpack_exports__);
16186
16266
  * @param {string} width
16187
16267
  * @param {string} height
16188
16268
  * @param {object} opts
16189
- * @returns {{canvas:HTMLCanvasElement, gl:WebGLRenderingContext}}
16269
+ * @returns {{canvas:HTMLCanvasElement, gl:WebGLRenderingContext, width:number, height:number }}
16190
16270
  */
16191
16271
  function makeWebGLCanvas(width, height, opts = {}) {
16192
16272
  const canvas = document.createElement('canvas')
16193
16273
  canvas.setAttribute('width', width)
16194
16274
  canvas.setAttribute('height', height)
16275
+ const version2 = (opts && +opts.version==2)? "2" : ""
16195
16276
  /** @type {WebGLRenderingContext} */
16196
- const gl = canvas.getContext('webgl', opts)
16277
+ const gl = canvas.getContext('webgl' + version2, opts)
16197
16278
  if (!gl) {
16198
- throw new Error('Unable to initialize WebGL. Your browser or machine may not support it.')
16279
+ throw new Error('Unable to initialize WebGL'+version2+'. Your browser or machine may not support it.')
16199
16280
  }
16200
- return { canvas: canvas, gl: gl }
16281
+ return { canvas: canvas, gl: gl, width: width, height: height }
16201
16282
  }
16202
16283
 
16203
16284
  /**
@@ -16383,7 +16464,8 @@ __webpack_require__.r(__webpack_exports__);
16383
16464
  /* harmony export */ viewScaleColor: () => (/* reexport safe */ _utils_scale_js__WEBPACK_IMPORTED_MODULE_42__.viewScaleColor),
16384
16465
  /* harmony export */ viewScaleColorQuantile: () => (/* reexport safe */ _utils_scale_js__WEBPACK_IMPORTED_MODULE_42__.viewScaleColorQuantile),
16385
16466
  /* harmony export */ viewScaleCombination: () => (/* reexport safe */ _utils_scale_js__WEBPACK_IMPORTED_MODULE_42__.viewScaleCombination),
16386
- /* harmony export */ viewScaleQuantile: () => (/* reexport safe */ _utils_scale_js__WEBPACK_IMPORTED_MODULE_42__.viewScaleQuantile)
16467
+ /* harmony export */ viewScaleQuantile: () => (/* reexport safe */ _utils_scale_js__WEBPACK_IMPORTED_MODULE_42__.viewScaleQuantile),
16468
+ /* harmony export */ viewScaleQuantileClassifer: () => (/* reexport safe */ _utils_scale_js__WEBPACK_IMPORTED_MODULE_42__.viewScaleQuantileClassifer)
16387
16469
  /* harmony export */ });
16388
16470
  /* harmony import */ var _core_Map_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./core/Map.js */ "./src/core/Map.js");
16389
16471
  /* harmony import */ var _core_GeoCanvas_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./core/GeoCanvas.js */ "./src/core/GeoCanvas.js");
@@ -16509,4 +16591,4 @@ const getParameterByName = _core_GeoCanvas_js__WEBPACK_IMPORTED_MODULE_1__.GeoCa
16509
16591
  /******/ })()
16510
16592
  ;
16511
16593
  });
16512
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUF5QixJQUFJO0FBQzdCLHdDQUF3QyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUk7QUFDMUQsd0NBQXdDLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSTtBQUMxRCwwQ0FBMEMsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSTtBQUNuRSwwQ0FBMEMsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSTtBQUNuRSx3Q0FBd0MsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJO0FBQzFELDBDQUEwQyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJOztBQUVuRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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QUFtQyxlQUFlLFlBQVksU0FBUztBQUN2RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7OztBQ3hIb0M7O0FBRXBDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLDBCQUEwQiw4Q0FBTTtBQUN2QztBQUNBLGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNB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QUNBLG1CQUFtQixRQUFRO0FBQzNCOztBQUVBO0FBQ0EsbUJBQW1CLFFBQVE7QUFDM0I7QUFDQTtBQUNBLG1CQUFtQixRQUFRO0FBQzNCO0FBQ0EsbUJBQW1CLFFBQVE7QUFDM0I7O0FBRUEsbUJBQW1CLFFBQVE7QUFDM0I7QUFDQSxtQkFBbUIsUUFBUTtBQUMzQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsd0NBQXdDO0FBQ3ZELGVBQWUsdUNBQXVDO0FBQ3RELGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsNENBQTRDLHNDQUFzQztBQUNsRjs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsa0JBQWtCO0FBQ3pDO0FBQ0E7O0FBRUE7QUFDQSx1QkFBdUIsa0JBQWtCO0FBQ3pDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsa0JBQWtCO0FBQ3pDO0FBQ0E7O0FBRUE7QUFDQSx1QkFBdUIsa0JBQWtCO0FBQ3pDO0FBQ0E7O0FBRUE7QUFDQSx1QkFBdUIsa0JBQWtCO0FBQ3pDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtB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Q1k7QUFDTTtBQUNJO0FBQ3BCO0FBQ0k7O0FBRXREO0FBQ3FEO0FBQ2dCO0FBQ0E7QUFPdEM7QUFDcUQ7QUFDM0I7O0FBRXpELFlBQVksdUJBQXVCO0FBQ0U7QUFDTDtBQUNFO0FBQ0s7O0FBRXZDLENBQStDO0FBQ3hDLDJCQUEyQix5REFBUzs7QUFFM0M7QUFDQSxDQUErQztBQUMvQyxzREFBbUI7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZ3JpZHZpei93ZWJwYWNrL3VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24iLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvYXNjZW5kaW5nLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL2Jpc2VjdC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9iaXNlY3Rvci5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9kZXNjZW5kaW5nLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL2V4dGVudC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9ncmVhdGVzdC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9tYXguanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvbWF4SW5kZXguanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvbWluLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL21pbkluZGV4LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL251bWJlci5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9wZXJtdXRlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL3F1YW50aWxlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL3F1aWNrc2VsZWN0LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL3NvcnQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1jb2xvci9zcmMvY29sb3IuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1jb2xvci9zcmMvZGVmaW5lLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtY29sb3Ivc3JjL2xhYi5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWNvbG9yL3NyYy9tYXRoLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtZGlzcGF0Y2gvc3JjL2Rpc3BhdGNoLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtZHJhZy9zcmMvbm9kcmFnLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtZHJhZy9zcmMvbm9ldmVudC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWRzdi9zcmMvY3N2LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtZHN2L3NyYy9kc3YuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1kc3Yvc3JjL3Rzdi5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWVhc2Uvc3JjL2N1YmljLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtZmV0Y2gvc3JjL2Rzdi5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWZldGNoL3NyYy9qc29uLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtZmV0Y2gvc3JjL3RleHQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1mb3JtYXQvc3JjL2RlZmF1bHRMb2NhbGUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1mb3JtYXQvc3JjL2V4cG9uZW50LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtZm9ybWF0L3NyYy9mb3JtYXREZWNpbWFsLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtZm9ybWF0L3NyYy9mb3JtYXRHcm91cC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvZm9ybWF0TnVtZXJhbHMuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1mb3JtYXQvc3JjL2Zvcm1hdFByZWZpeEF1dG8uanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1mb3JtYXQvc3JjL2Zvcm1hdFJvdW5kZWQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1mb3JtYXQvc3JjL2Zvcm1hdFNwZWNpZmllci5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvZm9ybWF0VHJpbS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvZm9ybWF0VHlwZXMuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1mb3JtYXQvc3JjL2lkZW50aXR5LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtZm9ybWF0L3NyYy9sb2NhbGUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvYmFzaXMuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvYmFzaXNDbG9zZWQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvY29sb3IuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvY29uc3RhbnQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvbGFiLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL251bWJlci5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy9yZ2IuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvc3RyaW5nLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL3RyYW5zZm9ybS9kZWNvbXBvc2UuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvdHJhbnNmb3JtL2luZGV4LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL3RyYW5zZm9ybS9wYXJzZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy96b29tLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtcmFuZG9tL3NyYy9kZWZhdWx0U291cmNlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtcmFuZG9tL3NyYy9ub3JtYWwuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zY2FsZS9zcmMvaW5pdC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNjYWxlL3NyYy9xdWFudGlsZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvYXJyYXkuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL2NvbnN0YW50LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9jcmVhdG9yLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9tYXRjaGVyLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9uYW1lc3BhY2UuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL25hbWVzcGFjZXMuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3BvaW50ZXIuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2FwcGVuZC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2F0dHIuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9jYWxsLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vY2xhc3NlZC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2Nsb25lLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vZGF0YS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2RhdHVtLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vZGlzcGF0Y2guanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9lYWNoLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vZW1wdHkuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9lbnRlci5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2V4aXQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9maWx0ZXIuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9odG1sLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vaW5kZXguanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9pbnNlcnQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9pdGVyYXRvci5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2pvaW4uanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9sb3dlci5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL21lcmdlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vbm9kZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL25vZGVzLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vb24uanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9vcmRlci5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3Byb3BlcnR5LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vcmFpc2UuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9yZW1vdmUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9zZWxlY3QuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9zZWxlY3RBbGwuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9zZWxlY3RDaGlsZC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3NlbGVjdENoaWxkcmVuLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vc2l6ZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3NvcnQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9zcGFyc2UuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9zdHlsZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3RleHQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdG9yLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3RvckFsbC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc291cmNlRXZlbnQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3dpbmRvdy5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXRpbWVyL3NyYy90aW1lb3V0LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtdGltZXIvc3JjL3RpbWVyLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvYWN0aXZlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy9pbnRlcnJ1cHQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy9zZWxlY3Rpb24vaW5kZXguanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy9zZWxlY3Rpb24vaW50ZXJydXB0LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvc2VsZWN0aW9uL3RyYW5zaXRpb24uanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL2F0dHIuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL2F0dHJUd2Vlbi5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vZGVsYXkuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL2R1cmF0aW9uLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9lYXNlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9lYXNlVmFyeWluZy5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vZW5kLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9maWx0ZXIuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL2luZGV4LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9pbnRlcnBvbGF0ZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vbWVyZ2UuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL29uLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9yZW1vdmUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3NjaGVkdWxlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9zZWxlY3QuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3NlbGVjdEFsbC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vc2VsZWN0aW9uLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9zdHlsZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vc3R5bGVUd2Vlbi5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vdGV4dC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vdGV4dFR3ZWVuLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi90cmFuc2l0aW9uLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi90d2Vlbi5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXpvb20vc3JjL2NvbnN0YW50LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtem9vbS9zcmMvZXZlbnQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy16b29tL3NyYy9pbmRleC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXpvb20vc3JjL25vZXZlbnQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy16b29tL3NyYy90cmFuc2Zvcm0uanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy16b29tL3NyYy96b29tLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvYnV0dG9uL0J1dHRvbi5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL2J1dHRvbi9GdWxsc2NyZWVuQnV0dG9uLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvYnV0dG9uL1pvb21CdXR0b25zLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvY29yZS9EYXRhc2V0LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvY29yZS9EcmF3YWJsZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL2NvcmUvR2VvQ2FudmFzLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvY29yZS9MYXllci5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL2NvcmUvTGVnZW5kLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvY29yZS9NYXAuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9jb3JlL011bHRpUmVzb2x1dGlvbkRhdGFzZXQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9jb3JlL1N0eWxlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvY29yZS9Ub29sdGlwLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvZGF0YXNldC9DU1ZHcmlkLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvZGF0YXNldC9KU0dyaWQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9kYXRhc2V0L1RpbGVkR3JpZC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL2xheWVyL0JhY2tncm91bmRMYXllci5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL2xheWVyL0JhY2tncm91bmRMYXllckltYWdlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvbGF5ZXIvQmFja2dyb3VuZExheWVyV01TLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvbGF5ZXIvR2VvSlNPTkxheWVyLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvbGF5ZXIvR3JpZExheWVyLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvbGF5ZXIvTGFiZWxMYXllci5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL2xlZ2VuZC9Db2xvckNhdGVnb3J5TGVnZW5kLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvbGVnZW5kL0NvbG9yRGlzY3JldGVMZWdlbmQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9sZWdlbmQvQ29sb3JMZWdlbmQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9sZWdlbmQvT3JpZW50YXRpb25MZWdlbmQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9sZWdlbmQvU2l6ZUxlZ2VuZC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL2xlZ2VuZC9UZXJuYXJ5TGVnZW5kLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvc3R5bGUvQ29tcG9zaXRpb25TdHlsZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL3N0eWxlL0RvdERlbnNpdHlTdHlsZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL3N0eWxlL0ltYWdlU3R5bGUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9zdHlsZS9Jc29GZW5jZVN0eWxlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvc3R5bGUvSm95UGxvdFN0eWxlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvc3R5bGUvTGVnb1N0eWxlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvc3R5bGUvTW9zYWljU3R5bGUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9zdHlsZS9OaW5qYVN0YXJTdHlsZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL3N0eWxlL1BpbGxhclN0eWxlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvc3R5bGUvU2VnbWVudFN0eWxlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvc3R5bGUvU2hhZGluZ1N0eWxlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvc3R5bGUvU2hhcGVDb2xvclNpemVTdHlsZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL3N0eWxlL1NpZGVDYXRlZ29yeVN0eWxlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvc3R5bGUvU2lkZVN0eWxlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvc3R5bGUvU2lkZVRhbmFrYVN0eWxlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvc3R5bGUvU3F1YXJlQ29sb3JDYXRlZ29yeVdlYkdMU3R5bGUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9zdHlsZS9TcXVhcmVDb2xvcldlYkdMU3R5bGUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9zdHlsZS9TdHJva2VTdHlsZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL3N0eWxlL1RleHRTdHlsZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL3N0eWxlL1RpbWVTZXJpZXNTdHlsZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL3V0aWxzL1dlYkdMU3F1YXJlQ29sb3JpbmcuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy91dGlscy9XZWJHTFNxdWFyZUNvbG9yaW5nQWR2YW5jZWQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy91dGlscy9XZWJHTFNxdWFyZUNvbG9yaW5nQ2F0QWR2YW5jZWQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy91dGlscy9zY2FsZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL3V0aWxzL3N0cmV0Y2hpbmcuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy91dGlscy90ZXJuYXJ5LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvdXRpbHMvdXRpbHMuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy91dGlscy93ZWJHTFV0aWxzLmpzIiwid2VicGFjazovL2dyaWR2aXovd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vZ3JpZHZpei93ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei93ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kIiwid2VicGFjazovL2dyaWR2aXovd2VicGFjay9ydW50aW1lL21ha2UgbmFtZXNwYWNlIG9iamVjdCIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFtdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcImdyaWR2aXpcIl0gPSBmYWN0b3J5KCk7XG5cdGVsc2Vcblx0XHRyb290W1wiZ3JpZHZpelwiXSA9IGZhY3RvcnkoKTtcbn0pKHNlbGYsICgpID0+IHtcbnJldHVybiAiLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBhc2NlbmRpbmcoYSwgYikge1xuICByZXR1cm4gYSA9PSBudWxsIHx8IGIgPT0gbnVsbCA/IE5hTiA6IGEgPCBiID8gLTEgOiBhID4gYiA/IDEgOiBhID49IGIgPyAwIDogTmFOO1xufVxuIiwiaW1wb3J0IGFzY2VuZGluZyBmcm9tIFwiLi9hc2NlbmRpbmcuanNcIjtcbmltcG9ydCBiaXNlY3RvciBmcm9tIFwiLi9iaXNlY3Rvci5qc1wiO1xuaW1wb3J0IG51bWJlciBmcm9tIFwiLi9udW1iZXIuanNcIjtcblxuY29uc3QgYXNjZW5kaW5nQmlzZWN0ID0gYmlzZWN0b3IoYXNjZW5kaW5nKTtcbmV4cG9ydCBjb25zdCBiaXNlY3RSaWdodCA9IGFzY2VuZGluZ0Jpc2VjdC5yaWdodDtcbmV4cG9ydCBjb25zdCBiaXNlY3RMZWZ0ID0gYXNjZW5kaW5nQmlzZWN0LmxlZnQ7XG5leHBvcnQgY29uc3QgYmlzZWN0Q2VudGVyID0gYmlzZWN0b3IobnVtYmVyKS5jZW50ZXI7XG5leHBvcnQgZGVmYXVsdCBiaXNlY3RSaWdodDtcbiIsImltcG9ydCBhc2NlbmRpbmcgZnJvbSBcIi4vYXNjZW5kaW5nLmpzXCI7XG5pbXBvcnQgZGVzY2VuZGluZyBmcm9tIFwiLi9kZXNjZW5kaW5nLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGJpc2VjdG9yKGYpIHtcbiAgbGV0IGNvbXBhcmUxLCBjb21wYXJlMiwgZGVsdGE7XG5cbiAgLy8gSWYgYW4gYWNjZXNzb3IgaXMgc3BlY2lmaWVkLCBwcm9tb3RlIGl0IHRvIGEgY29tcGFyYXRvci4gSW4gdGhpcyBjYXNlIHdlXG4gIC8vIGNhbiB0ZXN0IHdoZXRoZXIgdGhlIHNlYXJjaCB2YWx1ZSBpcyAoc2VsZi0pIGNvbXBhcmFibGUuIFdlIGNhbuKAmXQgZG8gdGhpc1xuICAvLyBmb3IgYSBjb21wYXJhdG9yIChleGNlcHQgZm9yIHNwZWNpZmljLCBrbm93biBjb21wYXJhdG9ycykgYmVjYXVzZSB3ZSBjYW7igJl0XG4gIC8vIHRlbGwgaWYgdGhlIGNvbXBhcmF0b3IgaXMgc3ltbWV0cmljLCBhbmQgYW4gYXN5bW1ldHJpYyBjb21wYXJhdG9yIGNhbuKAmXQgYmVcbiAgLy8gdXNlZCB0byB0ZXN0IHdoZXRoZXIgYSBzaW5nbGUgdmFsdWUgaXMgY29tcGFyYWJsZS5cbiAgaWYgKGYubGVuZ3RoICE9PSAyKSB7XG4gICAgY29tcGFyZTEgPSBhc2NlbmRpbmc7XG4gICAgY29tcGFyZTIgPSAoZCwgeCkgPT4gYXNjZW5kaW5nKGYoZCksIHgpO1xuICAgIGRlbHRhID0gKGQsIHgpID0+IGYoZCkgLSB4O1xuICB9IGVsc2Uge1xuICAgIGNvbXBhcmUxID0gZiA9PT0gYXNjZW5kaW5nIHx8IGYgPT09IGRlc2NlbmRpbmcgPyBmIDogemVybztcbiAgICBjb21wYXJlMiA9IGY7XG4gICAgZGVsdGEgPSBmO1xuICB9XG5cbiAgZnVuY3Rpb24gbGVmdChhLCB4LCBsbyA9IDAsIGhpID0gYS5sZW5ndGgpIHtcbiAgICBpZiAobG8gPCBoaSkge1xuICAgICAgaWYgKGNvbXBhcmUxKHgsIHgpICE9PSAwKSByZXR1cm4gaGk7XG4gICAgICBkbyB7XG4gICAgICAgIGNvbnN0IG1pZCA9IChsbyArIGhpKSA+Pj4gMTtcbiAgICAgICAgaWYgKGNvbXBhcmUyKGFbbWlkXSwgeCkgPCAwKSBsbyA9IG1pZCArIDE7XG4gICAgICAgIGVsc2UgaGkgPSBtaWQ7XG4gICAgICB9IHdoaWxlIChsbyA8IGhpKTtcbiAgICB9XG4gICAgcmV0dXJuIGxvO1xuICB9XG5cbiAgZnVuY3Rpb24gcmlnaHQoYSwgeCwgbG8gPSAwLCBoaSA9IGEubGVuZ3RoKSB7XG4gICAgaWYgKGxvIDwgaGkpIHtcbiAgICAgIGlmIChjb21wYXJlMSh4LCB4KSAhPT0gMCkgcmV0dXJuIGhpO1xuICAgICAgZG8ge1xuICAgICAgICBjb25zdCBtaWQgPSAobG8gKyBoaSkgPj4+IDE7XG4gICAgICAgIGlmIChjb21wYXJlMihhW21pZF0sIHgpIDw9IDApIGxvID0gbWlkICsgMTtcbiAgICAgICAgZWxzZSBoaSA9IG1pZDtcbiAgICAgIH0gd2hpbGUgKGxvIDwgaGkpO1xuICAgIH1cbiAgICByZXR1cm4gbG87XG4gIH1cblxuICBmdW5jdGlvbiBjZW50ZXIoYSwgeCwgbG8gPSAwLCBoaSA9IGEubGVuZ3RoKSB7XG4gICAgY29uc3QgaSA9IGxlZnQoYSwgeCwgbG8sIGhpIC0gMSk7XG4gICAgcmV0dXJuIGkgPiBsbyAmJiBkZWx0YShhW2kgLSAxXSwgeCkgPiAtZGVsdGEoYVtpXSwgeCkgPyBpIC0gMSA6IGk7XG4gIH1cblxuICByZXR1cm4ge2xlZnQsIGNlbnRlciwgcmlnaHR9O1xufVxuXG5mdW5jdGlvbiB6ZXJvKCkge1xuICByZXR1cm4gMDtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGRlc2NlbmRpbmcoYSwgYikge1xuICByZXR1cm4gYSA9PSBudWxsIHx8IGIgPT0gbnVsbCA/IE5hTlxuICAgIDogYiA8IGEgPyAtMVxuICAgIDogYiA+IGEgPyAxXG4gICAgOiBiID49IGEgPyAwXG4gICAgOiBOYU47XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBleHRlbnQodmFsdWVzLCB2YWx1ZW9mKSB7XG4gIGxldCBtaW47XG4gIGxldCBtYXg7XG4gIGlmICh2YWx1ZW9mID09PSB1bmRlZmluZWQpIHtcbiAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgaWYgKG1pbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKHZhbHVlID49IHZhbHVlKSBtaW4gPSBtYXggPSB2YWx1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAobWluID4gdmFsdWUpIG1pbiA9IHZhbHVlO1xuICAgICAgICAgIGlmIChtYXggPCB2YWx1ZSkgbWF4ID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbGV0IGluZGV4ID0gLTE7XG4gICAgZm9yIChsZXQgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICBpZiAoKHZhbHVlID0gdmFsdWVvZih2YWx1ZSwgKytpbmRleCwgdmFsdWVzKSkgIT0gbnVsbCkge1xuICAgICAgICBpZiAobWluID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAodmFsdWUgPj0gdmFsdWUpIG1pbiA9IG1heCA9IHZhbHVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChtaW4gPiB2YWx1ZSkgbWluID0gdmFsdWU7XG4gICAgICAgICAgaWYgKG1heCA8IHZhbHVlKSBtYXggPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gW21pbiwgbWF4XTtcbn1cbiIsImltcG9ydCBhc2NlbmRpbmcgZnJvbSBcIi4vYXNjZW5kaW5nLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdyZWF0ZXN0KHZhbHVlcywgY29tcGFyZSA9IGFzY2VuZGluZykge1xuICBsZXQgbWF4O1xuICBsZXQgZGVmaW5lZCA9IGZhbHNlO1xuICBpZiAoY29tcGFyZS5sZW5ndGggPT09IDEpIHtcbiAgICBsZXQgbWF4VmFsdWU7XG4gICAgZm9yIChjb25zdCBlbGVtZW50IG9mIHZhbHVlcykge1xuICAgICAgY29uc3QgdmFsdWUgPSBjb21wYXJlKGVsZW1lbnQpO1xuICAgICAgaWYgKGRlZmluZWRcbiAgICAgICAgICA/IGFzY2VuZGluZyh2YWx1ZSwgbWF4VmFsdWUpID4gMFxuICAgICAgICAgIDogYXNjZW5kaW5nKHZhbHVlLCB2YWx1ZSkgPT09IDApIHtcbiAgICAgICAgbWF4ID0gZWxlbWVudDtcbiAgICAgICAgbWF4VmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgZGVmaW5lZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICBpZiAoZGVmaW5lZFxuICAgICAgICAgID8gY29tcGFyZSh2YWx1ZSwgbWF4KSA+IDBcbiAgICAgICAgICA6IGNvbXBhcmUodmFsdWUsIHZhbHVlKSA9PT0gMCkge1xuICAgICAgICBtYXggPSB2YWx1ZTtcbiAgICAgICAgZGVmaW5lZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBtYXg7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtYXgodmFsdWVzLCB2YWx1ZW9mKSB7XG4gIGxldCBtYXg7XG4gIGlmICh2YWx1ZW9mID09PSB1bmRlZmluZWQpIHtcbiAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgICAgaWYgKHZhbHVlICE9IG51bGxcbiAgICAgICAgICAmJiAobWF4IDwgdmFsdWUgfHwgKG1heCA9PT0gdW5kZWZpbmVkICYmIHZhbHVlID49IHZhbHVlKSkpIHtcbiAgICAgICAgbWF4ID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGxldCBpbmRleCA9IC0xO1xuICAgIGZvciAobGV0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgICAgaWYgKCh2YWx1ZSA9IHZhbHVlb2YodmFsdWUsICsraW5kZXgsIHZhbHVlcykpICE9IG51bGxcbiAgICAgICAgICAmJiAobWF4IDwgdmFsdWUgfHwgKG1heCA9PT0gdW5kZWZpbmVkICYmIHZhbHVlID49IHZhbHVlKSkpIHtcbiAgICAgICAgbWF4ID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBtYXg7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtYXhJbmRleCh2YWx1ZXMsIHZhbHVlb2YpIHtcbiAgbGV0IG1heDtcbiAgbGV0IG1heEluZGV4ID0gLTE7XG4gIGxldCBpbmRleCA9IC0xO1xuICBpZiAodmFsdWVvZiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICAgICsraW5kZXg7XG4gICAgICBpZiAodmFsdWUgIT0gbnVsbFxuICAgICAgICAgICYmIChtYXggPCB2YWx1ZSB8fCAobWF4ID09PSB1bmRlZmluZWQgJiYgdmFsdWUgPj0gdmFsdWUpKSkge1xuICAgICAgICBtYXggPSB2YWx1ZSwgbWF4SW5kZXggPSBpbmRleDtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZm9yIChsZXQgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICBpZiAoKHZhbHVlID0gdmFsdWVvZih2YWx1ZSwgKytpbmRleCwgdmFsdWVzKSkgIT0gbnVsbFxuICAgICAgICAgICYmIChtYXggPCB2YWx1ZSB8fCAobWF4ID09PSB1bmRlZmluZWQgJiYgdmFsdWUgPj0gdmFsdWUpKSkge1xuICAgICAgICBtYXggPSB2YWx1ZSwgbWF4SW5kZXggPSBpbmRleDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1heEluZGV4O1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbWluKHZhbHVlcywgdmFsdWVvZikge1xuICBsZXQgbWluO1xuICBpZiAodmFsdWVvZiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICAgIGlmICh2YWx1ZSAhPSBudWxsXG4gICAgICAgICAgJiYgKG1pbiA+IHZhbHVlIHx8IChtaW4gPT09IHVuZGVmaW5lZCAmJiB2YWx1ZSA+PSB2YWx1ZSkpKSB7XG4gICAgICAgIG1pbiA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBsZXQgaW5kZXggPSAtMTtcbiAgICBmb3IgKGxldCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICAgIGlmICgodmFsdWUgPSB2YWx1ZW9mKHZhbHVlLCArK2luZGV4LCB2YWx1ZXMpKSAhPSBudWxsXG4gICAgICAgICAgJiYgKG1pbiA+IHZhbHVlIHx8IChtaW4gPT09IHVuZGVmaW5lZCAmJiB2YWx1ZSA+PSB2YWx1ZSkpKSB7XG4gICAgICAgIG1pbiA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gbWluO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbWluSW5kZXgodmFsdWVzLCB2YWx1ZW9mKSB7XG4gIGxldCBtaW47XG4gIGxldCBtaW5JbmRleCA9IC0xO1xuICBsZXQgaW5kZXggPSAtMTtcbiAgaWYgKHZhbHVlb2YgPT09IHVuZGVmaW5lZCkge1xuICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICArK2luZGV4O1xuICAgICAgaWYgKHZhbHVlICE9IG51bGxcbiAgICAgICAgICAmJiAobWluID4gdmFsdWUgfHwgKG1pbiA9PT0gdW5kZWZpbmVkICYmIHZhbHVlID49IHZhbHVlKSkpIHtcbiAgICAgICAgbWluID0gdmFsdWUsIG1pbkluZGV4ID0gaW5kZXg7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGZvciAobGV0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgICAgaWYgKCh2YWx1ZSA9IHZhbHVlb2YodmFsdWUsICsraW5kZXgsIHZhbHVlcykpICE9IG51bGxcbiAgICAgICAgICAmJiAobWluID4gdmFsdWUgfHwgKG1pbiA9PT0gdW5kZWZpbmVkICYmIHZhbHVlID49IHZhbHVlKSkpIHtcbiAgICAgICAgbWluID0gdmFsdWUsIG1pbkluZGV4ID0gaW5kZXg7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBtaW5JbmRleDtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG51bWJlcih4KSB7XG4gIHJldHVybiB4ID09PSBudWxsID8gTmFOIDogK3g7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiogbnVtYmVycyh2YWx1ZXMsIHZhbHVlb2YpIHtcbiAgaWYgKHZhbHVlb2YgPT09IHVuZGVmaW5lZCkge1xuICAgIGZvciAobGV0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgKHZhbHVlID0gK3ZhbHVlKSA+PSB2YWx1ZSkge1xuICAgICAgICB5aWVsZCB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbGV0IGluZGV4ID0gLTE7XG4gICAgZm9yIChsZXQgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICBpZiAoKHZhbHVlID0gdmFsdWVvZih2YWx1ZSwgKytpbmRleCwgdmFsdWVzKSkgIT0gbnVsbCAmJiAodmFsdWUgPSArdmFsdWUpID49IHZhbHVlKSB7XG4gICAgICAgIHlpZWxkIHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcGVybXV0ZShzb3VyY2UsIGtleXMpIHtcbiAgcmV0dXJuIEFycmF5LmZyb20oa2V5cywga2V5ID0+IHNvdXJjZVtrZXldKTtcbn1cbiIsImltcG9ydCBtYXggZnJvbSBcIi4vbWF4LmpzXCI7XG5pbXBvcnQgbWF4SW5kZXggZnJvbSBcIi4vbWF4SW5kZXguanNcIjtcbmltcG9ydCBtaW4gZnJvbSBcIi4vbWluLmpzXCI7XG5pbXBvcnQgbWluSW5kZXggZnJvbSBcIi4vbWluSW5kZXguanNcIjtcbmltcG9ydCBxdWlja3NlbGVjdCBmcm9tIFwiLi9xdWlja3NlbGVjdC5qc1wiO1xuaW1wb3J0IG51bWJlciwge251bWJlcnN9IGZyb20gXCIuL251bWJlci5qc1wiO1xuaW1wb3J0IHthc2NlbmRpbmdEZWZpbmVkfSBmcm9tIFwiLi9zb3J0LmpzXCI7XG5pbXBvcnQgZ3JlYXRlc3QgZnJvbSBcIi4vZ3JlYXRlc3QuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcXVhbnRpbGUodmFsdWVzLCBwLCB2YWx1ZW9mKSB7XG4gIHZhbHVlcyA9IEZsb2F0NjRBcnJheS5mcm9tKG51bWJlcnModmFsdWVzLCB2YWx1ZW9mKSk7XG4gIGlmICghKG4gPSB2YWx1ZXMubGVuZ3RoKSB8fCBpc05hTihwID0gK3ApKSByZXR1cm47XG4gIGlmIChwIDw9IDAgfHwgbiA8IDIpIHJldHVybiBtaW4odmFsdWVzKTtcbiAgaWYgKHAgPj0gMSkgcmV0dXJuIG1heCh2YWx1ZXMpO1xuICB2YXIgbixcbiAgICAgIGkgPSAobiAtIDEpICogcCxcbiAgICAgIGkwID0gTWF0aC5mbG9vcihpKSxcbiAgICAgIHZhbHVlMCA9IG1heChxdWlja3NlbGVjdCh2YWx1ZXMsIGkwKS5zdWJhcnJheSgwLCBpMCArIDEpKSxcbiAgICAgIHZhbHVlMSA9IG1pbih2YWx1ZXMuc3ViYXJyYXkoaTAgKyAxKSk7XG4gIHJldHVybiB2YWx1ZTAgKyAodmFsdWUxIC0gdmFsdWUwKSAqIChpIC0gaTApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcXVhbnRpbGVTb3J0ZWQodmFsdWVzLCBwLCB2YWx1ZW9mID0gbnVtYmVyKSB7XG4gIGlmICghKG4gPSB2YWx1ZXMubGVuZ3RoKSB8fCBpc05hTihwID0gK3ApKSByZXR1cm47XG4gIGlmIChwIDw9IDAgfHwgbiA8IDIpIHJldHVybiArdmFsdWVvZih2YWx1ZXNbMF0sIDAsIHZhbHVlcyk7XG4gIGlmIChwID49IDEpIHJldHVybiArdmFsdWVvZih2YWx1ZXNbbiAtIDFdLCBuIC0gMSwgdmFsdWVzKTtcbiAgdmFyIG4sXG4gICAgICBpID0gKG4gLSAxKSAqIHAsXG4gICAgICBpMCA9IE1hdGguZmxvb3IoaSksXG4gICAgICB2YWx1ZTAgPSArdmFsdWVvZih2YWx1ZXNbaTBdLCBpMCwgdmFsdWVzKSxcbiAgICAgIHZhbHVlMSA9ICt2YWx1ZW9mKHZhbHVlc1tpMCArIDFdLCBpMCArIDEsIHZhbHVlcyk7XG4gIHJldHVybiB2YWx1ZTAgKyAodmFsdWUxIC0gdmFsdWUwKSAqIChpIC0gaTApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcXVhbnRpbGVJbmRleCh2YWx1ZXMsIHAsIHZhbHVlb2YgPSBudW1iZXIpIHtcbiAgaWYgKGlzTmFOKHAgPSArcCkpIHJldHVybjtcbiAgbnVtYmVycyA9IEZsb2F0NjRBcnJheS5mcm9tKHZhbHVlcywgKF8sIGkpID0+IG51bWJlcih2YWx1ZW9mKHZhbHVlc1tpXSwgaSwgdmFsdWVzKSkpO1xuICBpZiAocCA8PSAwKSByZXR1cm4gbWluSW5kZXgobnVtYmVycyk7XG4gIGlmIChwID49IDEpIHJldHVybiBtYXhJbmRleChudW1iZXJzKTtcbiAgdmFyIG51bWJlcnMsXG4gICAgICBpbmRleCA9IFVpbnQzMkFycmF5LmZyb20odmFsdWVzLCAoXywgaSkgPT4gaSksXG4gICAgICBqID0gbnVtYmVycy5sZW5ndGggLSAxLFxuICAgICAgaSA9IE1hdGguZmxvb3IoaiAqIHApO1xuICBxdWlja3NlbGVjdChpbmRleCwgaSwgMCwgaiwgKGksIGopID0+IGFzY2VuZGluZ0RlZmluZWQobnVtYmVyc1tpXSwgbnVtYmVyc1tqXSkpO1xuICBpID0gZ3JlYXRlc3QoaW5kZXguc3ViYXJyYXkoMCwgaSArIDEpLCAoaSkgPT4gbnVtYmVyc1tpXSk7XG4gIHJldHVybiBpID49IDAgPyBpIDogLTE7XG59XG4iLCJpbXBvcnQge2FzY2VuZGluZ0RlZmluZWQsIGNvbXBhcmVEZWZpbmVkfSBmcm9tIFwiLi9zb3J0LmpzXCI7XG5cbi8vIEJhc2VkIG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9tb3VybmVyL3F1aWNrc2VsZWN0XG4vLyBJU0MgbGljZW5zZSwgQ29weXJpZ2h0IDIwMTggVmxhZGltaXIgQWdhZm9ua2luLlxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcXVpY2tzZWxlY3QoYXJyYXksIGssIGxlZnQgPSAwLCByaWdodCA9IEluZmluaXR5LCBjb21wYXJlKSB7XG4gIGsgPSBNYXRoLmZsb29yKGspO1xuICBsZWZ0ID0gTWF0aC5mbG9vcihNYXRoLm1heCgwLCBsZWZ0KSk7XG4gIHJpZ2h0ID0gTWF0aC5mbG9vcihNYXRoLm1pbihhcnJheS5sZW5ndGggLSAxLCByaWdodCkpO1xuXG4gIGlmICghKGxlZnQgPD0gayAmJiBrIDw9IHJpZ2h0KSkgcmV0dXJuIGFycmF5O1xuXG4gIGNvbXBhcmUgPSBjb21wYXJlID09PSB1bmRlZmluZWQgPyBhc2NlbmRpbmdEZWZpbmVkIDogY29tcGFyZURlZmluZWQoY29tcGFyZSk7XG5cbiAgd2hpbGUgKHJpZ2h0ID4gbGVmdCkge1xuICAgIGlmIChyaWdodCAtIGxlZnQgPiA2MDApIHtcbiAgICAgIGNvbnN0IG4gPSByaWdodCAtIGxlZnQgKyAxO1xuICAgICAgY29uc3QgbSA9IGsgLSBsZWZ0ICsgMTtcbiAgICAgIGNvbnN0IHogPSBNYXRoLmxvZyhuKTtcbiAgICAgIGNvbnN0IHMgPSAwLjUgKiBNYXRoLmV4cCgyICogeiAvIDMpO1xuICAgICAgY29uc3Qgc2QgPSAwLjUgKiBNYXRoLnNxcnQoeiAqIHMgKiAobiAtIHMpIC8gbikgKiAobSAtIG4gLyAyIDwgMCA/IC0xIDogMSk7XG4gICAgICBjb25zdCBuZXdMZWZ0ID0gTWF0aC5tYXgobGVmdCwgTWF0aC5mbG9vcihrIC0gbSAqIHMgLyBuICsgc2QpKTtcbiAgICAgIGNvbnN0IG5ld1JpZ2h0ID0gTWF0aC5taW4ocmlnaHQsIE1hdGguZmxvb3IoayArIChuIC0gbSkgKiBzIC8gbiArIHNkKSk7XG4gICAgICBxdWlja3NlbGVjdChhcnJheSwgaywgbmV3TGVmdCwgbmV3UmlnaHQsIGNvbXBhcmUpO1xuICAgIH1cblxuICAgIGNvbnN0IHQgPSBhcnJheVtrXTtcbiAgICBsZXQgaSA9IGxlZnQ7XG4gICAgbGV0IGogPSByaWdodDtcblxuICAgIHN3YXAoYXJyYXksIGxlZnQsIGspO1xuICAgIGlmIChjb21wYXJlKGFycmF5W3JpZ2h0XSwgdCkgPiAwKSBzd2FwKGFycmF5LCBsZWZ0LCByaWdodCk7XG5cbiAgICB3aGlsZSAoaSA8IGopIHtcbiAgICAgIHN3YXAoYXJyYXksIGksIGopLCArK2ksIC0tajtcbiAgICAgIHdoaWxlIChjb21wYXJlKGFycmF5W2ldLCB0KSA8IDApICsraTtcbiAgICAgIHdoaWxlIChjb21wYXJlKGFycmF5W2pdLCB0KSA+IDApIC0tajtcbiAgICB9XG5cbiAgICBpZiAoY29tcGFyZShhcnJheVtsZWZ0XSwgdCkgPT09IDApIHN3YXAoYXJyYXksIGxlZnQsIGopO1xuICAgIGVsc2UgKytqLCBzd2FwKGFycmF5LCBqLCByaWdodCk7XG5cbiAgICBpZiAoaiA8PSBrKSBsZWZ0ID0gaiArIDE7XG4gICAgaWYgKGsgPD0gaikgcmlnaHQgPSBqIC0gMTtcbiAgfVxuXG4gIHJldHVybiBhcnJheTtcbn1cblxuZnVuY3Rpb24gc3dhcChhcnJheSwgaSwgaikge1xuICBjb25zdCB0ID0gYXJyYXlbaV07XG4gIGFycmF5W2ldID0gYXJyYXlbal07XG4gIGFycmF5W2pdID0gdDtcbn1cbiIsImltcG9ydCBhc2NlbmRpbmcgZnJvbSBcIi4vYXNjZW5kaW5nLmpzXCI7XG5pbXBvcnQgcGVybXV0ZSBmcm9tIFwiLi9wZXJtdXRlLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHNvcnQodmFsdWVzLCAuLi5GKSB7XG4gIGlmICh0eXBlb2YgdmFsdWVzW1N5bWJvbC5pdGVyYXRvcl0gIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcInZhbHVlcyBpcyBub3QgaXRlcmFibGVcIik7XG4gIHZhbHVlcyA9IEFycmF5LmZyb20odmFsdWVzKTtcbiAgbGV0IFtmXSA9IEY7XG4gIGlmICgoZiAmJiBmLmxlbmd0aCAhPT0gMikgfHwgRi5sZW5ndGggPiAxKSB7XG4gICAgY29uc3QgaW5kZXggPSBVaW50MzJBcnJheS5mcm9tKHZhbHVlcywgKGQsIGkpID0+IGkpO1xuICAgIGlmIChGLmxlbmd0aCA+IDEpIHtcbiAgICAgIEYgPSBGLm1hcChmID0+IHZhbHVlcy5tYXAoZikpO1xuICAgICAgaW5kZXguc29ydCgoaSwgaikgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IGYgb2YgRikge1xuICAgICAgICAgIGNvbnN0IGMgPSBhc2NlbmRpbmdEZWZpbmVkKGZbaV0sIGZbal0pO1xuICAgICAgICAgIGlmIChjKSByZXR1cm4gYztcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGYgPSB2YWx1ZXMubWFwKGYpO1xuICAgICAgaW5kZXguc29ydCgoaSwgaikgPT4gYXNjZW5kaW5nRGVmaW5lZChmW2ldLCBmW2pdKSk7XG4gICAgfVxuICAgIHJldHVybiBwZXJtdXRlKHZhbHVlcywgaW5kZXgpO1xuICB9XG4gIHJldHVybiB2YWx1ZXMuc29ydChjb21wYXJlRGVmaW5lZChmKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wYXJlRGVmaW5lZChjb21wYXJlID0gYXNjZW5kaW5nKSB7XG4gIGlmIChjb21wYXJlID09PSBhc2NlbmRpbmcpIHJldHVybiBhc2NlbmRpbmdEZWZpbmVkO1xuICBpZiAodHlwZW9mIGNvbXBhcmUgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcImNvbXBhcmUgaXMgbm90IGEgZnVuY3Rpb25cIik7XG4gIHJldHVybiAoYSwgYikgPT4ge1xuICAgIGNvbnN0IHggPSBjb21wYXJlKGEsIGIpO1xuICAgIGlmICh4IHx8IHggPT09IDApIHJldHVybiB4O1xuICAgIHJldHVybiAoY29tcGFyZShiLCBiKSA9PT0gMCkgLSAoY29tcGFyZShhLCBhKSA9PT0gMCk7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhc2NlbmRpbmdEZWZpbmVkKGEsIGIpIHtcbiAgcmV0dXJuIChhID09IG51bGwgfHwgIShhID49IGEpKSAtIChiID09IG51bGwgfHwgIShiID49IGIpKSB8fCAoYSA8IGIgPyAtMSA6IGEgPiBiID8gMSA6IDApO1xufVxuIiwiaW1wb3J0IGRlZmluZSwge2V4dGVuZH0gZnJvbSBcIi4vZGVmaW5lLmpzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBDb2xvcigpIHt9XG5cbmV4cG9ydCB2YXIgZGFya2VyID0gMC43O1xuZXhwb3J0IHZhciBicmlnaHRlciA9IDEgLyBkYXJrZXI7XG5cbnZhciByZUkgPSBcIlxcXFxzKihbKy1dP1xcXFxkKylcXFxccypcIixcbiAgICByZU4gPSBcIlxcXFxzKihbKy1dPyg/OlxcXFxkKlxcXFwuKT9cXFxcZCsoPzpbZUVdWystXT9cXFxcZCspPylcXFxccypcIixcbiAgICByZVAgPSBcIlxcXFxzKihbKy1dPyg/OlxcXFxkKlxcXFwuKT9cXFxcZCsoPzpbZUVdWystXT9cXFxcZCspPyklXFxcXHMqXCIsXG4gICAgcmVIZXggPSAvXiMoWzAtOWEtZl17Myw4fSkkLyxcbiAgICByZVJnYkludGVnZXIgPSBuZXcgUmVnRXhwKGBecmdiXFxcXCgke3JlSX0sJHtyZUl9LCR7cmVJfVxcXFwpJGApLFxuICAgIHJlUmdiUGVyY2VudCA9IG5ldyBSZWdFeHAoYF5yZ2JcXFxcKCR7cmVQfSwke3JlUH0sJHtyZVB9XFxcXCkkYCksXG4gICAgcmVSZ2JhSW50ZWdlciA9IG5ldyBSZWdFeHAoYF5yZ2JhXFxcXCgke3JlSX0sJHtyZUl9LCR7cmVJfSwke3JlTn1cXFxcKSRgKSxcbiAgICByZVJnYmFQZXJjZW50ID0gbmV3IFJlZ0V4cChgXnJnYmFcXFxcKCR7cmVQfSwke3JlUH0sJHtyZVB9LCR7cmVOfVxcXFwpJGApLFxuICAgIHJlSHNsUGVyY2VudCA9IG5ldyBSZWdFeHAoYF5oc2xcXFxcKCR7cmVOfSwke3JlUH0sJHtyZVB9XFxcXCkkYCksXG4gICAgcmVIc2xhUGVyY2VudCA9IG5ldyBSZWdFeHAoYF5oc2xhXFxcXCgke3JlTn0sJHtyZVB9LCR7cmVQfSwke3JlTn1cXFxcKSRgKTtcblxudmFyIG5hbWVkID0ge1xuICBhbGljZWJsdWU6IDB4ZjBmOGZmLFxuICBhbnRpcXVld2hpdGU6IDB4ZmFlYmQ3LFxuICBhcXVhOiAweDAwZmZmZixcbiAgYXF1YW1hcmluZTogMHg3ZmZmZDQsXG4gIGF6dXJlOiAweGYwZmZmZixcbiAgYmVpZ2U6IDB4ZjVmNWRjLFxuICBiaXNxdWU6IDB4ZmZlNGM0LFxuICBibGFjazogMHgwMDAwMDAsXG4gIGJsYW5jaGVkYWxtb25kOiAweGZmZWJjZCxcbiAgYmx1ZTogMHgwMDAwZmYsXG4gIGJsdWV2aW9sZXQ6IDB4OGEyYmUyLFxuICBicm93bjogMHhhNTJhMmEsXG4gIGJ1cmx5d29vZDogMHhkZWI4ODcsXG4gIGNhZGV0Ymx1ZTogMHg1ZjllYTAsXG4gIGNoYXJ0cmV1c2U6IDB4N2ZmZjAwLFxuICBjaG9jb2xhdGU6IDB4ZDI2OTFlLFxuICBjb3JhbDogMHhmZjdmNTAsXG4gIGNvcm5mbG93ZXJibHVlOiAweDY0OTVlZCxcbiAgY29ybnNpbGs6IDB4ZmZmOGRjLFxuICBjcmltc29uOiAweGRjMTQzYyxcbiAgY3lhbjogMHgwMGZmZmYsXG4gIGRhcmtibHVlOiAweDAwMDA4YixcbiAgZGFya2N5YW46IDB4MDA4YjhiLFxuICBkYXJrZ29sZGVucm9kOiAweGI4ODYwYixcbiAgZGFya2dyYXk6IDB4YTlhOWE5LFxuICBkYXJrZ3JlZW46IDB4MDA2NDAwLFxuICBkYXJrZ3JleTogMHhhOWE5YTksXG4gIGRhcmtraGFraTogMHhiZGI3NmIsXG4gIGRhcmttYWdlbnRhOiAweDhiMDA4YixcbiAgZGFya29saXZlZ3JlZW46IDB4NTU2YjJmLFxuICBkYXJrb3JhbmdlOiAweGZmOGMwMCxcbiAgZGFya29yY2hpZDogMHg5OTMyY2MsXG4gIGRhcmtyZWQ6IDB4OGIwMDAwLFxuICBkYXJrc2FsbW9uOiAweGU5OTY3YSxcbiAgZGFya3NlYWdyZWVuOiAweDhmYmM4ZixcbiAgZGFya3NsYXRlYmx1ZTogMHg0ODNkOGIsXG4gIGRhcmtzbGF0ZWdyYXk6IDB4MmY0ZjRmLFxuICBkYXJrc2xhdGVncmV5OiAweDJmNGY0ZixcbiAgZGFya3R1cnF1b2lzZTogMHgwMGNlZDEsXG4gIGRhcmt2aW9sZXQ6IDB4OTQwMGQzLFxuICBkZWVwcGluazogMHhmZjE0OTMsXG4gIGRlZXBza3libHVlOiAweDAwYmZmZixcbiAgZGltZ3JheTogMHg2OTY5NjksXG4gIGRpbWdyZXk6IDB4Njk2OTY5LFxuICBkb2RnZXJibHVlOiAweDFlOTBmZixcbiAgZmlyZWJyaWNrOiAweGIyMjIyMixcbiAgZmxvcmFsd2hpdGU6IDB4ZmZmYWYwLFxuICBmb3Jlc3RncmVlbjogMHgyMjhiMjIsXG4gIGZ1Y2hzaWE6IDB4ZmYwMGZmLFxuICBnYWluc2Jvcm86IDB4ZGNkY2RjLFxuICBnaG9zdHdoaXRlOiAweGY4ZjhmZixcbiAgZ29sZDogMHhmZmQ3MDAsXG4gIGdvbGRlbnJvZDogMHhkYWE1MjAsXG4gIGdyYXk6IDB4ODA4MDgwLFxuICBncmVlbjogMHgwMDgwMDAsXG4gIGdyZWVueWVsbG93OiAweGFkZmYyZixcbiAgZ3JleTogMHg4MDgwODAsXG4gIGhvbmV5ZGV3OiAweGYwZmZmMCxcbiAgaG90cGluazogMHhmZjY5YjQsXG4gIGluZGlhbnJlZDogMHhjZDVjNWMsXG4gIGluZGlnbzogMHg0YjAwODIsXG4gIGl2b3J5OiAweGZmZmZmMCxcbiAga2hha2k6IDB4ZjBlNjhjLFxuICBsYXZlbmRlcjogMHhlNmU2ZmEsXG4gIGxhdmVuZGVyYmx1c2g6IDB4ZmZmMGY1LFxuICBsYXduZ3JlZW46IDB4N2NmYzAwLFxuICBsZW1vbmNoaWZmb246IDB4ZmZmYWNkLFxuICBsaWdodGJsdWU6IDB4YWRkOGU2LFxuICBsaWdodGNvcmFsOiAweGYwODA4MCxcbiAgbGlnaHRjeWFuOiAweGUwZmZmZixcbiAgbGlnaHRnb2xkZW5yb2R5ZWxsb3c6IDB4ZmFmYWQyLFxuICBsaWdodGdyYXk6IDB4ZDNkM2QzLFxuICBsaWdodGdyZWVuOiAweDkwZWU5MCxcbiAgbGlnaHRncmV5OiAweGQzZDNkMyxcbiAgbGlnaHRwaW5rOiAweGZmYjZjMSxcbiAgbGlnaHRzYWxtb246IDB4ZmZhMDdhLFxuICBsaWdodHNlYWdyZWVuOiAweDIwYjJhYSxcbiAgbGlnaHRza3libHVlOiAweDg3Y2VmYSxcbiAgbGlnaHRzbGF0ZWdyYXk6IDB4Nzc4ODk5LFxuICBsaWdodHNsYXRlZ3JleTogMHg3Nzg4OTksXG4gIGxpZ2h0c3RlZWxibHVlOiAweGIwYzRkZSxcbiAgbGlnaHR5ZWxsb3c6IDB4ZmZmZmUwLFxuICBsaW1lOiAweDAwZmYwMCxcbiAgbGltZWdyZWVuOiAweDMyY2QzMixcbiAgbGluZW46IDB4ZmFmMGU2LFxuICBtYWdlbnRhOiAweGZmMDBmZixcbiAgbWFyb29uOiAweDgwMDAwMCxcbiAgbWVkaXVtYXF1YW1hcmluZTogMHg2NmNkYWEsXG4gIG1lZGl1bWJsdWU6IDB4MDAwMGNkLFxuICBtZWRpdW1vcmNoaWQ6IDB4YmE1NWQzLFxuICBtZWRpdW1wdXJwbGU6IDB4OTM3MGRiLFxuICBtZWRpdW1zZWFncmVlbjogMHgzY2IzNzEsXG4gIG1lZGl1bXNsYXRlYmx1ZTogMHg3YjY4ZWUsXG4gIG1lZGl1bXNwcmluZ2dyZWVuOiAweDAwZmE5YSxcbiAgbWVkaXVtdHVycXVvaXNlOiAweDQ4ZDFjYyxcbiAgbWVkaXVtdmlvbGV0cmVkOiAweGM3MTU4NSxcbiAgbWlkbmlnaHRibHVlOiAweDE5MTk3MCxcbiAgbWludGNyZWFtOiAweGY1ZmZmYSxcbiAgbWlzdHlyb3NlOiAweGZmZTRlMSxcbiAgbW9jY2FzaW46IDB4ZmZlNGI1LFxuICBuYXZham93aGl0ZTogMHhmZmRlYWQsXG4gIG5hdnk6IDB4MDAwMDgwLFxuICBvbGRsYWNlOiAweGZkZjVlNixcbiAgb2xpdmU6IDB4ODA4MDAwLFxuICBvbGl2ZWRyYWI6IDB4NmI4ZTIzLFxuICBvcmFuZ2U6IDB4ZmZhNTAwLFxuICBvcmFuZ2VyZWQ6IDB4ZmY0NTAwLFxuICBvcmNoaWQ6IDB4ZGE3MGQ2LFxuICBwYWxlZ29sZGVucm9kOiAweGVlZThhYSxcbiAgcGFsZWdyZWVuOiAweDk4ZmI5OCxcbiAgcGFsZXR1cnF1b2lzZTogMHhhZmVlZWUsXG4gIHBhbGV2aW9sZXRyZWQ6IDB4ZGI3MDkzLFxuICBwYXBheWF3aGlwOiAweGZmZWZkNSxcbiAgcGVhY2hwdWZmOiAweGZmZGFiOSxcbiAgcGVydTogMHhjZDg1M2YsXG4gIHBpbms6IDB4ZmZjMGNiLFxuICBwbHVtOiAweGRkYTBkZCxcbiAgcG93ZGVyYmx1ZTogMHhiMGUwZTYsXG4gIHB1cnBsZTogMHg4MDAwODAsXG4gIHJlYmVjY2FwdXJwbGU6IDB4NjYzMzk5LFxuICByZWQ6IDB4ZmYwMDAwLFxuICByb3N5YnJvd246IDB4YmM4ZjhmLFxuICByb3lhbGJsdWU6IDB4NDE2OWUxLFxuICBzYWRkbGVicm93bjogMHg4YjQ1MTMsXG4gIHNhbG1vbjogMHhmYTgwNzIsXG4gIHNhbmR5YnJvd246IDB4ZjRhNDYwLFxuICBzZWFncmVlbjogMHgyZThiNTcsXG4gIHNlYXNoZWxsOiAweGZmZjVlZSxcbiAgc2llbm5hOiAweGEwNTIyZCxcbiAgc2lsdmVyOiAweGMwYzBjMCxcbiAgc2t5Ymx1ZTogMHg4N2NlZWIsXG4gIHNsYXRlYmx1ZTogMHg2YTVhY2QsXG4gIHNsYXRlZ3JheTogMHg3MDgwOTAsXG4gIHNsYXRlZ3JleTogMHg3MDgwOTAsXG4gIHNub3c6IDB4ZmZmYWZhLFxuICBzcHJpbmdncmVlbjogMHgwMGZmN2YsXG4gIHN0ZWVsYmx1ZTogMHg0NjgyYjQsXG4gIHRhbjogMHhkMmI0OGMsXG4gIHRlYWw6IDB4MDA4MDgwLFxuICB0aGlzdGxlOiAweGQ4YmZkOCxcbiAgdG9tYXRvOiAweGZmNjM0NyxcbiAgdHVycXVvaXNlOiAweDQwZTBkMCxcbiAgdmlvbGV0OiAweGVlODJlZSxcbiAgd2hlYXQ6IDB4ZjVkZWIzLFxuICB3aGl0ZTogMHhmZmZmZmYsXG4gIHdoaXRlc21va2U6IDB4ZjVmNWY1LFxuICB5ZWxsb3c6IDB4ZmZmZjAwLFxuICB5ZWxsb3dncmVlbjogMHg5YWNkMzJcbn07XG5cbmRlZmluZShDb2xvciwgY29sb3IsIHtcbiAgY29weShjaGFubmVscykge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKG5ldyB0aGlzLmNvbnN0cnVjdG9yLCB0aGlzLCBjaGFubmVscyk7XG4gIH0sXG4gIGRpc3BsYXlhYmxlKCkge1xuICAgIHJldHVybiB0aGlzLnJnYigpLmRpc3BsYXlhYmxlKCk7XG4gIH0sXG4gIGhleDogY29sb3JfZm9ybWF0SGV4LCAvLyBEZXByZWNhdGVkISBVc2UgY29sb3IuZm9ybWF0SGV4LlxuICBmb3JtYXRIZXg6IGNvbG9yX2Zvcm1hdEhleCxcbiAgZm9ybWF0SGV4ODogY29sb3JfZm9ybWF0SGV4OCxcbiAgZm9ybWF0SHNsOiBjb2xvcl9mb3JtYXRIc2wsXG4gIGZvcm1hdFJnYjogY29sb3JfZm9ybWF0UmdiLFxuICB0b1N0cmluZzogY29sb3JfZm9ybWF0UmdiXG59KTtcblxuZnVuY3Rpb24gY29sb3JfZm9ybWF0SGV4KCkge1xuICByZXR1cm4gdGhpcy5yZ2IoKS5mb3JtYXRIZXgoKTtcbn1cblxuZnVuY3Rpb24gY29sb3JfZm9ybWF0SGV4OCgpIHtcbiAgcmV0dXJuIHRoaXMucmdiKCkuZm9ybWF0SGV4OCgpO1xufVxuXG5mdW5jdGlvbiBjb2xvcl9mb3JtYXRIc2woKSB7XG4gIHJldHVybiBoc2xDb252ZXJ0KHRoaXMpLmZvcm1hdEhzbCgpO1xufVxuXG5mdW5jdGlvbiBjb2xvcl9mb3JtYXRSZ2IoKSB7XG4gIHJldHVybiB0aGlzLnJnYigpLmZvcm1hdFJnYigpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjb2xvcihmb3JtYXQpIHtcbiAgdmFyIG0sIGw7XG4gIGZvcm1hdCA9IChmb3JtYXQgKyBcIlwiKS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuIChtID0gcmVIZXguZXhlYyhmb3JtYXQpKSA/IChsID0gbVsxXS5sZW5ndGgsIG0gPSBwYXJzZUludChtWzFdLCAxNiksIGwgPT09IDYgPyByZ2JuKG0pIC8vICNmZjAwMDBcbiAgICAgIDogbCA9PT0gMyA/IG5ldyBSZ2IoKG0gPj4gOCAmIDB4ZikgfCAobSA+PiA0ICYgMHhmMCksIChtID4+IDQgJiAweGYpIHwgKG0gJiAweGYwKSwgKChtICYgMHhmKSA8PCA0KSB8IChtICYgMHhmKSwgMSkgLy8gI2YwMFxuICAgICAgOiBsID09PSA4ID8gcmdiYShtID4+IDI0ICYgMHhmZiwgbSA+PiAxNiAmIDB4ZmYsIG0gPj4gOCAmIDB4ZmYsIChtICYgMHhmZikgLyAweGZmKSAvLyAjZmYwMDAwMDBcbiAgICAgIDogbCA9PT0gNCA/IHJnYmEoKG0gPj4gMTIgJiAweGYpIHwgKG0gPj4gOCAmIDB4ZjApLCAobSA+PiA4ICYgMHhmKSB8IChtID4+IDQgJiAweGYwKSwgKG0gPj4gNCAmIDB4ZikgfCAobSAmIDB4ZjApLCAoKChtICYgMHhmKSA8PCA0KSB8IChtICYgMHhmKSkgLyAweGZmKSAvLyAjZjAwMFxuICAgICAgOiBudWxsKSAvLyBpbnZhbGlkIGhleFxuICAgICAgOiAobSA9IHJlUmdiSW50ZWdlci5leGVjKGZvcm1hdCkpID8gbmV3IFJnYihtWzFdLCBtWzJdLCBtWzNdLCAxKSAvLyByZ2IoMjU1LCAwLCAwKVxuICAgICAgOiAobSA9IHJlUmdiUGVyY2VudC5leGVjKGZvcm1hdCkpID8gbmV3IFJnYihtWzFdICogMjU1IC8gMTAwLCBtWzJdICogMjU1IC8gMTAwLCBtWzNdICogMjU1IC8gMTAwLCAxKSAvLyByZ2IoMTAwJSwgMCUsIDAlKVxuICAgICAgOiAobSA9IHJlUmdiYUludGVnZXIuZXhlYyhmb3JtYXQpKSA/IHJnYmEobVsxXSwgbVsyXSwgbVszXSwgbVs0XSkgLy8gcmdiYSgyNTUsIDAsIDAsIDEpXG4gICAgICA6IChtID0gcmVSZ2JhUGVyY2VudC5leGVjKGZvcm1hdCkpID8gcmdiYShtWzFdICogMjU1IC8gMTAwLCBtWzJdICogMjU1IC8gMTAwLCBtWzNdICogMjU1IC8gMTAwLCBtWzRdKSAvLyByZ2IoMTAwJSwgMCUsIDAlLCAxKVxuICAgICAgOiAobSA9IHJlSHNsUGVyY2VudC5leGVjKGZvcm1hdCkpID8gaHNsYShtWzFdLCBtWzJdIC8gMTAwLCBtWzNdIC8gMTAwLCAxKSAvLyBoc2woMTIwLCA1MCUsIDUwJSlcbiAgICAgIDogKG0gPSByZUhzbGFQZXJjZW50LmV4ZWMoZm9ybWF0KSkgPyBoc2xhKG1bMV0sIG1bMl0gLyAxMDAsIG1bM10gLyAxMDAsIG1bNF0pIC8vIGhzbGEoMTIwLCA1MCUsIDUwJSwgMSlcbiAgICAgIDogbmFtZWQuaGFzT3duUHJvcGVydHkoZm9ybWF0KSA/IHJnYm4obmFtZWRbZm9ybWF0XSkgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgICAgIDogZm9ybWF0ID09PSBcInRyYW5zcGFyZW50XCIgPyBuZXcgUmdiKE5hTiwgTmFOLCBOYU4sIDApXG4gICAgICA6IG51bGw7XG59XG5cbmZ1bmN0aW9uIHJnYm4obikge1xuICByZXR1cm4gbmV3IFJnYihuID4+IDE2ICYgMHhmZiwgbiA+PiA4ICYgMHhmZiwgbiAmIDB4ZmYsIDEpO1xufVxuXG5mdW5jdGlvbiByZ2JhKHIsIGcsIGIsIGEpIHtcbiAgaWYgKGEgPD0gMCkgciA9IGcgPSBiID0gTmFOO1xuICByZXR1cm4gbmV3IFJnYihyLCBnLCBiLCBhKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJnYkNvbnZlcnQobykge1xuICBpZiAoIShvIGluc3RhbmNlb2YgQ29sb3IpKSBvID0gY29sb3Iobyk7XG4gIGlmICghbykgcmV0dXJuIG5ldyBSZ2I7XG4gIG8gPSBvLnJnYigpO1xuICByZXR1cm4gbmV3IFJnYihvLnIsIG8uZywgby5iLCBvLm9wYWNpdHkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmdiKHIsIGcsIGIsIG9wYWNpdHkpIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgPyByZ2JDb252ZXJ0KHIpIDogbmV3IFJnYihyLCBnLCBiLCBvcGFjaXR5ID09IG51bGwgPyAxIDogb3BhY2l0eSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBSZ2IociwgZywgYiwgb3BhY2l0eSkge1xuICB0aGlzLnIgPSArcjtcbiAgdGhpcy5nID0gK2c7XG4gIHRoaXMuYiA9ICtiO1xuICB0aGlzLm9wYWNpdHkgPSArb3BhY2l0eTtcbn1cblxuZGVmaW5lKFJnYiwgcmdiLCBleHRlbmQoQ29sb3IsIHtcbiAgYnJpZ2h0ZXIoaykge1xuICAgIGsgPSBrID09IG51bGwgPyBicmlnaHRlciA6IE1hdGgucG93KGJyaWdodGVyLCBrKTtcbiAgICByZXR1cm4gbmV3IFJnYih0aGlzLnIgKiBrLCB0aGlzLmcgKiBrLCB0aGlzLmIgKiBrLCB0aGlzLm9wYWNpdHkpO1xuICB9LFxuICBkYXJrZXIoaykge1xuICAgIGsgPSBrID09IG51bGwgPyBkYXJrZXIgOiBNYXRoLnBvdyhkYXJrZXIsIGspO1xuICAgIHJldHVybiBuZXcgUmdiKHRoaXMuciAqIGssIHRoaXMuZyAqIGssIHRoaXMuYiAqIGssIHRoaXMub3BhY2l0eSk7XG4gIH0sXG4gIHJnYigpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgY2xhbXAoKSB7XG4gICAgcmV0dXJuIG5ldyBSZ2IoY2xhbXBpKHRoaXMuciksIGNsYW1waSh0aGlzLmcpLCBjbGFtcGkodGhpcy5iKSwgY2xhbXBhKHRoaXMub3BhY2l0eSkpO1xuICB9LFxuICBkaXNwbGF5YWJsZSgpIHtcbiAgICByZXR1cm4gKC0wLjUgPD0gdGhpcy5yICYmIHRoaXMuciA8IDI1NS41KVxuICAgICAgICAmJiAoLTAuNSA8PSB0aGlzLmcgJiYgdGhpcy5nIDwgMjU1LjUpXG4gICAgICAgICYmICgtMC41IDw9IHRoaXMuYiAmJiB0aGlzLmIgPCAyNTUuNSlcbiAgICAgICAgJiYgKDAgPD0gdGhpcy5vcGFjaXR5ICYmIHRoaXMub3BhY2l0eSA8PSAxKTtcbiAgfSxcbiAgaGV4OiByZ2JfZm9ybWF0SGV4LCAvLyBEZXByZWNhdGVkISBVc2UgY29sb3IuZm9ybWF0SGV4LlxuICBmb3JtYXRIZXg6IHJnYl9mb3JtYXRIZXgsXG4gIGZvcm1hdEhleDg6IHJnYl9mb3JtYXRIZXg4LFxuICBmb3JtYXRSZ2I6IHJnYl9mb3JtYXRSZ2IsXG4gIHRvU3RyaW5nOiByZ2JfZm9ybWF0UmdiXG59KSk7XG5cbmZ1bmN0aW9uIHJnYl9mb3JtYXRIZXgoKSB7XG4gIHJldHVybiBgIyR7aGV4KHRoaXMucil9JHtoZXgodGhpcy5nKX0ke2hleCh0aGlzLmIpfWA7XG59XG5cbmZ1bmN0aW9uIHJnYl9mb3JtYXRIZXg4KCkge1xuICByZXR1cm4gYCMke2hleCh0aGlzLnIpfSR7aGV4KHRoaXMuZyl9JHtoZXgodGhpcy5iKX0ke2hleCgoaXNOYU4odGhpcy5vcGFjaXR5KSA/IDEgOiB0aGlzLm9wYWNpdHkpICogMjU1KX1gO1xufVxuXG5mdW5jdGlvbiByZ2JfZm9ybWF0UmdiKCkge1xuICBjb25zdCBhID0gY2xhbXBhKHRoaXMub3BhY2l0eSk7XG4gIHJldHVybiBgJHthID09PSAxID8gXCJyZ2IoXCIgOiBcInJnYmEoXCJ9JHtjbGFtcGkodGhpcy5yKX0sICR7Y2xhbXBpKHRoaXMuZyl9LCAke2NsYW1waSh0aGlzLmIpfSR7YSA9PT0gMSA/IFwiKVwiIDogYCwgJHthfSlgfWA7XG59XG5cbmZ1bmN0aW9uIGNsYW1wYShvcGFjaXR5KSB7XG4gIHJldHVybiBpc05hTihvcGFjaXR5KSA/IDEgOiBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCBvcGFjaXR5KSk7XG59XG5cbmZ1bmN0aW9uIGNsYW1waSh2YWx1ZSkge1xuICByZXR1cm4gTWF0aC5tYXgoMCwgTWF0aC5taW4oMjU1LCBNYXRoLnJvdW5kKHZhbHVlKSB8fCAwKSk7XG59XG5cbmZ1bmN0aW9uIGhleCh2YWx1ZSkge1xuICB2YWx1ZSA9IGNsYW1waSh2YWx1ZSk7XG4gIHJldHVybiAodmFsdWUgPCAxNiA/IFwiMFwiIDogXCJcIikgKyB2YWx1ZS50b1N0cmluZygxNik7XG59XG5cbmZ1bmN0aW9uIGhzbGEoaCwgcywgbCwgYSkge1xuICBpZiAoYSA8PSAwKSBoID0gcyA9IGwgPSBOYU47XG4gIGVsc2UgaWYgKGwgPD0gMCB8fCBsID49IDEpIGggPSBzID0gTmFOO1xuICBlbHNlIGlmIChzIDw9IDApIGggPSBOYU47XG4gIHJldHVybiBuZXcgSHNsKGgsIHMsIGwsIGEpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaHNsQ29udmVydChvKSB7XG4gIGlmIChvIGluc3RhbmNlb2YgSHNsKSByZXR1cm4gbmV3IEhzbChvLmgsIG8ucywgby5sLCBvLm9wYWNpdHkpO1xuICBpZiAoIShvIGluc3RhbmNlb2YgQ29sb3IpKSBvID0gY29sb3Iobyk7XG4gIGlmICghbykgcmV0dXJuIG5ldyBIc2w7XG4gIGlmIChvIGluc3RhbmNlb2YgSHNsKSByZXR1cm4gbztcbiAgbyA9IG8ucmdiKCk7XG4gIHZhciByID0gby5yIC8gMjU1LFxuICAgICAgZyA9IG8uZyAvIDI1NSxcbiAgICAgIGIgPSBvLmIgLyAyNTUsXG4gICAgICBtaW4gPSBNYXRoLm1pbihyLCBnLCBiKSxcbiAgICAgIG1heCA9IE1hdGgubWF4KHIsIGcsIGIpLFxuICAgICAgaCA9IE5hTixcbiAgICAgIHMgPSBtYXggLSBtaW4sXG4gICAgICBsID0gKG1heCArIG1pbikgLyAyO1xuICBpZiAocykge1xuICAgIGlmIChyID09PSBtYXgpIGggPSAoZyAtIGIpIC8gcyArIChnIDwgYikgKiA2O1xuICAgIGVsc2UgaWYgKGcgPT09IG1heCkgaCA9IChiIC0gcikgLyBzICsgMjtcbiAgICBlbHNlIGggPSAociAtIGcpIC8gcyArIDQ7XG4gICAgcyAvPSBsIDwgMC41ID8gbWF4ICsgbWluIDogMiAtIG1heCAtIG1pbjtcbiAgICBoICo9IDYwO1xuICB9IGVsc2Uge1xuICAgIHMgPSBsID4gMCAmJiBsIDwgMSA/IDAgOiBoO1xuICB9XG4gIHJldHVybiBuZXcgSHNsKGgsIHMsIGwsIG8ub3BhY2l0eSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoc2woaCwgcywgbCwgb3BhY2l0eSkge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PT0gMSA/IGhzbENvbnZlcnQoaCkgOiBuZXcgSHNsKGgsIHMsIGwsIG9wYWNpdHkgPT0gbnVsbCA/IDEgOiBvcGFjaXR5KTtcbn1cblxuZnVuY3Rpb24gSHNsKGgsIHMsIGwsIG9wYWNpdHkpIHtcbiAgdGhpcy5oID0gK2g7XG4gIHRoaXMucyA9ICtzO1xuICB0aGlzLmwgPSArbDtcbiAgdGhpcy5vcGFjaXR5ID0gK29wYWNpdHk7XG59XG5cbmRlZmluZShIc2wsIGhzbCwgZXh0ZW5kKENvbG9yLCB7XG4gIGJyaWdodGVyKGspIHtcbiAgICBrID0gayA9PSBudWxsID8gYnJpZ2h0ZXIgOiBNYXRoLnBvdyhicmlnaHRlciwgayk7XG4gICAgcmV0dXJuIG5ldyBIc2wodGhpcy5oLCB0aGlzLnMsIHRoaXMubCAqIGssIHRoaXMub3BhY2l0eSk7XG4gIH0sXG4gIGRhcmtlcihrKSB7XG4gICAgayA9IGsgPT0gbnVsbCA/IGRhcmtlciA6IE1hdGgucG93KGRhcmtlciwgayk7XG4gICAgcmV0dXJuIG5ldyBIc2wodGhpcy5oLCB0aGlzLnMsIHRoaXMubCAqIGssIHRoaXMub3BhY2l0eSk7XG4gIH0sXG4gIHJnYigpIHtcbiAgICB2YXIgaCA9IHRoaXMuaCAlIDM2MCArICh0aGlzLmggPCAwKSAqIDM2MCxcbiAgICAgICAgcyA9IGlzTmFOKGgpIHx8IGlzTmFOKHRoaXMucykgPyAwIDogdGhpcy5zLFxuICAgICAgICBsID0gdGhpcy5sLFxuICAgICAgICBtMiA9IGwgKyAobCA8IDAuNSA/IGwgOiAxIC0gbCkgKiBzLFxuICAgICAgICBtMSA9IDIgKiBsIC0gbTI7XG4gICAgcmV0dXJuIG5ldyBSZ2IoXG4gICAgICBoc2wycmdiKGggPj0gMjQwID8gaCAtIDI0MCA6IGggKyAxMjAsIG0xLCBtMiksXG4gICAgICBoc2wycmdiKGgsIG0xLCBtMiksXG4gICAgICBoc2wycmdiKGggPCAxMjAgPyBoICsgMjQwIDogaCAtIDEyMCwgbTEsIG0yKSxcbiAgICAgIHRoaXMub3BhY2l0eVxuICAgICk7XG4gIH0sXG4gIGNsYW1wKCkge1xuICAgIHJldHVybiBuZXcgSHNsKGNsYW1waCh0aGlzLmgpLCBjbGFtcHQodGhpcy5zKSwgY2xhbXB0KHRoaXMubCksIGNsYW1wYSh0aGlzLm9wYWNpdHkpKTtcbiAgfSxcbiAgZGlzcGxheWFibGUoKSB7XG4gICAgcmV0dXJuICgwIDw9IHRoaXMucyAmJiB0aGlzLnMgPD0gMSB8fCBpc05hTih0aGlzLnMpKVxuICAgICAgICAmJiAoMCA8PSB0aGlzLmwgJiYgdGhpcy5sIDw9IDEpXG4gICAgICAgICYmICgwIDw9IHRoaXMub3BhY2l0eSAmJiB0aGlzLm9wYWNpdHkgPD0gMSk7XG4gIH0sXG4gIGZvcm1hdEhzbCgpIHtcbiAgICBjb25zdCBhID0gY2xhbXBhKHRoaXMub3BhY2l0eSk7XG4gICAgcmV0dXJuIGAke2EgPT09IDEgPyBcImhzbChcIiA6IFwiaHNsYShcIn0ke2NsYW1waCh0aGlzLmgpfSwgJHtjbGFtcHQodGhpcy5zKSAqIDEwMH0lLCAke2NsYW1wdCh0aGlzLmwpICogMTAwfSUke2EgPT09IDEgPyBcIilcIiA6IGAsICR7YX0pYH1gO1xuICB9XG59KSk7XG5cbmZ1bmN0aW9uIGNsYW1waCh2YWx1ZSkge1xuICB2YWx1ZSA9ICh2YWx1ZSB8fCAwKSAlIDM2MDtcbiAgcmV0dXJuIHZhbHVlIDwgMCA/IHZhbHVlICsgMzYwIDogdmFsdWU7XG59XG5cbmZ1bmN0aW9uIGNsYW1wdCh2YWx1ZSkge1xuICByZXR1cm4gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgdmFsdWUgfHwgMCkpO1xufVxuXG4vKiBGcm9tIEZ2RCAxMy4zNywgQ1NTIENvbG9yIE1vZHVsZSBMZXZlbCAzICovXG5mdW5jdGlvbiBoc2wycmdiKGgsIG0xLCBtMikge1xuICByZXR1cm4gKGggPCA2MCA/IG0xICsgKG0yIC0gbTEpICogaCAvIDYwXG4gICAgICA6IGggPCAxODAgPyBtMlxuICAgICAgOiBoIDwgMjQwID8gbTEgKyAobTIgLSBtMSkgKiAoMjQwIC0gaCkgLyA2MFxuICAgICAgOiBtMSkgKiAyNTU7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihjb25zdHJ1Y3RvciwgZmFjdG9yeSwgcHJvdG90eXBlKSB7XG4gIGNvbnN0cnVjdG9yLnByb3RvdHlwZSA9IGZhY3RvcnkucHJvdG90eXBlID0gcHJvdG90eXBlO1xuICBwcm90b3R5cGUuY29uc3RydWN0b3IgPSBjb25zdHJ1Y3Rvcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4dGVuZChwYXJlbnQsIGRlZmluaXRpb24pIHtcbiAgdmFyIHByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUocGFyZW50LnByb3RvdHlwZSk7XG4gIGZvciAodmFyIGtleSBpbiBkZWZpbml0aW9uKSBwcm90b3R5cGVba2V5XSA9IGRlZmluaXRpb25ba2V5XTtcbiAgcmV0dXJuIHByb3RvdHlwZTtcbn1cbiIsImltcG9ydCBkZWZpbmUsIHtleHRlbmR9IGZyb20gXCIuL2RlZmluZS5qc1wiO1xuaW1wb3J0IHtDb2xvciwgcmdiQ29udmVydCwgUmdifSBmcm9tIFwiLi9jb2xvci5qc1wiO1xuaW1wb3J0IHtkZWdyZWVzLCByYWRpYW5zfSBmcm9tIFwiLi9tYXRoLmpzXCI7XG5cbi8vIGh0dHBzOi8vb2JzZXJ2YWJsZWhxLmNvbS9AbWJvc3RvY2svbGFiLWFuZC1yZ2JcbmNvbnN0IEsgPSAxOCxcbiAgICBYbiA9IDAuOTY0MjIsXG4gICAgWW4gPSAxLFxuICAgIFpuID0gMC44MjUyMSxcbiAgICB0MCA9IDQgLyAyOSxcbiAgICB0MSA9IDYgLyAyOSxcbiAgICB0MiA9IDMgKiB0MSAqIHQxLFxuICAgIHQzID0gdDEgKiB0MSAqIHQxO1xuXG5mdW5jdGlvbiBsYWJDb252ZXJ0KG8pIHtcbiAgaWYgKG8gaW5zdGFuY2VvZiBMYWIpIHJldHVybiBuZXcgTGFiKG8ubCwgby5hLCBvLmIsIG8ub3BhY2l0eSk7XG4gIGlmIChvIGluc3RhbmNlb2YgSGNsKSByZXR1cm4gaGNsMmxhYihvKTtcbiAgaWYgKCEobyBpbnN0YW5jZW9mIFJnYikpIG8gPSByZ2JDb252ZXJ0KG8pO1xuICB2YXIgciA9IHJnYjJscmdiKG8uciksXG4gICAgICBnID0gcmdiMmxyZ2Ioby5nKSxcbiAgICAgIGIgPSByZ2IybHJnYihvLmIpLFxuICAgICAgeSA9IHh5ejJsYWIoKDAuMjIyNTA0NSAqIHIgKyAwLjcxNjg3ODYgKiBnICsgMC4wNjA2MTY5ICogYikgLyBZbiksIHgsIHo7XG4gIGlmIChyID09PSBnICYmIGcgPT09IGIpIHggPSB6ID0geTsgZWxzZSB7XG4gICAgeCA9IHh5ejJsYWIoKDAuNDM2MDc0NyAqIHIgKyAwLjM4NTA2NDkgKiBnICsgMC4xNDMwODA0ICogYikgLyBYbik7XG4gICAgeiA9IHh5ejJsYWIoKDAuMDEzOTMyMiAqIHIgKyAwLjA5NzEwNDUgKiBnICsgMC43MTQxNzMzICogYikgLyBabik7XG4gIH1cbiAgcmV0dXJuIG5ldyBMYWIoMTE2ICogeSAtIDE2LCA1MDAgKiAoeCAtIHkpLCAyMDAgKiAoeSAtIHopLCBvLm9wYWNpdHkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ3JheShsLCBvcGFjaXR5KSB7XG4gIHJldHVybiBuZXcgTGFiKGwsIDAsIDAsIG9wYWNpdHkgPT0gbnVsbCA/IDEgOiBvcGFjaXR5KTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbGFiKGwsIGEsIGIsIG9wYWNpdHkpIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgPyBsYWJDb252ZXJ0KGwpIDogbmV3IExhYihsLCBhLCBiLCBvcGFjaXR5ID09IG51bGwgPyAxIDogb3BhY2l0eSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBMYWIobCwgYSwgYiwgb3BhY2l0eSkge1xuICB0aGlzLmwgPSArbDtcbiAgdGhpcy5hID0gK2E7XG4gIHRoaXMuYiA9ICtiO1xuICB0aGlzLm9wYWNpdHkgPSArb3BhY2l0eTtcbn1cblxuZGVmaW5lKExhYiwgbGFiLCBleHRlbmQoQ29sb3IsIHtcbiAgYnJpZ2h0ZXIoaykge1xuICAgIHJldHVybiBuZXcgTGFiKHRoaXMubCArIEsgKiAoayA9PSBudWxsID8gMSA6IGspLCB0aGlzLmEsIHRoaXMuYiwgdGhpcy5vcGFjaXR5KTtcbiAgfSxcbiAgZGFya2VyKGspIHtcbiAgICByZXR1cm4gbmV3IExhYih0aGlzLmwgLSBLICogKGsgPT0gbnVsbCA/IDEgOiBrKSwgdGhpcy5hLCB0aGlzLmIsIHRoaXMub3BhY2l0eSk7XG4gIH0sXG4gIHJnYigpIHtcbiAgICB2YXIgeSA9ICh0aGlzLmwgKyAxNikgLyAxMTYsXG4gICAgICAgIHggPSBpc05hTih0aGlzLmEpID8geSA6IHkgKyB0aGlzLmEgLyA1MDAsXG4gICAgICAgIHogPSBpc05hTih0aGlzLmIpID8geSA6IHkgLSB0aGlzLmIgLyAyMDA7XG4gICAgeCA9IFhuICogbGFiMnh5eih4KTtcbiAgICB5ID0gWW4gKiBsYWIyeHl6KHkpO1xuICAgIHogPSBabiAqIGxhYjJ4eXooeik7XG4gICAgcmV0dXJuIG5ldyBSZ2IoXG4gICAgICBscmdiMnJnYiggMy4xMzM4NTYxICogeCAtIDEuNjE2ODY2NyAqIHkgLSAwLjQ5MDYxNDYgKiB6KSxcbiAgICAgIGxyZ2IycmdiKC0wLjk3ODc2ODQgKiB4ICsgMS45MTYxNDE1ICogeSArIDAuMDMzNDU0MCAqIHopLFxuICAgICAgbHJnYjJyZ2IoIDAuMDcxOTQ1MyAqIHggLSAwLjIyODk5MTQgKiB5ICsgMS40MDUyNDI3ICogeiksXG4gICAgICB0aGlzLm9wYWNpdHlcbiAgICApO1xuICB9XG59KSk7XG5cbmZ1bmN0aW9uIHh5ejJsYWIodCkge1xuICByZXR1cm4gdCA+IHQzID8gTWF0aC5wb3codCwgMSAvIDMpIDogdCAvIHQyICsgdDA7XG59XG5cbmZ1bmN0aW9uIGxhYjJ4eXoodCkge1xuICByZXR1cm4gdCA+IHQxID8gdCAqIHQgKiB0IDogdDIgKiAodCAtIHQwKTtcbn1cblxuZnVuY3Rpb24gbHJnYjJyZ2IoeCkge1xuICByZXR1cm4gMjU1ICogKHggPD0gMC4wMDMxMzA4ID8gMTIuOTIgKiB4IDogMS4wNTUgKiBNYXRoLnBvdyh4LCAxIC8gMi40KSAtIDAuMDU1KTtcbn1cblxuZnVuY3Rpb24gcmdiMmxyZ2IoeCkge1xuICByZXR1cm4gKHggLz0gMjU1KSA8PSAwLjA0MDQ1ID8geCAvIDEyLjkyIDogTWF0aC5wb3coKHggKyAwLjA1NSkgLyAxLjA1NSwgMi40KTtcbn1cblxuZnVuY3Rpb24gaGNsQ29udmVydChvKSB7XG4gIGlmIChvIGluc3RhbmNlb2YgSGNsKSByZXR1cm4gbmV3IEhjbChvLmgsIG8uYywgby5sLCBvLm9wYWNpdHkpO1xuICBpZiAoIShvIGluc3RhbmNlb2YgTGFiKSkgbyA9IGxhYkNvbnZlcnQobyk7XG4gIGlmIChvLmEgPT09IDAgJiYgby5iID09PSAwKSByZXR1cm4gbmV3IEhjbChOYU4sIDAgPCBvLmwgJiYgby5sIDwgMTAwID8gMCA6IE5hTiwgby5sLCBvLm9wYWNpdHkpO1xuICB2YXIgaCA9IE1hdGguYXRhbjIoby5iLCBvLmEpICogZGVncmVlcztcbiAgcmV0dXJuIG5ldyBIY2woaCA8IDAgPyBoICsgMzYwIDogaCwgTWF0aC5zcXJ0KG8uYSAqIG8uYSArIG8uYiAqIG8uYiksIG8ubCwgby5vcGFjaXR5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxjaChsLCBjLCBoLCBvcGFjaXR5KSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID09PSAxID8gaGNsQ29udmVydChsKSA6IG5ldyBIY2woaCwgYywgbCwgb3BhY2l0eSA9PSBudWxsID8gMSA6IG9wYWNpdHkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGNsKGgsIGMsIGwsIG9wYWNpdHkpIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgPyBoY2xDb252ZXJ0KGgpIDogbmV3IEhjbChoLCBjLCBsLCBvcGFjaXR5ID09IG51bGwgPyAxIDogb3BhY2l0eSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBIY2woaCwgYywgbCwgb3BhY2l0eSkge1xuICB0aGlzLmggPSAraDtcbiAgdGhpcy5jID0gK2M7XG4gIHRoaXMubCA9ICtsO1xuICB0aGlzLm9wYWNpdHkgPSArb3BhY2l0eTtcbn1cblxuZnVuY3Rpb24gaGNsMmxhYihvKSB7XG4gIGlmIChpc05hTihvLmgpKSByZXR1cm4gbmV3IExhYihvLmwsIDAsIDAsIG8ub3BhY2l0eSk7XG4gIHZhciBoID0gby5oICogcmFkaWFucztcbiAgcmV0dXJuIG5ldyBMYWIoby5sLCBNYXRoLmNvcyhoKSAqIG8uYywgTWF0aC5zaW4oaCkgKiBvLmMsIG8ub3BhY2l0eSk7XG59XG5cbmRlZmluZShIY2wsIGhjbCwgZXh0ZW5kKENvbG9yLCB7XG4gIGJyaWdodGVyKGspIHtcbiAgICByZXR1cm4gbmV3IEhjbCh0aGlzLmgsIHRoaXMuYywgdGhpcy5sICsgSyAqIChrID09IG51bGwgPyAxIDogayksIHRoaXMub3BhY2l0eSk7XG4gIH0sXG4gIGRhcmtlcihrKSB7XG4gICAgcmV0dXJuIG5ldyBIY2wodGhpcy5oLCB0aGlzLmMsIHRoaXMubCAtIEsgKiAoayA9PSBudWxsID8gMSA6IGspLCB0aGlzLm9wYWNpdHkpO1xuICB9LFxuICByZ2IoKSB7XG4gICAgcmV0dXJuIGhjbDJsYWIodGhpcykucmdiKCk7XG4gIH1cbn0pKTtcbiIsImV4cG9ydCBjb25zdCByYWRpYW5zID0gTWF0aC5QSSAvIDE4MDtcbmV4cG9ydCBjb25zdCBkZWdyZWVzID0gMTgwIC8gTWF0aC5QSTtcbiIsInZhciBub29wID0ge3ZhbHVlOiAoKSA9PiB7fX07XG5cbmZ1bmN0aW9uIGRpc3BhdGNoKCkge1xuICBmb3IgKHZhciBpID0gMCwgbiA9IGFyZ3VtZW50cy5sZW5ndGgsIF8gPSB7fSwgdDsgaSA8IG47ICsraSkge1xuICAgIGlmICghKHQgPSBhcmd1bWVudHNbaV0gKyBcIlwiKSB8fCAodCBpbiBfKSB8fCAvW1xccy5dLy50ZXN0KHQpKSB0aHJvdyBuZXcgRXJyb3IoXCJpbGxlZ2FsIHR5cGU6IFwiICsgdCk7XG4gICAgX1t0XSA9IFtdO1xuICB9XG4gIHJldHVybiBuZXcgRGlzcGF0Y2goXyk7XG59XG5cbmZ1bmN0aW9uIERpc3BhdGNoKF8pIHtcbiAgdGhpcy5fID0gXztcbn1cblxuZnVuY3Rpb24gcGFyc2VUeXBlbmFtZXModHlwZW5hbWVzLCB0eXBlcykge1xuICByZXR1cm4gdHlwZW5hbWVzLnRyaW0oKS5zcGxpdCgvXnxcXHMrLykubWFwKGZ1bmN0aW9uKHQpIHtcbiAgICB2YXIgbmFtZSA9IFwiXCIsIGkgPSB0LmluZGV4T2YoXCIuXCIpO1xuICAgIGlmIChpID49IDApIG5hbWUgPSB0LnNsaWNlKGkgKyAxKSwgdCA9IHQuc2xpY2UoMCwgaSk7XG4gICAgaWYgKHQgJiYgIXR5cGVzLmhhc093blByb3BlcnR5KHQpKSB0aHJvdyBuZXcgRXJyb3IoXCJ1bmtub3duIHR5cGU6IFwiICsgdCk7XG4gICAgcmV0dXJuIHt0eXBlOiB0LCBuYW1lOiBuYW1lfTtcbiAgfSk7XG59XG5cbkRpc3BhdGNoLnByb3RvdHlwZSA9IGRpc3BhdGNoLnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IERpc3BhdGNoLFxuICBvbjogZnVuY3Rpb24odHlwZW5hbWUsIGNhbGxiYWNrKSB7XG4gICAgdmFyIF8gPSB0aGlzLl8sXG4gICAgICAgIFQgPSBwYXJzZVR5cGVuYW1lcyh0eXBlbmFtZSArIFwiXCIsIF8pLFxuICAgICAgICB0LFxuICAgICAgICBpID0gLTEsXG4gICAgICAgIG4gPSBULmxlbmd0aDtcblxuICAgIC8vIElmIG5vIGNhbGxiYWNrIHdhcyBzcGVjaWZpZWQsIHJldHVybiB0aGUgY2FsbGJhY2sgb2YgdGhlIGdpdmVuIHR5cGUgYW5kIG5hbWUuXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7XG4gICAgICB3aGlsZSAoKytpIDwgbikgaWYgKCh0ID0gKHR5cGVuYW1lID0gVFtpXSkudHlwZSkgJiYgKHQgPSBnZXQoX1t0XSwgdHlwZW5hbWUubmFtZSkpKSByZXR1cm4gdDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJZiBhIHR5cGUgd2FzIHNwZWNpZmllZCwgc2V0IHRoZSBjYWxsYmFjayBmb3IgdGhlIGdpdmVuIHR5cGUgYW5kIG5hbWUuXG4gICAgLy8gT3RoZXJ3aXNlLCBpZiBhIG51bGwgY2FsbGJhY2sgd2FzIHNwZWNpZmllZCwgcmVtb3ZlIGNhbGxiYWNrcyBvZiB0aGUgZ2l2ZW4gbmFtZS5cbiAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbCAmJiB0eXBlb2YgY2FsbGJhY2sgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCBjYWxsYmFjazogXCIgKyBjYWxsYmFjayk7XG4gICAgd2hpbGUgKCsraSA8IG4pIHtcbiAgICAgIGlmICh0ID0gKHR5cGVuYW1lID0gVFtpXSkudHlwZSkgX1t0XSA9IHNldChfW3RdLCB0eXBlbmFtZS5uYW1lLCBjYWxsYmFjayk7XG4gICAgICBlbHNlIGlmIChjYWxsYmFjayA9PSBudWxsKSBmb3IgKHQgaW4gXykgX1t0XSA9IHNldChfW3RdLCB0eXBlbmFtZS5uYW1lLCBudWxsKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgY29weTogZnVuY3Rpb24oKSB7XG4gICAgdmFyIGNvcHkgPSB7fSwgXyA9IHRoaXMuXztcbiAgICBmb3IgKHZhciB0IGluIF8pIGNvcHlbdF0gPSBfW3RdLnNsaWNlKCk7XG4gICAgcmV0dXJuIG5ldyBEaXNwYXRjaChjb3B5KTtcbiAgfSxcbiAgY2FsbDogZnVuY3Rpb24odHlwZSwgdGhhdCkge1xuICAgIGlmICgobiA9IGFyZ3VtZW50cy5sZW5ndGggLSAyKSA+IDApIGZvciAodmFyIGFyZ3MgPSBuZXcgQXJyYXkobiksIGkgPSAwLCBuLCB0OyBpIDwgbjsgKytpKSBhcmdzW2ldID0gYXJndW1lbnRzW2kgKyAyXTtcbiAgICBpZiAoIXRoaXMuXy5oYXNPd25Qcm9wZXJ0eSh0eXBlKSkgdGhyb3cgbmV3IEVycm9yKFwidW5rbm93biB0eXBlOiBcIiArIHR5cGUpO1xuICAgIGZvciAodCA9IHRoaXMuX1t0eXBlXSwgaSA9IDAsIG4gPSB0Lmxlbmd0aDsgaSA8IG47ICsraSkgdFtpXS52YWx1ZS5hcHBseSh0aGF0LCBhcmdzKTtcbiAgfSxcbiAgYXBwbHk6IGZ1bmN0aW9uKHR5cGUsIHRoYXQsIGFyZ3MpIHtcbiAgICBpZiAoIXRoaXMuXy5oYXNPd25Qcm9wZXJ0eSh0eXBlKSkgdGhyb3cgbmV3IEVycm9yKFwidW5rbm93biB0eXBlOiBcIiArIHR5cGUpO1xuICAgIGZvciAodmFyIHQgPSB0aGlzLl9bdHlwZV0sIGkgPSAwLCBuID0gdC5sZW5ndGg7IGkgPCBuOyArK2kpIHRbaV0udmFsdWUuYXBwbHkodGhhdCwgYXJncyk7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIGdldCh0eXBlLCBuYW1lKSB7XG4gIGZvciAodmFyIGkgPSAwLCBuID0gdHlwZS5sZW5ndGgsIGM7IGkgPCBuOyArK2kpIHtcbiAgICBpZiAoKGMgPSB0eXBlW2ldKS5uYW1lID09PSBuYW1lKSB7XG4gICAgICByZXR1cm4gYy52YWx1ZTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc2V0KHR5cGUsIG5hbWUsIGNhbGxiYWNrKSB7XG4gIGZvciAodmFyIGkgPSAwLCBuID0gdHlwZS5sZW5ndGg7IGkgPCBuOyArK2kpIHtcbiAgICBpZiAodHlwZVtpXS5uYW1lID09PSBuYW1lKSB7XG4gICAgICB0eXBlW2ldID0gbm9vcCwgdHlwZSA9IHR5cGUuc2xpY2UoMCwgaSkuY29uY2F0KHR5cGUuc2xpY2UoaSArIDEpKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICBpZiAoY2FsbGJhY2sgIT0gbnVsbCkgdHlwZS5wdXNoKHtuYW1lOiBuYW1lLCB2YWx1ZTogY2FsbGJhY2t9KTtcbiAgcmV0dXJuIHR5cGU7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGRpc3BhdGNoO1xuIiwiaW1wb3J0IHtzZWxlY3R9IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcbmltcG9ydCBub2V2ZW50LCB7bm9ucGFzc2l2ZWNhcHR1cmV9IGZyb20gXCIuL25vZXZlbnQuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmlldykge1xuICB2YXIgcm9vdCA9IHZpZXcuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LFxuICAgICAgc2VsZWN0aW9uID0gc2VsZWN0KHZpZXcpLm9uKFwiZHJhZ3N0YXJ0LmRyYWdcIiwgbm9ldmVudCwgbm9ucGFzc2l2ZWNhcHR1cmUpO1xuICBpZiAoXCJvbnNlbGVjdHN0YXJ0XCIgaW4gcm9vdCkge1xuICAgIHNlbGVjdGlvbi5vbihcInNlbGVjdHN0YXJ0LmRyYWdcIiwgbm9ldmVudCwgbm9ucGFzc2l2ZWNhcHR1cmUpO1xuICB9IGVsc2Uge1xuICAgIHJvb3QuX19ub3NlbGVjdCA9IHJvb3Quc3R5bGUuTW96VXNlclNlbGVjdDtcbiAgICByb290LnN0eWxlLk1velVzZXJTZWxlY3QgPSBcIm5vbmVcIjtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24geWVzZHJhZyh2aWV3LCBub2NsaWNrKSB7XG4gIHZhciByb290ID0gdmlldy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsXG4gICAgICBzZWxlY3Rpb24gPSBzZWxlY3Qodmlldykub24oXCJkcmFnc3RhcnQuZHJhZ1wiLCBudWxsKTtcbiAgaWYgKG5vY2xpY2spIHtcbiAgICBzZWxlY3Rpb24ub24oXCJjbGljay5kcmFnXCIsIG5vZXZlbnQsIG5vbnBhc3NpdmVjYXB0dXJlKTtcbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyBzZWxlY3Rpb24ub24oXCJjbGljay5kcmFnXCIsIG51bGwpOyB9LCAwKTtcbiAgfVxuICBpZiAoXCJvbnNlbGVjdHN0YXJ0XCIgaW4gcm9vdCkge1xuICAgIHNlbGVjdGlvbi5vbihcInNlbGVjdHN0YXJ0LmRyYWdcIiwgbnVsbCk7XG4gIH0gZWxzZSB7XG4gICAgcm9vdC5zdHlsZS5Nb3pVc2VyU2VsZWN0ID0gcm9vdC5fX25vc2VsZWN0O1xuICAgIGRlbGV0ZSByb290Ll9fbm9zZWxlY3Q7XG4gIH1cbn1cbiIsIi8vIFRoZXNlIGFyZSB0eXBpY2FsbHkgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIG5vZXZlbnQgdG8gZW5zdXJlIHRoYXQgd2UgY2FuXG4vLyBwcmV2ZW50RGVmYXVsdCBvbiB0aGUgZXZlbnQuXG5leHBvcnQgY29uc3Qgbm9ucGFzc2l2ZSA9IHtwYXNzaXZlOiBmYWxzZX07XG5leHBvcnQgY29uc3Qgbm9ucGFzc2l2ZWNhcHR1cmUgPSB7Y2FwdHVyZTogdHJ1ZSwgcGFzc2l2ZTogZmFsc2V9O1xuXG5leHBvcnQgZnVuY3Rpb24gbm9wcm9wYWdhdGlvbihldmVudCkge1xuICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZXZlbnQpIHtcbiAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG59XG4iLCJpbXBvcnQgZHN2IGZyb20gXCIuL2Rzdi5qc1wiO1xuXG52YXIgY3N2ID0gZHN2KFwiLFwiKTtcblxuZXhwb3J0IHZhciBjc3ZQYXJzZSA9IGNzdi5wYXJzZTtcbmV4cG9ydCB2YXIgY3N2UGFyc2VSb3dzID0gY3N2LnBhcnNlUm93cztcbmV4cG9ydCB2YXIgY3N2Rm9ybWF0ID0gY3N2LmZvcm1hdDtcbmV4cG9ydCB2YXIgY3N2Rm9ybWF0Qm9keSA9IGNzdi5mb3JtYXRCb2R5O1xuZXhwb3J0IHZhciBjc3ZGb3JtYXRSb3dzID0gY3N2LmZvcm1hdFJvd3M7XG5leHBvcnQgdmFyIGNzdkZvcm1hdFJvdyA9IGNzdi5mb3JtYXRSb3c7XG5leHBvcnQgdmFyIGNzdkZvcm1hdFZhbHVlID0gY3N2LmZvcm1hdFZhbHVlO1xuIiwidmFyIEVPTCA9IHt9LFxuICAgIEVPRiA9IHt9LFxuICAgIFFVT1RFID0gMzQsXG4gICAgTkVXTElORSA9IDEwLFxuICAgIFJFVFVSTiA9IDEzO1xuXG5mdW5jdGlvbiBvYmplY3RDb252ZXJ0ZXIoY29sdW1ucykge1xuICByZXR1cm4gbmV3IEZ1bmN0aW9uKFwiZFwiLCBcInJldHVybiB7XCIgKyBjb2x1bW5zLm1hcChmdW5jdGlvbihuYW1lLCBpKSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KG5hbWUpICsgXCI6IGRbXCIgKyBpICsgXCJdIHx8IFxcXCJcXFwiXCI7XG4gIH0pLmpvaW4oXCIsXCIpICsgXCJ9XCIpO1xufVxuXG5mdW5jdGlvbiBjdXN0b21Db252ZXJ0ZXIoY29sdW1ucywgZikge1xuICB2YXIgb2JqZWN0ID0gb2JqZWN0Q29udmVydGVyKGNvbHVtbnMpO1xuICByZXR1cm4gZnVuY3Rpb24ocm93LCBpKSB7XG4gICAgcmV0dXJuIGYob2JqZWN0KHJvdyksIGksIGNvbHVtbnMpO1xuICB9O1xufVxuXG4vLyBDb21wdXRlIHVuaXF1ZSBjb2x1bW5zIGluIG9yZGVyIG9mIGRpc2NvdmVyeS5cbmZ1bmN0aW9uIGluZmVyQ29sdW1ucyhyb3dzKSB7XG4gIHZhciBjb2x1bW5TZXQgPSBPYmplY3QuY3JlYXRlKG51bGwpLFxuICAgICAgY29sdW1ucyA9IFtdO1xuXG4gIHJvd3MuZm9yRWFjaChmdW5jdGlvbihyb3cpIHtcbiAgICBmb3IgKHZhciBjb2x1bW4gaW4gcm93KSB7XG4gICAgICBpZiAoIShjb2x1bW4gaW4gY29sdW1uU2V0KSkge1xuICAgICAgICBjb2x1bW5zLnB1c2goY29sdW1uU2V0W2NvbHVtbl0gPSBjb2x1bW4pO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIGNvbHVtbnM7XG59XG5cbmZ1bmN0aW9uIHBhZCh2YWx1ZSwgd2lkdGgpIHtcbiAgdmFyIHMgPSB2YWx1ZSArIFwiXCIsIGxlbmd0aCA9IHMubGVuZ3RoO1xuICByZXR1cm4gbGVuZ3RoIDwgd2lkdGggPyBuZXcgQXJyYXkod2lkdGggLSBsZW5ndGggKyAxKS5qb2luKDApICsgcyA6IHM7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFllYXIoeWVhcikge1xuICByZXR1cm4geWVhciA8IDAgPyBcIi1cIiArIHBhZCgteWVhciwgNilcbiAgICA6IHllYXIgPiA5OTk5ID8gXCIrXCIgKyBwYWQoeWVhciwgNilcbiAgICA6IHBhZCh5ZWFyLCA0KTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0RGF0ZShkYXRlKSB7XG4gIHZhciBob3VycyA9IGRhdGUuZ2V0VVRDSG91cnMoKSxcbiAgICAgIG1pbnV0ZXMgPSBkYXRlLmdldFVUQ01pbnV0ZXMoKSxcbiAgICAgIHNlY29uZHMgPSBkYXRlLmdldFVUQ1NlY29uZHMoKSxcbiAgICAgIG1pbGxpc2Vjb25kcyA9IGRhdGUuZ2V0VVRDTWlsbGlzZWNvbmRzKCk7XG4gIHJldHVybiBpc05hTihkYXRlKSA/IFwiSW52YWxpZCBEYXRlXCJcbiAgICAgIDogZm9ybWF0WWVhcihkYXRlLmdldFVUQ0Z1bGxZZWFyKCksIDQpICsgXCItXCIgKyBwYWQoZGF0ZS5nZXRVVENNb250aCgpICsgMSwgMikgKyBcIi1cIiArIHBhZChkYXRlLmdldFVUQ0RhdGUoKSwgMilcbiAgICAgICsgKG1pbGxpc2Vjb25kcyA/IFwiVFwiICsgcGFkKGhvdXJzLCAyKSArIFwiOlwiICsgcGFkKG1pbnV0ZXMsIDIpICsgXCI6XCIgKyBwYWQoc2Vjb25kcywgMikgKyBcIi5cIiArIHBhZChtaWxsaXNlY29uZHMsIDMpICsgXCJaXCJcbiAgICAgIDogc2Vjb25kcyA/IFwiVFwiICsgcGFkKGhvdXJzLCAyKSArIFwiOlwiICsgcGFkKG1pbnV0ZXMsIDIpICsgXCI6XCIgKyBwYWQoc2Vjb25kcywgMikgKyBcIlpcIlxuICAgICAgOiBtaW51dGVzIHx8IGhvdXJzID8gXCJUXCIgKyBwYWQoaG91cnMsIDIpICsgXCI6XCIgKyBwYWQobWludXRlcywgMikgKyBcIlpcIlxuICAgICAgOiBcIlwiKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZGVsaW1pdGVyKSB7XG4gIHZhciByZUZvcm1hdCA9IG5ldyBSZWdFeHAoXCJbXFxcIlwiICsgZGVsaW1pdGVyICsgXCJcXG5cXHJdXCIpLFxuICAgICAgREVMSU1JVEVSID0gZGVsaW1pdGVyLmNoYXJDb2RlQXQoMCk7XG5cbiAgZnVuY3Rpb24gcGFyc2UodGV4dCwgZikge1xuICAgIHZhciBjb252ZXJ0LCBjb2x1bW5zLCByb3dzID0gcGFyc2VSb3dzKHRleHQsIGZ1bmN0aW9uKHJvdywgaSkge1xuICAgICAgaWYgKGNvbnZlcnQpIHJldHVybiBjb252ZXJ0KHJvdywgaSAtIDEpO1xuICAgICAgY29sdW1ucyA9IHJvdywgY29udmVydCA9IGYgPyBjdXN0b21Db252ZXJ0ZXIocm93LCBmKSA6IG9iamVjdENvbnZlcnRlcihyb3cpO1xuICAgIH0pO1xuICAgIHJvd3MuY29sdW1ucyA9IGNvbHVtbnMgfHwgW107XG4gICAgcmV0dXJuIHJvd3M7XG4gIH1cblxuICBmdW5jdGlvbiBwYXJzZVJvd3ModGV4dCwgZikge1xuICAgIHZhciByb3dzID0gW10sIC8vIG91dHB1dCByb3dzXG4gICAgICAgIE4gPSB0ZXh0Lmxlbmd0aCxcbiAgICAgICAgSSA9IDAsIC8vIGN1cnJlbnQgY2hhcmFjdGVyIGluZGV4XG4gICAgICAgIG4gPSAwLCAvLyBjdXJyZW50IGxpbmUgbnVtYmVyXG4gICAgICAgIHQsIC8vIGN1cnJlbnQgdG9rZW5cbiAgICAgICAgZW9mID0gTiA8PSAwLCAvLyBjdXJyZW50IHRva2VuIGZvbGxvd2VkIGJ5IEVPRj9cbiAgICAgICAgZW9sID0gZmFsc2U7IC8vIGN1cnJlbnQgdG9rZW4gZm9sbG93ZWQgYnkgRU9MP1xuXG4gICAgLy8gU3RyaXAgdGhlIHRyYWlsaW5nIG5ld2xpbmUuXG4gICAgaWYgKHRleHQuY2hhckNvZGVBdChOIC0gMSkgPT09IE5FV0xJTkUpIC0tTjtcbiAgICBpZiAodGV4dC5jaGFyQ29kZUF0KE4gLSAxKSA9PT0gUkVUVVJOKSAtLU47XG5cbiAgICBmdW5jdGlvbiB0b2tlbigpIHtcbiAgICAgIGlmIChlb2YpIHJldHVybiBFT0Y7XG4gICAgICBpZiAoZW9sKSByZXR1cm4gZW9sID0gZmFsc2UsIEVPTDtcblxuICAgICAgLy8gVW5lc2NhcGUgcXVvdGVzLlxuICAgICAgdmFyIGksIGogPSBJLCBjO1xuICAgICAgaWYgKHRleHQuY2hhckNvZGVBdChqKSA9PT0gUVVPVEUpIHtcbiAgICAgICAgd2hpbGUgKEkrKyA8IE4gJiYgdGV4dC5jaGFyQ29kZUF0KEkpICE9PSBRVU9URSB8fCB0ZXh0LmNoYXJDb2RlQXQoKytJKSA9PT0gUVVPVEUpO1xuICAgICAgICBpZiAoKGkgPSBJKSA+PSBOKSBlb2YgPSB0cnVlO1xuICAgICAgICBlbHNlIGlmICgoYyA9IHRleHQuY2hhckNvZGVBdChJKyspKSA9PT0gTkVXTElORSkgZW9sID0gdHJ1ZTtcbiAgICAgICAgZWxzZSBpZiAoYyA9PT0gUkVUVVJOKSB7IGVvbCA9IHRydWU7IGlmICh0ZXh0LmNoYXJDb2RlQXQoSSkgPT09IE5FV0xJTkUpICsrSTsgfVxuICAgICAgICByZXR1cm4gdGV4dC5zbGljZShqICsgMSwgaSAtIDEpLnJlcGxhY2UoL1wiXCIvZywgXCJcXFwiXCIpO1xuICAgICAgfVxuXG4gICAgICAvLyBGaW5kIG5leHQgZGVsaW1pdGVyIG9yIG5ld2xpbmUuXG4gICAgICB3aGlsZSAoSSA8IE4pIHtcbiAgICAgICAgaWYgKChjID0gdGV4dC5jaGFyQ29kZUF0KGkgPSBJKyspKSA9PT0gTkVXTElORSkgZW9sID0gdHJ1ZTtcbiAgICAgICAgZWxzZSBpZiAoYyA9PT0gUkVUVVJOKSB7IGVvbCA9IHRydWU7IGlmICh0ZXh0LmNoYXJDb2RlQXQoSSkgPT09IE5FV0xJTkUpICsrSTsgfVxuICAgICAgICBlbHNlIGlmIChjICE9PSBERUxJTUlURVIpIGNvbnRpbnVlO1xuICAgICAgICByZXR1cm4gdGV4dC5zbGljZShqLCBpKTtcbiAgICAgIH1cblxuICAgICAgLy8gUmV0dXJuIGxhc3QgdG9rZW4gYmVmb3JlIEVPRi5cbiAgICAgIHJldHVybiBlb2YgPSB0cnVlLCB0ZXh0LnNsaWNlKGosIE4pO1xuICAgIH1cblxuICAgIHdoaWxlICgodCA9IHRva2VuKCkpICE9PSBFT0YpIHtcbiAgICAgIHZhciByb3cgPSBbXTtcbiAgICAgIHdoaWxlICh0ICE9PSBFT0wgJiYgdCAhPT0gRU9GKSByb3cucHVzaCh0KSwgdCA9IHRva2VuKCk7XG4gICAgICBpZiAoZiAmJiAocm93ID0gZihyb3csIG4rKykpID09IG51bGwpIGNvbnRpbnVlO1xuICAgICAgcm93cy5wdXNoKHJvdyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJvd3M7XG4gIH1cblxuICBmdW5jdGlvbiBwcmVmb3JtYXRCb2R5KHJvd3MsIGNvbHVtbnMpIHtcbiAgICByZXR1cm4gcm93cy5tYXAoZnVuY3Rpb24ocm93KSB7XG4gICAgICByZXR1cm4gY29sdW1ucy5tYXAoZnVuY3Rpb24oY29sdW1uKSB7XG4gICAgICAgIHJldHVybiBmb3JtYXRWYWx1ZShyb3dbY29sdW1uXSk7XG4gICAgICB9KS5qb2luKGRlbGltaXRlcik7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBmb3JtYXQocm93cywgY29sdW1ucykge1xuICAgIGlmIChjb2x1bW5zID09IG51bGwpIGNvbHVtbnMgPSBpbmZlckNvbHVtbnMocm93cyk7XG4gICAgcmV0dXJuIFtjb2x1bW5zLm1hcChmb3JtYXRWYWx1ZSkuam9pbihkZWxpbWl0ZXIpXS5jb25jYXQocHJlZm9ybWF0Qm9keShyb3dzLCBjb2x1bW5zKSkuam9pbihcIlxcblwiKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZvcm1hdEJvZHkocm93cywgY29sdW1ucykge1xuICAgIGlmIChjb2x1bW5zID09IG51bGwpIGNvbHVtbnMgPSBpbmZlckNvbHVtbnMocm93cyk7XG4gICAgcmV0dXJuIHByZWZvcm1hdEJvZHkocm93cywgY29sdW1ucykuam9pbihcIlxcblwiKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZvcm1hdFJvd3Mocm93cykge1xuICAgIHJldHVybiByb3dzLm1hcChmb3JtYXRSb3cpLmpvaW4oXCJcXG5cIik7XG4gIH1cblxuICBmdW5jdGlvbiBmb3JtYXRSb3cocm93KSB7XG4gICAgcmV0dXJuIHJvdy5tYXAoZm9ybWF0VmFsdWUpLmpvaW4oZGVsaW1pdGVyKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZvcm1hdFZhbHVlKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID09IG51bGwgPyBcIlwiXG4gICAgICAgIDogdmFsdWUgaW5zdGFuY2VvZiBEYXRlID8gZm9ybWF0RGF0ZSh2YWx1ZSlcbiAgICAgICAgOiByZUZvcm1hdC50ZXN0KHZhbHVlICs9IFwiXCIpID8gXCJcXFwiXCIgKyB2YWx1ZS5yZXBsYWNlKC9cIi9nLCBcIlxcXCJcXFwiXCIpICsgXCJcXFwiXCJcbiAgICAgICAgOiB2YWx1ZTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgcGFyc2U6IHBhcnNlLFxuICAgIHBhcnNlUm93czogcGFyc2VSb3dzLFxuICAgIGZvcm1hdDogZm9ybWF0LFxuICAgIGZvcm1hdEJvZHk6IGZvcm1hdEJvZHksXG4gICAgZm9ybWF0Um93czogZm9ybWF0Um93cyxcbiAgICBmb3JtYXRSb3c6IGZvcm1hdFJvdyxcbiAgICBmb3JtYXRWYWx1ZTogZm9ybWF0VmFsdWVcbiAgfTtcbn1cbiIsImltcG9ydCBkc3YgZnJvbSBcIi4vZHN2LmpzXCI7XG5cbnZhciB0c3YgPSBkc3YoXCJcXHRcIik7XG5cbmV4cG9ydCB2YXIgdHN2UGFyc2UgPSB0c3YucGFyc2U7XG5leHBvcnQgdmFyIHRzdlBhcnNlUm93cyA9IHRzdi5wYXJzZVJvd3M7XG5leHBvcnQgdmFyIHRzdkZvcm1hdCA9IHRzdi5mb3JtYXQ7XG5leHBvcnQgdmFyIHRzdkZvcm1hdEJvZHkgPSB0c3YuZm9ybWF0Qm9keTtcbmV4cG9ydCB2YXIgdHN2Rm9ybWF0Um93cyA9IHRzdi5mb3JtYXRSb3dzO1xuZXhwb3J0IHZhciB0c3ZGb3JtYXRSb3cgPSB0c3YuZm9ybWF0Um93O1xuZXhwb3J0IHZhciB0c3ZGb3JtYXRWYWx1ZSA9IHRzdi5mb3JtYXRWYWx1ZTtcbiIsImV4cG9ydCBmdW5jdGlvbiBjdWJpY0luKHQpIHtcbiAgcmV0dXJuIHQgKiB0ICogdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGN1YmljT3V0KHQpIHtcbiAgcmV0dXJuIC0tdCAqIHQgKiB0ICsgMTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGN1YmljSW5PdXQodCkge1xuICByZXR1cm4gKCh0ICo9IDIpIDw9IDEgPyB0ICogdCAqIHQgOiAodCAtPSAyKSAqIHQgKiB0ICsgMikgLyAyO1xufVxuIiwiaW1wb3J0IHtjc3ZQYXJzZSwgZHN2Rm9ybWF0LCB0c3ZQYXJzZX0gZnJvbSBcImQzLWRzdlwiO1xuaW1wb3J0IHRleHQgZnJvbSBcIi4vdGV4dC5qc1wiO1xuXG5mdW5jdGlvbiBkc3ZQYXJzZShwYXJzZSkge1xuICByZXR1cm4gZnVuY3Rpb24oaW5wdXQsIGluaXQsIHJvdykge1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyICYmIHR5cGVvZiBpbml0ID09PSBcImZ1bmN0aW9uXCIpIHJvdyA9IGluaXQsIGluaXQgPSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHRleHQoaW5wdXQsIGluaXQpLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHtcbiAgICAgIHJldHVybiBwYXJzZShyZXNwb25zZSwgcm93KTtcbiAgICB9KTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZHN2KGRlbGltaXRlciwgaW5wdXQsIGluaXQsIHJvdykge1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMyAmJiB0eXBlb2YgaW5pdCA9PT0gXCJmdW5jdGlvblwiKSByb3cgPSBpbml0LCBpbml0ID0gdW5kZWZpbmVkO1xuICB2YXIgZm9ybWF0ID0gZHN2Rm9ybWF0KGRlbGltaXRlcik7XG4gIHJldHVybiB0ZXh0KGlucHV0LCBpbml0KS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7XG4gICAgcmV0dXJuIGZvcm1hdC5wYXJzZShyZXNwb25zZSwgcm93KTtcbiAgfSk7XG59XG5cbmV4cG9ydCB2YXIgY3N2ID0gZHN2UGFyc2UoY3N2UGFyc2UpO1xuZXhwb3J0IHZhciB0c3YgPSBkc3ZQYXJzZSh0c3ZQYXJzZSk7XG4iLCJmdW5jdGlvbiByZXNwb25zZUpzb24ocmVzcG9uc2UpIHtcbiAgaWYgKCFyZXNwb25zZS5vaykgdGhyb3cgbmV3IEVycm9yKHJlc3BvbnNlLnN0YXR1cyArIFwiIFwiICsgcmVzcG9uc2Uuc3RhdHVzVGV4dCk7XG4gIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDIwNCB8fCByZXNwb25zZS5zdGF0dXMgPT09IDIwNSkgcmV0dXJuO1xuICByZXR1cm4gcmVzcG9uc2UuanNvbigpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihpbnB1dCwgaW5pdCkge1xuICByZXR1cm4gZmV0Y2goaW5wdXQsIGluaXQpLnRoZW4ocmVzcG9uc2VKc29uKTtcbn1cbiIsImZ1bmN0aW9uIHJlc3BvbnNlVGV4dChyZXNwb25zZSkge1xuICBpZiAoIXJlc3BvbnNlLm9rKSB0aHJvdyBuZXcgRXJyb3IocmVzcG9uc2Uuc3RhdHVzICsgXCIgXCIgKyByZXNwb25zZS5zdGF0dXNUZXh0KTtcbiAgcmV0dXJuIHJlc3BvbnNlLnRleHQoKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oaW5wdXQsIGluaXQpIHtcbiAgcmV0dXJuIGZldGNoKGlucHV0LCBpbml0KS50aGVuKHJlc3BvbnNlVGV4dCk7XG59XG4iLCJpbXBvcnQgZm9ybWF0TG9jYWxlIGZyb20gXCIuL2xvY2FsZS5qc1wiO1xuXG52YXIgbG9jYWxlO1xuZXhwb3J0IHZhciBmb3JtYXQ7XG5leHBvcnQgdmFyIGZvcm1hdFByZWZpeDtcblxuZGVmYXVsdExvY2FsZSh7XG4gIHRob3VzYW5kczogXCIsXCIsXG4gIGdyb3VwaW5nOiBbM10sXG4gIGN1cnJlbmN5OiBbXCIkXCIsIFwiXCJdXG59KTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZGVmYXVsdExvY2FsZShkZWZpbml0aW9uKSB7XG4gIGxvY2FsZSA9IGZvcm1hdExvY2FsZShkZWZpbml0aW9uKTtcbiAgZm9ybWF0ID0gbG9jYWxlLmZvcm1hdDtcbiAgZm9ybWF0UHJlZml4ID0gbG9jYWxlLmZvcm1hdFByZWZpeDtcbiAgcmV0dXJuIGxvY2FsZTtcbn1cbiIsImltcG9ydCB7Zm9ybWF0RGVjaW1hbFBhcnRzfSBmcm9tIFwiLi9mb3JtYXREZWNpbWFsLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHgpIHtcbiAgcmV0dXJuIHggPSBmb3JtYXREZWNpbWFsUGFydHMoTWF0aC5hYnMoeCkpLCB4ID8geFsxXSA6IE5hTjtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHgpIHtcbiAgcmV0dXJuIE1hdGguYWJzKHggPSBNYXRoLnJvdW5kKHgpKSA+PSAxZTIxXG4gICAgICA/IHgudG9Mb2NhbGVTdHJpbmcoXCJlblwiKS5yZXBsYWNlKC8sL2csIFwiXCIpXG4gICAgICA6IHgudG9TdHJpbmcoMTApO1xufVxuXG4vLyBDb21wdXRlcyB0aGUgZGVjaW1hbCBjb2VmZmljaWVudCBhbmQgZXhwb25lbnQgb2YgdGhlIHNwZWNpZmllZCBudW1iZXIgeCB3aXRoXG4vLyBzaWduaWZpY2FudCBkaWdpdHMgcCwgd2hlcmUgeCBpcyBwb3NpdGl2ZSBhbmQgcCBpcyBpbiBbMSwgMjFdIG9yIHVuZGVmaW5lZC5cbi8vIEZvciBleGFtcGxlLCBmb3JtYXREZWNpbWFsUGFydHMoMS4yMykgcmV0dXJucyBbXCIxMjNcIiwgMF0uXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0RGVjaW1hbFBhcnRzKHgsIHApIHtcbiAgaWYgKChpID0gKHggPSBwID8geC50b0V4cG9uZW50aWFsKHAgLSAxKSA6IHgudG9FeHBvbmVudGlhbCgpKS5pbmRleE9mKFwiZVwiKSkgPCAwKSByZXR1cm4gbnVsbDsgLy8gTmFOLCDCsUluZmluaXR5XG4gIHZhciBpLCBjb2VmZmljaWVudCA9IHguc2xpY2UoMCwgaSk7XG5cbiAgLy8gVGhlIHN0cmluZyByZXR1cm5lZCBieSB0b0V4cG9uZW50aWFsIGVpdGhlciBoYXMgdGhlIGZvcm0gXFxkXFwuXFxkK2VbLStdXFxkK1xuICAvLyAoZS5nLiwgMS4yZSszKSBvciB0aGUgZm9ybSBcXGRlWy0rXVxcZCsgKGUuZy4sIDFlKzMpLlxuICByZXR1cm4gW1xuICAgIGNvZWZmaWNpZW50Lmxlbmd0aCA+IDEgPyBjb2VmZmljaWVudFswXSArIGNvZWZmaWNpZW50LnNsaWNlKDIpIDogY29lZmZpY2llbnQsXG4gICAgK3guc2xpY2UoaSArIDEpXG4gIF07XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihncm91cGluZywgdGhvdXNhbmRzKSB7XG4gIHJldHVybiBmdW5jdGlvbih2YWx1ZSwgd2lkdGgpIHtcbiAgICB2YXIgaSA9IHZhbHVlLmxlbmd0aCxcbiAgICAgICAgdCA9IFtdLFxuICAgICAgICBqID0gMCxcbiAgICAgICAgZyA9IGdyb3VwaW5nWzBdLFxuICAgICAgICBsZW5ndGggPSAwO1xuXG4gICAgd2hpbGUgKGkgPiAwICYmIGcgPiAwKSB7XG4gICAgICBpZiAobGVuZ3RoICsgZyArIDEgPiB3aWR0aCkgZyA9IE1hdGgubWF4KDEsIHdpZHRoIC0gbGVuZ3RoKTtcbiAgICAgIHQucHVzaCh2YWx1ZS5zdWJzdHJpbmcoaSAtPSBnLCBpICsgZykpO1xuICAgICAgaWYgKChsZW5ndGggKz0gZyArIDEpID4gd2lkdGgpIGJyZWFrO1xuICAgICAgZyA9IGdyb3VwaW5nW2ogPSAoaiArIDEpICUgZ3JvdXBpbmcubGVuZ3RoXTtcbiAgICB9XG5cbiAgICByZXR1cm4gdC5yZXZlcnNlKCkuam9pbih0aG91c2FuZHMpO1xuICB9O1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obnVtZXJhbHMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoL1swLTldL2csIGZ1bmN0aW9uKGkpIHtcbiAgICAgIHJldHVybiBudW1lcmFsc1sraV07XG4gICAgfSk7XG4gIH07XG59XG4iLCJpbXBvcnQge2Zvcm1hdERlY2ltYWxQYXJ0c30gZnJvbSBcIi4vZm9ybWF0RGVjaW1hbC5qc1wiO1xuXG5leHBvcnQgdmFyIHByZWZpeEV4cG9uZW50O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih4LCBwKSB7XG4gIHZhciBkID0gZm9ybWF0RGVjaW1hbFBhcnRzKHgsIHApO1xuICBpZiAoIWQpIHJldHVybiB4ICsgXCJcIjtcbiAgdmFyIGNvZWZmaWNpZW50ID0gZFswXSxcbiAgICAgIGV4cG9uZW50ID0gZFsxXSxcbiAgICAgIGkgPSBleHBvbmVudCAtIChwcmVmaXhFeHBvbmVudCA9IE1hdGgubWF4KC04LCBNYXRoLm1pbig4LCBNYXRoLmZsb29yKGV4cG9uZW50IC8gMykpKSAqIDMpICsgMSxcbiAgICAgIG4gPSBjb2VmZmljaWVudC5sZW5ndGg7XG4gIHJldHVybiBpID09PSBuID8gY29lZmZpY2llbnRcbiAgICAgIDogaSA+IG4gPyBjb2VmZmljaWVudCArIG5ldyBBcnJheShpIC0gbiArIDEpLmpvaW4oXCIwXCIpXG4gICAgICA6IGkgPiAwID8gY29lZmZpY2llbnQuc2xpY2UoMCwgaSkgKyBcIi5cIiArIGNvZWZmaWNpZW50LnNsaWNlKGkpXG4gICAgICA6IFwiMC5cIiArIG5ldyBBcnJheSgxIC0gaSkuam9pbihcIjBcIikgKyBmb3JtYXREZWNpbWFsUGFydHMoeCwgTWF0aC5tYXgoMCwgcCArIGkgLSAxKSlbMF07IC8vIGxlc3MgdGhhbiAxeSFcbn1cbiIsImltcG9ydCB7Zm9ybWF0RGVjaW1hbFBhcnRzfSBmcm9tIFwiLi9mb3JtYXREZWNpbWFsLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHgsIHApIHtcbiAgdmFyIGQgPSBmb3JtYXREZWNpbWFsUGFydHMoeCwgcCk7XG4gIGlmICghZCkgcmV0dXJuIHggKyBcIlwiO1xuICB2YXIgY29lZmZpY2llbnQgPSBkWzBdLFxuICAgICAgZXhwb25lbnQgPSBkWzFdO1xuICByZXR1cm4gZXhwb25lbnQgPCAwID8gXCIwLlwiICsgbmV3IEFycmF5KC1leHBvbmVudCkuam9pbihcIjBcIikgKyBjb2VmZmljaWVudFxuICAgICAgOiBjb2VmZmljaWVudC5sZW5ndGggPiBleHBvbmVudCArIDEgPyBjb2VmZmljaWVudC5zbGljZSgwLCBleHBvbmVudCArIDEpICsgXCIuXCIgKyBjb2VmZmljaWVudC5zbGljZShleHBvbmVudCArIDEpXG4gICAgICA6IGNvZWZmaWNpZW50ICsgbmV3IEFycmF5KGV4cG9uZW50IC0gY29lZmZpY2llbnQubGVuZ3RoICsgMikuam9pbihcIjBcIik7XG59XG4iLCIvLyBbW2ZpbGxdYWxpZ25dW3NpZ25dW3N5bWJvbF1bMF1bd2lkdGhdWyxdWy5wcmVjaXNpb25dW35dW3R5cGVdXG52YXIgcmUgPSAvXig/OiguKT8oWzw+PV5dKSk/KFsrXFwtKCBdKT8oWyQjXSk/KDApPyhcXGQrKT8oLCk/KFxcLlxcZCspPyh+KT8oW2EteiVdKT8kL2k7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGZvcm1hdFNwZWNpZmllcihzcGVjaWZpZXIpIHtcbiAgaWYgKCEobWF0Y2ggPSByZS5leGVjKHNwZWNpZmllcikpKSB0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIGZvcm1hdDogXCIgKyBzcGVjaWZpZXIpO1xuICB2YXIgbWF0Y2g7XG4gIHJldHVybiBuZXcgRm9ybWF0U3BlY2lmaWVyKHtcbiAgICBmaWxsOiBtYXRjaFsxXSxcbiAgICBhbGlnbjogbWF0Y2hbMl0sXG4gICAgc2lnbjogbWF0Y2hbM10sXG4gICAgc3ltYm9sOiBtYXRjaFs0XSxcbiAgICB6ZXJvOiBtYXRjaFs1XSxcbiAgICB3aWR0aDogbWF0Y2hbNl0sXG4gICAgY29tbWE6IG1hdGNoWzddLFxuICAgIHByZWNpc2lvbjogbWF0Y2hbOF0gJiYgbWF0Y2hbOF0uc2xpY2UoMSksXG4gICAgdHJpbTogbWF0Y2hbOV0sXG4gICAgdHlwZTogbWF0Y2hbMTBdXG4gIH0pO1xufVxuXG5mb3JtYXRTcGVjaWZpZXIucHJvdG90eXBlID0gRm9ybWF0U3BlY2lmaWVyLnByb3RvdHlwZTsgLy8gaW5zdGFuY2VvZlxuXG5leHBvcnQgZnVuY3Rpb24gRm9ybWF0U3BlY2lmaWVyKHNwZWNpZmllcikge1xuICB0aGlzLmZpbGwgPSBzcGVjaWZpZXIuZmlsbCA9PT0gdW5kZWZpbmVkID8gXCIgXCIgOiBzcGVjaWZpZXIuZmlsbCArIFwiXCI7XG4gIHRoaXMuYWxpZ24gPSBzcGVjaWZpZXIuYWxpZ24gPT09IHVuZGVmaW5lZCA/IFwiPlwiIDogc3BlY2lmaWVyLmFsaWduICsgXCJcIjtcbiAgdGhpcy5zaWduID0gc3BlY2lmaWVyLnNpZ24gPT09IHVuZGVmaW5lZCA/IFwiLVwiIDogc3BlY2lmaWVyLnNpZ24gKyBcIlwiO1xuICB0aGlzLnN5bWJvbCA9IHNwZWNpZmllci5zeW1ib2wgPT09IHVuZGVmaW5lZCA/IFwiXCIgOiBzcGVjaWZpZXIuc3ltYm9sICsgXCJcIjtcbiAgdGhpcy56ZXJvID0gISFzcGVjaWZpZXIuemVybztcbiAgdGhpcy53aWR0aCA9IHNwZWNpZmllci53aWR0aCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogK3NwZWNpZmllci53aWR0aDtcbiAgdGhpcy5jb21tYSA9ICEhc3BlY2lmaWVyLmNvbW1hO1xuICB0aGlzLnByZWNpc2lvbiA9IHNwZWNpZmllci5wcmVjaXNpb24gPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6ICtzcGVjaWZpZXIucHJlY2lzaW9uO1xuICB0aGlzLnRyaW0gPSAhIXNwZWNpZmllci50cmltO1xuICB0aGlzLnR5cGUgPSBzcGVjaWZpZXIudHlwZSA9PT0gdW5kZWZpbmVkID8gXCJcIiA6IHNwZWNpZmllci50eXBlICsgXCJcIjtcbn1cblxuRm9ybWF0U3BlY2lmaWVyLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5maWxsXG4gICAgICArIHRoaXMuYWxpZ25cbiAgICAgICsgdGhpcy5zaWduXG4gICAgICArIHRoaXMuc3ltYm9sXG4gICAgICArICh0aGlzLnplcm8gPyBcIjBcIiA6IFwiXCIpXG4gICAgICArICh0aGlzLndpZHRoID09PSB1bmRlZmluZWQgPyBcIlwiIDogTWF0aC5tYXgoMSwgdGhpcy53aWR0aCB8IDApKVxuICAgICAgKyAodGhpcy5jb21tYSA/IFwiLFwiIDogXCJcIilcbiAgICAgICsgKHRoaXMucHJlY2lzaW9uID09PSB1bmRlZmluZWQgPyBcIlwiIDogXCIuXCIgKyBNYXRoLm1heCgwLCB0aGlzLnByZWNpc2lvbiB8IDApKVxuICAgICAgKyAodGhpcy50cmltID8gXCJ+XCIgOiBcIlwiKVxuICAgICAgKyB0aGlzLnR5cGU7XG59O1xuIiwiLy8gVHJpbXMgaW5zaWduaWZpY2FudCB6ZXJvcywgZS5nLiwgcmVwbGFjZXMgMS4yMDAwayB3aXRoIDEuMmsuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzKSB7XG4gIG91dDogZm9yICh2YXIgbiA9IHMubGVuZ3RoLCBpID0gMSwgaTAgPSAtMSwgaTE7IGkgPCBuOyArK2kpIHtcbiAgICBzd2l0Y2ggKHNbaV0pIHtcbiAgICAgIGNhc2UgXCIuXCI6IGkwID0gaTEgPSBpOyBicmVhaztcbiAgICAgIGNhc2UgXCIwXCI6IGlmIChpMCA9PT0gMCkgaTAgPSBpOyBpMSA9IGk7IGJyZWFrO1xuICAgICAgZGVmYXVsdDogaWYgKCErc1tpXSkgYnJlYWsgb3V0OyBpZiAoaTAgPiAwKSBpMCA9IDA7IGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gaTAgPiAwID8gcy5zbGljZSgwLCBpMCkgKyBzLnNsaWNlKGkxICsgMSkgOiBzO1xufVxuIiwiaW1wb3J0IGZvcm1hdERlY2ltYWwgZnJvbSBcIi4vZm9ybWF0RGVjaW1hbC5qc1wiO1xuaW1wb3J0IGZvcm1hdFByZWZpeEF1dG8gZnJvbSBcIi4vZm9ybWF0UHJlZml4QXV0by5qc1wiO1xuaW1wb3J0IGZvcm1hdFJvdW5kZWQgZnJvbSBcIi4vZm9ybWF0Um91bmRlZC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIFwiJVwiOiAoeCwgcCkgPT4gKHggKiAxMDApLnRvRml4ZWQocCksXG4gIFwiYlwiOiAoeCkgPT4gTWF0aC5yb3VuZCh4KS50b1N0cmluZygyKSxcbiAgXCJjXCI6ICh4KSA9PiB4ICsgXCJcIixcbiAgXCJkXCI6IGZvcm1hdERlY2ltYWwsXG4gIFwiZVwiOiAoeCwgcCkgPT4geC50b0V4cG9uZW50aWFsKHApLFxuICBcImZcIjogKHgsIHApID0+IHgudG9GaXhlZChwKSxcbiAgXCJnXCI6ICh4LCBwKSA9PiB4LnRvUHJlY2lzaW9uKHApLFxuICBcIm9cIjogKHgpID0+IE1hdGgucm91bmQoeCkudG9TdHJpbmcoOCksXG4gIFwicFwiOiAoeCwgcCkgPT4gZm9ybWF0Um91bmRlZCh4ICogMTAwLCBwKSxcbiAgXCJyXCI6IGZvcm1hdFJvdW5kZWQsXG4gIFwic1wiOiBmb3JtYXRQcmVmaXhBdXRvLFxuICBcIlhcIjogKHgpID0+IE1hdGgucm91bmQoeCkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCksXG4gIFwieFwiOiAoeCkgPT4gTWF0aC5yb3VuZCh4KS50b1N0cmluZygxNilcbn07XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbih4KSB7XG4gIHJldHVybiB4O1xufVxuIiwiaW1wb3J0IGV4cG9uZW50IGZyb20gXCIuL2V4cG9uZW50LmpzXCI7XG5pbXBvcnQgZm9ybWF0R3JvdXAgZnJvbSBcIi4vZm9ybWF0R3JvdXAuanNcIjtcbmltcG9ydCBmb3JtYXROdW1lcmFscyBmcm9tIFwiLi9mb3JtYXROdW1lcmFscy5qc1wiO1xuaW1wb3J0IGZvcm1hdFNwZWNpZmllciBmcm9tIFwiLi9mb3JtYXRTcGVjaWZpZXIuanNcIjtcbmltcG9ydCBmb3JtYXRUcmltIGZyb20gXCIuL2Zvcm1hdFRyaW0uanNcIjtcbmltcG9ydCBmb3JtYXRUeXBlcyBmcm9tIFwiLi9mb3JtYXRUeXBlcy5qc1wiO1xuaW1wb3J0IHtwcmVmaXhFeHBvbmVudH0gZnJvbSBcIi4vZm9ybWF0UHJlZml4QXV0by5qc1wiO1xuaW1wb3J0IGlkZW50aXR5IGZyb20gXCIuL2lkZW50aXR5LmpzXCI7XG5cbnZhciBtYXAgPSBBcnJheS5wcm90b3R5cGUubWFwLFxuICAgIHByZWZpeGVzID0gW1wieVwiLFwielwiLFwiYVwiLFwiZlwiLFwicFwiLFwiblwiLFwiwrVcIixcIm1cIixcIlwiLFwia1wiLFwiTVwiLFwiR1wiLFwiVFwiLFwiUFwiLFwiRVwiLFwiWlwiLFwiWVwiXTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obG9jYWxlKSB7XG4gIHZhciBncm91cCA9IGxvY2FsZS5ncm91cGluZyA9PT0gdW5kZWZpbmVkIHx8IGxvY2FsZS50aG91c2FuZHMgPT09IHVuZGVmaW5lZCA/IGlkZW50aXR5IDogZm9ybWF0R3JvdXAobWFwLmNhbGwobG9jYWxlLmdyb3VwaW5nLCBOdW1iZXIpLCBsb2NhbGUudGhvdXNhbmRzICsgXCJcIiksXG4gICAgICBjdXJyZW5jeVByZWZpeCA9IGxvY2FsZS5jdXJyZW5jeSA9PT0gdW5kZWZpbmVkID8gXCJcIiA6IGxvY2FsZS5jdXJyZW5jeVswXSArIFwiXCIsXG4gICAgICBjdXJyZW5jeVN1ZmZpeCA9IGxvY2FsZS5jdXJyZW5jeSA9PT0gdW5kZWZpbmVkID8gXCJcIiA6IGxvY2FsZS5jdXJyZW5jeVsxXSArIFwiXCIsXG4gICAgICBkZWNpbWFsID0gbG9jYWxlLmRlY2ltYWwgPT09IHVuZGVmaW5lZCA/IFwiLlwiIDogbG9jYWxlLmRlY2ltYWwgKyBcIlwiLFxuICAgICAgbnVtZXJhbHMgPSBsb2NhbGUubnVtZXJhbHMgPT09IHVuZGVmaW5lZCA/IGlkZW50aXR5IDogZm9ybWF0TnVtZXJhbHMobWFwLmNhbGwobG9jYWxlLm51bWVyYWxzLCBTdHJpbmcpKSxcbiAgICAgIHBlcmNlbnQgPSBsb2NhbGUucGVyY2VudCA9PT0gdW5kZWZpbmVkID8gXCIlXCIgOiBsb2NhbGUucGVyY2VudCArIFwiXCIsXG4gICAgICBtaW51cyA9IGxvY2FsZS5taW51cyA9PT0gdW5kZWZpbmVkID8gXCLiiJJcIiA6IGxvY2FsZS5taW51cyArIFwiXCIsXG4gICAgICBuYW4gPSBsb2NhbGUubmFuID09PSB1bmRlZmluZWQgPyBcIk5hTlwiIDogbG9jYWxlLm5hbiArIFwiXCI7XG5cbiAgZnVuY3Rpb24gbmV3Rm9ybWF0KHNwZWNpZmllcikge1xuICAgIHNwZWNpZmllciA9IGZvcm1hdFNwZWNpZmllcihzcGVjaWZpZXIpO1xuXG4gICAgdmFyIGZpbGwgPSBzcGVjaWZpZXIuZmlsbCxcbiAgICAgICAgYWxpZ24gPSBzcGVjaWZpZXIuYWxpZ24sXG4gICAgICAgIHNpZ24gPSBzcGVjaWZpZXIuc2lnbixcbiAgICAgICAgc3ltYm9sID0gc3BlY2lmaWVyLnN5bWJvbCxcbiAgICAgICAgemVybyA9IHNwZWNpZmllci56ZXJvLFxuICAgICAgICB3aWR0aCA9IHNwZWNpZmllci53aWR0aCxcbiAgICAgICAgY29tbWEgPSBzcGVjaWZpZXIuY29tbWEsXG4gICAgICAgIHByZWNpc2lvbiA9IHNwZWNpZmllci5wcmVjaXNpb24sXG4gICAgICAgIHRyaW0gPSBzcGVjaWZpZXIudHJpbSxcbiAgICAgICAgdHlwZSA9IHNwZWNpZmllci50eXBlO1xuXG4gICAgLy8gVGhlIFwiblwiIHR5cGUgaXMgYW4gYWxpYXMgZm9yIFwiLGdcIi5cbiAgICBpZiAodHlwZSA9PT0gXCJuXCIpIGNvbW1hID0gdHJ1ZSwgdHlwZSA9IFwiZ1wiO1xuXG4gICAgLy8gVGhlIFwiXCIgdHlwZSwgYW5kIGFueSBpbnZhbGlkIHR5cGUsIGlzIGFuIGFsaWFzIGZvciBcIi4xMn5nXCIuXG4gICAgZWxzZSBpZiAoIWZvcm1hdFR5cGVzW3R5cGVdKSBwcmVjaXNpb24gPT09IHVuZGVmaW5lZCAmJiAocHJlY2lzaW9uID0gMTIpLCB0cmltID0gdHJ1ZSwgdHlwZSA9IFwiZ1wiO1xuXG4gICAgLy8gSWYgemVybyBmaWxsIGlzIHNwZWNpZmllZCwgcGFkZGluZyBnb2VzIGFmdGVyIHNpZ24gYW5kIGJlZm9yZSBkaWdpdHMuXG4gICAgaWYgKHplcm8gfHwgKGZpbGwgPT09IFwiMFwiICYmIGFsaWduID09PSBcIj1cIikpIHplcm8gPSB0cnVlLCBmaWxsID0gXCIwXCIsIGFsaWduID0gXCI9XCI7XG5cbiAgICAvLyBDb21wdXRlIHRoZSBwcmVmaXggYW5kIHN1ZmZpeC5cbiAgICAvLyBGb3IgU0ktcHJlZml4LCB0aGUgc3VmZml4IGlzIGxhemlseSBjb21wdXRlZC5cbiAgICB2YXIgcHJlZml4ID0gc3ltYm9sID09PSBcIiRcIiA/IGN1cnJlbmN5UHJlZml4IDogc3ltYm9sID09PSBcIiNcIiAmJiAvW2JveFhdLy50ZXN0KHR5cGUpID8gXCIwXCIgKyB0eXBlLnRvTG93ZXJDYXNlKCkgOiBcIlwiLFxuICAgICAgICBzdWZmaXggPSBzeW1ib2wgPT09IFwiJFwiID8gY3VycmVuY3lTdWZmaXggOiAvWyVwXS8udGVzdCh0eXBlKSA/IHBlcmNlbnQgOiBcIlwiO1xuXG4gICAgLy8gV2hhdCBmb3JtYXQgZnVuY3Rpb24gc2hvdWxkIHdlIHVzZT9cbiAgICAvLyBJcyB0aGlzIGFuIGludGVnZXIgdHlwZT9cbiAgICAvLyBDYW4gdGhpcyB0eXBlIGdlbmVyYXRlIGV4cG9uZW50aWFsIG5vdGF0aW9uP1xuICAgIHZhciBmb3JtYXRUeXBlID0gZm9ybWF0VHlwZXNbdHlwZV0sXG4gICAgICAgIG1heWJlU3VmZml4ID0gL1tkZWZncHJzJV0vLnRlc3QodHlwZSk7XG5cbiAgICAvLyBTZXQgdGhlIGRlZmF1bHQgcHJlY2lzaW9uIGlmIG5vdCBzcGVjaWZpZWQsXG4gICAgLy8gb3IgY2xhbXAgdGhlIHNwZWNpZmllZCBwcmVjaXNpb24gdG8gdGhlIHN1cHBvcnRlZCByYW5nZS5cbiAgICAvLyBGb3Igc2lnbmlmaWNhbnQgcHJlY2lzaW9uLCBpdCBtdXN0IGJlIGluIFsxLCAyMV0uXG4gICAgLy8gRm9yIGZpeGVkIHByZWNpc2lvbiwgaXQgbXVzdCBiZSBpbiBbMCwgMjBdLlxuICAgIHByZWNpc2lvbiA9IHByZWNpc2lvbiA9PT0gdW5kZWZpbmVkID8gNlxuICAgICAgICA6IC9bZ3Byc10vLnRlc3QodHlwZSkgPyBNYXRoLm1heCgxLCBNYXRoLm1pbigyMSwgcHJlY2lzaW9uKSlcbiAgICAgICAgOiBNYXRoLm1heCgwLCBNYXRoLm1pbigyMCwgcHJlY2lzaW9uKSk7XG5cbiAgICBmdW5jdGlvbiBmb3JtYXQodmFsdWUpIHtcbiAgICAgIHZhciB2YWx1ZVByZWZpeCA9IHByZWZpeCxcbiAgICAgICAgICB2YWx1ZVN1ZmZpeCA9IHN1ZmZpeCxcbiAgICAgICAgICBpLCBuLCBjO1xuXG4gICAgICBpZiAodHlwZSA9PT0gXCJjXCIpIHtcbiAgICAgICAgdmFsdWVTdWZmaXggPSBmb3JtYXRUeXBlKHZhbHVlKSArIHZhbHVlU3VmZml4O1xuICAgICAgICB2YWx1ZSA9IFwiXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZSA9ICt2YWx1ZTtcblxuICAgICAgICAvLyBEZXRlcm1pbmUgdGhlIHNpZ24uIC0wIGlzIG5vdCBsZXNzIHRoYW4gMCwgYnV0IDEgLyAtMCBpcyFcbiAgICAgICAgdmFyIHZhbHVlTmVnYXRpdmUgPSB2YWx1ZSA8IDAgfHwgMSAvIHZhbHVlIDwgMDtcblxuICAgICAgICAvLyBQZXJmb3JtIHRoZSBpbml0aWFsIGZvcm1hdHRpbmcuXG4gICAgICAgIHZhbHVlID0gaXNOYU4odmFsdWUpID8gbmFuIDogZm9ybWF0VHlwZShNYXRoLmFicyh2YWx1ZSksIHByZWNpc2lvbik7XG5cbiAgICAgICAgLy8gVHJpbSBpbnNpZ25pZmljYW50IHplcm9zLlxuICAgICAgICBpZiAodHJpbSkgdmFsdWUgPSBmb3JtYXRUcmltKHZhbHVlKTtcblxuICAgICAgICAvLyBJZiBhIG5lZ2F0aXZlIHZhbHVlIHJvdW5kcyB0byB6ZXJvIGFmdGVyIGZvcm1hdHRpbmcsIGFuZCBubyBleHBsaWNpdCBwb3NpdGl2ZSBzaWduIGlzIHJlcXVlc3RlZCwgaGlkZSB0aGUgc2lnbi5cbiAgICAgICAgaWYgKHZhbHVlTmVnYXRpdmUgJiYgK3ZhbHVlID09PSAwICYmIHNpZ24gIT09IFwiK1wiKSB2YWx1ZU5lZ2F0aXZlID0gZmFsc2U7XG5cbiAgICAgICAgLy8gQ29tcHV0ZSB0aGUgcHJlZml4IGFuZCBzdWZmaXguXG4gICAgICAgIHZhbHVlUHJlZml4ID0gKHZhbHVlTmVnYXRpdmUgPyAoc2lnbiA9PT0gXCIoXCIgPyBzaWduIDogbWludXMpIDogc2lnbiA9PT0gXCItXCIgfHwgc2lnbiA9PT0gXCIoXCIgPyBcIlwiIDogc2lnbikgKyB2YWx1ZVByZWZpeDtcbiAgICAgICAgdmFsdWVTdWZmaXggPSAodHlwZSA9PT0gXCJzXCIgPyBwcmVmaXhlc1s4ICsgcHJlZml4RXhwb25lbnQgLyAzXSA6IFwiXCIpICsgdmFsdWVTdWZmaXggKyAodmFsdWVOZWdhdGl2ZSAmJiBzaWduID09PSBcIihcIiA/IFwiKVwiIDogXCJcIik7XG5cbiAgICAgICAgLy8gQnJlYWsgdGhlIGZvcm1hdHRlZCB2YWx1ZSBpbnRvIHRoZSBpbnRlZ2VyIOKAnHZhbHVl4oCdIHBhcnQgdGhhdCBjYW4gYmVcbiAgICAgICAgLy8gZ3JvdXBlZCwgYW5kIGZyYWN0aW9uYWwgb3IgZXhwb25lbnRpYWwg4oCcc3VmZml44oCdIHBhcnQgdGhhdCBpcyBub3QuXG4gICAgICAgIGlmIChtYXliZVN1ZmZpeCkge1xuICAgICAgICAgIGkgPSAtMSwgbiA9IHZhbHVlLmxlbmd0aDtcbiAgICAgICAgICB3aGlsZSAoKytpIDwgbikge1xuICAgICAgICAgICAgaWYgKGMgPSB2YWx1ZS5jaGFyQ29kZUF0KGkpLCA0OCA+IGMgfHwgYyA+IDU3KSB7XG4gICAgICAgICAgICAgIHZhbHVlU3VmZml4ID0gKGMgPT09IDQ2ID8gZGVjaW1hbCArIHZhbHVlLnNsaWNlKGkgKyAxKSA6IHZhbHVlLnNsaWNlKGkpKSArIHZhbHVlU3VmZml4O1xuICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnNsaWNlKDAsIGkpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gSWYgdGhlIGZpbGwgY2hhcmFjdGVyIGlzIG5vdCBcIjBcIiwgZ3JvdXBpbmcgaXMgYXBwbGllZCBiZWZvcmUgcGFkZGluZy5cbiAgICAgIGlmIChjb21tYSAmJiAhemVybykgdmFsdWUgPSBncm91cCh2YWx1ZSwgSW5maW5pdHkpO1xuXG4gICAgICAvLyBDb21wdXRlIHRoZSBwYWRkaW5nLlxuICAgICAgdmFyIGxlbmd0aCA9IHZhbHVlUHJlZml4Lmxlbmd0aCArIHZhbHVlLmxlbmd0aCArIHZhbHVlU3VmZml4Lmxlbmd0aCxcbiAgICAgICAgICBwYWRkaW5nID0gbGVuZ3RoIDwgd2lkdGggPyBuZXcgQXJyYXkod2lkdGggLSBsZW5ndGggKyAxKS5qb2luKGZpbGwpIDogXCJcIjtcblxuICAgICAgLy8gSWYgdGhlIGZpbGwgY2hhcmFjdGVyIGlzIFwiMFwiLCBncm91cGluZyBpcyBhcHBsaWVkIGFmdGVyIHBhZGRpbmcuXG4gICAgICBpZiAoY29tbWEgJiYgemVybykgdmFsdWUgPSBncm91cChwYWRkaW5nICsgdmFsdWUsIHBhZGRpbmcubGVuZ3RoID8gd2lkdGggLSB2YWx1ZVN1ZmZpeC5sZW5ndGggOiBJbmZpbml0eSksIHBhZGRpbmcgPSBcIlwiO1xuXG4gICAgICAvLyBSZWNvbnN0cnVjdCB0aGUgZmluYWwgb3V0cHV0IGJhc2VkIG9uIHRoZSBkZXNpcmVkIGFsaWdubWVudC5cbiAgICAgIHN3aXRjaCAoYWxpZ24pIHtcbiAgICAgICAgY2FzZSBcIjxcIjogdmFsdWUgPSB2YWx1ZVByZWZpeCArIHZhbHVlICsgdmFsdWVTdWZmaXggKyBwYWRkaW5nOyBicmVhaztcbiAgICAgICAgY2FzZSBcIj1cIjogdmFsdWUgPSB2YWx1ZVByZWZpeCArIHBhZGRpbmcgKyB2YWx1ZSArIHZhbHVlU3VmZml4OyBicmVhaztcbiAgICAgICAgY2FzZSBcIl5cIjogdmFsdWUgPSBwYWRkaW5nLnNsaWNlKDAsIGxlbmd0aCA9IHBhZGRpbmcubGVuZ3RoID4+IDEpICsgdmFsdWVQcmVmaXggKyB2YWx1ZSArIHZhbHVlU3VmZml4ICsgcGFkZGluZy5zbGljZShsZW5ndGgpOyBicmVhaztcbiAgICAgICAgZGVmYXVsdDogdmFsdWUgPSBwYWRkaW5nICsgdmFsdWVQcmVmaXggKyB2YWx1ZSArIHZhbHVlU3VmZml4OyBicmVhaztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG51bWVyYWxzKHZhbHVlKTtcbiAgICB9XG5cbiAgICBmb3JtYXQudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBzcGVjaWZpZXIgKyBcIlwiO1xuICAgIH07XG5cbiAgICByZXR1cm4gZm9ybWF0O1xuICB9XG5cbiAgZnVuY3Rpb24gZm9ybWF0UHJlZml4KHNwZWNpZmllciwgdmFsdWUpIHtcbiAgICB2YXIgZiA9IG5ld0Zvcm1hdCgoc3BlY2lmaWVyID0gZm9ybWF0U3BlY2lmaWVyKHNwZWNpZmllciksIHNwZWNpZmllci50eXBlID0gXCJmXCIsIHNwZWNpZmllcikpLFxuICAgICAgICBlID0gTWF0aC5tYXgoLTgsIE1hdGgubWluKDgsIE1hdGguZmxvb3IoZXhwb25lbnQodmFsdWUpIC8gMykpKSAqIDMsXG4gICAgICAgIGsgPSBNYXRoLnBvdygxMCwgLWUpLFxuICAgICAgICBwcmVmaXggPSBwcmVmaXhlc1s4ICsgZSAvIDNdO1xuICAgIHJldHVybiBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgcmV0dXJuIGYoayAqIHZhbHVlKSArIHByZWZpeDtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBmb3JtYXQ6IG5ld0Zvcm1hdCxcbiAgICBmb3JtYXRQcmVmaXg6IGZvcm1hdFByZWZpeFxuICB9O1xufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIGJhc2lzKHQxLCB2MCwgdjEsIHYyLCB2Mykge1xuICB2YXIgdDIgPSB0MSAqIHQxLCB0MyA9IHQyICogdDE7XG4gIHJldHVybiAoKDEgLSAzICogdDEgKyAzICogdDIgLSB0MykgKiB2MFxuICAgICAgKyAoNCAtIDYgKiB0MiArIDMgKiB0MykgKiB2MVxuICAgICAgKyAoMSArIDMgKiB0MSArIDMgKiB0MiAtIDMgKiB0MykgKiB2MlxuICAgICAgKyB0MyAqIHYzKSAvIDY7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlcykge1xuICB2YXIgbiA9IHZhbHVlcy5sZW5ndGggLSAxO1xuICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgIHZhciBpID0gdCA8PSAwID8gKHQgPSAwKSA6IHQgPj0gMSA/ICh0ID0gMSwgbiAtIDEpIDogTWF0aC5mbG9vcih0ICogbiksXG4gICAgICAgIHYxID0gdmFsdWVzW2ldLFxuICAgICAgICB2MiA9IHZhbHVlc1tpICsgMV0sXG4gICAgICAgIHYwID0gaSA+IDAgPyB2YWx1ZXNbaSAtIDFdIDogMiAqIHYxIC0gdjIsXG4gICAgICAgIHYzID0gaSA8IG4gLSAxID8gdmFsdWVzW2kgKyAyXSA6IDIgKiB2MiAtIHYxO1xuICAgIHJldHVybiBiYXNpcygodCAtIGkgLyBuKSAqIG4sIHYwLCB2MSwgdjIsIHYzKTtcbiAgfTtcbn1cbiIsImltcG9ydCB7YmFzaXN9IGZyb20gXCIuL2Jhc2lzLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlcykge1xuICB2YXIgbiA9IHZhbHVlcy5sZW5ndGg7XG4gIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgdmFyIGkgPSBNYXRoLmZsb29yKCgodCAlPSAxKSA8IDAgPyArK3QgOiB0KSAqIG4pLFxuICAgICAgICB2MCA9IHZhbHVlc1soaSArIG4gLSAxKSAlIG5dLFxuICAgICAgICB2MSA9IHZhbHVlc1tpICUgbl0sXG4gICAgICAgIHYyID0gdmFsdWVzWyhpICsgMSkgJSBuXSxcbiAgICAgICAgdjMgPSB2YWx1ZXNbKGkgKyAyKSAlIG5dO1xuICAgIHJldHVybiBiYXNpcygodCAtIGkgLyBuKSAqIG4sIHYwLCB2MSwgdjIsIHYzKTtcbiAgfTtcbn1cbiIsImltcG9ydCBjb25zdGFudCBmcm9tIFwiLi9jb25zdGFudC5qc1wiO1xuXG5mdW5jdGlvbiBsaW5lYXIoYSwgZCkge1xuICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgIHJldHVybiBhICsgdCAqIGQ7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGV4cG9uZW50aWFsKGEsIGIsIHkpIHtcbiAgcmV0dXJuIGEgPSBNYXRoLnBvdyhhLCB5KSwgYiA9IE1hdGgucG93KGIsIHkpIC0gYSwgeSA9IDEgLyB5LCBmdW5jdGlvbih0KSB7XG4gICAgcmV0dXJuIE1hdGgucG93KGEgKyB0ICogYiwgeSk7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBodWUoYSwgYikge1xuICB2YXIgZCA9IGIgLSBhO1xuICByZXR1cm4gZCA/IGxpbmVhcihhLCBkID4gMTgwIHx8IGQgPCAtMTgwID8gZCAtIDM2MCAqIE1hdGgucm91bmQoZCAvIDM2MCkgOiBkKSA6IGNvbnN0YW50KGlzTmFOKGEpID8gYiA6IGEpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2FtbWEoeSkge1xuICByZXR1cm4gKHkgPSAreSkgPT09IDEgPyBub2dhbW1hIDogZnVuY3Rpb24oYSwgYikge1xuICAgIHJldHVybiBiIC0gYSA/IGV4cG9uZW50aWFsKGEsIGIsIHkpIDogY29uc3RhbnQoaXNOYU4oYSkgPyBiIDogYSk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG5vZ2FtbWEoYSwgYikge1xuICB2YXIgZCA9IGIgLSBhO1xuICByZXR1cm4gZCA/IGxpbmVhcihhLCBkKSA6IGNvbnN0YW50KGlzTmFOKGEpID8gYiA6IGEpO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgeCA9PiAoKSA9PiB4O1xuIiwiaW1wb3J0IHtsYWIgYXMgY29sb3JMYWJ9IGZyb20gXCJkMy1jb2xvclwiO1xuaW1wb3J0IGNvbG9yIGZyb20gXCIuL2NvbG9yLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGxhYihzdGFydCwgZW5kKSB7XG4gIHZhciBsID0gY29sb3IoKHN0YXJ0ID0gY29sb3JMYWIoc3RhcnQpKS5sLCAoZW5kID0gY29sb3JMYWIoZW5kKSkubCksXG4gICAgICBhID0gY29sb3Ioc3RhcnQuYSwgZW5kLmEpLFxuICAgICAgYiA9IGNvbG9yKHN0YXJ0LmIsIGVuZC5iKSxcbiAgICAgIG9wYWNpdHkgPSBjb2xvcihzdGFydC5vcGFjaXR5LCBlbmQub3BhY2l0eSk7XG4gIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgc3RhcnQubCA9IGwodCk7XG4gICAgc3RhcnQuYSA9IGEodCk7XG4gICAgc3RhcnQuYiA9IGIodCk7XG4gICAgc3RhcnQub3BhY2l0eSA9IG9wYWNpdHkodCk7XG4gICAgcmV0dXJuIHN0YXJ0ICsgXCJcIjtcbiAgfTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGEsIGIpIHtcbiAgcmV0dXJuIGEgPSArYSwgYiA9ICtiLCBmdW5jdGlvbih0KSB7XG4gICAgcmV0dXJuIGEgKiAoMSAtIHQpICsgYiAqIHQ7XG4gIH07XG59XG4iLCJpbXBvcnQge3JnYiBhcyBjb2xvclJnYn0gZnJvbSBcImQzLWNvbG9yXCI7XG5pbXBvcnQgYmFzaXMgZnJvbSBcIi4vYmFzaXMuanNcIjtcbmltcG9ydCBiYXNpc0Nsb3NlZCBmcm9tIFwiLi9iYXNpc0Nsb3NlZC5qc1wiO1xuaW1wb3J0IG5vZ2FtbWEsIHtnYW1tYX0gZnJvbSBcIi4vY29sb3IuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgKGZ1bmN0aW9uIHJnYkdhbW1hKHkpIHtcbiAgdmFyIGNvbG9yID0gZ2FtbWEoeSk7XG5cbiAgZnVuY3Rpb24gcmdiKHN0YXJ0LCBlbmQpIHtcbiAgICB2YXIgciA9IGNvbG9yKChzdGFydCA9IGNvbG9yUmdiKHN0YXJ0KSkuciwgKGVuZCA9IGNvbG9yUmdiKGVuZCkpLnIpLFxuICAgICAgICBnID0gY29sb3Ioc3RhcnQuZywgZW5kLmcpLFxuICAgICAgICBiID0gY29sb3Ioc3RhcnQuYiwgZW5kLmIpLFxuICAgICAgICBvcGFjaXR5ID0gbm9nYW1tYShzdGFydC5vcGFjaXR5LCBlbmQub3BhY2l0eSk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICAgIHN0YXJ0LnIgPSByKHQpO1xuICAgICAgc3RhcnQuZyA9IGcodCk7XG4gICAgICBzdGFydC5iID0gYih0KTtcbiAgICAgIHN0YXJ0Lm9wYWNpdHkgPSBvcGFjaXR5KHQpO1xuICAgICAgcmV0dXJuIHN0YXJ0ICsgXCJcIjtcbiAgICB9O1xuICB9XG5cbiAgcmdiLmdhbW1hID0gcmdiR2FtbWE7XG5cbiAgcmV0dXJuIHJnYjtcbn0pKDEpO1xuXG5mdW5jdGlvbiByZ2JTcGxpbmUoc3BsaW5lKSB7XG4gIHJldHVybiBmdW5jdGlvbihjb2xvcnMpIHtcbiAgICB2YXIgbiA9IGNvbG9ycy5sZW5ndGgsXG4gICAgICAgIHIgPSBuZXcgQXJyYXkobiksXG4gICAgICAgIGcgPSBuZXcgQXJyYXkobiksXG4gICAgICAgIGIgPSBuZXcgQXJyYXkobiksXG4gICAgICAgIGksIGNvbG9yO1xuICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGNvbG9yID0gY29sb3JSZ2IoY29sb3JzW2ldKTtcbiAgICAgIHJbaV0gPSBjb2xvci5yIHx8IDA7XG4gICAgICBnW2ldID0gY29sb3IuZyB8fCAwO1xuICAgICAgYltpXSA9IGNvbG9yLmIgfHwgMDtcbiAgICB9XG4gICAgciA9IHNwbGluZShyKTtcbiAgICBnID0gc3BsaW5lKGcpO1xuICAgIGIgPSBzcGxpbmUoYik7XG4gICAgY29sb3Iub3BhY2l0eSA9IDE7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICAgIGNvbG9yLnIgPSByKHQpO1xuICAgICAgY29sb3IuZyA9IGcodCk7XG4gICAgICBjb2xvci5iID0gYih0KTtcbiAgICAgIHJldHVybiBjb2xvciArIFwiXCI7XG4gICAgfTtcbiAgfTtcbn1cblxuZXhwb3J0IHZhciByZ2JCYXNpcyA9IHJnYlNwbGluZShiYXNpcyk7XG5leHBvcnQgdmFyIHJnYkJhc2lzQ2xvc2VkID0gcmdiU3BsaW5lKGJhc2lzQ2xvc2VkKTtcbiIsImltcG9ydCBudW1iZXIgZnJvbSBcIi4vbnVtYmVyLmpzXCI7XG5cbnZhciByZUEgPSAvWy0rXT8oPzpcXGQrXFwuP1xcZCp8XFwuP1xcZCspKD86W2VFXVstK10/XFxkKyk/L2csXG4gICAgcmVCID0gbmV3IFJlZ0V4cChyZUEuc291cmNlLCBcImdcIik7XG5cbmZ1bmN0aW9uIHplcm8oYikge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGI7XG4gIH07XG59XG5cbmZ1bmN0aW9uIG9uZShiKSB7XG4gIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgcmV0dXJuIGIodCkgKyBcIlwiO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihhLCBiKSB7XG4gIHZhciBiaSA9IHJlQS5sYXN0SW5kZXggPSByZUIubGFzdEluZGV4ID0gMCwgLy8gc2NhbiBpbmRleCBmb3IgbmV4dCBudW1iZXIgaW4gYlxuICAgICAgYW0sIC8vIGN1cnJlbnQgbWF0Y2ggaW4gYVxuICAgICAgYm0sIC8vIGN1cnJlbnQgbWF0Y2ggaW4gYlxuICAgICAgYnMsIC8vIHN0cmluZyBwcmVjZWRpbmcgY3VycmVudCBudW1iZXIgaW4gYiwgaWYgYW55XG4gICAgICBpID0gLTEsIC8vIGluZGV4IGluIHNcbiAgICAgIHMgPSBbXSwgLy8gc3RyaW5nIGNvbnN0YW50cyBhbmQgcGxhY2Vob2xkZXJzXG4gICAgICBxID0gW107IC8vIG51bWJlciBpbnRlcnBvbGF0b3JzXG5cbiAgLy8gQ29lcmNlIGlucHV0cyB0byBzdHJpbmdzLlxuICBhID0gYSArIFwiXCIsIGIgPSBiICsgXCJcIjtcblxuICAvLyBJbnRlcnBvbGF0ZSBwYWlycyBvZiBudW1iZXJzIGluIGEgJiBiLlxuICB3aGlsZSAoKGFtID0gcmVBLmV4ZWMoYSkpXG4gICAgICAmJiAoYm0gPSByZUIuZXhlYyhiKSkpIHtcbiAgICBpZiAoKGJzID0gYm0uaW5kZXgpID4gYmkpIHsgLy8gYSBzdHJpbmcgcHJlY2VkZXMgdGhlIG5leHQgbnVtYmVyIGluIGJcbiAgICAgIGJzID0gYi5zbGljZShiaSwgYnMpO1xuICAgICAgaWYgKHNbaV0pIHNbaV0gKz0gYnM7IC8vIGNvYWxlc2NlIHdpdGggcHJldmlvdXMgc3RyaW5nXG4gICAgICBlbHNlIHNbKytpXSA9IGJzO1xuICAgIH1cbiAgICBpZiAoKGFtID0gYW1bMF0pID09PSAoYm0gPSBibVswXSkpIHsgLy8gbnVtYmVycyBpbiBhICYgYiBtYXRjaFxuICAgICAgaWYgKHNbaV0pIHNbaV0gKz0gYm07IC8vIGNvYWxlc2NlIHdpdGggcHJldmlvdXMgc3RyaW5nXG4gICAgICBlbHNlIHNbKytpXSA9IGJtO1xuICAgIH0gZWxzZSB7IC8vIGludGVycG9sYXRlIG5vbi1tYXRjaGluZyBudW1iZXJzXG4gICAgICBzWysraV0gPSBudWxsO1xuICAgICAgcS5wdXNoKHtpOiBpLCB4OiBudW1iZXIoYW0sIGJtKX0pO1xuICAgIH1cbiAgICBiaSA9IHJlQi5sYXN0SW5kZXg7XG4gIH1cblxuICAvLyBBZGQgcmVtYWlucyBvZiBiLlxuICBpZiAoYmkgPCBiLmxlbmd0aCkge1xuICAgIGJzID0gYi5zbGljZShiaSk7XG4gICAgaWYgKHNbaV0pIHNbaV0gKz0gYnM7IC8vIGNvYWxlc2NlIHdpdGggcHJldmlvdXMgc3RyaW5nXG4gICAgZWxzZSBzWysraV0gPSBicztcbiAgfVxuXG4gIC8vIFNwZWNpYWwgb3B0aW1pemF0aW9uIGZvciBvbmx5IGEgc2luZ2xlIG1hdGNoLlxuICAvLyBPdGhlcndpc2UsIGludGVycG9sYXRlIGVhY2ggb2YgdGhlIG51bWJlcnMgYW5kIHJlam9pbiB0aGUgc3RyaW5nLlxuICByZXR1cm4gcy5sZW5ndGggPCAyID8gKHFbMF1cbiAgICAgID8gb25lKHFbMF0ueClcbiAgICAgIDogemVybyhiKSlcbiAgICAgIDogKGIgPSBxLmxlbmd0aCwgZnVuY3Rpb24odCkge1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBvOyBpIDwgYjsgKytpKSBzWyhvID0gcVtpXSkuaV0gPSBvLngodCk7XG4gICAgICAgICAgcmV0dXJuIHMuam9pbihcIlwiKTtcbiAgICAgICAgfSk7XG59XG4iLCJ2YXIgZGVncmVlcyA9IDE4MCAvIE1hdGguUEk7XG5cbmV4cG9ydCB2YXIgaWRlbnRpdHkgPSB7XG4gIHRyYW5zbGF0ZVg6IDAsXG4gIHRyYW5zbGF0ZVk6IDAsXG4gIHJvdGF0ZTogMCxcbiAgc2tld1g6IDAsXG4gIHNjYWxlWDogMSxcbiAgc2NhbGVZOiAxXG59O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihhLCBiLCBjLCBkLCBlLCBmKSB7XG4gIHZhciBzY2FsZVgsIHNjYWxlWSwgc2tld1g7XG4gIGlmIChzY2FsZVggPSBNYXRoLnNxcnQoYSAqIGEgKyBiICogYikpIGEgLz0gc2NhbGVYLCBiIC89IHNjYWxlWDtcbiAgaWYgKHNrZXdYID0gYSAqIGMgKyBiICogZCkgYyAtPSBhICogc2tld1gsIGQgLT0gYiAqIHNrZXdYO1xuICBpZiAoc2NhbGVZID0gTWF0aC5zcXJ0KGMgKiBjICsgZCAqIGQpKSBjIC89IHNjYWxlWSwgZCAvPSBzY2FsZVksIHNrZXdYIC89IHNjYWxlWTtcbiAgaWYgKGEgKiBkIDwgYiAqIGMpIGEgPSAtYSwgYiA9IC1iLCBza2V3WCA9IC1za2V3WCwgc2NhbGVYID0gLXNjYWxlWDtcbiAgcmV0dXJuIHtcbiAgICB0cmFuc2xhdGVYOiBlLFxuICAgIHRyYW5zbGF0ZVk6IGYsXG4gICAgcm90YXRlOiBNYXRoLmF0YW4yKGIsIGEpICogZGVncmVlcyxcbiAgICBza2V3WDogTWF0aC5hdGFuKHNrZXdYKSAqIGRlZ3JlZXMsXG4gICAgc2NhbGVYOiBzY2FsZVgsXG4gICAgc2NhbGVZOiBzY2FsZVlcbiAgfTtcbn1cbiIsImltcG9ydCBudW1iZXIgZnJvbSBcIi4uL251bWJlci5qc1wiO1xuaW1wb3J0IHtwYXJzZUNzcywgcGFyc2VTdmd9IGZyb20gXCIuL3BhcnNlLmpzXCI7XG5cbmZ1bmN0aW9uIGludGVycG9sYXRlVHJhbnNmb3JtKHBhcnNlLCBweENvbW1hLCBweFBhcmVuLCBkZWdQYXJlbikge1xuXG4gIGZ1bmN0aW9uIHBvcChzKSB7XG4gICAgcmV0dXJuIHMubGVuZ3RoID8gcy5wb3AoKSArIFwiIFwiIDogXCJcIjtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRyYW5zbGF0ZSh4YSwgeWEsIHhiLCB5YiwgcywgcSkge1xuICAgIGlmICh4YSAhPT0geGIgfHwgeWEgIT09IHliKSB7XG4gICAgICB2YXIgaSA9IHMucHVzaChcInRyYW5zbGF0ZShcIiwgbnVsbCwgcHhDb21tYSwgbnVsbCwgcHhQYXJlbik7XG4gICAgICBxLnB1c2goe2k6IGkgLSA0LCB4OiBudW1iZXIoeGEsIHhiKX0sIHtpOiBpIC0gMiwgeDogbnVtYmVyKHlhLCB5Yil9KTtcbiAgICB9IGVsc2UgaWYgKHhiIHx8IHliKSB7XG4gICAgICBzLnB1c2goXCJ0cmFuc2xhdGUoXCIgKyB4YiArIHB4Q29tbWEgKyB5YiArIHB4UGFyZW4pO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHJvdGF0ZShhLCBiLCBzLCBxKSB7XG4gICAgaWYgKGEgIT09IGIpIHtcbiAgICAgIGlmIChhIC0gYiA+IDE4MCkgYiArPSAzNjA7IGVsc2UgaWYgKGIgLSBhID4gMTgwKSBhICs9IDM2MDsgLy8gc2hvcnRlc3QgcGF0aFxuICAgICAgcS5wdXNoKHtpOiBzLnB1c2gocG9wKHMpICsgXCJyb3RhdGUoXCIsIG51bGwsIGRlZ1BhcmVuKSAtIDIsIHg6IG51bWJlcihhLCBiKX0pO1xuICAgIH0gZWxzZSBpZiAoYikge1xuICAgICAgcy5wdXNoKHBvcChzKSArIFwicm90YXRlKFwiICsgYiArIGRlZ1BhcmVuKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBza2V3WChhLCBiLCBzLCBxKSB7XG4gICAgaWYgKGEgIT09IGIpIHtcbiAgICAgIHEucHVzaCh7aTogcy5wdXNoKHBvcChzKSArIFwic2tld1goXCIsIG51bGwsIGRlZ1BhcmVuKSAtIDIsIHg6IG51bWJlcihhLCBiKX0pO1xuICAgIH0gZWxzZSBpZiAoYikge1xuICAgICAgcy5wdXNoKHBvcChzKSArIFwic2tld1goXCIgKyBiICsgZGVnUGFyZW4pO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHNjYWxlKHhhLCB5YSwgeGIsIHliLCBzLCBxKSB7XG4gICAgaWYgKHhhICE9PSB4YiB8fCB5YSAhPT0geWIpIHtcbiAgICAgIHZhciBpID0gcy5wdXNoKHBvcChzKSArIFwic2NhbGUoXCIsIG51bGwsIFwiLFwiLCBudWxsLCBcIilcIik7XG4gICAgICBxLnB1c2goe2k6IGkgLSA0LCB4OiBudW1iZXIoeGEsIHhiKX0sIHtpOiBpIC0gMiwgeDogbnVtYmVyKHlhLCB5Yil9KTtcbiAgICB9IGVsc2UgaWYgKHhiICE9PSAxIHx8IHliICE9PSAxKSB7XG4gICAgICBzLnB1c2gocG9wKHMpICsgXCJzY2FsZShcIiArIHhiICsgXCIsXCIgKyB5YiArIFwiKVwiKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24oYSwgYikge1xuICAgIHZhciBzID0gW10sIC8vIHN0cmluZyBjb25zdGFudHMgYW5kIHBsYWNlaG9sZGVyc1xuICAgICAgICBxID0gW107IC8vIG51bWJlciBpbnRlcnBvbGF0b3JzXG4gICAgYSA9IHBhcnNlKGEpLCBiID0gcGFyc2UoYik7XG4gICAgdHJhbnNsYXRlKGEudHJhbnNsYXRlWCwgYS50cmFuc2xhdGVZLCBiLnRyYW5zbGF0ZVgsIGIudHJhbnNsYXRlWSwgcywgcSk7XG4gICAgcm90YXRlKGEucm90YXRlLCBiLnJvdGF0ZSwgcywgcSk7XG4gICAgc2tld1goYS5za2V3WCwgYi5za2V3WCwgcywgcSk7XG4gICAgc2NhbGUoYS5zY2FsZVgsIGEuc2NhbGVZLCBiLnNjYWxlWCwgYi5zY2FsZVksIHMsIHEpO1xuICAgIGEgPSBiID0gbnVsbDsgLy8gZ2NcbiAgICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgICAgdmFyIGkgPSAtMSwgbiA9IHEubGVuZ3RoLCBvO1xuICAgICAgd2hpbGUgKCsraSA8IG4pIHNbKG8gPSBxW2ldKS5pXSA9IG8ueCh0KTtcbiAgICAgIHJldHVybiBzLmpvaW4oXCJcIik7XG4gICAgfTtcbiAgfTtcbn1cblxuZXhwb3J0IHZhciBpbnRlcnBvbGF0ZVRyYW5zZm9ybUNzcyA9IGludGVycG9sYXRlVHJhbnNmb3JtKHBhcnNlQ3NzLCBcInB4LCBcIiwgXCJweClcIiwgXCJkZWcpXCIpO1xuZXhwb3J0IHZhciBpbnRlcnBvbGF0ZVRyYW5zZm9ybVN2ZyA9IGludGVycG9sYXRlVHJhbnNmb3JtKHBhcnNlU3ZnLCBcIiwgXCIsIFwiKVwiLCBcIilcIik7XG4iLCJpbXBvcnQgZGVjb21wb3NlLCB7aWRlbnRpdHl9IGZyb20gXCIuL2RlY29tcG9zZS5qc1wiO1xuXG52YXIgc3ZnTm9kZTtcblxuLyogZXNsaW50LWRpc2FibGUgbm8tdW5kZWYgKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUNzcyh2YWx1ZSkge1xuICBjb25zdCBtID0gbmV3ICh0eXBlb2YgRE9NTWF0cml4ID09PSBcImZ1bmN0aW9uXCIgPyBET01NYXRyaXggOiBXZWJLaXRDU1NNYXRyaXgpKHZhbHVlICsgXCJcIik7XG4gIHJldHVybiBtLmlzSWRlbnRpdHkgPyBpZGVudGl0eSA6IGRlY29tcG9zZShtLmEsIG0uYiwgbS5jLCBtLmQsIG0uZSwgbS5mKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU3ZnKHZhbHVlKSB7XG4gIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gaWRlbnRpdHk7XG4gIGlmICghc3ZnTm9kZSkgc3ZnTm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsIFwiZ1wiKTtcbiAgc3ZnTm9kZS5zZXRBdHRyaWJ1dGUoXCJ0cmFuc2Zvcm1cIiwgdmFsdWUpO1xuICBpZiAoISh2YWx1ZSA9IHN2Z05vZGUudHJhbnNmb3JtLmJhc2VWYWwuY29uc29saWRhdGUoKSkpIHJldHVybiBpZGVudGl0eTtcbiAgdmFsdWUgPSB2YWx1ZS5tYXRyaXg7XG4gIHJldHVybiBkZWNvbXBvc2UodmFsdWUuYSwgdmFsdWUuYiwgdmFsdWUuYywgdmFsdWUuZCwgdmFsdWUuZSwgdmFsdWUuZik7XG59XG4iLCJ2YXIgZXBzaWxvbjIgPSAxZS0xMjtcblxuZnVuY3Rpb24gY29zaCh4KSB7XG4gIHJldHVybiAoKHggPSBNYXRoLmV4cCh4KSkgKyAxIC8geCkgLyAyO1xufVxuXG5mdW5jdGlvbiBzaW5oKHgpIHtcbiAgcmV0dXJuICgoeCA9IE1hdGguZXhwKHgpKSAtIDEgLyB4KSAvIDI7XG59XG5cbmZ1bmN0aW9uIHRhbmgoeCkge1xuICByZXR1cm4gKCh4ID0gTWF0aC5leHAoMiAqIHgpKSAtIDEpIC8gKHggKyAxKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgKGZ1bmN0aW9uIHpvb21SaG8ocmhvLCByaG8yLCByaG80KSB7XG5cbiAgLy8gcDAgPSBbdXgwLCB1eTAsIHcwXVxuICAvLyBwMSA9IFt1eDEsIHV5MSwgdzFdXG4gIGZ1bmN0aW9uIHpvb20ocDAsIHAxKSB7XG4gICAgdmFyIHV4MCA9IHAwWzBdLCB1eTAgPSBwMFsxXSwgdzAgPSBwMFsyXSxcbiAgICAgICAgdXgxID0gcDFbMF0sIHV5MSA9IHAxWzFdLCB3MSA9IHAxWzJdLFxuICAgICAgICBkeCA9IHV4MSAtIHV4MCxcbiAgICAgICAgZHkgPSB1eTEgLSB1eTAsXG4gICAgICAgIGQyID0gZHggKiBkeCArIGR5ICogZHksXG4gICAgICAgIGksXG4gICAgICAgIFM7XG5cbiAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIHUwIOKJhSB1MS5cbiAgICBpZiAoZDIgPCBlcHNpbG9uMikge1xuICAgICAgUyA9IE1hdGgubG9nKHcxIC8gdzApIC8gcmhvO1xuICAgICAgaSA9IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICB1eDAgKyB0ICogZHgsXG4gICAgICAgICAgdXkwICsgdCAqIGR5LFxuICAgICAgICAgIHcwICogTWF0aC5leHAocmhvICogdCAqIFMpXG4gICAgICAgIF07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gR2VuZXJhbCBjYXNlLlxuICAgIGVsc2Uge1xuICAgICAgdmFyIGQxID0gTWF0aC5zcXJ0KGQyKSxcbiAgICAgICAgICBiMCA9ICh3MSAqIHcxIC0gdzAgKiB3MCArIHJobzQgKiBkMikgLyAoMiAqIHcwICogcmhvMiAqIGQxKSxcbiAgICAgICAgICBiMSA9ICh3MSAqIHcxIC0gdzAgKiB3MCAtIHJobzQgKiBkMikgLyAoMiAqIHcxICogcmhvMiAqIGQxKSxcbiAgICAgICAgICByMCA9IE1hdGgubG9nKE1hdGguc3FydChiMCAqIGIwICsgMSkgLSBiMCksXG4gICAgICAgICAgcjEgPSBNYXRoLmxvZyhNYXRoLnNxcnQoYjEgKiBiMSArIDEpIC0gYjEpO1xuICAgICAgUyA9IChyMSAtIHIwKSAvIHJobztcbiAgICAgIGkgPSBmdW5jdGlvbih0KSB7XG4gICAgICAgIHZhciBzID0gdCAqIFMsXG4gICAgICAgICAgICBjb3NocjAgPSBjb3NoKHIwKSxcbiAgICAgICAgICAgIHUgPSB3MCAvIChyaG8yICogZDEpICogKGNvc2hyMCAqIHRhbmgocmhvICogcyArIHIwKSAtIHNpbmgocjApKTtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICB1eDAgKyB1ICogZHgsXG4gICAgICAgICAgdXkwICsgdSAqIGR5LFxuICAgICAgICAgIHcwICogY29zaHIwIC8gY29zaChyaG8gKiBzICsgcjApXG4gICAgICAgIF07XG4gICAgICB9XG4gICAgfVxuXG4gICAgaS5kdXJhdGlvbiA9IFMgKiAxMDAwICogcmhvIC8gTWF0aC5TUVJUMjtcblxuICAgIHJldHVybiBpO1xuICB9XG5cbiAgem9vbS5yaG8gPSBmdW5jdGlvbihfKSB7XG4gICAgdmFyIF8xID0gTWF0aC5tYXgoMWUtMywgK18pLCBfMiA9IF8xICogXzEsIF80ID0gXzIgKiBfMjtcbiAgICByZXR1cm4gem9vbVJobyhfMSwgXzIsIF80KTtcbiAgfTtcblxuICByZXR1cm4gem9vbTtcbn0pKE1hdGguU1FSVDIsIDIsIDQpO1xuIiwiZXhwb3J0IGRlZmF1bHQgTWF0aC5yYW5kb207XG4iLCJpbXBvcnQgZGVmYXVsdFNvdXJjZSBmcm9tIFwiLi9kZWZhdWx0U291cmNlLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IChmdW5jdGlvbiBzb3VyY2VSYW5kb21Ob3JtYWwoc291cmNlKSB7XG4gIGZ1bmN0aW9uIHJhbmRvbU5vcm1hbChtdSwgc2lnbWEpIHtcbiAgICB2YXIgeCwgcjtcbiAgICBtdSA9IG11ID09IG51bGwgPyAwIDogK211O1xuICAgIHNpZ21hID0gc2lnbWEgPT0gbnVsbCA/IDEgOiArc2lnbWE7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHk7XG5cbiAgICAgIC8vIElmIGF2YWlsYWJsZSwgdXNlIHRoZSBzZWNvbmQgcHJldmlvdXNseS1nZW5lcmF0ZWQgdW5pZm9ybSByYW5kb20uXG4gICAgICBpZiAoeCAhPSBudWxsKSB5ID0geCwgeCA9IG51bGw7XG5cbiAgICAgIC8vIE90aGVyd2lzZSwgZ2VuZXJhdGUgYSBuZXcgeCBhbmQgeS5cbiAgICAgIGVsc2UgZG8ge1xuICAgICAgICB4ID0gc291cmNlKCkgKiAyIC0gMTtcbiAgICAgICAgeSA9IHNvdXJjZSgpICogMiAtIDE7XG4gICAgICAgIHIgPSB4ICogeCArIHkgKiB5O1xuICAgICAgfSB3aGlsZSAoIXIgfHwgciA+IDEpO1xuXG4gICAgICByZXR1cm4gbXUgKyBzaWdtYSAqIHkgKiBNYXRoLnNxcnQoLTIgKiBNYXRoLmxvZyhyKSAvIHIpO1xuICAgIH07XG4gIH1cblxuICByYW5kb21Ob3JtYWwuc291cmNlID0gc291cmNlUmFuZG9tTm9ybWFsO1xuXG4gIHJldHVybiByYW5kb21Ob3JtYWw7XG59KShkZWZhdWx0U291cmNlKTtcbiIsImV4cG9ydCBmdW5jdGlvbiBpbml0UmFuZ2UoZG9tYWluLCByYW5nZSkge1xuICBzd2l0Y2ggKGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICBjYXNlIDA6IGJyZWFrO1xuICAgIGNhc2UgMTogdGhpcy5yYW5nZShkb21haW4pOyBicmVhaztcbiAgICBkZWZhdWx0OiB0aGlzLnJhbmdlKHJhbmdlKS5kb21haW4oZG9tYWluKTsgYnJlYWs7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbml0SW50ZXJwb2xhdG9yKGRvbWFpbiwgaW50ZXJwb2xhdG9yKSB7XG4gIHN3aXRjaCAoYXJndW1lbnRzLmxlbmd0aCkge1xuICAgIGNhc2UgMDogYnJlYWs7XG4gICAgY2FzZSAxOiB7XG4gICAgICBpZiAodHlwZW9mIGRvbWFpbiA9PT0gXCJmdW5jdGlvblwiKSB0aGlzLmludGVycG9sYXRvcihkb21haW4pO1xuICAgICAgZWxzZSB0aGlzLnJhbmdlKGRvbWFpbik7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgdGhpcy5kb21haW4oZG9tYWluKTtcbiAgICAgIGlmICh0eXBlb2YgaW50ZXJwb2xhdG9yID09PSBcImZ1bmN0aW9uXCIpIHRoaXMuaW50ZXJwb2xhdG9yKGludGVycG9sYXRvcik7XG4gICAgICBlbHNlIHRoaXMucmFuZ2UoaW50ZXJwb2xhdG9yKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdGhpcztcbn1cbiIsImltcG9ydCB7YXNjZW5kaW5nLCBiaXNlY3QsIHF1YW50aWxlU29ydGVkIGFzIHRocmVzaG9sZH0gZnJvbSBcImQzLWFycmF5XCI7XG5pbXBvcnQge2luaXRSYW5nZX0gZnJvbSBcIi4vaW5pdC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBxdWFudGlsZSgpIHtcbiAgdmFyIGRvbWFpbiA9IFtdLFxuICAgICAgcmFuZ2UgPSBbXSxcbiAgICAgIHRocmVzaG9sZHMgPSBbXSxcbiAgICAgIHVua25vd247XG5cbiAgZnVuY3Rpb24gcmVzY2FsZSgpIHtcbiAgICB2YXIgaSA9IDAsIG4gPSBNYXRoLm1heCgxLCByYW5nZS5sZW5ndGgpO1xuICAgIHRocmVzaG9sZHMgPSBuZXcgQXJyYXkobiAtIDEpO1xuICAgIHdoaWxlICgrK2kgPCBuKSB0aHJlc2hvbGRzW2kgLSAxXSA9IHRocmVzaG9sZChkb21haW4sIGkgLyBuKTtcbiAgICByZXR1cm4gc2NhbGU7XG4gIH1cblxuICBmdW5jdGlvbiBzY2FsZSh4KSB7XG4gICAgcmV0dXJuIHggPT0gbnVsbCB8fCBpc05hTih4ID0gK3gpID8gdW5rbm93biA6IHJhbmdlW2Jpc2VjdCh0aHJlc2hvbGRzLCB4KV07XG4gIH1cblxuICBzY2FsZS5pbnZlcnRFeHRlbnQgPSBmdW5jdGlvbih5KSB7XG4gICAgdmFyIGkgPSByYW5nZS5pbmRleE9mKHkpO1xuICAgIHJldHVybiBpIDwgMCA/IFtOYU4sIE5hTl0gOiBbXG4gICAgICBpID4gMCA/IHRocmVzaG9sZHNbaSAtIDFdIDogZG9tYWluWzBdLFxuICAgICAgaSA8IHRocmVzaG9sZHMubGVuZ3RoID8gdGhyZXNob2xkc1tpXSA6IGRvbWFpbltkb21haW4ubGVuZ3RoIC0gMV1cbiAgICBdO1xuICB9O1xuXG4gIHNjYWxlLmRvbWFpbiA9IGZ1bmN0aW9uKF8pIHtcbiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBkb21haW4uc2xpY2UoKTtcbiAgICBkb21haW4gPSBbXTtcbiAgICBmb3IgKGxldCBkIG9mIF8pIGlmIChkICE9IG51bGwgJiYgIWlzTmFOKGQgPSArZCkpIGRvbWFpbi5wdXNoKGQpO1xuICAgIGRvbWFpbi5zb3J0KGFzY2VuZGluZyk7XG4gICAgcmV0dXJuIHJlc2NhbGUoKTtcbiAgfTtcblxuICBzY2FsZS5yYW5nZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChyYW5nZSA9IEFycmF5LmZyb20oXyksIHJlc2NhbGUoKSkgOiByYW5nZS5zbGljZSgpO1xuICB9O1xuXG4gIHNjYWxlLnVua25vd24gPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodW5rbm93biA9IF8sIHNjYWxlKSA6IHVua25vd247XG4gIH07XG5cbiAgc2NhbGUucXVhbnRpbGVzID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRocmVzaG9sZHMuc2xpY2UoKTtcbiAgfTtcblxuICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHF1YW50aWxlKClcbiAgICAgICAgLmRvbWFpbihkb21haW4pXG4gICAgICAgIC5yYW5nZShyYW5nZSlcbiAgICAgICAgLnVua25vd24odW5rbm93bik7XG4gIH07XG5cbiAgcmV0dXJuIGluaXRSYW5nZS5hcHBseShzY2FsZSwgYXJndW1lbnRzKTtcbn1cbiIsIi8vIEdpdmVuIHNvbWV0aGluZyBhcnJheSBsaWtlIChvciBudWxsKSwgcmV0dXJucyBzb21ldGhpbmcgdGhhdCBpcyBzdHJpY3RseSBhblxuLy8gYXJyYXkuIFRoaXMgaXMgdXNlZCB0byBlbnN1cmUgdGhhdCBhcnJheS1saWtlIG9iamVjdHMgcGFzc2VkIHRvIGQzLnNlbGVjdEFsbFxuLy8gb3Igc2VsZWN0aW9uLnNlbGVjdEFsbCBhcmUgY29udmVydGVkIGludG8gcHJvcGVyIGFycmF5cyB3aGVuIGNyZWF0aW5nIGFcbi8vIHNlbGVjdGlvbjsgd2UgZG9u4oCZdCBldmVyIHdhbnQgdG8gY3JlYXRlIGEgc2VsZWN0aW9uIGJhY2tlZCBieSBhIGxpdmVcbi8vIEhUTUxDb2xsZWN0aW9uIG9yIE5vZGVMaXN0LiBIb3dldmVyLCBub3RlIHRoYXQgc2VsZWN0aW9uLnNlbGVjdEFsbCB3aWxsIHVzZSBhXG4vLyBzdGF0aWMgTm9kZUxpc3QgYXMgYSBncm91cCwgc2luY2UgaXQgc2FmZWx5IGRlcml2ZWQgZnJvbSBxdWVyeVNlbGVjdG9yQWxsLlxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYXJyYXkoeCkge1xuICByZXR1cm4geCA9PSBudWxsID8gW10gOiBBcnJheS5pc0FycmF5KHgpID8geCA6IEFycmF5LmZyb20oeCk7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbih4KSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4geDtcbiAgfTtcbn1cbiIsImltcG9ydCBuYW1lc3BhY2UgZnJvbSBcIi4vbmFtZXNwYWNlLmpzXCI7XG5pbXBvcnQge3hodG1sfSBmcm9tIFwiLi9uYW1lc3BhY2VzLmpzXCI7XG5cbmZ1bmN0aW9uIGNyZWF0b3JJbmhlcml0KG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBkb2N1bWVudCA9IHRoaXMub3duZXJEb2N1bWVudCxcbiAgICAgICAgdXJpID0gdGhpcy5uYW1lc3BhY2VVUkk7XG4gICAgcmV0dXJuIHVyaSA9PT0geGh0bWwgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm5hbWVzcGFjZVVSSSA9PT0geGh0bWxcbiAgICAgICAgPyBkb2N1bWVudC5jcmVhdGVFbGVtZW50KG5hbWUpXG4gICAgICAgIDogZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHVyaSwgbmFtZSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNyZWF0b3JGaXhlZChmdWxsbmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSkge1xuICB2YXIgZnVsbG5hbWUgPSBuYW1lc3BhY2UobmFtZSk7XG4gIHJldHVybiAoZnVsbG5hbWUubG9jYWxcbiAgICAgID8gY3JlYXRvckZpeGVkXG4gICAgICA6IGNyZWF0b3JJbmhlcml0KShmdWxsbmFtZSk7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzZWxlY3Rvcikge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMubWF0Y2hlcyhzZWxlY3Rvcik7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGlsZE1hdGNoZXIoc2VsZWN0b3IpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS5tYXRjaGVzKHNlbGVjdG9yKTtcbiAgfTtcbn1cblxuIiwiaW1wb3J0IG5hbWVzcGFjZXMgZnJvbSBcIi4vbmFtZXNwYWNlcy5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lKSB7XG4gIHZhciBwcmVmaXggPSBuYW1lICs9IFwiXCIsIGkgPSBwcmVmaXguaW5kZXhPZihcIjpcIik7XG4gIGlmIChpID49IDAgJiYgKHByZWZpeCA9IG5hbWUuc2xpY2UoMCwgaSkpICE9PSBcInhtbG5zXCIpIG5hbWUgPSBuYW1lLnNsaWNlKGkgKyAxKTtcbiAgcmV0dXJuIG5hbWVzcGFjZXMuaGFzT3duUHJvcGVydHkocHJlZml4KSA/IHtzcGFjZTogbmFtZXNwYWNlc1twcmVmaXhdLCBsb2NhbDogbmFtZX0gOiBuYW1lOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xufVxuIiwiZXhwb3J0IHZhciB4aHRtbCA9IFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbFwiO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIHN2ZzogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLFxuICB4aHRtbDogeGh0bWwsXG4gIHhsaW5rOiBcImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIixcbiAgeG1sOiBcImh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZVwiLFxuICB4bWxuczogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3htbG5zL1wiXG59O1xuIiwiaW1wb3J0IHNvdXJjZUV2ZW50IGZyb20gXCIuL3NvdXJjZUV2ZW50LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGV2ZW50LCBub2RlKSB7XG4gIGV2ZW50ID0gc291cmNlRXZlbnQoZXZlbnQpO1xuICBpZiAobm9kZSA9PT0gdW5kZWZpbmVkKSBub2RlID0gZXZlbnQuY3VycmVudFRhcmdldDtcbiAgaWYgKG5vZGUpIHtcbiAgICB2YXIgc3ZnID0gbm9kZS5vd25lclNWR0VsZW1lbnQgfHwgbm9kZTtcbiAgICBpZiAoc3ZnLmNyZWF0ZVNWR1BvaW50KSB7XG4gICAgICB2YXIgcG9pbnQgPSBzdmcuY3JlYXRlU1ZHUG9pbnQoKTtcbiAgICAgIHBvaW50LnggPSBldmVudC5jbGllbnRYLCBwb2ludC55ID0gZXZlbnQuY2xpZW50WTtcbiAgICAgIHBvaW50ID0gcG9pbnQubWF0cml4VHJhbnNmb3JtKG5vZGUuZ2V0U2NyZWVuQ1RNKCkuaW52ZXJzZSgpKTtcbiAgICAgIHJldHVybiBbcG9pbnQueCwgcG9pbnQueV07XG4gICAgfVxuICAgIGlmIChub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCkge1xuICAgICAgdmFyIHJlY3QgPSBub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgcmV0dXJuIFtldmVudC5jbGllbnRYIC0gcmVjdC5sZWZ0IC0gbm9kZS5jbGllbnRMZWZ0LCBldmVudC5jbGllbnRZIC0gcmVjdC50b3AgLSBub2RlLmNsaWVudFRvcF07XG4gICAgfVxuICB9XG4gIHJldHVybiBbZXZlbnQucGFnZVgsIGV2ZW50LnBhZ2VZXTtcbn1cbiIsImltcG9ydCB7U2VsZWN0aW9uLCByb290fSBmcm9tIFwiLi9zZWxlY3Rpb24vaW5kZXguanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc2VsZWN0b3IpIHtcbiAgcmV0dXJuIHR5cGVvZiBzZWxlY3RvciA9PT0gXCJzdHJpbmdcIlxuICAgICAgPyBuZXcgU2VsZWN0aW9uKFtbZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3RvcildXSwgW2RvY3VtZW50LmRvY3VtZW50RWxlbWVudF0pXG4gICAgICA6IG5ldyBTZWxlY3Rpb24oW1tzZWxlY3Rvcl1dLCByb290KTtcbn1cbiIsImltcG9ydCBjcmVhdG9yIGZyb20gXCIuLi9jcmVhdG9yLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUpIHtcbiAgdmFyIGNyZWF0ZSA9IHR5cGVvZiBuYW1lID09PSBcImZ1bmN0aW9uXCIgPyBuYW1lIDogY3JlYXRvcihuYW1lKTtcbiAgcmV0dXJuIHRoaXMuc2VsZWN0KGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLmFwcGVuZENoaWxkKGNyZWF0ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgbmFtZXNwYWNlIGZyb20gXCIuLi9uYW1lc3BhY2UuanNcIjtcblxuZnVuY3Rpb24gYXR0clJlbW92ZShuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0clJlbW92ZU5TKGZ1bGxuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJDb25zdGFudChuYW1lLCB2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRyQ29uc3RhbnROUyhmdWxsbmFtZSwgdmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuc2V0QXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsLCB2YWx1ZSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJGdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmICh2ID09IG51bGwpIHRoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgIGVsc2UgdGhpcy5zZXRBdHRyaWJ1dGUobmFtZSwgdik7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJGdW5jdGlvbk5TKGZ1bGxuYW1lLCB2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmICh2ID09IG51bGwpIHRoaXMucmVtb3ZlQXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTtcbiAgICBlbHNlIHRoaXMuc2V0QXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsLCB2KTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgdmFyIGZ1bGxuYW1lID0gbmFtZXNwYWNlKG5hbWUpO1xuXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikge1xuICAgIHZhciBub2RlID0gdGhpcy5ub2RlKCk7XG4gICAgcmV0dXJuIGZ1bGxuYW1lLmxvY2FsXG4gICAgICAgID8gbm9kZS5nZXRBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwpXG4gICAgICAgIDogbm9kZS5nZXRBdHRyaWJ1dGUoZnVsbG5hbWUpO1xuICB9XG5cbiAgcmV0dXJuIHRoaXMuZWFjaCgodmFsdWUgPT0gbnVsbFxuICAgICAgPyAoZnVsbG5hbWUubG9jYWwgPyBhdHRyUmVtb3ZlTlMgOiBhdHRyUmVtb3ZlKSA6ICh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgPyAoZnVsbG5hbWUubG9jYWwgPyBhdHRyRnVuY3Rpb25OUyA6IGF0dHJGdW5jdGlvbilcbiAgICAgIDogKGZ1bGxuYW1lLmxvY2FsID8gYXR0ckNvbnN0YW50TlMgOiBhdHRyQ29uc3RhbnQpKSkoZnVsbG5hbWUsIHZhbHVlKSk7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgdmFyIGNhbGxiYWNrID0gYXJndW1lbnRzWzBdO1xuICBhcmd1bWVudHNbMF0gPSB0aGlzO1xuICBjYWxsYmFjay5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICByZXR1cm4gdGhpcztcbn1cbiIsImZ1bmN0aW9uIGNsYXNzQXJyYXkoc3RyaW5nKSB7XG4gIHJldHVybiBzdHJpbmcudHJpbSgpLnNwbGl0KC9efFxccysvKTtcbn1cblxuZnVuY3Rpb24gY2xhc3NMaXN0KG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUuY2xhc3NMaXN0IHx8IG5ldyBDbGFzc0xpc3Qobm9kZSk7XG59XG5cbmZ1bmN0aW9uIENsYXNzTGlzdChub2RlKSB7XG4gIHRoaXMuX25vZGUgPSBub2RlO1xuICB0aGlzLl9uYW1lcyA9IGNsYXNzQXJyYXkobm9kZS5nZXRBdHRyaWJ1dGUoXCJjbGFzc1wiKSB8fCBcIlwiKTtcbn1cblxuQ2xhc3NMaXN0LnByb3RvdHlwZSA9IHtcbiAgYWRkOiBmdW5jdGlvbihuYW1lKSB7XG4gICAgdmFyIGkgPSB0aGlzLl9uYW1lcy5pbmRleE9mKG5hbWUpO1xuICAgIGlmIChpIDwgMCkge1xuICAgICAgdGhpcy5fbmFtZXMucHVzaChuYW1lKTtcbiAgICAgIHRoaXMuX25vZGUuc2V0QXR0cmlidXRlKFwiY2xhc3NcIiwgdGhpcy5fbmFtZXMuam9pbihcIiBcIikpO1xuICAgIH1cbiAgfSxcbiAgcmVtb3ZlOiBmdW5jdGlvbihuYW1lKSB7XG4gICAgdmFyIGkgPSB0aGlzLl9uYW1lcy5pbmRleE9mKG5hbWUpO1xuICAgIGlmIChpID49IDApIHtcbiAgICAgIHRoaXMuX25hbWVzLnNwbGljZShpLCAxKTtcbiAgICAgIHRoaXMuX25vZGUuc2V0QXR0cmlidXRlKFwiY2xhc3NcIiwgdGhpcy5fbmFtZXMuam9pbihcIiBcIikpO1xuICAgIH1cbiAgfSxcbiAgY29udGFpbnM6IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICByZXR1cm4gdGhpcy5fbmFtZXMuaW5kZXhPZihuYW1lKSA+PSAwO1xuICB9XG59O1xuXG5mdW5jdGlvbiBjbGFzc2VkQWRkKG5vZGUsIG5hbWVzKSB7XG4gIHZhciBsaXN0ID0gY2xhc3NMaXN0KG5vZGUpLCBpID0gLTEsIG4gPSBuYW1lcy5sZW5ndGg7XG4gIHdoaWxlICgrK2kgPCBuKSBsaXN0LmFkZChuYW1lc1tpXSk7XG59XG5cbmZ1bmN0aW9uIGNsYXNzZWRSZW1vdmUobm9kZSwgbmFtZXMpIHtcbiAgdmFyIGxpc3QgPSBjbGFzc0xpc3Qobm9kZSksIGkgPSAtMSwgbiA9IG5hbWVzLmxlbmd0aDtcbiAgd2hpbGUgKCsraSA8IG4pIGxpc3QucmVtb3ZlKG5hbWVzW2ldKTtcbn1cblxuZnVuY3Rpb24gY2xhc3NlZFRydWUobmFtZXMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIGNsYXNzZWRBZGQodGhpcywgbmFtZXMpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBjbGFzc2VkRmFsc2UobmFtZXMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIGNsYXNzZWRSZW1vdmUodGhpcywgbmFtZXMpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBjbGFzc2VkRnVuY3Rpb24obmFtZXMsIHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAodmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKSA/IGNsYXNzZWRBZGQgOiBjbGFzc2VkUmVtb3ZlKSh0aGlzLCBuYW1lcyk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gIHZhciBuYW1lcyA9IGNsYXNzQXJyYXkobmFtZSArIFwiXCIpO1xuXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikge1xuICAgIHZhciBsaXN0ID0gY2xhc3NMaXN0KHRoaXMubm9kZSgpKSwgaSA9IC0xLCBuID0gbmFtZXMubGVuZ3RoO1xuICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoIWxpc3QuY29udGFpbnMobmFtZXNbaV0pKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gdGhpcy5lYWNoKCh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgPyBjbGFzc2VkRnVuY3Rpb24gOiB2YWx1ZVxuICAgICAgPyBjbGFzc2VkVHJ1ZVxuICAgICAgOiBjbGFzc2VkRmFsc2UpKG5hbWVzLCB2YWx1ZSkpO1xufVxuIiwiZnVuY3Rpb24gc2VsZWN0aW9uX2Nsb25lU2hhbGxvdygpIHtcbiAgdmFyIGNsb25lID0gdGhpcy5jbG9uZU5vZGUoZmFsc2UpLCBwYXJlbnQgPSB0aGlzLnBhcmVudE5vZGU7XG4gIHJldHVybiBwYXJlbnQgPyBwYXJlbnQuaW5zZXJ0QmVmb3JlKGNsb25lLCB0aGlzLm5leHRTaWJsaW5nKSA6IGNsb25lO1xufVxuXG5mdW5jdGlvbiBzZWxlY3Rpb25fY2xvbmVEZWVwKCkge1xuICB2YXIgY2xvbmUgPSB0aGlzLmNsb25lTm9kZSh0cnVlKSwgcGFyZW50ID0gdGhpcy5wYXJlbnROb2RlO1xuICByZXR1cm4gcGFyZW50ID8gcGFyZW50Lmluc2VydEJlZm9yZShjbG9uZSwgdGhpcy5uZXh0U2libGluZykgOiBjbG9uZTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZGVlcCkge1xuICByZXR1cm4gdGhpcy5zZWxlY3QoZGVlcCA/IHNlbGVjdGlvbl9jbG9uZURlZXAgOiBzZWxlY3Rpb25fY2xvbmVTaGFsbG93KTtcbn1cbiIsImltcG9ydCB7U2VsZWN0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuaW1wb3J0IHtFbnRlck5vZGV9IGZyb20gXCIuL2VudGVyLmpzXCI7XG5pbXBvcnQgY29uc3RhbnQgZnJvbSBcIi4uL2NvbnN0YW50LmpzXCI7XG5cbmZ1bmN0aW9uIGJpbmRJbmRleChwYXJlbnQsIGdyb3VwLCBlbnRlciwgdXBkYXRlLCBleGl0LCBkYXRhKSB7XG4gIHZhciBpID0gMCxcbiAgICAgIG5vZGUsXG4gICAgICBncm91cExlbmd0aCA9IGdyb3VwLmxlbmd0aCxcbiAgICAgIGRhdGFMZW5ndGggPSBkYXRhLmxlbmd0aDtcblxuICAvLyBQdXQgYW55IG5vbi1udWxsIG5vZGVzIHRoYXQgZml0IGludG8gdXBkYXRlLlxuICAvLyBQdXQgYW55IG51bGwgbm9kZXMgaW50byBlbnRlci5cbiAgLy8gUHV0IGFueSByZW1haW5pbmcgZGF0YSBpbnRvIGVudGVyLlxuICBmb3IgKDsgaSA8IGRhdGFMZW5ndGg7ICsraSkge1xuICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHtcbiAgICAgIG5vZGUuX19kYXRhX18gPSBkYXRhW2ldO1xuICAgICAgdXBkYXRlW2ldID0gbm9kZTtcbiAgICB9IGVsc2Uge1xuICAgICAgZW50ZXJbaV0gPSBuZXcgRW50ZXJOb2RlKHBhcmVudCwgZGF0YVtpXSk7XG4gICAgfVxuICB9XG5cbiAgLy8gUHV0IGFueSBub24tbnVsbCBub2RlcyB0aGF0IGRvbuKAmXQgZml0IGludG8gZXhpdC5cbiAgZm9yICg7IGkgPCBncm91cExlbmd0aDsgKytpKSB7XG4gICAgaWYgKG5vZGUgPSBncm91cFtpXSkge1xuICAgICAgZXhpdFtpXSA9IG5vZGU7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGJpbmRLZXkocGFyZW50LCBncm91cCwgZW50ZXIsIHVwZGF0ZSwgZXhpdCwgZGF0YSwga2V5KSB7XG4gIHZhciBpLFxuICAgICAgbm9kZSxcbiAgICAgIG5vZGVCeUtleVZhbHVlID0gbmV3IE1hcCxcbiAgICAgIGdyb3VwTGVuZ3RoID0gZ3JvdXAubGVuZ3RoLFxuICAgICAgZGF0YUxlbmd0aCA9IGRhdGEubGVuZ3RoLFxuICAgICAga2V5VmFsdWVzID0gbmV3IEFycmF5KGdyb3VwTGVuZ3RoKSxcbiAgICAgIGtleVZhbHVlO1xuXG4gIC8vIENvbXB1dGUgdGhlIGtleSBmb3IgZWFjaCBub2RlLlxuICAvLyBJZiBtdWx0aXBsZSBub2RlcyBoYXZlIHRoZSBzYW1lIGtleSwgdGhlIGR1cGxpY2F0ZXMgYXJlIGFkZGVkIHRvIGV4aXQuXG4gIGZvciAoaSA9IDA7IGkgPCBncm91cExlbmd0aDsgKytpKSB7XG4gICAgaWYgKG5vZGUgPSBncm91cFtpXSkge1xuICAgICAga2V5VmFsdWVzW2ldID0ga2V5VmFsdWUgPSBrZXkuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCkgKyBcIlwiO1xuICAgICAgaWYgKG5vZGVCeUtleVZhbHVlLmhhcyhrZXlWYWx1ZSkpIHtcbiAgICAgICAgZXhpdFtpXSA9IG5vZGU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBub2RlQnlLZXlWYWx1ZS5zZXQoa2V5VmFsdWUsIG5vZGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIENvbXB1dGUgdGhlIGtleSBmb3IgZWFjaCBkYXR1bS5cbiAgLy8gSWYgdGhlcmUgYSBub2RlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGtleSwgam9pbiBhbmQgYWRkIGl0IHRvIHVwZGF0ZS5cbiAgLy8gSWYgdGhlcmUgaXMgbm90IChvciB0aGUga2V5IGlzIGEgZHVwbGljYXRlKSwgYWRkIGl0IHRvIGVudGVyLlxuICBmb3IgKGkgPSAwOyBpIDwgZGF0YUxlbmd0aDsgKytpKSB7XG4gICAga2V5VmFsdWUgPSBrZXkuY2FsbChwYXJlbnQsIGRhdGFbaV0sIGksIGRhdGEpICsgXCJcIjtcbiAgICBpZiAobm9kZSA9IG5vZGVCeUtleVZhbHVlLmdldChrZXlWYWx1ZSkpIHtcbiAgICAgIHVwZGF0ZVtpXSA9IG5vZGU7XG4gICAgICBub2RlLl9fZGF0YV9fID0gZGF0YVtpXTtcbiAgICAgIG5vZGVCeUtleVZhbHVlLmRlbGV0ZShrZXlWYWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVudGVyW2ldID0gbmV3IEVudGVyTm9kZShwYXJlbnQsIGRhdGFbaV0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIEFkZCBhbnkgcmVtYWluaW5nIG5vZGVzIHRoYXQgd2VyZSBub3QgYm91bmQgdG8gZGF0YSB0byBleGl0LlxuICBmb3IgKGkgPSAwOyBpIDwgZ3JvdXBMZW5ndGg7ICsraSkge1xuICAgIGlmICgobm9kZSA9IGdyb3VwW2ldKSAmJiAobm9kZUJ5S2V5VmFsdWUuZ2V0KGtleVZhbHVlc1tpXSkgPT09IG5vZGUpKSB7XG4gICAgICBleGl0W2ldID0gbm9kZTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZGF0dW0obm9kZSkge1xuICByZXR1cm4gbm9kZS5fX2RhdGFfXztcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBBcnJheS5mcm9tKHRoaXMsIGRhdHVtKTtcblxuICB2YXIgYmluZCA9IGtleSA/IGJpbmRLZXkgOiBiaW5kSW5kZXgsXG4gICAgICBwYXJlbnRzID0gdGhpcy5fcGFyZW50cyxcbiAgICAgIGdyb3VwcyA9IHRoaXMuX2dyb3VwcztcblxuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHZhbHVlID0gY29uc3RhbnQodmFsdWUpO1xuXG4gIGZvciAodmFyIG0gPSBncm91cHMubGVuZ3RoLCB1cGRhdGUgPSBuZXcgQXJyYXkobSksIGVudGVyID0gbmV3IEFycmF5KG0pLCBleGl0ID0gbmV3IEFycmF5KG0pLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIHZhciBwYXJlbnQgPSBwYXJlbnRzW2pdLFxuICAgICAgICBncm91cCA9IGdyb3Vwc1tqXSxcbiAgICAgICAgZ3JvdXBMZW5ndGggPSBncm91cC5sZW5ndGgsXG4gICAgICAgIGRhdGEgPSBhcnJheWxpa2UodmFsdWUuY2FsbChwYXJlbnQsIHBhcmVudCAmJiBwYXJlbnQuX19kYXRhX18sIGosIHBhcmVudHMpKSxcbiAgICAgICAgZGF0YUxlbmd0aCA9IGRhdGEubGVuZ3RoLFxuICAgICAgICBlbnRlckdyb3VwID0gZW50ZXJbal0gPSBuZXcgQXJyYXkoZGF0YUxlbmd0aCksXG4gICAgICAgIHVwZGF0ZUdyb3VwID0gdXBkYXRlW2pdID0gbmV3IEFycmF5KGRhdGFMZW5ndGgpLFxuICAgICAgICBleGl0R3JvdXAgPSBleGl0W2pdID0gbmV3IEFycmF5KGdyb3VwTGVuZ3RoKTtcblxuICAgIGJpbmQocGFyZW50LCBncm91cCwgZW50ZXJHcm91cCwgdXBkYXRlR3JvdXAsIGV4aXRHcm91cCwgZGF0YSwga2V5KTtcblxuICAgIC8vIE5vdyBjb25uZWN0IHRoZSBlbnRlciBub2RlcyB0byB0aGVpciBmb2xsb3dpbmcgdXBkYXRlIG5vZGUsIHN1Y2ggdGhhdFxuICAgIC8vIGFwcGVuZENoaWxkIGNhbiBpbnNlcnQgdGhlIG1hdGVyaWFsaXplZCBlbnRlciBub2RlIGJlZm9yZSB0aGlzIG5vZGUsXG4gICAgLy8gcmF0aGVyIHRoYW4gYXQgdGhlIGVuZCBvZiB0aGUgcGFyZW50IG5vZGUuXG4gICAgZm9yICh2YXIgaTAgPSAwLCBpMSA9IDAsIHByZXZpb3VzLCBuZXh0OyBpMCA8IGRhdGFMZW5ndGg7ICsraTApIHtcbiAgICAgIGlmIChwcmV2aW91cyA9IGVudGVyR3JvdXBbaTBdKSB7XG4gICAgICAgIGlmIChpMCA+PSBpMSkgaTEgPSBpMCArIDE7XG4gICAgICAgIHdoaWxlICghKG5leHQgPSB1cGRhdGVHcm91cFtpMV0pICYmICsraTEgPCBkYXRhTGVuZ3RoKTtcbiAgICAgICAgcHJldmlvdXMuX25leHQgPSBuZXh0IHx8IG51bGw7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlID0gbmV3IFNlbGVjdGlvbih1cGRhdGUsIHBhcmVudHMpO1xuICB1cGRhdGUuX2VudGVyID0gZW50ZXI7XG4gIHVwZGF0ZS5fZXhpdCA9IGV4aXQ7XG4gIHJldHVybiB1cGRhdGU7XG59XG5cbi8vIEdpdmVuIHNvbWUgZGF0YSwgdGhpcyByZXR1cm5zIGFuIGFycmF5LWxpa2UgdmlldyBvZiBpdDogYW4gb2JqZWN0IHRoYXRcbi8vIGV4cG9zZXMgYSBsZW5ndGggcHJvcGVydHkgYW5kIGFsbG93cyBudW1lcmljIGluZGV4aW5nLiBOb3RlIHRoYXQgdW5saWtlXG4vLyBzZWxlY3RBbGwsIHRoaXMgaXNu4oCZdCB3b3JyaWVkIGFib3V0IOKAnGxpdmXigJ0gY29sbGVjdGlvbnMgYmVjYXVzZSB0aGUgcmVzdWx0aW5nXG4vLyBhcnJheSB3aWxsIG9ubHkgYmUgdXNlZCBicmllZmx5IHdoaWxlIGRhdGEgaXMgYmVpbmcgYm91bmQuIChJdCBpcyBwb3NzaWJsZSB0b1xuLy8gY2F1c2UgdGhlIGRhdGEgdG8gY2hhbmdlIHdoaWxlIGl0ZXJhdGluZyBieSB1c2luZyBhIGtleSBmdW5jdGlvbiwgYnV0IHBsZWFzZVxuLy8gZG9u4oCZdDsgd2XigJlkIHJhdGhlciBhdm9pZCBhIGdyYXR1aXRvdXMgY29weS4pXG5mdW5jdGlvbiBhcnJheWxpa2UoZGF0YSkge1xuICByZXR1cm4gdHlwZW9mIGRhdGEgPT09IFwib2JqZWN0XCIgJiYgXCJsZW5ndGhcIiBpbiBkYXRhXG4gICAgPyBkYXRhIC8vIEFycmF5LCBUeXBlZEFycmF5LCBOb2RlTGlzdCwgYXJyYXktbGlrZVxuICAgIDogQXJyYXkuZnJvbShkYXRhKTsgLy8gTWFwLCBTZXQsIGl0ZXJhYmxlLCBzdHJpbmcsIG9yIGFueXRoaW5nIGVsc2Vcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoXG4gICAgICA/IHRoaXMucHJvcGVydHkoXCJfX2RhdGFfX1wiLCB2YWx1ZSlcbiAgICAgIDogdGhpcy5ub2RlKCkuX19kYXRhX187XG59XG4iLCJpbXBvcnQgZGVmYXVsdFZpZXcgZnJvbSBcIi4uL3dpbmRvdy5qc1wiO1xuXG5mdW5jdGlvbiBkaXNwYXRjaEV2ZW50KG5vZGUsIHR5cGUsIHBhcmFtcykge1xuICB2YXIgd2luZG93ID0gZGVmYXVsdFZpZXcobm9kZSksXG4gICAgICBldmVudCA9IHdpbmRvdy5DdXN0b21FdmVudDtcblxuICBpZiAodHlwZW9mIGV2ZW50ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBldmVudCA9IG5ldyBldmVudCh0eXBlLCBwYXJhbXMpO1xuICB9IGVsc2Uge1xuICAgIGV2ZW50ID0gd2luZG93LmRvY3VtZW50LmNyZWF0ZUV2ZW50KFwiRXZlbnRcIik7XG4gICAgaWYgKHBhcmFtcykgZXZlbnQuaW5pdEV2ZW50KHR5cGUsIHBhcmFtcy5idWJibGVzLCBwYXJhbXMuY2FuY2VsYWJsZSksIGV2ZW50LmRldGFpbCA9IHBhcmFtcy5kZXRhaWw7XG4gICAgZWxzZSBldmVudC5pbml0RXZlbnQodHlwZSwgZmFsc2UsIGZhbHNlKTtcbiAgfVxuXG4gIG5vZGUuZGlzcGF0Y2hFdmVudChldmVudCk7XG59XG5cbmZ1bmN0aW9uIGRpc3BhdGNoQ29uc3RhbnQodHlwZSwgcGFyYW1zKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZGlzcGF0Y2hFdmVudCh0aGlzLCB0eXBlLCBwYXJhbXMpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBkaXNwYXRjaEZ1bmN0aW9uKHR5cGUsIHBhcmFtcykge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGRpc3BhdGNoRXZlbnQodGhpcywgdHlwZSwgcGFyYW1zLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih0eXBlLCBwYXJhbXMpIHtcbiAgcmV0dXJuIHRoaXMuZWFjaCgodHlwZW9mIHBhcmFtcyA9PT0gXCJmdW5jdGlvblwiXG4gICAgICA/IGRpc3BhdGNoRnVuY3Rpb25cbiAgICAgIDogZGlzcGF0Y2hDb25zdGFudCkodHlwZSwgcGFyYW1zKSk7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihjYWxsYmFjaykge1xuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgaiA9IDAsIG0gPSBncm91cHMubGVuZ3RoOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIGkgPSAwLCBuID0gZ3JvdXAubGVuZ3RoLCBub2RlOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSBjYWxsYmFjay5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gIXRoaXMubm9kZSgpO1xufVxuIiwiaW1wb3J0IHNwYXJzZSBmcm9tIFwiLi9zcGFyc2UuanNcIjtcbmltcG9ydCB7U2VsZWN0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBTZWxlY3Rpb24odGhpcy5fZW50ZXIgfHwgdGhpcy5fZ3JvdXBzLm1hcChzcGFyc2UpLCB0aGlzLl9wYXJlbnRzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEVudGVyTm9kZShwYXJlbnQsIGRhdHVtKSB7XG4gIHRoaXMub3duZXJEb2N1bWVudCA9IHBhcmVudC5vd25lckRvY3VtZW50O1xuICB0aGlzLm5hbWVzcGFjZVVSSSA9IHBhcmVudC5uYW1lc3BhY2VVUkk7XG4gIHRoaXMuX25leHQgPSBudWxsO1xuICB0aGlzLl9wYXJlbnQgPSBwYXJlbnQ7XG4gIHRoaXMuX19kYXRhX18gPSBkYXR1bTtcbn1cblxuRW50ZXJOb2RlLnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IEVudGVyTm9kZSxcbiAgYXBwZW5kQ2hpbGQ6IGZ1bmN0aW9uKGNoaWxkKSB7IHJldHVybiB0aGlzLl9wYXJlbnQuaW5zZXJ0QmVmb3JlKGNoaWxkLCB0aGlzLl9uZXh0KTsgfSxcbiAgaW5zZXJ0QmVmb3JlOiBmdW5jdGlvbihjaGlsZCwgbmV4dCkgeyByZXR1cm4gdGhpcy5fcGFyZW50Lmluc2VydEJlZm9yZShjaGlsZCwgbmV4dCk7IH0sXG4gIHF1ZXJ5U2VsZWN0b3I6IGZ1bmN0aW9uKHNlbGVjdG9yKSB7IHJldHVybiB0aGlzLl9wYXJlbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7IH0sXG4gIHF1ZXJ5U2VsZWN0b3JBbGw6IGZ1bmN0aW9uKHNlbGVjdG9yKSB7IHJldHVybiB0aGlzLl9wYXJlbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7IH1cbn07XG4iLCJpbXBvcnQgc3BhcnNlIGZyb20gXCIuL3NwYXJzZS5qc1wiO1xuaW1wb3J0IHtTZWxlY3Rpb259IGZyb20gXCIuL2luZGV4LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFNlbGVjdGlvbih0aGlzLl9leGl0IHx8IHRoaXMuX2dyb3Vwcy5tYXAoc3BhcnNlKSwgdGhpcy5fcGFyZW50cyk7XG59XG4iLCJpbXBvcnQge1NlbGVjdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcbmltcG9ydCBtYXRjaGVyIGZyb20gXCIuLi9tYXRjaGVyLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG1hdGNoKSB7XG4gIGlmICh0eXBlb2YgbWF0Y2ggIT09IFwiZnVuY3Rpb25cIikgbWF0Y2ggPSBtYXRjaGVyKG1hdGNoKTtcblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBzdWJncm91cHMgPSBuZXcgQXJyYXkobSksIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIHN1Ymdyb3VwID0gc3ViZ3JvdXBzW2pdID0gW10sIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAoKG5vZGUgPSBncm91cFtpXSkgJiYgbWF0Y2guY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCkpIHtcbiAgICAgICAgc3ViZ3JvdXAucHVzaChub2RlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IFNlbGVjdGlvbihzdWJncm91cHMsIHRoaXMuX3BhcmVudHMpO1xufVxuIiwiZnVuY3Rpb24gaHRtbFJlbW92ZSgpIHtcbiAgdGhpcy5pbm5lckhUTUwgPSBcIlwiO1xufVxuXG5mdW5jdGlvbiBodG1sQ29uc3RhbnQodmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuaW5uZXJIVE1MID0gdmFsdWU7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGh0bWxGdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIHRoaXMuaW5uZXJIVE1MID0gdiA9PSBudWxsID8gXCJcIiA6IHY7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoXG4gICAgICA/IHRoaXMuZWFjaCh2YWx1ZSA9PSBudWxsXG4gICAgICAgICAgPyBodG1sUmVtb3ZlIDogKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgPyBodG1sRnVuY3Rpb25cbiAgICAgICAgICA6IGh0bWxDb25zdGFudCkodmFsdWUpKVxuICAgICAgOiB0aGlzLm5vZGUoKS5pbm5lckhUTUw7XG59XG4iLCJpbXBvcnQgc2VsZWN0aW9uX3NlbGVjdCBmcm9tIFwiLi9zZWxlY3QuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fc2VsZWN0QWxsIGZyb20gXCIuL3NlbGVjdEFsbC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9zZWxlY3RDaGlsZCBmcm9tIFwiLi9zZWxlY3RDaGlsZC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9zZWxlY3RDaGlsZHJlbiBmcm9tIFwiLi9zZWxlY3RDaGlsZHJlbi5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9maWx0ZXIgZnJvbSBcIi4vZmlsdGVyLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2RhdGEgZnJvbSBcIi4vZGF0YS5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9lbnRlciBmcm9tIFwiLi9lbnRlci5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9leGl0IGZyb20gXCIuL2V4aXQuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fam9pbiBmcm9tIFwiLi9qb2luLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX21lcmdlIGZyb20gXCIuL21lcmdlLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX29yZGVyIGZyb20gXCIuL29yZGVyLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3NvcnQgZnJvbSBcIi4vc29ydC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9jYWxsIGZyb20gXCIuL2NhbGwuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fbm9kZXMgZnJvbSBcIi4vbm9kZXMuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fbm9kZSBmcm9tIFwiLi9ub2RlLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3NpemUgZnJvbSBcIi4vc2l6ZS5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9lbXB0eSBmcm9tIFwiLi9lbXB0eS5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9lYWNoIGZyb20gXCIuL2VhY2guanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fYXR0ciBmcm9tIFwiLi9hdHRyLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3N0eWxlIGZyb20gXCIuL3N0eWxlLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3Byb3BlcnR5IGZyb20gXCIuL3Byb3BlcnR5LmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2NsYXNzZWQgZnJvbSBcIi4vY2xhc3NlZC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl90ZXh0IGZyb20gXCIuL3RleHQuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25faHRtbCBmcm9tIFwiLi9odG1sLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3JhaXNlIGZyb20gXCIuL3JhaXNlLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2xvd2VyIGZyb20gXCIuL2xvd2VyLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2FwcGVuZCBmcm9tIFwiLi9hcHBlbmQuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25faW5zZXJ0IGZyb20gXCIuL2luc2VydC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9yZW1vdmUgZnJvbSBcIi4vcmVtb3ZlLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2Nsb25lIGZyb20gXCIuL2Nsb25lLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2RhdHVtIGZyb20gXCIuL2RhdHVtLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX29uIGZyb20gXCIuL29uLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2Rpc3BhdGNoIGZyb20gXCIuL2Rpc3BhdGNoLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2l0ZXJhdG9yIGZyb20gXCIuL2l0ZXJhdG9yLmpzXCI7XG5cbmV4cG9ydCB2YXIgcm9vdCA9IFtudWxsXTtcblxuZXhwb3J0IGZ1bmN0aW9uIFNlbGVjdGlvbihncm91cHMsIHBhcmVudHMpIHtcbiAgdGhpcy5fZ3JvdXBzID0gZ3JvdXBzO1xuICB0aGlzLl9wYXJlbnRzID0gcGFyZW50cztcbn1cblxuZnVuY3Rpb24gc2VsZWN0aW9uKCkge1xuICByZXR1cm4gbmV3IFNlbGVjdGlvbihbW2RvY3VtZW50LmRvY3VtZW50RWxlbWVudF1dLCByb290KTtcbn1cblxuZnVuY3Rpb24gc2VsZWN0aW9uX3NlbGVjdGlvbigpIHtcbiAgcmV0dXJuIHRoaXM7XG59XG5cblNlbGVjdGlvbi5wcm90b3R5cGUgPSBzZWxlY3Rpb24ucHJvdG90eXBlID0ge1xuICBjb25zdHJ1Y3RvcjogU2VsZWN0aW9uLFxuICBzZWxlY3Q6IHNlbGVjdGlvbl9zZWxlY3QsXG4gIHNlbGVjdEFsbDogc2VsZWN0aW9uX3NlbGVjdEFsbCxcbiAgc2VsZWN0Q2hpbGQ6IHNlbGVjdGlvbl9zZWxlY3RDaGlsZCxcbiAgc2VsZWN0Q2hpbGRyZW46IHNlbGVjdGlvbl9zZWxlY3RDaGlsZHJlbixcbiAgZmlsdGVyOiBzZWxlY3Rpb25fZmlsdGVyLFxuICBkYXRhOiBzZWxlY3Rpb25fZGF0YSxcbiAgZW50ZXI6IHNlbGVjdGlvbl9lbnRlcixcbiAgZXhpdDogc2VsZWN0aW9uX2V4aXQsXG4gIGpvaW46IHNlbGVjdGlvbl9qb2luLFxuICBtZXJnZTogc2VsZWN0aW9uX21lcmdlLFxuICBzZWxlY3Rpb246IHNlbGVjdGlvbl9zZWxlY3Rpb24sXG4gIG9yZGVyOiBzZWxlY3Rpb25fb3JkZXIsXG4gIHNvcnQ6IHNlbGVjdGlvbl9zb3J0LFxuICBjYWxsOiBzZWxlY3Rpb25fY2FsbCxcbiAgbm9kZXM6IHNlbGVjdGlvbl9ub2RlcyxcbiAgbm9kZTogc2VsZWN0aW9uX25vZGUsXG4gIHNpemU6IHNlbGVjdGlvbl9zaXplLFxuICBlbXB0eTogc2VsZWN0aW9uX2VtcHR5LFxuICBlYWNoOiBzZWxlY3Rpb25fZWFjaCxcbiAgYXR0cjogc2VsZWN0aW9uX2F0dHIsXG4gIHN0eWxlOiBzZWxlY3Rpb25fc3R5bGUsXG4gIHByb3BlcnR5OiBzZWxlY3Rpb25fcHJvcGVydHksXG4gIGNsYXNzZWQ6IHNlbGVjdGlvbl9jbGFzc2VkLFxuICB0ZXh0OiBzZWxlY3Rpb25fdGV4dCxcbiAgaHRtbDogc2VsZWN0aW9uX2h0bWwsXG4gIHJhaXNlOiBzZWxlY3Rpb25fcmFpc2UsXG4gIGxvd2VyOiBzZWxlY3Rpb25fbG93ZXIsXG4gIGFwcGVuZDogc2VsZWN0aW9uX2FwcGVuZCxcbiAgaW5zZXJ0OiBzZWxlY3Rpb25faW5zZXJ0LFxuICByZW1vdmU6IHNlbGVjdGlvbl9yZW1vdmUsXG4gIGNsb25lOiBzZWxlY3Rpb25fY2xvbmUsXG4gIGRhdHVtOiBzZWxlY3Rpb25fZGF0dW0sXG4gIG9uOiBzZWxlY3Rpb25fb24sXG4gIGRpc3BhdGNoOiBzZWxlY3Rpb25fZGlzcGF0Y2gsXG4gIFtTeW1ib2wuaXRlcmF0b3JdOiBzZWxlY3Rpb25faXRlcmF0b3Jcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHNlbGVjdGlvbjtcbiIsImltcG9ydCBjcmVhdG9yIGZyb20gXCIuLi9jcmVhdG9yLmpzXCI7XG5pbXBvcnQgc2VsZWN0b3IgZnJvbSBcIi4uL3NlbGVjdG9yLmpzXCI7XG5cbmZ1bmN0aW9uIGNvbnN0YW50TnVsbCgpIHtcbiAgcmV0dXJuIG51bGw7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIGJlZm9yZSkge1xuICB2YXIgY3JlYXRlID0gdHlwZW9mIG5hbWUgPT09IFwiZnVuY3Rpb25cIiA/IG5hbWUgOiBjcmVhdG9yKG5hbWUpLFxuICAgICAgc2VsZWN0ID0gYmVmb3JlID09IG51bGwgPyBjb25zdGFudE51bGwgOiB0eXBlb2YgYmVmb3JlID09PSBcImZ1bmN0aW9uXCIgPyBiZWZvcmUgOiBzZWxlY3RvcihiZWZvcmUpO1xuICByZXR1cm4gdGhpcy5zZWxlY3QoZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuaW5zZXJ0QmVmb3JlKGNyZWF0ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpLCBzZWxlY3QuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCBudWxsKTtcbiAgfSk7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiooKSB7XG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgaiA9IDAsIG0gPSBncm91cHMubGVuZ3RoOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIGkgPSAwLCBuID0gZ3JvdXAubGVuZ3RoLCBub2RlOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB5aWVsZCBub2RlO1xuICAgIH1cbiAgfVxufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24ob25lbnRlciwgb251cGRhdGUsIG9uZXhpdCkge1xuICB2YXIgZW50ZXIgPSB0aGlzLmVudGVyKCksIHVwZGF0ZSA9IHRoaXMsIGV4aXQgPSB0aGlzLmV4aXQoKTtcbiAgaWYgKHR5cGVvZiBvbmVudGVyID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBlbnRlciA9IG9uZW50ZXIoZW50ZXIpO1xuICAgIGlmIChlbnRlcikgZW50ZXIgPSBlbnRlci5zZWxlY3Rpb24oKTtcbiAgfSBlbHNlIHtcbiAgICBlbnRlciA9IGVudGVyLmFwcGVuZChvbmVudGVyICsgXCJcIik7XG4gIH1cbiAgaWYgKG9udXBkYXRlICE9IG51bGwpIHtcbiAgICB1cGRhdGUgPSBvbnVwZGF0ZSh1cGRhdGUpO1xuICAgIGlmICh1cGRhdGUpIHVwZGF0ZSA9IHVwZGF0ZS5zZWxlY3Rpb24oKTtcbiAgfVxuICBpZiAob25leGl0ID09IG51bGwpIGV4aXQucmVtb3ZlKCk7IGVsc2Ugb25leGl0KGV4aXQpO1xuICByZXR1cm4gZW50ZXIgJiYgdXBkYXRlID8gZW50ZXIubWVyZ2UodXBkYXRlKS5vcmRlcigpIDogdXBkYXRlO1xufVxuIiwiZnVuY3Rpb24gbG93ZXIoKSB7XG4gIGlmICh0aGlzLnByZXZpb3VzU2libGluZykgdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLCB0aGlzLnBhcmVudE5vZGUuZmlyc3RDaGlsZCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5lYWNoKGxvd2VyKTtcbn1cbiIsImltcG9ydCB7U2VsZWN0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihjb250ZXh0KSB7XG4gIHZhciBzZWxlY3Rpb24gPSBjb250ZXh0LnNlbGVjdGlvbiA/IGNvbnRleHQuc2VsZWN0aW9uKCkgOiBjb250ZXh0O1xuXG4gIGZvciAodmFyIGdyb3VwczAgPSB0aGlzLl9ncm91cHMsIGdyb3VwczEgPSBzZWxlY3Rpb24uX2dyb3VwcywgbTAgPSBncm91cHMwLmxlbmd0aCwgbTEgPSBncm91cHMxLmxlbmd0aCwgbSA9IE1hdGgubWluKG0wLCBtMSksIG1lcmdlcyA9IG5ldyBBcnJheShtMCksIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAwID0gZ3JvdXBzMFtqXSwgZ3JvdXAxID0gZ3JvdXBzMVtqXSwgbiA9IGdyb3VwMC5sZW5ndGgsIG1lcmdlID0gbWVyZ2VzW2pdID0gbmV3IEFycmF5KG4pLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKG5vZGUgPSBncm91cDBbaV0gfHwgZ3JvdXAxW2ldKSB7XG4gICAgICAgIG1lcmdlW2ldID0gbm9kZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmb3IgKDsgaiA8IG0wOyArK2opIHtcbiAgICBtZXJnZXNbal0gPSBncm91cHMwW2pdO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBTZWxlY3Rpb24obWVyZ2VzLCB0aGlzLl9wYXJlbnRzKTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgaiA9IDAsIG0gPSBncm91cHMubGVuZ3RoOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIGkgPSAwLCBuID0gZ3JvdXAubGVuZ3RoOyBpIDwgbjsgKytpKSB7XG4gICAgICB2YXIgbm9kZSA9IGdyb3VwW2ldO1xuICAgICAgaWYgKG5vZGUpIHJldHVybiBub2RlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiBBcnJheS5mcm9tKHRoaXMpO1xufVxuIiwiZnVuY3Rpb24gY29udGV4dExpc3RlbmVyKGxpc3RlbmVyKSB7XG4gIHJldHVybiBmdW5jdGlvbihldmVudCkge1xuICAgIGxpc3RlbmVyLmNhbGwodGhpcywgZXZlbnQsIHRoaXMuX19kYXRhX18pO1xuICB9O1xufVxuXG5mdW5jdGlvbiBwYXJzZVR5cGVuYW1lcyh0eXBlbmFtZXMpIHtcbiAgcmV0dXJuIHR5cGVuYW1lcy50cmltKCkuc3BsaXQoL158XFxzKy8pLm1hcChmdW5jdGlvbih0KSB7XG4gICAgdmFyIG5hbWUgPSBcIlwiLCBpID0gdC5pbmRleE9mKFwiLlwiKTtcbiAgICBpZiAoaSA+PSAwKSBuYW1lID0gdC5zbGljZShpICsgMSksIHQgPSB0LnNsaWNlKDAsIGkpO1xuICAgIHJldHVybiB7dHlwZTogdCwgbmFtZTogbmFtZX07XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBvblJlbW92ZSh0eXBlbmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIG9uID0gdGhpcy5fX29uO1xuICAgIGlmICghb24pIHJldHVybjtcbiAgICBmb3IgKHZhciBqID0gMCwgaSA9IC0xLCBtID0gb24ubGVuZ3RoLCBvOyBqIDwgbTsgKytqKSB7XG4gICAgICBpZiAobyA9IG9uW2pdLCAoIXR5cGVuYW1lLnR5cGUgfHwgby50eXBlID09PSB0eXBlbmFtZS50eXBlKSAmJiBvLm5hbWUgPT09IHR5cGVuYW1lLm5hbWUpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKG8udHlwZSwgby5saXN0ZW5lciwgby5vcHRpb25zKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9uWysraV0gPSBvO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoKytpKSBvbi5sZW5ndGggPSBpO1xuICAgIGVsc2UgZGVsZXRlIHRoaXMuX19vbjtcbiAgfTtcbn1cblxuZnVuY3Rpb24gb25BZGQodHlwZW5hbWUsIHZhbHVlLCBvcHRpb25zKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgb24gPSB0aGlzLl9fb24sIG8sIGxpc3RlbmVyID0gY29udGV4dExpc3RlbmVyKHZhbHVlKTtcbiAgICBpZiAob24pIGZvciAodmFyIGogPSAwLCBtID0gb24ubGVuZ3RoOyBqIDwgbTsgKytqKSB7XG4gICAgICBpZiAoKG8gPSBvbltqXSkudHlwZSA9PT0gdHlwZW5hbWUudHlwZSAmJiBvLm5hbWUgPT09IHR5cGVuYW1lLm5hbWUpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKG8udHlwZSwgby5saXN0ZW5lciwgby5vcHRpb25zKTtcbiAgICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKG8udHlwZSwgby5saXN0ZW5lciA9IGxpc3RlbmVyLCBvLm9wdGlvbnMgPSBvcHRpb25zKTtcbiAgICAgICAgby52YWx1ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcih0eXBlbmFtZS50eXBlLCBsaXN0ZW5lciwgb3B0aW9ucyk7XG4gICAgbyA9IHt0eXBlOiB0eXBlbmFtZS50eXBlLCBuYW1lOiB0eXBlbmFtZS5uYW1lLCB2YWx1ZTogdmFsdWUsIGxpc3RlbmVyOiBsaXN0ZW5lciwgb3B0aW9uczogb3B0aW9uc307XG4gICAgaWYgKCFvbikgdGhpcy5fX29uID0gW29dO1xuICAgIGVsc2Ugb24ucHVzaChvKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odHlwZW5hbWUsIHZhbHVlLCBvcHRpb25zKSB7XG4gIHZhciB0eXBlbmFtZXMgPSBwYXJzZVR5cGVuYW1lcyh0eXBlbmFtZSArIFwiXCIpLCBpLCBuID0gdHlwZW5hbWVzLmxlbmd0aCwgdDtcblxuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHtcbiAgICB2YXIgb24gPSB0aGlzLm5vZGUoKS5fX29uO1xuICAgIGlmIChvbikgZm9yICh2YXIgaiA9IDAsIG0gPSBvbi5sZW5ndGgsIG87IGogPCBtOyArK2opIHtcbiAgICAgIGZvciAoaSA9IDAsIG8gPSBvbltqXTsgaSA8IG47ICsraSkge1xuICAgICAgICBpZiAoKHQgPSB0eXBlbmFtZXNbaV0pLnR5cGUgPT09IG8udHlwZSAmJiB0Lm5hbWUgPT09IG8ubmFtZSkge1xuICAgICAgICAgIHJldHVybiBvLnZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIG9uID0gdmFsdWUgPyBvbkFkZCA6IG9uUmVtb3ZlO1xuICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB0aGlzLmVhY2gob24odHlwZW5hbWVzW2ldLCB2YWx1ZSwgb3B0aW9ucykpO1xuICByZXR1cm4gdGhpcztcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgaiA9IC0xLCBtID0gZ3JvdXBzLmxlbmd0aDsgKytqIDwgbTspIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgaSA9IGdyb3VwLmxlbmd0aCAtIDEsIG5leHQgPSBncm91cFtpXSwgbm9kZTsgLS1pID49IDA7KSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XG4gICAgICAgIGlmIChuZXh0ICYmIG5vZGUuY29tcGFyZURvY3VtZW50UG9zaXRpb24obmV4dCkgXiA0KSBuZXh0LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG5vZGUsIG5leHQpO1xuICAgICAgICBuZXh0ID0gbm9kZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn1cbiIsImZ1bmN0aW9uIHByb3BlcnR5UmVtb3ZlKG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIGRlbGV0ZSB0aGlzW25hbWVdO1xuICB9O1xufVxuXG5mdW5jdGlvbiBwcm9wZXJ0eUNvbnN0YW50KG5hbWUsIHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzW25hbWVdID0gdmFsdWU7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHByb3BlcnR5RnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciB2ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBpZiAodiA9PSBudWxsKSBkZWxldGUgdGhpc1tuYW1lXTtcbiAgICBlbHNlIHRoaXNbbmFtZV0gPSB2O1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA+IDFcbiAgICAgID8gdGhpcy5lYWNoKCh2YWx1ZSA9PSBudWxsXG4gICAgICAgICAgPyBwcm9wZXJ0eVJlbW92ZSA6IHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgPyBwcm9wZXJ0eUZ1bmN0aW9uXG4gICAgICAgICAgOiBwcm9wZXJ0eUNvbnN0YW50KShuYW1lLCB2YWx1ZSkpXG4gICAgICA6IHRoaXMubm9kZSgpW25hbWVdO1xufVxuIiwiZnVuY3Rpb24gcmFpc2UoKSB7XG4gIGlmICh0aGlzLm5leHRTaWJsaW5nKSB0aGlzLnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQodGhpcyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5lYWNoKHJhaXNlKTtcbn1cbiIsImZ1bmN0aW9uIHJlbW92ZSgpIHtcbiAgdmFyIHBhcmVudCA9IHRoaXMucGFyZW50Tm9kZTtcbiAgaWYgKHBhcmVudCkgcGFyZW50LnJlbW92ZUNoaWxkKHRoaXMpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuZWFjaChyZW1vdmUpO1xufVxuIiwiaW1wb3J0IHtTZWxlY3Rpb259IGZyb20gXCIuL2luZGV4LmpzXCI7XG5pbXBvcnQgc2VsZWN0b3IgZnJvbSBcIi4uL3NlbGVjdG9yLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHNlbGVjdCkge1xuICBpZiAodHlwZW9mIHNlbGVjdCAhPT0gXCJmdW5jdGlvblwiKSBzZWxlY3QgPSBzZWxlY3RvcihzZWxlY3QpO1xuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHN1Ymdyb3VwcyA9IG5ldyBBcnJheShtKSwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgc3ViZ3JvdXAgPSBzdWJncm91cHNbal0gPSBuZXcgQXJyYXkobiksIG5vZGUsIHN1Ym5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAoKG5vZGUgPSBncm91cFtpXSkgJiYgKHN1Ym5vZGUgPSBzZWxlY3QuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCkpKSB7XG4gICAgICAgIGlmIChcIl9fZGF0YV9fXCIgaW4gbm9kZSkgc3Vibm9kZS5fX2RhdGFfXyA9IG5vZGUuX19kYXRhX187XG4gICAgICAgIHN1Ymdyb3VwW2ldID0gc3Vibm9kZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IFNlbGVjdGlvbihzdWJncm91cHMsIHRoaXMuX3BhcmVudHMpO1xufVxuIiwiaW1wb3J0IHtTZWxlY3Rpb259IGZyb20gXCIuL2luZGV4LmpzXCI7XG5pbXBvcnQgYXJyYXkgZnJvbSBcIi4uL2FycmF5LmpzXCI7XG5pbXBvcnQgc2VsZWN0b3JBbGwgZnJvbSBcIi4uL3NlbGVjdG9yQWxsLmpzXCI7XG5cbmZ1bmN0aW9uIGFycmF5QWxsKHNlbGVjdCkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGFycmF5KHNlbGVjdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc2VsZWN0KSB7XG4gIGlmICh0eXBlb2Ygc2VsZWN0ID09PSBcImZ1bmN0aW9uXCIpIHNlbGVjdCA9IGFycmF5QWxsKHNlbGVjdCk7XG4gIGVsc2Ugc2VsZWN0ID0gc2VsZWN0b3JBbGwoc2VsZWN0KTtcblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBzdWJncm91cHMgPSBbXSwgcGFyZW50cyA9IFtdLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkge1xuICAgICAgICBzdWJncm91cHMucHVzaChzZWxlY3QuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCkpO1xuICAgICAgICBwYXJlbnRzLnB1c2gobm9kZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBTZWxlY3Rpb24oc3ViZ3JvdXBzLCBwYXJlbnRzKTtcbn1cbiIsImltcG9ydCB7Y2hpbGRNYXRjaGVyfSBmcm9tIFwiLi4vbWF0Y2hlci5qc1wiO1xuXG52YXIgZmluZCA9IEFycmF5LnByb3RvdHlwZS5maW5kO1xuXG5mdW5jdGlvbiBjaGlsZEZpbmQobWF0Y2gpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBmaW5kLmNhbGwodGhpcy5jaGlsZHJlbiwgbWF0Y2gpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBjaGlsZEZpcnN0KCkge1xuICByZXR1cm4gdGhpcy5maXJzdEVsZW1lbnRDaGlsZDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obWF0Y2gpIHtcbiAgcmV0dXJuIHRoaXMuc2VsZWN0KG1hdGNoID09IG51bGwgPyBjaGlsZEZpcnN0XG4gICAgICA6IGNoaWxkRmluZCh0eXBlb2YgbWF0Y2ggPT09IFwiZnVuY3Rpb25cIiA/IG1hdGNoIDogY2hpbGRNYXRjaGVyKG1hdGNoKSkpO1xufVxuIiwiaW1wb3J0IHtjaGlsZE1hdGNoZXJ9IGZyb20gXCIuLi9tYXRjaGVyLmpzXCI7XG5cbnZhciBmaWx0ZXIgPSBBcnJheS5wcm90b3R5cGUuZmlsdGVyO1xuXG5mdW5jdGlvbiBjaGlsZHJlbigpIHtcbiAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5jaGlsZHJlbik7XG59XG5cbmZ1bmN0aW9uIGNoaWxkcmVuRmlsdGVyKG1hdGNoKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZmlsdGVyLmNhbGwodGhpcy5jaGlsZHJlbiwgbWF0Y2gpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihtYXRjaCkge1xuICByZXR1cm4gdGhpcy5zZWxlY3RBbGwobWF0Y2ggPT0gbnVsbCA/IGNoaWxkcmVuXG4gICAgICA6IGNoaWxkcmVuRmlsdGVyKHR5cGVvZiBtYXRjaCA9PT0gXCJmdW5jdGlvblwiID8gbWF0Y2ggOiBjaGlsZE1hdGNoZXIobWF0Y2gpKSk7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgbGV0IHNpemUgPSAwO1xuICBmb3IgKGNvbnN0IG5vZGUgb2YgdGhpcykgKytzaXplOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gIHJldHVybiBzaXplO1xufVxuIiwiaW1wb3J0IHtTZWxlY3Rpb259IGZyb20gXCIuL2luZGV4LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGNvbXBhcmUpIHtcbiAgaWYgKCFjb21wYXJlKSBjb21wYXJlID0gYXNjZW5kaW5nO1xuXG4gIGZ1bmN0aW9uIGNvbXBhcmVOb2RlKGEsIGIpIHtcbiAgICByZXR1cm4gYSAmJiBiID8gY29tcGFyZShhLl9fZGF0YV9fLCBiLl9fZGF0YV9fKSA6ICFhIC0gIWI7XG4gIH1cblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBzb3J0Z3JvdXBzID0gbmV3IEFycmF5KG0pLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBzb3J0Z3JvdXAgPSBzb3J0Z3JvdXBzW2pdID0gbmV3IEFycmF5KG4pLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkge1xuICAgICAgICBzb3J0Z3JvdXBbaV0gPSBub2RlO1xuICAgICAgfVxuICAgIH1cbiAgICBzb3J0Z3JvdXAuc29ydChjb21wYXJlTm9kZSk7XG4gIH1cblxuICByZXR1cm4gbmV3IFNlbGVjdGlvbihzb3J0Z3JvdXBzLCB0aGlzLl9wYXJlbnRzKS5vcmRlcigpO1xufVxuXG5mdW5jdGlvbiBhc2NlbmRpbmcoYSwgYikge1xuICByZXR1cm4gYSA8IGIgPyAtMSA6IGEgPiBiID8gMSA6IGEgPj0gYiA/IDAgOiBOYU47XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbih1cGRhdGUpIHtcbiAgcmV0dXJuIG5ldyBBcnJheSh1cGRhdGUubGVuZ3RoKTtcbn1cbiIsImltcG9ydCBkZWZhdWx0VmlldyBmcm9tIFwiLi4vd2luZG93LmpzXCI7XG5cbmZ1bmN0aW9uIHN0eWxlUmVtb3ZlKG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobmFtZSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHN0eWxlQ29uc3RhbnQobmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnN0eWxlLnNldFByb3BlcnR5KG5hbWUsIHZhbHVlLCBwcmlvcml0eSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHN0eWxlRnVuY3Rpb24obmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKHYgPT0gbnVsbCkgdGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKTtcbiAgICBlbHNlIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkobmFtZSwgdiwgcHJpb3JpdHkpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPiAxXG4gICAgICA/IHRoaXMuZWFjaCgodmFsdWUgPT0gbnVsbFxuICAgICAgICAgICAgPyBzdHlsZVJlbW92ZSA6IHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgICA/IHN0eWxlRnVuY3Rpb25cbiAgICAgICAgICAgIDogc3R5bGVDb25zdGFudCkobmFtZSwgdmFsdWUsIHByaW9yaXR5ID09IG51bGwgPyBcIlwiIDogcHJpb3JpdHkpKVxuICAgICAgOiBzdHlsZVZhbHVlKHRoaXMubm9kZSgpLCBuYW1lKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN0eWxlVmFsdWUobm9kZSwgbmFtZSkge1xuICByZXR1cm4gbm9kZS5zdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKG5hbWUpXG4gICAgICB8fCBkZWZhdWx0Vmlldyhub2RlKS5nZXRDb21wdXRlZFN0eWxlKG5vZGUsIG51bGwpLmdldFByb3BlcnR5VmFsdWUobmFtZSk7XG59XG4iLCJmdW5jdGlvbiB0ZXh0UmVtb3ZlKCkge1xuICB0aGlzLnRleHRDb250ZW50ID0gXCJcIjtcbn1cblxuZnVuY3Rpb24gdGV4dENvbnN0YW50KHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnRleHRDb250ZW50ID0gdmFsdWU7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHRleHRGdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIHRoaXMudGV4dENvbnRlbnQgPSB2ID09IG51bGwgPyBcIlwiIDogdjtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGhcbiAgICAgID8gdGhpcy5lYWNoKHZhbHVlID09IG51bGxcbiAgICAgICAgICA/IHRleHRSZW1vdmUgOiAodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICA/IHRleHRGdW5jdGlvblxuICAgICAgICAgIDogdGV4dENvbnN0YW50KSh2YWx1ZSkpXG4gICAgICA6IHRoaXMubm9kZSgpLnRleHRDb250ZW50O1xufVxuIiwiZnVuY3Rpb24gbm9uZSgpIHt9XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHNlbGVjdG9yKSB7XG4gIHJldHVybiBzZWxlY3RvciA9PSBudWxsID8gbm9uZSA6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpO1xuICB9O1xufVxuIiwiZnVuY3Rpb24gZW1wdHkoKSB7XG4gIHJldHVybiBbXTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc2VsZWN0b3IpIHtcbiAgcmV0dXJuIHNlbGVjdG9yID09IG51bGwgPyBlbXB0eSA6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpO1xuICB9O1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZXZlbnQpIHtcbiAgbGV0IHNvdXJjZUV2ZW50O1xuICB3aGlsZSAoc291cmNlRXZlbnQgPSBldmVudC5zb3VyY2VFdmVudCkgZXZlbnQgPSBzb3VyY2VFdmVudDtcbiAgcmV0dXJuIGV2ZW50O1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obm9kZSkge1xuICByZXR1cm4gKG5vZGUub3duZXJEb2N1bWVudCAmJiBub2RlLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcpIC8vIG5vZGUgaXMgYSBOb2RlXG4gICAgICB8fCAobm9kZS5kb2N1bWVudCAmJiBub2RlKSAvLyBub2RlIGlzIGEgV2luZG93XG4gICAgICB8fCBub2RlLmRlZmF1bHRWaWV3OyAvLyBub2RlIGlzIGEgRG9jdW1lbnRcbn1cbiIsImltcG9ydCB7VGltZXJ9IGZyb20gXCIuL3RpbWVyLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGNhbGxiYWNrLCBkZWxheSwgdGltZSkge1xuICB2YXIgdCA9IG5ldyBUaW1lcjtcbiAgZGVsYXkgPSBkZWxheSA9PSBudWxsID8gMCA6ICtkZWxheTtcbiAgdC5yZXN0YXJ0KGVsYXBzZWQgPT4ge1xuICAgIHQuc3RvcCgpO1xuICAgIGNhbGxiYWNrKGVsYXBzZWQgKyBkZWxheSk7XG4gIH0sIGRlbGF5LCB0aW1lKTtcbiAgcmV0dXJuIHQ7XG59XG4iLCJ2YXIgZnJhbWUgPSAwLCAvLyBpcyBhbiBhbmltYXRpb24gZnJhbWUgcGVuZGluZz9cbiAgICB0aW1lb3V0ID0gMCwgLy8gaXMgYSB0aW1lb3V0IHBlbmRpbmc/XG4gICAgaW50ZXJ2YWwgPSAwLCAvLyBhcmUgYW55IHRpbWVycyBhY3RpdmU/XG4gICAgcG9rZURlbGF5ID0gMTAwMCwgLy8gaG93IGZyZXF1ZW50bHkgd2UgY2hlY2sgZm9yIGNsb2NrIHNrZXdcbiAgICB0YXNrSGVhZCxcbiAgICB0YXNrVGFpbCxcbiAgICBjbG9ja0xhc3QgPSAwLFxuICAgIGNsb2NrTm93ID0gMCxcbiAgICBjbG9ja1NrZXcgPSAwLFxuICAgIGNsb2NrID0gdHlwZW9mIHBlcmZvcm1hbmNlID09PSBcIm9iamVjdFwiICYmIHBlcmZvcm1hbmNlLm5vdyA/IHBlcmZvcm1hbmNlIDogRGF0ZSxcbiAgICBzZXRGcmFtZSA9IHR5cGVvZiB3aW5kb3cgPT09IFwib2JqZWN0XCIgJiYgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSA/IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUuYmluZCh3aW5kb3cpIDogZnVuY3Rpb24oZikgeyBzZXRUaW1lb3V0KGYsIDE3KTsgfTtcblxuZXhwb3J0IGZ1bmN0aW9uIG5vdygpIHtcbiAgcmV0dXJuIGNsb2NrTm93IHx8IChzZXRGcmFtZShjbGVhck5vdyksIGNsb2NrTm93ID0gY2xvY2subm93KCkgKyBjbG9ja1NrZXcpO1xufVxuXG5mdW5jdGlvbiBjbGVhck5vdygpIHtcbiAgY2xvY2tOb3cgPSAwO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gVGltZXIoKSB7XG4gIHRoaXMuX2NhbGwgPVxuICB0aGlzLl90aW1lID1cbiAgdGhpcy5fbmV4dCA9IG51bGw7XG59XG5cblRpbWVyLnByb3RvdHlwZSA9IHRpbWVyLnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IFRpbWVyLFxuICByZXN0YXJ0OiBmdW5jdGlvbihjYWxsYmFjaywgZGVsYXksIHRpbWUpIHtcbiAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJjYWxsYmFjayBpcyBub3QgYSBmdW5jdGlvblwiKTtcbiAgICB0aW1lID0gKHRpbWUgPT0gbnVsbCA/IG5vdygpIDogK3RpbWUpICsgKGRlbGF5ID09IG51bGwgPyAwIDogK2RlbGF5KTtcbiAgICBpZiAoIXRoaXMuX25leHQgJiYgdGFza1RhaWwgIT09IHRoaXMpIHtcbiAgICAgIGlmICh0YXNrVGFpbCkgdGFza1RhaWwuX25leHQgPSB0aGlzO1xuICAgICAgZWxzZSB0YXNrSGVhZCA9IHRoaXM7XG4gICAgICB0YXNrVGFpbCA9IHRoaXM7XG4gICAgfVxuICAgIHRoaXMuX2NhbGwgPSBjYWxsYmFjaztcbiAgICB0aGlzLl90aW1lID0gdGltZTtcbiAgICBzbGVlcCgpO1xuICB9LFxuICBzdG9wOiBmdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5fY2FsbCkge1xuICAgICAgdGhpcy5fY2FsbCA9IG51bGw7XG4gICAgICB0aGlzLl90aW1lID0gSW5maW5pdHk7XG4gICAgICBzbGVlcCgpO1xuICAgIH1cbiAgfVxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHRpbWVyKGNhbGxiYWNrLCBkZWxheSwgdGltZSkge1xuICB2YXIgdCA9IG5ldyBUaW1lcjtcbiAgdC5yZXN0YXJ0KGNhbGxiYWNrLCBkZWxheSwgdGltZSk7XG4gIHJldHVybiB0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdGltZXJGbHVzaCgpIHtcbiAgbm93KCk7IC8vIEdldCB0aGUgY3VycmVudCB0aW1lLCBpZiBub3QgYWxyZWFkeSBzZXQuXG4gICsrZnJhbWU7IC8vIFByZXRlbmQgd2XigJl2ZSBzZXQgYW4gYWxhcm0sIGlmIHdlIGhhdmVu4oCZdCBhbHJlYWR5LlxuICB2YXIgdCA9IHRhc2tIZWFkLCBlO1xuICB3aGlsZSAodCkge1xuICAgIGlmICgoZSA9IGNsb2NrTm93IC0gdC5fdGltZSkgPj0gMCkgdC5fY2FsbC5jYWxsKHVuZGVmaW5lZCwgZSk7XG4gICAgdCA9IHQuX25leHQ7XG4gIH1cbiAgLS1mcmFtZTtcbn1cblxuZnVuY3Rpb24gd2FrZSgpIHtcbiAgY2xvY2tOb3cgPSAoY2xvY2tMYXN0ID0gY2xvY2subm93KCkpICsgY2xvY2tTa2V3O1xuICBmcmFtZSA9IHRpbWVvdXQgPSAwO1xuICB0cnkge1xuICAgIHRpbWVyRmx1c2goKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBmcmFtZSA9IDA7XG4gICAgbmFwKCk7XG4gICAgY2xvY2tOb3cgPSAwO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBva2UoKSB7XG4gIHZhciBub3cgPSBjbG9jay5ub3coKSwgZGVsYXkgPSBub3cgLSBjbG9ja0xhc3Q7XG4gIGlmIChkZWxheSA+IHBva2VEZWxheSkgY2xvY2tTa2V3IC09IGRlbGF5LCBjbG9ja0xhc3QgPSBub3c7XG59XG5cbmZ1bmN0aW9uIG5hcCgpIHtcbiAgdmFyIHQwLCB0MSA9IHRhc2tIZWFkLCB0MiwgdGltZSA9IEluZmluaXR5O1xuICB3aGlsZSAodDEpIHtcbiAgICBpZiAodDEuX2NhbGwpIHtcbiAgICAgIGlmICh0aW1lID4gdDEuX3RpbWUpIHRpbWUgPSB0MS5fdGltZTtcbiAgICAgIHQwID0gdDEsIHQxID0gdDEuX25leHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHQyID0gdDEuX25leHQsIHQxLl9uZXh0ID0gbnVsbDtcbiAgICAgIHQxID0gdDAgPyB0MC5fbmV4dCA9IHQyIDogdGFza0hlYWQgPSB0MjtcbiAgICB9XG4gIH1cbiAgdGFza1RhaWwgPSB0MDtcbiAgc2xlZXAodGltZSk7XG59XG5cbmZ1bmN0aW9uIHNsZWVwKHRpbWUpIHtcbiAgaWYgKGZyYW1lKSByZXR1cm47IC8vIFNvb25lc3QgYWxhcm0gYWxyZWFkeSBzZXQsIG9yIHdpbGwgYmUuXG4gIGlmICh0aW1lb3V0KSB0aW1lb3V0ID0gY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICB2YXIgZGVsYXkgPSB0aW1lIC0gY2xvY2tOb3c7IC8vIFN0cmljdGx5IGxlc3MgdGhhbiBpZiB3ZSByZWNvbXB1dGVkIGNsb2NrTm93LlxuICBpZiAoZGVsYXkgPiAyNCkge1xuICAgIGlmICh0aW1lIDwgSW5maW5pdHkpIHRpbWVvdXQgPSBzZXRUaW1lb3V0KHdha2UsIHRpbWUgLSBjbG9jay5ub3coKSAtIGNsb2NrU2tldyk7XG4gICAgaWYgKGludGVydmFsKSBpbnRlcnZhbCA9IGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICB9IGVsc2Uge1xuICAgIGlmICghaW50ZXJ2YWwpIGNsb2NrTGFzdCA9IGNsb2NrLm5vdygpLCBpbnRlcnZhbCA9IHNldEludGVydmFsKHBva2UsIHBva2VEZWxheSk7XG4gICAgZnJhbWUgPSAxLCBzZXRGcmFtZSh3YWtlKTtcbiAgfVxufVxuIiwiaW1wb3J0IHtUcmFuc2l0aW9ufSBmcm9tIFwiLi90cmFuc2l0aW9uL2luZGV4LmpzXCI7XG5pbXBvcnQge1NDSEVEVUxFRH0gZnJvbSBcIi4vdHJhbnNpdGlvbi9zY2hlZHVsZS5qc1wiO1xuXG52YXIgcm9vdCA9IFtudWxsXTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obm9kZSwgbmFtZSkge1xuICB2YXIgc2NoZWR1bGVzID0gbm9kZS5fX3RyYW5zaXRpb24sXG4gICAgICBzY2hlZHVsZSxcbiAgICAgIGk7XG5cbiAgaWYgKHNjaGVkdWxlcykge1xuICAgIG5hbWUgPSBuYW1lID09IG51bGwgPyBudWxsIDogbmFtZSArIFwiXCI7XG4gICAgZm9yIChpIGluIHNjaGVkdWxlcykge1xuICAgICAgaWYgKChzY2hlZHVsZSA9IHNjaGVkdWxlc1tpXSkuc3RhdGUgPiBTQ0hFRFVMRUQgJiYgc2NoZWR1bGUubmFtZSA9PT0gbmFtZSkge1xuICAgICAgICByZXR1cm4gbmV3IFRyYW5zaXRpb24oW1tub2RlXV0sIHJvb3QsIG5hbWUsICtpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbiIsImltcG9ydCBcIi4vc2VsZWN0aW9uL2luZGV4LmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgdHJhbnNpdGlvbn0gZnJvbSBcIi4vdHJhbnNpdGlvbi9pbmRleC5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGFjdGl2ZX0gZnJvbSBcIi4vYWN0aXZlLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgaW50ZXJydXB0fSBmcm9tIFwiLi9pbnRlcnJ1cHQuanNcIjtcbiIsImltcG9ydCB7U1RBUlRJTkcsIEVORElORywgRU5ERUR9IGZyb20gXCIuL3RyYW5zaXRpb24vc2NoZWR1bGUuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obm9kZSwgbmFtZSkge1xuICB2YXIgc2NoZWR1bGVzID0gbm9kZS5fX3RyYW5zaXRpb24sXG4gICAgICBzY2hlZHVsZSxcbiAgICAgIGFjdGl2ZSxcbiAgICAgIGVtcHR5ID0gdHJ1ZSxcbiAgICAgIGk7XG5cbiAgaWYgKCFzY2hlZHVsZXMpIHJldHVybjtcblxuICBuYW1lID0gbmFtZSA9PSBudWxsID8gbnVsbCA6IG5hbWUgKyBcIlwiO1xuXG4gIGZvciAoaSBpbiBzY2hlZHVsZXMpIHtcbiAgICBpZiAoKHNjaGVkdWxlID0gc2NoZWR1bGVzW2ldKS5uYW1lICE9PSBuYW1lKSB7IGVtcHR5ID0gZmFsc2U7IGNvbnRpbnVlOyB9XG4gICAgYWN0aXZlID0gc2NoZWR1bGUuc3RhdGUgPiBTVEFSVElORyAmJiBzY2hlZHVsZS5zdGF0ZSA8IEVORElORztcbiAgICBzY2hlZHVsZS5zdGF0ZSA9IEVOREVEO1xuICAgIHNjaGVkdWxlLnRpbWVyLnN0b3AoKTtcbiAgICBzY2hlZHVsZS5vbi5jYWxsKGFjdGl2ZSA/IFwiaW50ZXJydXB0XCIgOiBcImNhbmNlbFwiLCBub2RlLCBub2RlLl9fZGF0YV9fLCBzY2hlZHVsZS5pbmRleCwgc2NoZWR1bGUuZ3JvdXApO1xuICAgIGRlbGV0ZSBzY2hlZHVsZXNbaV07XG4gIH1cblxuICBpZiAoZW1wdHkpIGRlbGV0ZSBub2RlLl9fdHJhbnNpdGlvbjtcbn1cbiIsImltcG9ydCB7c2VsZWN0aW9ufSBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2ludGVycnVwdCBmcm9tIFwiLi9pbnRlcnJ1cHQuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fdHJhbnNpdGlvbiBmcm9tIFwiLi90cmFuc2l0aW9uLmpzXCI7XG5cbnNlbGVjdGlvbi5wcm90b3R5cGUuaW50ZXJydXB0ID0gc2VsZWN0aW9uX2ludGVycnVwdDtcbnNlbGVjdGlvbi5wcm90b3R5cGUudHJhbnNpdGlvbiA9IHNlbGVjdGlvbl90cmFuc2l0aW9uO1xuIiwiaW1wb3J0IGludGVycnVwdCBmcm9tIFwiLi4vaW50ZXJydXB0LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUpIHtcbiAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHtcbiAgICBpbnRlcnJ1cHQodGhpcywgbmFtZSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IHtUcmFuc2l0aW9uLCBuZXdJZH0gZnJvbSBcIi4uL3RyYW5zaXRpb24vaW5kZXguanNcIjtcbmltcG9ydCBzY2hlZHVsZSBmcm9tIFwiLi4vdHJhbnNpdGlvbi9zY2hlZHVsZS5qc1wiO1xuaW1wb3J0IHtlYXNlQ3ViaWNJbk91dH0gZnJvbSBcImQzLWVhc2VcIjtcbmltcG9ydCB7bm93fSBmcm9tIFwiZDMtdGltZXJcIjtcblxudmFyIGRlZmF1bHRUaW1pbmcgPSB7XG4gIHRpbWU6IG51bGwsIC8vIFNldCBvbiB1c2UuXG4gIGRlbGF5OiAwLFxuICBkdXJhdGlvbjogMjUwLFxuICBlYXNlOiBlYXNlQ3ViaWNJbk91dFxufTtcblxuZnVuY3Rpb24gaW5oZXJpdChub2RlLCBpZCkge1xuICB2YXIgdGltaW5nO1xuICB3aGlsZSAoISh0aW1pbmcgPSBub2RlLl9fdHJhbnNpdGlvbikgfHwgISh0aW1pbmcgPSB0aW1pbmdbaWRdKSkge1xuICAgIGlmICghKG5vZGUgPSBub2RlLnBhcmVudE5vZGUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHRyYW5zaXRpb24gJHtpZH0gbm90IGZvdW5kYCk7XG4gICAgfVxuICB9XG4gIHJldHVybiB0aW1pbmc7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUpIHtcbiAgdmFyIGlkLFxuICAgICAgdGltaW5nO1xuXG4gIGlmIChuYW1lIGluc3RhbmNlb2YgVHJhbnNpdGlvbikge1xuICAgIGlkID0gbmFtZS5faWQsIG5hbWUgPSBuYW1lLl9uYW1lO1xuICB9IGVsc2Uge1xuICAgIGlkID0gbmV3SWQoKSwgKHRpbWluZyA9IGRlZmF1bHRUaW1pbmcpLnRpbWUgPSBub3coKSwgbmFtZSA9IG5hbWUgPT0gbnVsbCA/IG51bGwgOiBuYW1lICsgXCJcIjtcbiAgfVxuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XG4gICAgICAgIHNjaGVkdWxlKG5vZGUsIG5hbWUsIGlkLCBpLCBncm91cCwgdGltaW5nIHx8IGluaGVyaXQobm9kZSwgaWQpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IFRyYW5zaXRpb24oZ3JvdXBzLCB0aGlzLl9wYXJlbnRzLCBuYW1lLCBpZCk7XG59XG4iLCJpbXBvcnQge2ludGVycG9sYXRlVHJhbnNmb3JtU3ZnIGFzIGludGVycG9sYXRlVHJhbnNmb3JtfSBmcm9tIFwiZDMtaW50ZXJwb2xhdGVcIjtcbmltcG9ydCB7bmFtZXNwYWNlfSBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5pbXBvcnQge3R3ZWVuVmFsdWV9IGZyb20gXCIuL3R3ZWVuLmpzXCI7XG5pbXBvcnQgaW50ZXJwb2xhdGUgZnJvbSBcIi4vaW50ZXJwb2xhdGUuanNcIjtcblxuZnVuY3Rpb24gYXR0clJlbW92ZShuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0clJlbW92ZU5TKGZ1bGxuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJDb25zdGFudChuYW1lLCBpbnRlcnBvbGF0ZSwgdmFsdWUxKSB7XG4gIHZhciBzdHJpbmcwMCxcbiAgICAgIHN0cmluZzEgPSB2YWx1ZTEgKyBcIlwiLFxuICAgICAgaW50ZXJwb2xhdGUwO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHN0cmluZzAgPSB0aGlzLmdldEF0dHJpYnV0ZShuYW1lKTtcbiAgICByZXR1cm4gc3RyaW5nMCA9PT0gc3RyaW5nMSA/IG51bGxcbiAgICAgICAgOiBzdHJpbmcwID09PSBzdHJpbmcwMCA/IGludGVycG9sYXRlMFxuICAgICAgICA6IGludGVycG9sYXRlMCA9IGludGVycG9sYXRlKHN0cmluZzAwID0gc3RyaW5nMCwgdmFsdWUxKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0ckNvbnN0YW50TlMoZnVsbG5hbWUsIGludGVycG9sYXRlLCB2YWx1ZTEpIHtcbiAgdmFyIHN0cmluZzAwLFxuICAgICAgc3RyaW5nMSA9IHZhbHVlMSArIFwiXCIsXG4gICAgICBpbnRlcnBvbGF0ZTA7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc3RyaW5nMCA9IHRoaXMuZ2V0QXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTtcbiAgICByZXR1cm4gc3RyaW5nMCA9PT0gc3RyaW5nMSA/IG51bGxcbiAgICAgICAgOiBzdHJpbmcwID09PSBzdHJpbmcwMCA/IGludGVycG9sYXRlMFxuICAgICAgICA6IGludGVycG9sYXRlMCA9IGludGVycG9sYXRlKHN0cmluZzAwID0gc3RyaW5nMCwgdmFsdWUxKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0ckZ1bmN0aW9uKG5hbWUsIGludGVycG9sYXRlLCB2YWx1ZSkge1xuICB2YXIgc3RyaW5nMDAsXG4gICAgICBzdHJpbmcxMCxcbiAgICAgIGludGVycG9sYXRlMDtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzdHJpbmcwLCB2YWx1ZTEgPSB2YWx1ZSh0aGlzKSwgc3RyaW5nMTtcbiAgICBpZiAodmFsdWUxID09IG51bGwpIHJldHVybiB2b2lkIHRoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgIHN0cmluZzAgPSB0aGlzLmdldEF0dHJpYnV0ZShuYW1lKTtcbiAgICBzdHJpbmcxID0gdmFsdWUxICsgXCJcIjtcbiAgICByZXR1cm4gc3RyaW5nMCA9PT0gc3RyaW5nMSA/IG51bGxcbiAgICAgICAgOiBzdHJpbmcwID09PSBzdHJpbmcwMCAmJiBzdHJpbmcxID09PSBzdHJpbmcxMCA/IGludGVycG9sYXRlMFxuICAgICAgICA6IChzdHJpbmcxMCA9IHN0cmluZzEsIGludGVycG9sYXRlMCA9IGludGVycG9sYXRlKHN0cmluZzAwID0gc3RyaW5nMCwgdmFsdWUxKSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJGdW5jdGlvbk5TKGZ1bGxuYW1lLCBpbnRlcnBvbGF0ZSwgdmFsdWUpIHtcbiAgdmFyIHN0cmluZzAwLFxuICAgICAgc3RyaW5nMTAsXG4gICAgICBpbnRlcnBvbGF0ZTA7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc3RyaW5nMCwgdmFsdWUxID0gdmFsdWUodGhpcyksIHN0cmluZzE7XG4gICAgaWYgKHZhbHVlMSA9PSBudWxsKSByZXR1cm4gdm9pZCB0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7XG4gICAgc3RyaW5nMCA9IHRoaXMuZ2V0QXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTtcbiAgICBzdHJpbmcxID0gdmFsdWUxICsgXCJcIjtcbiAgICByZXR1cm4gc3RyaW5nMCA9PT0gc3RyaW5nMSA/IG51bGxcbiAgICAgICAgOiBzdHJpbmcwID09PSBzdHJpbmcwMCAmJiBzdHJpbmcxID09PSBzdHJpbmcxMCA/IGludGVycG9sYXRlMFxuICAgICAgICA6IChzdHJpbmcxMCA9IHN0cmluZzEsIGludGVycG9sYXRlMCA9IGludGVycG9sYXRlKHN0cmluZzAwID0gc3RyaW5nMCwgdmFsdWUxKSk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gIHZhciBmdWxsbmFtZSA9IG5hbWVzcGFjZShuYW1lKSwgaSA9IGZ1bGxuYW1lID09PSBcInRyYW5zZm9ybVwiID8gaW50ZXJwb2xhdGVUcmFuc2Zvcm0gOiBpbnRlcnBvbGF0ZTtcbiAgcmV0dXJuIHRoaXMuYXR0clR3ZWVuKG5hbWUsIHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICA/IChmdWxsbmFtZS5sb2NhbCA/IGF0dHJGdW5jdGlvbk5TIDogYXR0ckZ1bmN0aW9uKShmdWxsbmFtZSwgaSwgdHdlZW5WYWx1ZSh0aGlzLCBcImF0dHIuXCIgKyBuYW1lLCB2YWx1ZSkpXG4gICAgICA6IHZhbHVlID09IG51bGwgPyAoZnVsbG5hbWUubG9jYWwgPyBhdHRyUmVtb3ZlTlMgOiBhdHRyUmVtb3ZlKShmdWxsbmFtZSlcbiAgICAgIDogKGZ1bGxuYW1lLmxvY2FsID8gYXR0ckNvbnN0YW50TlMgOiBhdHRyQ29uc3RhbnQpKGZ1bGxuYW1lLCBpLCB2YWx1ZSkpO1xufVxuIiwiaW1wb3J0IHtuYW1lc3BhY2V9IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcblxuZnVuY3Rpb24gYXR0ckludGVycG9sYXRlKG5hbWUsIGkpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZShuYW1lLCBpLmNhbGwodGhpcywgdCkpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRySW50ZXJwb2xhdGVOUyhmdWxsbmFtZSwgaSkge1xuICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgIHRoaXMuc2V0QXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsLCBpLmNhbGwodGhpcywgdCkpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRyVHdlZW5OUyhmdWxsbmFtZSwgdmFsdWUpIHtcbiAgdmFyIHQwLCBpMDtcbiAgZnVuY3Rpb24gdHdlZW4oKSB7XG4gICAgdmFyIGkgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmIChpICE9PSBpMCkgdDAgPSAoaTAgPSBpKSAmJiBhdHRySW50ZXJwb2xhdGVOUyhmdWxsbmFtZSwgaSk7XG4gICAgcmV0dXJuIHQwO1xuICB9XG4gIHR3ZWVuLl92YWx1ZSA9IHZhbHVlO1xuICByZXR1cm4gdHdlZW47XG59XG5cbmZ1bmN0aW9uIGF0dHJUd2VlbihuYW1lLCB2YWx1ZSkge1xuICB2YXIgdDAsIGkwO1xuICBmdW5jdGlvbiB0d2VlbigpIHtcbiAgICB2YXIgaSA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKGkgIT09IGkwKSB0MCA9IChpMCA9IGkpICYmIGF0dHJJbnRlcnBvbGF0ZShuYW1lLCBpKTtcbiAgICByZXR1cm4gdDA7XG4gIH1cbiAgdHdlZW4uX3ZhbHVlID0gdmFsdWU7XG4gIHJldHVybiB0d2Vlbjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgdmFyIGtleSA9IFwiYXR0ci5cIiArIG5hbWU7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgcmV0dXJuIChrZXkgPSB0aGlzLnR3ZWVuKGtleSkpICYmIGtleS5fdmFsdWU7XG4gIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gdGhpcy50d2VlbihrZXksIG51bGwpO1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBFcnJvcjtcbiAgdmFyIGZ1bGxuYW1lID0gbmFtZXNwYWNlKG5hbWUpO1xuICByZXR1cm4gdGhpcy50d2VlbihrZXksIChmdWxsbmFtZS5sb2NhbCA/IGF0dHJUd2Vlbk5TIDogYXR0clR3ZWVuKShmdWxsbmFtZSwgdmFsdWUpKTtcbn1cbiIsImltcG9ydCB7Z2V0LCBpbml0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuXG5mdW5jdGlvbiBkZWxheUZ1bmN0aW9uKGlkLCB2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgaW5pdCh0aGlzLCBpZCkuZGVsYXkgPSArdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gZGVsYXlDb25zdGFudChpZCwgdmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID0gK3ZhbHVlLCBmdW5jdGlvbigpIHtcbiAgICBpbml0KHRoaXMsIGlkKS5kZWxheSA9IHZhbHVlO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZSkge1xuICB2YXIgaWQgPSB0aGlzLl9pZDtcblxuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aFxuICAgICAgPyB0aGlzLmVhY2goKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgPyBkZWxheUZ1bmN0aW9uXG4gICAgICAgICAgOiBkZWxheUNvbnN0YW50KShpZCwgdmFsdWUpKVxuICAgICAgOiBnZXQodGhpcy5ub2RlKCksIGlkKS5kZWxheTtcbn1cbiIsImltcG9ydCB7Z2V0LCBzZXR9IGZyb20gXCIuL3NjaGVkdWxlLmpzXCI7XG5cbmZ1bmN0aW9uIGR1cmF0aW9uRnVuY3Rpb24oaWQsIHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICBzZXQodGhpcywgaWQpLmR1cmF0aW9uID0gK3ZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGR1cmF0aW9uQ29uc3RhbnQoaWQsIHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA9ICt2YWx1ZSwgZnVuY3Rpb24oKSB7XG4gICAgc2V0KHRoaXMsIGlkKS5kdXJhdGlvbiA9IHZhbHVlO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZSkge1xuICB2YXIgaWQgPSB0aGlzLl9pZDtcblxuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aFxuICAgICAgPyB0aGlzLmVhY2goKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgPyBkdXJhdGlvbkZ1bmN0aW9uXG4gICAgICAgICAgOiBkdXJhdGlvbkNvbnN0YW50KShpZCwgdmFsdWUpKVxuICAgICAgOiBnZXQodGhpcy5ub2RlKCksIGlkKS5kdXJhdGlvbjtcbn1cbiIsImltcG9ydCB7Z2V0LCBzZXR9IGZyb20gXCIuL3NjaGVkdWxlLmpzXCI7XG5cbmZ1bmN0aW9uIGVhc2VDb25zdGFudChpZCwgdmFsdWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgRXJyb3I7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICBzZXQodGhpcywgaWQpLmVhc2UgPSB2YWx1ZTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUpIHtcbiAgdmFyIGlkID0gdGhpcy5faWQ7XG5cbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGhcbiAgICAgID8gdGhpcy5lYWNoKGVhc2VDb25zdGFudChpZCwgdmFsdWUpKVxuICAgICAgOiBnZXQodGhpcy5ub2RlKCksIGlkKS5lYXNlO1xufVxuIiwiaW1wb3J0IHtzZXR9IGZyb20gXCIuL3NjaGVkdWxlLmpzXCI7XG5cbmZ1bmN0aW9uIGVhc2VWYXJ5aW5nKGlkLCB2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmICh0eXBlb2YgdiAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgRXJyb3I7XG4gICAgc2V0KHRoaXMsIGlkKS5lYXNlID0gdjtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgRXJyb3I7XG4gIHJldHVybiB0aGlzLmVhY2goZWFzZVZhcnlpbmcodGhpcy5faWQsIHZhbHVlKSk7XG59XG4iLCJpbXBvcnQge3NldH0gZnJvbSBcIi4vc2NoZWR1bGUuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHZhciBvbjAsIG9uMSwgdGhhdCA9IHRoaXMsIGlkID0gdGhhdC5faWQsIHNpemUgPSB0aGF0LnNpemUoKTtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgIHZhciBjYW5jZWwgPSB7dmFsdWU6IHJlamVjdH0sXG4gICAgICAgIGVuZCA9IHt2YWx1ZTogZnVuY3Rpb24oKSB7IGlmICgtLXNpemUgPT09IDApIHJlc29sdmUoKTsgfX07XG5cbiAgICB0aGF0LmVhY2goZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc2NoZWR1bGUgPSBzZXQodGhpcywgaWQpLFxuICAgICAgICAgIG9uID0gc2NoZWR1bGUub247XG5cbiAgICAgIC8vIElmIHRoaXMgbm9kZSBzaGFyZWQgYSBkaXNwYXRjaCB3aXRoIHRoZSBwcmV2aW91cyBub2RlLFxuICAgICAgLy8ganVzdCBhc3NpZ24gdGhlIHVwZGF0ZWQgc2hhcmVkIGRpc3BhdGNoIGFuZCB3ZeKAmXJlIGRvbmUhXG4gICAgICAvLyBPdGhlcndpc2UsIGNvcHktb24td3JpdGUuXG4gICAgICBpZiAob24gIT09IG9uMCkge1xuICAgICAgICBvbjEgPSAob24wID0gb24pLmNvcHkoKTtcbiAgICAgICAgb24xLl8uY2FuY2VsLnB1c2goY2FuY2VsKTtcbiAgICAgICAgb24xLl8uaW50ZXJydXB0LnB1c2goY2FuY2VsKTtcbiAgICAgICAgb24xLl8uZW5kLnB1c2goZW5kKTtcbiAgICAgIH1cblxuICAgICAgc2NoZWR1bGUub24gPSBvbjE7XG4gICAgfSk7XG5cbiAgICAvLyBUaGUgc2VsZWN0aW9uIHdhcyBlbXB0eSwgcmVzb2x2ZSBlbmQgaW1tZWRpYXRlbHlcbiAgICBpZiAoc2l6ZSA9PT0gMCkgcmVzb2x2ZSgpO1xuICB9KTtcbn1cbiIsImltcG9ydCB7bWF0Y2hlcn0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuaW1wb3J0IHtUcmFuc2l0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihtYXRjaCkge1xuICBpZiAodHlwZW9mIG1hdGNoICE9PSBcImZ1bmN0aW9uXCIpIG1hdGNoID0gbWF0Y2hlcihtYXRjaCk7XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc3ViZ3JvdXBzID0gbmV3IEFycmF5KG0pLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBzdWJncm91cCA9IHN1Ymdyb3Vwc1tqXSA9IFtdLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKChub2RlID0gZ3JvdXBbaV0pICYmIG1hdGNoLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApKSB7XG4gICAgICAgIHN1Ymdyb3VwLnB1c2gobm9kZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uKHN1Ymdyb3VwcywgdGhpcy5fcGFyZW50cywgdGhpcy5fbmFtZSwgdGhpcy5faWQpO1xufVxuIiwiaW1wb3J0IHtzZWxlY3Rpb259IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcbmltcG9ydCB0cmFuc2l0aW9uX2F0dHIgZnJvbSBcIi4vYXR0ci5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fYXR0clR3ZWVuIGZyb20gXCIuL2F0dHJUd2Vlbi5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fZGVsYXkgZnJvbSBcIi4vZGVsYXkuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX2R1cmF0aW9uIGZyb20gXCIuL2R1cmF0aW9uLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9lYXNlIGZyb20gXCIuL2Vhc2UuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX2Vhc2VWYXJ5aW5nIGZyb20gXCIuL2Vhc2VWYXJ5aW5nLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9maWx0ZXIgZnJvbSBcIi4vZmlsdGVyLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9tZXJnZSBmcm9tIFwiLi9tZXJnZS5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fb24gZnJvbSBcIi4vb24uanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX3JlbW92ZSBmcm9tIFwiLi9yZW1vdmUuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX3NlbGVjdCBmcm9tIFwiLi9zZWxlY3QuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX3NlbGVjdEFsbCBmcm9tIFwiLi9zZWxlY3RBbGwuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX3NlbGVjdGlvbiBmcm9tIFwiLi9zZWxlY3Rpb24uanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX3N0eWxlIGZyb20gXCIuL3N0eWxlLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9zdHlsZVR3ZWVuIGZyb20gXCIuL3N0eWxlVHdlZW4uanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX3RleHQgZnJvbSBcIi4vdGV4dC5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fdGV4dFR3ZWVuIGZyb20gXCIuL3RleHRUd2Vlbi5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fdHJhbnNpdGlvbiBmcm9tIFwiLi90cmFuc2l0aW9uLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl90d2VlbiBmcm9tIFwiLi90d2Vlbi5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fZW5kIGZyb20gXCIuL2VuZC5qc1wiO1xuXG52YXIgaWQgPSAwO1xuXG5leHBvcnQgZnVuY3Rpb24gVHJhbnNpdGlvbihncm91cHMsIHBhcmVudHMsIG5hbWUsIGlkKSB7XG4gIHRoaXMuX2dyb3VwcyA9IGdyb3VwcztcbiAgdGhpcy5fcGFyZW50cyA9IHBhcmVudHM7XG4gIHRoaXMuX25hbWUgPSBuYW1lO1xuICB0aGlzLl9pZCA9IGlkO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB0cmFuc2l0aW9uKG5hbWUpIHtcbiAgcmV0dXJuIHNlbGVjdGlvbigpLnRyYW5zaXRpb24obmFtZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBuZXdJZCgpIHtcbiAgcmV0dXJuICsraWQ7XG59XG5cbnZhciBzZWxlY3Rpb25fcHJvdG90eXBlID0gc2VsZWN0aW9uLnByb3RvdHlwZTtcblxuVHJhbnNpdGlvbi5wcm90b3R5cGUgPSB0cmFuc2l0aW9uLnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IFRyYW5zaXRpb24sXG4gIHNlbGVjdDogdHJhbnNpdGlvbl9zZWxlY3QsXG4gIHNlbGVjdEFsbDogdHJhbnNpdGlvbl9zZWxlY3RBbGwsXG4gIHNlbGVjdENoaWxkOiBzZWxlY3Rpb25fcHJvdG90eXBlLnNlbGVjdENoaWxkLFxuICBzZWxlY3RDaGlsZHJlbjogc2VsZWN0aW9uX3Byb3RvdHlwZS5zZWxlY3RDaGlsZHJlbixcbiAgZmlsdGVyOiB0cmFuc2l0aW9uX2ZpbHRlcixcbiAgbWVyZ2U6IHRyYW5zaXRpb25fbWVyZ2UsXG4gIHNlbGVjdGlvbjogdHJhbnNpdGlvbl9zZWxlY3Rpb24sXG4gIHRyYW5zaXRpb246IHRyYW5zaXRpb25fdHJhbnNpdGlvbixcbiAgY2FsbDogc2VsZWN0aW9uX3Byb3RvdHlwZS5jYWxsLFxuICBub2Rlczogc2VsZWN0aW9uX3Byb3RvdHlwZS5ub2RlcyxcbiAgbm9kZTogc2VsZWN0aW9uX3Byb3RvdHlwZS5ub2RlLFxuICBzaXplOiBzZWxlY3Rpb25fcHJvdG90eXBlLnNpemUsXG4gIGVtcHR5OiBzZWxlY3Rpb25fcHJvdG90eXBlLmVtcHR5LFxuICBlYWNoOiBzZWxlY3Rpb25fcHJvdG90eXBlLmVhY2gsXG4gIG9uOiB0cmFuc2l0aW9uX29uLFxuICBhdHRyOiB0cmFuc2l0aW9uX2F0dHIsXG4gIGF0dHJUd2VlbjogdHJhbnNpdGlvbl9hdHRyVHdlZW4sXG4gIHN0eWxlOiB0cmFuc2l0aW9uX3N0eWxlLFxuICBzdHlsZVR3ZWVuOiB0cmFuc2l0aW9uX3N0eWxlVHdlZW4sXG4gIHRleHQ6IHRyYW5zaXRpb25fdGV4dCxcbiAgdGV4dFR3ZWVuOiB0cmFuc2l0aW9uX3RleHRUd2VlbixcbiAgcmVtb3ZlOiB0cmFuc2l0aW9uX3JlbW92ZSxcbiAgdHdlZW46IHRyYW5zaXRpb25fdHdlZW4sXG4gIGRlbGF5OiB0cmFuc2l0aW9uX2RlbGF5LFxuICBkdXJhdGlvbjogdHJhbnNpdGlvbl9kdXJhdGlvbixcbiAgZWFzZTogdHJhbnNpdGlvbl9lYXNlLFxuICBlYXNlVmFyeWluZzogdHJhbnNpdGlvbl9lYXNlVmFyeWluZyxcbiAgZW5kOiB0cmFuc2l0aW9uX2VuZCxcbiAgW1N5bWJvbC5pdGVyYXRvcl06IHNlbGVjdGlvbl9wcm90b3R5cGVbU3ltYm9sLml0ZXJhdG9yXVxufTtcbiIsImltcG9ydCB7Y29sb3J9IGZyb20gXCJkMy1jb2xvclwiO1xuaW1wb3J0IHtpbnRlcnBvbGF0ZU51bWJlciwgaW50ZXJwb2xhdGVSZ2IsIGludGVycG9sYXRlU3RyaW5nfSBmcm9tIFwiZDMtaW50ZXJwb2xhdGVcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oYSwgYikge1xuICB2YXIgYztcbiAgcmV0dXJuICh0eXBlb2YgYiA9PT0gXCJudW1iZXJcIiA/IGludGVycG9sYXRlTnVtYmVyXG4gICAgICA6IGIgaW5zdGFuY2VvZiBjb2xvciA/IGludGVycG9sYXRlUmdiXG4gICAgICA6IChjID0gY29sb3IoYikpID8gKGIgPSBjLCBpbnRlcnBvbGF0ZVJnYilcbiAgICAgIDogaW50ZXJwb2xhdGVTdHJpbmcpKGEsIGIpO1xufVxuIiwiaW1wb3J0IHtUcmFuc2l0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih0cmFuc2l0aW9uKSB7XG4gIGlmICh0cmFuc2l0aW9uLl9pZCAhPT0gdGhpcy5faWQpIHRocm93IG5ldyBFcnJvcjtcblxuICBmb3IgKHZhciBncm91cHMwID0gdGhpcy5fZ3JvdXBzLCBncm91cHMxID0gdHJhbnNpdGlvbi5fZ3JvdXBzLCBtMCA9IGdyb3VwczAubGVuZ3RoLCBtMSA9IGdyb3VwczEubGVuZ3RoLCBtID0gTWF0aC5taW4obTAsIG0xKSwgbWVyZ2VzID0gbmV3IEFycmF5KG0wKSwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cDAgPSBncm91cHMwW2pdLCBncm91cDEgPSBncm91cHMxW2pdLCBuID0gZ3JvdXAwLmxlbmd0aCwgbWVyZ2UgPSBtZXJnZXNbal0gPSBuZXcgQXJyYXkobiksIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwMFtpXSB8fCBncm91cDFbaV0pIHtcbiAgICAgICAgbWVyZ2VbaV0gPSBub2RlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZvciAoOyBqIDwgbTA7ICsraikge1xuICAgIG1lcmdlc1tqXSA9IGdyb3VwczBbal07XG4gIH1cblxuICByZXR1cm4gbmV3IFRyYW5zaXRpb24obWVyZ2VzLCB0aGlzLl9wYXJlbnRzLCB0aGlzLl9uYW1lLCB0aGlzLl9pZCk7XG59XG4iLCJpbXBvcnQge2dldCwgc2V0LCBpbml0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuXG5mdW5jdGlvbiBzdGFydChuYW1lKSB7XG4gIHJldHVybiAobmFtZSArIFwiXCIpLnRyaW0oKS5zcGxpdCgvXnxcXHMrLykuZXZlcnkoZnVuY3Rpb24odCkge1xuICAgIHZhciBpID0gdC5pbmRleE9mKFwiLlwiKTtcbiAgICBpZiAoaSA+PSAwKSB0ID0gdC5zbGljZSgwLCBpKTtcbiAgICByZXR1cm4gIXQgfHwgdCA9PT0gXCJzdGFydFwiO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gb25GdW5jdGlvbihpZCwgbmFtZSwgbGlzdGVuZXIpIHtcbiAgdmFyIG9uMCwgb24xLCBzaXQgPSBzdGFydChuYW1lKSA/IGluaXQgOiBzZXQ7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc2NoZWR1bGUgPSBzaXQodGhpcywgaWQpLFxuICAgICAgICBvbiA9IHNjaGVkdWxlLm9uO1xuXG4gICAgLy8gSWYgdGhpcyBub2RlIHNoYXJlZCBhIGRpc3BhdGNoIHdpdGggdGhlIHByZXZpb3VzIG5vZGUsXG4gICAgLy8ganVzdCBhc3NpZ24gdGhlIHVwZGF0ZWQgc2hhcmVkIGRpc3BhdGNoIGFuZCB3ZeKAmXJlIGRvbmUhXG4gICAgLy8gT3RoZXJ3aXNlLCBjb3B5LW9uLXdyaXRlLlxuICAgIGlmIChvbiAhPT0gb24wKSAob24xID0gKG9uMCA9IG9uKS5jb3B5KCkpLm9uKG5hbWUsIGxpc3RlbmVyKTtcblxuICAgIHNjaGVkdWxlLm9uID0gb24xO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCBsaXN0ZW5lcikge1xuICB2YXIgaWQgPSB0aGlzLl9pZDtcblxuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA8IDJcbiAgICAgID8gZ2V0KHRoaXMubm9kZSgpLCBpZCkub24ub24obmFtZSlcbiAgICAgIDogdGhpcy5lYWNoKG9uRnVuY3Rpb24oaWQsIG5hbWUsIGxpc3RlbmVyKSk7XG59XG4iLCJmdW5jdGlvbiByZW1vdmVGdW5jdGlvbihpZCkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHBhcmVudCA9IHRoaXMucGFyZW50Tm9kZTtcbiAgICBmb3IgKHZhciBpIGluIHRoaXMuX190cmFuc2l0aW9uKSBpZiAoK2kgIT09IGlkKSByZXR1cm47XG4gICAgaWYgKHBhcmVudCkgcGFyZW50LnJlbW92ZUNoaWxkKHRoaXMpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMub24oXCJlbmQucmVtb3ZlXCIsIHJlbW92ZUZ1bmN0aW9uKHRoaXMuX2lkKSk7XG59XG4iLCJpbXBvcnQge2Rpc3BhdGNofSBmcm9tIFwiZDMtZGlzcGF0Y2hcIjtcbmltcG9ydCB7dGltZXIsIHRpbWVvdXR9IGZyb20gXCJkMy10aW1lclwiO1xuXG52YXIgZW1wdHlPbiA9IGRpc3BhdGNoKFwic3RhcnRcIiwgXCJlbmRcIiwgXCJjYW5jZWxcIiwgXCJpbnRlcnJ1cHRcIik7XG52YXIgZW1wdHlUd2VlbiA9IFtdO1xuXG5leHBvcnQgdmFyIENSRUFURUQgPSAwO1xuZXhwb3J0IHZhciBTQ0hFRFVMRUQgPSAxO1xuZXhwb3J0IHZhciBTVEFSVElORyA9IDI7XG5leHBvcnQgdmFyIFNUQVJURUQgPSAzO1xuZXhwb3J0IHZhciBSVU5OSU5HID0gNDtcbmV4cG9ydCB2YXIgRU5ESU5HID0gNTtcbmV4cG9ydCB2YXIgRU5ERUQgPSA2O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihub2RlLCBuYW1lLCBpZCwgaW5kZXgsIGdyb3VwLCB0aW1pbmcpIHtcbiAgdmFyIHNjaGVkdWxlcyA9IG5vZGUuX190cmFuc2l0aW9uO1xuICBpZiAoIXNjaGVkdWxlcykgbm9kZS5fX3RyYW5zaXRpb24gPSB7fTtcbiAgZWxzZSBpZiAoaWQgaW4gc2NoZWR1bGVzKSByZXR1cm47XG4gIGNyZWF0ZShub2RlLCBpZCwge1xuICAgIG5hbWU6IG5hbWUsXG4gICAgaW5kZXg6IGluZGV4LCAvLyBGb3IgY29udGV4dCBkdXJpbmcgY2FsbGJhY2suXG4gICAgZ3JvdXA6IGdyb3VwLCAvLyBGb3IgY29udGV4dCBkdXJpbmcgY2FsbGJhY2suXG4gICAgb246IGVtcHR5T24sXG4gICAgdHdlZW46IGVtcHR5VHdlZW4sXG4gICAgdGltZTogdGltaW5nLnRpbWUsXG4gICAgZGVsYXk6IHRpbWluZy5kZWxheSxcbiAgICBkdXJhdGlvbjogdGltaW5nLmR1cmF0aW9uLFxuICAgIGVhc2U6IHRpbWluZy5lYXNlLFxuICAgIHRpbWVyOiBudWxsLFxuICAgIHN0YXRlOiBDUkVBVEVEXG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaW5pdChub2RlLCBpZCkge1xuICB2YXIgc2NoZWR1bGUgPSBnZXQobm9kZSwgaWQpO1xuICBpZiAoc2NoZWR1bGUuc3RhdGUgPiBDUkVBVEVEKSB0aHJvdyBuZXcgRXJyb3IoXCJ0b28gbGF0ZTsgYWxyZWFkeSBzY2hlZHVsZWRcIik7XG4gIHJldHVybiBzY2hlZHVsZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldChub2RlLCBpZCkge1xuICB2YXIgc2NoZWR1bGUgPSBnZXQobm9kZSwgaWQpO1xuICBpZiAoc2NoZWR1bGUuc3RhdGUgPiBTVEFSVEVEKSB0aHJvdyBuZXcgRXJyb3IoXCJ0b28gbGF0ZTsgYWxyZWFkeSBydW5uaW5nXCIpO1xuICByZXR1cm4gc2NoZWR1bGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXQobm9kZSwgaWQpIHtcbiAgdmFyIHNjaGVkdWxlID0gbm9kZS5fX3RyYW5zaXRpb247XG4gIGlmICghc2NoZWR1bGUgfHwgIShzY2hlZHVsZSA9IHNjaGVkdWxlW2lkXSkpIHRocm93IG5ldyBFcnJvcihcInRyYW5zaXRpb24gbm90IGZvdW5kXCIpO1xuICByZXR1cm4gc2NoZWR1bGU7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZShub2RlLCBpZCwgc2VsZikge1xuICB2YXIgc2NoZWR1bGVzID0gbm9kZS5fX3RyYW5zaXRpb24sXG4gICAgICB0d2VlbjtcblxuICAvLyBJbml0aWFsaXplIHRoZSBzZWxmIHRpbWVyIHdoZW4gdGhlIHRyYW5zaXRpb24gaXMgY3JlYXRlZC5cbiAgLy8gTm90ZSB0aGUgYWN0dWFsIGRlbGF5IGlzIG5vdCBrbm93biB1bnRpbCB0aGUgZmlyc3QgY2FsbGJhY2shXG4gIHNjaGVkdWxlc1tpZF0gPSBzZWxmO1xuICBzZWxmLnRpbWVyID0gdGltZXIoc2NoZWR1bGUsIDAsIHNlbGYudGltZSk7XG5cbiAgZnVuY3Rpb24gc2NoZWR1bGUoZWxhcHNlZCkge1xuICAgIHNlbGYuc3RhdGUgPSBTQ0hFRFVMRUQ7XG4gICAgc2VsZi50aW1lci5yZXN0YXJ0KHN0YXJ0LCBzZWxmLmRlbGF5LCBzZWxmLnRpbWUpO1xuXG4gICAgLy8gSWYgdGhlIGVsYXBzZWQgZGVsYXkgaXMgbGVzcyB0aGFuIG91ciBmaXJzdCBzbGVlcCwgc3RhcnQgaW1tZWRpYXRlbHkuXG4gICAgaWYgKHNlbGYuZGVsYXkgPD0gZWxhcHNlZCkgc3RhcnQoZWxhcHNlZCAtIHNlbGYuZGVsYXkpO1xuICB9XG5cbiAgZnVuY3Rpb24gc3RhcnQoZWxhcHNlZCkge1xuICAgIHZhciBpLCBqLCBuLCBvO1xuXG4gICAgLy8gSWYgdGhlIHN0YXRlIGlzIG5vdCBTQ0hFRFVMRUQsIHRoZW4gd2UgcHJldmlvdXNseSBlcnJvcmVkIG9uIHN0YXJ0LlxuICAgIGlmIChzZWxmLnN0YXRlICE9PSBTQ0hFRFVMRUQpIHJldHVybiBzdG9wKCk7XG5cbiAgICBmb3IgKGkgaW4gc2NoZWR1bGVzKSB7XG4gICAgICBvID0gc2NoZWR1bGVzW2ldO1xuICAgICAgaWYgKG8ubmFtZSAhPT0gc2VsZi5uYW1lKSBjb250aW51ZTtcblxuICAgICAgLy8gV2hpbGUgdGhpcyBlbGVtZW50IGFscmVhZHkgaGFzIGEgc3RhcnRpbmcgdHJhbnNpdGlvbiBkdXJpbmcgdGhpcyBmcmFtZSxcbiAgICAgIC8vIGRlZmVyIHN0YXJ0aW5nIGFuIGludGVycnVwdGluZyB0cmFuc2l0aW9uIHVudGlsIHRoYXQgdHJhbnNpdGlvbiBoYXMgYVxuICAgICAgLy8gY2hhbmNlIHRvIHRpY2sgKGFuZCBwb3NzaWJseSBlbmQpOyBzZWUgZDMvZDMtdHJhbnNpdGlvbiM1NCFcbiAgICAgIGlmIChvLnN0YXRlID09PSBTVEFSVEVEKSByZXR1cm4gdGltZW91dChzdGFydCk7XG5cbiAgICAgIC8vIEludGVycnVwdCB0aGUgYWN0aXZlIHRyYW5zaXRpb24sIGlmIGFueS5cbiAgICAgIGlmIChvLnN0YXRlID09PSBSVU5OSU5HKSB7XG4gICAgICAgIG8uc3RhdGUgPSBFTkRFRDtcbiAgICAgICAgby50aW1lci5zdG9wKCk7XG4gICAgICAgIG8ub24uY2FsbChcImludGVycnVwdFwiLCBub2RlLCBub2RlLl9fZGF0YV9fLCBvLmluZGV4LCBvLmdyb3VwKTtcbiAgICAgICAgZGVsZXRlIHNjaGVkdWxlc1tpXTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2FuY2VsIGFueSBwcmUtZW1wdGVkIHRyYW5zaXRpb25zLlxuICAgICAgZWxzZSBpZiAoK2kgPCBpZCkge1xuICAgICAgICBvLnN0YXRlID0gRU5ERUQ7XG4gICAgICAgIG8udGltZXIuc3RvcCgpO1xuICAgICAgICBvLm9uLmNhbGwoXCJjYW5jZWxcIiwgbm9kZSwgbm9kZS5fX2RhdGFfXywgby5pbmRleCwgby5ncm91cCk7XG4gICAgICAgIGRlbGV0ZSBzY2hlZHVsZXNbaV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRGVmZXIgdGhlIGZpcnN0IHRpY2sgdG8gZW5kIG9mIHRoZSBjdXJyZW50IGZyYW1lOyBzZWUgZDMvZDMjMTU3Ni5cbiAgICAvLyBOb3RlIHRoZSB0cmFuc2l0aW9uIG1heSBiZSBjYW5jZWxlZCBhZnRlciBzdGFydCBhbmQgYmVmb3JlIHRoZSBmaXJzdCB0aWNrIVxuICAgIC8vIE5vdGUgdGhpcyBtdXN0IGJlIHNjaGVkdWxlZCBiZWZvcmUgdGhlIHN0YXJ0IGV2ZW50OyBzZWUgZDMvZDMtdHJhbnNpdGlvbiMxNiFcbiAgICAvLyBBc3N1bWluZyB0aGlzIGlzIHN1Y2Nlc3NmdWwsIHN1YnNlcXVlbnQgY2FsbGJhY2tzIGdvIHN0cmFpZ2h0IHRvIHRpY2suXG4gICAgdGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgIGlmIChzZWxmLnN0YXRlID09PSBTVEFSVEVEKSB7XG4gICAgICAgIHNlbGYuc3RhdGUgPSBSVU5OSU5HO1xuICAgICAgICBzZWxmLnRpbWVyLnJlc3RhcnQodGljaywgc2VsZi5kZWxheSwgc2VsZi50aW1lKTtcbiAgICAgICAgdGljayhlbGFwc2VkKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIERpc3BhdGNoIHRoZSBzdGFydCBldmVudC5cbiAgICAvLyBOb3RlIHRoaXMgbXVzdCBiZSBkb25lIGJlZm9yZSB0aGUgdHdlZW4gYXJlIGluaXRpYWxpemVkLlxuICAgIHNlbGYuc3RhdGUgPSBTVEFSVElORztcbiAgICBzZWxmLm9uLmNhbGwoXCJzdGFydFwiLCBub2RlLCBub2RlLl9fZGF0YV9fLCBzZWxmLmluZGV4LCBzZWxmLmdyb3VwKTtcbiAgICBpZiAoc2VsZi5zdGF0ZSAhPT0gU1RBUlRJTkcpIHJldHVybjsgLy8gaW50ZXJydXB0ZWRcbiAgICBzZWxmLnN0YXRlID0gU1RBUlRFRDtcblxuICAgIC8vIEluaXRpYWxpemUgdGhlIHR3ZWVuLCBkZWxldGluZyBudWxsIHR3ZWVuLlxuICAgIHR3ZWVuID0gbmV3IEFycmF5KG4gPSBzZWxmLnR3ZWVuLmxlbmd0aCk7XG4gICAgZm9yIChpID0gMCwgaiA9IC0xOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobyA9IHNlbGYudHdlZW5baV0udmFsdWUuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBzZWxmLmluZGV4LCBzZWxmLmdyb3VwKSkge1xuICAgICAgICB0d2VlblsrK2pdID0gbztcbiAgICAgIH1cbiAgICB9XG4gICAgdHdlZW4ubGVuZ3RoID0gaiArIDE7XG4gIH1cblxuICBmdW5jdGlvbiB0aWNrKGVsYXBzZWQpIHtcbiAgICB2YXIgdCA9IGVsYXBzZWQgPCBzZWxmLmR1cmF0aW9uID8gc2VsZi5lYXNlLmNhbGwobnVsbCwgZWxhcHNlZCAvIHNlbGYuZHVyYXRpb24pIDogKHNlbGYudGltZXIucmVzdGFydChzdG9wKSwgc2VsZi5zdGF0ZSA9IEVORElORywgMSksXG4gICAgICAgIGkgPSAtMSxcbiAgICAgICAgbiA9IHR3ZWVuLmxlbmd0aDtcblxuICAgIHdoaWxlICgrK2kgPCBuKSB7XG4gICAgICB0d2VlbltpXS5jYWxsKG5vZGUsIHQpO1xuICAgIH1cblxuICAgIC8vIERpc3BhdGNoIHRoZSBlbmQgZXZlbnQuXG4gICAgaWYgKHNlbGYuc3RhdGUgPT09IEVORElORykge1xuICAgICAgc2VsZi5vbi5jYWxsKFwiZW5kXCIsIG5vZGUsIG5vZGUuX19kYXRhX18sIHNlbGYuaW5kZXgsIHNlbGYuZ3JvdXApO1xuICAgICAgc3RvcCgpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHN0b3AoKSB7XG4gICAgc2VsZi5zdGF0ZSA9IEVOREVEO1xuICAgIHNlbGYudGltZXIuc3RvcCgpO1xuICAgIGRlbGV0ZSBzY2hlZHVsZXNbaWRdO1xuICAgIGZvciAodmFyIGkgaW4gc2NoZWR1bGVzKSByZXR1cm47IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICBkZWxldGUgbm9kZS5fX3RyYW5zaXRpb247XG4gIH1cbn1cbiIsImltcG9ydCB7c2VsZWN0b3J9IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcbmltcG9ydCB7VHJhbnNpdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcbmltcG9ydCBzY2hlZHVsZSwge2dldH0gZnJvbSBcIi4vc2NoZWR1bGUuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc2VsZWN0KSB7XG4gIHZhciBuYW1lID0gdGhpcy5fbmFtZSxcbiAgICAgIGlkID0gdGhpcy5faWQ7XG5cbiAgaWYgKHR5cGVvZiBzZWxlY3QgIT09IFwiZnVuY3Rpb25cIikgc2VsZWN0ID0gc2VsZWN0b3Ioc2VsZWN0KTtcblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBzdWJncm91cHMgPSBuZXcgQXJyYXkobSksIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIHN1Ymdyb3VwID0gc3ViZ3JvdXBzW2pdID0gbmV3IEFycmF5KG4pLCBub2RlLCBzdWJub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKChub2RlID0gZ3JvdXBbaV0pICYmIChzdWJub2RlID0gc2VsZWN0LmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApKSkge1xuICAgICAgICBpZiAoXCJfX2RhdGFfX1wiIGluIG5vZGUpIHN1Ym5vZGUuX19kYXRhX18gPSBub2RlLl9fZGF0YV9fO1xuICAgICAgICBzdWJncm91cFtpXSA9IHN1Ym5vZGU7XG4gICAgICAgIHNjaGVkdWxlKHN1Ymdyb3VwW2ldLCBuYW1lLCBpZCwgaSwgc3ViZ3JvdXAsIGdldChub2RlLCBpZCkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgVHJhbnNpdGlvbihzdWJncm91cHMsIHRoaXMuX3BhcmVudHMsIG5hbWUsIGlkKTtcbn1cbiIsImltcG9ydCB7c2VsZWN0b3JBbGx9IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcbmltcG9ydCB7VHJhbnNpdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcbmltcG9ydCBzY2hlZHVsZSwge2dldH0gZnJvbSBcIi4vc2NoZWR1bGUuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc2VsZWN0KSB7XG4gIHZhciBuYW1lID0gdGhpcy5fbmFtZSxcbiAgICAgIGlkID0gdGhpcy5faWQ7XG5cbiAgaWYgKHR5cGVvZiBzZWxlY3QgIT09IFwiZnVuY3Rpb25cIikgc2VsZWN0ID0gc2VsZWN0b3JBbGwoc2VsZWN0KTtcblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBzdWJncm91cHMgPSBbXSwgcGFyZW50cyA9IFtdLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkge1xuICAgICAgICBmb3IgKHZhciBjaGlsZHJlbiA9IHNlbGVjdC5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKSwgY2hpbGQsIGluaGVyaXQgPSBnZXQobm9kZSwgaWQpLCBrID0gMCwgbCA9IGNoaWxkcmVuLmxlbmd0aDsgayA8IGw7ICsraykge1xuICAgICAgICAgIGlmIChjaGlsZCA9IGNoaWxkcmVuW2tdKSB7XG4gICAgICAgICAgICBzY2hlZHVsZShjaGlsZCwgbmFtZSwgaWQsIGssIGNoaWxkcmVuLCBpbmhlcml0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc3ViZ3JvdXBzLnB1c2goY2hpbGRyZW4pO1xuICAgICAgICBwYXJlbnRzLnB1c2gobm9kZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uKHN1Ymdyb3VwcywgcGFyZW50cywgbmFtZSwgaWQpO1xufVxuIiwiaW1wb3J0IHtzZWxlY3Rpb259IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcblxudmFyIFNlbGVjdGlvbiA9IHNlbGVjdGlvbi5wcm90b3R5cGUuY29uc3RydWN0b3I7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFNlbGVjdGlvbih0aGlzLl9ncm91cHMsIHRoaXMuX3BhcmVudHMpO1xufVxuIiwiaW1wb3J0IHtpbnRlcnBvbGF0ZVRyYW5zZm9ybUNzcyBhcyBpbnRlcnBvbGF0ZVRyYW5zZm9ybX0gZnJvbSBcImQzLWludGVycG9sYXRlXCI7XG5pbXBvcnQge3N0eWxlfSBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5pbXBvcnQge3NldH0gZnJvbSBcIi4vc2NoZWR1bGUuanNcIjtcbmltcG9ydCB7dHdlZW5WYWx1ZX0gZnJvbSBcIi4vdHdlZW4uanNcIjtcbmltcG9ydCBpbnRlcnBvbGF0ZSBmcm9tIFwiLi9pbnRlcnBvbGF0ZS5qc1wiO1xuXG5mdW5jdGlvbiBzdHlsZU51bGwobmFtZSwgaW50ZXJwb2xhdGUpIHtcbiAgdmFyIHN0cmluZzAwLFxuICAgICAgc3RyaW5nMTAsXG4gICAgICBpbnRlcnBvbGF0ZTA7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc3RyaW5nMCA9IHN0eWxlKHRoaXMsIG5hbWUpLFxuICAgICAgICBzdHJpbmcxID0gKHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobmFtZSksIHN0eWxlKHRoaXMsIG5hbWUpKTtcbiAgICByZXR1cm4gc3RyaW5nMCA9PT0gc3RyaW5nMSA/IG51bGxcbiAgICAgICAgOiBzdHJpbmcwID09PSBzdHJpbmcwMCAmJiBzdHJpbmcxID09PSBzdHJpbmcxMCA/IGludGVycG9sYXRlMFxuICAgICAgICA6IGludGVycG9sYXRlMCA9IGludGVycG9sYXRlKHN0cmluZzAwID0gc3RyaW5nMCwgc3RyaW5nMTAgPSBzdHJpbmcxKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gc3R5bGVSZW1vdmUobmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gc3R5bGVDb25zdGFudChuYW1lLCBpbnRlcnBvbGF0ZSwgdmFsdWUxKSB7XG4gIHZhciBzdHJpbmcwMCxcbiAgICAgIHN0cmluZzEgPSB2YWx1ZTEgKyBcIlwiLFxuICAgICAgaW50ZXJwb2xhdGUwO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHN0cmluZzAgPSBzdHlsZSh0aGlzLCBuYW1lKTtcbiAgICByZXR1cm4gc3RyaW5nMCA9PT0gc3RyaW5nMSA/IG51bGxcbiAgICAgICAgOiBzdHJpbmcwID09PSBzdHJpbmcwMCA/IGludGVycG9sYXRlMFxuICAgICAgICA6IGludGVycG9sYXRlMCA9IGludGVycG9sYXRlKHN0cmluZzAwID0gc3RyaW5nMCwgdmFsdWUxKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gc3R5bGVGdW5jdGlvbihuYW1lLCBpbnRlcnBvbGF0ZSwgdmFsdWUpIHtcbiAgdmFyIHN0cmluZzAwLFxuICAgICAgc3RyaW5nMTAsXG4gICAgICBpbnRlcnBvbGF0ZTA7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc3RyaW5nMCA9IHN0eWxlKHRoaXMsIG5hbWUpLFxuICAgICAgICB2YWx1ZTEgPSB2YWx1ZSh0aGlzKSxcbiAgICAgICAgc3RyaW5nMSA9IHZhbHVlMSArIFwiXCI7XG4gICAgaWYgKHZhbHVlMSA9PSBudWxsKSBzdHJpbmcxID0gdmFsdWUxID0gKHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobmFtZSksIHN0eWxlKHRoaXMsIG5hbWUpKTtcbiAgICByZXR1cm4gc3RyaW5nMCA9PT0gc3RyaW5nMSA/IG51bGxcbiAgICAgICAgOiBzdHJpbmcwID09PSBzdHJpbmcwMCAmJiBzdHJpbmcxID09PSBzdHJpbmcxMCA/IGludGVycG9sYXRlMFxuICAgICAgICA6IChzdHJpbmcxMCA9IHN0cmluZzEsIGludGVycG9sYXRlMCA9IGludGVycG9sYXRlKHN0cmluZzAwID0gc3RyaW5nMCwgdmFsdWUxKSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHN0eWxlTWF5YmVSZW1vdmUoaWQsIG5hbWUpIHtcbiAgdmFyIG9uMCwgb24xLCBsaXN0ZW5lcjAsIGtleSA9IFwic3R5bGUuXCIgKyBuYW1lLCBldmVudCA9IFwiZW5kLlwiICsga2V5LCByZW1vdmU7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc2NoZWR1bGUgPSBzZXQodGhpcywgaWQpLFxuICAgICAgICBvbiA9IHNjaGVkdWxlLm9uLFxuICAgICAgICBsaXN0ZW5lciA9IHNjaGVkdWxlLnZhbHVlW2tleV0gPT0gbnVsbCA/IHJlbW92ZSB8fCAocmVtb3ZlID0gc3R5bGVSZW1vdmUobmFtZSkpIDogdW5kZWZpbmVkO1xuXG4gICAgLy8gSWYgdGhpcyBub2RlIHNoYXJlZCBhIGRpc3BhdGNoIHdpdGggdGhlIHByZXZpb3VzIG5vZGUsXG4gICAgLy8ganVzdCBhc3NpZ24gdGhlIHVwZGF0ZWQgc2hhcmVkIGRpc3BhdGNoIGFuZCB3ZeKAmXJlIGRvbmUhXG4gICAgLy8gT3RoZXJ3aXNlLCBjb3B5LW9uLXdyaXRlLlxuICAgIGlmIChvbiAhPT0gb24wIHx8IGxpc3RlbmVyMCAhPT0gbGlzdGVuZXIpIChvbjEgPSAob24wID0gb24pLmNvcHkoKSkub24oZXZlbnQsIGxpc3RlbmVyMCA9IGxpc3RlbmVyKTtcblxuICAgIHNjaGVkdWxlLm9uID0gb24xO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHtcbiAgdmFyIGkgPSAobmFtZSArPSBcIlwiKSA9PT0gXCJ0cmFuc2Zvcm1cIiA/IGludGVycG9sYXRlVHJhbnNmb3JtIDogaW50ZXJwb2xhdGU7XG4gIHJldHVybiB2YWx1ZSA9PSBudWxsID8gdGhpc1xuICAgICAgLnN0eWxlVHdlZW4obmFtZSwgc3R5bGVOdWxsKG5hbWUsIGkpKVxuICAgICAgLm9uKFwiZW5kLnN0eWxlLlwiICsgbmFtZSwgc3R5bGVSZW1vdmUobmFtZSkpXG4gICAgOiB0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIiA/IHRoaXNcbiAgICAgIC5zdHlsZVR3ZWVuKG5hbWUsIHN0eWxlRnVuY3Rpb24obmFtZSwgaSwgdHdlZW5WYWx1ZSh0aGlzLCBcInN0eWxlLlwiICsgbmFtZSwgdmFsdWUpKSlcbiAgICAgIC5lYWNoKHN0eWxlTWF5YmVSZW1vdmUodGhpcy5faWQsIG5hbWUpKVxuICAgIDogdGhpc1xuICAgICAgLnN0eWxlVHdlZW4obmFtZSwgc3R5bGVDb25zdGFudChuYW1lLCBpLCB2YWx1ZSksIHByaW9yaXR5KVxuICAgICAgLm9uKFwiZW5kLnN0eWxlLlwiICsgbmFtZSwgbnVsbCk7XG59XG4iLCJmdW5jdGlvbiBzdHlsZUludGVycG9sYXRlKG5hbWUsIGksIHByaW9yaXR5KSB7XG4gIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgdGhpcy5zdHlsZS5zZXRQcm9wZXJ0eShuYW1lLCBpLmNhbGwodGhpcywgdCksIHByaW9yaXR5KTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gc3R5bGVUd2VlbihuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHtcbiAgdmFyIHQsIGkwO1xuICBmdW5jdGlvbiB0d2VlbigpIHtcbiAgICB2YXIgaSA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKGkgIT09IGkwKSB0ID0gKGkwID0gaSkgJiYgc3R5bGVJbnRlcnBvbGF0ZShuYW1lLCBpLCBwcmlvcml0eSk7XG4gICAgcmV0dXJuIHQ7XG4gIH1cbiAgdHdlZW4uX3ZhbHVlID0gdmFsdWU7XG4gIHJldHVybiB0d2Vlbjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7XG4gIHZhciBrZXkgPSBcInN0eWxlLlwiICsgKG5hbWUgKz0gXCJcIik7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgcmV0dXJuIChrZXkgPSB0aGlzLnR3ZWVuKGtleSkpICYmIGtleS5fdmFsdWU7XG4gIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gdGhpcy50d2VlbihrZXksIG51bGwpO1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBFcnJvcjtcbiAgcmV0dXJuIHRoaXMudHdlZW4oa2V5LCBzdHlsZVR3ZWVuKG5hbWUsIHZhbHVlLCBwcmlvcml0eSA9PSBudWxsID8gXCJcIiA6IHByaW9yaXR5KSk7XG59XG4iLCJpbXBvcnQge3R3ZWVuVmFsdWV9IGZyb20gXCIuL3R3ZWVuLmpzXCI7XG5cbmZ1bmN0aW9uIHRleHRDb25zdGFudCh2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy50ZXh0Q29udGVudCA9IHZhbHVlO1xuICB9O1xufVxuXG5mdW5jdGlvbiB0ZXh0RnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciB2YWx1ZTEgPSB2YWx1ZSh0aGlzKTtcbiAgICB0aGlzLnRleHRDb250ZW50ID0gdmFsdWUxID09IG51bGwgPyBcIlwiIDogdmFsdWUxO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gdGhpcy50d2VlbihcInRleHRcIiwgdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgID8gdGV4dEZ1bmN0aW9uKHR3ZWVuVmFsdWUodGhpcywgXCJ0ZXh0XCIsIHZhbHVlKSlcbiAgICAgIDogdGV4dENvbnN0YW50KHZhbHVlID09IG51bGwgPyBcIlwiIDogdmFsdWUgKyBcIlwiKSk7XG59XG4iLCJmdW5jdGlvbiB0ZXh0SW50ZXJwb2xhdGUoaSkge1xuICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgIHRoaXMudGV4dENvbnRlbnQgPSBpLmNhbGwodGhpcywgdCk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHRleHRUd2Vlbih2YWx1ZSkge1xuICB2YXIgdDAsIGkwO1xuICBmdW5jdGlvbiB0d2VlbigpIHtcbiAgICB2YXIgaSA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKGkgIT09IGkwKSB0MCA9IChpMCA9IGkpICYmIHRleHRJbnRlcnBvbGF0ZShpKTtcbiAgICByZXR1cm4gdDA7XG4gIH1cbiAgdHdlZW4uX3ZhbHVlID0gdmFsdWU7XG4gIHJldHVybiB0d2Vlbjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUpIHtcbiAgdmFyIGtleSA9IFwidGV4dFwiO1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDEpIHJldHVybiAoa2V5ID0gdGhpcy50d2VlbihrZXkpKSAmJiBrZXkuX3ZhbHVlO1xuICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIHRoaXMudHdlZW4oa2V5LCBudWxsKTtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgRXJyb3I7XG4gIHJldHVybiB0aGlzLnR3ZWVuKGtleSwgdGV4dFR3ZWVuKHZhbHVlKSk7XG59XG4iLCJpbXBvcnQge1RyYW5zaXRpb24sIG5ld0lkfSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuaW1wb3J0IHNjaGVkdWxlLCB7Z2V0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgdmFyIG5hbWUgPSB0aGlzLl9uYW1lLFxuICAgICAgaWQwID0gdGhpcy5faWQsXG4gICAgICBpZDEgPSBuZXdJZCgpO1xuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XG4gICAgICAgIHZhciBpbmhlcml0ID0gZ2V0KG5vZGUsIGlkMCk7XG4gICAgICAgIHNjaGVkdWxlKG5vZGUsIG5hbWUsIGlkMSwgaSwgZ3JvdXAsIHtcbiAgICAgICAgICB0aW1lOiBpbmhlcml0LnRpbWUgKyBpbmhlcml0LmRlbGF5ICsgaW5oZXJpdC5kdXJhdGlvbixcbiAgICAgICAgICBkZWxheTogMCxcbiAgICAgICAgICBkdXJhdGlvbjogaW5oZXJpdC5kdXJhdGlvbixcbiAgICAgICAgICBlYXNlOiBpbmhlcml0LmVhc2VcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uKGdyb3VwcywgdGhpcy5fcGFyZW50cywgbmFtZSwgaWQxKTtcbn1cbiIsImltcG9ydCB7Z2V0LCBzZXR9IGZyb20gXCIuL3NjaGVkdWxlLmpzXCI7XG5cbmZ1bmN0aW9uIHR3ZWVuUmVtb3ZlKGlkLCBuYW1lKSB7XG4gIHZhciB0d2VlbjAsIHR3ZWVuMTtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzY2hlZHVsZSA9IHNldCh0aGlzLCBpZCksXG4gICAgICAgIHR3ZWVuID0gc2NoZWR1bGUudHdlZW47XG5cbiAgICAvLyBJZiB0aGlzIG5vZGUgc2hhcmVkIHR3ZWVuIHdpdGggdGhlIHByZXZpb3VzIG5vZGUsXG4gICAgLy8ganVzdCBhc3NpZ24gdGhlIHVwZGF0ZWQgc2hhcmVkIHR3ZWVuIGFuZCB3ZeKAmXJlIGRvbmUhXG4gICAgLy8gT3RoZXJ3aXNlLCBjb3B5LW9uLXdyaXRlLlxuICAgIGlmICh0d2VlbiAhPT0gdHdlZW4wKSB7XG4gICAgICB0d2VlbjEgPSB0d2VlbjAgPSB0d2VlbjtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBuID0gdHdlZW4xLmxlbmd0aDsgaSA8IG47ICsraSkge1xuICAgICAgICBpZiAodHdlZW4xW2ldLm5hbWUgPT09IG5hbWUpIHtcbiAgICAgICAgICB0d2VlbjEgPSB0d2VlbjEuc2xpY2UoKTtcbiAgICAgICAgICB0d2VlbjEuc3BsaWNlKGksIDEpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgc2NoZWR1bGUudHdlZW4gPSB0d2VlbjE7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHR3ZWVuRnVuY3Rpb24oaWQsIG5hbWUsIHZhbHVlKSB7XG4gIHZhciB0d2VlbjAsIHR3ZWVuMTtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgRXJyb3I7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc2NoZWR1bGUgPSBzZXQodGhpcywgaWQpLFxuICAgICAgICB0d2VlbiA9IHNjaGVkdWxlLnR3ZWVuO1xuXG4gICAgLy8gSWYgdGhpcyBub2RlIHNoYXJlZCB0d2VlbiB3aXRoIHRoZSBwcmV2aW91cyBub2RlLFxuICAgIC8vIGp1c3QgYXNzaWduIHRoZSB1cGRhdGVkIHNoYXJlZCB0d2VlbiBhbmQgd2XigJlyZSBkb25lIVxuICAgIC8vIE90aGVyd2lzZSwgY29weS1vbi13cml0ZS5cbiAgICBpZiAodHdlZW4gIT09IHR3ZWVuMCkge1xuICAgICAgdHdlZW4xID0gKHR3ZWVuMCA9IHR3ZWVuKS5zbGljZSgpO1xuICAgICAgZm9yICh2YXIgdCA9IHtuYW1lOiBuYW1lLCB2YWx1ZTogdmFsdWV9LCBpID0gMCwgbiA9IHR3ZWVuMS5sZW5ndGg7IGkgPCBuOyArK2kpIHtcbiAgICAgICAgaWYgKHR3ZWVuMVtpXS5uYW1lID09PSBuYW1lKSB7XG4gICAgICAgICAgdHdlZW4xW2ldID0gdDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGkgPT09IG4pIHR3ZWVuMS5wdXNoKHQpO1xuICAgIH1cblxuICAgIHNjaGVkdWxlLnR3ZWVuID0gdHdlZW4xO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICB2YXIgaWQgPSB0aGlzLl9pZDtcblxuICBuYW1lICs9IFwiXCI7XG5cbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7XG4gICAgdmFyIHR3ZWVuID0gZ2V0KHRoaXMubm9kZSgpLCBpZCkudHdlZW47XG4gICAgZm9yICh2YXIgaSA9IDAsIG4gPSB0d2Vlbi5sZW5ndGgsIHQ7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmICgodCA9IHR3ZWVuW2ldKS5uYW1lID09PSBuYW1lKSB7XG4gICAgICAgIHJldHVybiB0LnZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiB0aGlzLmVhY2goKHZhbHVlID09IG51bGwgPyB0d2VlblJlbW92ZSA6IHR3ZWVuRnVuY3Rpb24pKGlkLCBuYW1lLCB2YWx1ZSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdHdlZW5WYWx1ZSh0cmFuc2l0aW9uLCBuYW1lLCB2YWx1ZSkge1xuICB2YXIgaWQgPSB0cmFuc2l0aW9uLl9pZDtcblxuICB0cmFuc2l0aW9uLmVhY2goZnVuY3Rpb24oKSB7XG4gICAgdmFyIHNjaGVkdWxlID0gc2V0KHRoaXMsIGlkKTtcbiAgICAoc2NoZWR1bGUudmFsdWUgfHwgKHNjaGVkdWxlLnZhbHVlID0ge30pKVtuYW1lXSA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH0pO1xuXG4gIHJldHVybiBmdW5jdGlvbihub2RlKSB7XG4gICAgcmV0dXJuIGdldChub2RlLCBpZCkudmFsdWVbbmFtZV07XG4gIH07XG59XG4iLCJleHBvcnQgZGVmYXVsdCB4ID0+ICgpID0+IHg7XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBab29tRXZlbnQodHlwZSwge1xuICBzb3VyY2VFdmVudCxcbiAgdGFyZ2V0LFxuICB0cmFuc2Zvcm0sXG4gIGRpc3BhdGNoXG59KSB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMsIHtcbiAgICB0eXBlOiB7dmFsdWU6IHR5cGUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZX0sXG4gICAgc291cmNlRXZlbnQ6IHt2YWx1ZTogc291cmNlRXZlbnQsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZX0sXG4gICAgdGFyZ2V0OiB7dmFsdWU6IHRhcmdldCwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlfSxcbiAgICB0cmFuc2Zvcm06IHt2YWx1ZTogdHJhbnNmb3JtLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWV9LFxuICAgIF86IHt2YWx1ZTogZGlzcGF0Y2h9XG4gIH0pO1xufVxuIiwiZXhwb3J0IHtkZWZhdWx0IGFzIHpvb219IGZyb20gXCIuL3pvb20uanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyB6b29tVHJhbnNmb3JtLCBpZGVudGl0eSBhcyB6b29tSWRlbnRpdHksIFRyYW5zZm9ybSBhcyBab29tVHJhbnNmb3JtfSBmcm9tIFwiLi90cmFuc2Zvcm0uanNcIjtcbiIsImV4cG9ydCBmdW5jdGlvbiBub3Byb3BhZ2F0aW9uKGV2ZW50KSB7XG4gIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihldmVudCkge1xuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBUcmFuc2Zvcm0oaywgeCwgeSkge1xuICB0aGlzLmsgPSBrO1xuICB0aGlzLnggPSB4O1xuICB0aGlzLnkgPSB5O1xufVxuXG5UcmFuc2Zvcm0ucHJvdG90eXBlID0ge1xuICBjb25zdHJ1Y3RvcjogVHJhbnNmb3JtLFxuICBzY2FsZTogZnVuY3Rpb24oaykge1xuICAgIHJldHVybiBrID09PSAxID8gdGhpcyA6IG5ldyBUcmFuc2Zvcm0odGhpcy5rICogaywgdGhpcy54LCB0aGlzLnkpO1xuICB9LFxuICB0cmFuc2xhdGU6IGZ1bmN0aW9uKHgsIHkpIHtcbiAgICByZXR1cm4geCA9PT0gMCAmIHkgPT09IDAgPyB0aGlzIDogbmV3IFRyYW5zZm9ybSh0aGlzLmssIHRoaXMueCArIHRoaXMuayAqIHgsIHRoaXMueSArIHRoaXMuayAqIHkpO1xuICB9LFxuICBhcHBseTogZnVuY3Rpb24ocG9pbnQpIHtcbiAgICByZXR1cm4gW3BvaW50WzBdICogdGhpcy5rICsgdGhpcy54LCBwb2ludFsxXSAqIHRoaXMuayArIHRoaXMueV07XG4gIH0sXG4gIGFwcGx5WDogZnVuY3Rpb24oeCkge1xuICAgIHJldHVybiB4ICogdGhpcy5rICsgdGhpcy54O1xuICB9LFxuICBhcHBseVk6IGZ1bmN0aW9uKHkpIHtcbiAgICByZXR1cm4geSAqIHRoaXMuayArIHRoaXMueTtcbiAgfSxcbiAgaW52ZXJ0OiBmdW5jdGlvbihsb2NhdGlvbikge1xuICAgIHJldHVybiBbKGxvY2F0aW9uWzBdIC0gdGhpcy54KSAvIHRoaXMuaywgKGxvY2F0aW9uWzFdIC0gdGhpcy55KSAvIHRoaXMua107XG4gIH0sXG4gIGludmVydFg6IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4gKHggLSB0aGlzLngpIC8gdGhpcy5rO1xuICB9LFxuICBpbnZlcnRZOiBmdW5jdGlvbih5KSB7XG4gICAgcmV0dXJuICh5IC0gdGhpcy55KSAvIHRoaXMuaztcbiAgfSxcbiAgcmVzY2FsZVg6IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4geC5jb3B5KCkuZG9tYWluKHgucmFuZ2UoKS5tYXAodGhpcy5pbnZlcnRYLCB0aGlzKS5tYXAoeC5pbnZlcnQsIHgpKTtcbiAgfSxcbiAgcmVzY2FsZVk6IGZ1bmN0aW9uKHkpIHtcbiAgICByZXR1cm4geS5jb3B5KCkuZG9tYWluKHkucmFuZ2UoKS5tYXAodGhpcy5pbnZlcnRZLCB0aGlzKS5tYXAoeS5pbnZlcnQsIHkpKTtcbiAgfSxcbiAgdG9TdHJpbmc6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBcInRyYW5zbGF0ZShcIiArIHRoaXMueCArIFwiLFwiICsgdGhpcy55ICsgXCIpIHNjYWxlKFwiICsgdGhpcy5rICsgXCIpXCI7XG4gIH1cbn07XG5cbmV4cG9ydCB2YXIgaWRlbnRpdHkgPSBuZXcgVHJhbnNmb3JtKDEsIDAsIDApO1xuXG50cmFuc2Zvcm0ucHJvdG90eXBlID0gVHJhbnNmb3JtLnByb3RvdHlwZTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdHJhbnNmb3JtKG5vZGUpIHtcbiAgd2hpbGUgKCFub2RlLl9fem9vbSkgaWYgKCEobm9kZSA9IG5vZGUucGFyZW50Tm9kZSkpIHJldHVybiBpZGVudGl0eTtcbiAgcmV0dXJuIG5vZGUuX196b29tO1xufVxuIiwiaW1wb3J0IHtkaXNwYXRjaH0gZnJvbSBcImQzLWRpc3BhdGNoXCI7XG5pbXBvcnQge2RyYWdEaXNhYmxlLCBkcmFnRW5hYmxlfSBmcm9tIFwiZDMtZHJhZ1wiO1xuaW1wb3J0IHtpbnRlcnBvbGF0ZVpvb219IGZyb20gXCJkMy1pbnRlcnBvbGF0ZVwiO1xuaW1wb3J0IHtzZWxlY3QsIHBvaW50ZXJ9IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcbmltcG9ydCB7aW50ZXJydXB0fSBmcm9tIFwiZDMtdHJhbnNpdGlvblwiO1xuaW1wb3J0IGNvbnN0YW50IGZyb20gXCIuL2NvbnN0YW50LmpzXCI7XG5pbXBvcnQgWm9vbUV2ZW50IGZyb20gXCIuL2V2ZW50LmpzXCI7XG5pbXBvcnQge1RyYW5zZm9ybSwgaWRlbnRpdHl9IGZyb20gXCIuL3RyYW5zZm9ybS5qc1wiO1xuaW1wb3J0IG5vZXZlbnQsIHtub3Byb3BhZ2F0aW9ufSBmcm9tIFwiLi9ub2V2ZW50LmpzXCI7XG5cbi8vIElnbm9yZSByaWdodC1jbGljaywgc2luY2UgdGhhdCBzaG91bGQgb3BlbiB0aGUgY29udGV4dCBtZW51LlxuLy8gZXhjZXB0IGZvciBwaW5jaC10by16b29tLCB3aGljaCBpcyBzZW50IGFzIGEgd2hlZWwrY3RybEtleSBldmVudFxuZnVuY3Rpb24gZGVmYXVsdEZpbHRlcihldmVudCkge1xuICByZXR1cm4gKCFldmVudC5jdHJsS2V5IHx8IGV2ZW50LnR5cGUgPT09ICd3aGVlbCcpICYmICFldmVudC5idXR0b247XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRFeHRlbnQoKSB7XG4gIHZhciBlID0gdGhpcztcbiAgaWYgKGUgaW5zdGFuY2VvZiBTVkdFbGVtZW50KSB7XG4gICAgZSA9IGUub3duZXJTVkdFbGVtZW50IHx8IGU7XG4gICAgaWYgKGUuaGFzQXR0cmlidXRlKFwidmlld0JveFwiKSkge1xuICAgICAgZSA9IGUudmlld0JveC5iYXNlVmFsO1xuICAgICAgcmV0dXJuIFtbZS54LCBlLnldLCBbZS54ICsgZS53aWR0aCwgZS55ICsgZS5oZWlnaHRdXTtcbiAgICB9XG4gICAgcmV0dXJuIFtbMCwgMF0sIFtlLndpZHRoLmJhc2VWYWwudmFsdWUsIGUuaGVpZ2h0LmJhc2VWYWwudmFsdWVdXTtcbiAgfVxuICByZXR1cm4gW1swLCAwXSwgW2UuY2xpZW50V2lkdGgsIGUuY2xpZW50SGVpZ2h0XV07XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRUcmFuc2Zvcm0oKSB7XG4gIHJldHVybiB0aGlzLl9fem9vbSB8fCBpZGVudGl0eTtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdFdoZWVsRGVsdGEoZXZlbnQpIHtcbiAgcmV0dXJuIC1ldmVudC5kZWx0YVkgKiAoZXZlbnQuZGVsdGFNb2RlID09PSAxID8gMC4wNSA6IGV2ZW50LmRlbHRhTW9kZSA/IDEgOiAwLjAwMikgKiAoZXZlbnQuY3RybEtleSA/IDEwIDogMSk7XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRUb3VjaGFibGUoKSB7XG4gIHJldHVybiBuYXZpZ2F0b3IubWF4VG91Y2hQb2ludHMgfHwgKFwib250b3VjaHN0YXJ0XCIgaW4gdGhpcyk7XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRDb25zdHJhaW4odHJhbnNmb3JtLCBleHRlbnQsIHRyYW5zbGF0ZUV4dGVudCkge1xuICB2YXIgZHgwID0gdHJhbnNmb3JtLmludmVydFgoZXh0ZW50WzBdWzBdKSAtIHRyYW5zbGF0ZUV4dGVudFswXVswXSxcbiAgICAgIGR4MSA9IHRyYW5zZm9ybS5pbnZlcnRYKGV4dGVudFsxXVswXSkgLSB0cmFuc2xhdGVFeHRlbnRbMV1bMF0sXG4gICAgICBkeTAgPSB0cmFuc2Zvcm0uaW52ZXJ0WShleHRlbnRbMF1bMV0pIC0gdHJhbnNsYXRlRXh0ZW50WzBdWzFdLFxuICAgICAgZHkxID0gdHJhbnNmb3JtLmludmVydFkoZXh0ZW50WzFdWzFdKSAtIHRyYW5zbGF0ZUV4dGVudFsxXVsxXTtcbiAgcmV0dXJuIHRyYW5zZm9ybS50cmFuc2xhdGUoXG4gICAgZHgxID4gZHgwID8gKGR4MCArIGR4MSkgLyAyIDogTWF0aC5taW4oMCwgZHgwKSB8fCBNYXRoLm1heCgwLCBkeDEpLFxuICAgIGR5MSA+IGR5MCA/IChkeTAgKyBkeTEpIC8gMiA6IE1hdGgubWluKDAsIGR5MCkgfHwgTWF0aC5tYXgoMCwgZHkxKVxuICApO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgdmFyIGZpbHRlciA9IGRlZmF1bHRGaWx0ZXIsXG4gICAgICBleHRlbnQgPSBkZWZhdWx0RXh0ZW50LFxuICAgICAgY29uc3RyYWluID0gZGVmYXVsdENvbnN0cmFpbixcbiAgICAgIHdoZWVsRGVsdGEgPSBkZWZhdWx0V2hlZWxEZWx0YSxcbiAgICAgIHRvdWNoYWJsZSA9IGRlZmF1bHRUb3VjaGFibGUsXG4gICAgICBzY2FsZUV4dGVudCA9IFswLCBJbmZpbml0eV0sXG4gICAgICB0cmFuc2xhdGVFeHRlbnQgPSBbWy1JbmZpbml0eSwgLUluZmluaXR5XSwgW0luZmluaXR5LCBJbmZpbml0eV1dLFxuICAgICAgZHVyYXRpb24gPSAyNTAsXG4gICAgICBpbnRlcnBvbGF0ZSA9IGludGVycG9sYXRlWm9vbSxcbiAgICAgIGxpc3RlbmVycyA9IGRpc3BhdGNoKFwic3RhcnRcIiwgXCJ6b29tXCIsIFwiZW5kXCIpLFxuICAgICAgdG91Y2hzdGFydGluZyxcbiAgICAgIHRvdWNoZmlyc3QsXG4gICAgICB0b3VjaGVuZGluZyxcbiAgICAgIHRvdWNoRGVsYXkgPSA1MDAsXG4gICAgICB3aGVlbERlbGF5ID0gMTUwLFxuICAgICAgY2xpY2tEaXN0YW5jZTIgPSAwLFxuICAgICAgdGFwRGlzdGFuY2UgPSAxMDtcblxuICBmdW5jdGlvbiB6b29tKHNlbGVjdGlvbikge1xuICAgIHNlbGVjdGlvblxuICAgICAgICAucHJvcGVydHkoXCJfX3pvb21cIiwgZGVmYXVsdFRyYW5zZm9ybSlcbiAgICAgICAgLm9uKFwid2hlZWwuem9vbVwiLCB3aGVlbGVkLCB7cGFzc2l2ZTogZmFsc2V9KVxuICAgICAgICAub24oXCJtb3VzZWRvd24uem9vbVwiLCBtb3VzZWRvd25lZClcbiAgICAgICAgLm9uKFwiZGJsY2xpY2suem9vbVwiLCBkYmxjbGlja2VkKVxuICAgICAgLmZpbHRlcih0b3VjaGFibGUpXG4gICAgICAgIC5vbihcInRvdWNoc3RhcnQuem9vbVwiLCB0b3VjaHN0YXJ0ZWQpXG4gICAgICAgIC5vbihcInRvdWNobW92ZS56b29tXCIsIHRvdWNobW92ZWQpXG4gICAgICAgIC5vbihcInRvdWNoZW5kLnpvb20gdG91Y2hjYW5jZWwuem9vbVwiLCB0b3VjaGVuZGVkKVxuICAgICAgICAuc3R5bGUoXCItd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3JcIiwgXCJyZ2JhKDAsMCwwLDApXCIpO1xuICB9XG5cbiAgem9vbS50cmFuc2Zvcm0gPSBmdW5jdGlvbihjb2xsZWN0aW9uLCB0cmFuc2Zvcm0sIHBvaW50LCBldmVudCkge1xuICAgIHZhciBzZWxlY3Rpb24gPSBjb2xsZWN0aW9uLnNlbGVjdGlvbiA/IGNvbGxlY3Rpb24uc2VsZWN0aW9uKCkgOiBjb2xsZWN0aW9uO1xuICAgIHNlbGVjdGlvbi5wcm9wZXJ0eShcIl9fem9vbVwiLCBkZWZhdWx0VHJhbnNmb3JtKTtcbiAgICBpZiAoY29sbGVjdGlvbiAhPT0gc2VsZWN0aW9uKSB7XG4gICAgICBzY2hlZHVsZShjb2xsZWN0aW9uLCB0cmFuc2Zvcm0sIHBvaW50LCBldmVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNlbGVjdGlvbi5pbnRlcnJ1cHQoKS5lYWNoKGZ1bmN0aW9uKCkge1xuICAgICAgICBnZXN0dXJlKHRoaXMsIGFyZ3VtZW50cylcbiAgICAgICAgICAuZXZlbnQoZXZlbnQpXG4gICAgICAgICAgLnN0YXJ0KClcbiAgICAgICAgICAuem9vbShudWxsLCB0eXBlb2YgdHJhbnNmb3JtID09PSBcImZ1bmN0aW9uXCIgPyB0cmFuc2Zvcm0uYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IHRyYW5zZm9ybSlcbiAgICAgICAgICAuZW5kKCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgem9vbS5zY2FsZUJ5ID0gZnVuY3Rpb24oc2VsZWN0aW9uLCBrLCBwLCBldmVudCkge1xuICAgIHpvb20uc2NhbGVUbyhzZWxlY3Rpb24sIGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGswID0gdGhpcy5fX3pvb20uayxcbiAgICAgICAgICBrMSA9IHR5cGVvZiBrID09PSBcImZ1bmN0aW9uXCIgPyBrLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiBrO1xuICAgICAgcmV0dXJuIGswICogazE7XG4gICAgfSwgcCwgZXZlbnQpO1xuICB9O1xuXG4gIHpvb20uc2NhbGVUbyA9IGZ1bmN0aW9uKHNlbGVjdGlvbiwgaywgcCwgZXZlbnQpIHtcbiAgICB6b29tLnRyYW5zZm9ybShzZWxlY3Rpb24sIGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGUgPSBleHRlbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSxcbiAgICAgICAgICB0MCA9IHRoaXMuX196b29tLFxuICAgICAgICAgIHAwID0gcCA9PSBudWxsID8gY2VudHJvaWQoZSkgOiB0eXBlb2YgcCA9PT0gXCJmdW5jdGlvblwiID8gcC5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogcCxcbiAgICAgICAgICBwMSA9IHQwLmludmVydChwMCksXG4gICAgICAgICAgazEgPSB0eXBlb2YgayA9PT0gXCJmdW5jdGlvblwiID8gay5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogaztcbiAgICAgIHJldHVybiBjb25zdHJhaW4odHJhbnNsYXRlKHNjYWxlKHQwLCBrMSksIHAwLCBwMSksIGUsIHRyYW5zbGF0ZUV4dGVudCk7XG4gICAgfSwgcCwgZXZlbnQpO1xuICB9O1xuXG4gIHpvb20udHJhbnNsYXRlQnkgPSBmdW5jdGlvbihzZWxlY3Rpb24sIHgsIHksIGV2ZW50KSB7XG4gICAgem9vbS50cmFuc2Zvcm0oc2VsZWN0aW9uLCBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBjb25zdHJhaW4odGhpcy5fX3pvb20udHJhbnNsYXRlKFxuICAgICAgICB0eXBlb2YgeCA9PT0gXCJmdW5jdGlvblwiID8geC5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogeCxcbiAgICAgICAgdHlwZW9mIHkgPT09IFwiZnVuY3Rpb25cIiA/IHkuYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IHlcbiAgICAgICksIGV4dGVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpLCB0cmFuc2xhdGVFeHRlbnQpO1xuICAgIH0sIG51bGwsIGV2ZW50KTtcbiAgfTtcblxuICB6b29tLnRyYW5zbGF0ZVRvID0gZnVuY3Rpb24oc2VsZWN0aW9uLCB4LCB5LCBwLCBldmVudCkge1xuICAgIHpvb20udHJhbnNmb3JtKHNlbGVjdGlvbiwgZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgZSA9IGV4dGVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpLFxuICAgICAgICAgIHQgPSB0aGlzLl9fem9vbSxcbiAgICAgICAgICBwMCA9IHAgPT0gbnVsbCA/IGNlbnRyb2lkKGUpIDogdHlwZW9mIHAgPT09IFwiZnVuY3Rpb25cIiA/IHAuYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IHA7XG4gICAgICByZXR1cm4gY29uc3RyYWluKGlkZW50aXR5LnRyYW5zbGF0ZShwMFswXSwgcDBbMV0pLnNjYWxlKHQuaykudHJhbnNsYXRlKFxuICAgICAgICB0eXBlb2YgeCA9PT0gXCJmdW5jdGlvblwiID8gLXguYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IC14LFxuICAgICAgICB0eXBlb2YgeSA9PT0gXCJmdW5jdGlvblwiID8gLXkuYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IC15XG4gICAgICApLCBlLCB0cmFuc2xhdGVFeHRlbnQpO1xuICAgIH0sIHAsIGV2ZW50KTtcbiAgfTtcblxuICBmdW5jdGlvbiBzY2FsZSh0cmFuc2Zvcm0sIGspIHtcbiAgICBrID0gTWF0aC5tYXgoc2NhbGVFeHRlbnRbMF0sIE1hdGgubWluKHNjYWxlRXh0ZW50WzFdLCBrKSk7XG4gICAgcmV0dXJuIGsgPT09IHRyYW5zZm9ybS5rID8gdHJhbnNmb3JtIDogbmV3IFRyYW5zZm9ybShrLCB0cmFuc2Zvcm0ueCwgdHJhbnNmb3JtLnkpO1xuICB9XG5cbiAgZnVuY3Rpb24gdHJhbnNsYXRlKHRyYW5zZm9ybSwgcDAsIHAxKSB7XG4gICAgdmFyIHggPSBwMFswXSAtIHAxWzBdICogdHJhbnNmb3JtLmssIHkgPSBwMFsxXSAtIHAxWzFdICogdHJhbnNmb3JtLms7XG4gICAgcmV0dXJuIHggPT09IHRyYW5zZm9ybS54ICYmIHkgPT09IHRyYW5zZm9ybS55ID8gdHJhbnNmb3JtIDogbmV3IFRyYW5zZm9ybSh0cmFuc2Zvcm0uaywgeCwgeSk7XG4gIH1cblxuICBmdW5jdGlvbiBjZW50cm9pZChleHRlbnQpIHtcbiAgICByZXR1cm4gWygrZXh0ZW50WzBdWzBdICsgK2V4dGVudFsxXVswXSkgLyAyLCAoK2V4dGVudFswXVsxXSArICtleHRlbnRbMV1bMV0pIC8gMl07XG4gIH1cblxuICBmdW5jdGlvbiBzY2hlZHVsZSh0cmFuc2l0aW9uLCB0cmFuc2Zvcm0sIHBvaW50LCBldmVudCkge1xuICAgIHRyYW5zaXRpb25cbiAgICAgICAgLm9uKFwic3RhcnQuem9vbVwiLCBmdW5jdGlvbigpIHsgZ2VzdHVyZSh0aGlzLCBhcmd1bWVudHMpLmV2ZW50KGV2ZW50KS5zdGFydCgpOyB9KVxuICAgICAgICAub24oXCJpbnRlcnJ1cHQuem9vbSBlbmQuem9vbVwiLCBmdW5jdGlvbigpIHsgZ2VzdHVyZSh0aGlzLCBhcmd1bWVudHMpLmV2ZW50KGV2ZW50KS5lbmQoKTsgfSlcbiAgICAgICAgLnR3ZWVuKFwiem9vbVwiLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsXG4gICAgICAgICAgICAgIGFyZ3MgPSBhcmd1bWVudHMsXG4gICAgICAgICAgICAgIGcgPSBnZXN0dXJlKHRoYXQsIGFyZ3MpLmV2ZW50KGV2ZW50KSxcbiAgICAgICAgICAgICAgZSA9IGV4dGVudC5hcHBseSh0aGF0LCBhcmdzKSxcbiAgICAgICAgICAgICAgcCA9IHBvaW50ID09IG51bGwgPyBjZW50cm9pZChlKSA6IHR5cGVvZiBwb2ludCA9PT0gXCJmdW5jdGlvblwiID8gcG9pbnQuYXBwbHkodGhhdCwgYXJncykgOiBwb2ludCxcbiAgICAgICAgICAgICAgdyA9IE1hdGgubWF4KGVbMV1bMF0gLSBlWzBdWzBdLCBlWzFdWzFdIC0gZVswXVsxXSksXG4gICAgICAgICAgICAgIGEgPSB0aGF0Ll9fem9vbSxcbiAgICAgICAgICAgICAgYiA9IHR5cGVvZiB0cmFuc2Zvcm0gPT09IFwiZnVuY3Rpb25cIiA/IHRyYW5zZm9ybS5hcHBseSh0aGF0LCBhcmdzKSA6IHRyYW5zZm9ybSxcbiAgICAgICAgICAgICAgaSA9IGludGVycG9sYXRlKGEuaW52ZXJ0KHApLmNvbmNhdCh3IC8gYS5rKSwgYi5pbnZlcnQocCkuY29uY2F0KHcgLyBiLmspKTtcbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgaWYgKHQgPT09IDEpIHQgPSBiOyAvLyBBdm9pZCByb3VuZGluZyBlcnJvciBvbiBlbmQuXG4gICAgICAgICAgICBlbHNlIHsgdmFyIGwgPSBpKHQpLCBrID0gdyAvIGxbMl07IHQgPSBuZXcgVHJhbnNmb3JtKGssIHBbMF0gLSBsWzBdICogaywgcFsxXSAtIGxbMV0gKiBrKTsgfVxuICAgICAgICAgICAgZy56b29tKG51bGwsIHQpO1xuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2VzdHVyZSh0aGF0LCBhcmdzLCBjbGVhbikge1xuICAgIHJldHVybiAoIWNsZWFuICYmIHRoYXQuX196b29taW5nKSB8fCBuZXcgR2VzdHVyZSh0aGF0LCBhcmdzKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIEdlc3R1cmUodGhhdCwgYXJncykge1xuICAgIHRoaXMudGhhdCA9IHRoYXQ7XG4gICAgdGhpcy5hcmdzID0gYXJncztcbiAgICB0aGlzLmFjdGl2ZSA9IDA7XG4gICAgdGhpcy5zb3VyY2VFdmVudCA9IG51bGw7XG4gICAgdGhpcy5leHRlbnQgPSBleHRlbnQuYXBwbHkodGhhdCwgYXJncyk7XG4gICAgdGhpcy50YXBzID0gMDtcbiAgfVxuXG4gIEdlc3R1cmUucHJvdG90eXBlID0ge1xuICAgIGV2ZW50OiBmdW5jdGlvbihldmVudCkge1xuICAgICAgaWYgKGV2ZW50KSB0aGlzLnNvdXJjZUV2ZW50ID0gZXZlbnQ7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIHN0YXJ0OiBmdW5jdGlvbigpIHtcbiAgICAgIGlmICgrK3RoaXMuYWN0aXZlID09PSAxKSB7XG4gICAgICAgIHRoaXMudGhhdC5fX3pvb21pbmcgPSB0aGlzO1xuICAgICAgICB0aGlzLmVtaXQoXCJzdGFydFwiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgem9vbTogZnVuY3Rpb24oa2V5LCB0cmFuc2Zvcm0pIHtcbiAgICAgIGlmICh0aGlzLm1vdXNlICYmIGtleSAhPT0gXCJtb3VzZVwiKSB0aGlzLm1vdXNlWzFdID0gdHJhbnNmb3JtLmludmVydCh0aGlzLm1vdXNlWzBdKTtcbiAgICAgIGlmICh0aGlzLnRvdWNoMCAmJiBrZXkgIT09IFwidG91Y2hcIikgdGhpcy50b3VjaDBbMV0gPSB0cmFuc2Zvcm0uaW52ZXJ0KHRoaXMudG91Y2gwWzBdKTtcbiAgICAgIGlmICh0aGlzLnRvdWNoMSAmJiBrZXkgIT09IFwidG91Y2hcIikgdGhpcy50b3VjaDFbMV0gPSB0cmFuc2Zvcm0uaW52ZXJ0KHRoaXMudG91Y2gxWzBdKTtcbiAgICAgIHRoaXMudGhhdC5fX3pvb20gPSB0cmFuc2Zvcm07XG4gICAgICB0aGlzLmVtaXQoXCJ6b29tXCIpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICBlbmQ6IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKC0tdGhpcy5hY3RpdmUgPT09IDApIHtcbiAgICAgICAgZGVsZXRlIHRoaXMudGhhdC5fX3pvb21pbmc7XG4gICAgICAgIHRoaXMuZW1pdChcImVuZFwiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgZW1pdDogZnVuY3Rpb24odHlwZSkge1xuICAgICAgdmFyIGQgPSBzZWxlY3QodGhpcy50aGF0KS5kYXR1bSgpO1xuICAgICAgbGlzdGVuZXJzLmNhbGwoXG4gICAgICAgIHR5cGUsXG4gICAgICAgIHRoaXMudGhhdCxcbiAgICAgICAgbmV3IFpvb21FdmVudCh0eXBlLCB7XG4gICAgICAgICAgc291cmNlRXZlbnQ6IHRoaXMuc291cmNlRXZlbnQsXG4gICAgICAgICAgdGFyZ2V0OiB6b29tLFxuICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgdHJhbnNmb3JtOiB0aGlzLnRoYXQuX196b29tLFxuICAgICAgICAgIGRpc3BhdGNoOiBsaXN0ZW5lcnNcbiAgICAgICAgfSksXG4gICAgICAgIGRcbiAgICAgICk7XG4gICAgfVxuICB9O1xuXG4gIGZ1bmN0aW9uIHdoZWVsZWQoZXZlbnQsIC4uLmFyZ3MpIHtcbiAgICBpZiAoIWZpbHRlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpKSByZXR1cm47XG4gICAgdmFyIGcgPSBnZXN0dXJlKHRoaXMsIGFyZ3MpLmV2ZW50KGV2ZW50KSxcbiAgICAgICAgdCA9IHRoaXMuX196b29tLFxuICAgICAgICBrID0gTWF0aC5tYXgoc2NhbGVFeHRlbnRbMF0sIE1hdGgubWluKHNjYWxlRXh0ZW50WzFdLCB0LmsgKiBNYXRoLnBvdygyLCB3aGVlbERlbHRhLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpKSksXG4gICAgICAgIHAgPSBwb2ludGVyKGV2ZW50KTtcblxuICAgIC8vIElmIHRoZSBtb3VzZSBpcyBpbiB0aGUgc2FtZSBsb2NhdGlvbiBhcyBiZWZvcmUsIHJldXNlIGl0LlxuICAgIC8vIElmIHRoZXJlIHdlcmUgcmVjZW50IHdoZWVsIGV2ZW50cywgcmVzZXQgdGhlIHdoZWVsIGlkbGUgdGltZW91dC5cbiAgICBpZiAoZy53aGVlbCkge1xuICAgICAgaWYgKGcubW91c2VbMF1bMF0gIT09IHBbMF0gfHwgZy5tb3VzZVswXVsxXSAhPT0gcFsxXSkge1xuICAgICAgICBnLm1vdXNlWzFdID0gdC5pbnZlcnQoZy5tb3VzZVswXSA9IHApO1xuICAgICAgfVxuICAgICAgY2xlYXJUaW1lb3V0KGcud2hlZWwpO1xuICAgIH1cblxuICAgIC8vIElmIHRoaXMgd2hlZWwgZXZlbnQgd29u4oCZdCB0cmlnZ2VyIGEgdHJhbnNmb3JtIGNoYW5nZSwgaWdub3JlIGl0LlxuICAgIGVsc2UgaWYgKHQuayA9PT0gaykgcmV0dXJuO1xuXG4gICAgLy8gT3RoZXJ3aXNlLCBjYXB0dXJlIHRoZSBtb3VzZSBwb2ludCBhbmQgbG9jYXRpb24gYXQgdGhlIHN0YXJ0LlxuICAgIGVsc2Uge1xuICAgICAgZy5tb3VzZSA9IFtwLCB0LmludmVydChwKV07XG4gICAgICBpbnRlcnJ1cHQodGhpcyk7XG4gICAgICBnLnN0YXJ0KCk7XG4gICAgfVxuXG4gICAgbm9ldmVudChldmVudCk7XG4gICAgZy53aGVlbCA9IHNldFRpbWVvdXQod2hlZWxpZGxlZCwgd2hlZWxEZWxheSk7XG4gICAgZy56b29tKFwibW91c2VcIiwgY29uc3RyYWluKHRyYW5zbGF0ZShzY2FsZSh0LCBrKSwgZy5tb3VzZVswXSwgZy5tb3VzZVsxXSksIGcuZXh0ZW50LCB0cmFuc2xhdGVFeHRlbnQpKTtcblxuICAgIGZ1bmN0aW9uIHdoZWVsaWRsZWQoKSB7XG4gICAgICBnLndoZWVsID0gbnVsbDtcbiAgICAgIGcuZW5kKCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gbW91c2Vkb3duZWQoZXZlbnQsIC4uLmFyZ3MpIHtcbiAgICBpZiAodG91Y2hlbmRpbmcgfHwgIWZpbHRlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpKSByZXR1cm47XG4gICAgdmFyIGN1cnJlbnRUYXJnZXQgPSBldmVudC5jdXJyZW50VGFyZ2V0LFxuICAgICAgICBnID0gZ2VzdHVyZSh0aGlzLCBhcmdzLCB0cnVlKS5ldmVudChldmVudCksXG4gICAgICAgIHYgPSBzZWxlY3QoZXZlbnQudmlldykub24oXCJtb3VzZW1vdmUuem9vbVwiLCBtb3VzZW1vdmVkLCB0cnVlKS5vbihcIm1vdXNldXAuem9vbVwiLCBtb3VzZXVwcGVkLCB0cnVlKSxcbiAgICAgICAgcCA9IHBvaW50ZXIoZXZlbnQsIGN1cnJlbnRUYXJnZXQpLFxuICAgICAgICB4MCA9IGV2ZW50LmNsaWVudFgsXG4gICAgICAgIHkwID0gZXZlbnQuY2xpZW50WTtcblxuICAgIGRyYWdEaXNhYmxlKGV2ZW50LnZpZXcpO1xuICAgIG5vcHJvcGFnYXRpb24oZXZlbnQpO1xuICAgIGcubW91c2UgPSBbcCwgdGhpcy5fX3pvb20uaW52ZXJ0KHApXTtcbiAgICBpbnRlcnJ1cHQodGhpcyk7XG4gICAgZy5zdGFydCgpO1xuXG4gICAgZnVuY3Rpb24gbW91c2Vtb3ZlZChldmVudCkge1xuICAgICAgbm9ldmVudChldmVudCk7XG4gICAgICBpZiAoIWcubW92ZWQpIHtcbiAgICAgICAgdmFyIGR4ID0gZXZlbnQuY2xpZW50WCAtIHgwLCBkeSA9IGV2ZW50LmNsaWVudFkgLSB5MDtcbiAgICAgICAgZy5tb3ZlZCA9IGR4ICogZHggKyBkeSAqIGR5ID4gY2xpY2tEaXN0YW5jZTI7XG4gICAgICB9XG4gICAgICBnLmV2ZW50KGV2ZW50KVxuICAgICAgIC56b29tKFwibW91c2VcIiwgY29uc3RyYWluKHRyYW5zbGF0ZShnLnRoYXQuX196b29tLCBnLm1vdXNlWzBdID0gcG9pbnRlcihldmVudCwgY3VycmVudFRhcmdldCksIGcubW91c2VbMV0pLCBnLmV4dGVudCwgdHJhbnNsYXRlRXh0ZW50KSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbW91c2V1cHBlZChldmVudCkge1xuICAgICAgdi5vbihcIm1vdXNlbW92ZS56b29tIG1vdXNldXAuem9vbVwiLCBudWxsKTtcbiAgICAgIGRyYWdFbmFibGUoZXZlbnQudmlldywgZy5tb3ZlZCk7XG4gICAgICBub2V2ZW50KGV2ZW50KTtcbiAgICAgIGcuZXZlbnQoZXZlbnQpLmVuZCgpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGRibGNsaWNrZWQoZXZlbnQsIC4uLmFyZ3MpIHtcbiAgICBpZiAoIWZpbHRlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpKSByZXR1cm47XG4gICAgdmFyIHQwID0gdGhpcy5fX3pvb20sXG4gICAgICAgIHAwID0gcG9pbnRlcihldmVudC5jaGFuZ2VkVG91Y2hlcyA/IGV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdIDogZXZlbnQsIHRoaXMpLFxuICAgICAgICBwMSA9IHQwLmludmVydChwMCksXG4gICAgICAgIGsxID0gdDAuayAqIChldmVudC5zaGlmdEtleSA/IDAuNSA6IDIpLFxuICAgICAgICB0MSA9IGNvbnN0cmFpbih0cmFuc2xhdGUoc2NhbGUodDAsIGsxKSwgcDAsIHAxKSwgZXh0ZW50LmFwcGx5KHRoaXMsIGFyZ3MpLCB0cmFuc2xhdGVFeHRlbnQpO1xuXG4gICAgbm9ldmVudChldmVudCk7XG4gICAgaWYgKGR1cmF0aW9uID4gMCkgc2VsZWN0KHRoaXMpLnRyYW5zaXRpb24oKS5kdXJhdGlvbihkdXJhdGlvbikuY2FsbChzY2hlZHVsZSwgdDEsIHAwLCBldmVudCk7XG4gICAgZWxzZSBzZWxlY3QodGhpcykuY2FsbCh6b29tLnRyYW5zZm9ybSwgdDEsIHAwLCBldmVudCk7XG4gIH1cblxuICBmdW5jdGlvbiB0b3VjaHN0YXJ0ZWQoZXZlbnQsIC4uLmFyZ3MpIHtcbiAgICBpZiAoIWZpbHRlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpKSByZXR1cm47XG4gICAgdmFyIHRvdWNoZXMgPSBldmVudC50b3VjaGVzLFxuICAgICAgICBuID0gdG91Y2hlcy5sZW5ndGgsXG4gICAgICAgIGcgPSBnZXN0dXJlKHRoaXMsIGFyZ3MsIGV2ZW50LmNoYW5nZWRUb3VjaGVzLmxlbmd0aCA9PT0gbikuZXZlbnQoZXZlbnQpLFxuICAgICAgICBzdGFydGVkLCBpLCB0LCBwO1xuXG4gICAgbm9wcm9wYWdhdGlvbihldmVudCk7XG4gICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgdCA9IHRvdWNoZXNbaV0sIHAgPSBwb2ludGVyKHQsIHRoaXMpO1xuICAgICAgcCA9IFtwLCB0aGlzLl9fem9vbS5pbnZlcnQocCksIHQuaWRlbnRpZmllcl07XG4gICAgICBpZiAoIWcudG91Y2gwKSBnLnRvdWNoMCA9IHAsIHN0YXJ0ZWQgPSB0cnVlLCBnLnRhcHMgPSAxICsgISF0b3VjaHN0YXJ0aW5nO1xuICAgICAgZWxzZSBpZiAoIWcudG91Y2gxICYmIGcudG91Y2gwWzJdICE9PSBwWzJdKSBnLnRvdWNoMSA9IHAsIGcudGFwcyA9IDA7XG4gICAgfVxuXG4gICAgaWYgKHRvdWNoc3RhcnRpbmcpIHRvdWNoc3RhcnRpbmcgPSBjbGVhclRpbWVvdXQodG91Y2hzdGFydGluZyk7XG5cbiAgICBpZiAoc3RhcnRlZCkge1xuICAgICAgaWYgKGcudGFwcyA8IDIpIHRvdWNoZmlyc3QgPSBwWzBdLCB0b3VjaHN0YXJ0aW5nID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsgdG91Y2hzdGFydGluZyA9IG51bGw7IH0sIHRvdWNoRGVsYXkpO1xuICAgICAgaW50ZXJydXB0KHRoaXMpO1xuICAgICAgZy5zdGFydCgpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHRvdWNobW92ZWQoZXZlbnQsIC4uLmFyZ3MpIHtcbiAgICBpZiAoIXRoaXMuX196b29taW5nKSByZXR1cm47XG4gICAgdmFyIGcgPSBnZXN0dXJlKHRoaXMsIGFyZ3MpLmV2ZW50KGV2ZW50KSxcbiAgICAgICAgdG91Y2hlcyA9IGV2ZW50LmNoYW5nZWRUb3VjaGVzLFxuICAgICAgICBuID0gdG91Y2hlcy5sZW5ndGgsIGksIHQsIHAsIGw7XG5cbiAgICBub2V2ZW50KGV2ZW50KTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICB0ID0gdG91Y2hlc1tpXSwgcCA9IHBvaW50ZXIodCwgdGhpcyk7XG4gICAgICBpZiAoZy50b3VjaDAgJiYgZy50b3VjaDBbMl0gPT09IHQuaWRlbnRpZmllcikgZy50b3VjaDBbMF0gPSBwO1xuICAgICAgZWxzZSBpZiAoZy50b3VjaDEgJiYgZy50b3VjaDFbMl0gPT09IHQuaWRlbnRpZmllcikgZy50b3VjaDFbMF0gPSBwO1xuICAgIH1cbiAgICB0ID0gZy50aGF0Ll9fem9vbTtcbiAgICBpZiAoZy50b3VjaDEpIHtcbiAgICAgIHZhciBwMCA9IGcudG91Y2gwWzBdLCBsMCA9IGcudG91Y2gwWzFdLFxuICAgICAgICAgIHAxID0gZy50b3VjaDFbMF0sIGwxID0gZy50b3VjaDFbMV0sXG4gICAgICAgICAgZHAgPSAoZHAgPSBwMVswXSAtIHAwWzBdKSAqIGRwICsgKGRwID0gcDFbMV0gLSBwMFsxXSkgKiBkcCxcbiAgICAgICAgICBkbCA9IChkbCA9IGwxWzBdIC0gbDBbMF0pICogZGwgKyAoZGwgPSBsMVsxXSAtIGwwWzFdKSAqIGRsO1xuICAgICAgdCA9IHNjYWxlKHQsIE1hdGguc3FydChkcCAvIGRsKSk7XG4gICAgICBwID0gWyhwMFswXSArIHAxWzBdKSAvIDIsIChwMFsxXSArIHAxWzFdKSAvIDJdO1xuICAgICAgbCA9IFsobDBbMF0gKyBsMVswXSkgLyAyLCAobDBbMV0gKyBsMVsxXSkgLyAyXTtcbiAgICB9XG4gICAgZWxzZSBpZiAoZy50b3VjaDApIHAgPSBnLnRvdWNoMFswXSwgbCA9IGcudG91Y2gwWzFdO1xuICAgIGVsc2UgcmV0dXJuO1xuXG4gICAgZy56b29tKFwidG91Y2hcIiwgY29uc3RyYWluKHRyYW5zbGF0ZSh0LCBwLCBsKSwgZy5leHRlbnQsIHRyYW5zbGF0ZUV4dGVudCkpO1xuICB9XG5cbiAgZnVuY3Rpb24gdG91Y2hlbmRlZChldmVudCwgLi4uYXJncykge1xuICAgIGlmICghdGhpcy5fX3pvb21pbmcpIHJldHVybjtcbiAgICB2YXIgZyA9IGdlc3R1cmUodGhpcywgYXJncykuZXZlbnQoZXZlbnQpLFxuICAgICAgICB0b3VjaGVzID0gZXZlbnQuY2hhbmdlZFRvdWNoZXMsXG4gICAgICAgIG4gPSB0b3VjaGVzLmxlbmd0aCwgaSwgdDtcblxuICAgIG5vcHJvcGFnYXRpb24oZXZlbnQpO1xuICAgIGlmICh0b3VjaGVuZGluZykgY2xlYXJUaW1lb3V0KHRvdWNoZW5kaW5nKTtcbiAgICB0b3VjaGVuZGluZyA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IHRvdWNoZW5kaW5nID0gbnVsbDsgfSwgdG91Y2hEZWxheSk7XG4gICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgdCA9IHRvdWNoZXNbaV07XG4gICAgICBpZiAoZy50b3VjaDAgJiYgZy50b3VjaDBbMl0gPT09IHQuaWRlbnRpZmllcikgZGVsZXRlIGcudG91Y2gwO1xuICAgICAgZWxzZSBpZiAoZy50b3VjaDEgJiYgZy50b3VjaDFbMl0gPT09IHQuaWRlbnRpZmllcikgZGVsZXRlIGcudG91Y2gxO1xuICAgIH1cbiAgICBpZiAoZy50b3VjaDEgJiYgIWcudG91Y2gwKSBnLnRvdWNoMCA9IGcudG91Y2gxLCBkZWxldGUgZy50b3VjaDE7XG4gICAgaWYgKGcudG91Y2gwKSBnLnRvdWNoMFsxXSA9IHRoaXMuX196b29tLmludmVydChnLnRvdWNoMFswXSk7XG4gICAgZWxzZSB7XG4gICAgICBnLmVuZCgpO1xuICAgICAgLy8gSWYgdGhpcyB3YXMgYSBkYmx0YXAsIHJlcm91dGUgdG8gdGhlIChvcHRpb25hbCkgZGJsY2xpY2suem9vbSBoYW5kbGVyLlxuICAgICAgaWYgKGcudGFwcyA9PT0gMikge1xuICAgICAgICB0ID0gcG9pbnRlcih0LCB0aGlzKTtcbiAgICAgICAgaWYgKE1hdGguaHlwb3QodG91Y2hmaXJzdFswXSAtIHRbMF0sIHRvdWNoZmlyc3RbMV0gLSB0WzFdKSA8IHRhcERpc3RhbmNlKSB7XG4gICAgICAgICAgdmFyIHAgPSBzZWxlY3QodGhpcykub24oXCJkYmxjbGljay56b29tXCIpO1xuICAgICAgICAgIGlmIChwKSBwLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB6b29tLndoZWVsRGVsdGEgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAod2hlZWxEZWx0YSA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoK18pLCB6b29tKSA6IHdoZWVsRGVsdGE7XG4gIH07XG5cbiAgem9vbS5maWx0ZXIgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZmlsdGVyID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCghIV8pLCB6b29tKSA6IGZpbHRlcjtcbiAgfTtcblxuICB6b29tLnRvdWNoYWJsZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0b3VjaGFibGUgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCEhXyksIHpvb20pIDogdG91Y2hhYmxlO1xuICB9O1xuXG4gIHpvb20uZXh0ZW50ID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGV4dGVudCA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoW1srX1swXVswXSwgK19bMF1bMV1dLCBbK19bMV1bMF0sICtfWzFdWzFdXV0pLCB6b29tKSA6IGV4dGVudDtcbiAgfTtcblxuICB6b29tLnNjYWxlRXh0ZW50ID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNjYWxlRXh0ZW50WzBdID0gK19bMF0sIHNjYWxlRXh0ZW50WzFdID0gK19bMV0sIHpvb20pIDogW3NjYWxlRXh0ZW50WzBdLCBzY2FsZUV4dGVudFsxXV07XG4gIH07XG5cbiAgem9vbS50cmFuc2xhdGVFeHRlbnQgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodHJhbnNsYXRlRXh0ZW50WzBdWzBdID0gK19bMF1bMF0sIHRyYW5zbGF0ZUV4dGVudFsxXVswXSA9ICtfWzFdWzBdLCB0cmFuc2xhdGVFeHRlbnRbMF1bMV0gPSArX1swXVsxXSwgdHJhbnNsYXRlRXh0ZW50WzFdWzFdID0gK19bMV1bMV0sIHpvb20pIDogW1t0cmFuc2xhdGVFeHRlbnRbMF1bMF0sIHRyYW5zbGF0ZUV4dGVudFswXVsxXV0sIFt0cmFuc2xhdGVFeHRlbnRbMV1bMF0sIHRyYW5zbGF0ZUV4dGVudFsxXVsxXV1dO1xuICB9O1xuXG4gIHpvb20uY29uc3RyYWluID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGNvbnN0cmFpbiA9IF8sIHpvb20pIDogY29uc3RyYWluO1xuICB9O1xuXG4gIHpvb20uZHVyYXRpb24gPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZHVyYXRpb24gPSArXywgem9vbSkgOiBkdXJhdGlvbjtcbiAgfTtcblxuICB6b29tLmludGVycG9sYXRlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGludGVycG9sYXRlID0gXywgem9vbSkgOiBpbnRlcnBvbGF0ZTtcbiAgfTtcblxuICB6b29tLm9uID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHZhbHVlID0gbGlzdGVuZXJzLm9uLmFwcGx5KGxpc3RlbmVycywgYXJndW1lbnRzKTtcbiAgICByZXR1cm4gdmFsdWUgPT09IGxpc3RlbmVycyA/IHpvb20gOiB2YWx1ZTtcbiAgfTtcblxuICB6b29tLmNsaWNrRGlzdGFuY2UgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoY2xpY2tEaXN0YW5jZTIgPSAoXyA9ICtfKSAqIF8sIHpvb20pIDogTWF0aC5zcXJ0KGNsaWNrRGlzdGFuY2UyKTtcbiAgfTtcblxuICB6b29tLnRhcERpc3RhbmNlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRhcERpc3RhbmNlID0gK18sIHpvb20pIDogdGFwRGlzdGFuY2U7XG4gIH07XG5cbiAgcmV0dXJuIHpvb207XG59XG4iLCJpbXBvcnQgeyBzZWxlY3QgfSBmcm9tICdkMy1zZWxlY3Rpb24nXG5cbi8qKlxuICogUGFyZW50IGNsYXNzIGZvciBidXR0b24gZWxlbWVudHMgdXNlZCB0byBpbnRlcmFjdCB3aXRoIHRoZSBncmlkdml6IHZpZXdlci5cbiAqXG4gKiBAbW9kdWxlIGJ1dHRvblxuICogQGF1dGhvciBKb3NlcGggRGF2aWVzLCBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgQnV0dG9uIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0c1xuICAgICAqIG9wdHMucGFyZW50Tm9kZVxuICAgICAqIG9wdHMuaWRcbiAgICAgKiBvcHRzLnRpdGxlXG4gICAgICogb3B0cy5jbGFzc1xuICAgICAqIG9wdHMub25DbGlja0Z1bmN0aW9uXG4gICAgICogb3B0cy54XG4gICAgICogb3B0cy55XG4gICAgICovXG4gICAgY29uc3RydWN0b3Iob3B0cyA9IHt9KSB7XG4gICAgICAgIHRoaXMubWFwID0gb3B0cy5tYXBcbiAgICAgICAgdGhpcy5wYXJlbnROb2RlID0gb3B0cy5wYXJlbnROb2RlIHx8IG9wdHMubWFwLmNvbnRhaW5lclxuXG4gICAgICAgIC8vIHRoZSBkaXYgZWxlbWVudFxuICAgICAgICBpZiAob3B0cy5pZCkgdGhpcy5kaXYgPSBzZWxlY3QoJyMnICsgb3B0cy5pZClcblxuICAgICAgICBpZiAoIXRoaXMuZGl2IHx8IHRoaXMuZGl2LmVtcHR5KCkpIHtcbiAgICAgICAgICAgIHRoaXMuZGl2ID0gc2VsZWN0KGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKVxuICAgICAgICAgICAgaWYgKG9wdHMuaWQpIHRoaXMuZGl2LmF0dHIoJ2lkJywgb3B0cy5pZClcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRzLnRpdGxlKSB0aGlzLmRpdi5hdHRyKCd0aXRsZScsIG9wdHMudGl0bGUpXG4gICAgICAgIGlmIChvcHRzLmNsYXNzKSB0aGlzLmRpdi5hdHRyKCdjbGFzcycsIG9wdHMuY2xhc3MpXG5cbiAgICAgICAgLy8gYWRkIGV2ZW50c1xuICAgICAgICBpZiAob3B0cy5vbkNsaWNrRnVuY3Rpb24pIHRoaXMuZGl2Lm9uKCdjbGljaycsIG9wdHMub25DbGlja0Z1bmN0aW9uKVxuXG4gICAgICAgIC8vc2V0IHN0eWxlc1xuICAgICAgICB0aGlzLnN0eWxlKFxuICAgICAgICAgICAgJ2JveC1zaGFkb3cnLFxuICAgICAgICAgICAgJzAgN3B4IDhweCByZ2JhKDAsNDcsMTAzLC4wOCksIDAgMCAyMnB4IHJnYmEoMCw0NywxMDMsLjA0KSwgMCAxMnB4IDE3cHggcmdiYSgwLDQ3LDEwMywuMDQpLCAwIC00cHggNHB4IHJnYmEoMCw0NywxMDMsLjA0KSdcbiAgICAgICAgKSAvLy5lY2wtdS1zaGFkb3ctM1xuICAgICAgICB0aGlzLnN0eWxlKCdiYWNrZ3JvdW5kLWNvbG9yJywgJyNmZmZmZmYnKVxuICAgICAgICB0aGlzLnN0eWxlKCdwb3NpdGlvbicsICdhYnNvbHV0ZScpXG4gICAgICAgIHRoaXMuc3R5bGUoJ2N1cnNvcicsICdwb2ludGVyJylcbiAgICAgICAgdGhpcy5zdHlsZSgnZGlzcGxheScsICdmbGV4JylcbiAgICAgICAgdGhpcy5zdHlsZSgnanVzdGlmeS1jb250ZW50JywgJ2NlbnRlcicpXG4gICAgICAgIHRoaXMuc3R5bGUoJ2FsaWduLWl0ZW1zJywgJ2NlbnRlcicpXG4gICAgICAgIHRoaXMuc3R5bGUoJ3dpZHRoJywgJzM1cHgnKVxuICAgICAgICB0aGlzLnN0eWxlKCdoZWlnaHQnLCAnMzBweCcpXG4gICAgICAgIC8vIHRoaXMuc3R5bGUocGFkZGluZyAsICc0cHgnXG5cbiAgICAgICAgLy8gYXBwZW5kIHRvIHBhcmVudFxuICAgICAgICB0aGlzLnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQodGhpcy5kaXYubm9kZSgpKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFwcGx5IGEgc3R5bGUgdG8gdGhlIGJ1dHRvbiBkaXYuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdlxuICAgICAqIEByZXR1cm5zIHt0aGlzfVxuICAgICAqL1xuICAgIHN0eWxlKGssIHYpIHtcbiAgICAgICAgdGhpcy5kaXYuc3R5bGUoaywgdilcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBCdXR0b24gfSBmcm9tICcuL0J1dHRvbi5qcydcblxuLyoqXG4gKiBCdXR0b24gZm9yIHRvZ2dsaW5nIGZ1bGxzY3JlZW4gbW9kZVxuICpcbiAqIEBtb2R1bGUgYnV0dG9uXG4gKiBAYXV0aG9yIEpvc2VwaCBEYXZpZXMsIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBGdWxsc2NyZWVuQnV0dG9uIGV4dGVuZHMgQnV0dG9uIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0c1xuICAgICAqIG9wdHMucGFyZW50Tm9kZSAtIHRoZSBub2RlIHRoYXQgdGhlIGJ1dHRvbiBpcyBhcHBlbmRlZCB0b1xuICAgICAqIG9wdHMuY2FudmFzIC0gdGhlIGdyaWR2aXogY2FudmFzXG4gICAgICogb3B0cy5pZFxuICAgICAqIG9wdHMudGl0bGUgLSBIVE1MIHRpdGxlIGF0dHJpYnV0ZVxuICAgICAqIG9wdHMuY2xhc3MgLSBjc3MgY2xhc3NcbiAgICAgKiBvcHRzLm9uQ2xpY2tGdW5jdGlvblxuICAgICAqIG9wdHMueCAtIHggcG9zaXRpb24gb2YgdGhlIGJ1dHRvblxuICAgICAqIG9wdHMueSAtIHkgcG9zaXRpb24gb2YgdGhlIGJ1dHRvblxuICAgICAqL1xuXG4gICAgLy8gZGVmYXVsdCBzdGF0ZVxuICAgIGlzRnVsbHNjcmVlbiA9IGZhbHNlXG5cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpXG5cbiAgICAgICAgLy8gYXBwZW5kIGZ1bGxzY3JlZW4gaWNvbiB0byBidXR0b24gY29udGFpbmVyXG4gICAgICAgIHRoaXMuZGl2Lm5vZGUoKS5pbm5lckhUTUwgPSBgXG4gICAgICAgIDxzdmdcbiAgICAgICAgICAgIHN0eWxlPVwiaGVpZ2h0OiAxLjJyZW07IHdpZHRoOiAxLjJyZW07IGZpbGw6YmxhY2s7IG1hcmdpbjowO1wiXG4gICAgICAgICAgICBmb2N1c2FibGU9XCJmYWxzZVwiXG4gICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICA+XG4gICAgICAgICAgICA8c3ZnIGZpbGw9XCIjMDAwMDAwXCIgdmlld0JveD1cIjAgMCA5NiA5NlwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgIDx0aXRsZS8+XG4gICAgICAgICAgICA8Zz5cbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNMzAsMEg2QTUuOTk2Niw1Ljk5NjYsMCwwLDAsMCw2VjMwYTYsNiwwLDAsMCwxMiwwVjEySDMwQTYsNiwwLDAsMCwzMCwwWlwiLz5cbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNOTAsMEg2NmE2LDYsMCwwLDAsMCwxMkg4NFYzMGE2LDYsMCwwLDAsMTIsMFY2QTUuOTk2Niw1Ljk5NjYsMCwwLDAsOTAsMFpcIi8+XG4gICAgICAgICAgICA8cGF0aCBkPVwiTTMwLDg0SDEyVjY2QTYsNiwwLDAsMCwwLDY2VjkwYTUuOTk2Niw1Ljk5NjYsMCwwLDAsNiw2SDMwYTYsNiwwLDAsMCwwLTEyWlwiLz5cbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNOTAsNjBhNS45OTY2LDUuOTk2NiwwLDAsMC02LDZWODRINjZhNiw2LDAsMCwwLDAsMTJIOTBhNS45OTY2LDUuOTk2NiwwLDAsMCw2LTZWNjZBNS45OTY2LDUuOTk2NiwwLDAsMCw5MCw2MFpcIi8+XG4gICAgICAgICAgICA8L2c+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgPC9zdmc+XG4gICAgICAgIGBcblxuICAgICAgICAvL3NhdmUgaW5pdGlhbCBtYXAgZGltZW5zaW9uc1xuICAgICAgICB0aGlzLmRlZmF1bHRIZWlnaHQgPSB0aGlzLm1hcC5oXG4gICAgICAgIHRoaXMuZGVmYXVsdFdpZHRoID0gdGhpcy5tYXAud1xuXG4gICAgICAgIC8vIGV2ZW50IGhhbmRsZXJcbiAgICAgICAgdGhpcy5kaXYub24oJ2NsaWNrJywgKGUpID0+IHtcbiAgICAgICAgICAgIHRoaXMub25DbGlja0Z1bmN0aW9uKGUpXG4gICAgICAgIH0pXG4gICAgICAgIHRoaXMuZGl2Lm9uKCdtb3VzZW92ZXInLCAoZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zdHlsZSgnYmFja2dyb3VuZC1jb2xvcicsICdsaWdodGdyZXknKVxuICAgICAgICB9KVxuICAgICAgICB0aGlzLmRpdi5vbignbW91c2VvdXQnLCAoZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zdHlsZSgnYmFja2dyb3VuZC1jb2xvcicsICcjZmZmZmZmJylcbiAgICAgICAgfSlcblxuICAgICAgICAvL3NldCBwb3NpdGlvblxuICAgICAgICBpZiAob3B0cy54KSB7XG4gICAgICAgICAgICB0aGlzLnN0eWxlKCdsZWZ0Jywgb3B0cy54ICsgJ3B4JylcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc3R5bGUoJ3JpZ2h0JywgJzEwcHgnKVxuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRzLnkpIHtcbiAgICAgICAgICAgIHRoaXMuc3R5bGUoJ3RvcCcsIG9wdHMueSArICdweCcpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnN0eWxlKCd0b3AnLCAnOTBweCcpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbkNsaWNrRnVuY3Rpb24oZSkge1xuICAgICAgICBpZiAodGhpcy5pc0Z1bGxzY3JlZW4pIHtcbiAgICAgICAgICAgIHRoaXMuY2xvc2VGdWxsc2NyZWVuKHRoaXMubWFwLmNvbnRhaW5lcilcbiAgICAgICAgICAgIC8vcmVzaXplIGNhbnZhcyB0byBkZWZhdWx0XG4gICAgICAgICAgICB0aGlzLm1hcC5oID0gdGhpcy5kZWZhdWx0SGVpZ2h0XG4gICAgICAgICAgICB0aGlzLm1hcC53ID0gdGhpcy5kZWZhdWx0V2lkdGhcbiAgICAgICAgICAgIHRoaXMubWFwLmdlb0NhbnZhcy5oID0gdGhpcy5kZWZhdWx0SGVpZ2h0XG4gICAgICAgICAgICB0aGlzLm1hcC5nZW9DYW52YXMudyA9IHRoaXMuZGVmYXVsdFdpZHRoXG4gICAgICAgICAgICB0aGlzLm1hcC5nZW9DYW52YXMuY2FudmFzLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCAnJyArIHRoaXMuZGVmYXVsdFdpZHRoKVxuICAgICAgICAgICAgdGhpcy5tYXAuZ2VvQ2FudmFzLmNhbnZhcy5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsICcnICsgdGhpcy5kZWZhdWx0SGVpZ2h0KVxuICAgICAgICAgICAgdGhpcy5tYXAucmVkcmF3KClcbiAgICAgICAgICAgIHRoaXMuaXNGdWxsc2NyZWVuID0gZmFsc2VcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMub3BlbkZ1bGxzY3JlZW4odGhpcy5tYXAuY29udGFpbmVyKVxuICAgICAgICAgICAgLy9yZXNpemUgY2FudmFzIHRvIGZ1bGxzY3JlZW5cbiAgICAgICAgICAgIHRoaXMubWFwLmggPSB3aW5kb3cuc2NyZWVuLmhlaWdodFxuICAgICAgICAgICAgdGhpcy5tYXAudyA9IHdpbmRvdy5zY3JlZW4ud2lkdGhcbiAgICAgICAgICAgIHRoaXMuaXNGdWxsc2NyZWVuID0gdHJ1ZVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyogT3BlbiBmdWxsc2NyZWVuICovXG4gICAgb3BlbkZ1bGxzY3JlZW4oZWxlbSkge1xuICAgICAgICBpZiAoZWxlbS5yZXF1ZXN0RnVsbHNjcmVlbikge1xuICAgICAgICAgICAgZWxlbS5yZXF1ZXN0RnVsbHNjcmVlbigpXG4gICAgICAgIH0gZWxzZSBpZiAoZWxlbS53ZWJraXRSZXF1ZXN0RnVsbHNjcmVlbikge1xuICAgICAgICAgICAgLyogU2FmYXJpICovXG4gICAgICAgICAgICBlbGVtLndlYmtpdFJlcXVlc3RGdWxsc2NyZWVuKClcbiAgICAgICAgfSBlbHNlIGlmIChlbGVtLm1zUmVxdWVzdEZ1bGxzY3JlZW4pIHtcbiAgICAgICAgICAgIC8qIElFMTEgKi9cbiAgICAgICAgICAgIGVsZW0ubXNSZXF1ZXN0RnVsbHNjcmVlbigpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiBDbG9zZSBmdWxsc2NyZWVuICovXG4gICAgY2xvc2VGdWxsc2NyZWVuKCkge1xuICAgICAgICBpZiAoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pIHtcbiAgICAgICAgICAgIGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKClcbiAgICAgICAgfSBlbHNlIGlmIChkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbikge1xuICAgICAgICAgICAgLyogU2FmYXJpICovXG4gICAgICAgICAgICBkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpXG4gICAgICAgIH0gZWxzZSBpZiAoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbikge1xuICAgICAgICAgICAgLyogSUUxMSAqL1xuICAgICAgICAgICAgZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgeyBCdXR0b24gfSBmcm9tICcuL0J1dHRvbi5qcydcblxuLyoqXG4gKiBCdXR0b24gZm9yIHRvZ2dsaW5nIGZ1bGxzY3JlZW4gbW9kZVxuICpcbiAqIEBtb2R1bGUgYnV0dG9uXG4gKiBAYXV0aG9yIEpvc2VwaCBEYXZpZXMsIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBab29tQnV0dG9ucyBleHRlbmRzIEJ1dHRvbiB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdHNcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpXG5cbiAgICAgICAgdGhpcy5vblpvb20gPSBvcHRzLm9uWm9vbSAvLyBjdXN0b20gdXNlciBldmVudCBoYW5kbGVyXG4gICAgICAgIHRoaXMuZGVsdGEgPSBvcHRzLmRlbHRhIHx8IDAuMlxuXG4gICAgICAgIC8vIENyZWF0ZSB6b29tIGluIGJ1dHRvblxuICAgICAgICB0aGlzLnpvb21JbkJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKVxuICAgICAgICB0aGlzLnpvb21JbkJ0bi5pZCA9ICd6b29tLWluJ1xuICAgICAgICB0aGlzLnpvb21JbkJ0bi5jbGFzc05hbWUgPSAnZ3JpZHZpei16b29tLWJ1dHRvbidcbiAgICAgICAgdGhpcy56b29tSW5CdG4udGl0bGUgPSAnWm9vbSBpbidcbiAgICAgICAgdGhpcy56b29tSW5CdG4udGV4dENvbnRlbnQgPSAnKydcbiAgICAgICAgdGhpcy56b29tSW5CdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy56b29tSW4oZSlcbiAgICAgICAgfSlcbiAgICAgICAgdGhpcy56b29tSW5CdG4uYWRkRXZlbnRMaXN0ZW5lcignbW91c2VvdmVyJywgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy56b29tSW5CdG4uc3R5bGUuYmFja2dyb3VuZENvbG9yID0gJ2xpZ2h0Z3JleSdcbiAgICAgICAgfSlcbiAgICAgICAgdGhpcy56b29tSW5CdG4uYWRkRXZlbnRMaXN0ZW5lcignbW91c2VvdXQnLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnpvb21JbkJ0bi5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAnI2ZmZmZmZidcbiAgICAgICAgfSlcblxuICAgICAgICAvLyBDcmVhdGUgem9vbSBvdXQgYnV0dG9uXG4gICAgICAgIHRoaXMuem9vbU91dEJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKVxuICAgICAgICB0aGlzLnpvb21PdXRCdG4uaWQgPSAnem9vbS1vdXQnXG4gICAgICAgIHRoaXMuem9vbU91dEJ0bi5jbGFzc05hbWUgPSAnZ3JpZHZpei16b29tLWJ1dHRvbidcbiAgICAgICAgdGhpcy56b29tT3V0QnRuLnRpdGxlID0gJ1pvb20gb3V0J1xuICAgICAgICB0aGlzLnpvb21PdXRCdG4udGV4dENvbnRlbnQgPSAnLSdcbiAgICAgICAgdGhpcy56b29tT3V0QnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICAgICAgICAgIHRoaXMuem9vbU91dChlKVxuICAgICAgICB9KVxuICAgICAgICB0aGlzLnpvb21PdXRCdG4uYWRkRXZlbnRMaXN0ZW5lcignbW91c2VvdmVyJywgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy56b29tT3V0QnRuLnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICdsaWdodGdyZXknXG4gICAgICAgIH0pXG4gICAgICAgIHRoaXMuem9vbU91dEJ0bi5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW91dCcsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuem9vbU91dEJ0bi5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAnI2ZmZmZmZidcbiAgICAgICAgfSlcblxuICAgICAgICAvLyBTZXQgY29tbW9uIHN0eWxlcyBmb3IgYnV0dG9uc1xuICAgICAgICBjb25zdCBidXR0b25zID0gW3RoaXMuem9vbUluQnRuLCB0aGlzLnpvb21PdXRCdG5dXG4gICAgICAgIGJ1dHRvbnMuZm9yRWFjaCgoYnRuLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgYnRuLnN0eWxlLmFsaWduSXRlbXMgPSAnY2VudGVyJ1xuICAgICAgICAgICAgYnRuLnN0eWxlLmp1c3RpZnlDb250ZW50ID0gJ2NlbnRlcidcbiAgICAgICAgICAgIGJ0bi5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnXG4gICAgICAgICAgICBidG4uc3R5bGUuYm9yZGVyID0gJ25vbmUnXG4gICAgICAgICAgICBidG4uc3R5bGUuY29sb3IgPSAnYmxhY2snXG4gICAgICAgICAgICBidG4uc3R5bGUudGV4dEFsaWduID0gJ2NlbnRlcidcbiAgICAgICAgICAgIGJ0bi5zdHlsZS50ZXh0RGVjb3JhdGlvbiA9ICdub25lJ1xuICAgICAgICAgICAgYnRuLnN0eWxlLnBhZGRpbmcgPSAnNHB4J1xuICAgICAgICAgICAgYnRuLnN0eWxlLmZvbnRTaXplID0gJzI0cHgnXG4gICAgICAgICAgICBidG4uc3R5bGUuZm9udFdlaWdodCA9ICdib2xkJ1xuICAgICAgICAgICAgYnRuLnN0eWxlLnVzZXJTZWxlY3QgPSAnbm9uZSdcbiAgICAgICAgICAgIGJ0bi5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAnI2ZmZmZmZidcbiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gMCkgYnRuLnN0eWxlLmJvcmRlckJvdHRvbSA9ICcxcHggc29saWQgZ3JleScgLy8gWm9vbSBpbiBidXR0b24gb25seVxuICAgICAgICB9KVxuXG4gICAgICAgIC8vIFVuc2V0IHBhcmVudCBjbGFzcyBoZWlnaHQgYW5kIGRpc3BsYXkgZm9yIGR1YWwgYnV0dG9uc1xuICAgICAgICB0aGlzLnN0eWxlKCdoZWlnaHQnLCAndW5zZXQnKVxuICAgICAgICB0aGlzLnN0eWxlKCdkaXNwbGF5JywgJ3Vuc2V0JylcblxuICAgICAgICAvLyBTZXQgcG9zaXRpb25cbiAgICAgICAgaWYgKG9wdHMueCkge1xuICAgICAgICAgICAgdGhpcy5zdHlsZSgnbGVmdCcsIG9wdHMueCArICdweCcpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnN0eWxlKCdyaWdodCcsICcxMHB4JylcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0cy55KSB7XG4gICAgICAgICAgICB0aGlzLnN0eWxlKCd0b3AnLCBvcHRzLnkgKyAncHgnKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zdHlsZSgndG9wJywgJzEwcHgnKVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQXBwZW5kIGJ1dHRvbnMgdG8gdGhlIGNvbnRhaW5lclxuICAgICAgICB0aGlzLmRpdi5ub2RlKCkuYXBwZW5kQ2hpbGQodGhpcy56b29tSW5CdG4pXG4gICAgICAgIHRoaXMuZGl2Lm5vZGUoKS5hcHBlbmRDaGlsZCh0aGlzLnpvb21PdXRCdG4pXG4gICAgfVxuXG4gICAgLyogWm9vbSBpbiAqL1xuICAgIHpvb21JbihlKSB7XG4gICAgICAgIHRoaXMubWFwLnNldFpvb20odGhpcy5tYXAuZ2V0Wm9vbSgpICogKDEgLSB0aGlzLmRlbHRhKSkucmVkcmF3KClcbiAgICAgICAgaWYgKHRoaXMub25ab29tKSB0aGlzLm9uWm9vbShlKVxuICAgICAgICBpZiAodGhpcy5tYXAuZ2VvQ2FudmFzLm9uWm9vbUZ1bikgdGhpcy5tYXAuZ2VvQ2FudmFzLm9uWm9vbUZ1bihlKVxuICAgIH1cblxuICAgIC8qIFpvb20gb3V0ICovXG4gICAgem9vbU91dChlKSB7XG4gICAgICAgIHRoaXMubWFwLnNldFpvb20odGhpcy5tYXAuZ2V0Wm9vbSgpICogKDEgKyB0aGlzLmRlbHRhKSkucmVkcmF3KClcbiAgICAgICAgaWYgKHRoaXMub25ab29tKSB0aGlzLm9uWm9vbShlKVxuICAgICAgICBpZiAodGhpcy5tYXAuZ2VvQ2FudmFzLm9uWm9vbUZ1bikgdGhpcy5tYXAuZ2VvQ2FudmFzLm9uWm9vbUZ1bihlKVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuLyoqXG4gKiBBIGdyaWQgY2VsbC5cbiAqIEB0eXBlZGVmIHt7eDogbnVtYmVyLCB5OiBudW1iZXJ9fSBDZWxsICovXG5cbi8qKlxuICogQSBkYXRhc2V0IGNvbXBvbmVudCwgb2YgZ3JpZCBjZWxscy5cbiAqIEBhYnN0cmFjdFxuICpcbiAqIEBtb2R1bGUgY29yZVxuICogQGF1dGhvciBKb3NlcGggRGF2aWVzLCBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgRGF0YXNldCB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuL01hcC5qc1wiKS5NYXB9IG1hcCBUaGUgbWFwLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVGhlIFVSTCBvZiB0aGUgZGF0YXNldC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVzb2x1dGlvbiBUaGUgZGF0YXNldCByZXNvbHV0aW9uLCBpbiB0aGUgQ1JTIGdlb2dyYXBoaWNhbCB1bml0LlxuICAgICAqIEBwYXJhbSB7e3ByZXByb2Nlc3M/OmZ1bmN0aW9uKENlbGwpOmJvb2xlYW4sIG1peGVkUmVzb2x1dGlvbj86ZnVuY3Rpb24oQ2VsbCk6bnVtYmVyfX0gb3B0c1xuICAgICAqIEBhYnN0cmFjdFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG1hcCwgdXJsLCByZXNvbHV0aW9uLCBvcHRzID0ge30pIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBtYXAuXG4gICAgICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgICAgICogQHR5cGUge2ltcG9ydChcIi4vTWFwLmpzXCIpLk1hcH0gKi9cbiAgICAgICAgdGhpcy5tYXAgPSBtYXBcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHVybCBvZiB0aGUgZGF0YXNldC5cbiAgICAgICAgICogQHByb3RlY3RlZFxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLnVybCA9IHVybFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgZGF0YXNldCByZXNvbHV0aW9uIGluIGdlb2dyYXBoaWNhbCB1bml0LlxuICAgICAgICAgKiBAcHJvdGVjdGVkXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgIHRoaXMucmVzb2x1dGlvbiA9IHJlc29sdXRpb25cblxuICAgICAgICAvKipcbiAgICAgICAgICogSW4gY2FzZSB0aGUgZGF0YXNldCBpcyBhIGRhdGFzZXQgd2l0aCBjZWxscyBoYXZpbmcgZGlmZmVyZW50IHJlc29sdXRpb24sXG4gICAgICAgICAqIHRoaXMgaXMgdGhlIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgcmVzb2x1dGlvbiBvZiBlYWNoIGNlbGwuXG4gICAgICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgICAgICogQHR5cGUgeyhmdW5jdGlvbihDZWxsKTpudW1iZXIgKXwgdW5kZWZpbmVkIH0gKi9cbiAgICAgICAgdGhpcy5taXhlZFJlc29sdXRpb24gPSBvcHRzLm1peGVkUmVzb2x1dGlvblxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIHByZXByb2Nlc3MgdG8gcnVuIG9uIGVhY2ggY2VsbCBhZnRlciBsb2FkaW5nLiBJdCBjYW4gYmUgdXNlZCB0byBhcHBseSBzb21lIHNwZWNpZmljIHRyZWF0bWVudCBiZWZvcmUgb3IgY29tcHV0ZSBhIG5ldyBjb2x1bW4uIEFuZCBhbHNvIHRvIGRldGVybWluZSB3aGljaCBjZWxscyB0byBrZWVwIGFmdGVyIGxvYWRpbmcuXG4gICAgICAgICAqIEB0eXBlIHsoZnVuY3Rpb24oQ2VsbCk6Ym9vbGVhbiApfCB1bmRlZmluZWQgfSAqL1xuICAgICAgICB0aGlzLnByZXByb2Nlc3MgPSBvcHRzLnByZXByb2Nlc3MgfHwgdW5kZWZpbmVkXG5cbiAgICAgICAgLyoqIFRoZSBjZWxscyB3aXRoaW4gdGhlIHZpZXdcbiAgICAgICAgICogQHByb3RlY3RlZFxuICAgICAgICAgKiBAdHlwZSB7QXJyYXkuPENlbGw+fSAqL1xuICAgICAgICB0aGlzLmNlbGxzVmlld0NhY2hlID0gW11cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXF1ZXN0IGRhdGEgd2l0aGluIGEgZ2VvZ3JhcGhpYyBlbnZlbG9wZS5cbiAgICAgKlxuICAgICAqIEBhYnN0cmFjdFxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9HZW9DYW52YXNcIikuRW52ZWxvcGV8dW5kZWZpbmVkfSBleHRHZW9cbiAgICAgKiBAcmV0dXJucyB7dGhpc31cbiAgICAgKi9cbiAgICBnZXREYXRhKGV4dEdlbyA9IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBnZXREYXRhIG5vdCBpbXBsZW1lbnRlZC4nKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbGwgdGhlIHZpZXcgY2FjaGUgd2l0aCBhbGwgY2VsbHMgd2hpY2ggYXJlIHdpdGhpbiBhIGdlb2dyYXBoaWNhbCBlbnZlbG9wZS5cbiAgICAgKiBAYWJzdHJhY3RcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vR2VvQ2FudmFzXCIpLkVudmVsb3BlfSBleHRHZW8gVGhlIHZpZXcgZ2VvZ3JhcGhpY2FsIGVudmVsb3BlLlxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIHVwZGF0ZVZpZXdDYWNoZShleHRHZW8pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2QgdXBkYXRlVmlld0NhY2hlIG5vdCBpbXBsZW1lbnRlZC4nKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBhIGNlbGwgdW5kZXIgYSBnaXZlbiBwb3NpdGlvbiwgaWYgYW55LlxuICAgICAqXG4gICAgICogQHBhcmFtIHt7eDpudW1iZXIseTpudW1iZXJ9fSBwb3NHZW9cbiAgICAgKiBAcGFyYW0ge0FycmF5LjxDZWxsPn0gY2VsbHMgU29tZSBjZWxscyBmcm9tIHRoZSBkYXRhc2V0IChhIHN1YnNldCBpZiBuZWNlc3NhcnksIHVzdWFsbHkgdGhlIHZpZXcgY2FjaGUpLlxuICAgICAqIEByZXR1cm5zIHtDZWxsfHVuZGVmaW5lZH1cbiAgICAgKi9cbiAgICBnZXRDZWxsRnJvbVBvc2l0aW9uKHBvc0dlbywgY2VsbHMpIHtcbiAgICAgICAgLy9jb21wdXRlIGNhbmRpZGF0ZSBjZWxsIHBvc2l0aW9uXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICAvL2NvbnN0IHIgPSB0aGlzLmdldFJlc29sdXRpb24oKVxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgLy9jb25zdCBjZWxsWCA9IHIgKiBNYXRoLmZsb29yKHBvc0dlby54IC8gcilcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgIC8vY29uc3QgY2VsbFkgPSByICogTWF0aC5mbG9vcihwb3NHZW8ueSAvIHIpXG5cbiAgICAgICAgLyovZ2V0IGNlbGxcbiAgICAgICAgZm9yIChjb25zdCBjZWxsIG9mIGNlbGxzKSB7XG4gICAgICAgICAgICBpZiAoY2VsbC54ICE9IGNlbGxYKSBjb250aW51ZVxuICAgICAgICAgICAgaWYgKGNlbGwueSAhPSBjZWxsWSkgY29udGludWVcbiAgICAgICAgICAgIHJldHVybiBjZWxsXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZCovXG5cbiAgICAgICAgLy9yYXJlIGNhc2Ugb2YgbWl4ZWQgcmVzb2x1dGlvbiBkYXRhc2V0XG4gICAgICAgIGlmICh0aGlzLm1peGVkUmVzb2x1dGlvbikge1xuICAgICAgICAgICAgZm9yIChjb25zdCBjIG9mIGNlbGxzKSB7XG4gICAgICAgICAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgICAgICAgICAgY29uc3QgciA9ICt0aGlzLm1peGVkUmVzb2x1dGlvbihjKVxuICAgICAgICAgICAgICAgIGlmIChwb3NHZW8ueCA8IGMueCkgY29udGludWVcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChjLnggKyByIDwgcG9zR2VvLngpIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocG9zR2VvLnkgPCBjLnkpIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoYy55ICsgciA8IHBvc0dlby55KSBjb250aW51ZVxuICAgICAgICAgICAgICAgIGVsc2UgcmV0dXJuIGNcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICAgICAgfVxuXG4gICAgICAgIC8vY29tbW9uIGNhc2VcblxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgY29uc3QgciA9IHRoaXMuZ2V0UmVzb2x1dGlvbigpXG4gICAgICAgIGZvciAoY29uc3QgY2VsbCBvZiBjZWxscykge1xuICAgICAgICAgICAgaWYgKHBvc0dlby54IDwgY2VsbC54KSBjb250aW51ZVxuICAgICAgICAgICAgZWxzZSBpZiAoY2VsbC54ICsgciA8IHBvc0dlby54KSBjb250aW51ZVxuICAgICAgICAgICAgZWxzZSBpZiAocG9zR2VvLnkgPCBjZWxsLnkpIGNvbnRpbnVlXG4gICAgICAgICAgICBlbHNlIGlmIChjZWxsLnkgKyByIDwgcG9zR2VvLnkpIGNvbnRpbnVlXG4gICAgICAgICAgICBlbHNlIHJldHVybiBjZWxsXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgIH1cblxuICAgIC8vZ2V0dGVycyBhbmQgc2V0dGVyc1xuXG4gICAgLyoqIEByZXR1cm5zIHtudW1iZXJ9ICovXG4gICAgZ2V0UmVzb2x1dGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVzb2x1dGlvblxuICAgIH1cblxuICAgIC8qKiBAcmV0dXJucyB7QXJyYXkuPENlbGw+fSAqL1xuICAgIGdldFZpZXdDYWNoZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2VsbHNWaWV3Q2FjaGVcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdGhlIHJlbGV2YW50IGRhdGFzZXQgZm9yIGEgc3BlY2lmaWVkIHpvb20uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHpcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbWluUGl4ZWxzUGVyQ2VsbFxuICAgICAqIEByZXR1cm5zIHtEYXRhc2V0fHVuZGVmaW5lZH1cbiAgICAgKiAqL1xuICAgIGdldERhdGFzZXQoeiwgbWluUGl4ZWxzUGVyQ2VsbCkge1xuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuLyoqXG4gKiBUaGlzIGlzIGFuIGFic3RyYWN0IGNsYXNzIHVzZWQgdG8gZ3JvdXAgZWxlbWVudHMgc2hhcmVkIGJldHdlZW4gTGF5ZXIgYW5kIFN0eWxlIGNsYXNzZXMuXG4gKlxuICogQGFic3RyYWN0XG4gKiBAbW9kdWxlIGNvcmVcbiAqIEBhdXRob3IgSm9zZXBoIERhdmllcywgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIERyYXdhYmxlIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb3B0c1xuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvKiogQSBmdW5jdGlvbiBzcGVjaWZ5aW5nIGlmIHRoZSBlbGVtZW50IHNob3VsZCBiZSB2aXNpYmxlIG9yIG5vdC5cbiAgICAgICAgICogVGhlIGZ1bmN0aW9uIHBhcmFtZXRlciBpcyB0aGUgem9vbSBsZXZlbC5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG51bWJlcik6Ym9vbGVhbn0gKi9cbiAgICAgICAgdGhpcy52aXNpYmxlID0gb3B0cy52aXNpYmxlXG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBhbHBoYSAodHJhbnNwYXJlbmN5L29wYWNpdHkpLCBiZXR3ZWVuIDAuMCAoZnVsbHkgdHJhbnNwYXJlbnQpIGFuZCAxLjAgKGZ1bGx5IG9wYXF1ZSkuXG4gICAgICAgICAqICBUaGUgZnVuY3Rpb24gcGFyYW1ldGVyIGlzIHRoZSB6b29tIGxldmVsLlxuICAgICAgICAgKiAoc2VlIENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRDogZ2xvYmFsQWxwaGEgcHJvcGVydHkpXG4gICAgICAgICAqIEB0eXBlIHsoZnVuY3Rpb24obnVtYmVyKTpudW1iZXIpfHVuZGVmaW5lZH0gKi9cbiAgICAgICAgdGhpcy5hbHBoYSA9IG9wdHMuYWxwaGFcblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIGJsZW5kIG9wZXJhdGlvbi5cbiAgICAgICAgICogVGhlIGZ1bmN0aW9uIHBhcmFtZXRlciBpcyB0aGUgem9vbSBsZXZlbC5cbiAgICAgICAgICogKHNlZSBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ6IGdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiBwcm9wZXJ0eSlcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG51bWJlcik6R2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9ufSAqL1xuICAgICAgICB0aGlzLmJsZW5kT3BlcmF0aW9uID0gb3B0cy5ibGVuZE9wZXJhdGlvbiB8fCAoKHopID0+ICdzb3VyY2Utb3ZlcicpXG5cbiAgICAgICAgLyoqIEB0eXBlIHsoZnVuY3Rpb24obnVtYmVyKTpzdHJpbmcpfHVuZGVmaW5lZH0gKi9cbiAgICAgICAgdGhpcy5maWx0ZXJDb2xvciA9IG9wdHMuZmlsdGVyQ29sb3IgLy8gKHopID0+IFwiI2VlZTdcIlxuICAgICAgICAvKiogQHR5cGUgeyhmdW5jdGlvbihudW1iZXIpOkdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbnxcIm5vbmVcIil8dW5kZWZpbmVkfSAqL1xuICAgICAgICB0aGlzLmZpbHRlckJsZW5kT3BlcmF0aW9uID0gb3B0cy5maWx0ZXJCbGVuZE9wZXJhdGlvbiAvLyAoeikgPT4gXCJtdWx0aXBseVwiXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRHJhdyBsYXllciBmaWx0ZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vR2VvQ2FudmFzLmpzXCIpLkdlb0NhbnZhc30gZ2VvQ2FudmFzIFRoZSBjYW52YXMgd2hlcmUgdG8gZHJhdyB0aGUgbGF5ZXIuXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICogQGFic3RyYWN0XG4gICAgICovXG4gICAgZHJhd0ZpbHRlcihnZW9DYW52YXMpIHtcbiAgICAgICAgLy9ubyBmaWx0ZXI6IHJldHVyblxuICAgICAgICBpZiAoIXRoaXMuZmlsdGVyQ29sb3IpIHJldHVyblxuXG4gICAgICAgIC8vZ2V0IGZpbHRlclxuICAgICAgICBjb25zdCBmYyA9IHRoaXMuZmlsdGVyQ29sb3IoZ2VvQ2FudmFzLnZpZXcueilcblxuICAgICAgICAvL25vIGZpbHRlcjogcmV0dXJuXG4gICAgICAgIGlmICghZmMgfHwgZmMgPT0gJ25vbmUnKSByZXR1cm5cblxuICAgICAgICAvL2RyYXcgZmlsdGVyXG5cbiAgICAgICAgLy9zZXQgY29sb3JcbiAgICAgICAgZ2VvQ2FudmFzLm9mZnNjcmVlbkN0eC5maWxsU3R5bGUgPSBmY1xuXG4gICAgICAgIC8vc2F2ZSBibGVuZCBtb2RlIGFuZCBzZXQgbmV3LCBpZiBhbnlcbiAgICAgICAgbGV0IGJvID0gdW5kZWZpbmVkLCBibzIgPSB1bmRlZmluZWRcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyQmxlbmRPcGVyYXRpb24pIHtcbiAgICAgICAgICAgIGJvID0gZ2VvQ2FudmFzLm9mZnNjcmVlbkN0eC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb25cbiAgICAgICAgICAgIGJvMiA9IHRoaXMuZmlsdGVyQmxlbmRPcGVyYXRpb24oZ2VvQ2FudmFzLnZpZXcueilcbiAgICAgICAgfVxuICAgICAgICBpZiAoYm8yICYmIGJvMiAhPSBcIm5vbmVcIikgZ2VvQ2FudmFzLm9mZnNjcmVlbkN0eC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSBibzI7XG5cbiAgICAgICAgLy9kcmF3XG4gICAgICAgIGdlb0NhbnZhcy5vZmZzY3JlZW5DdHguZmlsbFJlY3QoMCwgMCwgZ2VvQ2FudmFzLncsIGdlb0NhbnZhcy5oKVxuXG4gICAgICAgIC8vcmVzdG9yZSBibGVuZCBtb2RlXG4gICAgICAgIGlmIChibykgZ2VvQ2FudmFzLm9mZnNjcmVlbkN0eC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSBibztcblxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuLyoqIEB0eXBlZGVmIHsge3hNaW46IG51bWJlciwgeE1heDogbnVtYmVyLCB5TWluOiBudW1iZXIsIHlNYXg6IG51bWJlcn0gfSBFbnZlbG9wZSAqL1xuXG4vKipcbiAqIEEgdmlld3NoZWQuXG4gKiBAdHlwZWRlZiB7e3g6IG51bWJlciwgeTogbnVtYmVyLCB6OiBudW1iZXJ9fSBWaWV3ICovXG5cbmltcG9ydCB7IHNlbGVjdCB9IGZyb20gJ2QzLXNlbGVjdGlvbidcbmltcG9ydCB7IHpvb20gYXMgZDN6b29tLCB6b29tSWRlbnRpdHkgfSBmcm9tICdkMy16b29tJ1xuXG4vKipcbiAqIEEgSFRNTCBjYW52YXMgZm9yIGdlbyBkYXRhIGRpc3BsYXksIGVuaGFuY2VkIHdpdGggem9vbSBhbmQgcGFuIGNhcGFiaWxpdGllcy5cbiAqXG4gKiBAbW9kdWxlIGNvcmVcbiAqIEBhdXRob3IgSm9zZXBoIERhdmllcywgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIEdlb0NhbnZhcyB7XG4gICAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICogQHBhcmFtIHtIVE1MQ2FudmFzRWxlbWVudH0gY2FudmFzXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHggVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgdmlld1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5IFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHZpZXdcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geiBUaGUgem9vbSBsZXZlbCBvZiB0aGUgdmlldyAocGl4ZWwgc2l6ZSwgaW4gZ3JvdW5kIG0pXG4gICAgICogQHBhcmFtIHtvYmplY3R9IG9wdHNcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihjYW52YXMsIHggPSAwLCB5ID0gMCwgeiA9IDAsIG9wdHMgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5vcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgICAgIC8qKiBAdHlwZSB7SFRNTENhbnZhc0VsZW1lbnR9ICovXG4gICAgICAgIHRoaXMuY2FudmFzID0gY2FudmFzXG4gICAgICAgIHRoaXMuY2FudmFzLnN0eWxlLmN1cnNvciA9ICdncmFiJyAgICAgICAgICAvLyBkZWZhdWx0IHNob3duIHdoZW4gaG92ZXJcblxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgdGhpcy53ID0gdGhpcy5jYW52YXMub2Zmc2V0V2lkdGhcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgIHRoaXMuaCA9IHRoaXMuY2FudmFzLm9mZnNldEhlaWdodFxuXG4gICAgICAgIC8vIEFkanVzdCBjYW52YXMgd2lkdGggYW5kIGhlaWdodCBiYXNlZCBvbiBkZXZpY2UgcGl4ZWwgcmF0aW9cbiAgICAgICAgLy9jb25zdCBkcHIgPSB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyB8fCAxIC8vIEdldCB0aGUgZGV2aWNlIHBpeGVsIHJhdGlvXG4gICAgICAgIC8vdGhpcy5jYW52YXMud2lkdGggPSB0aGlzLncgKiBkcHIgLy8gU2V0IGNhbnZhcyB3aWR0aFxuICAgICAgICAvL1xcc3RoaXMuY2FudmFzLmhlaWdodCA9IHRoaXMuaCAqIGRwciAvLyBTZXQgY2FudmFzIGhlaWdodFxuXG4gICAgICAgIC8vIENyZWF0ZSBvZmZzY3JlZW4gY2FudmFzIGZvciBkcmF3aW5nIG9wZXJhdGlvbnNcbiAgICAgICAgdGhpcy5vZmZzY3JlZW5DYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKVxuICAgICAgICB0aGlzLm9mZnNjcmVlbkNhbnZhcy53aWR0aCA9IHRoaXMud1xuICAgICAgICB0aGlzLm9mZnNjcmVlbkNhbnZhcy5oZWlnaHQgPSB0aGlzLmhcblxuICAgICAgICBjb25zdCBjdHggPSB0aGlzLmNhbnZhcy5nZXRDb250ZXh0KCcyZCcpXG4gICAgICAgIGNvbnN0IG9mZnNjcmVlbkN0eCA9IHRoaXMub2Zmc2NyZWVuQ2FudmFzLmdldENvbnRleHQoJzJkJylcbiAgICAgICAgaWYgKCFjdHgpIHRocm93ICdJbXBvc3NpYmxlIHRvIGNyZWF0ZSBjYW52YXMgMkQgY29udGV4dCdcbiAgICAgICAgaWYgKCFvZmZzY3JlZW5DdHgpIHRocm93ICdJbXBvc3NpYmxlIHRvIGNyZWF0ZSBjYW52YXMgMkQgY29udGV4dCdcbiAgICAgICAgLyoqQHR5cGUge0NhbnZhc1JlbmRlcmluZ0NvbnRleHQyRH0gKi9cbiAgICAgICAgdGhpcy5jdHggPSBjdHhcbiAgICAgICAgdGhpcy5vZmZzY3JlZW5DdHggPSBvZmZzY3JlZW5DdHhcbiAgICAgICAgLy90aGlzLmN0eC5zY2FsZShkcHIsIGRwcikgLy8gU2NhbGUgdGhlIGNvbnRleHRcblxuICAgICAgICAvKipcbiAgICAgICAgICogejogcGl4ZWwgc2l6ZSwgaW4gbS9waXhcbiAgICAgICAgICogQHR5cGUge1ZpZXd9ICAqL1xuICAgICAgICB0aGlzLnZpZXcgPSB7IHg6IHgsIHk6IHksIHo6IHogfVxuXG4gICAgICAgIC8qKiBCYWNrZ3JvdW5kIGNvbG9yLlxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLmJhY2tncm91bmRDb2xvciA9IG9wdHMuYmFja2dyb3VuZENvbG9yIHx8ICd3aGl0ZSdcblxuICAgICAgICAvKiogQHR5cGUge2Z1bmN0aW9uKG9iamVjdHx1bmRlZmluZWQpOnZvaWR9ICovXG4gICAgICAgIHRoaXMub25ab29tU3RhcnRGdW4gPSBvcHRzLm9uWm9vbVN0YXJ0RnVuXG5cbiAgICAgICAgLyoqIEB0eXBlIHtmdW5jdGlvbihvYmplY3R8dW5kZWZpbmVkKTp2b2lkfSAqL1xuICAgICAgICB0aGlzLm9uWm9vbUVuZEZ1biA9IG9wdHMub25ab29tRW5kRnVuXG5cbiAgICAgICAgLyoqIEB0eXBlIHtmdW5jdGlvbihvYmplY3R8dW5kZWZpbmVkKTp2b2lkfSAqL1xuICAgICAgICB0aGlzLm9uWm9vbUZ1biA9IG9wdHMub25ab29tRnVuXG5cbiAgICAgICAgLy9jdXJyZW50IGV4dGVudFxuICAgICAgICAvKiogQHR5cGUge0VudmVsb3BlfSAqL1xuICAgICAgICB0aGlzLmV4dEdlbyA9IHsgeE1pbjogTmFOLCB4TWF4OiBOYU4sIHlNaW46IE5hTiwgeU1heDogTmFOIH1cbiAgICAgICAgdGhpcy51cGRhdGVFeHRlbnRHZW8oKVxuXG4gICAgICAgIC8vcmVseSBvbiBkMyBmb3Igem9vbVxuICAgICAgICBpZiAoIW9wdHMuZGlzYWJsZVpvb20pIHtcbiAgICAgICAgICAgIGxldCB0UCA9IHpvb21JZGVudGl0eVxuICAgICAgICAgICAgY29uc3QgeiA9IGQzem9vbSgpXG4gICAgICAgICAgICAgICAgLy8gdG8gbWFrZSB0aGUgem9vbWluZyBhIGJpdCBmYXN0ZXJcbiAgICAgICAgICAgICAgICAud2hlZWxEZWx0YSgoZSkgPT4gLWUuZGVsdGFZICogKGUuZGVsdGFNb2RlID09PSAxID8gMC4wNyA6IGUuZGVsdGFNb2RlID8gMSA6IDAuMDA0KSlcbiAgICAgICAgICAgICAgICAub24oJ3pvb20nLCAoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc1pvb21pbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0ID0gZS50cmFuc2Zvcm1cbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgem9vbUZhY3RvciA9IHRQLmsgLyB0LmtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHpvb21GYWN0b3IgPT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9wYW5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGR4ID0gdFAueCAtIHQueFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZHkgPSB0UC55IC0gdC55XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcGx5UGFuKGR4ICogdGhpcy52aWV3LnosIC1keSAqIHRoaXMudmlldy56KVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlWm9vbShlLCB6b29tRmFjdG9yKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRQID0gdFxuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9uWm9vbUZ1bikgdGhpcy5vblpvb21GdW4oZSlcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5vbignc3RhcnQnLCAoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBzdGFydCBvZiB6b29tIGV2ZW50XG4gICAgICAgICAgICAgICAgICAgIC8vIHNob3cgZ3JhYmJpbmcgZHVyaW5nIHBhbi96b29tXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7IHRoaXMuY2FudmFzLnN0eWxlLmN1cnNvciA9ICdncmFiYmluZycgfSBjYXRjaCAoZXJyKSB7IH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNab29taW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgLy8gc2F2ZSB0aGUgY3VycmVudCBjYW52YXMgc3RhdGUgdG8ga2VlcCBvbnNjcmVlbiBkdXJpbmcgcGFuL3pvb20gYmVmb3JlIHJlZHJhd2luZ1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUuYyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZS5jLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCAnJyArIHRoaXMudylcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLmMuc2V0QXR0cmlidXRlKCdoZWlnaHQnLCAnJyArIHRoaXMuaClcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLmMuZ2V0Q29udGV4dCgnMmQnKT8uZHJhd0ltYWdlKHRoaXMuY2FudmFzLCAwLCAwKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUuZHggPSAwXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZS5keSA9IDBcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLmYgPSAxXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9uWm9vbVN0YXJ0RnVuKSB0aGlzLm9uWm9vbVN0YXJ0RnVuKGUpXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAub24oJ2VuZCcsIChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVuZCBvZiBwYW4vem9vbSBldmVudFxuICAgICAgICAgICAgICAgICAgICAvLyByZXN0b3JlIGN1cnNvclxuICAgICAgICAgICAgICAgICAgICB0cnkgeyB0aGlzLmNhbnZhcy5zdHlsZS5jdXJzb3IgPSAnZ3JhYicgfSBjYXRjaCAoZXJyKSB7IH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNab29taW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVkcmF3KClcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlID0geyBjOiBudWxsLCBkeDogMCwgZHk6IDAsIGY6IDEgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vblpvb21FbmRGdW4pIHRoaXMub25ab29tRW5kRnVuKGUpXG5cbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgeihzZWxlY3QodGhpcy5jYW52YXMpKVxuXG4gICAgICAgICAgICBjb25zdCBoYW5kbGVab29tID0gKGV2ZW50LCB6b29tRmFjdG9yKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gY2FuY2VsIG9uZ29pbmcgZGF0YSByZXF1ZXN0c1xuICAgICAgICAgICAgICAgIHRoaXMuY2FuY2VsQ3VycmVudFJlcXVlc3RzKClcbiAgICAgICAgICAgICAgICBjb25zdCBzZSA9IGV2ZW50LnNvdXJjZUV2ZW50XG5cbiAgICAgICAgICAgICAgICBpZiAoc2UgaW5zdGFuY2VvZiBXaGVlbEV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vem9vbSBhdCB0aGUgbW91c2UgcG9zaXRpb25cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hcHBseVpvb20oXG4gICAgICAgICAgICAgICAgICAgICAgICB6b29tRmFjdG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5waXhUb0dlb1goc2Uub2Zmc2V0WCksXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBpeFRvR2VvWShzZS5vZmZzZXRZKVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzZSBpbnN0YW5jZW9mIFRvdWNoRXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9jb21wdXRlIGF2ZXJhZ2UgcG9zaXRpb24gb2YgdGhlIHRvdWNoZXNcbiAgICAgICAgICAgICAgICAgICAgbGV0IHR4ID0gMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5ID0gMFxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB0dCBvZiBzZS50YXJnZXRUb3VjaGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eCArPSB0dC5jbGllbnRYXG4gICAgICAgICAgICAgICAgICAgICAgICB0eSArPSB0dC5jbGllbnRZXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdHggLz0gc2UudGFyZ2V0VG91Y2hlcy5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgdHkgLz0gc2UudGFyZ2V0VG91Y2hlcy5sZW5ndGhcblxuICAgICAgICAgICAgICAgICAgICAvLyBBZGp1c3QgZm9yIGNvbnRhaW5lcidzIG9mZnNldFxuICAgICAgICAgICAgICAgICAgICAvLyB0eCAtPSBjb250YWluZXJSZWN0LmxlZnRcbiAgICAgICAgICAgICAgICAgICAgLy8gdHkgLT0gY29udGFpbmVyUmVjdC50b3BcblxuICAgICAgICAgICAgICAgICAgICAvL3pvb20gYXQgdGhpcyBhdmVyYWdlIHBvc2l0aW9uXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlab29tKHpvb21GYWN0b3IsIHRoaXMucGl4VG9HZW9YKHR4KSwgdGhpcy5waXhUb0dlb1kodHkpKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vY2VudGVyIGV4dGVudFxuICAgICAgICAvKiogQHR5cGUge251bWJlcnx1bmRlZmluZWR9ICovXG4gICAgICAgIHRoaXMueE1pbiA9IG9wdHMuY2VudGVyRXh0ZW50ID8gb3B0cy5jZW50ZXJFeHRlbnRbMF0gOiB1bmRlZmluZWRcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ8dW5kZWZpbmVkfSAqL1xuICAgICAgICB0aGlzLnlNaW4gPSBvcHRzLmNlbnRlckV4dGVudCA/IG9wdHMuY2VudGVyRXh0ZW50WzFdIDogdW5kZWZpbmVkXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfHVuZGVmaW5lZH0gKi9cbiAgICAgICAgdGhpcy54TWF4ID0gb3B0cy5jZW50ZXJFeHRlbnQgPyBvcHRzLmNlbnRlckV4dGVudFsyXSA6IHVuZGVmaW5lZFxuICAgICAgICAvKiogQHR5cGUge251bWJlcnx1bmRlZmluZWR9ICovXG4gICAgICAgIHRoaXMueU1heCA9IG9wdHMuY2VudGVyRXh0ZW50ID8gb3B0cy5jZW50ZXJFeHRlbnRbM10gOiB1bmRlZmluZWRcblxuICAgICAgICAvKiogWm9vbSBleHRlbnQsIHRvIGxpbWl0IHpvb20gaW4gYW5kIG91dFxuICAgICAgICAgKiAgQHR5cGUge0FycmF5LjxudW1iZXI+fSAqL1xuICAgICAgICB0aGlzLnpvb21FeHRlbnQgPSBvcHRzLnpvb21FeHRlbnQgfHwgWzAsIEluZmluaXR5XVxuXG4gICAgICAgIC8qKiBDYW52YXMgc3RhdGUsIHRvIGJlIHVzZWQgdG8gYXZvaWQgdW5uZWNlc3NhcnkgcmVkcmF3cyBvbiB6b29tL3BhblxuICAgICAgICAgKiAgQHR5cGUge3tjOkhUTUxDYW52YXNFbGVtZW50fG51bGwsZHg6bnVtYmVyLGR5Om51bWJlcixmOm51bWJlcn19ICovXG4gICAgICAgIHRoaXMuY2FudmFzU2F2ZSA9IHsgYzogbnVsbCwgZHg6IDAsIGR5OiAwLCBmOiAxIH1cbiAgICB9XG5cbiAgICAvKipcbiAqIEBwYXJhbSB7bnVtYmVyfSBkeEdlb1xuICogQHBhcmFtIHtudW1iZXJ9IGR5R2VvXG4gKi9cbiAgICBhcHBseVBhbihkeEdlbyA9IDAsIGR5R2VvID0gMCkge1xuICAgICAgICAvL2Vuc3VyZXMgeC95IGV4dGVudFxuICAgICAgICBpZiAodGhpcy54TWluICE9IHVuZGVmaW5lZCAmJiB0aGlzLnZpZXcueCArIGR4R2VvIDwgdGhpcy54TWluKSBkeEdlbyA9IHRoaXMueE1pbiAtIHRoaXMudmlldy54XG4gICAgICAgIGlmICh0aGlzLnlNaW4gIT0gdW5kZWZpbmVkICYmIHRoaXMudmlldy55ICsgZHlHZW8gPCB0aGlzLnlNaW4pIGR5R2VvID0gdGhpcy55TWluIC0gdGhpcy52aWV3LnlcbiAgICAgICAgaWYgKHRoaXMueE1heCAhPSB1bmRlZmluZWQgJiYgdGhpcy52aWV3LnggKyBkeEdlbyA+IHRoaXMueE1heCkgZHhHZW8gPSB0aGlzLnhNYXggLSB0aGlzLnZpZXcueFxuICAgICAgICBpZiAodGhpcy55TWF4ICE9IHVuZGVmaW5lZCAmJiB0aGlzLnZpZXcueSArIGR5R2VvID4gdGhpcy55TWF4KSBkeUdlbyA9IHRoaXMueU1heCAtIHRoaXMudmlldy55XG5cbiAgICAgICAgLy9wYW5cbiAgICAgICAgdGhpcy52aWV3LnggKz0gZHhHZW9cbiAgICAgICAgdGhpcy52aWV3LnkgKz0gZHlHZW9cbiAgICAgICAgdGhpcy51cGRhdGVFeHRlbnRHZW8oKVxuXG4gICAgICAgIGlmICh0aGlzLmNhbnZhc1NhdmUuYykge1xuICAgICAgICAgICAgY29uc3Qgc2NhbGUgPSAxIC8gdGhpcy52aWV3LnpcblxuICAgICAgICAgICAgLy8gVXBkYXRlIHNhdmVkIGNhbnZhcyBvZmZzZXRcbiAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZS5keCAtPSBkeEdlbyAqIHNjYWxlXG4gICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUuZHkgKz0gZHlHZW8gKiBzY2FsZVxuXG4gICAgICAgICAgICAvLyBjbGVhciBjYW52YXNcbiAgICAgICAgICAgIHRoaXMuY2xlYXIodGhpcy5iYWNrZ3JvdW5kQ29sb3IpXG5cbiAgICAgICAgICAgIC8vIHRoaXMgZG9lc250IHdvcmsgb24gbW9iaWxlIGh0dHBzOi8vZ2l0aHViLmNvbS9ldXJvc3RhdC9ncmlkdml6L2lzc3Vlcy85OFxuICAgICAgICAgICAgLy90aGlzLmN0eC5kcmF3SW1hZ2UodGhpcy5jYW52YXNTYXZlLmMsIHRoaXMuY2FudmFzU2F2ZS5keCwgdGhpcy5jYW52YXNTYXZlLmR5KVxuICAgICAgICAgICAgdGhpcy5vZmZzY3JlZW5DdHguZHJhd0ltYWdlKHRoaXMuY2FudmFzU2F2ZS5jLCB0aGlzLmNhbnZhc1NhdmUuZHgsIHRoaXMuY2FudmFzU2F2ZS5keSlcblxuICAgICAgICAgICAgLy8gUmVuZGVyIHRoZSBvZmZzY3JlZW4gY2FudmFzIHRvIHRoZSB2aXNpYmxlIGNvbnRleHRcbiAgICAgICAgICAgIHRoaXMuY3R4LmRyYXdJbWFnZSh0aGlzLm9mZnNjcmVlbkN0eC5jYW52YXMsIDAsIDApXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnbm8gY2FudmFzIHNhdmUnKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogWm9vbS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZiBUaGUgem9vbSBmYWN0b3IsIHdpdGhpbiBdMCwgSW5maW5pdHldLiAxIGlzIGZvciBubyBjaGFuZ2UuIDwxIHRvIHpvb20taW4sID4xIHRvIHpvb20tb3V0LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4R2VvIFRoZSB4IGdlbyBwb3NpdGlvbiBmaXhlZCBpbiB0aGUgc2NyZWVuLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5R2VvIFRoZSB5IGdlbyBwb3NpdGlvbiBmaXhlZCBpbiB0aGUgc2NyZWVuLlxuICAgICAqL1xuICAgIGFwcGx5Wm9vbShmID0gMSwgeEdlbyA9IHRoaXMudmlldy54LCB5R2VvID0gdGhpcy52aWV3LnkpIHtcbiAgICAgICAgLy9UT0RPIGZvcmNlIGdlbyBleHRlbmQgdG8gcmVtYWluXG5cbiAgICAgICAgLy90cnlpbmcgdG8gem9vbSBpbi9vdXQgYmV5b25kIGxpbWl0XG4gICAgICAgIGlmICh0aGlzLnpvb21FeHRlbnRbMF0gPT0gdGhpcy52aWV3LnogJiYgZiA8PSAxKSByZXR1cm5cbiAgICAgICAgaWYgKHRoaXMuem9vbUV4dGVudFsxXSA9PSB0aGlzLnZpZXcueiAmJiBmID49IDEpIHJldHVyblxuXG4gICAgICAgIC8vZW5zdXJlIHpvb20gZXh0ZW50IHByZXNlcnZlZFxuICAgICAgICBjb25zdCBuZXdaZiA9IGYgKiB0aGlzLnZpZXcuelxuICAgICAgICBpZiAobmV3WmYgPCB0aGlzLnpvb21FeHRlbnRbMF0pIGYgPSB0aGlzLnpvb21FeHRlbnRbMF0gLyB0aGlzLnZpZXcuelxuICAgICAgICBpZiAobmV3WmYgPiB0aGlzLnpvb21FeHRlbnRbMV0pIGYgPSB0aGlzLnpvb21FeHRlbnRbMV0gLyB0aGlzLnZpZXcuelxuXG4gICAgICAgIHRoaXMudmlldy56ICo9IGZcblxuICAgICAgICAvL2NvbXB1dGUgcGFuXG4gICAgICAgIGxldCBkeEdlbyA9ICh4R2VvIC0gdGhpcy52aWV3LngpICogKDEgLSBmKVxuICAgICAgICBsZXQgZHlHZW8gPSAoeUdlbyAtIHRoaXMudmlldy55KSAqICgxIC0gZilcblxuICAgICAgICAvL2Vuc3VyZXMgeC95IGV4dGVudFxuICAgICAgICBpZiAodGhpcy54TWluICE9IHVuZGVmaW5lZCAmJiB0aGlzLnZpZXcueCArIGR4R2VvIDwgdGhpcy54TWluKSBkeEdlbyA9IHRoaXMueE1pbiAtIHRoaXMudmlldy54XG4gICAgICAgIGlmICh0aGlzLnlNaW4gIT0gdW5kZWZpbmVkICYmIHRoaXMudmlldy55ICsgZHlHZW8gPCB0aGlzLnlNaW4pIGR5R2VvID0gdGhpcy55TWluIC0gdGhpcy52aWV3LnlcbiAgICAgICAgaWYgKHRoaXMueE1heCAhPSB1bmRlZmluZWQgJiYgdGhpcy52aWV3LnggKyBkeEdlbyA+IHRoaXMueE1heCkgZHhHZW8gPSB0aGlzLnhNYXggLSB0aGlzLnZpZXcueFxuICAgICAgICBpZiAodGhpcy55TWF4ICE9IHVuZGVmaW5lZCAmJiB0aGlzLnZpZXcueSArIGR5R2VvID4gdGhpcy55TWF4KSBkeUdlbyA9IHRoaXMueU1heCAtIHRoaXMudmlldy55XG5cbiAgICAgICAgLy9wYW5cbiAgICAgICAgdGhpcy52aWV3LnggKz0gZHhHZW9cbiAgICAgICAgdGhpcy52aWV3LnkgKz0gZHlHZW9cbiAgICAgICAgdGhpcy51cGRhdGVFeHRlbnRHZW8oKVxuXG4gICAgICAgIHRoaXMuX2RyYXdab29tRnJhbWUoZiwgeEdlbywgeUdlbylcbiAgICB9XG5cbiAgICBfZHJhd1pvb21GcmFtZShmLCB4R2VvLCB5R2VvKSB7XG4gICAgICAgIC8vIHpvb20gaW4gb24gdGhlIGN1cnJlbnQgY2FudmFzIHN0YXRlXG4gICAgICAgIGlmICh0aGlzLmNhbnZhc1NhdmUuYykge1xuICAgICAgICAgICAgdGhpcy5jbGVhcih0aGlzLmJhY2tncm91bmRDb2xvcilcbiAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZS5mIC89IGZcbiAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZS5keCA9IHRoaXMuZ2VvVG9QaXhYKHhHZW8pICogKDEgLSB0aGlzLmNhbnZhc1NhdmUuZilcbiAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZS5keSA9IHRoaXMuZ2VvVG9QaXhZKHlHZW8pICogKDEgLSB0aGlzLmNhbnZhc1NhdmUuZilcbiAgICAgICAgICAgIHRoaXMuY2xlYXIodGhpcy5iYWNrZ3JvdW5kQ29sb3IpXG4gICAgICAgICAgICB0aGlzLm9mZnNjcmVlbkN0eC5kcmF3SW1hZ2UoXG4gICAgICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLmMsXG4gICAgICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLmR4LFxuICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZS5keSxcbiAgICAgICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUuZiAqIHRoaXMuY2FudmFzU2F2ZS5jLndpZHRoLFxuICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZS5mICogdGhpcy5jYW52YXNTYXZlLmMuaGVpZ2h0XG4gICAgICAgICAgICApXG4gICAgICAgICAgICB0aGlzLmN0eC5kcmF3SW1hZ2UoXG4gICAgICAgICAgICAgICAgdGhpcy5vZmZzY3JlZW5DYW52YXMsIC8vIFVzZSBvZmZzY3JlZW4gY2FudmFzIGFzIHRoZSBzb3VyY2VcbiAgICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICAgIDAsIC8vIFBvc2l0aW9uIHRoZSBvZmZzY3JlZW4gY2FudmFzIGF0IHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIG1haW4gY2FudmFzXG4gICAgICAgICAgICAgICAgdGhpcy5jYW52YXMud2lkdGgsIC8vIFRoZSB3aWR0aCBvZiB0aGUgdmlzaWJsZSBjYW52YXNcbiAgICAgICAgICAgICAgICB0aGlzLmNhbnZhcy5oZWlnaHQgLy8gVGhlIGhlaWdodCBvZiB0aGUgdmlzaWJsZSBjYW52YXNcbiAgICAgICAgICAgIClcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICogQ2xlYXIuIFRvIGJlIHVzZWQgYmVmb3JlIGEgcmVkcmF3IGZvciBleGFtcGxlLlxuICogQHBhcmFtIHtzdHJpbmd9IGNvbG9yXG4gKi9cbiAgICBjbGVhcihjb2xvciA9ICd3aGl0ZScpIHtcbiAgICAgICAgaWYgKHRoaXMub3B0cy50cmFuc3BhcmVudEJhY2tncm91bmQpIHtcbiAgICAgICAgICAgIHRoaXMuY3R4LmNsZWFyUmVjdCgwLCAwLCB0aGlzLncsIHRoaXMuaClcbiAgICAgICAgICAgIHRoaXMub2Zmc2NyZWVuQ3R4LmNsZWFyUmVjdCgwLCAwLCB0aGlzLncsIHRoaXMuaClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmN0eCkgdGhpcy5jdHguZmlsbFN0eWxlID0gY29sb3JcbiAgICAgICAgICAgIGlmICh0aGlzLm9mZnNjcmVlbkN0eCkgdGhpcy5vZmZzY3JlZW5DdHguZmlsbFN0eWxlID0gY29sb3JcbiAgICAgICAgICAgIHRoaXMuY3R4LmZpbGxSZWN0KDAsIDAsIHRoaXMudywgdGhpcy5oKVxuICAgICAgICAgICAgdGhpcy5vZmZzY3JlZW5DdHguZmlsbFJlY3QoMCwgMCwgdGhpcy53LCB0aGlzLmgpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQHJldHVybnMge1ZpZXd9ICovXG4gICAgZ2V0VmlldygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlld1xuICAgIH1cblxuICAgIC8qKiBAcGFyYW0ge0FycmF5LjxudW1iZXI+fSB2ICovXG4gICAgc2V0Q2VudGVyRXh0ZW50KHYpIHtcbiAgICAgICAgdGhpcy54TWluID0gdlswXVxuICAgICAgICB0aGlzLnlNaW4gPSB2WzFdXG4gICAgICAgIHRoaXMueE1heCA9IHZbMl1cbiAgICAgICAgdGhpcy55TWF4ID0gdlszXVxuICAgIH1cbiAgICAvKiogQHJldHVybnMge0FycmF5LjxudW1iZXJ8dW5kZWZpbmVkPn0gKi9cbiAgICBnZXRDZW50ZXJFeHRlbnQoKSB7XG4gICAgICAgIHJldHVybiBbdGhpcy54TWluLCB0aGlzLnlNaW4sIHRoaXMueE1heCwgdGhpcy55TWF4XVxuICAgIH1cblxuICAgIC8qKiBAcGFyYW0ge0FycmF5LjxudW1iZXI+fSB2ICovXG4gICAgc2V0Wm9vbUV4dGVudCh2KSB7XG4gICAgICAgIHRoaXMuem9vbUV4dGVudCA9IHZcbiAgICB9XG4gICAgLyoqIEByZXR1cm5zIHtBcnJheS48bnVtYmVyPn0gKi9cbiAgICBnZXRab29tRXh0ZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy56b29tRXh0ZW50XG4gICAgfVxuXG4gICAgLyoqIEluaXRpYWxpc2UgY2FudmFzIHRyYW5zZm9ybSB3aXRoIGlkZW50aXR5IHRyYW5zZm9ybWF0aW9uLiAqL1xuICAgIGluaXRDYW52YXNUcmFuc2Zvcm0oKSB7XG4gICAgICAgIHRoaXMuY3R4LnNldFRyYW5zZm9ybSgxLCAwLCAwLCAxLCAwLCAwKVxuICAgICAgICB0aGlzLm9mZnNjcmVlbkN0eC5zZXRUcmFuc2Zvcm0oMSwgMCwgMCwgMSwgMCwgMClcbiAgICB9XG5cbiAgICAvKiogSW5pdGlhbGlzZSBjYW52YXMgdHJhbnNmb3JtIHdpdGggZ2VvIHRvIHNjcmVlbiB0cmFuc2Zvcm1hdGlvbiwgc28gdGhhdCBnZW8gb2JqZWN0cyBjYW4gYmUgZHJhd24gZGlyZWN0bHkgaW4gZ2VvIGNvb3JkaW5hdGVzLiAqL1xuICAgIHNldENhbnZhc1RyYW5zZm9ybSgpIHtcbiAgICAgICAgY29uc3QgayA9IDEgLyB0aGlzLnZpZXcuelxuICAgICAgICBjb25zdCB0eCA9IC10aGlzLnZpZXcueCAvIHRoaXMudmlldy56ICsgdGhpcy53ICogMC41XG4gICAgICAgIGNvbnN0IHR5ID0gdGhpcy52aWV3LnkgLyB0aGlzLnZpZXcueiArIHRoaXMuaCAqIDAuNVxuICAgICAgICB0aGlzLmN0eC5zZXRUcmFuc2Zvcm0oaywgMCwgMCwgLWssIHR4LCB0eSlcbiAgICAgICAgdGhpcy5vZmZzY3JlZW5DdHguc2V0VHJhbnNmb3JtKGssIDAsIDAsIC1rLCB0eCwgdHkpXG4gICAgfVxuXG4gICAgLyoqIEdldCB0aGUgdHJhbnNmb3JtYXRpb24gbWF0cml4IHRvIHdlYkdMIHNjcmVlbiBjb29yZGluYXRlcywgd2l0aGluIFstMSwxXSpbLTEsMV0gKi9cbiAgICBnZXRXZWJHTFRyYW5zZm9ybSgpIHtcbiAgICAgICAgY29uc3Qga3ggPSAyLjAgLyAodGhpcy53ICogdGhpcy52aWV3LnopXG4gICAgICAgIGNvbnN0IGt5ID0gMi4wIC8gKHRoaXMuaCAqIHRoaXMudmlldy56KVxuICAgICAgICByZXR1cm4gW2t4LCAwLjAsIDAuMCwgMC4wLCBreSwgMC4wLCAta3ggKiB0aGlzLnZpZXcueCwgLWt5ICogdGhpcy52aWV3LnksIDEuMF1cbiAgICB9XG5cbiAgICAvKiogVGhlIGZ1bmN0aW9uIHNwZWNpZnlpbmcgaG93IHRvIGRyYXcgdGhlIG1hcC4gKi9cbiAgICByZWRyYXcoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIHJlZHJhdyBub3QgaW1wbGVtZW50ZWQuJylcbiAgICB9XG5cbiAgICAvKiogV2hlbiB0aGUgem9vbSBsZXZlbCBjaGFuZ2VzLCBlbnN1cmVzIHRoYXQgYW55IG9uZ29pbmcgcmVxdWVzdHMgYXJlIGFib3J0ZWQgYmVmb3JlIG5ldyBvbmVzIGFyZSBpbml0aWF0ZWQuICovXG4gICAgY2FuY2VsQ3VycmVudFJlcXVlc3RzKCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBjYW5jZWxDdXJyZW50UmVxdWVzdHMgbm90IGltcGxlbWVudGVkLicpXG4gICAgfVxuXG5cblxuXG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbWFyZ2luUHhcbiAgICAgKiBAcmV0dXJucyB7RW52ZWxvcGV9IFRoZSBlbnZlbG9wZSBvZiB0aGUgdmlldywgaW4gZ2VvIGNvb3JkaW5hdGVzLlxuICAgICAqL1xuICAgIHVwZGF0ZUV4dGVudEdlbyhtYXJnaW5QeCA9IDIwKSB7XG4gICAgICAgIHRoaXMuZXh0R2VvID0ge1xuICAgICAgICAgICAgeE1pbjogdGhpcy5waXhUb0dlb1goLW1hcmdpblB4KSxcbiAgICAgICAgICAgIHhNYXg6IHRoaXMucGl4VG9HZW9YKHRoaXMudyArIG1hcmdpblB4KSxcbiAgICAgICAgICAgIHlNaW46IHRoaXMucGl4VG9HZW9ZKHRoaXMuaCArIG1hcmdpblB4KSxcbiAgICAgICAgICAgIHlNYXg6IHRoaXMucGl4VG9HZW9ZKC1tYXJnaW5QeCksXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZXh0R2VvXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgdGhlIG9iamVjdCBoYXMgdG8gYmUgZHJhd25cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7e3g6bnVtYmVyLHk6bnVtYmVyfX0gb2JqXG4gICAgICovXG4gICAgdG9EcmF3KG9iaikge1xuICAgICAgICBpZiAob2JqLnggPCB0aGlzLmV4dEdlby54TWluKSByZXR1cm4gZmFsc2VcbiAgICAgICAgaWYgKG9iai54ID4gdGhpcy5leHRHZW8ueE1heCkgcmV0dXJuIGZhbHNlXG4gICAgICAgIGlmIChvYmoueSA8IHRoaXMuZXh0R2VvLnlNaW4pIHJldHVybiBmYWxzZVxuICAgICAgICBpZiAob2JqLnkgPiB0aGlzLmV4dEdlby55TWF4KSByZXR1cm4gZmFsc2VcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICAvL2NvbnZlcnNpb24gZnVuY3Rpb25zXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHhHZW8gR2VvIHggY29vcmRpbmF0ZSwgaW4gbS5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBTY3JlZW4geCBjb29yZGluYXRlLCBpbiBwaXguXG4gICAgICovXG4gICAgZ2VvVG9QaXhYKHhHZW8pIHtcbiAgICAgICAgcmV0dXJuICh4R2VvIC0gdGhpcy52aWV3LngpIC8gdGhpcy52aWV3LnogKyB0aGlzLncgKiAwLjVcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHlHZW8gR2VvIHkgY29vcmRpbmF0ZSwgaW4gbS5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBTY3JlZW4geSBjb29yZGluYXRlLCBpbiBwaXguXG4gICAgICovXG4gICAgZ2VvVG9QaXhZKHlHZW8pIHtcbiAgICAgICAgcmV0dXJuIC0oeUdlbyAtIHRoaXMudmlldy55KSAvIHRoaXMudmlldy56ICsgdGhpcy5oICogMC41XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4IFNjcmVlbiB4IGNvb3JkaW5hdGUsIGluIHBpeC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBHZW8geCBjb29yZGluYXRlLCBpbiBtLlxuICAgICAqL1xuICAgIHBpeFRvR2VvWCh4KSB7XG4gICAgICAgIHJldHVybiAoeCAtIHRoaXMudyAqIDAuNSkgKiB0aGlzLnZpZXcueiArIHRoaXMudmlldy54XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5IFNjcmVlbiB5IGNvb3JkaW5hdGUsIGluIHBpeC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBHZW8geSBjb29yZGluYXRlLCBpbiBtLlxuICAgICAqL1xuICAgIHBpeFRvR2VvWSh5KSB7XG4gICAgICAgIHJldHVybiAtKHkgLSB0aGlzLmggKiAwLjUpICogdGhpcy52aWV3LnogKyB0aGlzLnZpZXcueVxuICAgIH1cblxuICAgIC8qKiBHZXQgeCx5LHogZWxlbWVudHMgZnJvbSBVUkwgYW5kIGFzc2lnbiB0aGVtIHRvIHRoZSB2aWV3LiAqL1xuICAgIHNldFZpZXdGcm9tVVJMKCkge1xuICAgICAgICBjb25zdCB4ID0gR2VvQ2FudmFzLmdldFBhcmFtZXRlckJ5TmFtZSgneCcpLFxuICAgICAgICAgICAgeSA9IEdlb0NhbnZhcy5nZXRQYXJhbWV0ZXJCeU5hbWUoJ3knKSxcbiAgICAgICAgICAgIHogPSBHZW9DYW52YXMuZ2V0UGFyYW1ldGVyQnlOYW1lKCd6JylcbiAgICAgICAgaWYgKHggIT0gbnVsbCAmJiB4ICE9IHVuZGVmaW5lZCAmJiAhaXNOYU4oK3gpKSB0aGlzLnZpZXcueCA9ICt4XG4gICAgICAgIGlmICh5ICE9IG51bGwgJiYgeSAhPSB1bmRlZmluZWQgJiYgIWlzTmFOKCt5KSkgdGhpcy52aWV3LnkgPSAreVxuICAgICAgICBpZiAoeiAhPSBudWxsICYmIHogIT0gdW5kZWZpbmVkICYmICFpc05hTigreikpIHRoaXMudmlldy56ID0gK3pcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYSBVUkwgcGFyYW1ldGVyIGJ5IG5hbWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgICAqIEByZXR1cm5zIHtzdHJpbmcgfCBudWxsfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRQYXJhbWV0ZXJCeU5hbWUobmFtZSkge1xuICAgICAgICBuYW1lID0gbmFtZS5yZXBsYWNlKC9bXFxbXS8sICdcXFxcWycpLnJlcGxhY2UoL1tcXF1dLywgJ1xcXFxdJylcbiAgICAgICAgdmFyIHJlZ2V4ID0gbmV3IFJlZ0V4cCgnW1xcXFw/Jl0nICsgbmFtZSArICc9KFteJiNdKiknKSxcbiAgICAgICAgICAgIHJlc3VsdHMgPSByZWdleC5leGVjKGxvY2F0aW9uLnNlYXJjaClcbiAgICAgICAgcmV0dXJuICFyZXN1bHRzID8gbnVsbCA6IGRlY29kZVVSSUNvbXBvbmVudChyZXN1bHRzWzFdLnJlcGxhY2UoL1xcKy9nLCAnICcpKVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgRHJhd2FibGUgfSBmcm9tICcuL0RyYXdhYmxlLmpzJ1xuXG4vKipcbiAqIEBtb2R1bGUgY29yZVxuICogQGFic3RyYWN0XG4gKiBAYXV0aG9yIEpvc2VwaCBEYXZpZXMsIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBMYXllciBleHRlbmRzIERyYXdhYmxlIHtcbiAgICAvKipcbiAgICAgKiBEcmF3IGxheWVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuL0dlb0NhbnZhc1wiKS5HZW9DYW52YXN9IGdlb0NhbnZhcyBUaGUgY2FudmFzIHdoZXJlIHRvIGRyYXcgdGhlIGxheWVyLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBsZWdlbmRcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKiBAYWJzdHJhY3RcbiAgICAgKi9cbiAgICBkcmF3KGdlb0NhbnZhcywgbGVnZW5kID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIGRyYXcgbm90IGltcGxlbWVudGVkLicpXG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBzZWxlY3QgfSBmcm9tICdkMy1zZWxlY3Rpb24nXG5cbi8qKlxuICogQSBsZWdlbmQgY29udGFpbmVyLlxuICpcbiAqIEBtb2R1bGUgY29yZVxuICogQGF1dGhvciBKb3NlcGggRGF2aWVzLCBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgTGVnZW5kIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0c1xuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpcy5pZCA9IG9wdHMuaWRcblxuICAgICAgICAvL1RPRE8gc3RvcCB1c2luZyBpdC4gVXNlIHN0eWxlIG1ldGhvZCBiZWxvdyBpbnN0ZWFkLlxuXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSBAZGVwcmVjYXRlZCAqL1xuICAgICAgICB0aGlzLnRvcCA9IG9wdHMudG9wXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSBAZGVwcmVjYXRlZCAqL1xuICAgICAgICB0aGlzLmJvdHRvbSA9IG9wdHMuYm90dG9tXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSBAZGVwcmVjYXRlZCAqL1xuICAgICAgICB0aGlzLmxlZnQgPSBvcHRzLmxlZnRcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9IEBkZXByZWNhdGVkICovXG4gICAgICAgIHRoaXMucmlnaHQgPSBvcHRzLnJpZ2h0XG4gICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSBAZGVwcmVjYXRlZCAqL1xuICAgICAgICB0aGlzLmJhY2tncm91bmQgPSBvcHRzLmJhY2tncm91bmQgfHwgJ25vbmUnXG4gICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSBAZGVwcmVjYXRlZCAqL1xuICAgICAgICB0aGlzLnBhZGRpbmcgPSBvcHRzLnBhZGRpbmcgfHwgJzVweCdcbiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9IEBkZXByZWNhdGVkICovXG4gICAgICAgIHRoaXMuYm9yZGVyID0gb3B0cy5ib3JkZXIgfHwgJzBweCdcbiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9IEBkZXByZWNhdGVkICovXG4gICAgICAgIHRoaXNbJ2JvcmRlci1yYWRpdXMnXSA9IG9wdHNbJ2JvcmRlci1yYWRpdXMnXSB8fCAnbm9uZSdcbiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9IEBkZXByZWNhdGVkICovXG4gICAgICAgIHRoaXNbJ2JveC1zaGFkb3cnXSA9IG9wdHNbJ2JveC1zaGFkb3cnXSB8fCAnbm9uZSdcbiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9IEBkZXByZWNhdGVkICovXG4gICAgICAgIHRoaXNbJ2ZvbnQtZmFtaWx5J10gPSBvcHRzWydmb250LWZhbWlseSddIHx8ICdIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmJ1xuICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gQGRlcHJlY2F0ZWQgKi9cbiAgICAgICAgLy90aGlzLndpZHRoID0gb3B0cy53aWR0aFxuICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gQGRlcHJlY2F0ZWQgKi9cbiAgICAgICAgLy90aGlzLmhlaWdodCA9IG9wdHMuaGVpZ2h0XG5cbiAgICAgICAgLy90aGUgZGl2IGVsZW1lbnRcbiAgICAgICAgaWYgKHRoaXMuaWQpIHRoaXMuZGl2ID0gc2VsZWN0KCcjJyArIHRoaXMuaWQpXG5cbiAgICAgICAgaWYgKCF0aGlzLmRpdiB8fCB0aGlzLmRpdi5lbXB0eSgpKSB7XG4gICAgICAgICAgICB0aGlzLmRpdiA9IHNlbGVjdChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSlcbiAgICAgICAgICAgIGlmICh0aGlzLmlkKSB0aGlzLmRpdi5hdHRyKCdpZCcsIHRoaXMuaWQpXG4gICAgICAgIH1cblxuICAgICAgICAvL3NldCBzdHlsZVxuICAgICAgICB0aGlzLmRpdi5zdHlsZSgnYmFja2dyb3VuZCcsIHRoaXMuYmFja2dyb3VuZClcbiAgICAgICAgdGhpcy5kaXYuc3R5bGUoJ3BhZGRpbmcnLCB0aGlzLnBhZGRpbmcpXG4gICAgICAgIHRoaXMuZGl2LnN0eWxlKCdib3JkZXInLCB0aGlzLmJvcmRlcilcbiAgICAgICAgdGhpcy5kaXYuc3R5bGUoJ2JvcmRlci1yYWRpdXMnLCB0aGlzWydib3JkZXItcmFkaXVzJ10pXG4gICAgICAgIHRoaXMuZGl2LnN0eWxlKCdib3gtc2hhZG93JywgdGhpc1snYm94LXNoYWRvdyddKVxuICAgICAgICB0aGlzLmRpdi5zdHlsZSgnZm9udC1mYW1pbHknLCB0aGlzWydmb250LWZhbWlseSddKVxuXG4gICAgICAgIC8vaWYgKHRoaXMud2lkdGgpIHRoaXMuZGl2LnN0eWxlKCd3aWR0aCcsIHRoaXMud2lkdGgpXG4gICAgICAgIC8vaWYgKHRoaXMuaGVpZ2h0KSB0aGlzLmRpdi5zdHlsZSgnaGVpZ2h0JywgdGhpcy5oZWlnaHQpXG5cbiAgICAgICAgLy90aXRsZVxuICAgICAgICB0aGlzLnRpdGxlID0gb3B0cy50aXRsZVxuICAgICAgICB0aGlzLnRpdGxlRm9udFNpemUgPSBvcHRzLnRpdGxlRm9udFNpemUgfHwgJzAuOGVtJ1xuICAgICAgICB0aGlzLnRpdGxlRm9udFdlaWdodCA9IG9wdHMudGl0bGVGb250V2VpZ2h0IHx8ICdib2xkJ1xuXG4gICAgICAgIC8vbGFiZWxcbiAgICAgICAgdGhpcy5sYWJlbEZvbnRTaXplID0gb3B0cy5sYWJlbEZvbnRTaXplIHx8ICcwLjhlbSdcbiAgICAgICAgdGhpcy5sYWJlbFVuaXRUZXh0ID0gb3B0cy5sYWJlbFVuaXRUZXh0IHx8ICcnXG4gICAgICAgIHRoaXMubGFiZWxGb3JtYXQgPSBvcHRzLmxhYmVsRm9ybWF0XG4gICAgfVxuXG4gICAgbWFrZVRpdGxlKCkge1xuICAgICAgICBpZiAoIXRoaXMudGl0bGUpIHJldHVyblxuICAgICAgICB0aGlzLmRpdlxuICAgICAgICAgICAgLmFwcGVuZCgnZGl2JylcbiAgICAgICAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgdGhpcy50aXRsZUZvbnRTaXplKVxuICAgICAgICAgICAgLnN0eWxlKCdmb250LXdlaWdodCcsIHRoaXMudGl0bGVGb250V2VpZ2h0KVxuICAgICAgICAgICAgLnN0eWxlKCdtYXJnaW4tYm90dG9tJywgJzdweCcpXG4gICAgICAgICAgICAudGV4dCh0aGlzLnRpdGxlKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFwcGx5IGEgc3R5bGUgdG8gdGhlIGxlZ2VuZCBkaXYuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdlxuICAgICAqIEByZXR1cm5zIHt0aGlzfHN0cmluZ31cbiAgICAgKi9cbiAgICBzdHlsZShrLCB2KSB7XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHJldHVybiB0aGlzLmRpdi5zdHlsZShrKVxuICAgICAgICB0aGlzLmRpdi5zdHlsZShrLCB2KVxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzXG4gICAgICogQGFic3RyYWN0XG4gICAgICovXG4gICAgdXBkYXRlKG9wdHMgPSB7fSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdMZWdlbmQgdXBkYXRlIG5vdCBpbXBsZW1lbnRlZCB5ZXQuJylcbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbi8vIGludGVybmFsIGltcG9ydHNcbmltcG9ydCB7IEdlb0NhbnZhcyB9IGZyb20gJy4vR2VvQ2FudmFzLmpzJ1xuaW1wb3J0IHsgVG9vbHRpcCB9IGZyb20gJy4vVG9vbHRpcC5qcydcbmltcG9ydCB7IFpvb21CdXR0b25zIH0gZnJvbSAnLi4vYnV0dG9uL1pvb21CdXR0b25zLmpzJ1xuaW1wb3J0IHsgRnVsbHNjcmVlbkJ1dHRvbiB9IGZyb20gJy4uL2J1dHRvbi9GdWxsc2NyZWVuQnV0dG9uLmpzJ1xuXG4vLyBleHRlcm5hbCBpbXBvcnRzXG5pbXBvcnQgeyBzZWxlY3QgfSBmcm9tICdkMy1zZWxlY3Rpb24nXG5cbi8qKlxuICogQSBncmlkdml6IGFwcGxpY2F0aW9uLlxuICpcbiAqIEBtb2R1bGUgY29yZVxuICogQGF1dGhvciBKb3NlcGggRGF2aWVzLCBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgTWFwIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0hUTUxEaXZFbGVtZW50fSBjb250YWluZXJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb3B0c1xuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGNvbnRhaW5lciwgb3B0cykge1xuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgbGF5ZXJzLlxuICAgICAgICAgKiBAdHlwZSB7QXJyYXkuPGltcG9ydChcIi4vTGF5ZXIuanNcIikuTGF5ZXI+fVxuICAgICAgICAgKiAqL1xuICAgICAgICB0aGlzLmxheWVycyA9IG9wdHMubGF5ZXJzIHx8IFtdXG5cbiAgICAgICAgLy9nZXQgY29udGFpbmVyIGVsZW1lbnRcbiAgICAgICAgdGhpcy5jb250YWluZXIgPSBjb250YWluZXIgfHwgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dyaWR2aXonKVxuICAgICAgICBpZiAoIXRoaXMuY29udGFpbmVyKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdDYW5ub3QgZmluZCBncmlkdml6IGNvbnRhaW5lciBlbGVtZW50LicpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIC8vaHR0cHM6Ly9jc3MtdHJpY2tzLmNvbS9hYnNvbHV0ZS1wb3NpdGlvbmluZy1pbnNpZGUtcmVsYXRpdmUtcG9zaXRpb25pbmcvXG4gICAgICAgIHRoaXMuY29udGFpbmVyLnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJyAvLyBjb250YWluZXIgZWxlbWVudCBtdXN0IGhhdmUgcmVsYXRpdmUgcG9zaXRpb25pbmdcblxuICAgICAgICAvL3NldCBkaW1lbnNpb25zXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLncgPSBvcHRzLncgfHwgdGhpcy5jb250YWluZXIub2Zmc2V0V2lkdGhcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgIHRoaXMuaCA9IG9wdHMuaCB8fCB0aGlzLmNvbnRhaW5lci5vZmZzZXRIZWlnaHRcblxuICAgICAgICAvLyBDcmVhdGUgdGhlIG1haW4gY2FudmFzIChmb3IgcmVuZGVyaW5nIHRvIHNjcmVlbilcbiAgICAgICAgLyoqIEB0eXBlIHtIVE1MQ2FudmFzRWxlbWVudH0gKi9cbiAgICAgICAgdGhpcy5fY2FudmFzID0gb3B0cy5jYW52YXMgfHwgdGhpcy5pbml0aWFsaXNlQ2FudmFzKClcblxuICAgICAgICAvKiogIEluaXRpYWxpemUgR2VvQ2FudmFzXG4gICAgICAgICAqIEB0eXBlIHtHZW9DYW52YXN9XG4gICAgICAgICAqIEBwcml2YXRlICovXG4gICAgICAgIHRoaXMuZ2VvQ2FudmFzID0gbmV3IEdlb0NhbnZhcyh0aGlzLl9jYW52YXMsIG9wdHMueCwgb3B0cy55LCBvcHRzLnosIG9wdHMpXG5cbiAgICAgICAgdGhpcy5nZW9DYW52YXMucmVkcmF3ID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZWRyYXcoKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuZ2VvQ2FudmFzLmNhbmNlbEN1cnJlbnRSZXF1ZXN0cyA9ICgpID0+IHtcbiAgICAgICAgICAgIC8vIHdoZW4gdGhlIHpvb20gbGV2ZWwgY2hhbmdlcywgYXZvaWQgZHJhd2luZyBvdXRkYXRlZCB0aWxlcywgYW5kIGVuc3VyZSB0aGF0IHJlcXVlc3RzIGFyZSBwcm9wZXJseSBhYm9ydGVkIHdoZW4gbmVjZXNzYXJ5XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGxheWVyIG9mIHRoaXMubGF5ZXJzKSB7XG4gICAgICAgICAgICAgICAgLy9tdWx0aXJlc1xuICAgICAgICAgICAgICAgIGlmIChsYXllci5kYXRhc2V0Py5kYXRhc2V0cykge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGRhdGFzZXQgb2YgbGF5ZXIuZGF0YXNldD8uZGF0YXNldHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhc2V0Py5jYW5jZWxDdXJyZW50UmVxdWVzdHMpIGRhdGFzZXQuY2FuY2VsQ3VycmVudFJlcXVlc3RzKClcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvL3NpbmdsZSByZXNcbiAgICAgICAgICAgICAgICBpZiAobGF5ZXIuZGF0YXNldD8uY2FuY2VsQ3VycmVudFJlcXVlc3RzKSBsYXllci5kYXRhc2V0Py5jYW5jZWxDdXJyZW50UmVxdWVzdHMoKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gbGVnZW5kIGRpdlxuICAgICAgICB0aGlzLmxlZ2VuZCA9IG9wdHMubGVnZW5kQ29udGFpbmVyXG4gICAgICAgICAgICA/IHNlbGVjdChvcHRzLmxlZ2VuZENvbnRhaW5lcikgLy8gV3JhcCB0aGUgcHJvdmlkZWQgSFRNTCBub2RlIGluIGEgRDMgc2VsZWN0aW9uXG4gICAgICAgICAgICA6IG51bGxcbiAgICAgICAgaWYgKCF0aGlzLmxlZ2VuZCkgdGhpcy5pbml0aWFsaXNlTGVnZW5kKClcblxuICAgICAgICAvL3Rvb2x0aXBcblxuICAgICAgICAvLyBzZXQgQXBwIGNvbnRhaW5lciBhcyBkZWZhdWx0IHBhcmVudCBlbGVtZW50IGZvciB0b29sdGlwXG4gICAgICAgIGlmICghb3B0cy50b29sdGlwKSBvcHRzLnRvb2x0aXAgPSB7fVxuICAgICAgICBpZiAoIW9wdHMudG9vbHRpcC5wYXJlbnRFbGVtZW50KSBvcHRzLnRvb2x0aXAucGFyZW50RWxlbWVudCA9IHRoaXMuY29udGFpbmVyXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEB0eXBlIHtUb29sdGlwfSAqL1xuICAgICAgICB0aGlzLnRvb2x0aXAgPSBuZXcgVG9vbHRpcChvcHRzLnRvb2x0aXApXG5cbiAgICAgICAgLy8gYWRkIGV2ZW50IGxpc3RlbmVycyB0byBjb250YWluZXJcbiAgICAgICAgdGhpcy5tb3VzZU92ZXJIYW5kbGVyID0gKGUpID0+IHRoaXMuZm9jdXNDZWxsKGUpXG4gICAgICAgIHRoaXMubW91c2VNb3ZlSGFuZGxlciA9IChlKSA9PiB0aGlzLmZvY3VzQ2VsbChlKVxuICAgICAgICB0aGlzLm1vdXNlT3V0SGFuZGxlciA9IChlKSA9PiB0aGlzLnRvb2x0aXAuaGlkZSgpXG4gICAgICAgIHRoaXMuZ2VvQ2FudmFzLmNhbnZhcy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW92ZXInLCB0aGlzLm1vdXNlT3ZlckhhbmRsZXIpXG4gICAgICAgIHRoaXMuZ2VvQ2FudmFzLmNhbnZhcy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLm1vdXNlTW92ZUhhbmRsZXIpXG4gICAgICAgIHRoaXMuZ2VvQ2FudmFzLmNhbnZhcy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW91dCcsIHRoaXMubW91c2VPdXRIYW5kbGVyKVxuXG4gICAgICAgIC8vIGxpc3RlbiBmb3IgcmVzaXplIGV2ZW50cyBvbiB0aGUgQXBwJ3MgY29udGFpbmVyIGFuZCBoYW5kbGUgdGhlbVxuICAgICAgICB0aGlzLmRlZmluZVJlc2l6ZU9ic2VydmVyKClcblxuICAgICAgICAvLyBhZGQgZXh0cmEgbG9naWMgdG8gb25ab29tU3RhcnRGdW5cbiAgICAgICAgdGhpcy5nZW9DYW52YXMub25ab29tU3RhcnRGdW4gPSAoZSkgPT4ge1xuICAgICAgICAgICAgaWYgKG9wdHMub25ab29tU3RhcnRGdW4pIG9wdHMub25ab29tU3RhcnRGdW4oZSlcbiAgICAgICAgICAgIHRoaXMudG9vbHRpcC5oaWRlKClcbiAgICAgICAgfVxuXG4gICAgICAgIC8vZm9yIG1vdXNlIG92ZXJcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEB0eXBlIHtIVE1MQ2FudmFzRWxlbWVudHxudWxsfSAqL1xuICAgICAgICB0aGlzLmNhbnZhc1NhdmUgPSBudWxsXG5cbiAgICAgICAgdGhpcy5zZWxlY3Rpb25SZWN0YW5nbGVDb2xvciA9IG9wdHMuc2VsZWN0aW9uUmVjdGFuZ2xlQ29sb3IgfHwgJyNGRjYzNDcnXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uUmVjdGFuZ2xlV2lkdGhQaXggPSBvcHRzLnNlbGVjdGlvblJlY3RhbmdsZVdpZHRoUGl4IHx8ICgoKSA9PiA0KSAvLyhyLHopID0+IHt9XG5cbiAgICAgICAgLy8gdHJhbnNwYXJlbnQgYmFja2dyb3VuZCAoZS5nLiBsZWFmbGV0KSAncmVkIHBhaW50aW5nJyBmaXhcbiAgICAgICAgdGhpcy50cmFuc3BhcmVudEJhY2tncm91bmQgPSBvcHRzLnRyYW5zcGFyZW50QmFja2dyb3VuZFxuXG4gICAgICAgIC8vc2V0IGRlZmF1bHQgZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uXG4gICAgICAgIHRoaXMuZGVmYXVsdEdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9XG4gICAgICAgICAgICBvcHRzLmRlZmF1bHRHbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gfHwgdGhpcy5nZW9DYW52YXMuY3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvblxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKiBAcmV0dXJucyB7SFRNTENhbnZhc0VsZW1lbnR9XG4gICAgICovXG4gICAgaW5pdGlhbGlzZUNhbnZhcygpIHtcbiAgICAgICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJylcbiAgICAgICAgY2FudmFzLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCAnJyArIHRoaXMudylcbiAgICAgICAgY2FudmFzLnNldEF0dHJpYnV0ZSgnaGVpZ2h0JywgJycgKyB0aGlzLmgpXG4gICAgICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKGNhbnZhcylcbiAgICAgICAgcmV0dXJuIGNhbnZhc1xuICAgIH1cblxuICAgIGluaXRpYWxpc2VMZWdlbmQoKSB7XG4gICAgICAgIHRoaXMubGVnZW5kID0gc2VsZWN0KHRoaXMuY29udGFpbmVyKVxuICAgICAgICAgICAgLmFwcGVuZCgnZGl2JykgLy8gQ3JlYXRlIGEgbmV3IGNvbnRhaW5lclxuICAgICAgICAgICAgLmF0dHIoJ2lkJywgJ2dyaWR2aXotbGVnZW5kJylcbiAgICAgICAgICAgIC5zdHlsZSgncG9zaXRpb24nLCAnYWJzb2x1dGUnKVxuICAgICAgICAgICAgLnN0eWxlKCd3aWR0aCcsICdhdXRvJylcbiAgICAgICAgICAgIC5zdHlsZSgnaGVpZ2h0JywgJ2F1dG8nKVxuICAgICAgICAgICAgLnN0eWxlKCdiYWNrZ3JvdW5kJywgJyNGRkZGRkYnKVxuICAgICAgICAgICAgLy8uc3R5bGUoXCJwYWRkaW5nXCIsIHRoaXMucGFkZGluZylcbiAgICAgICAgICAgIC5zdHlsZSgnYm9yZGVyJywgJzBweCcpXG4gICAgICAgICAgICAvLy5zdHlsZSgnYm9yZGVyLXJhZGl1cycsICc1cHgnKVxuICAgICAgICAgICAgLnN0eWxlKCdib3gtc2hhZG93JywgJzNweCAzcHggM3B4IGdyZXksIC0zcHggLTNweCAzcHggI2RkZCcpXG4gICAgICAgICAgICAuc3R5bGUoJ2ZvbnQtZmFtaWx5JywgJ0hlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWYnKVxuICAgICAgICAgICAgLnN0eWxlKCdib3R0b20nLCAnMTVweCcpXG4gICAgICAgICAgICAuc3R5bGUoJ3JpZ2h0JywgJzE1cHgnKVxuICAgICAgICAvL2hpZGVcbiAgICAgICAgLy8uc3R5bGUoXCJ2aXNpYmlsaXR5XCIsIFwiaGlkZGVuXCIpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0L2dldCBsYXllciBzdGFjay5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7dW5kZWZpbmVkfGltcG9ydChcIi4vTGF5ZXIuanNcIikuTGF5ZXJ8aW1wb3J0KFwiLi9MYXllci5qc1wiKS5MYXllcltdfSBsYXllcnNcbiAgICAgKiBAcmV0dXJucyB7IHRoaXMgfCBpbXBvcnQoXCIuL0xheWVyLmpzXCIpLkxheWVyW10gfVxuICAgICAqL1xuICAgIGxheWVyc18obGF5ZXJzKSB7XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSByZXR1cm4gdGhpcy5sYXllcnNcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShsYXllcnMpKSB0aGlzLmxheWVycyA9IGxheWVyc1xuICAgICAgICAgICAgZWxzZSB0aGlzLmxheWVycyA9IFtsYXllcnNdXG4gICAgICAgIGVsc2UgdGhpcy5sYXllcnMgPSBhcmd1bWVudHNcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKiogQHJldHVybnMge3RoaXN9ICovXG4gICAgcmVkcmF3KCkge1xuICAgICAgICAvL3JlbW92ZSBsZWdlbmQgZWxlbWVudHNcbiAgICAgICAgaWYgKHRoaXMubGVnZW5kKSB0aGlzLmxlZ2VuZC5zZWxlY3RBbGwoJyonKS5yZW1vdmUoKVxuXG4gICAgICAgIC8vY2xlYXJcbiAgICAgICAgdGhpcy5nZW9DYW52YXMuaW5pdENhbnZhc1RyYW5zZm9ybSgpXG4gICAgICAgIHRoaXMuZ2VvQ2FudmFzLmNsZWFyKHRoaXMuZ2VvQ2FudmFzLmJhY2tncm91bmRDb2xvcilcblxuICAgICAgICBjb25zdCB6ID0gdGhpcy5nZW9DYW52YXMudmlldy56XG4gICAgICAgIHRoaXMudXBkYXRlRXh0ZW50R2VvKClcblxuICAgICAgICAvL2dvIHRocm91Z2ggdGhlIGxheWVyc1xuICAgICAgICBmb3IgKGNvbnN0IGxheWVyIG9mIHRoaXMubGF5ZXJzKSB7XG4gICAgICAgICAgICAvL2NoZWNrIGlmIGxheWVyIGlzIHZpc2libGVcbiAgICAgICAgICAgIGlmIChsYXllci52aXNpYmxlICYmICFsYXllci52aXNpYmxlKHopKSBjb250aW51ZVxuXG4gICAgICAgICAgICAvL3NldCBsYXllciBhbHBoYSBhbmQgYmxlbmQgbW9kZVxuICAgICAgICAgICAgdGhpcy5nZW9DYW52YXMub2Zmc2NyZWVuQ3R4Lmdsb2JhbEFscGhhID0gbGF5ZXIuYWxwaGEgPyBsYXllci5hbHBoYSh6KSA6IDEuMFxuICAgICAgICAgICAgaWYgKGxheWVyLmJsZW5kT3BlcmF0aW9uKSB0aGlzLmdlb0NhbnZhcy5vZmZzY3JlZW5DdHguZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gbGF5ZXIuYmxlbmRPcGVyYXRpb24oeilcblxuICAgICAgICAgICAgLy9zZXQgYWZmaW4gdHJhbnNmb3JtIHRvIGRyYXcgd2l0aCBnZW9ncmFwaGljYWwgY29vcmRpbmF0ZXNcbiAgICAgICAgICAgIHRoaXMuZ2VvQ2FudmFzLnNldENhbnZhc1RyYW5zZm9ybSgpXG5cbiAgICAgICAgICAgIC8vZHJhdyBsYXllclxuICAgICAgICAgICAgbGF5ZXIuZHJhdyh0aGlzLmdlb0NhbnZhcywgdGhpcy5sZWdlbmQpXG5cbiAgICAgICAgICAgIC8vZHJhdyBsYXllciBmaWx0ZXJcbiAgICAgICAgICAgIGlmIChsYXllci5maWx0ZXJDb2xvcikgbGF5ZXIuZHJhd0ZpbHRlcih0aGlzLmdlb0NhbnZhcylcblxuICAgICAgICAgICAgLy9yZXN0b3JlIGRlZmF1bHQgYWxwaGEgYW5kIGJsZW5kIG9wZXJhdGlvblxuICAgICAgICAgICAgdGhpcy5nZW9DYW52YXMub2Zmc2NyZWVuQ3R4Lmdsb2JhbEFscGhhID0gMS4wXG4gICAgICAgICAgICB0aGlzLmdlb0NhbnZhcy5vZmZzY3JlZW5DdHguZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gdGhpcy5kZWZhdWx0R2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uXG4gICAgICAgIH1cblxuICAgICAgICAvLyBvbmUgZHJhd0ltYWdlIGNhbGw6IGRyYXcgdGhlIG9mZnNjcmVlbiBjYW52YXMgdG8gdGhlIG1haW4gY2FudmFzXG4gICAgICAgIHRoaXMuZ2VvQ2FudmFzLmluaXRDYW52YXNUcmFuc2Zvcm0oKVxuICAgICAgICB0aGlzLmdlb0NhbnZhcy5jdHguZHJhd0ltYWdlKHRoaXMuZ2VvQ2FudmFzLm9mZnNjcmVlbkNhbnZhcywgMCwgMClcblxuICAgICAgICB0aGlzLmNhbnZhc1NhdmUgPSBudWxsXG5cbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbWFyZ2luUHhcbiAgICAgKiBAcmV0dXJucyB7aW1wb3J0KCcuL0dlb0NhbnZhcy5qcycpLkVudmVsb3BlfVxuICAgICAqIEBwdWJsaWNcbiAgICAgKi9cbiAgICB1cGRhdGVFeHRlbnRHZW8obWFyZ2luUHggPSAyMCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZW9DYW52YXMudXBkYXRlRXh0ZW50R2VvKG1hcmdpblB4KVxuICAgIH1cblxuICAgIC8qKiBAcGFyYW0ge01vdXNlRXZlbnR9IGUgKi9cbiAgICBmb2N1c0NlbGwoZSkge1xuICAgICAgICAvLyBEb27igJl0IHByb2Nlc3MgaG92ZXIgZXZlbnRzIGR1cmluZyBhY3RpdmUgem9vbVxuICAgICAgICBpZiAodGhpcy5nZW9DYW52YXMuX2lzWm9vbWluZykgcmV0dXJuO1xuXG4gICAgICAgIC8vY29tcHV0ZSBtb3VzZSBnZW8gcG9zaXRpb25cbiAgICAgICAgY29uc3QgbW91c2VQb3NpdGlvbkdlbyA9IHtcbiAgICAgICAgICAgIHg6IHRoaXMuZ2VvQ2FudmFzLnBpeFRvR2VvWChlLm9mZnNldFggKyB0aGlzLnRvb2x0aXAueE1vdXNlT2Zmc2V0KSxcbiAgICAgICAgICAgIHk6IHRoaXMuZ2VvQ2FudmFzLnBpeFRvR2VvWShlLm9mZnNldFkgKyB0aGlzLnRvb2x0aXAueU1vdXNlT2Zmc2V0KSxcbiAgICAgICAgfVxuICAgICAgICAvKiogQHR5cGUge3tjZWxsOmltcG9ydCgnLi9EYXRhc2V0LmpzJykuQ2VsbCxodG1sOnN0cmluZyxyZXNvbHV0aW9uOm51bWJlcn0gfCB1bmRlZmluZWR9ICovXG4gICAgICAgIGNvbnN0IGZvY3VzID0gdGhpcy5nZXRDZWxsRm9jdXNJbmZvKG1vdXNlUG9zaXRpb25HZW8pXG5cbiAgICAgICAgLy8gVHJhbnNwYXJlbnQgYmFja2dyb3VuZCAoTGVhZmxldCk6IHJlZHJhdyBiYXNlLCB0aGVuIGRyYXcgZm9jdXMgcmVjdCBkaXJlY3RseSBvbiB0aGUgdmlzaWJsZSBjYW52YXNcbiAgICAgICAgaWYgKHRoaXMudHJhbnNwYXJlbnRCYWNrZ3JvdW5kKSB7XG4gICAgICAgICAgICAvLyBBbHdheXMgcmVzdG9yZSB0aGUgYmFzZSAob2Zmc2NyZWVuKSBpbnRvIHRoZSB2aXNpYmxlIGNhbnZhc1xuICAgICAgICAgICAgdGhpcy5nZW9DYW52YXMuaW5pdENhbnZhc1RyYW5zZm9ybSgpO1xuICAgICAgICAgICAgdGhpcy5nZW9DYW52YXMuY3R4LmNsZWFyUmVjdCgwLCAwLCB0aGlzLncsIHRoaXMuaCk7XG4gICAgICAgICAgICB0aGlzLmdlb0NhbnZhcy5jdHguZHJhd0ltYWdlKHRoaXMuZ2VvQ2FudmFzLm9mZnNjcmVlbkNhbnZhcywgMCwgMCk7XG5cbiAgICAgICAgICAgIGlmIChmb2N1cykge1xuICAgICAgICAgICAgICAgIHRoaXMudG9vbHRpcC5odG1sKGZvY3VzLmh0bWwpO1xuICAgICAgICAgICAgICAgIHRoaXMudG9vbHRpcC5zZXRQb3NpdGlvbihlKTtcbiAgICAgICAgICAgICAgICB0aGlzLnRvb2x0aXAuc2hvdygpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcmVjdFdQaXggPSB0aGlzLnNlbGVjdGlvblJlY3RhbmdsZVdpZHRoUGl4XG4gICAgICAgICAgICAgICAgICAgID8gdGhpcy5zZWxlY3Rpb25SZWN0YW5nbGVXaWR0aFBpeChmb2N1cy5yZXNvbHV0aW9uLCB0aGlzLmdlb0NhbnZhcy52aWV3LnopXG4gICAgICAgICAgICAgICAgICAgIDogNDtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuZ2VvQ2FudmFzLmN0eDsgLy8gZHJhdyBkaXJlY3RseSBvbiB2aXNpYmxlIGNhbnZhc1xuICAgICAgICAgICAgICAgIGN0eC5zYXZlKCk7XG4gICAgICAgICAgICAgICAgY3R4LnN0cm9rZVN0eWxlID0gdGhpcy5zZWxlY3Rpb25SZWN0YW5nbGVDb2xvcjtcbiAgICAgICAgICAgICAgICBjdHgubGluZVdpZHRoID0gcmVjdFdQaXg7XG4gICAgICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpO1xuICAgICAgICAgICAgICAgIC8vIGNvbXB1dGUgaW4gcGl4ZWwgc3BhY2UgKG5vIGdlbyB0cmFuc2Zvcm0gb24gY3R4KVxuICAgICAgICAgICAgICAgIGNvbnN0IHhQaXggPSB0aGlzLmdlb0NhbnZhcy5nZW9Ub1BpeFgoZm9jdXMuY2VsbC54KTtcbiAgICAgICAgICAgICAgICBjb25zdCB5UGl4ID0gdGhpcy5nZW9DYW52YXMuZ2VvVG9QaXhZKGZvY3VzLmNlbGwueSk7XG4gICAgICAgICAgICAgICAgY29uc3Qgd1BpeCA9IGZvY3VzLnJlc29sdXRpb24gLyB0aGlzLmdlb0NhbnZhcy52aWV3Lno7XG4gICAgICAgICAgICAgICAgY29uc3QgaFBpeCA9IC13UGl4OyAvLyB5IGF4aXMgaW52ZXJ0ZWQgaW4gZ2VvVG9QaXhcbiAgICAgICAgICAgICAgICBjdHgucmVjdChcbiAgICAgICAgICAgICAgICAgICAgeFBpeCAtIHJlY3RXUGl4IC8gMixcbiAgICAgICAgICAgICAgICAgICAgeVBpeCArIHJlY3RXUGl4IC8gMixcbiAgICAgICAgICAgICAgICAgICAgd1BpeCArIHJlY3RXUGl4LFxuICAgICAgICAgICAgICAgICAgICBoUGl4IC0gcmVjdFdQaXhcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGN0eC5zdHJva2UoKTtcbiAgICAgICAgICAgICAgICBjdHgucmVzdG9yZSgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRvb2x0aXAuaGlkZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuOyAvLyBoYW5kbGVkXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZm9jdXMpIHtcbiAgICAgICAgICAgIHRoaXMuZ2VvQ2FudmFzLmNhbnZhcy5zdHlsZS5jdXJzb3IgPSAncG9pbnRlcic7XG4gICAgICAgICAgICB0aGlzLnRvb2x0aXAuaHRtbChmb2N1cy5odG1sKVxuICAgICAgICAgICAgdGhpcy50b29sdGlwLnNldFBvc2l0aW9uKGUpXG4gICAgICAgICAgICB0aGlzLnRvb2x0aXAuc2hvdygpXG5cbiAgICAgICAgICAgIC8vc2hvdyBjZWxsIHBvc2l0aW9uIGFzIGEgcmVjdGFuZ2xlXG4gICAgICAgICAgICBpZiAoIXRoaXMuY2FudmFzU2F2ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpXG4gICAgICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCAnJyArIHRoaXMudylcbiAgICAgICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUuc2V0QXR0cmlidXRlKCdoZWlnaHQnLCAnJyArIHRoaXMuaClcbiAgICAgICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUuZ2V0Q29udGV4dCgnMmQnKT8uZHJhd0ltYWdlKHRoaXMuZ2VvQ2FudmFzLm9mZnNjcmVlbkNhbnZhcywgMCwgMClcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5nZW9DYW52YXMub2Zmc2NyZWVuQ3R4LmRyYXdJbWFnZSh0aGlzLmNhbnZhc1NhdmUsIDAsIDApXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vZHJhdyBpbWFnZSBzYXZlZCArIGRyYXcgcmVjdGFuZ2xlXG4gICAgICAgICAgICBjb25zdCByZWN0V1BpeCA9IHRoaXMuc2VsZWN0aW9uUmVjdGFuZ2xlV2lkdGhQaXhcbiAgICAgICAgICAgICAgICA/IHRoaXMuc2VsZWN0aW9uUmVjdGFuZ2xlV2lkdGhQaXgoZm9jdXMucmVzb2x1dGlvbiwgdGhpcy5nZW9DYW52YXMudmlldy56KVxuICAgICAgICAgICAgICAgIDogNFxuICAgICAgICAgICAgdGhpcy5nZW9DYW52YXMuaW5pdENhbnZhc1RyYW5zZm9ybSgpXG4gICAgICAgICAgICBjb25zdCBjdHggPSB0aGlzLmdlb0NhbnZhcy5vZmZzY3JlZW5DdHhcbiAgICAgICAgICAgIGN0eC5zdHJva2VTdHlsZSA9IHRoaXMuc2VsZWN0aW9uUmVjdGFuZ2xlQ29sb3JcbiAgICAgICAgICAgIGN0eC5saW5lV2lkdGggPSByZWN0V1BpeFxuICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpXG5cbiAgICAgICAgICAgIGN0eC5yZWN0KFxuICAgICAgICAgICAgICAgIHRoaXMuZ2VvQ2FudmFzLmdlb1RvUGl4WChmb2N1cy5jZWxsLngpIC0gcmVjdFdQaXggLyAyLFxuICAgICAgICAgICAgICAgIHRoaXMuZ2VvQ2FudmFzLmdlb1RvUGl4WShmb2N1cy5jZWxsLnkpICsgcmVjdFdQaXggLyAyLFxuICAgICAgICAgICAgICAgIGZvY3VzLnJlc29sdXRpb24gLyB0aGlzLmdlb0NhbnZhcy52aWV3LnogKyByZWN0V1BpeCxcbiAgICAgICAgICAgICAgICAtZm9jdXMucmVzb2x1dGlvbiAvIHRoaXMuZ2VvQ2FudmFzLnZpZXcueiAtIHJlY3RXUGl4XG4gICAgICAgICAgICApXG4gICAgICAgICAgICBjdHguc3Ryb2tlKClcbiAgICAgICAgICAgIHRoaXMuZ2VvQ2FudmFzLmN0eC5kcmF3SW1hZ2UodGhpcy5nZW9DYW52YXMub2Zmc2NyZWVuQ2FudmFzLCAwLCAwKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5nZW9DYW52YXMuY2FudmFzLnN0eWxlLmN1cnNvciA9ICdkZWZhdWx0JztcbiAgICAgICAgICAgIHRoaXMudG9vbHRpcC5oaWRlKClcbiAgICAgICAgICAgIGlmICh0aGlzLmNhbnZhc1NhdmUpIHRoaXMuZ2VvQ2FudmFzLmN0eC5kcmF3SW1hZ2UodGhpcy5jYW52YXNTYXZlLCAwLCAwKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSBjZWxsIEhUTUwgaW5mbyBhdCBhIGdpdmVuIGdlbyBwb3NpdGlvbi5cbiAgICAgKiBUaGlzIGlzIHVzZWZ1bGwgZm9yIHVzZXIgaW50ZXJhY3Rpb25zLCB0byBzaG93IHRoaXMgaW5mbyB3aGVyZSB0aGUgdXNlciBjbGlja3MgZm9yIGV4YW1wbGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3t4Om51bWJlcix5Om51bWJlcn19IHBvc0dlb1xuICAgICAqIEByZXR1cm5zIHt7Y2VsbDppbXBvcnQoJy4vRGF0YXNldC5qcycpLkNlbGwsaHRtbDpzdHJpbmcscmVzb2x1dGlvbjpudW1iZXJ9IHwgdW5kZWZpbmVkfVxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKi9cbiAgICBnZXRDZWxsRm9jdXNJbmZvKHBvc0dlbykge1xuICAgICAgICAvL2dvIHRocm91Z2ggdGhlIGxheWVycywgc3RhcnRpbmcgZnJvbSB0b3BcbiAgICAgICAgY29uc3QgeiA9IHRoaXMuZ2VvQ2FudmFzLnZpZXcuelxuICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5sYXllcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9MYXllci5qc1wiKS5MYXllcn0gKi9cbiAgICAgICAgICAgIGNvbnN0IGxheWVyID0gdGhpcy5sYXllcnNbaV1cbiAgICAgICAgICAgIGlmIChsYXllci52aXNpYmxlICYmICFsYXllci52aXNpYmxlKHopKSBjb250aW51ZVxuICAgICAgICAgICAgaWYgKGxheWVyLmNlbGxJbmZvSFRNTCA9PT0gJ25vbmUnKSBjb250aW51ZSAvLyB0aGlzIGlzIG5lY2Vzc2FyeSBpbiBvcmRlciB0byBub3Qgc2hvdyB0b29sdGlwcyBmb3IgbGF5ZXJzICdvbiB0b3AnIChlLmcuIHBvcHVsYXRpb24gY2lyY2xlcyBvbiB0b3Agb2Ygc3F1YXJlcylcbiAgICAgICAgICAgIGlmICghbGF5ZXIuY2VsbEluZm9IVE1MKSBjb250aW51ZVxuICAgICAgICAgICAgaWYgKCFsYXllci5nZXREYXRhc2V0KSBjb250aW51ZVxuICAgICAgICAgICAgY29uc3QgZHNjID0gbGF5ZXIuZ2V0RGF0YXNldCh6KVxuICAgICAgICAgICAgaWYgKCFkc2MpIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIC8vZ2V0IGNlbGwgYXQgbW91c2UgcG9zaXRpb25cbiAgICAgICAgICAgIC8qKiBAdHlwZSB7aW1wb3J0KCcuL0RhdGFzZXQuanMnKS5DZWxsfHVuZGVmaW5lZH0gKi9cbiAgICAgICAgICAgIGNvbnN0IGNlbGwgPSBkc2MuZ2V0Q2VsbEZyb21Qb3NpdGlvbihwb3NHZW8sIGRzYy5nZXRWaWV3Q2FjaGUoKSlcblxuICAgICAgICAgICAgaWYgKCFjZWxsKSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgICAgICAgICAgIC8vcmFyZSBjYXNlIGZvciBhIGRhdGFzZXQgd2l0aCBtaXhlZCByZXNvbHV0aW9uc1xuICAgICAgICAgICAgaWYgKGRzYy5taXhlZFJlc29sdXRpb24pIHtcbiAgICAgICAgICAgICAgICBjb25zdCByID0gK2RzYy5taXhlZFJlc29sdXRpb24oY2VsbClcbiAgICAgICAgICAgICAgICBjb25zdCBodG1sID0gbGF5ZXIuY2VsbEluZm9IVE1MKGNlbGwsIHIpXG4gICAgICAgICAgICAgICAgaWYgKCFodG1sKSByZXR1cm4gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgY2VsbDogY2VsbCwgaHRtbDogaHRtbCwgcmVzb2x1dGlvbjogciB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGh0bWwgPSBsYXllci5jZWxsSW5mb0hUTUwoY2VsbCwgZHNjLmdldFJlc29sdXRpb24oKSlcbiAgICAgICAgICAgIGlmICghaHRtbCkgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgICAgICAgcmV0dXJuIHsgY2VsbDogY2VsbCwgaHRtbDogaHRtbCwgcmVzb2x1dGlvbjogZHNjLmdldFJlc29sdXRpb24oKSB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5XG4gICAgICogQHBhcmFtIHtudW1iZXJ8dW5kZWZpbmVkfSB6XG4gICAgICovXG4gICAgc2V0Vmlldyh4LCB5LCB6ID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuZ2VvQ2FudmFzLnZpZXcueCA9IHhcbiAgICAgICAgdGhpcy5nZW9DYW52YXMudmlldy55ID0geVxuICAgICAgICBpZiAoeiAhPSB1bmRlZmluZWQpIHRoaXMuZ2VvQ2FudmFzLnZpZXcueiA9IHpcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKiogQHJldHVybnMge2ltcG9ydCgnLi9HZW9DYW52YXMuanMnKS5WaWV3fSAqL1xuICAgIGdldFZpZXcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdlb0NhbnZhcy52aWV3XG4gICAgfVxuXG4gICAgLyoqIEByZXR1cm5zIHtudW1iZXJ9ICovXG4gICAgZ2V0Wm9vbSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2VvQ2FudmFzLnZpZXcuelxuICAgIH1cbiAgICAvKiogQHBhcmFtIHtudW1iZXJ9IHogQHJldHVybnMge3RoaXN9ICovXG4gICAgc2V0Wm9vbSh6KSB7XG4gICAgICAgIHRoaXMuZ2VvQ2FudmFzLnZpZXcueiA9IHpcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKiogQHJldHVybnMge0FycmF5LjxudW1iZXJ8dW5kZWZpbmVkPn0gKi9cbiAgICBnZXRDZW50ZXJFeHRlbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdlb0NhbnZhcy5nZXRDZW50ZXJFeHRlbnQoKVxuICAgIH1cbiAgICAvKiogQHBhcmFtIHtBcnJheS48bnVtYmVyPn0gdmFsIEByZXR1cm5zIHt0aGlzfSAqL1xuICAgIHNldENlbnRlckV4dGVudCh2YWwpIHtcbiAgICAgICAgdGhpcy5nZW9DYW52YXMuc2V0Q2VudGVyRXh0ZW50KHZhbClcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKiogQHJldHVybnMge0FycmF5LjxudW1iZXI+fSAqL1xuICAgIGdldFpvb21FeHRlbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdlb0NhbnZhcy5nZXRab29tRXh0ZW50KClcbiAgICB9XG4gICAgLyoqIEBwYXJhbSB7QXJyYXkuPG51bWJlcj59IHZhbCBAcmV0dXJucyB7dGhpc30gKi9cbiAgICBzZXRab29tRXh0ZW50KHZhbCkge1xuICAgICAgICB0aGlzLmdlb0NhbnZhcy5zZXRab29tRXh0ZW50KHZhbClcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKiogQHJldHVybnMge3N0cmluZ30gKi9cbiAgICBnZXRCYWNrZ3JvdW5kQ29sb3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdlb0NhbnZhcy5iYWNrZ3JvdW5kQ29sb3JcbiAgICB9XG4gICAgLyoqIEBwYXJhbSB7c3RyaW5nfSB2YWwgQHJldHVybnMge3RoaXN9ICovXG4gICAgc2V0QmFja2dyb3VuZENvbG9yKHZhbCkge1xuICAgICAgICB0aGlzLmdlb0NhbnZhcy5iYWNrZ3JvdW5kQ29sb3IgPSB2YWxcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgc2V0IG9mIHpvb20gYnV0dG9ucyB0byB0aGUgbWFwXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb3B0c1xuICAgICAqIEByZXR1cm5zIHt0aGlzfVxuICAgICAqL1xuICAgIGFkZFpvb21CdXR0b25zKG9wdHMpIHtcbiAgICAgICAgLy8gKiBvcHRzLmlkXG4gICAgICAgIC8vICogb3B0cy5vblpvb20gLSBjdXN0b20gZXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgICAgICAvLyAqIG9wdHMueFxuICAgICAgICAvLyAqIG9wdHMueVxuICAgICAgICAvLyAqIG9wdHMuZGVsdGEgLSB6b29tIGRlbHRhIGFwcGxpZWQgb24gZWFjaCBjbGlja1xuXG4gICAgICAgIHRoaXMuem9vbUJ1dHRvbnMgPSBuZXcgWm9vbUJ1dHRvbnMoe1xuICAgICAgICAgICAgbWFwOiB0aGlzLFxuICAgICAgICAgICAgaWQ6IG9wdHM/LmlkIHx8ICdncmlkdml6LXpvb20tYnV0dG9ucy0nICsgdGhpcy5jb250YWluZXIuaWQsXG4gICAgICAgICAgICBjbGFzczogb3B0cz8uY2xhc3MsXG4gICAgICAgICAgICB4OiBvcHRzPy54LFxuICAgICAgICAgICAgeTogb3B0cz8ueSxcbiAgICAgICAgICAgIG9uWm9vbTogb3B0cz8ub25ab29tLFxuICAgICAgICAgICAgZGVsdGE6IG9wdHM/LmRlbHRhIHx8IDAuMixcbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBmdWxsc2NyZWVuIHRvZ2dsZSBidXR0b24gdG8gdGhlIGFwcFxuICAgICAqXG4gICAgICogQHBhcmFtIHtvYmplY3R9IG9wdHNcbiAgICAgKiBAcmV0dXJucyB7dGhpc31cbiAgICAgKi9cbiAgICBhZGRGdWxsc2NyZWVuQnV0dG9uKG9wdHMpIHtcbiAgICAgICAgLy8gKiBvcHRzLm1hcCAtIHRoZSBncmlkdml6IG1hcFxuICAgICAgICAvLyAqIG9wdHMuaWRcbiAgICAgICAgLy8gKiBvcHRzLnhcbiAgICAgICAgLy8gKiBvcHRzLnlcblxuICAgICAgICB0aGlzLmZ1bGxzY3JlZW5CdXR0b24gPSBuZXcgRnVsbHNjcmVlbkJ1dHRvbih7XG4gICAgICAgICAgICBtYXA6IHRoaXMsXG4gICAgICAgICAgICBpZDogb3B0cz8uaWQgfHwgJ2dyaWR2aXotZnVsbHNjcmVlbi1idXR0b24nLFxuICAgICAgICAgICAgY2xhc3M6IG9wdHM/LmNsYXNzLFxuICAgICAgICAgICAgeDogb3B0cz8ueCxcbiAgICAgICAgICAgIHk6IG9wdHM/LnksXG4gICAgICAgIH0pXG5cbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKiogQHJldHVybnMge3RoaXN9ICovXG4gICAgc2V0Vmlld0Zyb21VUkwoKSB7XG4gICAgICAgIHRoaXMuZ2VvQ2FudmFzLnNldFZpZXdGcm9tVVJMKClcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gQWRkIGEgcmVzaXplIGV2ZW50IG9ic2VydmVyIHRvIHRoZSBBcHBzIGNvbnRhaW5lciBhbmQgdXBkYXRlIHRoZSBjYW52YXMgYWNjb3JkaW5nbHlcbiAgICAgKiBAbWVtYmVyb2YgQXBwXG4gICAgICovXG4gICAgZGVmaW5lUmVzaXplT2JzZXJ2ZXIoKSB7XG4gICAgICAgIC8vIFRyYWNrIHdoZXRoZXIgdGhlIG9ic2VydmVyIGlzIGN1cnJlbnRseSBwcm9jZXNzaW5nIGEgcmVzaXplIGV2ZW50XG4gICAgICAgIGxldCByZXNpemVQZW5kaW5nID0gZmFsc2VcblxuICAgICAgICBjb25zdCByZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoZW50cmllcykgPT4ge1xuICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGVudHJpZXMpIHx8ICFlbnRyaWVzLmxlbmd0aCkgcmV0dXJuXG5cbiAgICAgICAgICAgIGxldCBjb250YWluZXIgPSB0aGlzLmNvbnRhaW5lclxuXG4gICAgICAgICAgICAvLyBFbnN1cmUgdGhlIGNvbnRhaW5lciBoYXMgdmFsaWQgZGltZW5zaW9uc1xuICAgICAgICAgICAgaWYgKGNvbnRhaW5lci5jbGllbnRXaWR0aCA+IDAgJiYgY29udGFpbmVyLmNsaWVudEhlaWdodCA+IDApIHtcbiAgICAgICAgICAgICAgICBpZiAoIXJlc2l6ZVBlbmRpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzaXplUGVuZGluZyA9IHRydWUgLy8gUHJldmVudCBvdmVybGFwcGluZyByZXNpemUgdHJpZ2dlcnNcblxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc2l6ZVBlbmRpbmcgPSBmYWxzZSAvLyBSZXNldCB0aGUgZmxhZyBhZnRlciBwcm9jZXNzaW5nXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBzaXplIGNoYW5nZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmggIT09IGNvbnRhaW5lci5jbGllbnRIZWlnaHQgfHwgdGhpcy53ICE9PSBjb250YWluZXIuY2xpZW50V2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmggPSBjb250YWluZXIuY2xpZW50SGVpZ2h0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53ID0gY29udGFpbmVyLmNsaWVudFdpZHRoXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgZ2VvQ2FudmFzIHNpemVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZW9DYW52YXMuaCA9IHRoaXMuaFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2VvQ2FudmFzLncgPSB0aGlzLndcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdlb0NhbnZhcy5jYW52YXMuc2V0QXR0cmlidXRlKCd3aWR0aCcsIFN0cmluZyh0aGlzLncpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2VvQ2FudmFzLmNhbnZhcy5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsIFN0cmluZyh0aGlzLmgpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2VvQ2FudmFzLm9mZnNjcmVlbkNhbnZhcy5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgU3RyaW5nKHRoaXMudykpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZW9DYW52YXMub2Zmc2NyZWVuQ2FudmFzLnNldEF0dHJpYnV0ZSgnaGVpZ2h0JywgU3RyaW5nKHRoaXMuaCkpXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZHJhdygpXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPcHRpb25hbGx5IHJlcG9zaXRpb24gVUkgZWxlbWVudHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiAodGhpcy56b29tQnV0dG9ucykgdGhpcy56b29tQnV0dG9ucy5ub2RlLnN0eWxlLmxlZnQgPSB0aGlzLncgLSA1MCArICdweCc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgKHRoaXMuZnVsbHNjcmVlbkJ1dHRvbikgdGhpcy5mdWxsc2NyZWVuQnV0dG9uLm5vZGUuc3R5bGUubGVmdCA9IHRoaXMudyAtIDUwICsgJ3B4JztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG5cbiAgICAgICAgcmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLmNvbnRhaW5lcilcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gRGVzdHJveSB0aGUgbWFwIGFuZCBpdCdzIGV2ZW50IGxpc3RlbmVyc1xuICAgICAqIFRoaXMgc2hvdWxkIHNpZ25pZmljYW50bHkgcmVkdWNlIHRoZSBtZW1vcnkgdXNlZCB3aGVuIGNyZWF0aW5nIGFuZCBkZXN0cm95aW5nIGdyaWR2aXogbWFwIGluc3RhbmNlcyAoZm9yIGV4YW1wbGUgaW4gbGVhZmxldC1ncmlkdml6KVxuICAgICAqIEBtZW1iZXJvZiBBcHBcbiAgICAgKi9cbiAgICBkZXN0cm95KCkge1xuICAgICAgICAvLyBjbGVhciBsYXllcnNcbiAgICAgICAgdGhpcy5sYXllcnMgPSBbXVxuICAgICAgICB0aGlzLmJnTGF5ZXJzID0gW11cblxuICAgICAgICAvLyByZW1vdmUgZXZlbnQgbGlzdGVuZXJzIGZyb20gY29udGFpbmVyXG4gICAgICAgIHRoaXMuY29udGFpbmVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlb3ZlcicsIHRoaXMubW91c2VPdmVySGFuZGxlcilcbiAgICAgICAgdGhpcy5jb250YWluZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5tb3VzZU1vdmVIYW5kbGVyKVxuICAgICAgICB0aGlzLmNvbnRhaW5lci5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW91dCcsIHRoaXMubW91c2VPdXRIYW5kbGVyKVxuXG4gICAgICAgIC8vIHJlbW92ZSBjYW52YXNcbiAgICAgICAgdGhpcy5nZW9DYW52YXMuY2FudmFzLnJlbW92ZSgpXG5cbiAgICAgICAgLy8gcmVtb3ZlIGxlZ2VuZFxuICAgICAgICB0aGlzLmxlZ2VuZD8ucmVtb3ZlKClcblxuICAgICAgICAvLyByZW1vdmUgdG9vbHRpcFxuICAgICAgICB0aGlzLnRvb2x0aXAudG9vbHRpcD8ucmVtb3ZlKClcbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbi8qKlxuICogQSBtdWx0aSByZXNvbHV0aW9uIGRhdGFzZXQgb2YgZ3JpZCBjZWxscy5cbiAqIEl0IGNvbnNpc3RzIG9mIGRpZmZlcmVudCB7QGxpbmsgRGF0YXNldH1zIGZvciBlYWNoIHJlc29sdXRpb24uXG4gKlxuICogQGFic3RyYWN0XG4gKlxuICogQG1vZHVsZSBjb3JlXG4gKiBAYXV0aG9yIEpvc2VwaCBEYXZpZXMsIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBNdWx0aVJlc29sdXRpb25EYXRhc2V0IHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxudW1iZXI+fSByZXNvbHV0aW9ucyBUaGUgcmVzb2x1dGlvbnMgb2YgdGhlIGRhdGFzZXRzLCBpbiBDUlMgZ2VvZ3JhcGhpY2FsIHVuaXQuXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi9EYXRhc2V0XCIpLkRhdGFzZXQ+fGZ1bmN0aW9uKG51bWJlcik6aW1wb3J0KFwiLi9EYXRhc2V0XCIpLkRhdGFzZXR9IGRhdGFzZXRzIFRoZSBkYXRhc2V0cyBsaXN0LCBvbmUgcGVyIHJlc29sdXRpb24uIE9yIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgZGF0YXNldCBmcm9tIGEgcmVzb2x1dGlvbiB2YWx1ZS5cbiAgICAgKiBAcGFyYW0geyB7cHJlcHJvY2Vzcz86ZnVuY3Rpb24oaW1wb3J0KFwiLi9EYXRhc2V0XCIpLkNlbGwpOmJvb2xlYW59IH0gb3B0cyBPcHRpb25zLiBwcmVwcm9jZXNzOiBBIGZ1bmN0aW9uIHRvIGFwcGx5IG9uIGVhY2ggZGF0YXNldCBjZWxsIHRvIHByZXBhcmUgaXRzIHZhbHVlcy4gQ2FuIGJlIHVzZWQgYWxzbyB0byBzZWxlY3QgY2VsbHMgdG8ga2VlcC5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihyZXNvbHV0aW9ucywgZGF0YXNldHMsIG9wdHMgPSB7fSkge1xuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgICAgIC8qKiBUaGUgcmVzb2x1dGlvbnMgb2YgdGhlIGRhdGFzZXRzLCBpbiBDUlMgZ2VvZ3JhcGhpY2FsIHVuaXQuXG4gICAgICAgICAqIEB0eXBlIHtBcnJheS48bnVtYmVyPn0gKi9cbiAgICAgICAgdGhpcy5yZXNvbHV0aW9ucyA9IHJlc29sdXRpb25zXG5cbiAgICAgICAgLyoqIFRoZSBkYXRhc2V0cy4gSWYgdGhlIGxpc3QgaXMgbm90IGV4cGxpY3RlbHkgZGVmaW5lZCwgYnVpbGQgaXQgZnJvbSB0aGUgcmVzb2x1dGlvbiBsaXN0IHdpdGggdGhlIGZ1bmN0aW9uXG4gICAgICAgICAqIEB0eXBlIHtBcnJheS48aW1wb3J0KFwiLi9EYXRhc2V0XCIpLkRhdGFzZXQ+fSAqL1xuICAgICAgICB0aGlzLmRhdGFzZXRzID0gdHlwZW9mIGRhdGFzZXRzID09PSAnZnVuY3Rpb24nID8gdGhpcy5yZXNvbHV0aW9ucy5tYXAoZGF0YXNldHMpIDogZGF0YXNldHNcblxuICAgICAgICAvL3RoZXJlIG11c3QgYmUgYXMgbWFueSBkYXRhc2V0cyBhcyByZXNvbHV0aW9uc1xuICAgICAgICBpZiAodGhpcy5kYXRhc2V0cy5sZW5ndGggPiAxICYmIHRoaXMuZGF0YXNldHMubGVuZ3RoICE9IHRoaXMucmVzb2x1dGlvbnMubGVuZ3RoKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICdVbmNvbXBhdGlibGUgbnVtYmVyIG9mIGRhdGFzZXRzIGFuZCByZXNvbHV0aW9uczogJyArXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YXNldHMubGVuZ3RoICtcbiAgICAgICAgICAgICAgICAgICAgJyAnICtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNvbHV0aW9ucy5sZW5ndGhcbiAgICAgICAgICAgIClcblxuICAgICAgICAvL3NldCBkYXRhc2V0IHByZXByb2Nlc3NlcyBpZiBzcGVjaWZpZWRcbiAgICAgICAgaWYgKG9wdHMucHJlcHJvY2VzcykgdGhpcy5zZXRQcmVwb2Nlc3NlcyhvcHRzLnByZXByb2Nlc3MpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSByZWxldmFudCBkYXRhc2V0IGZvciBhIHNwZWNpZmllZCB6b29tLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB6XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG1pblBpeGVsc1BlckNlbGxcbiAgICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9EYXRhc2V0XCIpLkRhdGFzZXR8dW5kZWZpbmVkfVxuICAgICAqICovXG4gICAgZ2V0RGF0YXNldCh6LCBtaW5QaXhlbHNQZXJDZWxsKSB7XG4gICAgICAgIC8vc3BlY2lhbCBjYXNlIHdoaXRoIHNpbmdsZSBkYXRhc2V0XG4gICAgICAgIGlmICh0aGlzLmRhdGFzZXRzLmxlbmd0aCA9PSAxKSByZXR1cm4gdGhpcy5kYXRhc2V0c1swXVxuXG4gICAgICAgIGNvbnN0IHJzID0gdGhpcy5yZXNvbHV0aW9uc1xuICAgICAgICBsZXQgaSA9IDBcbiAgICAgICAgbGV0IHpfID0gcnNbaV0gLyBtaW5QaXhlbHNQZXJDZWxsXG4gICAgICAgIHdoaWxlICh6XyA8IHogJiYgaSA8IHJzLmxlbmd0aCkge1xuICAgICAgICAgICAgaSsrXG4gICAgICAgICAgICB6XyA9IHJzW2ldIC8gbWluUGl4ZWxzUGVyQ2VsbFxuICAgICAgICB9XG4gICAgICAgIC8vaWYgKGkgPT0gMCkgcmV0dXJuIHRoaXMuZGF0YXNldC5kYXRhc2V0c1swXTtcbiAgICAgICAgLy9yZXR1cm4gdGhpcy5kYXRhc2V0LmRhdGFzZXRzW2kgLSAxXTtcbiAgICAgICAgaWYgKGkgPT0gcnMubGVuZ3RoKSByZXR1cm4gdGhpcy5kYXRhc2V0c1tycy5sZW5ndGggLSAxXVxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhc2V0c1tpXVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBhIHByZXByb2Nlc3MgZnVuY3Rpb24gZm9yIGFsbCBkYXRhc2V0cy5cbiAgICAgKiBUaGlzIGlzIGEgZnVuY3Rpb24gYXBwbGllZCBvbiBlYWNoIGNlbGwgYWZ0ZXIgaXQgaGFzIGJlZW4gbG9hZGVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbihpbXBvcnQoXCIuL0RhdGFzZXRcIikuQ2VsbCk6Ym9vbGVhbn0gcHJlcHJvY2Vzc1xuICAgICAqIEByZXR1cm5zIHt0aGlzfVxuICAgICAqL1xuICAgIHNldFByZXBvY2Vzc2VzKHByZXByb2Nlc3MpIHtcbiAgICAgICAgZm9yIChsZXQgZHMgb2YgdGhpcy5kYXRhc2V0cykgZHMucHJlcHJvY2VzcyA9IHByZXByb2Nlc3NcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIGZ1bmN0aW9uIHRvIGVhc2UgdGhlIGNyZWF0aW9uIG9mIG11bHRpIHJlc29sdXRpb24gZGF0YXNldHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxudW1iZXI+fSByZXNvbHV0aW9ucyBUaGUgcmVzb2x1dGlvbnMgb2YgdGhlIGRhdGFzZXRzLCBpbiBDUlMgZ2VvZ3JhcGhpY2FsIHVuaXRcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKG51bWJlcik6aW1wb3J0KFwiLi9EYXRhc2V0XCIpLkRhdGFzZXR9IHJlc1RvRGF0YXNldCBGdW5jdGlvbiByZXR1cm5pbmcgYSBkYXRhc2V0IGZyb20gYSByZXNvbHV0aW9uXG4gICAgICogQHBhcmFtIHsge3ByZXByb2Nlc3M/OmZ1bmN0aW9uKGltcG9ydChcIi4vRGF0YXNldFwiKS5DZWxsKTpib29sZWFufSB9IG9wdHMgT3B0aW9ucy4gcHJlcHJvY2VzczogQSBmdW5jdGlvbiB0byBhcHBseSBvbiBlYWNoIGRhdGFzZXQgY2VsbCB0byBwcmVwYXJlIGl0cyB2YWx1ZXNcbiAgICAgKiBAcmV0dXJucyB7TXVsdGlSZXNvbHV0aW9uRGF0YXNldH1cbiAgICAgKi9cbiAgICAvKnN0YXRpYyBtYWtlKHJlc29sdXRpb25zLCByZXNUb0RhdGFzZXQsIG9wdHMpIHtcbiAgICAgICAgLy9tYWtlIGRhdGFzZXRzXG4gICAgICAgIGNvbnN0IGRzYyA9IFtdXG4gICAgICAgIGZvciAoY29uc3QgcmVzIG9mIHJlc29sdXRpb25zKSBkc2MucHVzaChyZXNUb0RhdGFzZXQocmVzKSlcbiAgICAgICAgLy9tYWtlIG11bHRpIHJlc29sdXRpb24gZGF0YXNldFxuICAgICAgICByZXR1cm4gbmV3IE11bHRpUmVzb2x1dGlvbkRhdGFzZXQoZHNjLCByZXNvbHV0aW9ucywgb3B0cylcbiAgICB9Ki9cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgRHJhd2FibGUgfSBmcm9tICcuL0RyYXdhYmxlLmpzJ1xuXG4vKiogQHR5cGVkZWYge1wic3F1YXJlXCJ8XCJjaXJjbGVcInxcImRpYW1vbmRcInxcImRvbnV0XCJ8XCJ0cmlhbmdsZV91cFwifFwidHJpYW5nbGVfZG93blwifFwidHJpYW5nbGVfbGVmdFwifFwidHJpYW5nbGVfcmlnaHRcInxcIm5vbmVcIn0gU2hhcGUgKi9cblxuLyoqXG4gKiB2aWV3U2NhbGUgdHlwZVxuICogUmV0dXJucyBhbiBvYmplY3QgZnJvbSBhIGxpc3Qgb2YgY2VsbHMsXG4gKiBAdHlwZWRlZiB7ZnVuY3Rpb24oQXJyYXkuPGltcG9ydCgnLi9EYXRhc2V0LmpzJykuQ2VsbD4sbnVtYmVyLCBudW1iZXIpOip9IFZpZXdTY2FsZSAqL1xuXG4vKipcbiAqIEEgc3R5bGUsIHRvIHNob3cgYSBncmlkIGRhdGFzZXQuXG4gKlxuICogQG1vZHVsZSBjb3JlXG4gKiBAYXV0aG9yIEpvc2VwaCBEYXZpZXMsIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBTdHlsZSBleHRlbmRzIERyYXdhYmxlIHtcbiAgICAvKipcbiAgICAgKiBAYWJzdHJhY3RcbiAgICAgKiBAcGFyYW0ge3tmaWx0ZXI/OmZ1bmN0aW9uKGltcG9ydCgnLi9EYXRhc2V0JykuQ2VsbCk6Ym9vbGVhbiwgb2Zmc2V0PzpmdW5jdGlvbihpbXBvcnQoJy4vRGF0YXNldCcpLkNlbGwsIG51bWJlciwgbnVtYmVyKTp7ZHg6bnVtYmVyLGR5Om51bWJlcn0sIHZpc2libGU/OmZ1bmN0aW9uKG51bWJlcik6Ym9vbGVhbixhbHBoYT86ZnVuY3Rpb24obnVtYmVyKTpudW1iZXIsYmxlbmRPcGVyYXRpb24/OmZ1bmN0aW9uKG51bWJlcik6R2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uLGRyYXdGdW4/OmZ1bmN0aW9uLHZpZXdTY2FsZT86Vmlld1NjYWxlfX0gb3B0c1xuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cylcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvKipcbiAgICAgICAgICogQHR5cGUge1ZpZXdTY2FsZXx1bmRlZmluZWR9ICovXG4gICAgICAgIHRoaXMudmlld1NjYWxlID0gb3B0cy52aWV3U2NhbGVcblxuICAgICAgICAvKiogQSBmaWx0ZXIgZnVuY3Rpb24gdG8gYXBwbHkgdG8gdGhlIGNlbGwgbGlzdCwgdG8gZmlsdGVyIG91dCBzb21lIGNlbGxzIG5vdCB0byBiZSBkcmF3biAoc3VjaCBhcyBmb3IgZXhhbXBsZSB0aGUgY2VsbHMgd2l0aCB2YWx1ZT0wKS5cbiAgICAgICAgICogQHByb3RlY3RlZFxuICAgICAgICAgKiBAdHlwZSB7KGZ1bmN0aW9uKGltcG9ydCgnLi9EYXRhc2V0JykuQ2VsbCk6Ym9vbGVhbikgfCB1bmRlZmluZWR9ICovXG4gICAgICAgIHRoaXMuZmlsdGVyID0gb3B0cy5maWx0ZXIgfHwgdW5kZWZpbmVkXG5cbiAgICAgICAgLyoqIEFuIG9mZnNldC4gVGhpcyBpcyB0byBhbHRlciB0aGUgcG9zaXRpb24gb2YgYWxsIHN5bWJvbHMgaW4gYSBnaXZlbiBkaXJlY3Rpb24uIEluIGdlb2dyYXBoaWNhbCB1bml0LlxuICAgICAgICAgKiBAcHJvdGVjdGVkXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4vRGF0YXNldCcpLkNlbGwsbnVtYmVyLG51bWJlcik6e2R4Om51bWJlcixkeTpudW1iZXJ9fSAqL1xuICAgICAgICB0aGlzLm9mZnNldCA9IG9wdHMub2Zmc2V0IHx8ICgoYywgciwgeikgPT4gKHsgZHg6IDAsIGR5OiAwIH0pKVxuXG4gICAgICAgIC8qKiBBIGRyYXcgZnVuY3Rpb24gZm9yIHRoZSBzdHlsZS5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9ufHVuZGVmaW5lZH0gKi9cbiAgICAgICAgdGhpcy5kcmF3RnVuID0gb3B0cy5kcmF3RnVuXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwdWJsaWNcbiAgICAgICAgICogQHR5cGUge0FycmF5LjxpbXBvcnQoXCIuL0xlZ2VuZFwiKS5MZWdlbmQ+fSAqL1xuICAgICAgICB0aGlzLmxlZ2VuZHMgPSBbXVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERyYXcgY2VsbHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoJy4vRGF0YXNldCcpLkNlbGw+fSBjZWxscyBUaGUgY2VsbHMgdG8gZHJhdy5cbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vR2VvQ2FudmFzXCIpLkdlb0NhbnZhc30gZ2VvQ2FudmFzIFRoZSBjYW52YXMgd2hlcmUgdG8gZHJhdyB0aGVtLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByZXNvbHV0aW9uIFRoZWlyIHJlc29sdXRpb24gKGluIGdlb2dyYXBoaWMgdW5pdClcbiAgICAgKiBAYWJzdHJhY3RcbiAgICAgKi9cbiAgICBkcmF3KGNlbGxzLCBnZW9DYW52YXMsIHJlc29sdXRpb24pIHtcbiAgICAgICAgaWYgKHRoaXMuZHJhd0Z1bikgdGhpcy5kcmF3RnVuKGNlbGxzLCBnZW9DYW52YXMsIHJlc29sdXRpb24pXG4gICAgICAgIGVsc2UgdGhyb3cgbmV3IEVycm9yKCdNZXRob2QgZHJhdyBub3QgaW1wbGVtZW50ZWQuJylcbiAgICB9XG5cbiAgICAvL2dldHRlcnMgYW5kIHNldHRlcnNcblxuICAgIC8qKiBAcmV0dXJucyB7ZnVuY3Rpb24oaW1wb3J0KCcuL0RhdGFzZXQnKS5DZWxsLG51bWJlcixudW1iZXIpOntkeDpudW1iZXIsZHk6bnVtYmVyfX0gKi9cbiAgICBnZXRPZmZzZXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9mZnNldFxuICAgIH1cbiAgICAvKiogQHBhcmFtIHtmdW5jdGlvbihpbXBvcnQoJy4vRGF0YXNldCcpLkNlbGwsbnVtYmVyLG51bWJlcik6e2R4Om51bWJlcixkeTpudW1iZXJ9fSB2YWwgQHJldHVybnMge3RoaXN9ICovXG4gICAgc2V0T2Zmc2V0KHZhbCkge1xuICAgICAgICB0aGlzLm9mZnNldCA9IHZhbFxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKiBVcGRhdGUgbGVnZW5kcyBvZiB0aGUgc3R5bGUsIGlmIGFueVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXG4gICAgICogQHJldHVybnMge3RoaXN9ICovXG4gICAgdXBkYXRlTGVnZW5kcyhvcHRzKSB7XG4gICAgICAgIFN0eWxlLnVwZGF0ZUxlZ2VuZHNSZWN1cnNpdmUodGhpcy5sZWdlbmRzLCBvcHRzKVxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKiBAcHJpdmF0ZSAqL1xuICAgIHN0YXRpYyB1cGRhdGVMZWdlbmRzUmVjdXJzaXZlKGxnLCBvcHRzKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGxnKSkgZm9yIChjb25zdCBsZ18gb2YgbGcpIHRoaXMudXBkYXRlTGVnZW5kc1JlY3Vyc2l2ZShsZ18sIG9wdHMpXG4gICAgICAgIGVsc2UgbGcudXBkYXRlKG9wdHMpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi9MZWdlbmRcIikuTGVnZW5kPn0gbGVnZW5kc1xuICAgICAqIEByZXR1cm5zIHt0aGlzfSAqL1xuICAgIGFkZExlZ2VuZHMobGVnZW5kcykge1xuICAgICAgICBmb3IgKGxldCBsZWdlbmQgb2YgbGVnZW5kcykgdGhpcy5sZWdlbmRzLnB1c2gobGVnZW5kKVxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgc2VsZWN0IH0gZnJvbSAnZDMtc2VsZWN0aW9uJ1xuLy9pbXBvcnQgeyB0cmFuc2l0aW9uIH0gZnJvbSBcImQzLXRyYW5zaXRpb25cIjtcblxuLyoqXG4gKiBBIGdlbmVyaWMgY2xhc3MgdG8gbWFrZSBhIHRvb2x0aXAuXG4gKiBJdCBpcyBhIGRpdiBlbGVtZW50LCB3aGljaCBjYW4gYmUgbW92ZWQgdW5kZXIgdGhlIG1vdXNlIHBvaW50ZXIgYW5kIGZpbGxlZCB3aXRoIHNvbWUgaW5mb3JtYXRpb24gaW4gaHRtbC5cbiAqIEBtb2R1bGUgY29yZVxuICovXG5leHBvcnQgY2xhc3MgVG9vbHRpcCB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtvYmplY3R9IG9wdHNcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgICAgIHRoaXMubWF4V2lkdGggPSBvcHRzLm1heFdpZHRoIHx8ICcyMGVtJ1xuICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpcy5mb250U2l6ZSA9IG9wdHMuZm9udFNpemUgfHwgJzEuMmVtJ1xuICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpcy5iYWNrZ3JvdW5kID0gb3B0cy5iYWNrZ3JvdW5kIHx8ICd3aGl0ZSdcbiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgICAgIHRoaXMucGFkZGluZyA9IG9wdHMucGFkZGluZyB8fCAnNXB4J1xuICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpcy5ib3JkZXIgPSBvcHRzLmJvcmRlciB8fCAnMHB4J1xuICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpc1snYm9yZGVyLXJhZGl1cyddID0gb3B0c1snYm9yZGVyLXJhZGl1cyddIHx8ICcwcHgnXG4gICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSAqL1xuICAgICAgICB0aGlzWydib3gtc2hhZG93J10gPSBvcHRzWydib3gtc2hhZG93J10gfHwgJzVweCA1cHggNXB4IGdyZXknXG4gICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSAqL1xuICAgICAgICB0aGlzWydmb250LWZhbWlseSddID0gb3B0c1snZm9udC1mYW1pbHknXSB8fCAnSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZidcblxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgdGhpcy50cmFuc2l0aW9uRHVyYXRpb24gPSBvcHRzLnRyYW5zaXRpb25EdXJhdGlvbiB8fCAxMDBcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgIHRoaXMueE9mZnNldCA9IG9wdHMueE9mZnNldCB8fCAzMFxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgdGhpcy55T2Zmc2V0ID0gb3B0cy55T2Zmc2V0IHx8IDIwXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAvLyBlLmcuIHRvIHByZXZlbnQgbW91c2UgY3Vyc29yIGNvdmVyaW5nIGNlbGwgYmVpbmcgaGlnaGxpZ2h0ZWRcbiAgICAgICAgdGhpcy55TW91c2VPZmZzZXQgPSBvcHRzLnlNb3VzZU9mZnNldCB8fCAwXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLnhNb3VzZU9mZnNldCA9IG9wdHMueE1vdXNlT2Zmc2V0IHx8IDBcbiAgICAgICAgLyoqIEB0eXBlIHtIVE1MRWxlbWVudH0gKi9cbiAgICAgICAgdGhpcy5wYXJlbnRFbGVtZW50ID0gb3B0cy5wYXJlbnRFbGVtZW50IHx8IGRvY3VtZW50LmJvZHlcbiAgICAgICAgLyoqIEB0eXBlIHtIVE1MRWxlbWVudH0gKi9cbiAgICAgICAgdGhpcy50b29sdGlwRWxlbWVudCA9IG9wdHMudG9vbHRpcEVsZW1lbnQgfHwgbnVsbFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcHVibGljXG4gICAgICAgICAqIEB0eXBlIHtpbXBvcnQoXCJkMy1zZWxlY3Rpb25cIikuU2VsZWN0aW9ufSAqL1xuICAgICAgICB0aGlzLnRvb2x0aXAgPSBvcHRzLnRvb2x0aXBFbGVtZW50XG4gICAgICAgICAgICA/IHNlbGVjdChvcHRzLnRvb2x0aXBFbGVtZW50KSAvLyBXcmFwIHRoZSBwcm92aWRlZCBIVE1MIG5vZGUgaW4gYSBEMyBzZWxlY3Rpb25cbiAgICAgICAgICAgIDogc2VsZWN0KHRoaXMucGFyZW50RWxlbWVudCkuYXBwZW5kKCdkaXYnKS5hdHRyKCdpZCcsICdncmlkdml6LXRvb2x0aXAnKS5hdHRyKCdjbGFzcycsICdncmlkdml6LXRvb2x0aXAnKSAvLyBjcmVhdGUgZGVmYXVsdCBlbGVtZW50XG5cbiAgICAgICAgLy9pbml0aWFsaXNlXG4gICAgICAgIHRoaXMudG9vbHRpcC5zdHlsZSgnbWF4LXdpZHRoJywgdGhpcy5tYXhXaWR0aClcbiAgICAgICAgdGhpcy50b29sdGlwLnN0eWxlKCdvdmVyZmxvdycsICdoaWRkZW4nKVxuICAgICAgICB0aGlzLnRvb2x0aXAuc3R5bGUoJ2ZvbnQtc2l6ZScsIHRoaXMuZm9udFNpemUpXG4gICAgICAgIHRoaXMudG9vbHRpcC5zdHlsZSgnYmFja2dyb3VuZCcsIHRoaXMuYmFja2dyb3VuZClcbiAgICAgICAgdGhpcy50b29sdGlwLnN0eWxlKCdwYWRkaW5nJywgdGhpcy5wYWRkaW5nKVxuICAgICAgICB0aGlzLnRvb2x0aXAuc3R5bGUoJ2JvcmRlcicsIHRoaXMuYm9yZGVyKVxuICAgICAgICB0aGlzLnRvb2x0aXAuc3R5bGUoJ2JvcmRlci1yYWRpdXMnLCB0aGlzWydib3JkZXItcmFkaXVzJ10pXG4gICAgICAgIHRoaXMudG9vbHRpcC5zdHlsZSgnYm94LXNoYWRvdycsIHRoaXNbJ2JveC1zaGFkb3cnXSlcbiAgICAgICAgdGhpcy50b29sdGlwLnN0eWxlKCdmb250LWZhbWlseScsIHRoaXNbJ2ZvbnQtZmFtaWx5J10pXG4gICAgICAgIHRoaXMudG9vbHRpcC5zdHlsZSgncG9zaXRpb24nLCAnYWJzb2x1dGUnKVxuICAgICAgICB0aGlzLnRvb2x0aXAuc3R5bGUoJ3BvaW50ZXItZXZlbnRzJywgJ25vbmUnKVxuICAgICAgICB0aGlzLnRvb2x0aXAuc3R5bGUoJ29wYWNpdHknLCAnMCcpXG4gICAgICAgIHRoaXMudG9vbHRpcC5zdHlsZSgndGV4dC13cmFwJywgJ25vd3JhcCcpXG4gICAgICAgIHRoaXMudG9vbHRpcC5zdHlsZSgnei1pbmRleCcsIDk5OTk5OTk5KSAvLyBpbXBvcnRhbnQgZm9yIGxlYWZsZXQtZ3JpZHZpeiBldGNcblxuICAgICAgICAvLyB0aGVzZSBwbGFjZWhvbGRlcnMgYXJlIG5lZWRlZCB0byBwcmV2ZW50IGFuIGluZmluaXRlIERPTSByZXNpemVPYnNlcnZlciBsb29wOlxuICAgICAgICB0aGlzLnRvb2x0aXAuc3R5bGUoJ2xlZnQnLCAnMCcpXG4gICAgICAgIHRoaXMudG9vbHRpcC5zdHlsZSgndG9wJywgJzAnKVxuXG4gICAgICAgIC8vIGFyaWEtbGFiZWxzICh0aGFua3MgdG8gd2FobGF0bGFzKVxuICAgICAgICB0aGlzLnRvb2x0aXAuYXR0cigncm9sZScsICd0b29sdGlwJykuYXR0cignYXJpYS1saXZlJywgJ3BvbGl0ZScpXG4gICAgfVxuXG4gICAgLyoqIFNob3cgdGhlIHRvb2x0aXAgKi9cbiAgICBzaG93KCkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHRoaXMudG9vbHRpcC50cmFuc2l0aW9uKCkuZHVyYXRpb24odGhpcy50cmFuc2l0aW9uRHVyYXRpb24pLnN0eWxlKCdvcGFjaXR5JywgMSlcbiAgICB9XG5cbiAgICAvKiogSGlkZSB0aGUgdG9vbHRpcCAqL1xuICAgIGhpZGUoKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgdGhpcy50b29sdGlwLnRyYW5zaXRpb24oKS5kdXJhdGlvbih0aGlzLnRyYW5zaXRpb25EdXJhdGlvbikuc3R5bGUoJ29wYWNpdHknLCAwKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgY29udGVudCBvZiB0aGUgdG9vbHRpcC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaHRtbFxuICAgICAqL1xuICAgIGh0bWwoaHRtbCkge1xuICAgICAgICB0aGlzLnRvb2x0aXAuaHRtbChodG1sKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgcG9zaXRpb24gb2YgdGhlIHRvb2x0aXAgYXQgdGhlIG1vdXNlIGV2ZW50IHBvc2l0aW9uLlxuICAgICAqIEBwYXJhbSB7TW91c2VFdmVudH0gZXZlbnRcbiAgICAgKi9cbiAgICBzZXRQb3NpdGlvbihldmVudCkge1xuICAgICAgICAvLyBHZXQgdGhlIGJvdW5kaW5nIHJlY3Qgb2YgdGhlIHBhcmVudCBjb250YWluZXIgKG1hcDIpXG4gICAgICAgIGxldCBwYXJlbnRSZWN0ID0gdGhpcy5wYXJlbnRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG5cbiAgICAgICAgLy8gR2V0IHRoZSBtb3VzZSBwb3NpdGlvbiAocmVsYXRpdmUgdG8gdGhlIHBhcmVudCBjb250YWluZXIpXG4gICAgICAgIGxldCB4ID0gZXZlbnQuY2xpZW50WCAtIHBhcmVudFJlY3QubGVmdCArIHRoaXMueE9mZnNldCAvLyBSZWxhdGl2ZSB0byBwYXJlbnRcbiAgICAgICAgbGV0IHkgPSBldmVudC5jbGllbnRZIC0gcGFyZW50UmVjdC50b3AgLSB0aGlzLnlPZmZzZXQgLy8gUmVsYXRpdmUgdG8gcGFyZW50XG5cbiAgICAgICAgLy8gTm93LCBhcHBseSB0aGUgcG9zaXRpb24gdG8gdGhlIHRvb2x0aXBcbiAgICAgICAgdGhpcy50b29sdGlwLnN0eWxlKCdsZWZ0JywgeCArICdweCcpLnN0eWxlKCd0b3AnLCB5ICsgJ3B4JylcblxuICAgICAgICAvLyBFbnN1cmUgdGhlIHRvb2x0aXAgc3RheXMgaW5zaWRlIHRoZSBwYXJlbnQgY29udGFpbmVyXG4gICAgICAgIHRoaXMuZW5zdXJlVG9vbHRpcEluc2lkZUNvbnRhaW5lcihldmVudCwgcGFyZW50UmVjdCwgdGhpcy50b29sdGlwLm5vZGUoKSlcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGZ1bmN0aW9uIGVuc3VyZVRvb2x0aXBJbnNpZGVDb250YWluZXJcbiAgICAgKiBAZGVzY3JpcHRpb24gUHJldmVudHMgdGhlIHRvb2x0aXAgZnJvbSBvdmVyZmxvd2luZyBvdXQgb2YgdGhlIEFwcCBjb250YWluZXIgKGVuc3VyZXMgdGhhdCB0aGUgdG9vbHRpcCBpcyBpbnNpZGUgdGhlIGdyaWR2aXogY29udGFpbmVyKVxuICAgICAqIEBwYXJhbSB7TW91c2VFdmVudH0gZXZlbnRcbiAgICAgKiBAcGFyYW0ge0RPTVJlY3R9IHBhcmVudFJlY3RcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSB0b29sdGlwTm9kZVxuICAgICAqL1xuICAgIGVuc3VyZVRvb2x0aXBJbnNpZGVDb250YWluZXIoZXZlbnQsIHBhcmVudFJlY3QsIHRvb2x0aXBOb2RlKSB7XG4gICAgICAgIGxldCBub2RlID0gdG9vbHRpcE5vZGVcbiAgICAgICAgbGV0IHBhcmVudFdpZHRoID0gcGFyZW50UmVjdC53aWR0aFxuICAgICAgICBsZXQgcGFyZW50SGVpZ2h0ID0gcGFyZW50UmVjdC5oZWlnaHRcblxuICAgICAgICAvLyBFbnN1cmUgdG9vbHRpcCBkb2Vzbid0IGdvIGJleW9uZCB0aGUgcmlnaHQgZWRnZVxuICAgICAgICBpZiAobm9kZS5vZmZzZXRMZWZ0ICsgbm9kZS5jbGllbnRXaWR0aCA+IHBhcmVudFdpZHRoKSB7XG4gICAgICAgICAgICBsZXQgbGVmdCA9IGV2ZW50LmNsaWVudFggLSBub2RlLmNsaWVudFdpZHRoIC0gdGhpcy54T2Zmc2V0XG4gICAgICAgICAgICBub2RlLnN0eWxlLmxlZnQgPSBsZWZ0ICsgJ3B4J1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRW5zdXJlIHRvb2x0aXAgZG9lc24ndCBnbyBiZXlvbmQgdGhlIGJvdHRvbSBlZGdlXG4gICAgICAgIGlmIChub2RlLm9mZnNldFRvcCArIG5vZGUuY2xpZW50SGVpZ2h0ID4gcGFyZW50SGVpZ2h0KSB7XG4gICAgICAgICAgICBub2RlLnN0eWxlLnRvcCA9IHBhcmVudEhlaWdodCAtIG5vZGUuY2xpZW50SGVpZ2h0ICsgJ3B4J1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRW5zdXJlIHRvb2x0aXAgZG9lc24ndCBnbyBhYm92ZSB0aGUgdG9wIGVkZ2VcbiAgICAgICAgaWYgKG5vZGUub2Zmc2V0VG9wIDwgMCkge1xuICAgICAgICAgICAgbm9kZS5zdHlsZS50b3AgPSAwICsgJ3B4J1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRW5zdXJlIHRvb2x0aXAgZG9lc24ndCBnbyBiZXlvbmQgdGhlIGxlZnQgZWRnZVxuICAgICAgICBpZiAobm9kZS5vZmZzZXRMZWZ0IDwgMCkge1xuICAgICAgICAgICAgbm9kZS5zdHlsZS5sZWZ0ID0gMCArICdweCdcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qXG5cdG15Lm1vdXNlb3ZlciA9IGZ1bmN0aW9uIChldmVudCwgaHRtbCkge1xuXHRcdGlmIChodG1sKSBteS5odG1sKGh0bWwpO1xuXHRcdG15LnNldFBvc2l0aW9uKGV2ZW50KTtcblx0XHRteS5zaG93KClcblx0XHQvL3RoaXMuZW5zdXJlVG9vbHRpcEluc2lkZUNvbnRhaW5lcigpO1xuXHR9O1xuXHRcblx0bXkubW91c2Vtb3ZlID0gZnVuY3Rpb24gKGV2ZW50KSB7XG5cdFx0bXkuc2V0UG9zaXRpb24oZXZlbnQpO1xuXHRcdC8vdGhpcy5lbnN1cmVUb29sdGlwSW5zaWRlQ29udGFpbmVyKCk7XG5cdH07XG5cdFxuXHRteS5tb3VzZW91dCA9IGZ1bmN0aW9uICgpIHtcblx0XHRteS5oaWRlKCk7XG5cdH07Ki9cblxuICAgIHN0eWxlKGssIHYpIHtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMSkgcmV0dXJuIHRoaXMudG9vbHRpcC5zdHlsZShrKVxuICAgICAgICB0aGlzLnRvb2x0aXAuc3R5bGUoaywgdilcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICBhdHRyKGssIHYpIHtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMSkgcmV0dXJuIHRoaXMudG9vbHRpcC5hdHRyKGspXG4gICAgICAgIHRoaXMudG9vbHRpcC5hdHRyKGssIHYpXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG4vKiogQHR5cGVkZWYge3sgZGltczogb2JqZWN0LCBjcnM6IHN0cmluZywgdGlsZVNpemVDZWxsOiBudW1iZXIsIG9yaWdpblBvaW50OiB7eDpudW1iZXIseTpudW1iZXJ9LCByZXNvbHV0aW9uR2VvOiBudW1iZXIsIHRpbGluZ0JvdW5kczppbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhcy5qc1wiKS5FbnZlbG9wZSB9fSBHcmlkSW5mbyAqL1xuXG5pbXBvcnQgeyBkc3YgfSBmcm9tICdkMy1mZXRjaCdcbmltcG9ydCB7IERhdGFzZXQgfSBmcm9tICcuLi9jb3JlL0RhdGFzZXQuanMnXG5cbi8qKlxuICogQSBkYXRhc2V0IGNvbXBvc2VkIG9mIGEgc2luZ2xlIENTViBmaWxlIChub3QgdGlsZWQpLlxuICpcbiAqIEBtb2R1bGUgZGF0YXNldFxuICogQGF1dGhvciBKb3NlcGggRGF2aWVzLCBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgQ1NWR3JpZCBleHRlbmRzIERhdGFzZXQge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29yZS9NYXAuanNcIikuTWFwfSBtYXAgVGhlIG1hcC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIFRoZSBVUkwgb2YgdGhlIGRhdGFzZXQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJlc29sdXRpb24gVGhlIGRhdGFzZXQgcmVzb2x1dGlvbiBpbiBnZW9ncmFwaGljYWwgdW5pdC5cbiAgICAgKiBAcGFyYW0ge3twcmVwcm9jZXNzPzooZnVuY3Rpb24oaW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0LmpzXCIpLkNlbGwpOmJvb2xlYW4pLGRlbGltaXRlcj86c3RyaW5nfX0gb3B0c1xuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG1hcCwgdXJsLCByZXNvbHV0aW9uLCBvcHRzID0ge30pIHtcbiAgICAgICAgc3VwZXIobWFwLCB1cmwsIHJlc29sdXRpb24sIG9wdHMpXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEB0eXBlIHtBcnJheS48aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0LmpzXCIpLkNlbGw+fSAqL1xuICAgICAgICB0aGlzLmNlbGxzID0gW11cblxuICAgICAgICAvKipcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpcy5kZWxpbWl0ZXIgPSBvcHRzLmRlbGltaXRlciB8fCAnLCdcblxuICAgICAgICAvKipcbiAgICAgICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgICAgICogQHByaXZhdGUgICovXG4gICAgICAgIHRoaXMuaW5mb0xvYWRpbmdTdGF0dXMgPSAnbm90TG9hZGVkJ1xuXG4gICAgICAgIC8vZ2V0IGRhdGFcbiAgICAgICAgdGhpcy5nZXREYXRhKHVuZGVmaW5lZClcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXF1ZXN0IGRhdGEgd2l0aGluIGEgZ2VvZ3JhcGhpYyBlbnZlbG9wZS5cbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvcmUvR2VvQ2FudmFzLmpzXCIpLkVudmVsb3BlfHVuZGVmaW5lZH0gZVxuICAgICAqL1xuICAgIGdldERhdGEoZSkge1xuICAgICAgICAvL2NoZWNrIGlmIGRhdGEgYWxyZWFkeSBsb2FkZWRcbiAgICAgICAgaWYgKHRoaXMuaW5mb0xvYWRpbmdTdGF0dXMgIT0gJ25vdExvYWRlZCcpIHJldHVybiB0aGlzXG5cbiAgICAgICAgLy9sb2FkIGRhdGFcbiAgICAgICAgdGhpcy5pbmZvTG9hZGluZ1N0YXR1cyA9ICdsb2FkaW5nJ1xuICAgICAgICA7KGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IGRzdih0aGlzLmRlbGltaXRlciwgdGhpcy51cmwpXG5cbiAgICAgICAgICAgICAgICAvL2NvbnZlcnQgY29vcmRpbmF0ZXMgaW4gbnVtYmVyc1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYyBvZiBkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGMueCA9ICtjLnhcbiAgICAgICAgICAgICAgICAgICAgYy55ID0gK2MueVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vcHJlcHJvY2Vzcy9maWx0ZXJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5wcmVwcm9jZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2VsbHMgPSBbXVxuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGMgb2YgZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYiA9IHRoaXMucHJlcHJvY2VzcyhjKVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIgPT0gZmFsc2UpIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNlbGxzLnB1c2goYylcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2VsbHMgPSBkYXRhXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy9UT0RPIGNoZWNrIGlmIHJlZHJhdyBpcyBuZWNlc3NhcnlcbiAgICAgICAgICAgICAgICAvL3RoYXQgaXMgaWYgdGhlIGRhdGFzZXQgYmVsb25ncyB0byBhIGxheWVyIHdoaWNoIGlzIHZpc2libGUgYXQgdGhlIGN1cnJlbnQgem9vbSBsZXZlbFxuXG4gICAgICAgICAgICAgICAgLy9yZWRyYXcgbWFwXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubWFwKSB0aGlzLm1hcC5yZWRyYXcoKVxuXG4gICAgICAgICAgICAgICAgdGhpcy5pbmZvTG9hZGluZ1N0YXR1cyA9ICdsb2FkZWQnXG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIC8vbWFyayBhcyBmYWlsZWRcbiAgICAgICAgICAgICAgICB0aGlzLmluZm9Mb2FkaW5nU3RhdHVzID0gJ2ZhaWxlZCdcbiAgICAgICAgICAgICAgICB0aGlzLmNlbGxzID0gW11cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkoKVxuXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmlsbCB0aGUgdmlldyBjYWNoZSB3aXRoIGFsbCBjZWxscyB3aGljaCBhcmUgd2l0aGluIGEgZ2VvZ3JhcGhpY2FsIGVudmVsb3BlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhcy5qc1wiKS5FbnZlbG9wZX0gZXh0R2VvXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgdXBkYXRlVmlld0NhY2hlKGV4dEdlbykge1xuICAgICAgICAvL2RhdGEgbm90IGxvYWRlZCB5ZXRcbiAgICAgICAgaWYgKCF0aGlzLmNlbGxzKSByZXR1cm5cblxuICAgICAgICB0aGlzLmNlbGxzVmlld0NhY2hlID0gW11cbiAgICAgICAgZm9yIChjb25zdCBjZWxsIG9mIHRoaXMuY2VsbHMpIHtcbiAgICAgICAgICAgIGlmICgrY2VsbC54ICsgdGhpcy5yZXNvbHV0aW9uIDwgZXh0R2VvLnhNaW4pIGNvbnRpbnVlXG4gICAgICAgICAgICBpZiAoK2NlbGwueCAtIHRoaXMucmVzb2x1dGlvbiA+IGV4dEdlby54TWF4KSBjb250aW51ZVxuICAgICAgICAgICAgaWYgKCtjZWxsLnkgKyB0aGlzLnJlc29sdXRpb24gPCBleHRHZW8ueU1pbikgY29udGludWVcbiAgICAgICAgICAgIGlmICgrY2VsbC55IC0gdGhpcy5yZXNvbHV0aW9uID4gZXh0R2VvLnlNYXgpIGNvbnRpbnVlXG4gICAgICAgICAgICB0aGlzLmNlbGxzVmlld0NhY2hlLnB1c2goY2VsbClcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgRGF0YXNldCB9IGZyb20gJy4uL2NvcmUvRGF0YXNldC5qcydcblxuLyoqXG4gKiBBIGRhdGFzZXQgY29tcG9zZWQgb2YgY2VsbHMgZGVmaW5lZCBpbiBqYXZhc2NyaXB0LCBvciBsb2FkZWQgb3V0c2lkZSBvZiBncmlkdml6IG1hcC5cbiAqXG4gKiBAbW9kdWxlIGRhdGFzZXRcbiAqIEBhdXRob3IgSm9zZXBoIERhdmllcywgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIEpTR3JpZCBleHRlbmRzIERhdGFzZXQge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByZXNvbHV0aW9uIFRoZSBkYXRhc2V0IHJlc29sdXRpb24gaW4gZ2VvZ3JhcGhpY2FsIHVuaXQuXG4gICAgICogQHBhcmFtIHtBcnJheS48T2JqZWN0Pn0gY2VsbHMgVGhlIGNlbGxzLlxuICAgICAqIEBwYXJhbSB7fSBvcHRzXG4gICAgICovXG4gICAgY29uc3RydWN0b3IocmVzb2x1dGlvbiwgY2VsbHMsIG9wdHMgPSB7fSkge1xuICAgICAgICBzdXBlcih1bmRlZmluZWQsICcnLCByZXNvbHV0aW9uLCBvcHRzKVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAdHlwZSB7QXJyYXkuPGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbD59ICovXG4gICAgICAgIHRoaXMuY2VsbHMgPSBjZWxscyB8fCBbXVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlcXVlc3QgZGF0YSB3aXRoaW4gYSBnZW9ncmFwaGljIGVudmVsb3BlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhcy5qc1wiKS5FbnZlbG9wZXx1bmRlZmluZWR9IGVcbiAgICAgKi9cbiAgICBnZXREYXRhKGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaWxsIHRoZSB2aWV3IGNhY2hlIHdpdGggYWxsIGNlbGxzIHdoaWNoIGFyZSB3aXRoaW4gYSBnZW9ncmFwaGljYWwgZW52ZWxvcGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvcmUvR2VvQ2FudmFzLmpzXCIpLkVudmVsb3BlfSBleHRHZW9cbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICB1cGRhdGVWaWV3Q2FjaGUoZXh0R2VvKSB7XG4gICAgICAgIC8vZGF0YSBub3QgbG9hZGVkIHlldFxuICAgICAgICBpZiAoIXRoaXMuY2VsbHMpIHJldHVyblxuXG4gICAgICAgIHRoaXMuY2VsbHNWaWV3Q2FjaGUgPSBbXVxuICAgICAgICBmb3IgKGNvbnN0IGNlbGwgb2YgdGhpcy5jZWxscykge1xuICAgICAgICAgICAgaWYgKCtjZWxsLnggKyB0aGlzLnJlc29sdXRpb24gPCBleHRHZW8ueE1pbikgY29udGludWVcbiAgICAgICAgICAgIGlmICgrY2VsbC54IC0gdGhpcy5yZXNvbHV0aW9uID4gZXh0R2VvLnhNYXgpIGNvbnRpbnVlXG4gICAgICAgICAgICBpZiAoK2NlbGwueSArIHRoaXMucmVzb2x1dGlvbiA8IGV4dEdlby55TWluKSBjb250aW51ZVxuICAgICAgICAgICAgaWYgKCtjZWxsLnkgLSB0aGlzLnJlc29sdXRpb24gPiBleHRHZW8ueU1heCkgY29udGludWVcbiAgICAgICAgICAgIHRoaXMuY2VsbHNWaWV3Q2FjaGUucHVzaChjZWxsKVxuICAgICAgICB9XG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG4vKiogQHR5cGVkZWYge3sgZGltczogb2JqZWN0LCBjcnM6IHN0cmluZywgdGlsZVNpemVDZWxsOiBudW1iZXIsIG9yaWdpblBvaW50OiB7eDpudW1iZXIseTpudW1iZXJ9LCByZXNvbHV0aW9uR2VvOiBudW1iZXIsIHRpbGluZ0JvdW5kczppbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhcy5qc1wiKS5FbnZlbG9wZSB9fSBHcmlkSW5mbyAqL1xuXG4vLyBpbnRlcm5hbFxuaW1wb3J0IHsgRGF0YXNldCB9IGZyb20gJy4uL2NvcmUvRGF0YXNldC5qcydcbi8vaW1wb3J0IHsgbW9uaXRvciwgbW9uaXRvckR1cmF0aW9uIH0gZnJvbSAnLi4vdXRpbHMvVXRpbHMuanMnXG5cbi8vIGV4dGVybmFsXG5pbXBvcnQgeyBqc29uLCBjc3YgfSBmcm9tICdkMy1mZXRjaCdcblxuLyoqXG4gKiBBIHRpbGVkIGRhdGFzZXQsIGNvbXBvc2VkIG9mIENTViB0aWxlcy5cbiAqXG4gKiBAbW9kdWxlIGRhdGFzZXRcbiAqIEBhdXRob3IgSm9zZXBoIERhdmllcywgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIFRpbGVkR3JpZCBleHRlbmRzIERhdGFzZXQge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29yZS9NYXAuanNcIikuTWFwfSBtYXAgVGhlIG1hcC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIFRoZSBVUkwgb2YgdGhlIGRhdGFzZXQuXG4gICAgICogQHBhcmFtIHt7cHJlcHJvY2Vzcz86KGZ1bmN0aW9uKGltcG9ydChcIi4uL2NvcmUvRGF0YXNldC5qc1wiKS5DZWxsKTpib29sZWFuKSwgb25seURyYXdXaGVuQWxsVGlsZXNSZWFkeTpib29sZWFufX0gb3B0c1xuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG1hcCwgdXJsLCBvcHRzID0ge30pIHtcbiAgICAgICAgc3VwZXIobWFwLCB1cmwsIDAsIG9wdHMpXG4gICAgICAgIHRoaXMub25seURyYXdXaGVuQWxsVGlsZXNSZWFkeSA9IG9wdHMub25seURyYXdXaGVuQWxsVGlsZXNSZWFkeSB8fCBmYWxzZVxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGdyaWQgaW5mbyBvYmplY3QsIGZyb20gdGhlIGluZm8uanNvbiBmaWxlLlxuICAgICAgICAgKiAgQHR5cGUge0dyaWRJbmZvIHwgdW5kZWZpbmVkfVxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiAgKi9cbiAgICAgICAgdGhpcy5pbmZvID0gdW5kZWZpbmVkXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICAgICAqIEBwcml2YXRlICAqL1xuICAgICAgICB0aGlzLmluZm9Mb2FkaW5nU3RhdHVzID0gJ25vdExvYWRlZCdcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGNhY2hlIG9mIHRoZSBsb2FkZWQgdGlsZXMuIEl0IGlzIGRvdWJsZSBpbmRleGVkOiBieSB4VCBhbmQgdGhlbiB5VC5cbiAgICAgICAgICogRXhhbXBsZTogdGhpcy5jYWNoZVt4VF1beVRdIHJldHVybnMgdGhlIHRpbGUgYXQgW3hUXVt5VF0gbG9jYXRpb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEB0eXBlIHtvYmplY3R9XG4gICAgICAgICAqICovXG4gICAgICAgIHRoaXMuY2FjaGUgPSB7fVxuXG4gICAgICAgIC8vbGF1bmNoIGxvYWRpbmdcbiAgICAgICAgdGhpcy5sb2FkSW5mbygpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZCB0aGUgaW5mby5qc29uIGZyb20gdGhlIHVybC5cbiAgICAgKiBAcmV0dXJucyB0aGlzXG4gICAgICovXG4gICAgbG9hZEluZm8oKSB7XG4gICAgICAgIGlmICghdGhpcy5pbmZvICYmIHRoaXMuaW5mb0xvYWRpbmdTdGF0dXMgPT09ICdub3RMb2FkZWQnKSB7XG4gICAgICAgICAgICA7KGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQganNvbih0aGlzLnVybCArICdpbmZvLmpzb24nKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmluZm8gPSBkYXRhXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVzb2x1dGlvbiA9IGRhdGEucmVzb2x1dGlvbkdlb1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmluZm9Mb2FkaW5nU3RhdHVzID0gJ2xvYWRlZCdcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXAucmVkcmF3KClcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAvL21hcmsgYXMgZmFpbGVkXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5mb0xvYWRpbmdTdGF0dXMgPSAnZmFpbGVkJ1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKClcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmluZm9Mb2FkaW5nU3RhdHVzID09PSAnbG9hZGVkJyB8fCB0aGlzLmluZm9Mb2FkaW5nU3RhdHVzID09PSAnZmFpbGVkJykgdGhpcy5tYXAucmVkcmF3KClcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb21wdXRlIGEgdGlsaW5nIGVudmVsb3BlIGZyb20gYSBnZW9ncmFwaGljYWwgZW52ZWxvcGUuXG4gICAgICogVGhpcyBpcyB0aGUgZnVuY3Rpb24gdG8gdXNlIHRvIGtub3cgd2hpY2ggdGlsZXMgdG8gZG93bmxvYWQgZm9yIGEgZ2VvZ3JhcGhpY2FsIHZpZXcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvcmUvR2VvQ2FudmFzLmpzXCIpLkVudmVsb3BlfSBlXG4gICAgICogQHJldHVybnMge2ltcG9ydChcIi4uL2NvcmUvR2VvQ2FudmFzLmpzXCIpLkVudmVsb3BlfHVuZGVmaW5lZH1cbiAgICAgKi9cbiAgICBnZXRUaWxpbmdFbnZlbG9wZShlKSB7XG4gICAgICAgIGlmICghdGhpcy5pbmZvKSB7XG4gICAgICAgICAgICB0aGlzLmxvYWRJbmZvKClcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcG8gPSB0aGlzLmluZm8ub3JpZ2luUG9pbnQsXG4gICAgICAgICAgICByID0gdGhpcy5pbmZvLnJlc29sdXRpb25HZW8sXG4gICAgICAgICAgICBzID0gdGhpcy5pbmZvLnRpbGVTaXplQ2VsbFxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB4TWluOiBNYXRoLmZsb29yKChlLnhNaW4gLSBwby54KSAvIChyICogcykpLFxuICAgICAgICAgICAgeE1heDogTWF0aC5mbG9vcigoZS54TWF4IC0gcG8ueCkgLyAociAqIHMpKSxcbiAgICAgICAgICAgIHlNaW46IE1hdGguZmxvb3IoKGUueU1pbiAtIHBvLnkpIC8gKHIgKiBzKSksXG4gICAgICAgICAgICB5TWF4OiBNYXRoLmZsb29yKChlLnlNYXggLSBwby55KSAvIChyICogcykpLFxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVxdWVzdCBkYXRhIHdpdGhpbiBhIGdlb2dyYXBoaWMgZW52ZWxvcGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge2ltcG9ydCgnLi4vY29yZS9HZW9DYW52YXMuanMnKS5FbnZlbG9wZX0gZXh0R2VvXG4gICAgICogQHJldHVybnMge3RoaXN9XG4gICAgICovXG4gICAgYXN5bmMgZ2V0RGF0YShleHRHZW8pIHtcbiAgICAgICAgaWYgKCF0aGlzLmluZm8pIHJldHVybiB0aGlzXG5cbiAgICAgICAgLy8gQ3JlYXRlIGFuIEFib3J0Q29udHJvbGxlciBmb3IgdGhlIGN1cnJlbnQgZGF0YSByZXF1ZXN0XG4gICAgICAgIHRoaXMuYWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpXG4gICAgICAgIGNvbnN0IHNpZ25hbCA9IHRoaXMuYWJvcnRDb250cm9sbGVyLnNpZ25hbFxuXG4gICAgICAgIC8vIEdldCB0aGUgdGlsaW5nIGVudmVsb3BlIGFuZCBjaGVjayBib3VuZHNcbiAgICAgICAgY29uc3QgdGIgPSB0aGlzLmdldFRpbGluZ0VudmVsb3BlKGV4dEdlbylcbiAgICAgICAgaWYgKCF0YikgcmV0dXJuIHRoaXNcblxuICAgICAgICBjb25zdCB7IHhNaW46IGdiWE1pbiwgeE1heDogZ2JYTWF4LCB5TWluOiBnYllNaW4sIHlNYXg6IGdiWU1heCB9ID0gdGhpcy5pbmZvLnRpbGluZ0JvdW5kc1xuXG4gICAgICAgIGNvbnN0IHhNaW4gPSBNYXRoLm1heCh0Yi54TWluLCBnYlhNaW4pXG4gICAgICAgIGNvbnN0IHhNYXggPSBNYXRoLm1pbih0Yi54TWF4LCBnYlhNYXgpXG4gICAgICAgIGNvbnN0IHlNaW4gPSBNYXRoLm1heCh0Yi55TWluLCBnYllNaW4pXG4gICAgICAgIGNvbnN0IHlNYXggPSBNYXRoLm1pbih0Yi55TWF4LCBnYllNYXgpXG5cbiAgICAgICAgY29uc3QgdG90YWxUaWxlcyA9ICh4TWF4IC0geE1pbiArIDEpICogKHlNYXggLSB5TWluICsgMSlcbiAgICAgICAgbGV0IHByb2Nlc3NlZFRpbGVzID0gMFxuICAgICAgICBjb25zdCB0aWxlUHJvbWlzZXMgPSBbXVxuXG4gICAgICAgIC8vIEl0ZXJhdGUgb3ZlciB0aWxlcyB3aXRoaW4gYm91bmRzXG4gICAgICAgIGZvciAobGV0IHhUID0geE1pbjsgeFQgPD0geE1heDsgeFQrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgeVQgPSB5TWluOyB5VCA8PSB5TWF4OyB5VCsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmNhY2hlW3hUXSkgdGhpcy5jYWNoZVt4VF0gPSB7fVxuXG4gICAgICAgICAgICAgICAgLy8gU2tpcCBhbHJlYWR5IGxvYWRlZCB0aWxlcyBvciByZXRyeSBmYWlsZWQgb25lc1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNhY2hlW3hUXVt5VF0gJiYgdGhpcy5jYWNoZVt4VF1beVRdICE9PSAnZmFpbGVkJykge1xuICAgICAgICAgICAgICAgICAgICArK3Byb2Nlc3NlZFRpbGVzXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gTWFyayB0aWxlIGFzIGxvYWRpbmdcbiAgICAgICAgICAgICAgICB0aGlzLmNhY2hlW3hUXVt5VF0gPSAnbG9hZGluZydcblxuICAgICAgICAgICAgICAgIHRpbGVQcm9taXNlcy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRUaWxlKHhULCB5VCwgc2lnbmFsKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oKHRpbGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhY2hlW3hUXVt5VF0gPSB0aWxlXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGlzIGlzIHRoZSBsYXN0IHRpbGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpc0xhc3RUaWxlID0gKytwcm9jZXNzZWRUaWxlcyA9PT0gdG90YWxUaWxlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tBbmRSZWRyYXcodGlsZSwgaXNMYXN0VGlsZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2FjaGVbeFRdW3lUXSA9ICdmYWlsZWQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKytwcm9jZXNzZWRUaWxlc1xuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQodGlsZVByb21pc2VzKVxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvYWQgYSB0aWxlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHhUXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHlUXG4gICAgICogQHBhcmFtIHtBYm9ydFNpZ25hbH0gc2lnbmFsXG4gICAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICAgKi9cbiAgICBhc3luYyBsb2FkVGlsZSh4VCwgeVQsIHNpZ25hbCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IGNzdihgJHt0aGlzLnVybH0ke3hUfS8ke3lUfS5jc3ZgLCB7IHNpZ25hbCB9KVxuXG4gICAgICAgICAgICBjb25zdCBjZWxscyA9IHRoaXMucHJlcHJvY2VzcyA/IGRhdGEuZmlsdGVyKChjZWxsKSA9PiB0aGlzLnByZXByb2Nlc3MoY2VsbCkgIT09IGZhbHNlKSA6IGRhdGFcblxuICAgICAgICAgICAgaWYgKCF0aGlzLmluZm8pIHRocm93IG5ldyBFcnJvcignVGlsZSBpbmZvIHVua25vd24nKVxuXG4gICAgICAgICAgICByZXR1cm4gZ2V0R3JpZFRpbGUoY2VsbHMsIHhULCB5VCwgdGhpcy5pbmZvKVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGVycm9yLm5hbWUgPT09ICdBYm9ydEVycm9yJykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihgVGlsZSByZXF1ZXN0IGZvciAke3hUfSwgJHt5VH0gd2FzIGFib3J0ZWQuYClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGVycm9yXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYW5jZWwgb25nb2luZyBkYXRhIHJlcXVlc3RzIHdoZW4gem9vbSBsZXZlbCBjaGFuZ2VzLlxuICAgICAqL1xuICAgIGNhbmNlbEN1cnJlbnRSZXF1ZXN0cygpIHtcbiAgICAgICAgaWYgKHRoaXMuYWJvcnRDb250cm9sbGVyKSB7XG4gICAgICAgICAgICB0aGlzLmFib3J0Q29udHJvbGxlci5hYm9ydCgpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjaGVja0FuZFJlZHJhdyh0aWxlLCBpc0xhc3RUaWxlKSB7XG4gICAgICAgIC8vIENoZWNrIGlmIGFueSB2aXNpYmxlIGxheWVyIGRlcGVuZHMgb24gdGhpcyBkYXRhc2V0XG4gICAgICAgIC8vIGNoZWNrIGlmIHJlZHJhdyBpcyByZWFsbHkgbmVlZGVkLCB0aGF0IGlzIGlmOlxuICAgICAgICAvLyAxLiB0aGUgZGF0YXNldCBiZWxvbmdzIHRvIGEgbGF5ZXIgd2hpY2ggaXMgdmlzaWJsZSBhdCB0aGUgY3VycmVudCB6b29tIGxldmVsXG4gICAgICAgIGxldCBuZWVkc1JlZHJhdyA9IGZhbHNlXG4gICAgICAgIC8vZ28gdGhyb3VnaCB0aGUgbGF5ZXJzXG4gICAgICAgIGNvbnN0IHogPSB0aGlzLm1hcC5nZXRab29tKClcbiAgICAgICAgZm9yIChjb25zdCBsYXkgb2YgdGhpcy5tYXAubGF5ZXJzKSB7XG4gICAgICAgICAgICBpZiAobGF5LnZpc2libGUgJiYgIWxheS52aXNpYmxlKHopKSBjb250aW51ZVxuICAgICAgICAgICAgaWYgKCFsYXkuZ2V0RGF0YXNldCkgY29udGludWVcbiAgICAgICAgICAgIGlmIChsYXkuZ2V0RGF0YXNldCh6KSAhPSB0aGlzKSBjb250aW51ZVxuICAgICAgICAgICAgLy9mb3VuZCBvbmUgbGF5ZXIuIE5vIG5lZWQgdG8gc2VlayBtb3JlLlxuICAgICAgICAgICAgbmVlZHNSZWRyYXcgPSB0cnVlXG4gICAgICAgICAgICBicmVha1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFuZWVkc1JlZHJhdykgcmV0dXJuXG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGlsZSBpbnRlcnNlY3RzIHRoZSBjdXJyZW50IHZpZXdcbiAgICAgICAgY29uc3QgZW52ID0gdGhpcy5tYXAudXBkYXRlRXh0ZW50R2VvKClcbiAgICAgICAgY29uc3QgeyB4TWluLCB4TWF4LCB5TWluLCB5TWF4IH0gPSB0aWxlLmV4dEdlb1xuICAgICAgICBpZiAoZW52LnhNYXggPD0geE1pbiB8fCBlbnYueE1pbiA+PSB4TWF4IHx8IGVudi55TWF4IDw9IHlNaW4gfHwgZW52LnlNaW4gPj0geU1heCkgcmV0dXJuXG5cbiAgICAgICAgLy8gVHJpZ2dlciByZWRyYXdcbiAgICAgICAgaWYgKHRoaXMub25seURyYXdXaGVuQWxsVGlsZXNSZWFkeSkge1xuICAgICAgICAgICAgaWYgKGlzTGFzdFRpbGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1hcC5yZWRyYXcoKVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5tYXAucmVkcmF3KClcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbGwgdGhlIHZpZXcgY2FjaGUgd2l0aCBhbGwgY2VsbHMgd2hpY2ggYXJlIHdpdGhpbiBhIGdlb2dyYXBoaWNhbCBlbnZlbG9wZS5cbiAgICAgKiBAYWJzdHJhY3RcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvcmUvR2VvQ2FudmFzLmpzXCIpLkVudmVsb3BlfSBleHRHZW9cbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICB1cGRhdGVWaWV3Q2FjaGUoZXh0R2VvKSB7XG4gICAgICAgIC8vXG4gICAgICAgIHRoaXMuY2VsbHNWaWV3Q2FjaGUgPSBbXVxuXG4gICAgICAgIC8vY2hlY2sgaWYgaW5mbyBoYXMgYmVlbiBsb2FkZWRcbiAgICAgICAgaWYgKCF0aGlzLmluZm8pIHJldHVyblxuXG4gICAgICAgIC8vdGlsZXMgd2l0aGluIHRoZSBzY29wZVxuICAgICAgICAvKiogQHR5cGUge2ltcG9ydChcIi4uL2NvcmUvR2VvQ2FudmFzLmpzXCIpLkVudmVsb3BlfHVuZGVmaW5lZH0gKi9cbiAgICAgICAgY29uc3QgdGIgPSB0aGlzLmdldFRpbGluZ0VudmVsb3BlKGV4dEdlbylcbiAgICAgICAgaWYgKCF0YikgcmV0dXJuXG5cbiAgICAgICAgLy9ncmlkIGJvdW5kc1xuICAgICAgICAvKiogQHR5cGUge2ltcG9ydChcIi4uL2NvcmUvR2VvQ2FudmFzLmpzXCIpLkVudmVsb3BlfSAqL1xuICAgICAgICBjb25zdCBnYiA9IHRoaXMuaW5mby50aWxpbmdCb3VuZHNcblxuICAgICAgICBmb3IgKGxldCB4VCA9IE1hdGgubWF4KHRiLnhNaW4sIGdiLnhNaW4pOyB4VCA8PSBNYXRoLm1pbih0Yi54TWF4LCBnYi54TWF4KTsgeFQrKykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmNhY2hlW3hUXSkgY29udGludWVcbiAgICAgICAgICAgIGZvciAobGV0IHlUID0gTWF0aC5tYXgodGIueU1pbiwgZ2IueU1pbik7IHlUIDw9IE1hdGgubWluKHRiLnlNYXgsIGdiLnlNYXgpOyB5VCsrKSB7XG4gICAgICAgICAgICAgICAgLy9nZXQgdGlsZVxuICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7b2JqZWN0fSAqL1xuICAgICAgICAgICAgICAgIGNvbnN0IHRpbGUgPSB0aGlzLmNhY2hlW3hUXVt5VF1cbiAgICAgICAgICAgICAgICBpZiAoIXRpbGUgfHwgdHlwZW9mIHRpbGUgPT09ICdzdHJpbmcnKSBjb250aW51ZVxuXG4gICAgICAgICAgICAgICAgLy9nZXQgY2VsbHNcbiAgICAgICAgICAgICAgICAvL3RoaXMuY2VsbHNWaWV3Q2FjaGUgPSB0aGlzLmNlbGxzVmlld0NhY2hlLmNvbmNhdCh0aWxlLmNlbGxzKVxuXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBjZWxsIG9mIHRpbGUuY2VsbHMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCtjZWxsLnggKyB0aGlzLnJlc29sdXRpb24gPCBleHRHZW8ueE1pbikgY29udGludWVcbiAgICAgICAgICAgICAgICAgICAgaWYgKCtjZWxsLnggLSB0aGlzLnJlc29sdXRpb24gPiBleHRHZW8ueE1heCkgY29udGludWVcbiAgICAgICAgICAgICAgICAgICAgaWYgKCtjZWxsLnkgKyB0aGlzLnJlc29sdXRpb24gPCBleHRHZW8ueU1pbikgY29udGludWVcbiAgICAgICAgICAgICAgICAgICAgaWYgKCtjZWxsLnkgLSB0aGlzLnJlc29sdXRpb24gPiBleHRHZW8ueU1heCkgY29udGludWVcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZWxsc1ZpZXdDYWNoZS5wdXNoKGNlbGwpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiBnZXRHcmlkVGlsZShjZWxscywgeFQsIHlULCBncmlkSW5mbykge1xuICAgIGNvbnN0IHRpbGUgPSB7fVxuXG4gICAgLyoqIEB0eXBlIHtBcnJheS48aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0XCIpLkNlbGw+fSAqL1xuICAgIHRpbGUuY2VsbHMgPSBjZWxsc1xuICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgIHRpbGUueCA9IHhUXG4gICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgdGlsZS55ID0geVRcblxuICAgIGNvbnN0IHIgPSBncmlkSW5mby5yZXNvbHV0aW9uR2VvXG4gICAgY29uc3QgcyA9IGdyaWRJbmZvLnRpbGVTaXplQ2VsbFxuXG4gICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhc1wiKS5FbnZlbG9wZX0gKi9cbiAgICB0aWxlLmV4dEdlbyA9IHtcbiAgICAgICAgeE1pbjogZ3JpZEluZm8ub3JpZ2luUG9pbnQueCArIHIgKiBzICogdGlsZS54LFxuICAgICAgICB4TWF4OiBncmlkSW5mby5vcmlnaW5Qb2ludC54ICsgciAqIHMgKiAodGlsZS54ICsgMSksXG4gICAgICAgIHlNaW46IGdyaWRJbmZvLm9yaWdpblBvaW50LnkgKyByICogcyAqIHRpbGUueSxcbiAgICAgICAgeU1heDogZ3JpZEluZm8ub3JpZ2luUG9pbnQueSArIHIgKiBzICogKHRpbGUueSArIDEpLFxuICAgIH1cblxuICAgIC8vY29udmVydCBjZWxsIGNvb3JkaW5hdGVzIGludG8gZ2VvZ3JhcGhpY2FsIGNvb3JkaW5hdGVzXG4gICAgZm9yIChsZXQgY2VsbCBvZiB0aWxlLmNlbGxzKSB7XG4gICAgICAgIGNlbGwueCA9IHRpbGUuZXh0R2VvLnhNaW4gKyBjZWxsLnggKiByXG4gICAgICAgIGNlbGwueSA9IHRpbGUuZXh0R2VvLnlNaW4gKyBjZWxsLnkgKiByXG4gICAgfVxuXG4gICAgcmV0dXJuIHRpbGVcbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgTGF5ZXIgfSBmcm9tICcuLi9jb3JlL0xheWVyLmpzJ1xuXG4vKipcbiAqXG4gKiBBIG1hcCBiYWNrZ3JvdW5kIGxheWVyIGluIFwiU2xpcHB5IG1hcFwiIFhZWiBzdGFuZGFyZC5cbiAqIFNlZSBodHRwczovL3dpa2kub3BlbnN0cmVldG1hcC5vcmcvd2lraS9TbGlwcHlfbWFwX3RpbGVuYW1lc1xuICogaHR0cHM6Ly93d3cubWFwdGlsZXIuY29tL2dvb2dsZS1tYXBzLWNvb3JkaW5hdGVzLXRpbGUtYm91bmRzLXByb2plY3Rpb24vIzYvMjcuODgvNDQuNDhcbiAqXG4gKiBAbW9kdWxlIGxheWVyXG4gKiBAYXV0aG9yIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBCYWNrZ3JvdW5kTGF5ZXIgZXh0ZW5kcyBMYXllciB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtvYmplY3R9IG9wdHNcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLyoqIFRoZSBpbWFnZSBjYWNoZSwgaW5kZXhlZCBieSB6L3kveFxuICAgICAgICAgKiBAcHJpdmF0ZSAqL1xuICAgICAgICB0aGlzLmNhY2hlID0ge31cblxuICAgICAgICAvKipcbiAgICAgICAgICogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpcy51cmwgPSBvcHRzLnVybFxuICAgICAgICAvKiogQHR5cGUge2Z1bmN0aW9uKG51bWJlcixudW1iZXIsbnVtYmVyKTpzdHJpbmd9ICovXG4gICAgICAgIHRoaXMudXJsRnVuID0gb3B0cy51cmxGdW4gfHwgKCh4LCB5LCB6KSA9PiB0aGlzLnVybCArIHogKyAnLycgKyB4ICsgJy8nICsgeSArICcucG5nJylcblxuICAgICAgICAvKiogVGhlIGdyb3VuZCByZXNvbHV0aW9ucyBvZiB0aGUgem9vbSBsZXZlbHMsIHN0YXJ0aW5nIGZyb20gdGhlIHNtYWxsZXN0IChtb3N0IHpvb21lZC1vdXQsIHVzdWFsbHkgMCkgdG8gdGhlIGxhcmdlc3QgKG1vc3Qgem9vbWVkLWluKS5cbiAgICAgICAgICogVXN1YWxseSBkaXZpZGVkIGJ5IDIgZm9yIGVhY2ggem9vbSBsZXZlbCBpbmNyZW1lbnQuXG4gICAgICAgICAqIEB0eXBlIHtBcnJheS48bnVtYmVyPn0gKi9cbiAgICAgICAgdGhpcy5yZXNvbHV0aW9ucyA9IG9wdHMucmVzb2x1dGlvbnNcbiAgICAgICAgaWYgKCF0aGlzLnJlc29sdXRpb25zIHx8IHRoaXMucmVzb2x1dGlvbnMubGVuZ3RoID09IDApXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHJlc29sdXRpb25zIHByb3ZpZGVkIGZvciBiYWNrZ3JvdW5kIGxheWVyJylcblxuICAgICAgICAvKiogVGhlIHRpbGUgc2l6ZSwgaW4gbnVtYmVyIG9mIHBpeGVsc1xuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLm5iUGl4ID0gb3B0cy5uYlBpeCB8fCAyNTZcblxuICAgICAgICAvKiogQ1JTIGNvb3JkaW5hdGVzIG9mIHRvcCBsZWZ0IGNvcm5lciBvZiB0aGUgdG9wIGxlZnQgdGlsZSwgdGhlIG9uZSB3aXRoIGNvZGUgLzAvMC5wbmcuXG4gICAgICAgICAqIEB0eXBlIHtBcnJheS48bnVtYmVyPn0gKi9cbiAgICAgICAgdGhpcy5vcmlnaW4gPSBvcHRzLm9yaWdpbiB8fCBbMCwgMF1cblxuICAgICAgICAvKiogVGhlIGNvZGUgb2YgdGhlIHNtYWxsZXN0IChtb3N0IHpvb21lZC1vdXQpIHpvb20gbGV2ZWwsIGluIGNhc2UgaXQgaXMgbm90IDAuXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgIHRoaXMuejAgPSBvcHRzLnowIHx8IDBcblxuICAgICAgICAvKiogQSBjb2VmZmljaWVudCB0byBhZGp1c3QgdGhlIGJhY2tncm91biByZXNvbHV0aW9uIHdpdGggdGhlIHNjcmVlbiByZXNvbHV0aW9uLlxuICAgICAgICAgKiAgSWYgdGhlIGJhY2tncm91bmQgaW1hZ2VzIGFyZSB0b28gcGl4ZWxpc2VkLCByZWR1Y2UgdGhlIHZhbHVlLlxuICAgICAgICAgKiAgSWYgdGhlcmUgYXJlIHRvbyBtYW55IGltYWdlcyB0byBkb3dubG9hZCwgaW5jcmVhc2UgdGhlIHZhbHVlLlxuICAgICAgICAgKiAgRGVmYXVsdCB2YWx1ZSBpcyAxLjBcbiAgICAgICAgICogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgdGhpcy5waXhlbGF0aW9uQ29lZmZpY2llbnQgPSBvcHRzLnBpeGVsYXRpb25Db2VmZmljaWVudCB8fCAxLjBcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgei94L3kgY2FjaGUgZGF0YS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gelxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHlcbiAgICAgKiBAcmV0dXJucyB7SFRNTEltYWdlRWxlbWVudHxzdHJpbmd8dW5kZWZpbmVkfVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgZ2V0KHosIHgsIHkpIHtcbiAgICAgICAgbGV0IGQgPSB0aGlzLmNhY2hlW3pdXG4gICAgICAgIGlmICghZCkgcmV0dXJuXG4gICAgICAgIGQgPSBkW3hdXG4gICAgICAgIGlmICghZCkgcmV0dXJuXG4gICAgICAgIHJldHVybiBkW3ldXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHV0IGltYWdlIGluIGNhY2hlLlxuICAgICAqIEBwYXJhbSB7SFRNTEltYWdlRWxlbWVudHxzdHJpbmd9IGltZ1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB6XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHhcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geVxuICAgICAqIEByZXR1cm5zXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwdXQoaW1nLCB6LCB4LCB5KSB7XG4gICAgICAgIGlmICghdGhpcy5jYWNoZVt6XSkgdGhpcy5jYWNoZVt6XSA9IHt9XG4gICAgICAgIGlmICghdGhpcy5jYWNoZVt6XVt4XSkgdGhpcy5jYWNoZVt6XVt4XSA9IHt9XG4gICAgICAgIHRoaXMuY2FjaGVbel1beF1beV0gPSBpbWdcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvcmUvR2VvQ2FudmFzXCIpLkdlb0NhbnZhc30gZ2VvQ2FudmFzIFRoZSBjYW52YXMgd2hlcmUgdG8gZHJhdyB0aGUgbGF5ZXIuXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgZHJhdyhnZW9DYW52YXMpIHtcbiAgICAgICAgaWYgKCF0aGlzLnJlc29sdXRpb25zIHx8IHRoaXMucmVzb2x1dGlvbnMubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ05vIHJlc29sdXRpb25zIHByb3ZpZGVkIGZvciBiYWNrZ3JvdW5kIGxheWVyJylcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgeiA9IGdlb0NhbnZhcy52aWV3LnpcbiAgICAgICAgY29uc3QgeDAgPSB0aGlzLm9yaWdpblswXSwgeTAgPSB0aGlzLm9yaWdpblsxXVxuXG4gICAgICAgIC8vZ2V0IHpvb20gbGV2ZWwgYW5kIHJlc29sdXRpb25cbiAgICAgICAgbGV0IHpfID0gMFxuICAgICAgICBmb3IgKHpfID0gMDsgel8gPCB0aGlzLnJlc29sdXRpb25zLmxlbmd0aDsgel8rKykgaWYgKHRoaXMucmVzb2x1dGlvbnNbel9dIDwgeiAqIHRoaXMucGl4ZWxhdGlvbkNvZWZmaWNpZW50KSBicmVha1xuICAgICAgICB6XyAtPSAxXG4gICAgICAgIHpfID0gTWF0aC5tYXgoMCwgel8pXG4gICAgICAgIHpfID0gTWF0aC5taW4oel8sIHRoaXMucmVzb2x1dGlvbnMubGVuZ3RoIC0gMSlcbiAgICAgICAgY29uc3QgcmVzID0gdGhpcy5yZXNvbHV0aW9uc1t6X11cbiAgICAgICAgel8gKz0gdGhpcy56MFxuXG4gICAgICAgIGNvbnN0IHNpemVHID0gdGhpcy5uYlBpeCAqIHJlc1xuICAgICAgICBjb25zdCBzaXplID0gc2l6ZUcgLyB6XG5cbiAgICAgICAgLy9nZXQgdGlsZSBudW1iZXJzXG4gICAgICAgIGNvbnN0IHhHZW9Ub1RNUyA9ICh4KSA9PiBNYXRoLmNlaWwoKHggLSB4MCkgLyBzaXplRylcbiAgICAgICAgY29uc3QgeUdlb1RvVE1TID0gKHkpID0+IE1hdGguY2VpbCgtKHkgLSB5MCkgLyBzaXplRylcbiAgICAgICAgY29uc3QgeE1pbiA9IHhHZW9Ub1RNUyhnZW9DYW52YXMuZXh0R2VvLnhNaW4pIC0gMVxuICAgICAgICBjb25zdCB4TWF4ID0geEdlb1RvVE1TKGdlb0NhbnZhcy5leHRHZW8ueE1heClcbiAgICAgICAgY29uc3QgeU1heCA9IHlHZW9Ub1RNUyhnZW9DYW52YXMuZXh0R2VvLnlNaW4pXG4gICAgICAgIGNvbnN0IHlNaW4gPSB5R2VvVG9UTVMoZ2VvQ2FudmFzLmV4dEdlby55TWF4KSAtIDFcblxuICAgICAgICAvL2hhbmRsZSBpbWFnZXNcbiAgICAgICAgZm9yIChsZXQgeCA9IHhNaW47IHggPCB4TWF4OyB4KyspIHtcbiAgICAgICAgICAgIGZvciAobGV0IHkgPSB5TWluOyB5IDwgeU1heDsgeSsrKSB7XG4gICAgICAgICAgICAgICAgLy9nZXQgaW1hZ2VcbiAgICAgICAgICAgICAgICBsZXQgaW1nID0gdGhpcy5nZXQoel8sIHgsIHkpXG5cbiAgICAgICAgICAgICAgICAvL25vIGltYWdlOiBsb2FkIGltYWdlIGZyb20gVVJMXG4gICAgICAgICAgICAgICAgaWYgKCFpbWcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW1nID0gbmV3IEltYWdlKClcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wdXQoaW1nLCB6XywgeCwgeSlcbiAgICAgICAgICAgICAgICAgICAgaW1nLm9ubG9hZCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5yZWRyYXcoKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGltZy5vbmVycm9yID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9jYXNlIHdoZW4gbm8gaW1hZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHV0KCdmYWlsZWQnLCB6XywgeCwgeSlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpbWcuc3JjID0gdGhpcy51cmxGdW4oeCwgeSwgel8pXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy9jYXNlIHdoZW4gbm8gaW1hZ2UgYXZhaWxhYmxlXG4gICAgICAgICAgICAgICAgaWYgKGltZyA9PT0gJ2ZhaWxlZCcpIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgaWYgKCEoaW1nIGluc3RhbmNlb2YgSFRNTEltYWdlRWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coaW1nKVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaW1nLndpZHRoID09IDAgfHwgaW1nLmhlaWdodCA9PSAwKSBjb250aW51ZVxuXG4gICAgICAgICAgICAgICAgLy9kcmF3IGltYWdlXG4gICAgICAgICAgICAgICAgY29uc3QgeEdlbyA9IHgwICsgeCAqIHNpemVHXG4gICAgICAgICAgICAgICAgY29uc3QgeUdlbyA9IHkwIC0geSAqIHNpemVHXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmluaXRDYW52YXNUcmFuc2Zvcm0oKVxuICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMub2Zmc2NyZWVuQ3R4LmRyYXdJbWFnZShcbiAgICAgICAgICAgICAgICAgICAgICAgIGltZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5nZW9Ub1BpeFgoeEdlbyksXG4gICAgICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuZ2VvVG9QaXhZKHlHZW8pLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpemVcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAvL2NnLmN0eC5kcmF3SW1hZ2UoaW1nLCB4R2VvLCB5R2VvLCBzaXplRywgLXNpemVHKVxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBMYXllciB9IGZyb20gJy4uL2NvcmUvTGF5ZXIuanMnXG5cbi8qKlxuICpcbiAqIEEgbWFwIGJhY2tncm91bmQgbGF5ZXIgY29tcG9zZWQgb2YgYSBzaW5nbGUgaW1hZ2UgZmlsZSwgZ2VvbG9jYXRlZC5cbiAqXG4gKiBAbW9kdWxlIGxheWVyXG4gKiBAYXV0aG9yIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBCYWNrZ3JvdW5kTGF5ZXJJbWFnZSBleHRlbmRzIExheWVyIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb3B0c1xuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cylcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvKiogVGhlIGltYWdlIGZpbGUgVVJMXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgICAgIHRoaXMudXJsID0gb3B0cy51cmxcblxuICAgICAgICAvKiogVGhlIGltYWdlIGxlZnQgY29vcmRpbmF0ZVxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLnhNaW4gPSBvcHRzLnhNaW4gfHwgMFxuICAgICAgICAvKiogVGhlIGltYWdlIHRvcCBjb29yZGluYXRlXG4gICAgICAgICAqICBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLnlNYXggPSBvcHRzLnlNYXggfHwgMFxuXG4gICAgICAgIC8qKiBUaGUgaW1hZ2Ugd2lkdGgsIGluIGdlbyB1bml0XG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgIHRoaXMud2lkdGggPSBvcHRzLndpZHRoIHx8IDIwMDAwXG4gICAgICAgIC8qKiBUaGUgaW1hZ2UgaGVpZ2h0LCBpbiBnZW8gdW5pdFxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLmhlaWdodCA9IG9wdHMuaGVpZ2h0IHx8IDIwMDAwXG5cbiAgICAgICAgLyoqIFRoZSBpbWFnZSBvYmplY3RcbiAgICAgICAgICogQHR5cGUge0hUTUxJbWFnZUVsZW1lbnR8dW5kZWZpbmVkfSAqL1xuICAgICAgICB0aGlzLmltZyA9IHVuZGVmaW5lZFxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29yZS9HZW9DYW52YXMuanNcIikuR2VvQ2FudmFzfSBnZW9DYW52YXMgVGhlIGNhbnZhcyB3aGVyZSB0byBkcmF3IHRoZSBsYXllci5cbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICBkcmF3KGdlb0NhbnZhcykge1xuICAgICAgICAvL3VwZGF0ZSBtYXAgZXh0ZW50XG4gICAgICAgIC8vZ2VvQ2FudmFzLnVwZGF0ZUV4dGVudEdlbygwKVxuXG4gICAgICAgIGlmICh0aGlzLmltZykge1xuICAgICAgICAgICAgLy90aGUgaW1hZ2Ugd2FzIGFscmVhZHkgZG93bmxvYWRlZDogZHJhdyBpdFxuXG4gICAgICAgICAgICAvL2NvbXB1dGUgc2NyZWVuIGNvb3JkaW5hdGVzIGFuZCBzaXplIHJhdGlvXG4gICAgICAgICAgICBjb25zdCB4ID0gZ2VvQ2FudmFzLmdlb1RvUGl4WCh0aGlzLnhNaW4pXG4gICAgICAgICAgICBjb25zdCB5ID0gZ2VvQ2FudmFzLmdlb1RvUGl4WSh0aGlzLnlNYXgpXG4gICAgICAgICAgICBjb25zdCB6ID0gZ2VvQ2FudmFzLmdldFZpZXcoKS56XG5cbiAgICAgICAgICAgIC8vZHJhdyBpbWFnZVxuICAgICAgICAgICAgZ2VvQ2FudmFzLmluaXRDYW52YXNUcmFuc2Zvcm0oKVxuICAgICAgICAgICAgZ2VvQ2FudmFzLm9mZnNjcmVlbkN0eC5kcmF3SW1hZ2UodGhpcy5pbWcsIHgsIHksIHRoaXMud2lkdGggLyB6LCB0aGlzLmhlaWdodCAvIHopXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvL3JldHJpZXZlIGltYWdlXG5cbiAgICAgICAgICAgIGlmICghdGhpcy5pbWcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmltZyA9IG5ldyBJbWFnZSgpXG4gICAgICAgICAgICAgICAgdGhpcy5pbWcub25sb2FkID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMucmVkcmF3KClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5pbWcub25lcnJvciA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy9jYXNlIHdoZW4gbm8gaW1hZ2VcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdDb3VsZCBub3QgcmV0cmlldmUgYmFja2dyb3VuZCBpbWFnZSBmcm9tJywgdGhpcy51cmwpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvL3NldCBVUkwgdG8gbGF1bmNoIHRoZSBkb3dubG9hZFxuICAgICAgICAgICAgdGhpcy5pbWcuc3JjID0gdGhpcy51cmxcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgTGF5ZXIgfSBmcm9tICcuLi9jb3JlL0xheWVyLmpzJ1xuXG4vKipcbiAqXG4gKiBBIG1hcCBXTVMgYmFja2dyb3VuZCBsYXllci5cbiAqXG4gKiBAbW9kdWxlIGxheWVyXG4gKiBAYXV0aG9yIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBCYWNrZ3JvdW5kTGF5ZXJXTVMgZXh0ZW5kcyBMYXllciB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtvYmplY3R9IG9wdHNcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgICAgIHRoaXMudXJsID0gb3B0cy51cmxcblxuICAgICAgICAvKiogQHR5cGUge0hUTUxJbWFnZUVsZW1lbnR8dW5kZWZpbmVkfSAqL1xuICAgICAgICB0aGlzLmltZyA9IHVuZGVmaW5lZFxuXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfHVuZGVmaW5lZH0gKi9cbiAgICAgICAgdGhpcy54TWluID0gdW5kZWZpbmVkXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfHVuZGVmaW5lZH0gKi9cbiAgICAgICAgdGhpcy54TWF4ID0gdW5kZWZpbmVkXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfHVuZGVmaW5lZH0gKi9cbiAgICAgICAgdGhpcy55TWluID0gdW5kZWZpbmVkXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfHVuZGVmaW5lZH0gKi9cbiAgICAgICAgdGhpcy55TWF4ID0gdW5kZWZpbmVkXG4gICAgfVxuXG4gICAgLyoqIENoZWNrIGlmIHRoZSB2aWV3IGhhcyBtb3ZlZCBhbmQgYSBuZXcgaW1hZ2UgbmVlZHMgdG8gYmUgcmV0cmlldmVkLlxuICAgICAqIEBwcml2YXRlICovXG4gICAgaGFzTW92ZWQoZXh0R2VvKSB7XG4gICAgICAgIGlmIChleHRHZW8ueE1pbiAhPSB0aGlzLnhNaW4pIHJldHVybiB0cnVlXG4gICAgICAgIGVsc2UgaWYgKGV4dEdlby54TWF4ICE9IHRoaXMueE1heCkgcmV0dXJuIHRydWVcbiAgICAgICAgZWxzZSBpZiAoZXh0R2VvLnlNaW4gIT0gdGhpcy55TWluKSByZXR1cm4gdHJ1ZVxuICAgICAgICBlbHNlIGlmIChleHRHZW8ueU1heCAhPSB0aGlzLnlNYXgpIHJldHVybiB0cnVlXG4gICAgICAgIGVsc2UgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhc1wiKS5HZW9DYW52YXN9IGdlb0NhbnZhcyBUaGUgY2FudmFzIHdoZXJlIHRvIGRyYXcgdGhlIGxheWVyLlxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIGRyYXcoZ2VvQ2FudmFzKSB7XG4gICAgICAgIC8vdXBkYXRlIG1hcCBleHRlbnRcbiAgICAgICAgZ2VvQ2FudmFzLnVwZGF0ZUV4dGVudEdlbygwKVxuXG4gICAgICAgIGlmICghdGhpcy5oYXNNb3ZlZChnZW9DYW52YXMuZXh0R2VvKSAmJiB0aGlzLmltZykge1xuICAgICAgICAgICAgLy90aGUgbWFwIGRpZCBub3QgbW92ZSBhbmQgdGhlIGltYWdlIHdhcyBhbHJlYWR5IGRvd25sb2FkZWQ6IGRyYXcgdGhlIGltYWdlXG4gICAgICAgICAgICBnZW9DYW52YXMuaW5pdENhbnZhc1RyYW5zZm9ybSgpXG4gICAgICAgICAgICBnZW9DYW52YXMub2Zmc2NyZWVuQ3R4LmRyYXdJbWFnZSh0aGlzLmltZywgMCwgMCwgZ2VvQ2FudmFzLncsIGdlb0NhbnZhcy5oKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy90aGUgbWFwIG1vdmVkOiByZXRyaWV2ZSBuZXcgaW1hZ2VcblxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIHRoaXMueE1pbiA9IGdlb0NhbnZhcy5leHRHZW8ueE1pblxuICAgICAgICAgICAgdGhpcy54TWF4ID0gZ2VvQ2FudmFzLmV4dEdlby54TWF4XG4gICAgICAgICAgICB0aGlzLnlNaW4gPSBnZW9DYW52YXMuZXh0R2VvLnlNaW5cbiAgICAgICAgICAgIHRoaXMueU1heCA9IGdlb0NhbnZhcy5leHRHZW8ueU1heFxuXG4gICAgICAgICAgICAvL2J1aWxkIFdNUyBVUkxcbiAgICAgICAgICAgIGNvbnN0IHVybCA9IFtdXG4gICAgICAgICAgICB1cmwucHVzaCh0aGlzLnVybClcbiAgICAgICAgICAgIHVybC5wdXNoKCcmd2lkdGg9JylcbiAgICAgICAgICAgIHVybC5wdXNoKGdlb0NhbnZhcy53KVxuICAgICAgICAgICAgdXJsLnB1c2goJyZoZWlnaHQ9JylcbiAgICAgICAgICAgIHVybC5wdXNoKGdlb0NhbnZhcy5oKVxuICAgICAgICAgICAgLy9iYm94OiB4bWluIHltaW4geG1heCB5bWF4XG4gICAgICAgICAgICB1cmwucHVzaCgnJmJib3g9JylcbiAgICAgICAgICAgIHVybC5wdXNoKGdlb0NhbnZhcy5leHRHZW8ueE1pbilcbiAgICAgICAgICAgIHVybC5wdXNoKCcsJylcbiAgICAgICAgICAgIHVybC5wdXNoKGdlb0NhbnZhcy5leHRHZW8ueU1pbilcbiAgICAgICAgICAgIHVybC5wdXNoKCcsJylcbiAgICAgICAgICAgIHVybC5wdXNoKGdlb0NhbnZhcy5leHRHZW8ueE1heClcbiAgICAgICAgICAgIHVybC5wdXNoKCcsJylcbiAgICAgICAgICAgIHVybC5wdXNoKGdlb0NhbnZhcy5leHRHZW8ueU1heClcblxuICAgICAgICAgICAgY29uc3QgdXJsUyA9IHVybC5qb2luKCcnKVxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyh1cmxTKVxuXG4gICAgICAgICAgICBpZiAoIXRoaXMuaW1nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbWcgPSBuZXcgSW1hZ2UoKVxuICAgICAgICAgICAgICAgIHRoaXMuaW1nLm9ubG9hZCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLnJlZHJhdygpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuaW1nLm9uZXJyb3IgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vY2FzZSB3aGVuIG5vIGltYWdlXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignQ291bGQgbm90IHJldHJpZXZlIFdNUyBiYWNrZ3JvdW5kIGltYWdlIGZyb20nLCB1cmxTKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy9zZXQgVVJMIHRvIGxhdW5jaCB0aGUgZG93bmxvYWRcbiAgICAgICAgICAgIHRoaXMuaW1nLnNyYyA9IHVybFNcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgTGF5ZXIgfSBmcm9tICcuLi9jb3JlL0xheWVyLmpzJ1xuaW1wb3J0IHsganNvbiB9IGZyb20gJ2QzLWZldGNoJ1xuXG4vKipcbiAqIEBtb2R1bGUgbGF5ZXJcbiAqIEBhdXRob3IgSm9zZXBoIERhdmllcywgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIEdlb0pTT05MYXllciBleHRlbmRzIExheWVyIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb3B0c1xuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cylcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvKipcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpcy51cmwgPSBvcHRzLnVybFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIHByZXByb2Nlc3MgdG8gcnVuIG9uIGVhY2ggZmVhdHVyZSBhZnRlciBsb2FkaW5nLlxuICAgICAgICAgKiBJdCBjYW4gYmUgdXNlZCB0byBhcHBseSBzb21lIHNwZWNpZmljIHRyZWF0bWVudCBiZWZvcmUsIGZvcm1hdCB0aGUgbGFiZWwgZGF0YSwgcHJvamVjdCBjb29yZGluYXRlcywgZXRjLlxuICAgICAgICAgKiBSZXR1cm4gZmFsc2UgaWYgdGhlIGxhYmVsIHNob3VsZCBub3QgYmUga2VwdC5cbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG9iamVjdCk6Ym9vbGVhbn0gKi9cbiAgICAgICAgdGhpcy5wcmVwcm9jZXNzID0gb3B0cy5wcmVwcm9jZXNzXG5cbiAgICAgICAgLy9mb3IgcG9pbnRzXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24ob2JqZWN0LG51bWJlcik6c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLnNoYXBlID0gb3B0cy5zaGFwZSB8fCAoKGYsIHopID0+ICdjaXJjbGUnKVxuICAgICAgICAvKipcbiAgICAgICAgICogSW4gcGl4ZWxcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG9iamVjdCxudW1iZXIpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy5zaXplID0gb3B0cy5zaXplIHx8ICgoZiwgeikgPT4gMTApXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24ob2JqZWN0LG51bWJlcik6c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLnN0cm9rZVN0eWxlID0gb3B0cy5zdHJva2VTdHlsZSB8fCAoKGYsIHopID0+ICdyZWQnKVxuICAgICAgICAvKipcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG9iamVjdCxudW1iZXIpOnN0cmluZ30gKi9cbiAgICAgICAgdGhpcy5maWxsU3R5bGUgPSBvcHRzLmZpbGxTdHlsZSB8fCAoKGYsIHopID0+ICdibGFjaycpXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbiBwaXhlbFxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24ob2JqZWN0LG51bWJlcik6bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLmxpbmVXaWR0aCA9IG9wdHMubGluZVdpZHRoIHx8ICgoZiwgeikgPT4gMilcblxuICAgICAgICAvL2ZvciBsaW5lc1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24ob2JqZWN0LG51bWJlcik6c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLmNvbG9yID0gb3B0cy5jb2xvciB8fCAoKGYsIHopID0+ICdncmF5JylcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEluIHBpeGVsXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihvYmplY3QsbnVtYmVyKTpudW1iZXJ9ICovXG4gICAgICAgIHRoaXMud2lkdGggPSBvcHRzLndpZHRoIHx8ICgoZiwgeikgPT4gMilcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihvYmplY3QsbnVtYmVyKTpBcnJheS48bnVtYmVyPnx1bmRlZmluZWR9ICovXG4gICAgICAgIHRoaXMubGluZURhc2ggPSBvcHRzLmxpbmVEYXNoIHx8ICgoZiwgeikgPT4gdW5kZWZpbmVkKVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAdHlwZSB7QXJyYXkuPG9iamVjdD4gfCB1bmRlZmluZWR9ICovXG4gICAgICAgIHRoaXMuZnMgPSB1bmRlZmluZWRcblxuICAgICAgICAvKipcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpcy5sb2FkaW5nU3RhdHVzID0gJ25vdExvYWRlZCdcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEcmF3IHRoZSBsYXllci5cbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvcmUvR2VvQ2FudmFzLmpzXCIpLkdlb0NhbnZhc30gZ2VvQ2FudmFzIFRoZSBjYW52YXMgd2hlcmUgdG8gZHJhdyB0aGUgbGF5ZXIuXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgZHJhdyhnZW9DYW52YXMpIHtcbiAgICAgICAgLy9sb2FkIGRhdGEsIGlmIG5vdCBkb25lIHlldC5cbiAgICAgICAgaWYgKCF0aGlzLmZzKSB7XG4gICAgICAgICAgICB0aGlzLmxvYWQoZ2VvQ2FudmFzLnJlZHJhdylcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgeiA9IGdlb0NhbnZhcy52aWV3LnpcbiAgICAgICAgY29uc3QgY3R4ID0gZ2VvQ2FudmFzLm9mZnNjcmVlbkN0eFxuXG4gICAgICAgIGZvciAoY29uc3QgZiBvZiB0aGlzLmZzKSB7XG4gICAgICAgICAgICBjb25zdCBndCA9IGYuZ2VvbWV0cnkudHlwZVxuXG4gICAgICAgICAgICBpZiAoZ3QgPT0gJ1BvaW50JyB8fCBndCA9PSAnTXVsdGlQb2ludCcpIHtcblxuICAgICAgICAgICAgICAgIC8vZ2V0IHN0eWxlIHBhcmFtZXRlcnMgZm9yIHRoZSBwb2ludCBmZWF0dXJlXG4gICAgICAgICAgICAgICAgY29uc3Qgc2hhcGUgPSB0aGlzLnNoYXBlKGYsIHopXG4gICAgICAgICAgICAgICAgaWYgKCFzaGFwZSB8fCBzaGFwZSA9PSAnbm9uZScpIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgY29uc3Qgc2l6ZSA9IHRoaXMuc2l6ZShmLCB6KSAqIHpcbiAgICAgICAgICAgICAgICBpZiAoIXNpemUpIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgY29uc3Qgc3Ryb2tlU3R5bGUgPSB0aGlzLnN0cm9rZVN0eWxlKGYsIHopXG4gICAgICAgICAgICAgICAgY29uc3QgZmlsbFN0eWxlID0gdGhpcy5maWxsU3R5bGUoZiwgeilcbiAgICAgICAgICAgICAgICBjb25zdCBsaW5lV2lkdGggPSB0aGlzLmxpbmVXaWR0aChmLCB6KSAqIHpcblxuICAgICAgICAgICAgICAgIC8vc2V0IGNhbnZhcyBkcmF3aW5nIHBhcmFtZXRlcnNcbiAgICAgICAgICAgICAgICBpZiAoc3Ryb2tlU3R5bGUpIGN0eC5zdHJva2VTdHlsZSA9IHN0cm9rZVN0eWxlXG4gICAgICAgICAgICAgICAgaWYgKGZpbGxTdHlsZSkgY3R4LmZpbGxTdHlsZSA9IGZpbGxTdHlsZVxuICAgICAgICAgICAgICAgIGlmIChsaW5lV2lkdGgpIGN0eC5saW5lV2lkdGggPSBsaW5lV2lkdGhcblxuICAgICAgICAgICAgICAgIGxldCBjcyA9IGYuZ2VvbWV0cnkuY29vcmRpbmF0ZXNcbiAgICAgICAgICAgICAgICBpZiAoZ3QgPT0gJ1BvaW50JykgY3MgPSBbY3NdXG5cbiAgICAgICAgICAgICAgICBpZiAoc2hhcGUgPT0gJ2NpcmNsZScpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9kcmF3IGNpcmNsZSAtIGZpbGwgYW5kIHN0cm9rZVxuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGMgb2YgY3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgICAgICAgICAgICAgY3R4LmFyYyhjWzBdLCBjWzFdLCBzaXplIC8gMiwgMCwgMiAqIE1hdGguUEksIGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGxTdHlsZSkgY3R4LmZpbGwoKVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cm9rZVN0eWxlICYmIGxpbmVXaWR0aCkgY3R4LnN0cm9rZSgpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNoYXBlID09ICdzcXVhcmUnKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vZHJhdyBzcXVhcmUgLSBmaWxsIGFuZCBzdHJva2VcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBjIG9mIGNzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5yZWN0KGNbMF0gLSBzaXplIC8gMiwgY1sxXSAtIHNpemUgLyAyLCBzaXplLCBzaXplKVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGxTdHlsZSkgY3R4LmZpbGwoKVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cm9rZVN0eWxlICYmIGxpbmVXaWR0aCkgY3R4LnN0cm9rZSgpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdVbmV4cGVjdGVkIHNoYXBlIGZvciBwb2ludCBnZW9qc29uOiAnICsgc2hhcGUpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChndCA9PSAnTGluZVN0cmluZycgfHwgZ3QgPT0gJ011bHRpTGluZVN0cmluZycpIHtcblxuICAgICAgICAgICAgICAgIC8vc2V0IGNvbG9yXG4gICAgICAgICAgICAgICAgY29uc3QgY29sID0gdGhpcy5jb2xvcihmLCB6KVxuICAgICAgICAgICAgICAgIGlmICghY29sIHx8IGNvbCA9PSAnbm9uZScpIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgY3R4LnN0cm9rZVN0eWxlID0gY29sXG5cbiAgICAgICAgICAgICAgICAvL3NldCBsaW5ld2lkdGhcbiAgICAgICAgICAgICAgICBjb25zdCB3UCA9IHRoaXMud2lkdGgoZiwgeilcbiAgICAgICAgICAgICAgICBpZiAoIXdQIHx8IHdQIDwgMCkgY29udGludWVcbiAgICAgICAgICAgICAgICBjdHgubGluZVdpZHRoID0gd1AgKiB6XG5cbiAgICAgICAgICAgICAgICAvL3NldCBsaW5lIGRhc2hcbiAgICAgICAgICAgICAgICBjb25zdCBsZFAgPSB0aGlzLmxpbmVEYXNoKGYsIHopXG4gICAgICAgICAgICAgICAgaWYgKGxkUCkgY3R4LnNldExpbmVEYXNoKGxkUClcblxuICAgICAgICAgICAgICAgIGxldCBjc3MgPSBmLmdlb21ldHJ5LmNvb3JkaW5hdGVzXG4gICAgICAgICAgICAgICAgaWYgKGd0ID09ICdMaW5lU3RyaW5nJykgY3NzID0gW2Nzc11cblxuICAgICAgICAgICAgICAgIC8vZHJhdyBsaW5lc1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgY3Mgb2YgY3NzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjcy5sZW5ndGggPCAyKSBjb250aW51ZVxuICAgICAgICAgICAgICAgICAgICBjdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICAgICAgY3R4Lm1vdmVUbyhjc1swXVswXSwgY3NbMF1bMV0pXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgY3MubGVuZ3RoOyBpKyspIGN0eC5saW5lVG8oY3NbaV1bMF0sIGNzW2ldWzFdKVxuICAgICAgICAgICAgICAgICAgICBjdHguc3Ryb2tlKClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdVbnN1cHBvcnRlZCBnZW9tZXRyeSB0eXBlIGluIEdlb0pTT05MYXllcjogJyArIGd0KVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8uLi5cbiAgICAgICAgY3R4LnNldExpbmVEYXNoKFtdKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvYWQgZGF0YSBmb3IgbGFiZWxzLCBmcm9tIFVSTCB0aGlzLnVybFxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oKTp2b2lkfSBjYWxsYmFja1xuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgYXN5bmMgbG9hZChjYWxsYmFjaykge1xuICAgICAgICBpZiAoIXRoaXMudXJsKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnRmFpbGVkIGxvYWRpbmcgYm91bmRhcmllczogTm8gVVJMIHNwZWNpZmllZC4gJyArIHRoaXMudXJsKVxuICAgICAgICAgICAgdGhpcy5sb2FkaW5nU3RhdHVzID0gJ2ZhaWxlZCdcbiAgICAgICAgICAgIHRoaXMubGFiZWxzID0gW11cbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgLy9jaGVjayBpZiBkYXRhIGFscmVhZHkgbG9hZGVkXG4gICAgICAgIGlmICh0aGlzLmxvYWRpbmdTdGF0dXMgIT0gJ25vdExvYWRlZCcpIHJldHVyblxuXG4gICAgICAgIC8vbG9hZCBkYXRhXG4gICAgICAgIHRoaXMubG9hZGluZ1N0YXR1cyA9ICdsb2FkaW5nJ1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBkYXRhXyA9IGF3YWl0IGpzb24odGhpcy51cmwpXG5cbiAgICAgICAgICAgIC8qKiBAdHlwZSB7IEFycmF5LjxvYmplY3Q+IH0gKi9cbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBkYXRhXy5mZWF0dXJlc1xuXG4gICAgICAgICAgICAvL3ByZXByb2Nlc3MvZmlsdGVyXG4gICAgICAgICAgICBpZiAodGhpcy5wcmVwcm9jZXNzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5mcyA9IFtdXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBjIG9mIGRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYiA9IHRoaXMucHJlcHJvY2VzcyhjKVxuICAgICAgICAgICAgICAgICAgICBpZiAoYiA9PSBmYWxzZSkgY29udGludWVcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mcy5wdXNoKGMpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvL3N0b3JlIGxhYmVsc1xuICAgICAgICAgICAgICAgIHRoaXMuZnMgPSBkYXRhXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMubG9hZGluZ1N0YXR1cyA9ICdsb2FkZWQnXG5cbiAgICAgICAgICAgIC8vcmVkcmF3XG4gICAgICAgICAgICBpZiAoY2FsbGJhY2spIGNhbGxiYWNrKClcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdGYWlsZWQgbG9hZGluZyBib3VuZGFyaWVzIGZyb20gJyArIHRoaXMudXJsKVxuICAgICAgICAgICAgdGhpcy5mcyA9IFtdXG4gICAgICAgICAgICB0aGlzLmxvYWRpbmdTdGF0dXMgPSAnZmFpbGVkJ1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBMYXllciB9IGZyb20gJy4uL2NvcmUvTGF5ZXIuanMnXG5cbi8qKlxuICogQSBsYXllciwgd2hpY2ggc3BlY2lmaWVzIGEgZGF0YXNldCB0byBiZSBzaG93biB3aXRoIHNwZWNpZmllZCBzdHlsZXMuXG4gKlxuICogQG1vZHVsZSBsYXllclxuICogQGF1dGhvciBKb3NlcGggRGF2aWVzLCBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgR3JpZExheWVyIGV4dGVuZHMgTGF5ZXIge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0XCIpLkRhdGFzZXR8aW1wb3J0KFwiLi4vY29yZS9NdWx0aVJlc29sdXRpb25EYXRhc2V0XCIpLk11bHRpUmVzb2x1dGlvbkRhdGFzZXR9IGRhdGFzZXQgVGhlIGRhdGFzZXQgdG8gc2hvdy5cbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoXCIuLi9jb3JlL1N0eWxlXCIpLlN0eWxlPn0gc3R5bGVzIFRoZSBzdHlsZXMsIG9yZGVyZWQgaW4gZHJhd2luZyBvcmRlci5cbiAgICAgKiBAcGFyYW0ge3t2aXNpYmxlPzpmdW5jdGlvbihudW1iZXIpOmJvb2xlYW4sYWxwaGE/OmZ1bmN0aW9uKG51bWJlcik6bnVtYmVyLGJsZW5kT3BlcmF0aW9uPzpmdW5jdGlvbihudW1iZXIpOkdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbixtaW5QaXhlbHNQZXJDZWxsPzpudW1iZXIsY2VsbEluZm9IVE1MPzonbm9uZSd8ZnVuY3Rpb24oaW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0XCIpLkNlbGwpOnN0cmluZ319IG9wdHNcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihkYXRhc2V0LCBzdHlsZXMsIG9wdHMgPSB7fSkge1xuICAgICAgICBzdXBlcihvcHRzKVxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0XCIpLkRhdGFzZXR8aW1wb3J0KFwiLi4vY29yZS9NdWx0aVJlc29sdXRpb25EYXRhc2V0XCIpLk11bHRpUmVzb2x1dGlvbkRhdGFzZXR9ICovXG4gICAgICAgIHRoaXMuZGF0YXNldCA9IGRhdGFzZXRcblxuICAgICAgICAvKiogQHR5cGUge0FycmF5LjxpbXBvcnQoXCIuLi9jb3JlL1N0eWxlXCIpLlN0eWxlPn0gKi9cbiAgICAgICAgdGhpcy5zdHlsZXMgPSBzdHlsZXNcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBwYXJhbWV0ZXIgaXMgdXNlZCB3aGVuIHRoZSBkYXRhc2V0IGlzIGEgTXVsdGlSZXNvbHV0aW9uRGF0YXNldC5cbiAgICAgICAgICogSXQgZGVmaW5lcyB0aGUgbWluaW11bSBudW1iZXIgb2YgcGl4ZWxzIGEgZ3JpZCBjZWxsIHNob3VsZCBoYXZlIHRvIHNlbGVjdCB0aGUgZGF0YXNldCB0byBkaXNwbGF5IGJhc2VkIG9uIGl0cyByZXNvbHV0aW9uLlxuICAgICAgICAgKiBBIGxvdyB2YWx1ZSwgbWVhbnMgdGhhdCB0aGUgbWFwIHdpbGwgYmUgbW9yZSBkZXRhaWxsZWQgKHNtYWxsZXIgY2VsbHMpLlxuICAgICAgICAgKiBBIGhpZ2ggdmFsdWUsIG1lYW5zIHRoYXQgdGhlIG1hcCB3aWxsIGJlIGxlc3MgZGV0YWlsbGVkIChsYXJnZXIgY2VsbHMpLlxuICAgICAgICAgKiBUaGlzIHZhbHVlIHNob3VsZCBiZSBoaWdoZXIgdGhhbiAxLCBvdGhlcndpc2UgaXQgbWVhbnMgYSBncmlkIGNlbGwgaXMgc21hbGxlciB0aGFuIHRoZSBzY3JlZW4gcmVzb2x1dGlvbi5cbiAgICAgICAgICogRm9yIG1vcmUgY29tcGxleCBjZWxsIHJlcHJlc2VudGF0aW9ucyB0aGF0IHJlcXVpcmUgc29tZSBtb3JlIG1hcCBzcGFjZSwgdGhpcyB2YWx1ZSBzaG91bGQgYmUgaGlnaGVyLlxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLm1pblBpeGVsc1BlckNlbGwgPSBvcHRzLm1pblBpeGVsc1BlckNlbGwgfHwgM1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgZnVuY3Rpb24gcmV0dXJuaW5nIGNlbGwgaW5mb3JtYXRpb24gYXMgSFRNTC5cbiAgICAgICAgICogVGhpcyBpcyB0eXBpY2FsbHkgdXNlZCBmb3IgdG9vbHRpcCBpbmZvcm1hdGlvbi5cbiAgICAgICAgICogU2V0IHRvICdub25lJyB0byBkaXNhYmxlIGNlbGwgaW5mby5cbiAgICAgICAgICogQHR5cGUgeydub25lJ3xmdW5jdGlvbihpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXRcIikuQ2VsbCwgbnVtYmVyKTpzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuY2VsbEluZm9IVE1MID0gb3B0cy5jZWxsSW5mb0hUTUwgfHwgR3JpZExheWVyLmRlZmF1bHRDZWxsSW5mb0hUTUxcbiAgICB9XG5cbiAgICAvKiogKi9cbiAgICBkcmF3KGdlb0NhbnZhcywgbGVnZW5kKSB7XG4gICAgICAgIC8vZ2V0IHpvb20gbGV2ZWxcbiAgICAgICAgY29uc3QgeiA9IGdlb0NhbnZhcy52aWV3LnpcbiAgICAgICAgY29uc3QgY3R4ID0gZ2VvQ2FudmFzLm9mZnNjcmVlbkN0eFxuXG4gICAgICAgIC8vZ2V0IGxheWVyIGRhdGFzZXQgY29tcG9uZW50XG4gICAgICAgIC8qKiBAdHlwZSB7aW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5EYXRhc2V0fHVuZGVmaW5lZH0gKi9cbiAgICAgICAgY29uc3QgZHNjID0gdGhpcy5nZXREYXRhc2V0KHopXG4gICAgICAgIGlmICghZHNjKSByZXR1cm5cblxuICAgICAgICAvL2xhdW5jaCBkYXRhIGRvd25sb2FkLCBpZiBuZWNlc3NhcnlcbiAgICAgICAgZHNjLmdldERhdGEoZ2VvQ2FudmFzLmV4dEdlbylcblxuICAgICAgICAvL3VwZGF0ZSBkYXRhc2V0IHZpZXcgY2FjaGVcbiAgICAgICAgZHNjLnVwZGF0ZVZpZXdDYWNoZShnZW9DYW52YXMuZXh0R2VvKVxuXG4gICAgICAgIC8vZHJhdyBjZWxscywgc3R5bGUgYnkgc3R5bGVcbiAgICAgICAgZm9yIChjb25zdCBzIG9mIHRoaXMuc3R5bGVzKSB7XG4gICAgICAgICAgICAvL2NoZWNrIGlmIHN0eWxlIGlzIHZpc2libGVcbiAgICAgICAgICAgIGlmIChzLnZpc2libGUgJiYgIXMudmlzaWJsZSh6KSkgY29udGludWVcblxuICAgICAgICAgICAgLy9zZXQgc3R5bGUgYWxwaGEgYW5kIGJsZW5kIG1vZGVcbiAgICAgICAgICAgIC8vVE9ETzogbXVsdGlwbHkgYnkgbGF5ZXIgYWxwaGEgP1xuICAgICAgICAgICAgY3R4Lmdsb2JhbEFscGhhID0gcy5hbHBoYSA/IHMuYWxwaGEoeikgOiAxLjBcbiAgICAgICAgICAgIGlmIChzLmJsZW5kT3BlcmF0aW9uKSBjdHguZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gcy5ibGVuZE9wZXJhdGlvbih6KVxuXG4gICAgICAgICAgICAvL3NldCBhZmZpbiB0cmFuc2Zvcm0gdG8gZHJhdyB3aXRoIGdlb2dyYXBoaWNhbCBjb29yZGluYXRlc1xuICAgICAgICAgICAgZ2VvQ2FudmFzLnNldENhbnZhc1RyYW5zZm9ybSgpXG5cbiAgICAgICAgICAgIC8vZHJhdyB3aXRoIHN0eWxlXG4gICAgICAgICAgICBzLmRyYXcoZHNjLmdldFZpZXdDYWNoZSgpLCBnZW9DYW52YXMsIGRzYy5nZXRSZXNvbHV0aW9uKCkpXG5cbiAgICAgICAgICAgIC8vZHJhdyBzdHlsZSBmaWx0ZXJcbiAgICAgICAgICAgIGlmIChzLmZpbHRlckNvbG9yKSBzLmRyYXdGaWx0ZXIoZ2VvQ2FudmFzKVxuICAgICAgICB9XG5cbiAgICAgICAgLy9hZGQgbGVnZW5kIGVsZW1lbnRcbiAgICAgICAgaWYgKGxlZ2VuZCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBzIG9mIHRoaXMuc3R5bGVzKSB7XG4gICAgICAgICAgICAgICAgLy9jaGVjayBpZiBzdHlsZSBpcyB2aXNpYmxlXG4gICAgICAgICAgICAgICAgaWYgKHMudmlzaWJsZSAmJiAhcy52aXNpYmxlKHopKSBjb250aW51ZVxuICAgICAgICAgICAgICAgIEdyaWRMYXllci5hZGRMZWdlbmRzKGxlZ2VuZCwgcy5sZWdlbmRzKVxuXG4gICAgICAgICAgICAgICAgLy9jYXNlIGZvciBzdHlsZXMgb2Ygc3R5bGVzLCBsaWtlIGtlcm5lbCBzbW9vdGhpbmdcbiAgICAgICAgICAgICAgICAvL1RPRE8gZG8gYmV0dGVyXG4gICAgICAgICAgICAgICAgaWYgKHNbJ3N0eWxlcyddKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgczIgb2Ygc1snc3R5bGVzJ10pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzMi52aXNpYmxlICYmICFzMi52aXNpYmxlKHopKSBjb250aW51ZVxuICAgICAgICAgICAgICAgICAgICAgICAgR3JpZExheWVyLmFkZExlZ2VuZHMobGVnZW5kLCBzMi5sZWdlbmRzKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBwcml2YXRlICovXG4gICAgc3RhdGljIGFkZExlZ2VuZHMobGVnZW5kQ29tcCwgbGcpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobGcpKSBmb3IgKGNvbnN0IGxnXyBvZiBsZykgdGhpcy5hZGRMZWdlbmRzKGxlZ2VuZENvbXAsIGxnXylcbiAgICAgICAgZWxzZSBsZWdlbmRDb21wLm5vZGUoKS5hcHBlbmQobGcuZGl2Lm5vZGUoKSlcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdGhlIHJlbGV2YW50IGRhdGFzZXQgY29tcG9uZW50IGZvciBhIHNwZWNpZmllZCB6b29tLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHpcbiAgICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0XCIpLkRhdGFzZXR8dW5kZWZpbmVkfVxuICAgICAqICovXG4gICAgZ2V0RGF0YXNldCh6KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFzZXQuZ2V0RGF0YXNldCh6LCB0aGlzLm1pblBpeGVsc1BlckNlbGwpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0L2dldCBzdHlsZSBzdGFjay5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7dW5kZWZpbmVkfGltcG9ydChcIi4uL2NvcmUvU3R5bGVcIikuU3R5bGV8QXJyYXkuPGltcG9ydChcIi4uL2NvcmUvU3R5bGVcIikuU3R5bGU+fSBzdHlsZXNcbiAgICAgKiBAcmV0dXJucyB7IHRoaXMgfCBBcnJheS48aW1wb3J0KFwiLi4vY29yZS9TdHlsZVwiKS5TdHlsZT4gfVxuICAgICAqL1xuICAgIHN0eWxlc18oc3R5bGVzKSB7XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSByZXR1cm4gdGhpcy5zdHlsZXNcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShzdHlsZXMpKSB0aGlzLnN0eWxlcyA9IHN0eWxlc1xuICAgICAgICAgICAgZWxzZSB0aGlzLnN0eWxlcyA9IFtzdHlsZXNdXG4gICAgICAgIGVsc2UgdGhpcy5zdHlsZXMgPSBhcmd1bWVudHNcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZGVmYXVsdCBmdW5jdGlvbiByZXR1cm5pbmcgY2VsbCBpbmZvcm1hdGlvbiBhcyBIVE1MLlxuICAgICAqIFRoaXMgaXMgdHlwaWNhbGx5IHVzZWQgZm9yIHRvb2x0aXAgaW5mb3JtYXRpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvcmUvRGF0YXNldFwiKS5DZWxsfSBjZWxsXG4gICAgICogQHJldHVybnMge3N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZGVmYXVsdENlbGxJbmZvSFRNTChjZWxsKSB7XG4gICAgICAgIGNvbnN0IGJ1ZiA9IFtdXG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGNlbGwpKSB7XG4gICAgICAgICAgICBpZiAoa2V5ID09PSAneCcpIGNvbnRpbnVlXG4gICAgICAgICAgICBpZiAoa2V5ID09PSAneScpIGNvbnRpbnVlXG4gICAgICAgICAgICBidWYucHVzaCgnPGI+Jywga2V5LCAnPC9iPicsICcgOiAnLCBjZWxsW2tleV0sICc8YnI+JylcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnVmLmpvaW4oJycpXG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBMYXllciB9IGZyb20gJy4uL2NvcmUvTGF5ZXIuanMnXG5pbXBvcnQgeyBjc3YgfSBmcm9tICdkMy1mZXRjaCdcblxuLyoqIEEgbGFiZWwuIFRoZSBuYW1lIGlzIHRoZSB0ZXh0IHRvIHNob3cuICh4LHkpIGFyZSB0aGUgY29vcmRpbmF0ZXMgaW4gdGhlIHNhbWUgQ1JTIGFzIHRoZSBncmlkLlxuICogQHR5cGVkZWYge3tuYW1lOiBzdHJpbmcsIHg6bnVtYmVyLCB5Om51bWJlciB9fSBMYWJlbCAqL1xuXG4vKipcbiAqIEEgKGdlbmVyaWMpIGxheWVyIGZvciBwbGFjZW5hbWUgbGFiZWxzLCB0byBiZSBzaG93biBvbiB0b3Agb2YgdGhlIGdyaWQgbGF5ZXJzLlxuICogVGhlIGlucHV0IGlzIGEgQ1NWIGZpbGUgd2l0aCB0aGUgcG9zaXRpb24gKHgsIHkpIG9mIHRoZSBsYWJlbHMgYW5kIG5hbWUgKyBzb21lIG90aGVyIGluZm8gb24gdGhlIGxhYmVsIGltcG9ydGFuY2UuXG4gKiBJZiB0aGUgbGFiZWwgZGF0YSBpcyBub3QgaW4gdGhlIGV4cGVjdGVkIGZvcm1hdCBvciBpbiB0aGUgc2FtZSBDUlMgYXMgdGhlIGdyaWQsIGl0IGNhbiBiZSBjb3JyZWN0ZWQgd2l0aCB0aGUgXCJwcmVwcm9jZXNzXCIgZnVuY3Rpb24uXG4gKiBUaGUgc2VsZWN0aW9uIG9mIHRoZSBsYWJlbCwgdGhlaXIgc3R5bGUgKGZvbnQsIHdlaWdodCwgZXRjLikgYW5kIGNvbG9yIGNhbiBiZSBzcGVjaWZpZWQgZGVwZW5kaW5nIG9uIHRoZWlyIGltcG9ydGFuY2UgYW5kIHRoZSB6b29tIGxldmVsLlxuICpcbiAqIEBtb2R1bGUgbGF5ZXJcbiAqIEBhdXRob3IgSm9zZXBoIERhdmllcywgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIExhYmVsTGF5ZXIgZXh0ZW5kcyBMYXllciB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtvYmplY3R9IG9wdHNcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBVUkwgb2YgdGhlIGxhYmVsIGRhdGEsIGFzIENTViBmaWxlLlxuICAgICAgICAgKiBUaGUgZmlsZSBzaG91bGQgY29udGFpbiB0aGUgaW5mb3JtYXRpb24gZm9yIGVhY2ggbGFiZWwgc3VjaCBhcyB0aGUgdGV4dCwgdGhlIHBvc2l0aW9uIGFuZCBvdGhlciBpbmZvcm1hdGlvbiBmb3IgdGhlIGRpc3BsYXkgb2YgdGhlIGxhYmVsIGFjY29yZGluZyB0byB0aGUgem9vbSBsZXZlbC5cbiAgICAgICAgICogSWYgbmVjZXNzYXJ5LCB0aGlzIGRhdGEgY2FuIGJlIHJlZm9ybWF0ZWQgd2l0aCB0aGUgJ3ByZXByb2Nlc3MnIHBhcmFtZXRlci5cbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpcy51cmwgPSBvcHRzLnVybFxuXG4gICAgICAgIC8qKiBTcGVjaWZ5IGlmIGFuZCBob3cgYSBsYWJlbCBzaG91bGQgYmUgZHJhd24sIGRlcGVuZGluZyBvbiBpdHMgaW1wb3J0YW5jZSBhbmQgdGhlIHpvb20gbGV2ZWwuXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihMYWJlbCxudW1iZXIpOnN0cmluZ30gKi9cbiAgICAgICAgdGhpcy5zdHlsZSA9IG9wdHMuc3R5bGUgfHwgKCgpID0+ICcxLjJlbSBBcmlhbCcpXG5cbiAgICAgICAgLyoqIFNwZWNpZnkgdGhlIGxhYmVsIGNvbG9yLCBkZXBlbmRpbmcgb24gaXRzIGltcG9ydGFuY2UgYW5kIHRoZSB6b29tIGxldmVsLlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oTGFiZWwsbnVtYmVyKTpzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuY29sb3IgPSBvcHRzLmNvbG9yIHx8IChvcHRzLmRhcmsgPyAoKSA9PiAnd2hpdGUnIDogKCkgPT4gJ2JsYWNrJylcblxuICAgICAgICAvKiogU3BlY2lmeSB0aGUgbGFiZWwgaGFsbyBjb2xvciwgZGVwZW5kaW5nIG9uIGl0cyBpbXBvcnRhbmNlIGFuZCB0aGUgem9vbSBsZXZlbC5cbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKExhYmVsLG51bWJlcik6c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLmhhbG9Db2xvciA9IG9wdHMuaGFsb0NvbG9yIHx8IChvcHRzLmRhcmsgPyAoKSA9PiAnYmxhY2snIDogKCkgPT4gJ3doaXRlJylcblxuICAgICAgICAvKiogU3BlY2lmeSB0aGUgbGFiZWwgaGFsbyB3aWR0aCwgZGVwZW5kaW5nIG9uIGl0cyBpbXBvcnRhbmNlIGFuZCB0aGUgem9vbSBsZXZlbC5cbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKExhYmVsLG51bWJlcik6bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLmhhbG9XaWR0aCA9IG9wdHMuaGFsb1dpZHRoIHx8ICgoKSA9PiAyLjUpXG5cbiAgICAgICAgLyoqIFRoZSBhbmNob3Igd2hlcmUgdG8gZHJhdyB0aGUgdGV4dCwgZnJvbSBsYWJlbCBwb3NpdGlvbi4gU2VlIEhUTUwtY2FudmFzIHRleHRBbGlnbiBwcm9wZXJ0eS5cbiAgICAgICAgICogXCJsZWZ0XCIgfHwgXCJyaWdodFwiIHx8IFwiY2VudGVyXCIgfHwgXCJzdGFydFwiIHx8IFwiZW5kXCJcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHR5cGUge0NhbnZhc1RleHRBbGlnbn0gKi9cbiAgICAgICAgdGhpcy50ZXh0QWxpZ24gPSBvcHRzLnRleHRBbGlnbiB8fCAnc3RhcnQnXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEB0eXBlIHtBcnJheS48bnVtYmVyPn0gKi9cbiAgICAgICAgdGhpcy5vZmZzZXRQaXggPSBvcHRzLm9mZnNldFBpeCB8fCBbNSwgNV1cblxuICAgICAgICAvKipcbiAgICAgICAgICogQSBwcmVwcm9jZXNzIHRvIHJ1biBvbiBlYWNoIGxhYmVsIGFmdGVyIGxvYWRpbmcuXG4gICAgICAgICAqIEl0IGNhbiBiZSB1c2VkIHRvIGFwcGx5IHNvbWUgc3BlY2lmaWMgdHJlYXRtZW50IGJlZm9yZSwgZm9ybWF0IHRoZSBsYWJlbCBkYXRhLCBwcm9qZWN0IGNvb3JkaW5hdGVzLCBldGMuXG4gICAgICAgICAqIFJldHVybiBmYWxzZSBpZiB0aGUgbGFiZWwgc2hvdWxkIG5vdCBiZSBrZXB0LlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oTGFiZWwpOmJvb2xlYW59ICovXG4gICAgICAgIHRoaXMucHJlcHJvY2VzcyA9IG9wdHMucHJlcHJvY2Vzc1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAdHlwZSB7QXJyYXkuPExhYmVsPiB8IHVuZGVmaW5lZH0gKi9cbiAgICAgICAgdGhpcy5sYWJlbHMgPSB1bmRlZmluZWRcblxuICAgICAgICAvKipcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpcy5sb2FkaW5nU3RhdHVzID0gJ25vdExvYWRlZCdcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEcmF3IHRoZSBsYWJlbCBsYXllci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29yZS9HZW9DYW52YXNcIikuR2VvQ2FudmFzfSBnZW9DYW52YXMgVGhlIGNhbnZhcyB3aGVyZSB0byBkcmF3IHRoZSBsYXllci5cbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICBkcmF3KGdlb0NhbnZhcykge1xuICAgICAgICAvL2xvYWQgbGFiZWxzLCBpZiBub3QgZG9uZSB5ZXQuXG4gICAgICAgIGlmICghdGhpcy5sYWJlbHMpIHtcbiAgICAgICAgICAgIHRoaXMubG9hZChnZW9DYW52YXMucmVkcmF3KVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICAvL1xuICAgICAgICBjb25zdCB6ID0gZ2VvQ2FudmFzLnZpZXcuelxuICAgICAgICBjb25zdCBjdHggPSBnZW9DYW52YXMub2Zmc2NyZWVuQ3R4XG5cbiAgICAgICAgLy90ZXh0IGFsaWduXG4gICAgICAgIGN0eC50ZXh0QWxpZ24gPSB0aGlzLnRleHRBbGlnbiB8fCAnc3RhcnQnXG5cbiAgICAgICAgLy9saW5lIGpvaW4gYW5kIGNhcFxuICAgICAgICBjdHgubGluZUpvaW4gPSAnYmV2ZWwnIC8vfHwgXCJyb3VuZFwiIHx8IFwibWl0ZXJcIjtcbiAgICAgICAgY3R4LmxpbmVDYXAgPSAnYnV0dCcgLy98fCBcInJvdW5kXCIgfHwgXCJzcXVhcmVcIjtcblxuICAgICAgICAvL2RyYXcgaW4gcGl4IGNvb3JkaW5hdGVzXG4gICAgICAgIGdlb0NhbnZhcy5pbml0Q2FudmFzVHJhbnNmb3JtKClcblxuICAgICAgICAvL2RyYXcgbGFiZWxzLCBvbmUgYnkgb25lXG4gICAgICAgIGZvciAoY29uc3QgbGIgb2YgdGhpcy5sYWJlbHMpIHtcbiAgICAgICAgICAgIC8vZ2V0IGxhYmVsIHN0eWxlXG4gICAgICAgICAgICBjb25zdCBzdCA9IHRoaXMuc3R5bGUobGIsIHopXG4gICAgICAgICAgICBpZiAoIXN0KSBjb250aW51ZVxuICAgICAgICAgICAgY3R4LmZvbnQgPSBzdFxuXG4gICAgICAgICAgICAvL2NoZWNrIGxhYmVsIHdpdGhpbiB0aGUgdmlldywgdG8gYmUgZHJhd25cbiAgICAgICAgICAgIGlmICghZ2VvQ2FudmFzLnRvRHJhdyhsYikpIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIC8vcG9zaXRpb25cbiAgICAgICAgICAgIGNvbnN0IHhQID0gZ2VvQ2FudmFzLmdlb1RvUGl4WChsYi54KSArIHRoaXMub2Zmc2V0UGl4WzBdXG4gICAgICAgICAgICBjb25zdCB5UCA9IGdlb0NhbnZhcy5nZW9Ub1BpeFkobGIueSkgLSB0aGlzLm9mZnNldFBpeFsxXVxuXG4gICAgICAgICAgICAvL2xhYmVsIHN0cm9rZSwgZm9yIHRoZSBoYWxvXG4gICAgICAgICAgICBpZiAodGhpcy5oYWxvQ29sb3IgJiYgdGhpcy5oYWxvV2lkdGgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBoYyA9IHRoaXMuaGFsb0NvbG9yKGxiLCB6KVxuICAgICAgICAgICAgICAgIGNvbnN0IGh3ID0gdGhpcy5oYWxvV2lkdGgobGIsIHopXG4gICAgICAgICAgICAgICAgaWYgKGhjICYmIGh3ICYmIGh3ID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBjdHguc3Ryb2tlU3R5bGUgPSBoY1xuICAgICAgICAgICAgICAgICAgICBjdHgubGluZVdpZHRoID0gaHdcbiAgICAgICAgICAgICAgICAgICAgY3R4LnN0cm9rZVRleHQobGIubmFtZSwgeFAsIHlQKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy9sYWJlbCBmaWxsXG4gICAgICAgICAgICBpZiAodGhpcy5jb2xvcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbCA9IHRoaXMuY29sb3IobGIsIHopXG4gICAgICAgICAgICAgICAgaWYgKGNvbCkge1xuICAgICAgICAgICAgICAgICAgICBjdHguZmlsbFN0eWxlID0gY29sXG4gICAgICAgICAgICAgICAgICAgIGN0eC5maWxsVGV4dChsYi5uYW1lLCB4UCwgeVApXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZCBkYXRhIGZvciBsYWJlbHMsIGZyb20gVVJMIHRoaXMudXJsXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbigpOnZvaWR9IGNhbGxiYWNrXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBhc3luYyBsb2FkKGNhbGxiYWNrKSB7XG4gICAgICAgIGlmICghdGhpcy51cmwpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdGYWlsZWQgbG9hZGluZyBsYWJlbHM6IE5vIFVSTCBzcGVjaWZpZWQuICcgKyB0aGlzLnVybClcbiAgICAgICAgICAgIHRoaXMubG9hZGluZ1N0YXR1cyA9ICdmYWlsZWQnXG4gICAgICAgICAgICB0aGlzLmxhYmVscyA9IFtdXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIC8vY2hlY2sgaWYgZGF0YSBhbHJlYWR5IGxvYWRlZFxuICAgICAgICBpZiAodGhpcy5sb2FkaW5nU3RhdHVzICE9ICdub3RMb2FkZWQnKSByZXR1cm5cblxuICAgICAgICAvL2xvYWQgZGF0YVxuICAgICAgICB0aGlzLmxvYWRpbmdTdGF0dXMgPSAnbG9hZGluZydcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLyoqIEB0eXBlIHsgQXJyYXkuPExhYmVsPiB9ICovXG4gICAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgY3N2KHRoaXMudXJsKVxuXG4gICAgICAgICAgICAvL3ByZXByb2Nlc3MvZmlsdGVyXG4gICAgICAgICAgICBpZiAodGhpcy5wcmVwcm9jZXNzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sYWJlbHMgPSBbXVxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYyBvZiBkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGIgPSB0aGlzLnByZXByb2Nlc3MoYylcbiAgICAgICAgICAgICAgICAgICAgaWYgKGIgPT0gZmFsc2UpIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGFiZWxzLnB1c2goYylcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vc3RvcmUgbGFiZWxzXG4gICAgICAgICAgICAgICAgdGhpcy5sYWJlbHMgPSBkYXRhXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMubG9hZGluZ1N0YXR1cyA9ICdsb2FkZWQnXG5cbiAgICAgICAgICAgIC8vcmVkcmF3XG4gICAgICAgICAgICBpZiAoY2FsbGJhY2spIGNhbGxiYWNrKClcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdGYWlsZWQgbG9hZGluZyBsYWJlbHMgZnJvbSAnICsgdGhpcy51cmwpXG4gICAgICAgICAgICB0aGlzLmxhYmVscyA9IFtdXG4gICAgICAgICAgICB0aGlzLmxvYWRpbmdTdGF0dXMgPSAnZmFpbGVkJ1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBMZWdlbmQgfSBmcm9tICcuLi9jb3JlL0xlZ2VuZC5qcydcblxuLyoqXG4gKiBBIGxlZ2VuZCBlbGVtZW50IGZvciBjb2xvciBjYXRlZ3Jvcmllcy5cbiAqXG4gKiBAbW9kdWxlIGxlZ2VuZFxuICogQGF1dGhvciBKb3NlcGggRGF2aWVzLCBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgQ29sb3JDYXRlZ29yeUxlZ2VuZCBleHRlbmRzIExlZ2VuZCB7XG4gICAgLyoqIEBwYXJhbSB7T2JqZWN0fSBvcHRzICovXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKVxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgICAgIC8vY29sL2NhdGVnb3JpZXMgYXJyYXksIGluIGRpc3BsYXkgb3JkZXJcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEB0eXBlIHtBcnJheS48W3N0cmluZyxzdHJpbmddPn0gKi9cbiAgICAgICAgdGhpcy5jb2xvckxhYmVsID0gb3B0cy5jb2xvckxhYmVsIHx8IFtbJ2dyYXknLCAnLSddXVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAdHlwZSB7aW1wb3J0KFwiLi4vY29yZS9TdHlsZS5qc1wiKS5TaGFwZX0gKi9cbiAgICAgICAgdGhpcy5zaGFwZSA9IG9wdHMuc2hhcGUgfHwgJ2NpcmNsZSdcbiAgICAgICAgdGhpcy5kaW1lbnNpb24gPSBvcHRzLmRpbWVuc2lvbiB8fCB7IHI6IDggfVxuICAgICAgICB0aGlzLnN0cm9rZUNvbG9yID0gb3B0cy5zdHJva2VDb2xvciB8fCAnZ3JheSdcbiAgICAgICAgdGhpcy5zdHJva2VXaWR0aCA9IG9wdHMuc3Ryb2tlV2lkdGggfHwgMVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqL1xuICAgIHVwZGF0ZSgpIHtcbiAgICAgICAgLy9jbGVhclxuICAgICAgICB0aGlzLmRpdi5zZWxlY3RBbGwoJyonKS5yZW1vdmUoKVxuXG4gICAgICAgIC8vdGl0bGVcbiAgICAgICAgdGhpcy5tYWtlVGl0bGUoKVxuXG4gICAgICAgIC8vY2F0ZWdvcmllc1xuICAgICAgICBjb25zdCBuYiA9IHRoaXMuY29sb3JMYWJlbC5sZW5ndGhcbiAgICAgICAgaWYgKG5iID09IDApIHJldHVyblxuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmI7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgY2F0ID0gdGhpcy5jb2xvckxhYmVsW2ldXG5cbiAgICAgICAgICAgIC8vbWFrZSBkaXYgZm9yIGNhdGVnb3J5XG4gICAgICAgICAgICBjb25zdCBkID0gdGhpcy5kaXYuYXBwZW5kKCdkaXYnKVxuICAgICAgICAgICAgLy90byBlbmFibGUgdmVydGljYWwgY2VudGVyaW5nXG4gICAgICAgICAgICAvLy5zdHlsZShcInBvc2l0aW9uXCIsIFwicmVsYXRpdmVcIilcblxuICAgICAgICAgICAgY29uc3Qgc3cgPSB0aGlzLnN0cm9rZVdpZHRoXG5cbiAgICAgICAgICAgIC8vZHJhdyBncmFwaGljIGVsZW1lbnQ6IGJveCAvIGNpcmNsZVxuICAgICAgICAgICAgaWYgKHRoaXMuc2hhcGUgPT09ICdzcXVhcmUnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaCA9IHRoaXMuZGltZW5zaW9uLmggfHwgMTVcbiAgICAgICAgICAgICAgICBjb25zdCB3ID0gdGhpcy5kaW1lbnNpb24udyB8fCAyMFxuICAgICAgICAgICAgICAgIGQuYXBwZW5kKCdkaXYnKVxuICAgICAgICAgICAgICAgICAgICAuc3R5bGUoJ2Rpc3BsYXknLCAnaW5saW5lJylcblxuICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCdzdmcnKVxuICAgICAgICAgICAgICAgICAgICAuYXR0cignd2lkdGgnLCB3ICsgMiAqIHN3KVxuICAgICAgICAgICAgICAgICAgICAuYXR0cignaGVpZ2h0JywgaCArIDIgKiBzdylcblxuICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCdyZWN0JylcbiAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ3gnLCBzdylcbiAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ3knLCBzdylcbiAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ3dpZHRoJywgdylcbiAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ2hlaWdodCcsIGgpXG4gICAgICAgICAgICAgICAgICAgIC5zdHlsZSgnZmlsbCcsIGNhdFswXSlcbiAgICAgICAgICAgICAgICAgICAgLnN0eWxlKCdzdHJva2UnLCB0aGlzLnN0cm9rZUNvbG9yKVxuICAgICAgICAgICAgICAgICAgICAuc3R5bGUoJ3N0cm9rZS13aWR0aCcsIHRoaXMuc3Ryb2tlV2lkdGgpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2hhcGUgPT09ICdjaXJjbGUnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgciA9IHRoaXMuZGltZW5zaW9uLnIgfHwgOFxuICAgICAgICAgICAgICAgIGNvbnN0IGggPSAyICogciArIDIgKiBzd1xuICAgICAgICAgICAgICAgIGQuYXBwZW5kKCdkaXYnKVxuICAgICAgICAgICAgICAgICAgICAuc3R5bGUoJ2Rpc3BsYXknLCAnaW5saW5lJylcblxuICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCdzdmcnKVxuICAgICAgICAgICAgICAgICAgICAuYXR0cignd2lkdGgnLCBoKVxuICAgICAgICAgICAgICAgICAgICAuYXR0cignaGVpZ2h0JywgaClcblxuICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCdjaXJjbGUnKVxuICAgICAgICAgICAgICAgICAgICAuYXR0cignY3gnLCByICsgc3cpXG4gICAgICAgICAgICAgICAgICAgIC5hdHRyKCdjeScsIHIgKyBzdylcbiAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ3InLCByKVxuICAgICAgICAgICAgICAgICAgICAuc3R5bGUoJ2ZpbGwnLCBjYXRbMF0pXG4gICAgICAgICAgICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlJywgdGhpcy5zdHJva2VDb2xvcilcbiAgICAgICAgICAgICAgICAgICAgLnN0eWxlKCdzdHJva2Utd2lkdGgnLCB0aGlzLnN0cm9rZVdpZHRoKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgc2hhcGU6JyArIHRoaXMuc2hhcGUpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vd3JpdGUgbGFiZWwgdGV4dFxuICAgICAgICAgICAgZC5hcHBlbmQoJ2RpdicpXG4gICAgICAgICAgICAgICAgLy9zaG93IG9uIHJpZ2h0IG9mIGdyYXBoaWNcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ2Rpc3BsYXknLCAnaW5saW5lJylcblxuICAgICAgICAgICAgICAgIC8vY2VudGVyIHZlcnRpY2FsbHlcbiAgICAgICAgICAgICAgICAvLy5zdHlsZShcInBvc2l0aW9uXCIsIFwiYWJzb2x1dGVcIikuc3R5bGUoXCJ0b3BcIiwgXCIwXCIpLnN0eWxlKFwiYm90dG9tXCIsIFwiMFwiKVxuXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdwYWRkaW5nLWxlZnQnLCAnNXB4JylcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsIHRoaXMubGFiZWxGb250U2l6ZSlcbiAgICAgICAgICAgICAgICAudGV4dChjYXRbMV0pXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IExlZ2VuZCB9IGZyb20gJy4uL2NvcmUvTGVnZW5kLmpzJ1xuXG4vKipcbiAqIEEgbGVnZW5kIGVsZW1lbnQgZm9yIGRpc2NyZXRlIGNvbG9yIHN0eWxlLlxuICogSW5zcGlyYXRpb246IGh0dHBzOi8vb2JzZXJ2YWJsZWhxLmNvbS9AZDMvY29sb3ItbGVnZW5kXG4gKlxuICogQG1vZHVsZSBsZWdlbmRcbiAqIEBhdXRob3IgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIENvbG9yRGlzY3JldGVMZWdlbmQgZXh0ZW5kcyBMZWdlbmQge1xuICAgIC8qKiBAcGFyYW0ge09iamVjdH0gb3B0cyAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cylcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvKiogQHByaXZhdGUgQHR5cGUge2Z1bmN0aW9uKGltcG9ydCgnLi4vY29yZS9TdHlsZScpLlZpZXdTY2FsZSk6QXJyYXkuPHN0cmluZz59ICovXG4gICAgICAgIHRoaXMuY29sb3JzID0gb3B0cy5jb2xvcnNcbiAgICAgICAgLyoqIEBwcml2YXRlIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvU3R5bGUnKS5WaWV3U2NhbGUpOkFycmF5LjxudW1iZXI+fSAqL1xuICAgICAgICB0aGlzLmJyZWFrcyA9IG9wdHMuYnJlYWtzXG5cbiAgICAgICAgdGhpcy53aWR0aCA9IG9wdHMud2lkdGggfHwgMzAwXG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gb3B0cy5oZWlnaHQgfHwgMTVcblxuICAgICAgICB0aGlzLnRpY2tTaXplID0gb3B0cy50aWNrU2l6ZSB8fCAzXG5cbiAgICAgICAgLy9sYWJlbFxuICAgICAgICB0aGlzLmludmVydCA9IG9wdHMuaW52ZXJ0XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHt7dmlld1NjYWxlOmltcG9ydCgnLi4vY29yZS9TdHlsZScpLlZpZXdTY2FsZX0gfSBvcHRzXG4gICAgICovXG4gICAgdXBkYXRlKG9wdHMpIHtcbiAgICAgICAgLy9jbGVhclxuICAgICAgICB0aGlzLmRpdi5zZWxlY3RBbGwoJyonKS5yZW1vdmUoKVxuXG4gICAgICAgIC8vdGl0bGVcbiAgICAgICAgdGhpcy5tYWtlVGl0bGUoKVxuXG4gICAgICAgIC8vZ2V0IGNvbG9ycyBhbmQgYnJlYWtzXG4gICAgICAgIGNvbnN0IGNvbG9ycyA9IHRoaXMuY29sb3JzKG9wdHMudmlld1NjYWxlKVxuICAgICAgICBjb25zdCBicmVha3MgPSB0aGlzLmJyZWFrcyhvcHRzLnZpZXdTY2FsZSlcbiAgICAgICAgaWYgKCFicmVha3MpIHJldHVyblxuXG4gICAgICAgIC8vY2xhc3Nlc1xuICAgICAgICBjb25zdCBuYiA9IGNvbG9ycy5sZW5ndGhcbiAgICAgICAgaWYgKG5iID09IDApIHJldHVyblxuICAgICAgICBjb25zdCB3ID0gdGhpcy53aWR0aCAvIG5iXG5cbiAgICAgICAgLy9tYWtlIHN2ZyBlbGVtZW50XG4gICAgICAgIGNvbnN0IHN2ZyA9IHRoaXMuZGl2XG4gICAgICAgICAgICAuYXBwZW5kKCdzdmcnKVxuICAgICAgICAgICAgLmF0dHIoJ3dpZHRoJywgdGhpcy53aWR0aClcbiAgICAgICAgICAgIC5hdHRyKCdoZWlnaHQnLCB0aGlzLmhlaWdodCArIHRoaXMudGlja1NpemUgKyAyICsgMTApXG5cbiAgICAgICAgLy9kcmF3IGdyYXBoaWMgZWxlbWVudHNcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYjsgaSsrKSB7XG4gICAgICAgICAgICBzdmcuYXBwZW5kKCdyZWN0JylcbiAgICAgICAgICAgICAgICAuYXR0cigneCcsIGkgKiB3KVxuICAgICAgICAgICAgICAgIC5hdHRyKCd5JywgMClcbiAgICAgICAgICAgICAgICAuYXR0cignd2lkdGgnLCB3KVxuICAgICAgICAgICAgICAgIC5hdHRyKCdoZWlnaHQnLCB0aGlzLmhlaWdodClcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ2ZpbGwnLCBjb2xvcnNbaV0pXG4gICAgICAgIH1cblxuICAgICAgICAvL3RpY2sgbGluZVxuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IG5iOyBpKyspIHtcbiAgICAgICAgICAgIHN2Zy5hcHBlbmQoJ2xpbmUnKVxuICAgICAgICAgICAgICAgIC5hdHRyKCd4MScsIHcgKiBpKVxuICAgICAgICAgICAgICAgIC5hdHRyKCd5MScsIDApXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3gyJywgdyAqIGkpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3kyJywgdGhpcy5oZWlnaHQgKyB0aGlzLnRpY2tTaXplKVxuICAgICAgICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlJywgJ2JsYWNrJylcbiAgICAgICAgfVxuXG4gICAgICAgIC8vbGFiZWxzXG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgbmI7IGkrKykge1xuICAgICAgICAgICAgbGV0IGxhYmVsID0gYnJlYWtzW2kgLSAxXVxuICAgICAgICAgICAgaWYgKGlzTmFOKGxhYmVsKSB8fCBsYWJlbCA9PSB1bmRlZmluZWQpIGNvbnRpbnVlXG4gICAgICAgICAgICBpZiAodGhpcy5sYWJlbEZvcm1hdCkgbGFiZWwgPSB0aGlzLmxhYmVsRm9ybWF0KGxhYmVsLCBpKVxuXG4gICAgICAgICAgICAvL2xhYmVsXG4gICAgICAgICAgICBzdmcuYXBwZW5kKCd0ZXh0JylcbiAgICAgICAgICAgICAgICAuYXR0cignaWQnLCAndGlja2xhYmVsXycgKyBpKVxuICAgICAgICAgICAgICAgIC5hdHRyKCd4JywgdyAqIGkpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3knLCB0aGlzLmhlaWdodCArIHRoaXMudGlja1NpemUgKyAyKVxuICAgICAgICAgICAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgdGhpcy5sYWJlbEZvbnRTaXplKVxuICAgICAgICAgICAgICAgIC8vLnN0eWxlKFwiZm9udC13ZWlnaHRcIiwgXCJib2xkXCIpXG4gICAgICAgICAgICAgICAgLy8uc3R5bGUoXCJmb250LWZhbWlseVwiLCBcIkFyaWFsXCIpXG4gICAgICAgICAgICAgICAgLnN0eWxlKCd0ZXh0LWFuY2hvcicsICdtaWRkbGUnKVxuICAgICAgICAgICAgICAgIC5zdHlsZSgnYWxpZ25tZW50LWJhc2VsaW5lJywgJ3RvcCcpXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdkb21pbmFudC1iYXNlbGluZScsICdoYW5naW5nJylcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ3BvaW50ZXItZXZlbnRzJywgJ25vbmUnKVxuICAgICAgICAgICAgICAgIC50ZXh0KGxhYmVsKVxuICAgICAgICB9XG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBMZWdlbmQgfSBmcm9tICcuLi9jb3JlL0xlZ2VuZC5qcydcblxuLyoqXG4gKiBBIGxlZ2VuZCBlbGVtZW50IGZvciBjb250aW51b3VzIGNvbG9yIHN0eWxlLlxuICogSW5zcGlyYXRpb246IGh0dHBzOi8vb2JzZXJ2YWJsZWhxLmNvbS9AZDMvY29sb3ItbGVnZW5kXG4gKlxuICogQG1vZHVsZSBsZWdlbmRcbiAqIEBhdXRob3IgSm9zZXBoIERhdmllcywgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIENvbG9yTGVnZW5kIGV4dGVuZHMgTGVnZW5kIHtcbiAgICAvKiogQHBhcmFtIHtPYmplY3R9IG9wdHMgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLy9hIGZ1bmN0aW9uIFswLDFdLT5jb2xvciBmb3IgY29udGludW91cyBjb2xvcnMuXG4gICAgICAgIC8vaXQgY2FuIHRha2UgYXMgc2Vjb25kIGFyZ3VtZW50IHRoZSB2aWV3c2NhbGUuXG4gICAgICAgIHRoaXMuY29sb3JTY2FsZSA9IG9wdHMuY29sb3JTY2FsZVxuXG4gICAgICAgIC8vZnVuY3Rpb24gKHRbMCwxXSkgLT4gdmFsdWUgKGZvciBsYWJlbCB0ZXh0KVxuICAgICAgICAvL2l0IGNhbiB0YWtlIGFzIHNlY29uZCBhcmd1bWVudCB0aGUgdmlld3NjYWxlLlxuICAgICAgICB0aGlzLnRleHRTY2FsZSA9IG9wdHMudGV4dFNjYWxlIHx8ICgodCkgPT4gdClcblxuICAgICAgICB0aGlzLm1hcmdpbiA9IG9wdHMubWFyZ2luIHx8IDVcblxuICAgICAgICAvL3JlcGxhY2Ugd2l0aCBsYWJlbHMgP1xuICAgICAgICB0aGlzLnRpY2tTaXplID0gb3B0cy50aWNrU2l6ZSB8fCA2XG4gICAgICAgIHRoaXMudGlja3MgPSBvcHRzLnRpY2tzIHx8IE1hdGguZmxvb3IodGhpcy53aWR0aCAvIDUwKVxuICAgICAgICB0aGlzLnRpY2tGb3JtYXQgPSBvcHRzLnRpY2tGb3JtYXRcbiAgICAgICAgdGhpcy50aWNrVW5pdCA9IG9wdHMudGlja1VuaXRcblxuICAgICAgICB0aGlzLmZvbnRTaXplID0gb3B0cy5mb250U2l6ZSB8fCAnMC44ZW0nXG4gICAgICAgIHRoaXMuaW52ZXJ0ID0gb3B0cy5pbnZlcnRcblxuICAgICAgICB0aGlzLndpZHRoID0gb3B0cy53aWR0aCB8fCAzMDBcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBvcHRzLmhlaWdodCB8fCAxNVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7e3ZpZXdTY2FsZTppbXBvcnQoJy4uL2NvcmUvU3R5bGUnKS5WaWV3U2NhbGV9IH0gb3B0c1xuICAgICAqL1xuICAgIHVwZGF0ZShvcHRzKSB7XG4gICAgICAgIC8vY2xlYXJcbiAgICAgICAgdGhpcy5kaXYuc2VsZWN0QWxsKCcqJykucmVtb3ZlKClcblxuICAgICAgICAvL3RpdGxlXG4gICAgICAgIHRoaXMubWFrZVRpdGxlKClcblxuICAgICAgICBjb25zdCBzdmdXID0gdGhpcy53aWR0aCArIDIgKiB0aGlzLm1hcmdpblxuICAgICAgICBjb25zdCBzdmdIID0gdGhpcy5oZWlnaHQgKyB0aGlzLm1hcmdpbiArIHRoaXMudGlja1NpemUgKyAxMFxuICAgICAgICBjb25zdCBzdmcgPSB0aGlzLmRpdi5hcHBlbmQoJ3N2ZycpLmF0dHIoJ3dpZHRoJywgc3ZnVykuYXR0cignaGVpZ2h0Jywgc3ZnSClcbiAgICAgICAgLy8gIDxyZWN0IHdpZHRoPVwiMzAwXCIgaGVpZ2h0PVwiMTAwXCIgc3R5bGU9XCJmaWxsOnJnYigwLDAsMjU1KTtzdHJva2Utd2lkdGg6MztzdHJva2U6cmdiKDAsMCwwKVwiIC8+XG5cbiAgICAgICAgY29uc3QgZyA9IHN2Zy5hcHBlbmQoJ2cnKS5hdHRyKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKCcgKyB0aGlzLm1hcmdpbiArICcgJyArIDAgKyAnKScpXG5cbiAgICAgICAgLy9kcmF3IGNvbG9yIGJhclxuICAgICAgICBjb25zdCB3ID0gdGhpcy53aWR0aCxcbiAgICAgICAgICAgIGggPSB0aGlzLmhlaWdodFxuICAgICAgICBjb25zdCBzdGVwID0gNVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHc7IGkgKz0gc3RlcCkge1xuICAgICAgICAgICAgbGV0IHQgPSBpIC8gKHcgLSAxKVxuICAgICAgICAgICAgaWYgKHRoaXMuaW52ZXJ0KSB0ID0gMSAtIHRcbiAgICAgICAgICAgIGcuYXBwZW5kKCdyZWN0JylcbiAgICAgICAgICAgICAgICAuYXR0cigneCcsIGkpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3knLCAwKVxuICAgICAgICAgICAgICAgIC5hdHRyKCd3aWR0aCcsIHN0ZXApXG4gICAgICAgICAgICAgICAgLmF0dHIoJ2hlaWdodCcsIGgpXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdmaWxsJywgdGhpcy5jb2xvclNjYWxlKHQsIG9wdHMudmlld1NjYWxlKSlcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy50aWNrczsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgdCA9IGkgLyAodGhpcy50aWNrcyAtIDEpXG5cbiAgICAgICAgICAgIC8vdGljayBsaW5lXG4gICAgICAgICAgICBnLmFwcGVuZCgnbGluZScpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3gxJywgdyAqIHQpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3kxJywgMClcbiAgICAgICAgICAgICAgICAuYXR0cigneDInLCB3ICogdClcbiAgICAgICAgICAgICAgICAuYXR0cigneTInLCBoICsgdGhpcy50aWNrU2l6ZSlcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ3N0cm9rZScsICdibGFjaycpXG5cbiAgICAgICAgICAgIC8vcHJlcGFyZSB0aWNrIGxhYmVsXG4gICAgICAgICAgICBnLmFwcGVuZCgndGV4dCcpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ2lkJywgJ3RpY2tsYWJlbF8nICsgaSlcbiAgICAgICAgICAgICAgICAuYXR0cigneCcsIHcgKiB0KVxuICAgICAgICAgICAgICAgIC5hdHRyKCd5JywgaCArIHRoaXMudGlja1NpemUgKyAyKVxuICAgICAgICAgICAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgdGhpcy5mb250U2l6ZSlcbiAgICAgICAgICAgICAgICAvLy5zdHlsZShcImZvbnQtd2VpZ2h0XCIsIFwiYm9sZFwiKVxuICAgICAgICAgICAgICAgIC8vLnN0eWxlKFwiZm9udC1mYW1pbHlcIiwgXCJBcmlhbFwiKVxuICAgICAgICAgICAgICAgIC5zdHlsZSgndGV4dC1hbmNob3InLCBpID09IDAgPyAnc3RhcnQnIDogaSA9PSB0aGlzLnRpY2tzIC0gMSA/ICdlbmQnIDogJ21pZGRsZScpXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdhbGlnbm1lbnQtYmFzZWxpbmUnLCAndG9wJylcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ2RvbWluYW50LWJhc2VsaW5lJywgJ2hhbmdpbmcnKVxuICAgICAgICAgICAgICAgIC5zdHlsZSgncG9pbnRlci1ldmVudHMnLCAnbm9uZScpXG4gICAgICAgICAgICAvLy50ZXh0KFwiLVwiKVxuICAgICAgICB9XG5cbiAgICAgICAgLy91cGRhdGUgdGljayBsYWJlbHNcblxuICAgICAgICAvL2xhYmVsIHRleHQgZm9ybWF0XG4gICAgICAgIGNvbnN0IGYgPSB0aGlzLnRpY2tGb3JtYXQgJiYgdGhpcy50aWNrRm9ybWF0ICE9ICd0ZXh0JyA/IHRoaXMudGlja0Zvcm1hdCA6ICh2KSA9PiB2XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy50aWNrczsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgdCA9IGkgLyAodGhpcy50aWNrcyAtIDEpXG5cbiAgICAgICAgICAgIGNvbnN0IHYgPSB0aGlzLnRleHRTY2FsZSh0LCBvcHRzLnZpZXdTY2FsZSlcbiAgICAgICAgICAgIGNvbnN0IHRleHQgPSAodiA/IGYodikgOiAnMCcpICsgKHRoaXMudGlja1VuaXQgPyB0aGlzLnRpY2tVbml0IDogJycpXG4gICAgICAgICAgICBpZiAodGV4dCA9PSB1bmRlZmluZWQpIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIC8vdGljayBsYWJlbFxuICAgICAgICAgICAgdGhpcy5kaXYuc2VsZWN0KCcjJyArICd0aWNrbGFiZWxfJyArIGkpLnRleHQodGV4dClcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgTGVnZW5kIH0gZnJvbSAnLi4vY29yZS9MZWdlbmQuanMnXG5cbi8qKlxuICogQSBsZWdlbmQgZWxlbWVudCBmb3Igc2VnbWVudCBvcmllbnRhdGlvbi5cbiAqXG4gKiBAbW9kdWxlIGxlZ2VuZFxuICogQGF1dGhvciBKb3NlcGggRGF2aWVzLCBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgT3JpZW50YXRpb25MZWdlbmQgZXh0ZW5kcyBMZWdlbmQge1xuICAgIC8qKiBAcGFyYW0ge09iamVjdH0gb3B0cyAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cylcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvL29yaWVudGF0aW9uXG4gICAgICAgIHRoaXMub3JpZW50YXRpb24gPSBvcHRzLm9yaWVudGF0aW9uIHx8IDBcbiAgICAgICAgLy9jb2xvclxuICAgICAgICB0aGlzLmNvbG9yID0gb3B0cy5jb2xvciB8fCAoKHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgPT4gJ2dyYXknKVxuICAgICAgICAvL3dpZHRoXG4gICAgICAgIHRoaXMud2lkdGggPSBvcHRzLndpZHRoIHx8ICgocmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA9PiAzICogeilcbiAgICAgICAgLy9sZW5ndGhcbiAgICAgICAgdGhpcy5sZW5ndGggPSBvcHRzLmxlbmd0aCB8fCAoKHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgPT4gcmVzb2x1dGlvbilcblxuICAgICAgICAvL2xhYmVsXG4gICAgICAgIHRoaXMubGFiZWwgPSBvcHRzLmxhYmVsIHx8ICctJ1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7eyBzdHlsZTogaW1wb3J0KFwiLi4vc3R5bGUvU2VnbWVudFN0eWxlLmpzXCIpLlNlZ21lbnRTdHlsZSwgcmVzb2x1dGlvbjogbnVtYmVyLCB6OiBudW1iZXIsIHZpZXdTY2FsZTpvYmplY3QgfX0gb3B0c1xuICAgICAqL1xuICAgIHVwZGF0ZShvcHRzKSB7XG4gICAgICAgIC8vY2xlYXJcbiAgICAgICAgdGhpcy5kaXYuc2VsZWN0QWxsKCcqJykucmVtb3ZlKClcblxuICAgICAgICAvL3RpdGxlXG4gICAgICAgIHRoaXMubWFrZVRpdGxlKClcblxuICAgICAgICBjb25zdCBkID0gdGhpcy5kaXYuYXBwZW5kKCdkaXYnKVxuXG4gICAgICAgIC8vY29tcHV0ZSBzZWdtZW50IGNvbG9yLCB3aWR0aCBhbmQgbGVuZ3RoXG4gICAgICAgIGNvbnN0IGNvbG9yID0gdGhpcy5jb2xvcihvcHRzLnJlc29sdXRpb24sIG9wdHMueiwgb3B0cy52aWV3U2NhbGUpXG4gICAgICAgIGNvbnN0IHdpZHRoUGl4ID0gdGhpcy53aWR0aChvcHRzLnJlc29sdXRpb24sIG9wdHMueiwgb3B0cy52aWV3U2NhbGUpIC8gb3B0cy56XG4gICAgICAgIGNvbnN0IGxlbmd0aFBpeCA9IHRoaXMubGVuZ3RoKG9wdHMucmVzb2x1dGlvbiwgb3B0cy56LCBvcHRzLnZpZXdTY2FsZSkgLyBvcHRzLnpcblxuICAgICAgICAvL2RyYXcgU1ZHIHNlZ21lbnRcbiAgICAgICAgY29uc3Qgc3ZnUyA9IE1hdGgubWF4KGxlbmd0aFBpeCwgd2lkdGhQaXgpXG4gICAgICAgIGNvbnN0IHN2ZyA9IGQuYXBwZW5kKCdzdmcnKS5hdHRyKCd3aWR0aCcsIHN2Z1MpLmF0dHIoJ2hlaWdodCcsIHN2Z1MpLnN0eWxlKCcnLCAnaW5saW5lLWJsb2NrJylcblxuICAgICAgICBjb25zdCBjb3MgPSBNYXRoLmNvcygoLXRoaXMub3JpZW50YXRpb24gKiBNYXRoLlBJKSAvIDE4MClcbiAgICAgICAgY29uc3Qgc2luID0gTWF0aC5zaW4oKC10aGlzLm9yaWVudGF0aW9uICogTWF0aC5QSSkgLyAxODApXG4gICAgICAgIGNvbnN0IGRjID0gc3ZnUyAqIDAuNSxcbiAgICAgICAgICAgIGwyID0gbGVuZ3RoUGl4ICogMC41XG4gICAgICAgIHN2Zy5hcHBlbmQoJ2xpbmUnKVxuICAgICAgICAgICAgLmF0dHIoJ3gxJywgZGMgLSBjb3MgKiBsMilcbiAgICAgICAgICAgIC5hdHRyKCd5MScsIGRjIC0gc2luICogbDIpXG4gICAgICAgICAgICAuYXR0cigneDInLCBkYyArIGNvcyAqIGwyKVxuICAgICAgICAgICAgLmF0dHIoJ3kyJywgZGMgKyBzaW4gKiBsMilcbiAgICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlJywgY29sb3IpXG4gICAgICAgICAgICAuc3R5bGUoJ3N0cm9rZS13aWR0aCcsIHdpZHRoUGl4KVxuXG4gICAgICAgIC8vbGFiZWxcbiAgICAgICAgZC5hcHBlbmQoJ2RpdicpXG4gICAgICAgICAgICAuc3R5bGUoJ2Rpc3BsYXknLCAnaW5saW5lJylcbiAgICAgICAgICAgIC5zdHlsZSgncGFkZGluZy1sZWZ0JywgJzVweCcpXG4gICAgICAgICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsIHRoaXMubGFiZWxGb250U2l6ZSlcbiAgICAgICAgICAgIC50ZXh0KHRoaXMubGFiZWwgKyAodGhpcy5sYWJlbFVuaXRUZXh0ID8gJyAnIDogJycpICsgdGhpcy5sYWJlbFVuaXRUZXh0KVxuICAgIH1cbn1cblxuLyoqXG4gKlxuICogQHBhcmFtIHtBcnJheS48bnVtYmVyPn0gb3JpZW50YXRpb25zXG4gKiBAcGFyYW0ge0FycmF5LjxzdHJpbmc+fSBsYWJlbHNcbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXG4gKiBAcmV0dXJucyAgeyBBcnJheS48T3JpZW50YXRpb25MZWdlbmQ+IH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9yaWVudGF0aW9uTGVnZW5kKG9yaWVudGF0aW9ucywgbGFiZWxzLCBvcHRzID0ge30pIHtcbiAgICBjb25zdCBsZWdlbmRzID0gW11cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9yaWVudGF0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICBvcHRzLnRpdGxlID0gaSA9PSAwID8gb3B0cy50aXRsZSA6IHVuZGVmaW5lZFxuICAgICAgICBvcHRzLm9yaWVudGF0aW9uID0gb3JpZW50YXRpb25zW2ldXG4gICAgICAgIG9wdHMubGFiZWwgPSBsYWJlbHNbaV1cbiAgICAgICAgbGVnZW5kcy5wdXNoKG5ldyBPcmllbnRhdGlvbkxlZ2VuZChvcHRzKSlcbiAgICB9XG4gICAgcmV0dXJuIGxlZ2VuZHNcbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgTGVnZW5kIH0gZnJvbSAnLi4vY29yZS9MZWdlbmQuanMnXG5pbXBvcnQgeyBuaWNlIH0gZnJvbSAnLi4vdXRpbHMvdXRpbHMuanMnXG5pbXBvcnQgeyBtYXggfSBmcm9tICdkMy1hcnJheSdcblxuLyoqXG4gKiBBIGxlZ2VuZCBlbGVtZW50IGZvciBwcm9wb3J0aW9uYWwgc3ltYm9scy5cbiAqXG4gKiBAbW9kdWxlIGxlZ2VuZFxuICogQGF1dGhvciBKb3NlcGggRGF2aWVzLCBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgU2l6ZUxlZ2VuZCBleHRlbmRzIExlZ2VuZCB7XG4gICAgLyoqIEBwYXJhbSB7T2JqZWN0fSBvcHRzICovXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKVxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgdGV4dCBsYWJlbCwgZnJvbSB0aGUgdmlldyBzY2FsZSBhbmQgbGlzdCBvZiBjZWxscywgcmVzb2x1dGlvbiBhbmQgem9vbVxuICAgICAgICAgKiAgQHR5cGUgeyBmdW5jdGlvbihvYmplY3QsIEFycmF5LjxpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGw+LCBudW1iZXIsIG51bWJlcik6KG51bWJlcnxzdHJpbmcpIH0gKi9cbiAgICAgICAgdGhpcy5sYWJlbCA9IG9wdHMubGFiZWwgfHwgdW5kZWZpbmVkXG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBzaXplIG9mIHRoZSBsZWdlbmQgc3ltYm9sLCBpbiBnZW8gVW9NLCBmcm9tIHRoZSB2aWV3c2NhbGUsIHJlc29sdXRpb24gYW5kIHpvb21cbiAgICAgICAgICogIEB0eXBlIHsgZnVuY3Rpb24ob2JqZWN0LCBudW1iZXIsIG51bWJlcik6bnVtYmVyIH0gKi9cbiAgICAgICAgdGhpcy5zaXplID0gb3B0cy5zaXplIHx8IHVuZGVmaW5lZFxuXG4gICAgICAgIC8vc3ltYm9sXG4gICAgICAgIC8qKiAgQHR5cGUgeyhpbXBvcnQoXCIuLi9jb3JlL1N0eWxlXCIpLlNoYXBlKXxcImxpbmVcIn0gKi9cbiAgICAgICAgdGhpcy5zaGFwZSA9IG9wdHMuc2hhcGUgfHwgJ2NpcmNsZSdcblxuICAgICAgICAvL2dlbmVyYWwgY2FzZVxuICAgICAgICB0aGlzLmZpbGxDb2xvciA9IG9wdHMuZmlsbENvbG9yIHx8ICdub25lJ1xuICAgICAgICB0aGlzLnN0cm9rZUNvbG9yID0gb3B0cy5zdHJva2VDb2xvciB8fCAnZ3JheSdcbiAgICAgICAgdGhpcy5zdHJva2VXaWR0aCA9IG9wdHMuc3Ryb2tlV2lkdGggfHwgMVxuXG4gICAgICAgIC8vZm9yIGxpbmUgc2hhcGVcbiAgICAgICAgLy9UT0RPIHRoaXMub3JpZW50YXRpb24gPSBvcHRzLm9yaWVudGF0aW9uIHx8IDBcbiAgICAgICAgdGhpcy5jb2xvciA9IG9wdHMuY29sb3IgfHwgJ2dyYXknXG4gICAgICAgIHRoaXMubGVuZ3RoID0gb3B0cy5sZW5ndGggfHwgKChyZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpID0+IHJlc29sdXRpb24pXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHt7IHZpZXdTY2FsZTpvYmplY3QsIHJlc29sdXRpb246IG51bWJlciwgejpudW1iZXIsIGNlbGxzOkFycmF5LjxpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGw+IH19IG9wdHNcbiAgICAgKi9cbiAgICB1cGRhdGUob3B0cykge1xuICAgICAgICAvL2NsZWFyXG4gICAgICAgIHRoaXMuZGl2LnNlbGVjdEFsbCgnKicpLnJlbW92ZSgpXG5cbiAgICAgICAgLy90aXRsZVxuICAgICAgICB0aGlzLm1ha2VUaXRsZSgpXG5cbiAgICAgICAgLy9nZXQgbGFiZWwuIE1heSBub3QgYmUgYSBudW1iZXIgKCEpXG4gICAgICAgIGxldCBsYWJlbCA9IHRoaXMubGFiZWwob3B0cy52aWV3U2NhbGUsIG9wdHMuY2VsbHMsIG9wdHMucmVzb2x1dGlvbiwgb3B0cy56KVxuXG4gICAgICAgIC8vY29tcHV0ZSBzaXplIG9mIHN5bWJvbCwgaW4gcGl4XG4gICAgICAgIGxldCBzaXplUGl4XG4gICAgICAgIGlmICh0aGlzLnNpemUpIHNpemVQaXggPSB0aGlzLnNpemUob3B0cy52aWV3U2NhbGUsIG9wdHMucmVzb2x1dGlvbiwgb3B0cy56KSAvIG9wdHMuelxuICAgICAgICBlbHNlIHNpemVQaXggPSBvcHRzLnZpZXdTY2FsZSgrbGFiZWwpIC8gb3B0cy56XG4gICAgICAgIGlmICghc2l6ZVBpeCkgcmV0dXJuXG5cbiAgICAgICAgLy9mb3JtYXQgbGFiZWwsIGlmIHNwZWNpZmllZCBhbmQgcG9zc2libGVcbiAgICAgICAgaWYgKHRoaXMubGFiZWxGb3JtYXQgJiYgIWlzTmFOKCtsYWJlbCkpIGxhYmVsID0gdGhpcy5sYWJlbEZvcm1hdChsYWJlbClcblxuICAgICAgICBjb25zdCBkID0gdGhpcy5kaXYuYXBwZW5kKCdkaXYnKVxuICAgICAgICAvL3RvIGVuYWJsZSB2ZXJ0aWNhbCBjZW50ZXJpbmdcbiAgICAgICAgLy8uc3R5bGUoXCJwb3NpdGlvblwiLCBcInJlbGF0aXZlXCIpXG5cbiAgICAgICAgLy9kZWZhdWx0IHN2ZyBjb25zdHJ1Y3Rpb24sIGZvciBzcXVhcmUgYW5kIGNpcmNsZVxuICAgICAgICBjb25zdCBzdmcgPSAoKSA9PlxuICAgICAgICAgICAgZFxuICAgICAgICAgICAgICAgIC5hcHBlbmQoJ3N2ZycpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3dpZHRoJywgc2l6ZVBpeCArIHRoaXMuc3Ryb2tlV2lkdGggKyAyKVxuICAgICAgICAgICAgICAgIC5hdHRyKCdoZWlnaHQnLCBzaXplUGl4ICsgdGhpcy5zdHJva2VXaWR0aCArIDIpXG4gICAgICAgICAgICAgICAgLnN0eWxlKCcnLCAnaW5saW5lLWJsb2NrJylcblxuICAgICAgICBpZiAodGhpcy5zaGFwZSA9PT0gJ3NxdWFyZScpIHtcbiAgICAgICAgICAgIHN2ZygpXG4gICAgICAgICAgICAgICAgLmFwcGVuZCgncmVjdCcpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3gnLCAwKVxuICAgICAgICAgICAgICAgIC5hdHRyKCd5JywgMClcbiAgICAgICAgICAgICAgICAuYXR0cignd2lkdGgnLCBzaXplUGl4KVxuICAgICAgICAgICAgICAgIC5hdHRyKCdoZWlnaHQnLCBzaXplUGl4KVxuICAgICAgICAgICAgICAgIC5zdHlsZSgnZmlsbCcsIHRoaXMuZmlsbENvbG9yKVxuICAgICAgICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlJywgdGhpcy5zdHJva2VDb2xvcilcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ3N0cm9rZS13aWR0aCcsIHRoaXMuc3Ryb2tlV2lkdGgpXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zaGFwZSA9PT0gJ2NpcmNsZScpIHtcbiAgICAgICAgICAgIC8vIDxjaXJjbGUgY3g9XCI1MFwiIGN5PVwiNTBcIiByPVwiNDBcIiBzdHJva2U9XCJibGFja1wiIHN0cm9rZS13aWR0aD1cIjNcIiBmaWxsPVwicmVkXCIgLz5cbiAgICAgICAgICAgIGNvbnN0IHIgPSAoc2l6ZVBpeCArIHRoaXMuc3Ryb2tlV2lkdGgpICogMC41XG4gICAgICAgICAgICBzdmcoKVxuICAgICAgICAgICAgICAgIC5hcHBlbmQoJ2NpcmNsZScpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ2N4JywgciArIDEpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ2N5JywgciArIDEpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3InLCByKVxuICAgICAgICAgICAgICAgIC5zdHlsZSgnZmlsbCcsIHRoaXMuZmlsbENvbG9yKVxuICAgICAgICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlJywgdGhpcy5zdHJva2VDb2xvcilcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ3N0cm9rZS13aWR0aCcsIHRoaXMuc3Ryb2tlV2lkdGgpXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zaGFwZSA9PT0gJ2RvbnV0Jykge1xuICAgICAgICAgICAgLy9UT0RPXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zaGFwZSA9PT0gJ2RpYW1vbmQnKSB7XG4gICAgICAgICAgICAvL1RPRE9cbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNoYXBlID09PSAnbGluZScpIHtcbiAgICAgICAgICAgIC8vZ2V0IHNlZ21lbnQgbGVuZ3RoXG4gICAgICAgICAgICBsZXQgbGVuZ3RoUGl4ID0gdGhpcy5sZW5ndGhcbiAgICAgICAgICAgICAgICA/IHRoaXMubGVuZ3RoKG9wdHMucmVzb2x1dGlvbiwgb3B0cy56LCBvcHRzLnZpZXdTY2FsZSlcbiAgICAgICAgICAgICAgICA6IG9wdHMucmVzb2x1dGlvblxuICAgICAgICAgICAgbGVuZ3RoUGl4IC89IG9wdHMuelxuXG4gICAgICAgICAgICBjb25zdCBzdmcgPSBkXG4gICAgICAgICAgICAgICAgLmFwcGVuZCgnc3ZnJylcbiAgICAgICAgICAgICAgICAuYXR0cignd2lkdGgnLCBsZW5ndGhQaXgpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ2hlaWdodCcsIHNpemVQaXgpXG4gICAgICAgICAgICAgICAgLnN0eWxlKCcnLCAnaW5saW5lLWJsb2NrJylcblxuICAgICAgICAgICAgLy9UT0RPIG9yaWVudGF0aW9uXG4gICAgICAgICAgICAvLzxsaW5lIHgxPVwiMFwiIHkxPVwiMFwiIHgyPVwiMjAwXCIgeTI9XCIyMDBcIiBzdHlsZT1cInN0cm9rZTpyZ2IoMjU1LDAsMCk7c3Ryb2tlLXdpZHRoOjJcIiAvPlxuICAgICAgICAgICAgc3ZnLmFwcGVuZCgnbGluZScpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3gxJywgMClcbiAgICAgICAgICAgICAgICAuYXR0cigneTEnLCBzaXplUGl4IC8gMilcbiAgICAgICAgICAgICAgICAuYXR0cigneDInLCBsZW5ndGhQaXgpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3kyJywgc2l6ZVBpeCAvIDIpXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdzdHJva2UnLCB0aGlzLmNvbG9yKVxuICAgICAgICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlLXdpZHRoJywgc2l6ZVBpeClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCBzaGFwZTonICsgdGhpcy5zaGFwZSlcbiAgICAgICAgfVxuXG4gICAgICAgIC8vbGFiZWxcbiAgICAgICAgZC5hcHBlbmQoJ2RpdicpXG4gICAgICAgICAgICAuc3R5bGUoJ2Rpc3BsYXknLCAnaW5saW5lJylcbiAgICAgICAgICAgIC5zdHlsZSgncGFkZGluZy1sZWZ0JywgJzVweCcpXG4gICAgICAgICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsIHRoaXMubGFiZWxGb250U2l6ZSlcbiAgICAgICAgICAgIC50ZXh0KGxhYmVsICsgKHRoaXMubGFiZWxVbml0VGV4dCA/ICcgJyA6ICcnKSArIHRoaXMubGFiZWxVbml0VGV4dClcbiAgICB9XG59XG5cbi8qKlxuICogQHBhcmFtIHtBcnJheS48bnVtYmVyPn0gdmFsdWVzXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKG51bWJlcik6bnVtYmVyfSBzaXplXG4gKiBAcGFyYW0geyBvYmplY3QgfSBvcHRzXG4gKiBAcmV0dXJucyB7QXJyYXkuPFNpemVMZWdlbmQ+fVxuICovXG5leHBvcnQgZnVuY3Rpb24gc2l6ZUxlZ2VuZCh2YWx1ZXMsIHNpemUsIG9wdHMgPSB7fSkge1xuICAgIGNvbnN0IGxlZ2VuZHMgPSBbXVxuICAgIGZvciAobGV0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgICAgICBvcHRzLnRpdGxlID0gdmFsdWUgPT0gdmFsdWVzWzBdID8gb3B0cy50aXRsZSA6IHVuZGVmaW5lZFxuICAgICAgICBvcHRzLnNpemUgPSAoKSA9PiBzaXplKHZhbHVlKVxuICAgICAgICBvcHRzLmxhYmVsID0gKCkgPT4gdmFsdWVcbiAgICAgICAgbGVnZW5kcy5wdXNoKG5ldyBTaXplTGVnZW5kKG9wdHMpKVxuICAgIH1cbiAgICByZXR1cm4gbGVnZW5kc1xufVxuXG4vKipcbiAqIEBwYXJhbSB7IGZ1bmN0aW9uKGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbCk6bnVtYmVyIH0gdmFsdWVcbiAqIEBwYXJhbSB7Kn0gb3B0c1xuICogQHJldHVybnMge0FycmF5LjxTaXplTGVnZW5kPn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNpemVMZWdlbmRWaWV3U2NhbGUodmFsdWUsIG9wdHMgPSB7fSkge1xuICAgIGNvbnN0IGsgPSBvcHRzLmsgfHwgWzAuOSwgMC41LCAwLjIsIDAuMDVdXG4gICAgY29uc3QgbGVnZW5kcyA9IFtdXG4gICAgZm9yIChsZXQga18gb2Ygaykge1xuICAgICAgICBvcHRzLnRpdGxlID0ga18gPT0ga1swXSA/IG9wdHMudGl0bGUgOiB1bmRlZmluZWRcbiAgICAgICAgb3B0cy5sYWJlbCA9ICh2aWV3U2NhbGUsIGNlbGxzKSA9PiBuaWNlKGtfICogbWF4KGNlbGxzLCB2YWx1ZSkpXG4gICAgICAgIGxlZ2VuZHMucHVzaChuZXcgU2l6ZUxlZ2VuZChvcHRzKSlcbiAgICB9XG4gICAgcmV0dXJuIGxlZ2VuZHNcbn1cblxuLyoqXG4gKiBBIGZ1bmN0aW9uIHdoaWNoIHJldHVybiBhIHN0YWNrIG9mIHNpemUgbGVnZW5kcyBmb3IgYSBkaXNjcmV0ZSBjbGFzc2lmaWNhdGlvbi5cbiAqXG4gKiBAcGFyYW0geyBBcnJheS48bnVtYmVyPiB9IGJyZWFrc1xuICogQHBhcmFtIHsgQXJyYXkuPG51bWJlcj4gfSBzaXplc1xuICogQHBhcmFtIHsgb2JqZWN0IH0gb3B0c1xuICogQHJldHVybnMge0FycmF5LjxTaXplTGVnZW5kPn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNpemVEaXNjcmV0ZUxlZ2VuZChicmVha3MsIHNpemVzLCBvcHRzID0ge30pIHtcbiAgICBjb25zdCBmID0gb3B0cy5sYWJlbEZvcm1hdCB8fCAoKHgpID0+IHgpXG4gICAgY29uc3QgbGFiZWxUZXh0ID0gb3B0cy5sYWJlbFRleHQgfHwgZGVmYXVsdExhYmVsVGV4dChmKVxuICAgIGNvbnN0IGxlZ2VuZHMgPSBbXVxuICAgIGZvciAobGV0IGkgPSBzaXplcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICBvcHRzLnRpdGxlID0gaSA9PSBzaXplcy5sZW5ndGggLSAxID8gb3B0cy50aXRsZSA6IHVuZGVmaW5lZFxuICAgICAgICBvcHRzLnNpemUgPSAoKSA9PiBzaXplc1tpXVxuICAgICAgICBvcHRzLmxhYmVsID0gKCkgPT4gbGFiZWxUZXh0KGJyZWFrc1tpIC0gMV0sIGJyZWFrc1tpXSlcbiAgICAgICAgbGVnZW5kcy5wdXNoKG5ldyBTaXplTGVnZW5kKG9wdHMpKVxuICAgIH1cbiAgICByZXR1cm4gbGVnZW5kc1xufVxuXG4vKipcbiAqIEEgZnVuY3Rpb24gd2hpY2ggcmV0dXJuIGEgc3RhY2sgb2Ygc2l6ZSBsZWdlbmRzIGZvciBhIGRpc2NyZXRlIGNsYXNzaWZpY2F0aW9uIHVzaW5nIGEgdmlld3NjYWxlLlxuICogQHBhcmFtIHsgbnVtYmVyIH0gY2xhc3NOdW1iZXJcbiAqIEBwYXJhbSB7IG9iamVjdCB9IG9wdHNcbiAqIEByZXR1cm5zIHtBcnJheS48U2l6ZUxlZ2VuZD59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaXplRGlzY3JldGVWaWV3U2NhbGVMZWdlbmQoY2xhc3NOdW1iZXIsIG9wdHMgPSB7fSkge1xuICAgIGNvbnN0IGYgPSBvcHRzLmxhYmVsRm9ybWF0IHx8ICgoeCkgPT4geClcbiAgICBjb25zdCBsYWJlbFRleHQgPSBvcHRzLmxhYmVsVGV4dCB8fCBkZWZhdWx0TGFiZWxUZXh0KGYpXG4gICAgY29uc3QgbGVnZW5kcyA9IFtdXG4gICAgY29uc3Qgdmlld1NjYWxlRnVuID0gb3B0cy52aWV3U2NhbGVGdW4gfHwgKCh0KSA9PiB0KSAvL1RPRE8gZG8gaXQgZGlmZmVyZW50bHk/IEF0IHNpemVsZWdlbmQgbGV2ZWwgIVxuICAgIGZvciAobGV0IGkgPSBjbGFzc051bWJlciAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIG9wdHMudGl0bGUgPSBpID09IGNsYXNzTnVtYmVyIC0gMSA/IG9wdHMudGl0bGUgOiB1bmRlZmluZWRcbiAgICAgICAgb3B0cy5zaXplID0gKHZpZXdTY2FsZSkgPT4gdmlld1NjYWxlRnVuKHZpZXdTY2FsZSkudmFsdWVzW2ldXG4gICAgICAgIG9wdHMubGFiZWwgPSAodmlld1NjYWxlKSA9PlxuICAgICAgICAgICAgbGFiZWxUZXh0KHZpZXdTY2FsZUZ1bih2aWV3U2NhbGUpLmJyZWFrc1tpIC0gMV0sIHZpZXdTY2FsZUZ1bih2aWV3U2NhbGUpLmJyZWFrc1tpXSlcbiAgICAgICAgbGVnZW5kcy5wdXNoKG5ldyBTaXplTGVnZW5kKG9wdHMpKVxuICAgIH1cbiAgICByZXR1cm4gbGVnZW5kc1xufVxuXG4vKipcbiAqIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgZnVuY3Rpb24gdG8gZm9ybWF0IGxhYmVybHMgZm9yIGRpc2NyZXRlIHNjYWxlIGxlZ2VuZHMuXG4gKiBAcGFyYW0geyBmdW5jdGlvbihudW1iZXIpOnN0cmluZyB9IGZvcm1hdFxuICogQHJldHVybnMgeyBmdW5jdGlvbihudW1iZXJ8dW5kZWZpbmVkLCBudW1iZXJ8dW5kZWZpbmVkKTogc3RyaW5nIH1cbiAqL1xuZnVuY3Rpb24gZGVmYXVsdExhYmVsVGV4dChmb3JtYXQpIHtcbiAgICByZXR1cm4gKHYwLCB2MSkgPT4ge1xuICAgICAgICBpZiAodjAgPT0gdW5kZWZpbmVkICYmIHYxID09IHVuZGVmaW5lZCkgcmV0dXJuICcnXG4gICAgICAgIGlmICh2MSA9PSB1bmRlZmluZWQpIHJldHVybiAnPiAnICsgZm9ybWF0KHYwKVxuICAgICAgICBpZiAodjAgPT0gdW5kZWZpbmVkKSByZXR1cm4gJzwgJyArIGZvcm1hdCh2MSlcbiAgICAgICAgcmV0dXJuIGZvcm1hdCh2MCkgKyAnIC0gJyArIGZvcm1hdCh2MSlcbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IHNlbGVjdCB9IGZyb20gJ2QzLXNlbGVjdGlvbidcbmltcG9ydCB7IExlZ2VuZCB9IGZyb20gJy4uL2NvcmUvTGVnZW5kLmpzJ1xuXG4vKipcbiAqXG4gKiBAbW9kdWxlIGxlZ2VuZFxuICogQGF1dGhvciBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgVGVybmFyeUxlZ2VuZCBleHRlbmRzIExlZ2VuZCB7XG4gICAgLyoqIEBwYXJhbSB7T2JqZWN0fSBvcHRzICovXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKVxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgICAgIC8vY2xhc3NpZmllclxuICAgICAgICB0aGlzLmNsYXNzaWZpZXIgPSBvcHRzLmNsYXNzaWZpZXJcblxuICAgICAgICB0aGlzLndpZHRoID0gb3B0cy53aWR0aCB8fCAxNTBcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25Db2xvciA9IHRoaXMuc2VsZWN0aW9uQ29sb3IgfHwgJ3JlZCdcbiAgICAgICAgdGhpcy50b29sdGlwID0gb3B0cy50b29sdGlwXG4gICAgICAgIHRoaXMudGV4dHMgPSBvcHRzLnRleHRzXG5cbiAgICAgICAgdGhpcy5sZWZ0VGV4dCA9IG9wdHMubGVmdFRleHQgfHwgJ0NhdGVnb3J5IDAnXG4gICAgICAgIHRoaXMudG9wVGV4dCA9IG9wdHMudG9wVGV4dCB8fCAnQ2F0ZWdvcnkgMSdcbiAgICAgICAgdGhpcy5yaWdodFRleHQgPSBvcHRzLnJpZ2h0VGV4dCB8fCAnQ2F0ZWdvcnkgMidcblxuICAgICAgICB0aGlzLmNlbnRlckNvZWZmaWNpZW50ID0gb3B0cy5jZW50ZXJDb2VmZmljaWVudCB8fCB0aGlzLmNsYXNzaWZpZXIuY2VudGVyQ29lZmZpY2llbnRcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge3t9IH0gb3B0c1xuICAgICAqL1xuICAgIHVwZGF0ZShvcHRzKSB7XG4gICAgICAgIC8vY2xlYXJcbiAgICAgICAgdGhpcy5kaXYuc2VsZWN0QWxsKCcqJykucmVtb3ZlKClcblxuICAgICAgICAvL3RpdGxlXG4gICAgICAgIHRoaXMubWFrZVRpdGxlKClcblxuICAgICAgICBjb25zdCBzcXJ0M292ZXIyID0gMC44NjYwMjVcbiAgICAgICAgY29uc3QgdyA9IHRoaXMud2lkdGgsXG4gICAgICAgICAgICBoID0gdyAqIHNxcnQzb3ZlcjJcbiAgICAgICAgY29uc3QgY2xhc3NpZmllciA9IHRoaXMuY2xhc3NpZmllclxuICAgICAgICBjb25zdCBzZWxlY3Rpb25Db2xvciA9IHRoaXMuc2VsZWN0aW9uQ29sb3JcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uU3Ryb2tlV2lkdGggPSAwXG4gICAgICAgIGNvbnN0IHR0ID0gdGhpcy50b29sdGlwXG4gICAgICAgIGNvbnN0IHRleHRzID0gdGhpcy50ZXh0cyB8fCB7fVxuXG4gICAgICAgIGNvbnN0IHBhZGRpbmcgPSAyXG4gICAgICAgIGNvbnN0IGZvbnRTaXplID0gMTJcblxuICAgICAgICAvL21ha2Ugc3ZnIGVsZW1lbnRcbiAgICAgICAgY29uc3Qgc3ZnID0gdGhpcy5kaXZcbiAgICAgICAgICAgIC5hcHBlbmQoJ3N2ZycpXG4gICAgICAgICAgICAuYXR0cignd2lkdGgnLCB3ICsgc2VsZWN0aW9uU3Ryb2tlV2lkdGgpXG4gICAgICAgICAgICAuYXR0cignaGVpZ2h0JywgaCArIDQgKiBwYWRkaW5nICsgMiAqIGZvbnRTaXplKVxuXG4gICAgICAgIC8vdG9wIGxhYmVsXG4gICAgICAgIHN2Zy5hcHBlbmQoJ3RleHQnKVxuICAgICAgICAgICAgLmF0dHIoJ3gnLCB3IC8gMilcbiAgICAgICAgICAgIC5hdHRyKCd5JywgcGFkZGluZyArIGZvbnRTaXplKVxuICAgICAgICAgICAgLnRleHQodGhpcy50b3BUZXh0KVxuICAgICAgICAgICAgLmF0dHIoJ2ZvbnQtc2l6ZScsIGZvbnRTaXplKVxuICAgICAgICAgICAgLmF0dHIoJ3RleHQtYW5jaG9yJywgJ21pZGRsZScpXG4gICAgICAgIC8vbGVmdCBsYWJlbFxuICAgICAgICBzdmcuYXBwZW5kKCd0ZXh0JylcbiAgICAgICAgICAgIC5hdHRyKCd4JywgMClcbiAgICAgICAgICAgIC5hdHRyKCd5JywgMyAqIHBhZGRpbmcgKyAyICogZm9udFNpemUgKyBoKVxuICAgICAgICAgICAgLnRleHQodGhpcy5sZWZ0VGV4dClcbiAgICAgICAgICAgIC5hdHRyKCdmb250LXNpemUnLCBmb250U2l6ZSlcbiAgICAgICAgICAgIC5hdHRyKCd0ZXh0LWFuY2hvcicsICdzdGFydCcpXG4gICAgICAgIC8vcmlnaHQgbGFiZWxcbiAgICAgICAgc3ZnLmFwcGVuZCgndGV4dCcpXG4gICAgICAgICAgICAuYXR0cigneCcsIHcpXG4gICAgICAgICAgICAuYXR0cigneScsIDMgKiBwYWRkaW5nICsgMiAqIGZvbnRTaXplICsgaClcbiAgICAgICAgICAgIC50ZXh0KHRoaXMucmlnaHRUZXh0KVxuICAgICAgICAgICAgLmF0dHIoJ2ZvbnQtc2l6ZScsIGZvbnRTaXplKVxuICAgICAgICAgICAgLmF0dHIoJ3RleHQtYW5jaG9yJywgJ2VuZCcpXG5cbiAgICAgICAgLy90cmlhbmdsZSBncm91cFxuICAgICAgICBjb25zdCBnID0gc3ZnXG4gICAgICAgICAgICAuYXBwZW5kKCdnJylcbiAgICAgICAgICAgIC5hdHRyKFxuICAgICAgICAgICAgICAgICd0cmFuc2Zvcm0nLFxuICAgICAgICAgICAgICAgICd0cmFuc2xhdGUoJyArXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvblN0cm9rZVdpZHRoIC8gMiArXG4gICAgICAgICAgICAgICAgICAgICcgJyArXG4gICAgICAgICAgICAgICAgICAgIChzZWxlY3Rpb25TdHJva2VXaWR0aCAvIDIgKyAoMiAqIHBhZGRpbmcgKyBmb250U2l6ZSkpICtcbiAgICAgICAgICAgICAgICAgICAgJyknXG4gICAgICAgICAgICApXG5cbiAgICAgICAgLy9jb21tb24gZnVuY3Rpb24gZm9yIHRyaWFuZ2xlIHBhdGNoZXNcbiAgICAgICAgY29uc3Qgc2V0QXR0cmlidXRlcyA9IChlbHQsIGNvbG9yLCB0ZXh0KSA9PiB7XG4gICAgICAgICAgICAvL2VsdC5yYWlzZSgpO1xuICAgICAgICAgICAgZWx0LmF0dHIoJ2ZpbGwnLCBjb2xvcilcbiAgICAgICAgICAgICAgICAvLy5hdHRyKFwic3Ryb2tlXCIsIGNvbG9yT3ZlcilcbiAgICAgICAgICAgICAgICAvLy5hdHRyKFwic3Ryb2tlLXdpZHRoXCIsIDApXG4gICAgICAgICAgICAgICAgLy8uYXR0cihcInN0cm9rZS1saW5lam9pblwiLCBcInJvdW5kXCIpXG4gICAgICAgICAgICAgICAgLm9uKCdtb3VzZW92ZXInLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgICAgICAvKnRoaXMucGFyZW50Tm9kZS5hcHBlbmRDaGlsZCh0aGlzKTsgc2VsZWN0KHRoaXMpLmF0dHIoXCJzdHJva2Utd2lkdGhcIiwgc2VsZWN0aW9uU3Ryb2tlV2lkdGgpOyovXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdCh0aGlzKS5hdHRyKCdmaWxsJywgc2VsZWN0aW9uQ29sb3IpXG4gICAgICAgICAgICAgICAgICAgIGlmICghdHQgfHwgIXRleHQpIHJldHVyblxuICAgICAgICAgICAgICAgICAgICB0dC5odG1sKHRleHQpXG4gICAgICAgICAgICAgICAgICAgIHR0LnNldFBvc2l0aW9uKGUpXG4gICAgICAgICAgICAgICAgICAgIHR0LnNob3coKVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLm9uKCdtb3VzZW91dCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgLypzZWxlY3QodGhpcykuYXR0cihcInN0cm9rZS13aWR0aFwiLCAwKTsqL1xuICAgICAgICAgICAgICAgICAgICBzZWxlY3QodGhpcykuYXR0cignZmlsbCcsIGNvbG9yKVxuICAgICAgICAgICAgICAgICAgICBpZiAodHQpIHR0LmhpZGUoKVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBpZiAodHQgJiYgdGV4dClcbiAgICAgICAgICAgICAgICBlbHQub24oJ21vdXNlbW92ZScsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHR0LnNldFBvc2l0aW9uKGUpXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIC8vY29uc3QgW2MwLCBjMSwgYzJdID0gY2xhc3NpZmllci5jZW50ZXJcblxuICAgICAgICAvL3RyYXBleml1bSBzMFxuICAgICAgICBjb25zdCB0MCA9IGdcbiAgICAgICAgICAgIC5hcHBlbmQoJ3BvbHlnb24nKVxuICAgICAgICAgICAgLmF0dHIoXG4gICAgICAgICAgICAgICAgJ3BvaW50cycsXG4gICAgICAgICAgICAgICAgJzAsJyArXG4gICAgICAgICAgICAgICAgICAgIGggK1xuICAgICAgICAgICAgICAgICAgICAnICcgK1xuICAgICAgICAgICAgICAgICAgICB3IC8gMyArXG4gICAgICAgICAgICAgICAgICAgICcsJyArXG4gICAgICAgICAgICAgICAgICAgIGggK1xuICAgICAgICAgICAgICAgICAgICAnICcgK1xuICAgICAgICAgICAgICAgICAgICB3IC8gMiArXG4gICAgICAgICAgICAgICAgICAgICcsJyArXG4gICAgICAgICAgICAgICAgICAgIChoICogMikgLyAzICtcbiAgICAgICAgICAgICAgICAgICAgJyAnICtcbiAgICAgICAgICAgICAgICAgICAgdyAvIDYgK1xuICAgICAgICAgICAgICAgICAgICAnLCcgK1xuICAgICAgICAgICAgICAgICAgICAoaCAqIDIpIC8gM1xuICAgICAgICAgICAgKVxuICAgICAgICBzZXRBdHRyaWJ1dGVzKHQwLCBjbGFzc2lmaWVyLmNvbG9yc1swXSwgdGV4dHNbJzAnXSlcbiAgICAgICAgLy90cmFwZXppdW0gczFcbiAgICAgICAgY29uc3QgdDEgPSBnXG4gICAgICAgICAgICAuYXBwZW5kKCdwb2x5Z29uJylcbiAgICAgICAgICAgIC5hdHRyKFxuICAgICAgICAgICAgICAgICdwb2ludHMnLFxuICAgICAgICAgICAgICAgIHcgLyAyICtcbiAgICAgICAgICAgICAgICAgICAgJywwICcgK1xuICAgICAgICAgICAgICAgICAgICAodyAqIDIpIC8gMyArXG4gICAgICAgICAgICAgICAgICAgICcsJyArXG4gICAgICAgICAgICAgICAgICAgIGggLyAzICtcbiAgICAgICAgICAgICAgICAgICAgJyAnICtcbiAgICAgICAgICAgICAgICAgICAgdyAvIDIgK1xuICAgICAgICAgICAgICAgICAgICAnLCcgK1xuICAgICAgICAgICAgICAgICAgICAoaCAqIDIpIC8gMyArXG4gICAgICAgICAgICAgICAgICAgICcgJyArXG4gICAgICAgICAgICAgICAgICAgIHcgLyAzICtcbiAgICAgICAgICAgICAgICAgICAgJywnICtcbiAgICAgICAgICAgICAgICAgICAgaCAvIDNcbiAgICAgICAgICAgIClcbiAgICAgICAgc2V0QXR0cmlidXRlcyh0MSwgY2xhc3NpZmllci5jb2xvcnNbMV0sIHRleHRzWycxJ10pXG4gICAgICAgIC8vdHJhcGV6aXVtIHMyXG4gICAgICAgIGNvbnN0IHQyID0gZ1xuICAgICAgICAgICAgLmFwcGVuZCgncG9seWdvbicpXG4gICAgICAgICAgICAuYXR0cihcbiAgICAgICAgICAgICAgICAncG9pbnRzJyxcbiAgICAgICAgICAgICAgICB3ICtcbiAgICAgICAgICAgICAgICAgICAgJywnICtcbiAgICAgICAgICAgICAgICAgICAgaCArXG4gICAgICAgICAgICAgICAgICAgICcgJyArXG4gICAgICAgICAgICAgICAgICAgICh3ICogNSkgLyA2ICtcbiAgICAgICAgICAgICAgICAgICAgJywnICtcbiAgICAgICAgICAgICAgICAgICAgKDIgKiBoKSAvIDMgK1xuICAgICAgICAgICAgICAgICAgICAnICcgK1xuICAgICAgICAgICAgICAgICAgICB3IC8gMiArXG4gICAgICAgICAgICAgICAgICAgICcsJyArXG4gICAgICAgICAgICAgICAgICAgIChoICogMikgLyAzICtcbiAgICAgICAgICAgICAgICAgICAgJyAnICtcbiAgICAgICAgICAgICAgICAgICAgKHcgKiAyKSAvIDMgK1xuICAgICAgICAgICAgICAgICAgICAnLCcgK1xuICAgICAgICAgICAgICAgICAgICBoXG4gICAgICAgICAgICApXG4gICAgICAgIHNldEF0dHJpYnV0ZXModDIsIGNsYXNzaWZpZXIuY29sb3JzWzJdLCB0ZXh0c1snMiddKVxuICAgICAgICAvL3RyaWFuZ2xlIHMwXG4gICAgICAgIGNvbnN0IHQwXyA9IGdcbiAgICAgICAgICAgIC5hcHBlbmQoJ3BvbHlnb24nKVxuICAgICAgICAgICAgLmF0dHIoXG4gICAgICAgICAgICAgICAgJ3BvaW50cycsXG4gICAgICAgICAgICAgICAgdyAvIDIgK1xuICAgICAgICAgICAgICAgICAgICAnLCcgK1xuICAgICAgICAgICAgICAgICAgICAoaCAqIDIpIC8gMyArXG4gICAgICAgICAgICAgICAgICAgICcgJyArXG4gICAgICAgICAgICAgICAgICAgICh3ICogNSkgLyA2ICtcbiAgICAgICAgICAgICAgICAgICAgJywnICtcbiAgICAgICAgICAgICAgICAgICAgKGggKiAyKSAvIDMgK1xuICAgICAgICAgICAgICAgICAgICAnICcgK1xuICAgICAgICAgICAgICAgICAgICAodyAqIDIpIC8gMyArXG4gICAgICAgICAgICAgICAgICAgICcsJyArXG4gICAgICAgICAgICAgICAgICAgIGggLyAzXG4gICAgICAgICAgICApXG4gICAgICAgIHNldEF0dHJpYnV0ZXModDBfLCBjbGFzc2lmaWVyLm1peENvbG9yc1swXSwgdGV4dHNbJ20xMiddKVxuICAgICAgICAvL3RyaWFuZ2xlIHMxXG4gICAgICAgIGNvbnN0IHQxXyA9IGdcbiAgICAgICAgICAgIC5hcHBlbmQoJ3BvbHlnb24nKVxuICAgICAgICAgICAgLmF0dHIoJ3BvaW50cycsIHcgLyAyICsgJywnICsgKGggKiAyKSAvIDMgKyAnICcgKyB3IC8gMyArICcsJyArIGggKyAnICcgKyAodyAqIDIpIC8gMyArICcsJyArIGgpXG4gICAgICAgIHNldEF0dHJpYnV0ZXModDFfLCBjbGFzc2lmaWVyLm1peENvbG9yc1sxXSwgdGV4dHNbJ20wMiddKVxuICAgICAgICAvL3RyaWFuZ2xlIHMyXG4gICAgICAgIGNvbnN0IHQyXyA9IGdcbiAgICAgICAgICAgIC5hcHBlbmQoJ3BvbHlnb24nKVxuICAgICAgICAgICAgLmF0dHIoXG4gICAgICAgICAgICAgICAgJ3BvaW50cycsXG4gICAgICAgICAgICAgICAgdyAvIDIgKyAnLCcgKyAoaCAqIDIpIC8gMyArICcgJyArIHcgLyA2ICsgJywnICsgKGggKiAyKSAvIDMgKyAnICcgKyB3IC8gMyArICcsJyArIGggLyAzXG4gICAgICAgICAgICApXG4gICAgICAgIHNldEF0dHJpYnV0ZXModDJfLCBjbGFzc2lmaWVyLm1peENvbG9yc1syXSwgdGV4dHNbJ20wMSddKVxuXG4gICAgICAgIC8vY2VudGVyXG4gICAgICAgIGlmICh0aGlzLmNlbnRlckNvZWZmaWNpZW50KSB7XG4gICAgICAgICAgICAvL1RPRE8gbWFrZSBpdCBhbiBoZXhhZ29uICFcbiAgICAgICAgICAgIGNvbnN0IGNlbnRlciA9IGdcbiAgICAgICAgICAgICAgICAuYXBwZW5kKCdjaXJjbGUnKVxuICAgICAgICAgICAgICAgIC5hdHRyKCdjeCcsIHcgLyAyKVxuICAgICAgICAgICAgICAgIC5hdHRyKCdjeScsIChoICogMikgLyAzKVxuICAgICAgICAgICAgICAgIC5hdHRyKCdyJywgKHRoaXMuY2VudGVyQ29lZmZpY2llbnQgKiBoKSAvIDMpXG4gICAgICAgICAgICBzZXRBdHRyaWJ1dGVzKGNlbnRlciwgY2xhc3NpZmllci5jZW50ZXJDb2xvciwgdGV4dHNbJ2NlbnRlciddKVxuICAgICAgICB9XG5cbiAgICAgICAgLypcbiAgICAgICAgbGV0IG1pZGRsZSwgbGVmdCwgdG9wLCByaWdodCwgbGVmdF8sIGJvdHRvbV8sIHJpZ2h0X1xuICAgICAgICBpZiAoIXRoaXMucmVhbCkge1xuXG4gICAgICAgICAgICAvLzAgbGVmdCB0cmlhbmdsZVxuICAgICAgICAgICAgbGVmdCA9IGcuYXBwZW5kKCdwb2x5Z29uJylcbiAgICAgICAgICAgICAgICAuYXR0cigncG9pbnRzJywgXCIwLFwiICsgaCArIFwiIFwiICsgKHcgLyAzKSArIFwiLFwiICsgaCArIFwiIFwiICsgKHcgLyA2KSArIFwiLFwiICsgKDIgKiBoIC8gMykpXG4gICAgICAgICAgICAvLzEgdG9wIHRyaWFuZ2xlXG4gICAgICAgICAgICB0b3AgPSBnLmFwcGVuZCgncG9seWdvbicpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3BvaW50cycsICh3IC8gMykgKyBcIixcIiArIChoIC8gMykgKyBcIiBcIiArICh3ICogMiAvIDMpICsgXCIsXCIgKyAoaCAvIDMpICsgXCIgXCIgKyAodyAvIDIpICsgXCIsMFwiKVxuICAgICAgICAgICAgLy8yIHJpZ2h0IHRyaWFuZ2xlXG4gICAgICAgICAgICByaWdodCA9IGcuYXBwZW5kKCdwb2x5Z29uJylcbiAgICAgICAgICAgICAgICAuYXR0cigncG9pbnRzJywgKHcgKiAyIC8gMykgKyBcIixcIiArIGggKyBcIiBcIiArIHcgKyBcIixcIiArIGggKyBcIiBcIiArICh3ICogNSAvIDYpICsgXCIsXCIgKyAoMiAqIGggLyAzKSlcbiAgICAgICAgICAgIC8vbWlkZGxlIHRyaWFuZ2xlXG4gICAgICAgICAgICBtaWRkbGUgPSBnLmFwcGVuZCgncG9seWdvbicpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3BvaW50cycsICh3IC8gMikgKyBcIixcIiArIChoIC8gMykgKyBcIiBcIiArICh3IC8gNCkgKyBcIixcIiArIChoICogNSAvIDYpICsgXCIgXCIgKyAoMyAqIHcgLyA0KSArIFwiLFwiICsgKGggKiA1IC8gNikpXG4gICAgICAgICAgICAvLzAxIGxlZnQgdHJhcGV6aXVtXG4gICAgICAgICAgICBsZWZ0XyA9IGcuYXBwZW5kKCdwb2x5Z29uJylcbiAgICAgICAgICAgICAgICAuYXR0cigncG9pbnRzJywgKHcgLyA2KSArIFwiLFwiICsgKGggKiAyIC8gMykgKyBcIiBcIiArICh3IC8gNCkgKyBcIixcIiArIChoICogNSAvIDYpICsgXCIgXCIgKyAodyAvIDIpICsgXCIsXCIgKyAoaCAvIDMpICsgXCIgXCIgKyAodyAvIDMpICsgXCIsXCIgKyAoaCAvIDMpKVxuICAgICAgICAgICAgLy8wMiBib3R0b20gdHJhcGV6aXVtXG4gICAgICAgICAgICBib3R0b21fID0gZy5hcHBlbmQoJ3BvbHlnb24nKVxuICAgICAgICAgICAgICAgIC5hdHRyKCdwb2ludHMnLCAodyAvIDMpICsgXCIsXCIgKyAoaCkgKyBcIiBcIiArICgyICogdyAvIDMpICsgXCIsXCIgKyAoaCkgKyBcIiBcIiArICh3ICogMyAvIDQpICsgXCIsXCIgKyAoaCAqIDUgLyA2KSArIFwiIFwiICsgKHcgLyA0KSArIFwiLFwiICsgKGggKiA1IC8gNikpXG4gICAgICAgICAgICAvLzEyIHJpZ2h0IHRyYXBleml1bVxuICAgICAgICAgICAgcmlnaHRfID0gZy5hcHBlbmQoJ3BvbHlnb24nKVxuICAgICAgICAgICAgICAgIC5hdHRyKCdwb2ludHMnLCAodyAvIDIpICsgXCIsXCIgKyAoaCAvIDMpICsgXCIgXCIgKyAodyAqIDMgLyA0KSArIFwiLFwiICsgKGggKiA1IC8gNikgKyBcIiBcIiArICh3ICogNSAvIDYpICsgXCIsXCIgKyAoaCAqIDIgLyAzKSArIFwiIFwiICsgKHcgKiAyIC8gMykgKyBcIixcIiArIChoIC8gMykpXG5cbiAgICAgICAgfSBlbHNlIHtcblxuICAgICAgICAgICAgLy9taWRkbGUgdHJpYW5nbGVcbiAgICAgICAgICAgIG1pZGRsZSA9IGcuYXBwZW5kKCdwb2x5Z29uJylcbiAgICAgICAgICAgICAgICAuYXR0cigncG9pbnRzJywgKHcgLyAyKSArIFwiLDAgMCxcIiArIGggKyBcIiBcIiArIHcgKyBcIixcIiArIGgpXG5cbiAgICAgICAgICAgIC8vZHJhdyB0cmFwZXppdW1cbiAgICAgICAgICAgIC8vZHJhdyBsYXJnZSB0cmFwZXppdW0gZmlyc3RcbiAgICAgICAgICAgIGZvciAobGV0IGlfID0gMjsgaV8gPj0gMDsgaV8tLSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGkgPSB0aGlzLmNsYXNzaWZpZXIubG93SW5kZXhbaV9dXG4gICAgICAgICAgICAgICAgY29uc3QgciA9IHRoaXMuY2xhc3NpZmllci5sb3dUaHJlc2hvbGRbaV1cbiAgICAgICAgICAgICAgICBpZiAoaSA9PSAyKVxuICAgICAgICAgICAgICAgICAgICAvLzAxIGxlZnQgdHJhcGV6aXVtXG4gICAgICAgICAgICAgICAgICAgIGxlZnRfID0gZy5hcHBlbmQoJ3BvbHlnb24nKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ3BvaW50cycsIHcgLyAyICsgXCIsMCAwLFwiICsgaCArIFwiIFwiICsgdyAqIHIgKyBcIixcIiArIGggKyBcIiBcIiArIHcgKiAoMSArIHIpIC8gMiArIFwiLFwiICsgciAqIGgpXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoaSA9PSAxKVxuICAgICAgICAgICAgICAgICAgICAvLzAyIGJvdHRvbSB0cmFwZXppdW1cbiAgICAgICAgICAgICAgICAgICAgYm90dG9tXyA9IGcuYXBwZW5kKCdwb2x5Z29uJylcbiAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCdwb2ludHMnLCBcIjAsXCIgKyBoICsgXCIgXCIgKyB3ICsgXCIsXCIgKyBoICsgXCIgXCIgKyB3ICogKDEgLSByIC8gMikgKyBcIixcIiArIGggKiAoMSAtIHIpICsgXCIgXCIgKyByICogdyAvIDIgKyBcIixcIiArIGggKiAoMSAtIHIpKVxuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgLy8xMiByaWdodCB0cmFwZXppdW1cbiAgICAgICAgICAgICAgICAgICAgcmlnaHRfID0gZy5hcHBlbmQoJ3BvbHlnb24nKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ3BvaW50cycsIHcgKyBcIixcIiArIGggKyBcIiBcIiArIHcgLyAyICsgXCIsMCBcIiArIHcgKiAoMSAtIHIpIC8gMiArIFwiLFwiICsgaCAqIHIgKyBcIiBcIiArIHcgKiAoMSAtIHIpICsgXCIsXCIgKyBoKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvL2RyYXcgdHJpYW5nbGVzXG4gICAgICAgICAgICAvL2RyYXcgbGFyZ2UgdHJpYW5nbGVzIGZpcnN0XG4gICAgICAgICAgICBmb3IgKGxldCBpXyA9IDI7IGlfID49IDA7IGlfLS0pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpID0gdGhpcy5jbGFzc2lmaWVyLmhpZ2hJbmRleFtpX11cbiAgICAgICAgICAgICAgICBjb25zdCByID0gdGhpcy5jbGFzc2lmaWVyLmhpZ2hUaHJlc2hvbGRbaV1cblxuICAgICAgICAgICAgICAgIGlmIChpID09IDIpXG4gICAgICAgICAgICAgICAgICAgIC8vMiByaWdodCB0cmlhbmdsZVxuICAgICAgICAgICAgICAgICAgICByaWdodCA9IGcuYXBwZW5kKCdwb2x5Z29uJylcbiAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCdwb2ludHMnLCB3ICsgXCIsXCIgKyBoICsgXCIgXCIgKyB3ICogciArIFwiLFwiICsgaCArIFwiIFwiICsgdyAqICgxICsgcikgLyAyICsgXCIsXCIgKyBoICogcilcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChpID09IDEpXG4gICAgICAgICAgICAgICAgICAgIC8vMSB0b3AgdHJpYW5nbGVcbiAgICAgICAgICAgICAgICAgICAgdG9wID0gZy5hcHBlbmQoJ3BvbHlnb24nKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ3BvaW50cycsICh3IC8gMikgKyBcIiwwIFwiICsgdyAqIHIgLyAyICsgXCIsXCIgKyBoICogKDEgLSByKSArIFwiIFwiICsgdyAqICgxIC0gciAvIDIpICsgXCIsXCIgKyBoICogKDEgLSByKSlcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIC8vMCBsZWZ0IHRyaWFuZ2xlXG4gICAgICAgICAgICAgICAgICAgIGxlZnQgPSBnLmFwcGVuZCgncG9seWdvbicpXG4gICAgICAgICAgICAgICAgICAgICAgICAuYXR0cigncG9pbnRzJywgXCIwLFwiICsgaCArIFwiIFwiICsgdyAqICgxIC0gcikgKyBcIixcIiArIGggKyBcIiBcIiArIHcgKiAoMSAtIHIpIC8gMiArIFwiLFwiICsgaCAqIHIpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSovXG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBTdHlsZSB9IGZyb20gJy4uL2NvcmUvU3R5bGUuanMnXG5cbi8qKiBAdHlwZWRlZiB7XCJmbGFnXCJ8XCJwaWVjaGFydFwifFwicmluZ1wifFwic2VnbWVudFwifFwicmFkYXJcInxcImFnZXB5cmFtaWRcInxcImhhbGZ0b25lXCJ9IENvbXBvc2l0aW9uVHlwZSAqL1xuXG4vKipcbiAqIEEgc3R5bGUgc2hvd2luZyB0aGUgY29tcG9zaXRpb24gb2YgYSB0b3RhbCBpbiBkaWZmZXJlbnQgY2F0ZWdvcmllcywgd2l0aCBkaWZmZXJlbnQgY29sb3IgaHVlcy5cbiAqIEl0IGNvbnNpc3RzIG9mIGEgc3ltYm9sIHdpdGggZGlmZmVyZW50IHBhcnRzLCB3aG9zZSBzaXplIHJlZmxlY3QgdGhlIHByb3BvcnRpb24gb2YgdGhlIGNvcnJlc3BvbmRpbmcgY2F0ZWdvcnkuXG4gKiBGb3IgYSBsaXN0IG9mIHN1cHBvcnRlZCBzeW1ib2xzLCBAc2VlIENvbXBvc2l0aW9uVHlwZVxuICogVGhlIHN5bWJvbCBjYW4gYmUgc2NhbGVkIGRlcGVuZGluZyBvbiB0aGUgY2VsbCBpbXBvcnRhbmNlLlxuICpcbiAqIEBtb2R1bGUgc3R5bGVcbiAqIEBhdXRob3IgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIENvbXBvc2l0aW9uU3R5bGUgZXh0ZW5kcyBTdHlsZSB7XG4gICAgLyoqIEBwYXJhbSB7b2JqZWN0fSBvcHRzICovXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKVxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgZGljdGlvbmFyeSAoc3RyaW5nIC0+IGNvbG9yKSB3aGljaCBnaXZlIHRoZSBjb2xvciBvZiBlYWNoIGNhdGVnb3J5LlxuICAgICAgICAgKiBAdHlwZSB7b2JqZWN0fSAqL1xuICAgICAgICB0aGlzLmNvbG9yID0gb3B0cy5jb2xvclxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgdHlwZSBvZiBkZWNvbXBvc2l0aW9uIHN5bWJvbCBvZiBhIGNlbGwsIEBzZWUgQ29tcG9zaXRpb25UeXBlXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXQuanNcIikuQ2VsbCxudW1iZXIsIG51bWJlcixvYmplY3QpOkNvbXBvc2l0aW9uVHlwZX0gKi9cbiAgICAgICAgdGhpcy50eXBlID0gb3B0cy50eXBlIHx8ICgoKSA9PiAnZmxhZycpIC8vKGMscix6LHZzKSA9PiB7fVxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgc2l6ZSBvZiBhIGNlbGwgaW4gZ2VvZ3JhcGhpY2FsIHVuaXQuXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwsIG51bWJlciwgbnVtYmVyLCBvYmplY3QpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy5zaXplID0gb3B0cy5zaXplIHx8ICgoYywgcikgPT4gcikgLy8oYyxyLHosdnMpID0+IHt9XG5cbiAgICAgICAgLyoqIEZvciBzdHlsZSB0eXBlcyB3aXRoIHN0cmlwZXMgKGZsYWcsIHNlZ21lbnQpLCB0aGUgb3JpZW50YXRpb24gb2YgdGhlIHN0cmlwZXMgKDAgZm9yIGhvcml6b250YWwsIG90aGVyIGZvciB2ZXJ0aWNhbCkuXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXQuanNcIikuQ2VsbCxudW1iZXIsbnVtYmVyLG9iamVjdCk6bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLnN0cmlwZXNPcmllbnRhdGlvbiA9IG9wdHMuc3RyaXBlc09yaWVudGF0aW9uIHx8ICgoKSA9PiAwKSAvLyhjLHIseix2cykgPT4gLi4uXG5cbiAgICAgICAgLyoqIFRoZSBmdW5jdGlvbiBzcGVjaWZ5aW5nIGFuIG9mZnNldCBhbmdsZSBmb3IgYSByYWRhciwgaGFsZnRvbmUgb3IgcGllIGNoYXJ0IHN0eWxlLlxuICAgICAgICAgKiBUaGUgYW5nbGUgaXMgc3BlY2lmaWVkIGluIGRlZ3JlZS4gVGhlIHJvdGF0aW9uIGlzIGFudGktY2xvY2t3aXNlLlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0LmpzXCIpLkNlbGwsbnVtYmVyLG51bWJlcixvYmplY3QpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy5vZmZzZXRBbmdsZSA9IG9wdHMub2Zmc2V0QW5nbGUgfHwgKCgpID0+IDApIC8vKGMscix6LHZzKSA9PiAuLi5cblxuICAgICAgICAvKiogVGhlIGZ1bmN0aW9uIHNwZWNpZnlpbmcgdGhlIGhlaWdodCBvZiB0aGUgYWdlIHB5cmFtaWQsIGluIGdlbyB1bml0LlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0LmpzXCIpLkNlbGwsbnVtYmVyLG51bWJlcixvYmplY3QpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy5hZ2VQeXJhbWlkSGVpZ2h0ID0gb3B0cy5hZ2VQeXJhbWlkSGVpZ2h0IHx8ICgoYywgcikgPT4gcikgLy8oYyxyLHosdnMpID0+IC4uLlxuXG4gICAgICAgIC8qKiBGb3IgcGllIGNoYXJ0LCB0aGlzIGlzIHBhcmFtZXRlciBmb3IgaW50ZXJuYWwgcmFkaXVzLCBzbyB0aGF0IHRoZSBwaWUgY2hhcnQgbG9va3MgbGlrZSBhIGRvbnV0LlxuICAgICAgICAgKiAwIGZvciBub3JtYWwgcGllIGNoYXJ0cywgMC41IHRvIGVtcHR5IGhhbGYgb2YgdGhlIHJhZGl1cy5cbiAgICAgICAgICogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgdGhpcy5waWVDaGFydEludGVybmFsUmFkaXVzRmFjdG9yID0gb3B0cy5waWVDaGFydEludGVybmFsUmFkaXVzRmFjdG9yIHx8IDBcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEcmF3IGNlbGxzIGFzIHNxdWFyZXMgZGVwZW5kaW5nIG9uIHRoZWlyIHZhbHVlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0LmpzXCIpLkNlbGw+fSBjZWxsc1xuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29yZS9HZW9DYW52YXMuanNcIikuR2VvQ2FudmFzfSBnZW9DYW52YXNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVzb2x1dGlvblxuICAgICAqL1xuICAgIGRyYXcoY2VsbHMsIGdlb0NhbnZhcywgcmVzb2x1dGlvbikge1xuICAgICAgICAvL2ZpbHRlclxuICAgICAgICBpZiAodGhpcy5maWx0ZXIpIGNlbGxzID0gY2VsbHMuZmlsdGVyKHRoaXMuZmlsdGVyKVxuXG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IHogPSBnZW9DYW52YXMudmlldy56XG4gICAgICAgIGNvbnN0IGN0eCA9IGdlb0NhbnZhcy5vZmZzY3JlZW5DdHhcblxuICAgICAgICAvL2dldCB2aWV3IHNjYWxlXG4gICAgICAgIGNvbnN0IHZpZXdTY2FsZSA9IHRoaXMudmlld1NjYWxlID8gdGhpcy52aWV3U2NhbGUoY2VsbHMsIHJlc29sdXRpb24sIHopIDogdW5kZWZpbmVkXG5cbiAgICAgICAgLy9uYiBjYXRlZ29yaWVzIC0gdXNlZCBmb3IgcmFkYXIgYW5kIGFnZXB5cmFtaWRcbiAgICAgICAgY29uc3QgbmJDYXQgPSBPYmplY3QuZW50cmllcyh0aGlzLmNvbG9yKS5sZW5ndGhcblxuICAgICAgICAvL2RyYXcgY2FsbHNcbiAgICAgICAgZm9yIChsZXQgY2VsbCBvZiBjZWxscykge1xuICAgICAgICAgICAgLy9zaXplXG4gICAgICAgICAgICBjb25zdCBzRyA9IHRoaXMuc2l6ZSA/IHRoaXMuc2l6ZShjZWxsLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpIDogcmVzb2x1dGlvblxuICAgICAgICAgICAgaWYgKCFzRykgY29udGludWVcblxuICAgICAgICAgICAgLy9nZXQgb2Zmc2V0XG4gICAgICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLm9mZnNldChjZWxsLCByZXNvbHV0aW9uLCB6KVxuXG4gICAgICAgICAgICAvL2dldCBzeW1ib2wgdHlwZVxuICAgICAgICAgICAgY29uc3QgdHlwZV8gPSB0aGlzLnR5cGUgPyB0aGlzLnR5cGUoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6ICdmbGFnJ1xuXG4gICAgICAgICAgICAvL2NvbXB1dGUgY2VudGVyIHBvc2l0aW9uXG4gICAgICAgICAgICBjb25zdCB4YyA9IGNlbGwueCArIG9mZnNldC5keCArICh0eXBlXyA9PT0gJ2FnZXB5cmFtaWQnID8gMCA6IHJlc29sdXRpb24gKiAwLjUpXG4gICAgICAgICAgICBjb25zdCB5YyA9IGNlbGwueSArIG9mZnNldC5keSArICh0eXBlXyA9PT0gJ2FnZXB5cmFtaWQnID8gMCA6IHJlc29sdXRpb24gKiAwLjUpXG5cbiAgICAgICAgICAgIC8vY29tcHV0ZSBvZmZzZXQgYW5nbGUsIHdoZW4gcmVsZXZhbnRcbiAgICAgICAgICAgIGNvbnN0IG9mZkFuZyA9IHRoaXMub2Zmc2V0QW5nbGVcbiAgICAgICAgICAgICAgICA/ICh0aGlzLm9mZnNldEFuZ2xlKGNlbGwsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgKiBNYXRoLlBJKSAvIDE4MFxuICAgICAgICAgICAgICAgIDogMFxuXG4gICAgICAgICAgICBpZiAodHlwZV8gPT09ICdhZ2VweXJhbWlkJyB8fCB0eXBlXyA9PT0gJ3JhZGFyJyB8fCB0eXBlXyA9PT0gJ2hhbGZ0b25lJykge1xuICAgICAgICAgICAgICAgIC8vZ2V0IGNlbGwgY2F0ZWdvcnkgbWF4IHZhbHVlXG4gICAgICAgICAgICAgICAgbGV0IG1heFZhbCA9IC1JbmZpbml0eVxuICAgICAgICAgICAgICAgIGZvciAobGV0IGtleSBvZiBPYmplY3Qua2V5cyh0aGlzLmNvbG9yKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2ID0gK2NlbGxba2V5XVxuICAgICAgICAgICAgICAgICAgICBpZiAodiA+IG1heFZhbCkgbWF4VmFsID0gdlxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vY3VtdWxcbiAgICAgICAgICAgICAgICBsZXQgY3VtdWwgPSAwXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVfID09PSAnYWdlcHlyYW1pZCcgJiYgdGhpcy5hZ2VQeXJhbWlkSGVpZ2h0KVxuICAgICAgICAgICAgICAgICAgICBjdW11bCA9IChyZXNvbHV0aW9uIC0gdGhpcy5hZ2VQeXJhbWlkSGVpZ2h0KGNlbGwsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkpIC8gMlxuICAgICAgICAgICAgICAgIGlmICh0eXBlXyA9PT0gJ3JhZGFyJyB8fCB0eXBlXyA9PT0gJ2hhbGZ0b25lJykgY3VtdWwgPSBNYXRoLlBJIC8gMiArIG9mZkFuZ1xuXG4gICAgICAgICAgICAgICAgLy9jb21wdXRlIHRoZSBpbmNyZW1lbnQsIHdoaWNoIGlzIHRoZSB2YWx1ZSB0byBpbmNyZW1lbnQgdGhlIGN1bXVsIGZvciBlYWNoIGNhdGVnb3J5XG4gICAgICAgICAgICAgICAgY29uc3QgaW5jciA9XG4gICAgICAgICAgICAgICAgICAgIHR5cGVfID09PSAnYWdlcHlyYW1pZCdcbiAgICAgICAgICAgICAgICAgICAgICAgID8gKHRoaXMuYWdlUHlyYW1pZEhlaWdodFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyB0aGlzLmFnZVB5cmFtaWRIZWlnaHQoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiByZXNvbHV0aW9uKSAvIG5iQ2F0XG4gICAgICAgICAgICAgICAgICAgICAgICA6IHR5cGVfID09PSAncmFkYXInIHx8IHR5cGVfID09PSAnaGFsZnRvbmUnXG4gICAgICAgICAgICAgICAgICAgICAgICA/ICgyICogTWF0aC5QSSkgLyBuYkNhdFxuICAgICAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICBpZiAoaW5jciA9PT0gdW5kZWZpbmVkKSB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgc3ltYm9sIHR5cGU6JyArIHR5cGVfKVxuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgW2NvbHVtbiwgY29sb3JdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuY29sb3IpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlXyA9PT0gJ2FnZXB5cmFtaWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvL3NldCBjYXRlZ29yeSBjb2xvclxuICAgICAgICAgICAgICAgICAgICAgICAgY3R4LmZpbGxTdHlsZSA9IGNvbG9yXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vZ2V0IGNhdGVnb3J5IHZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSBjZWxsW2NvbHVtbl1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy9jb21wdXRlIGNhdGVnb3J5IGxlbmd0aCAtIGluIGdlb1xuICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3RyA9IChzRyAqIHZhbCkgLyBtYXhWYWxcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy9kcmF3IGJhclxuICAgICAgICAgICAgICAgICAgICAgICAgY3R4LmZpbGxSZWN0KHhjICsgKHJlc29sdXRpb24gLSB3RykgLyAyLCB5YyArIGN1bXVsLCB3RywgaW5jcilcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy9uZXh0IGhlaWdodFxuICAgICAgICAgICAgICAgICAgICAgICAgY3VtdWwgKz0gaW5jclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVfID09PSAncmFkYXInKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvL3NldCBjYXRlZ29yeSBjb2xvclxuICAgICAgICAgICAgICAgICAgICAgICAgY3R4LmZpbGxTdHlsZSA9IGNvbG9yXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vZ2V0IGNhdGVncm95IHZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSBjZWxsW2NvbHVtbl1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy9jb21wdXRlIGNhdGVnb3J5IHJhZGl1cyAtIGluIGdlb1xuICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnN0IHJHID0gdGhpcy5yYWRpdXModmFsLCByLCBzdGF0LCBjZWxsU3RhdCwgeilcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJHID0gKHNHIC8gMikgKiBNYXRoLnNxcnQodmFsIC8gbWF4VmFsKVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2RyYXcgYW5ndWxhciBzZWN0b3JcbiAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgICAgICAgICAgICAgY3R4Lm1vdmVUbyh4YywgeWMpXG4gICAgICAgICAgICAgICAgICAgICAgICBjdHguYXJjKHhjLCB5YywgckcsIGN1bXVsIC0gaW5jciwgY3VtdWwpXG4gICAgICAgICAgICAgICAgICAgICAgICBjdHgubGluZVRvKHhjLCB5YylcbiAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5maWxsKClcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy9uZXh0IGFuZ3VsYXIgc2VjdG9yXG4gICAgICAgICAgICAgICAgICAgICAgICBjdW11bCArPSBpbmNyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZV8gPT09ICdoYWxmdG9uZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vc2V0IGNhdGVnb3J5IGNvbG9yXG4gICAgICAgICAgICAgICAgICAgICAgICBjdHguZmlsbFN0eWxlID0gY29sb3JcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy9nZXQgY2F0ZWdyb3kgdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IGNlbGxbY29sdW1uXVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2NvbXB1dGUgY2F0ZWdvcnkgcmFkaXVzIC0gaW4gZ2VvXG4gICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJHID0gc0cgKiAwLjMzMyAqIE1hdGguc3FydCh2YWwgLyBtYXhWYWwpXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vZHJhdyBjaXJjbGVcbiAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgICAgICAgICAgICAgY3R4LmFyYyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4YyArIHJlc29sdXRpb24gKiAwLjI1ICogTWF0aC5jb3MoY3VtdWwpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHljICsgcmVzb2x1dGlvbiAqIDAuMjUgKiBNYXRoLnNpbihjdW11bCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgckcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICogTWF0aC5QSVxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgY3R4LmZpbGwoKVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL25leHQgYW5ndWxhciBzZWN0b3JcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1bXVsICs9IGluY3JcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCBzeW1ib2wgdHlwZTonICsgdHlwZV8pXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vY29tcHV0ZSB0b3RhbFxuICAgICAgICAgICAgICAgIGxldCB0b3RhbCA9IDBcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBjb2x1bW4gb2YgT2JqZWN0LmtleXModGhpcy5jb2xvcikpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdiA9ICtjZWxsW2NvbHVtbl1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCF2KSBjb250aW51ZVxuICAgICAgICAgICAgICAgICAgICB0b3RhbCArPSB2XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghdG90YWwgfHwgaXNOYU4odG90YWwpKSBjb250aW51ZVxuXG4gICAgICAgICAgICAgICAgLy9kcmF3IGRlY29tcG9zaXRpb24gc3ltYm9sXG4gICAgICAgICAgICAgICAgbGV0IGN1bXVsID0gMFxuICAgICAgICAgICAgICAgIGNvbnN0IGQgPSByZXNvbHV0aW9uICogKDEgLSBzRyAvIHJlc29sdXRpb24pICogMC41XG4gICAgICAgICAgICAgICAgY29uc3Qgb3JpID0gdGhpcy5zdHJpcGVzT3JpZW50YXRpb24oY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKVxuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgW2NvbHVtbiwgY29sb3JdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuY29sb3IpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vZ2V0IHNoYXJlXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlID0gY2VsbFtjb2x1bW5dIC8gdG90YWxcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzaGFyZSB8fCBpc05hTihzaGFyZSkpIGNvbnRpbnVlXG5cbiAgICAgICAgICAgICAgICAgICAgLy9zZXQgY29sb3JcbiAgICAgICAgICAgICAgICAgICAgY3R4LmZpbGxTdHlsZSA9IGNvbG9yXG5cbiAgICAgICAgICAgICAgICAgICAgLy9kcmF3IHN5bWJvbCBwYXJ0XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlXyA9PT0gJ2ZsYWcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvL2RyYXcgZmxhZyBzdHJpcGVcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcmkgPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaG9yaXpvbnRhbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5maWxsUmVjdChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbC54ICsgZCArIG9mZnNldC5keCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbC55ICsgZCArIGN1bXVsICogc0cgKyBvZmZzZXQuZHksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNHLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZSAqIHNHXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3ZlcnRpY2FsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LmZpbGxSZWN0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxsLnggKyBkICsgY3VtdWwgKiBzRyArIG9mZnNldC5keCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbC55ICsgZCArIG9mZnNldC5keSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmUgKiBzRyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0dcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZV8gPT09ICdwaWVjaGFydCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vZHJhdyBwaWUgY2hhcnQgYW5ndWxhciBzZWN0b3JcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy9jb21wdXRlIGFuZ2xlc1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYTEgPSBjdW11bCAqIDIgKiBNYXRoLlBJXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhMiA9IChjdW11bCArIHNoYXJlKSAqIDIgKiBNYXRoLlBJXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vZHJhd1xuICAgICAgICAgICAgICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICAgICAgICAgICAgICBjdHgubW92ZVRvKHhjLCB5YylcbiAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5hcmMoeGMsIHljLCBzRyAqIDAuNSwgYTEgKyBvZmZBbmcsIGEyICsgb2ZmQW5nKVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucGllQ2hhcnRJbnRlcm5hbFJhZGl1c0ZhY3RvcilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHguYXJjKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4YyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNHICogMC41ICogdGhpcy5waWVDaGFydEludGVybmFsUmFkaXVzRmFjdG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhMSArIG9mZkFuZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYTIgKyBvZmZBbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICBjdHguY2xvc2VQYXRoKClcbiAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5maWxsKClcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlXyA9PT0gJ3JpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvL2RyYXcgcmluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICAgICAgICAgICAgICBjdHguYXJjKHhjLCB5YywgTWF0aC5zcXJ0KDEgLSBjdW11bCkgKiBzRyAqIDAuNSwgMCwgMiAqIE1hdGguUEkpXG4gICAgICAgICAgICAgICAgICAgICAgICBjdHguZmlsbCgpXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZV8gPT09ICdzZWdtZW50Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9kcmF3IHNlZ21lbnQgc2VjdGlvbnNcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdHID0gKHNHICogc0cpIC8gcmVzb2x1dGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9yaSA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9ob3Jpem9udGFsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LmZpbGxSZWN0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxsLnggKyBvZmZzZXQuZHgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGwueSArIChyZXNvbHV0aW9uIC0gd0cpIC8gMiArIGN1bXVsICogd0cgKyBvZmZzZXQuZHksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlICogd0dcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdmVydGljYWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHguZmlsbFJlY3QoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGwueCArIGN1bXVsICogcmVzb2x1dGlvbiArIG9mZnNldC5keCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbC55ICsgKHJlc29sdXRpb24gLSB3RykgLyAyICsgb2Zmc2V0LmR5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZSAqIHJlc29sdXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdHXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIHN5bWJvbCB0eXBlOicgKyB0eXBlXylcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGN1bXVsICs9IHNoYXJlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy91cGRhdGUgbGVnZW5kc1xuICAgICAgICB0aGlzLnVwZGF0ZUxlZ2VuZHMoeyBzdHlsZTogdGhpcywgcmVzb2x1dGlvbjogcmVzb2x1dGlvbiwgejogeiwgdmlld1NjYWxlOiB2aWV3U2NhbGUgfSlcbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IFN0eWxlIH0gZnJvbSAnLi4vY29yZS9TdHlsZS5qcydcbmltcG9ydCB7IHJhbmRvbU5vcm1hbCB9IGZyb20gJ2QzLXJhbmRvbSdcbmltcG9ydCB7IGNoZWNrV2ViR0xTdXBwb3J0LCBtYWtlV2ViR0xDYW52YXMgfSBmcm9tICcuLi91dGlscy93ZWJHTFV0aWxzLmpzJ1xuaW1wb3J0IHsgV2ViR0xTcXVhcmVDb2xvcmluZyB9IGZyb20gJy4uL3V0aWxzL1dlYkdMU3F1YXJlQ29sb3JpbmcuanMnXG5pbXBvcnQgeyBjb2xvciB9IGZyb20gJ2QzLWNvbG9yJ1xuXG4vKipcbiAqXG4gKiBAbW9kdWxlIHN0eWxlXG4gKiBAYXV0aG9yIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBEb3REZW5zaXR5U3R5bGUgZXh0ZW5kcyBTdHlsZSB7XG4gICAgLyoqIEBwYXJhbSB7b2JqZWN0fSBvcHRzICovXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKVxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgbnVtYmVyIG9mIGRvdHMgZm9yIGEgY2VsbCB2YWx1ZS5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbCwgbnVtYmVyLCBudW1iZXIsIG9iamVjdCk6bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLmRvdE51bWJlciA9IG9wdHMuZG90TnVtYmVyIHx8ICgoY2VsbCwgcmVzb2x1dGlvbikgPT4gcmVzb2x1dGlvbiAvIDEwMCkgLy8oYyxyLHosdnMpID0+IHt9XG5cbiAgICAgICAgLyoqIFRoZSBjb2xvciBvZiB0aGUgZG90cy4gU2FtZSBjb2xvciBmb3IgYWxsIGRvdHMgd2l0aGluIGEgY2VsbC5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbCwgbnVtYmVyLCBudW1iZXIsIG9iamVjdCk6c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLmNvbG9yID0gb3B0cy5jb2xvciB8fCAoKCkgPT4gJyNGRjU3MzMnKSAvLyhjLHIseix2cykgPT4ge31cblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIHNpemUgb2YgdGhlIGRvdHMsIGluIGdlbyB1bml0LiBTYW1lIHNpemUgZm9yIGFsbCBjZWxscy5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG51bWJlciwgbnVtYmVyLG9iamVjdCk6bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLmRvdFNpemUgPSBvcHRzLmRvdFNpemUgfHwgKChyZXNvbHV0aW9uLCB6KSA9PiAxLjUgKiB6KSAvLyhjLHIseix2cykgPT4ge31cblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIHNpZ21hIG9mIHRoZSBkb3RzIGRpc3RyaWJ1dGlvbi4gU2FtZSB2YWx1ZSBmb3IgYWxsIGNlbGxzLlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyLCBudW1iZXIsb2JqZWN0KTpudW1iZXJ9ICovXG4gICAgICAgIHRoaXMuc2lnbWEgPSBvcHRzLnNpZ21hIHx8ICgocmVzb2x1dGlvbiwgeikgPT4gcmVzb2x1dGlvbiAvIDIpIC8vKGMscix6LHZzKSA9PiB7fVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERyYXcgY2VsbHMgYXMgdGV4dC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7QXJyYXkuPGltcG9ydChcIi4uL2NvcmUvRGF0YXNldFwiKS5DZWxsPn0gY2VsbHNcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvcmUvR2VvQ2FudmFzXCIpLkdlb0NhbnZhc30gZ2VvQ2FudmFzXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJlc29sdXRpb25cbiAgICAgKi9cbiAgICBkcmF3KGNlbGxzLCBnZW9DYW52YXMsIHJlc29sdXRpb24pIHtcbiAgICAgICAgLy9maWx0ZXJcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyKSBjZWxscyA9IGNlbGxzLmZpbHRlcih0aGlzLmZpbHRlcilcblxuICAgICAgICAvL1xuICAgICAgICBjb25zdCB6ID0gZ2VvQ2FudmFzLnZpZXcuelxuXG4gICAgICAgIC8vZ2V0IHZpZXcgc2NhbGVcbiAgICAgICAgY29uc3Qgdmlld1NjYWxlID0gdGhpcy52aWV3U2NhbGUgPyB0aGlzLnZpZXdTY2FsZShjZWxscywgcmVzb2x1dGlvbiwgeikgOiB1bmRlZmluZWRcblxuICAgICAgICAvL2dldCBzaXplXG4gICAgICAgIGNvbnN0IHNHZW8gPSB0aGlzLmRvdFNpemUgPyB0aGlzLmRvdFNpemUocmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IHpcblxuICAgICAgICAvL21ha2UgcmFuZG9tIGZ1bmN0aW9uXG4gICAgICAgIGNvbnN0IHNpZyA9IHRoaXMuc2lnbWEgPyB0aGlzLnNpZ21hKHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgOiByZXNvbHV0aW9uICogMC40XG4gICAgICAgIGNvbnN0IHJhbmQgPSByYW5kb21Ob3JtYWwoMCwgc2lnKVxuXG4gICAgICAgIGNvbnN0IGN0eCA9IGdlb0NhbnZhcy5vZmZzY3JlZW5DdHhcblxuICAgICAgICBpZiAoY2hlY2tXZWJHTFN1cHBvcnQoKSkge1xuICAgICAgICAgICAgLy9jcmVhdGUgY2FudmFzIGFuZCB3ZWJnbCByZW5kZXJlclxuICAgICAgICAgICAgY29uc3QgY3ZXR0wgPSBtYWtlV2ViR0xDYW52YXMoZ2VvQ2FudmFzLncgKyAnJywgZ2VvQ2FudmFzLmggKyAnJylcbiAgICAgICAgICAgIGlmICghY3ZXR0wpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdObyB3ZWJHTCcpXG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vY3JlYXRlIHdlYkdMIHByb2dyYW1cbiAgICAgICAgICAgIGNvbnN0IHByb2cgPSBuZXcgV2ViR0xTcXVhcmVDb2xvcmluZyhjdldHTC5nbCwgc0dlbyAvIHopXG5cbiAgICAgICAgICAgIGNvbnN0IHIyID0gcmVzb2x1dGlvbiAvIDJcblxuICAgICAgICAgICAgZm9yIChsZXQgY2VsbCBvZiBjZWxscykge1xuICAgICAgICAgICAgICAgIC8vZ2V0IGNvbG9yXG4gICAgICAgICAgICAgICAgY29uc3QgY29sID0gdGhpcy5jb2xvcihjZWxsLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpXG4gICAgICAgICAgICAgICAgaWYgKCFjb2wgfHwgY29sID09PSAnbm9uZScpIGNvbnRpbnVlXG5cbiAgICAgICAgICAgICAgICAvL251bWJlciBvZiBkb3RzXG4gICAgICAgICAgICAgICAgY29uc3QgZG90TnVtYmVyID0gdGhpcy5kb3ROdW1iZXIoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKVxuXG4gICAgICAgICAgICAgICAgLy9nZXQgb2Zmc2V0XG4gICAgICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5vZmZzZXQoY2VsbCwgcmVzb2x1dGlvbiwgeilcblxuICAgICAgICAgICAgICAgIC8vY2VsbCBjZW50ZXJcbiAgICAgICAgICAgICAgICBjb25zdCBjeCA9IGNlbGwueCArIG9mZnNldC5keCArIHIyXG4gICAgICAgICAgICAgICAgY29uc3QgY3kgPSBjZWxsLnkgKyBvZmZzZXQuZHkgKyByMlxuXG4gICAgICAgICAgICAgICAgLy9jb252ZXJ0IGNvbG9yXG4gICAgICAgICAgICAgICAgY29uc3QgY2MgPSBjb2xvcihjb2wpXG4gICAgICAgICAgICAgICAgaWYgKCFjYykgcmV0dXJuXG5cbiAgICAgICAgICAgICAgICAvL3JhbmRvbSBwb2ludHNcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8PSBkb3ROdW1iZXI7IGkrKylcbiAgICAgICAgICAgICAgICAgICAgcHJvZy5hZGRQb2ludERhdGEyKGN4ICsgcmFuZCgpLCBjeSArIHJhbmQoKSwgY2MuciwgY2MuZywgY2MuYiwgY2Mub3BhY2l0eSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy9kcmF3XG4gICAgICAgICAgICBwcm9nLmRyYXcoZ2VvQ2FudmFzLmdldFdlYkdMVHJhbnNmb3JtKCkpXG5cbiAgICAgICAgICAgIC8vZHJhdyBpbiBjYW52YXMgZ2VvXG4gICAgICAgICAgICBnZW9DYW52YXMuaW5pdENhbnZhc1RyYW5zZm9ybSgpXG4gICAgICAgICAgICBjdHguZHJhd0ltYWdlKGN2V0dMLmNhbnZhcywgMCwgMClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZvciAobGV0IGNlbGwgb2YgY2VsbHMpIHtcbiAgICAgICAgICAgICAgICAvL2dldCBjb2xvclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbCA9IHRoaXMuY29sb3IoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKVxuICAgICAgICAgICAgICAgIGlmICghY29sIHx8IGNvbCA9PT0gJ25vbmUnKSBjb250aW51ZVxuICAgICAgICAgICAgICAgIC8vc2V0IGNvbG9yXG4gICAgICAgICAgICAgICAgY3R4LmZpbGxTdHlsZSA9IGNvbFxuXG4gICAgICAgICAgICAgICAgLy9udW1iZXIgb2YgZG90c1xuICAgICAgICAgICAgICAgIGNvbnN0IGRvdE51bWJlciA9IHRoaXMuZG90TnVtYmVyKGNlbGwsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSlcblxuICAgICAgICAgICAgICAgIC8vZ2V0IG9mZnNldFxuICAgICAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMub2Zmc2V0KGNlbGwsIHJlc29sdXRpb24sIHopXG5cbiAgICAgICAgICAgICAgICAvL2RyYXcgcmFuZG9tIGRvdHNcbiAgICAgICAgICAgICAgICBjb25zdCBjeCA9IGNlbGwueCArIG9mZnNldC5keCArIHJlc29sdXRpb24gLyAyLFxuICAgICAgICAgICAgICAgICAgICBjeSA9IGNlbGwueSArIG9mZnNldC5keSArIHJlc29sdXRpb24gLyAyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gZG90TnVtYmVyOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4LmZpbGxSZWN0KGN4ICsgcmFuZCgpLCBjeSArIHJhbmQoKSwgc0dlbywgc0dlbylcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvL3VwZGF0ZSBsZWdlbmRzXG4gICAgICAgIHRoaXMudXBkYXRlTGVnZW5kcyh7IHN0eWxlOiB0aGlzLCByZXNvbHV0aW9uOiByZXNvbHV0aW9uLCB6OiB6LCB2aWV3U2NhbGU6IHZpZXdTY2FsZSB9KVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgU3R5bGUgfSBmcm9tICcuLi9jb3JlL1N0eWxlLmpzJ1xuXG4vKipcbiAqIEBtb2R1bGUgc3R5bGVcbiAqIEBhdXRob3IgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIEltYWdlU3R5bGUgZXh0ZW5kcyBTdHlsZSB7XG4gICAgLyoqIEBwYXJhbSB7b2JqZWN0fSBvcHRzICovXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKVxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgaW1hZ2UgVVJMIG9mIGEgY2VsbC5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbCwgbnVtYmVyLCBudW1iZXIsIG9iamVjdCk6c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLmltYWdlID0gb3B0cy5pbWFnZSB8fCAoKCkgPT4gJycpIC8vKGMscix6LHZzKSA9PiB7fVxuXG4gICAgICAgIC8qKiBUaGUgaW1hZ2Ugc2l6ZSBpbiBncm91bmQgbWV0ZXJzXG4gICAgICAgICAqICBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLCBudW1iZXIsIG51bWJlciwgb2JqZWN0KTpudW1iZXJ9ICAgICAgICAqL1xuICAgICAgICB0aGlzLnNpemUgPSBvcHRzLnNpemUgfHwgKChjZWxsLCByZXNvbHV0aW9uKSA9PiByZXNvbHV0aW9uKVxuXG4gICAgICAgIC8qKiBEaWN0aW9ubmFyeSBvZiBwcmVsb2FkZWQgaW1hZ2VzLiB1cmwgLT4gaW1hZ2VcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHR5cGUge29iamVjdH0gKi9cbiAgICAgICAgdGhpcy5jYWNoZSA9IHt9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0LmpzXCIpLkNlbGw+fSBjZWxsc1xuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29yZS9HZW9DYW52YXMuanNcIikuR2VvQ2FudmFzfSBnZW9DYW52YXNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVzb2x1dGlvblxuICAgICAqIEBvdmVycmlkZVxuICAgICAqL1xuICAgIGFzeW5jIGRyYXcoY2VsbHMsIGdlb0NhbnZhcywgcmVzb2x1dGlvbikge1xuICAgICAgICAvL1xuICAgICAgICBjb25zdCB6ID0gZ2VvQ2FudmFzLnZpZXcueixcbiAgICAgICAgICAgIHJlc29sdXRpb25QaXggPSByZXNvbHV0aW9uIC8gelxuXG4gICAgICAgIC8vZ2V0IHZpZXcgc2NhbGVcbiAgICAgICAgY29uc3Qgdmlld1NjYWxlID0gdGhpcy52aWV3U2NhbGUgPyB0aGlzLnZpZXdTY2FsZShjZWxscywgcmVzb2x1dGlvbiwgeikgOiB1bmRlZmluZWRcblxuICAgICAgICAvL2RyYXcgaW4gc2NyZWVuIGNvb3JkaW5hdGVzXG4gICAgICAgIGdlb0NhbnZhcy5pbml0Q2FudmFzVHJhbnNmb3JtKClcblxuICAgICAgICAvL1xuICAgICAgICBmb3IgKGxldCBjZWxsIG9mIGNlbGxzKSB7XG4gICAgICAgICAgICAvL2dldCBjZWxsIGltYWdlIHVybFxuICAgICAgICAgICAgY29uc3QgdXJsID0gdGhpcy5pbWFnZShjZWxsLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpXG4gICAgICAgICAgICBpZiAoIXVybCkgY29udGludWVcblxuICAgICAgICAgICAgLy9zaXplIGFuZCBwb3NpdGlvbiB2YWx1ZXNcbiAgICAgICAgICAgIGxldCBzaXplUGl4ID0gdGhpcy5zaXplKGNlbGwsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgLyB6XG4gICAgICAgICAgICBpZiAoIXNpemVQaXgpIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIC8vZ2V0IGltYWdlIGZyb20gY2FjaGVcbiAgICAgICAgICAgIGNvbnN0IGltYWdlID0gdGhpcy5jYWNoZVt1cmxdXG5cbiAgICAgICAgICAgIC8vbG9hZGluZywga2VlcCB3YWl0aW5nXG4gICAgICAgICAgICBpZiAoaW1hZ2UgPT0gJ2xvYWRpbmcnKSByZXR1cm5cbiAgICAgICAgICAgIC8vbm8gaW1hZ2U6IGxvYWQgaXRcbiAgICAgICAgICAgIGVsc2UgaWYgKCFpbWFnZSkge1xuICAgICAgICAgICAgICAgIC8vdGFnIGFzIGxvYWRpbmdcbiAgICAgICAgICAgICAgICB0aGlzLmNhY2hlW3VybF0gPSAnbG9hZGluZydcblxuICAgICAgICAgICAgICAgIC8vZGVmaW5lIGltYWdlXG4gICAgICAgICAgICAgICAgY29uc3QgaW1nID0gbmV3IEltYWdlKClcbiAgICAgICAgICAgICAgICBpbWcub25sb2FkID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvL3N0b3JlIGltYWdlIGRhdGEgaW4gY2FjaGUgYW5kIHJlZHJhd1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhY2hlW3VybF0gPSBpbWdcbiAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLnJlZHJhdygpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGltZy5vbmVycm9yID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvL2Nhc2Ugd2hlbiBubyBpbWFnZVxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ0NvdWxkIG5vdCByZXRyaWV2ZSBpbWFnZSBmcm9tJywgdXJsKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvL3NldCBVUkwgdG8gbGF1bmNoIHRoZSBkb3dubG9hZFxuICAgICAgICAgICAgICAgIGltZy5zcmMgPSB1cmxcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy9kcmF3IGltYWdlXG4gICAgICAgICAgICAgICAgY29uc3QgZCA9IChyZXNvbHV0aW9uUGl4IC0gc2l6ZVBpeCkgLyAyXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLm9mZnNjcmVlbkN0eC5kcmF3SW1hZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgICBpbWFnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5nZW9Ub1BpeFgoY2VsbC54KSArIGQsXG4gICAgICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuZ2VvVG9QaXhZKGNlbGwueSkgKyBkIC0gcmVzb2x1dGlvblBpeCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpemVQaXgsXG4gICAgICAgICAgICAgICAgICAgICAgICBzaXplUGl4XG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vdXBkYXRlIGxlZ2VuZHNcbiAgICAgICAgdGhpcy51cGRhdGVMZWdlbmRzKHsgc3R5bGU6IHRoaXMsIHJlc29sdXRpb246IHJlc29sdXRpb24sIHo6IHosIHZpZXdTY2FsZTogdmlld1NjYWxlIH0pXG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBTdHlsZSB9IGZyb20gJy4uL2NvcmUvU3R5bGUuanMnXG5pbXBvcnQgeyBTaWRlU3R5bGUgfSBmcm9tICcuL1NpZGVTdHlsZS5qcydcblxuLyoqIEB0eXBlZGVmIHt7eDpudW1iZXIseTpudW1iZXIsb3I6XCJ2XCJ8XCJoXCIsYzE6aW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsfHVuZGVmaW5lZCxjMjppbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGx8dW5kZWZpbmVkfX0gU2lkZSAqL1xuXG4vKipcbiAqIEBtb2R1bGUgc3R5bGVcbiAqIEBhdXRob3IgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIElzb0ZlbmNlU3R5bGUgZXh0ZW5kcyBTdHlsZSB7XG4gICAgLyoqIEBwYXJhbSB7b2JqZWN0fSBvcHRzICovXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKVxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgZGljdGlvbmFyeSAoc3RyaW5nIC0+IGNvbG9yKSB3aGljaCBnaXZlIHRoZSBjb2xvciBvZiBlYWNoIGNhdGVnb3J5LlxuICAgICAgICAgKiBAdHlwZSB7b2JqZWN0fSAqL1xuICAgICAgICB0aGlzLmNvbG9yID0gb3B0cy5jb2xvclxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgaGVpZ2h0IG9mIGEgY2VsbCBpbiBnZW9ncmFwaGljYWwgdW5pdC5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbCwgbnVtYmVyLCBudW1iZXIsIG9iamVjdCk6bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLmhlaWdodCA9IG9wdHMuaGVpZ2h0IHx8ICgoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA9PiByZXNvbHV0aW9uICogMC40KVxuXG4gICAgICAgIC8qKiBUaGUgcGVyc3BlY3RpdmUgYW5nbGUsIGluIGRlZ3JlZSwgd2l0aGluIFstMTgwLDE4MF0sIGZyb20gW08seF0gYXhpcy5cbiAgICAgICAgICogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgdGhpcy5hbmdsZSA9IG9wdHMuYW5nbGUgIT0gdW5kZWZpbmVkID8gb3B0cy5hbmdsZSA6IDUwXG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBjb3JuZXIgbGluZSBzdHJva2Ugc3R5bGUuXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwsbnVtYmVyLG51bWJlcixudW1iZXIpOnN0cmluZ30gKi9cbiAgICAgICAgdGhpcy5jb3JuZXJMaW5lU3Ryb2tlQ29sb3IgPSBvcHRzLmNvcm5lckxpbmVTdHJva2VDb2xvciB8fCAoKGMsIHIsIHosIGFuZ2xlKSA9PiAnIzk5OScpXG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBjb3JuZXIgbGluZSB3aWR0aC5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbCxudW1iZXIsbnVtYmVyLG51bWJlcik6bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLmNvcm5lckxpbmVXaWR0aCA9IG9wdHMuY29ybmVyTGluZVdpZHRoIHx8ICgoYywgciwgeiwgYW5nbGUpID0+IChhbmdsZSAlIDkwID09IDAgPyAwIDogMC44ICogeikpXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNob3cgdmVydGljYWwgY3Jvc3Mtc2VjdGlvbnMuXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufSAqL1xuICAgICAgICB0aGlzLnNWZXJ0ID0gb3B0cy5zVmVydCAhPSB1bmRlZmluZWQgPyBvcHRzLnNWZXJ0IDogdHJ1ZVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTaG93IGhvcml6b250YWwgY3Jvc3Mtc2VjdGlvbnMuXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufSAqL1xuICAgICAgICB0aGlzLnNIb3IgPSBvcHRzLnNIb3IgIT0gdW5kZWZpbmVkID8gb3B0cy5zSG9yIDogdHJ1ZVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7QXJyYXkuPGltcG9ydChcIi4uL2NvcmUvRGF0YXNldC5qc1wiKS5DZWxsPn0gY2VsbHNcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvcmUvR2VvQ2FudmFzLmpzXCIpLkdlb0NhbnZhc30gZ2VvQ2FudmFzXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJlc29sdXRpb25cbiAgICAgKiBAb3ZlcnJpZGVcbiAgICAgKi9cbiAgICBkcmF3KGNlbGxzLCBnZW9DYW52YXMsIHJlc29sdXRpb24pIHtcbiAgICAgICAgLy9maWx0ZXJcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyKSBjZWxscyA9IGNlbGxzLmZpbHRlcih0aGlzLmZpbHRlcilcblxuICAgICAgICAvL1xuICAgICAgICBjb25zdCB6ID0gZ2VvQ2FudmFzLnZpZXcuelxuICAgICAgICBjb25zdCBjdHggPSBnZW9DYW52YXMub2Zmc2NyZWVuQ3R4XG5cbiAgICAgICAgLy9nZXQgdmlldyBzY2FsZVxuICAgICAgICBjb25zdCB2aWV3U2NhbGUgPSB0aGlzLnZpZXdTY2FsZSA/IHRoaXMudmlld1NjYWxlKGNlbGxzLCByZXNvbHV0aW9uLCB6KSA6IHVuZGVmaW5lZFxuXG4gICAgICAgIC8vbmIgY2F0ZWdvcmllcyAtIHVzZWQgZm9yIHJhZGFyIGFuZCBhZ2VweXJhbWlkXG4gICAgICAgIGNvbnN0IGNhdHMgPSBPYmplY3Qua2V5cyh0aGlzLmNvbG9yKVxuXG4gICAgICAgIC8vaGFsZiByZXNvbHV0aW9uXG4gICAgICAgIGNvbnN0IHIyID0gcmVzb2x1dGlvbiAvIDJcblxuICAgICAgICAvL2dldCBvZmZzZXRcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLm9mZnNldCh1bmRlZmluZWQsIHJlc29sdXRpb24sIHopLFxuICAgICAgICAgICAgZHggPSBvZmZzZXQuZHgsXG4gICAgICAgICAgICBkeSA9IG9mZnNldC5keVxuXG4gICAgICAgIC8vbWFrZSBzaWRlc1xuICAgICAgICAvKiogIEB0eXBlIHtBcnJheS48U2lkZT59ICovXG4gICAgICAgIGNvbnN0IHNpZGVzID0gU2lkZVN0eWxlLmJ1aWxkU2lkZXMoXG4gICAgICAgICAgICBjZWxscyxcbiAgICAgICAgICAgIHJlc29sdXRpb24sXG4gICAgICAgICAgICB0aGlzLmFuZ2xlICUgMTgwICE9IDkwICYmIHRoaXMuc1ZlcnQsXG4gICAgICAgICAgICB0aGlzLmFuZ2xlICUgMTgwICE9IDAgJiYgdGhpcy5zSG9yXG4gICAgICAgIClcblxuICAgICAgICAvL1xuICAgICAgICBpZiAoc2lkZXMubGVuZ3RoID09IDApIHJldHVyblxuXG4gICAgICAgIC8vYW5nbGUgaW4gcmFkaWFuc1xuICAgICAgICBjb25zdCBhUmFkID0gKHRoaXMuYW5nbGUgKiBNYXRoLlBJKSAvIDE4MCxcbiAgICAgICAgICAgIGNvcyA9IE1hdGguY29zKGFSYWQpLFxuICAgICAgICAgICAgc2luID0gTWF0aC5zaW4oYVJhZClcblxuICAgICAgICAvL3NvcnQgc2lkZXMgc28gdGhhdCB0aGUgYmFjayBvbmVzIGFyZSBkcmF3biBmaXJzdC4gVGhpcyBkZXBlbmRzIG9uIHRoZSBhbmdsZS5cbiAgICAgICAgLy9kZXBlbmRpbmcgb24gZGlzdGFuY2UgdG8gdGhlIHJlZmVyZW5jZSBjb3JuZXIgcG9pbnRcbiAgICAgICAgY29uc3QgeENvcm5lciA9IE1hdGguYWJzKHRoaXMuYW5nbGUpIDwgOTAgPyBnZW9DYW52YXMuZXh0R2VvLnhNaW4gOiBnZW9DYW52YXMuZXh0R2VvLnhNYXhcbiAgICAgICAgY29uc3QgeUNvcm5lciA9IHRoaXMuYW5nbGUgPCAwID8gZ2VvQ2FudmFzLmV4dEdlby55TWF4IDogZ2VvQ2FudmFzLmV4dEdlby55TWluXG4gICAgICAgIHNpZGVzLnNvcnQoXG4gICAgICAgICAgICAoczEsIHMyKSA9PlxuICAgICAgICAgICAgICAgIE1hdGguaHlwb3QoczIueCAtIHhDb3JuZXIsIHMyLnkgLSB5Q29ybmVyKSAtIE1hdGguaHlwb3QoczEueCAtIHhDb3JuZXIsIHMxLnkgLSB5Q29ybmVyKVxuICAgICAgICApXG5cbiAgICAgICAgLy9wcmVwYXJlIGZ1bmN0aW9uIHRvIGRyYXcgY29ybmVyIGxpbmUgZm9yIGEgY2VsbCAqYypcbiAgICAgICAgY29uc3QgZHJhd0Nvcm5lckxpbmUgPSAoY2VsbCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFjZWxsKSByZXR1cm5cbiAgICAgICAgICAgIC8vbGluZSBzdHlsZVxuICAgICAgICAgICAgY29uc3QgbHcgPSB0aGlzLmNvcm5lckxpbmVXaWR0aCA/IHRoaXMuY29ybmVyTGluZVdpZHRoKGNlbGwsIHJlc29sdXRpb24sIHosIHRoaXMuYW5nbGUpIDogMC44ICogelxuICAgICAgICAgICAgaWYgKGx3ID09IDApIHJldHVyblxuICAgICAgICAgICAgY3R4LnN0cm9rZVN0eWxlID0gdGhpcy5jb3JuZXJMaW5lU3Ryb2tlQ29sb3JcbiAgICAgICAgICAgICAgICA/IHRoaXMuY29ybmVyTGluZVN0cm9rZUNvbG9yKGNlbGwsIHJlc29sdXRpb24sIHosIHRoaXMuYW5nbGUpXG4gICAgICAgICAgICAgICAgOiAnIzMzMydcbiAgICAgICAgICAgIGN0eC5saW5lV2lkdGggPSBsd1xuXG4gICAgICAgICAgICAvL2hlaWdodCAtIGluIGdlb1xuICAgICAgICAgICAgY29uc3QgaEcgPSB0aGlzLmhlaWdodChjZWxsLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpXG5cbiAgICAgICAgICAgIC8vZHJhdyBsaW5lXG4gICAgICAgICAgICBjdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgIGN0eC5tb3ZlVG8oY2VsbC54ICsgcjIgKyBkeCwgY2VsbC55ICsgcjIgKyBkeSlcbiAgICAgICAgICAgIGN0eC5saW5lVG8oY2VsbC54ICsgcjIgKyBoRyAqIGNvcyArIGR4LCBjZWxsLnkgKyByMiArIGhHICogc2luICsgZHkpXG4gICAgICAgICAgICBjdHguc3Ryb2tlKClcbiAgICAgICAgfVxuXG4gICAgICAgIC8vZHJhdyBzaWRlc1xuICAgICAgICBjdHgubGluZUNhcCA9ICdyb3VuZCdcbiAgICAgICAgZm9yIChsZXQgc2lkZSBvZiBzaWRlcykge1xuICAgICAgICAgICAgY29uc3QgYzEgPSBzaWRlLmMxLFxuICAgICAgICAgICAgICAgIGMyID0gc2lkZS5jMixcbiAgICAgICAgICAgICAgICB4ID0gc2lkZS54LFxuICAgICAgICAgICAgICAgIHkgPSBzaWRlLnlcblxuICAgICAgICAgICAgLy9oZWlnaHRzIC0gaW4gZ2VvXG4gICAgICAgICAgICBjb25zdCBoRzEgPSBjMSA/IHRoaXMuaGVpZ2h0KGMxLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpIDogMCxcbiAgICAgICAgICAgICAgICBoRzIgPSBjMiA/IHRoaXMuaGVpZ2h0KGMyLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpIDogMFxuXG4gICAgICAgICAgICAvL2NvbXB1dGUgdG90YWxzIGZvciBib3RoIGNlbGxzXG4gICAgICAgICAgICBjb25zdCB0b3RhbDEgPSBjb21wdXRlVG90YWwoYzEsIGNhdHMpLFxuICAgICAgICAgICAgICAgIHRvdGFsMiA9IGNvbXB1dGVUb3RhbChjMiwgY2F0cylcbiAgICAgICAgICAgIGlmICh0b3RhbDEgPT0gMCAmJiB0b3RhbDIgPT0gMCkgY29udGludWVcblxuICAgICAgICAgICAgbGV0IGN1bXVsMSA9IDAsXG4gICAgICAgICAgICAgICAgY3VtdWwyID0gMFxuICAgICAgICAgICAgZm9yIChsZXQgW2NvbHVtbiwgY29sb3JdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuY29sb3IpKSB7XG4gICAgICAgICAgICAgICAgLy9kcmF3IHN0cmlwZSBvZiBzaWRlIHMgYW5kIGNhdGVnb3J5IGNvbHVtblxuXG4gICAgICAgICAgICAgICAgLy9nZXQgdmFsdWVzIGZvciBib3RoIGNlbGxzXG4gICAgICAgICAgICAgICAgbGV0IHYxID0gYzEgPyArYzFbY29sdW1uXSA6IDBcbiAgICAgICAgICAgICAgICBsZXQgdjIgPSBjMiA/ICtjMltjb2x1bW5dIDogMFxuICAgICAgICAgICAgICAgIGlmICh2MSA9PSAwICYmIHYyID09IDApIGNvbnRpbnVlXG5cbiAgICAgICAgICAgICAgICAvL2NvbXB1dGUgaGVpZ2h0c1xuICAgICAgICAgICAgICAgIGNvbnN0IGgxID0gKGhHMSAqIGN1bXVsMSkgLyB0b3RhbDEgfHwgMFxuICAgICAgICAgICAgICAgIGNvbnN0IGgxbiA9IChoRzEgKiAoY3VtdWwxICsgdjEpKSAvIHRvdGFsMSB8fCAwXG4gICAgICAgICAgICAgICAgY29uc3QgaDIgPSAoaEcyICogY3VtdWwyKSAvIHRvdGFsMiB8fCAwXG4gICAgICAgICAgICAgICAgY29uc3QgaDJuID0gKGhHMiAqIChjdW11bDIgKyB2MikpIC8gdG90YWwyIHx8IDBcblxuICAgICAgICAgICAgICAgIC8vbWFrZSBwYXRoXG4gICAgICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICAgICAgaWYgKHNpZGUub3IgPT0gJ2gnKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vaG9yaXpvbnRhbCBzaWRlIC0gdmVydGljYWwgc2VjdGlvblxuICAgICAgICAgICAgICAgICAgICAvL2JvdHRvbSBsZWZ0XG4gICAgICAgICAgICAgICAgICAgIGN0eC5tb3ZlVG8oeCArIGgxICogY29zICsgZHgsIHkgLSByMiArIGgxICogc2luICsgZHkpXG4gICAgICAgICAgICAgICAgICAgIC8vdG9wIGxlZnRcbiAgICAgICAgICAgICAgICAgICAgY3R4LmxpbmVUbyh4ICsgaDIgKiBjb3MgKyBkeCwgeSArIHIyICsgaDIgKiBzaW4gKyBkeSlcbiAgICAgICAgICAgICAgICAgICAgLy90b3AgcmlnaHRcbiAgICAgICAgICAgICAgICAgICAgY3R4LmxpbmVUbyh4ICsgaDJuICogY29zICsgZHgsIHkgKyByMiArIGgybiAqIHNpbiArIGR5KVxuICAgICAgICAgICAgICAgICAgICAvL2JvdHRvbSByaWdodFxuICAgICAgICAgICAgICAgICAgICBjdHgubGluZVRvKHggKyBoMW4gKiBjb3MgKyBkeCwgeSAtIHIyICsgaDFuICogc2luICsgZHkpXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy92ZXJ0aWNhbCBzaWRlIC0gaG9yaXpvbnRhbCBzZWN0aW9uXG4gICAgICAgICAgICAgICAgICAgIC8vYm90dG9tIGxlZnRcbiAgICAgICAgICAgICAgICAgICAgY3R4Lm1vdmVUbyh4IC0gcjIgKyBoMSAqIGNvcyArIGR4LCB5ICsgaDEgKiBzaW4gKyBkeSlcbiAgICAgICAgICAgICAgICAgICAgLy9ib3R0b20gcmlnaHRcbiAgICAgICAgICAgICAgICAgICAgY3R4LmxpbmVUbyh4ICsgcjIgKyBoMiAqIGNvcyArIGR4LCB5ICsgaDIgKiBzaW4gKyBkeSlcbiAgICAgICAgICAgICAgICAgICAgLy90b3AgcmlnaHRcbiAgICAgICAgICAgICAgICAgICAgY3R4LmxpbmVUbyh4ICsgcjIgKyBoMm4gKiBjb3MgKyBkeCwgeSArIGgybiAqIHNpbiArIGR5KVxuICAgICAgICAgICAgICAgICAgICAvL3RvcCBsZWZ0XG4gICAgICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oeCAtIHIyICsgaDFuICogY29zICsgZHgsIHkgKyBoMW4gKiBzaW4gKyBkeSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy9jZy5jdHguY2xvc2VQYXRoKClcblxuICAgICAgICAgICAgICAgIC8vZmlsbFxuICAgICAgICAgICAgICAgIGN0eC5maWxsU3R5bGUgPSBjb2xvclxuICAgICAgICAgICAgICAgIGN0eC5maWxsKClcblxuICAgICAgICAgICAgICAgIGN1bXVsMSArPSB2MVxuICAgICAgICAgICAgICAgIGN1bXVsMiArPSB2MlxuXG4gICAgICAgICAgICAgICAgLy9UT0RPIGRyYXcgb25seSBvbmUgbGluZVxuICAgICAgICAgICAgICAgIC8vZHJhdyBjb3JuZXIgbGluZVxuICAgICAgICAgICAgICAgIC8vaWYgKHNpZGUub3IgPT0gXCJoXCIpIHtcbiAgICAgICAgICAgICAgICBkcmF3Q29ybmVyTGluZShjMSlcbiAgICAgICAgICAgICAgICBkcmF3Q29ybmVyTGluZShjMilcbiAgICAgICAgICAgICAgICAvL2lmICh0aGlzLmFuZ2xlID4gMCAmJiBzaWRlLm9yID09IFwiaFwiKSBkcmF3Q29ybmVyTGluZShjMilcbiAgICAgICAgICAgICAgICAvL2Vsc2UgZHJhd0Nvcm5lckxpbmUoYzIpXG4gICAgICAgICAgICAgICAgLy99XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvL3VwZGF0ZSBsZWdlbmRzXG4gICAgICAgIHRoaXMudXBkYXRlTGVnZW5kcyh7IHN0eWxlOiB0aGlzLCByZXNvbHV0aW9uOiByZXNvbHV0aW9uLCB6OiB6LCB2aWV3U2NhbGU6IHZpZXdTY2FsZSB9KVxuICAgIH1cbn1cblxuY29uc3QgY29tcHV0ZVRvdGFsID0gKGNlbGwsIGNhdGVnb3JpZXMpID0+IHtcbiAgICBpZiAoIWNlbGwpIHJldHVybiAwXG4gICAgbGV0IHRvdGFsID0gMFxuICAgIGZvciAobGV0IGNvbHVtbiBvZiBjYXRlZ29yaWVzKSB7XG4gICAgICAgIGNvbnN0IHYgPSBjZWxsW2NvbHVtbl1cbiAgICAgICAgaWYgKCF2KSBjb250aW51ZVxuICAgICAgICB0b3RhbCArPSArdlxuICAgIH1cbiAgICByZXR1cm4gdG90YWwgfHwgMFxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBTdHlsZSB9IGZyb20gJy4uL2NvcmUvU3R5bGUuanMnXG5cbi8qKlxuICogQG1vZHVsZSBzdHlsZVxuICogQGF1dGhvciBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgSm95UGxvdFN0eWxlIGV4dGVuZHMgU3R5bGUge1xuICAgIC8qKiBAcGFyYW0ge29iamVjdH0gb3B0cyAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cylcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIGhlaWdodCBvZiBhIGNlbGwgaW4gZ2VvZ3JhcGhpY2FsIHVuaXQuXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwsIG51bWJlciwgbnVtYmVyLCBvYmplY3QpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy5oZWlnaHQgPSBvcHRzLmhlaWdodCB8fCAoKGMsIHIpID0+IHIgKiBNYXRoLnJhbmRvbSgpKSAvLyhjLHIseix2cykgPT4ge31cblxuICAgICAgICAvKipcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG51bWJlcix7bWluOm51bWJlciwgbWF4Om51bWJlcn0sbnVtYmVyLG51bWJlcik6c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLmxpbmVDb2xvciA9IG9wdHMubGluZUNvbG9yIHx8ICgoeSwgeXMsIHIsIHopID0+ICcjQkJCJylcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihudW1iZXIse21pbjpudW1iZXIsIG1heDpudW1iZXJ9LG51bWJlcixudW1iZXIpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy5saW5lV2lkdGggPSBvcHRzLmxpbmVXaWR0aCB8fCAoKHksIHlzLCByLCB6KSA9PiB6KVxuICAgICAgICAvKipcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG51bWJlcix7bWluOm51bWJlciwgbWF4Om51bWJlcn0sbnVtYmVyLG51bWJlcik6c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLmZpbGxDb2xvciA9IG9wdHMuZmlsbENvbG9yIHx8ICgoeSwgeXMsIHIsIHopID0+ICcjYzA4YzU5NjgnKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7QXJyYXkuPGltcG9ydChcIi4uL2NvcmUvRGF0YXNldC5qc1wiKS5DZWxsPn0gY2VsbHNcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvcmUvR2VvQ2FudmFzLmpzXCIpLkdlb0NhbnZhc30gZ2VvQ2FudmFzXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJlc29sdXRpb25cbiAgICAgKiBAb3ZlcnJpZGVcbiAgICAgKi9cbiAgICBkcmF3KGNlbGxzLCBnZW9DYW52YXMsIHJlc29sdXRpb24pIHtcbiAgICAgICAgLy9maWx0ZXJcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyKSBjZWxscyA9IGNlbGxzLmZpbHRlcih0aGlzLmZpbHRlcilcblxuICAgICAgICAvL1xuICAgICAgICBjb25zdCB6ID0gZ2VvQ2FudmFzLnZpZXcuelxuICAgICAgICBjb25zdCBjdHggPSBnZW9DYW52YXMub2Zmc2NyZWVuQ3R4XG5cbiAgICAgICAgLy9nZXQgdmlldyBzY2FsZVxuICAgICAgICBjb25zdCB2aWV3U2NhbGUgPSB0aGlzLnZpZXdTY2FsZSA/IHRoaXMudmlld1NjYWxlKGNlbGxzLCByZXNvbHV0aW9uLCB6KSA6IHVuZGVmaW5lZFxuXG4gICAgICAgIC8vaW5kZXggY2VsbHMgYnkgeSBhbmQgeFxuICAgICAgICAvKiogIEB0eXBlIHtvYmplY3R9ICovXG4gICAgICAgIGNvbnN0IGluZCA9IHt9XG4gICAgICAgIGZvciAoY29uc3QgY2VsbCBvZiBjZWxscykge1xuICAgICAgICAgICAgbGV0IHJvdyA9IGluZFtjZWxsLnldXG4gICAgICAgICAgICBpZiAoIXJvdykge1xuICAgICAgICAgICAgICAgIHJvdyA9IHt9XG4gICAgICAgICAgICAgICAgaW5kW2NlbGwueV0gPSByb3dcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJvd1tjZWxsLnhdID0gdGhpcy5oZWlnaHQoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKVxuICAgICAgICB9XG5cbiAgICAgICAgLy9jb21wdXRlIGV4dGVudFxuICAgICAgICBjb25zdCBlID0gZ2VvQ2FudmFzLmV4dEdlb1xuICAgICAgICBpZiAoIWUpIHJldHVyblxuICAgICAgICBjb25zdCB4TWluID0gTWF0aC5mbG9vcihlLnhNaW4gLyByZXNvbHV0aW9uKSAqIHJlc29sdXRpb25cbiAgICAgICAgY29uc3QgeE1heCA9IE1hdGguZmxvb3IoZS54TWF4IC8gcmVzb2x1dGlvbikgKiByZXNvbHV0aW9uXG4gICAgICAgIGNvbnN0IHlNaW4gPSBNYXRoLmZsb29yKGUueU1pbiAvIHJlc29sdXRpb24pICogcmVzb2x1dGlvblxuICAgICAgICBjb25zdCB5TWF4ID0gTWF0aC5mbG9vcihlLnlNYXggLyByZXNvbHV0aW9uKSAqIHJlc29sdXRpb25cblxuICAgICAgICAvKiogIEB0eXBlIHt7bWluOm51bWJlciwgbWF4Om51bWJlcn19ICovXG4gICAgICAgIGNvbnN0IHlzID0geyBtaW46IHlNaW4sIG1heDogeU1heCB9XG5cbiAgICAgICAgLy9kcmF3IGxpbmVzLCByb3cgYnkgcm93LCBzdGF0aW5nIGZyb20gdGhlIHRvcFxuICAgICAgICBjdHgubGluZUpvaW4gPSAncm91bmQnXG4gICAgICAgIGZvciAobGV0IHkgPSB5TWF4OyB5ID49IHlNaW47IHkgLT0gcmVzb2x1dGlvbikge1xuICAgICAgICAgICAgLy9nZXQgcm93XG4gICAgICAgICAgICBjb25zdCByb3cgPSBpbmRbeV1cblxuICAgICAgICAgICAgLy9ubyByb3dcbiAgICAgICAgICAgIGlmICghcm93KSBjb250aW51ZVxuXG4gICAgICAgICAgICAvL3BsYWNlIGZpcnN0IHBvaW50XG4gICAgICAgICAgICBjdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgIGN0eC5tb3ZlVG8oeE1pbiAtIHJlc29sdXRpb24gLyAyLCB5KVxuXG4gICAgICAgICAgICAvL3N0b3JlIHRoZSBwcmV2aW91cyBoZWlnaHRcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfHVuZGVmaW5lZH0gKi9cbiAgICAgICAgICAgIGxldCBoR19cblxuICAgICAgICAgICAgLy9nbyB0aHJvdWdoIHRoZSBsaW5lIGNlbGxzXG4gICAgICAgICAgICBmb3IgKGxldCB4ID0geE1pbjsgeCA8PSB4TWF4OyB4ICs9IHJlc29sdXRpb24pIHtcbiAgICAgICAgICAgICAgICAvL2dldCBjb2x1bW4gdmFsdWVcbiAgICAgICAgICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgICAgICAgICBsZXQgaEcgPSByb3dbeF1cbiAgICAgICAgICAgICAgICBpZiAoIWhHKSBoRyA9IDBcblxuICAgICAgICAgICAgICAgIGlmIChoRyB8fCBoR18pIHtcbiAgICAgICAgICAgICAgICAgICAgLy9kcmF3IGxpbmUgb25seSB3aGVuIGF0IGxlYXN0IG9uZSBvZiBib3RoIHZhbHVlcyBpcyBub24tbnVsbFxuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gdGVzdCBiZXppZXJDdXJ2ZVRvXG4gICAgICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oeCArIHJlc29sdXRpb24gLyAyLCB5ICsgaEcpXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy9lbHNlIG1vdmUgdGhlIHBvaW50XG4gICAgICAgICAgICAgICAgICAgIGN0eC5tb3ZlVG8oeCArIHJlc29sdXRpb24gLyAyLCB5KVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvL3N0b3JlIHRoZSBwcmV2aW91cyB2YWx1ZVxuICAgICAgICAgICAgICAgIGhHXyA9IGhHXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vbGFzdCBwb2ludFxuICAgICAgICAgICAgaWYgKGhHXykgY3R4LmxpbmVUbyh4TWF4ICsgcmVzb2x1dGlvbiAvIDIsIHkpXG5cbiAgICAgICAgICAgIC8vZHJhdyBmaWxsXG4gICAgICAgICAgICBjb25zdCBmYyA9IHRoaXMuZmlsbENvbG9yKHksIHlzLCByZXNvbHV0aW9uLCB6KVxuICAgICAgICAgICAgaWYgKGZjICYmIGZjICE9ICdub25lJykge1xuICAgICAgICAgICAgICAgIGN0eC5maWxsU3R5bGUgPSBmY1xuICAgICAgICAgICAgICAgIGN0eC5maWxsKClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy9kcmF3IGxpbmVcbiAgICAgICAgICAgIGNvbnN0IGxjID0gdGhpcy5saW5lQ29sb3IoeSwgeXMsIHJlc29sdXRpb24sIHopXG4gICAgICAgICAgICBjb25zdCBsdyA9IHRoaXMubGluZVdpZHRoKHksIHlzLCByZXNvbHV0aW9uLCB6KVxuICAgICAgICAgICAgaWYgKGxjICYmIGxjICE9ICdub25lJyAmJiBsdyA+IDApIHtcbiAgICAgICAgICAgICAgICBjdHguc3Ryb2tlU3R5bGUgPSBsY1xuICAgICAgICAgICAgICAgIGN0eC5saW5lV2lkdGggPSBsd1xuICAgICAgICAgICAgICAgIGN0eC5zdHJva2UoKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG4vL2ltcG9ydCB7IFRhbmFrYVN0eWxlIH0gZnJvbSAnLi9TaWRlVGFuYWthU3R5bGVfX19PTEQuanMnXG5pbXBvcnQgeyBTdHJva2VTdHlsZSB9IGZyb20gJy4vU3Ryb2tlU3R5bGUuanMnXG5pbXBvcnQgeyBTcXVhcmVDb2xvckNhdGVnb3J5V2ViR0xTdHlsZSB9IGZyb20gJy4vU3F1YXJlQ29sb3JDYXRlZ29yeVdlYkdMU3R5bGUuanMnXG5pbXBvcnQgeyBTdHlsZSB9IGZyb20gJy4uL2NvcmUvU3R5bGUuanMnXG4vL2ltcG9ydCB7IFNpZGVTdHlsZSB9IGZyb20gJy4vU2lkZVN0eWxlLmpzJ1xuaW1wb3J0IHsgY2xhc3NpZmllciBhcyBjbEZ1biwgY29sb3JDbGFzc2lmaWVyIGFzIGNjbEZ1biB9IGZyb20gJy4uL3V0aWxzL3NjYWxlLmpzJ1xuaW1wb3J0IHsgU2lkZVRhbmFrYVN0eWxlIH0gZnJvbSAnLi9TaWRlVGFuYWthU3R5bGUuanMnXG5cblxuLyoqXG4gKiBAbW9kdWxlIHN0eWxlXG4gKiBAYXV0aG9yIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBMZWdvU3R5bGUge1xuICAgIHN0YXRpYyBnZXQodmFsdWUsIGJyZWFrcywgY29sb3JzLCBvcHRzID0ge30pIHtcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvL3RoZSBjb2xvcnNcbiAgICAgICAgLy9odHRwOi8vd3d3Lmplbm55c2NyYXlvbmNvbGxlY3Rpb24uY29tLzIwMjEvMDYvYWxsLWN1cnJlbnQtbGVnby1jb2xvcnMuaHRtbFxuICAgICAgICAvL2h0dHBzOi8vbGVvbmF3aWN6LmdpdGh1Yi5pby9sZWdvY29sb3JzL3JlZmVyZW5jZS9maWd1cmVzL1JFQURNRS1wbG90LTEucG5nXG4gICAgICAgIC8qb3B0cy5jb2xvcnMgPSBvcHRzLmNvbG9ycyB8fCBbXG4gICAgICAgICAgICAnIzAwODUyYicsIC8vZGFya2VyIGdyZWVuXG4gICAgICAgICAgICAnI2FmZDI0NicsIC8vbGlnaHQgZ3JlZW5cbiAgICAgICAgICAgICcjZmFjODBhJywgLy9kYXJrIHllbGxvd1xuICAgICAgICAgICAgJyNiYjgwNWEnLCAvL2Jyb3duXG4gICAgICAgICAgICAnI2Q2NzkyMycsIC8vbW9zdGFyZFxuICAgICAgICAgICAgJyNjYjRlMjknLCAvL3JlZGlzaFxuICAgICAgICAgICAgJyNiNDAwMDAnLCAvL3JlZFxuICAgICAgICAgICAgJyM3MjAwMTInLCAvL2RhcmsgcmVkXG4gICAgICAgICAgICAvL1wicHVycGxlXCIsXG4gICAgICAgICAgICAvL1wiI2VlZVwiIC8vd2hpdGhlXG4gICAgICAgIF0qL1xuXG4gICAgICAgIG9wdHMuY29sb3JEYXJrID0gb3B0cy5jb2xvckRhcmsgfHwgJyMzMzMnXG4gICAgICAgIG9wdHMuY29sb3JCcmlnaHQgPSBvcHRzLmNvbG9yQnJpZ2h0IHx8ICcjYWFhJ1xuXG4gICAgICAgIC8vbWFrZSBjbGFzc2lmaWVyXG4gICAgICAgIGNvbnN0IGNsYXNzaWZpZXIgPSBjbEZ1bihicmVha3MpXG4gICAgICAgIGNvbnN0IGNsYXNzaWZpZXIyID0gY2VsbCA9PiBjbGFzc2lmaWVyKHZhbHVlKGNlbGwpKVxuICAgICAgICAvL21ha2UgY29sb3JzIHRhYmxlXG4gICAgICAgIGNvbnN0IGNvbG9yc0RpY3QgPSB7fVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbG9ycy5sZW5ndGg7IGkrKykgY29sb3JzRGljdFtpICsgJyddID0gY29sb3JzW2ldXG5cbiAgICAgICAgLy9tYWtlIGNlbGwgZmlsbCBzdHlsZVxuICAgICAgICBjb25zdCBjZWxsU3R5bGUgPSBuZXcgU3F1YXJlQ29sb3JDYXRlZ29yeVdlYkdMU3R5bGUoe1xuICAgICAgICAgICAgY29kZTogY2xhc3NpZmllcjIsXG4gICAgICAgICAgICBjb2xvcjogY29sb3JzRGljdCxcbiAgICAgICAgfSlcblxuICAgICAgICAvL21ha2UgdGFuYWthIHNpZGUgc3R5bGVcbiAgICAgICAgY29uc3QgdGFuYWthU3R5bGUgPSBuZXcgU2lkZVRhbmFrYVN0eWxlKHtcbiAgICAgICAgICAgIGNsYXNzaWZpZXI6ICgpID0+IGNsYXNzaWZpZXIyLFxuICAgICAgICAgICAgY29sb3JEYXJrIDogb3B0cy5jb2xvckRhcmssXG4gICAgICAgICAgICBjb2xvckJyaWdodCA6IG9wdHMuY29sb3JCcmlnaHQsXG4gICAgICAgICAgICBkaWFtb25kOiBvcHRzLmRpYW1vbmQsXG4gICAgICAgIH0pXG5cbiAgICAgICAgLy9zdHlsZSB0byBzaG93IGxpbWl0cyBiZXR3ZWVuIHBpZWNlc1xuICAgICAgICBjb25zdCBzc3QgPSBuZXcgU3Ryb2tlU3R5bGUoe1xuICAgICAgICAgICAgc3Ryb2tlQ29sb3I6ICgpID0+ICcjNjY2JyxcbiAgICAgICAgICAgIHN0cm9rZVdpZHRoOiAoYywgciwgeikgPT4gMC4yICogeixcbiAgICAgICAgICAgIGZpbHRlcjogb3B0cy5maWx0ZXIsXG4gICAgICAgIH0pXG5cbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIGNlbGxTdHlsZSxcbiAgICAgICAgICAgIHNzdCxcbiAgICAgICAgICAgIHRhbmFrYVN0eWxlLFxuICAgICAgICAgICAgbmV3IExlZ29Ub3BTdHlsZSh7IGNvbERhcms6IG9wdHMuY29sRGFyaywgY29sQnJpZ2h0OiBvcHRzLmNvbEJyaWdodCwgZmlsdGVyOiBvcHRzLmZpbHRlciB9KSxcbiAgICAgICAgXVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsKTpzdHJpbmd9IGNvZGVcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gY29sb3JcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb3B0c1xuICAgICAqIEByZXR1cm5zIHtBcnJheS48U3R5bGU+fVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRDYXRlZ29yeShjb2RlLCBjb2xvciwgb3B0cykge1xuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgICAgIG9wdHMuY29sRGFyayA9IG9wdHMuY29sRGFyayB8fCAnIzMzMydcbiAgICAgICAgb3B0cy5jb2xCcmlnaHQgPSBvcHRzLmNvbEJyaWdodCB8fCAnI2FhYSdcblxuICAgICAgICAvL1xuICAgICAgICBjb25zdCBzID0gbmV3IFNxdWFyZUNvbG9yQ2F0ZWdvcnlXZWJHTFN0eWxlKHsgY29kZTogY29kZSwgY29sb3I6IGNvbG9yIH0pXG4gICAgICAgIC8vc3R5bGUgdG8gc2hvdyBsaW1pdHMgYmV0d2VlbiBwaWVjZXNcbiAgICAgICAgY29uc3Qgc3N0ID0gbmV3IFN0cm9rZVN0eWxlKHsgc3Ryb2tlQ29sb3I6ICgpID0+ICcjNjY2Jywgc3Ryb2tlV2lkdGg6IChjLCByLCB6KSA9PiAwLjIgKiB6IH0pXG5cbiAgICAgICAgcmV0dXJuIFtzLCBzc3QsIG5ldyBMZWdvVG9wU3R5bGUoeyBjb2xEYXJrOiBvcHRzLmNvbERhcmssIGNvbEJyaWdodDogb3B0cy5jb2xCcmlnaHQgfSldXG4gICAgfVxufVxuXG4vKipcbiAqIEEgc3R5bGUgdG8gZHJhdyB0b3AgY2lyY2xlIG9mIGxlZ28gYnJpY2tzLlxuICovXG5jbGFzcyBMZWdvVG9wU3R5bGUgZXh0ZW5kcyBTdHlsZSB7XG4gICAgLyoqIEBwYXJhbSB7b2JqZWN0fHVuZGVmaW5lZH0gb3B0cyAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cylcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cbiAgICAgICAgdGhpcy5jb2xEYXJrID0gb3B0cy5jb2xEYXJrIHx8ICcjMzMzJ1xuICAgICAgICB0aGlzLmNvbEJyaWdodCA9IG9wdHMuY29sQnJpZ2h0IHx8ICcjYWFhJ1xuICAgIH1cblxuICAgIGRyYXcoY2VsbHMsIGdlb0NhbnZhcywgcikge1xuICAgICAgICAvL2ZpbHRlclxuICAgICAgICBpZiAodGhpcy5maWx0ZXIpIGNlbGxzID0gY2VsbHMuZmlsdGVyKHRoaXMuZmlsdGVyKVxuICAgICAgICBjb25zdCBjdHggPSBnZW9DYW52YXMub2Zmc2NyZWVuQ3R4XG5cbiAgICAgICAgY3R4LmxpbmVXaWR0aCA9IDAuNiAqIGdlb0NhbnZhcy52aWV3LnpcblxuICAgICAgICAvL2RhcmsgcGFydFxuICAgICAgICBjdHguc3Ryb2tlU3R5bGUgPSB0aGlzLmNvbERhcmtcbiAgICAgICAgZm9yIChsZXQgYyBvZiBjZWxscykge1xuICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICBjdHguYXJjKGMueCArIHIgKiAwLjUsIGMueSArIHIgKiAwLjUsIHIgKiAwLjU1ICogMC41LCBNYXRoLlBJIC8gNCwgLU1hdGguUEkgKiAoMyAvIDQpLCB0cnVlKVxuICAgICAgICAgICAgY3R4LnN0cm9rZSgpXG4gICAgICAgIH1cblxuICAgICAgICAvL2JyaWdodCBwYXJ0XG4gICAgICAgIGN0eC5zdHJva2VTdHlsZSA9IHRoaXMuY29sQnJpZ2h0XG4gICAgICAgIGZvciAobGV0IGMgb2YgY2VsbHMpIHtcbiAgICAgICAgICAgIGN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgY3R4LmFyYyhjLnggKyByICogMC41LCBjLnkgKyByICogMC41LCByICogMC41NSAqIDAuNSwgTWF0aC5QSSAvIDQsIC1NYXRoLlBJICogKDMgLyA0KSwgZmFsc2UpXG4gICAgICAgICAgICBjdHguc3Ryb2tlKClcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgU3R5bGUgfSBmcm9tICcuLi9jb3JlL1N0eWxlLmpzJ1xuXG4vKipcbiAqIEBtb2R1bGUgc3R5bGVcbiAqIEBhdXRob3IgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIE1vc2FpY1N0eWxlIGV4dGVuZHMgU3R5bGUge1xuICAgIC8qKiBAcGFyYW0ge29iamVjdH0gb3B0cyAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cylcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIGNvbG9yIG9mIHRoZSBjZWxsLlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLCBudW1iZXIsIG51bWJlciwgb2JqZWN0KTpzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuY29sb3IgPSBvcHRzLmNvbG9yIHx8ICgoKSA9PiAnI0VBNkJBQycpIC8vKGMscix6LHZzKSA9PiB7fVxuXG4gICAgICAgIC8qKiBUaGUgbW9zYWljIGZhY3Rvciwgd2l0aGluIFswLDAuNV0uIFNldCB0byAwIGZvciBubyBtb3NhaWMgZWZmZWN0LiBTZXQgdG8gMC41IGZvciBzdHJvbmcgbW9zYWljIGVmZmVjdC5cbiAgICAgICAgICogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgdGhpcy5tb3NhaWNGYWN0b3IgPSBvcHRzLm1vc2FpY0ZhY3RvciB8fCAwLjE1XG5cbiAgICAgICAgLyoqIFRoZSBtb3NhaWMgc2hhZG93IGZhY3Rvciwgd2l0aGluIFswLDAuNV0uIFNldCB0byAwIGZvciBubyBtb3NhaWMgc2hhZG93LiBTZXQgdG8gMC41IGZvciBzdHJvbmcgbW9zYWljIHNoYWRvdy5cbiAgICAgICAgICogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgdGhpcy5zaGFkb3dGYWN0b3IgPSBvcHRzLnNoYWRvd0ZhY3RvciB8fCAwLjJcblxuICAgICAgICAvKiogVGhlIG1vc2FpYyBzaGFkb3cgY29sb3IuXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuc2hhZG93Q29sb3IgPSBvcHRzLnNoYWRvd0NvbG9yIHx8ICcjNTU1J1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0XCIpLkNlbGw+fSBjZWxsc1xuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29yZS9HZW9DYW52YXNcIikuR2VvQ2FudmFzfSBnZW9DYW52YXNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVzb2x1dGlvblxuICAgICAqL1xuICAgIGRyYXcoY2VsbHMsIGdlb0NhbnZhcywgcmVzb2x1dGlvbikge1xuICAgICAgICAvL2ZpbHRlclxuICAgICAgICBpZiAodGhpcy5maWx0ZXIpIGNlbGxzID0gY2VsbHMuZmlsdGVyKHRoaXMuZmlsdGVyKVxuXG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IHogPSBnZW9DYW52YXMudmlldy56XG4gICAgICAgIGNvbnN0IGN0eCA9IGdlb0NhbnZhcy5vZmZzY3JlZW5DdHhcblxuICAgICAgICAvL2dldCB2aWV3IHNjYWxlXG4gICAgICAgIGNvbnN0IHZpZXdTY2FsZSA9IHRoaXMudmlld1NjYWxlID8gdGhpcy52aWV3U2NhbGUoY2VsbHMsIHJlc29sdXRpb24sIHopIDogdW5kZWZpbmVkXG5cbiAgICAgICAgLy9zZXQgc3Ryb2tlIHN0eWxlLCBmb3Igc2hhZG93XG4gICAgICAgIGN0eC5zdHJva2VTdHlsZSA9IHRoaXMuc2hhZG93Q29sb3JcbiAgICAgICAgY3R4LmxpbmVXaWR0aCA9IHRoaXMuc2hhZG93RmFjdG9yICogcmVzb2x1dGlvblxuICAgICAgICBjdHgubGluZUpvaW4gPSAncm91bmQnXG4gICAgICAgIGN0eC5saW5lQ2FwID0gJ2J1dHQnXG5cbiAgICAgICAgLy9mdW5jdGlvbiB0byBjb21wdXRlIHBvc2l0aW9uIG1vc2FpYyBlZmZlY3RcbiAgICAgICAgY29uc3QgZCA9IHJlc29sdXRpb24gKiB0aGlzLm1vc2FpY0ZhY3RvclxuICAgICAgICBjb25zdCBtb3NhaWMgPSAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4geyB4OiBNYXRoLnJhbmRvbSgpICogZCwgeTogTWF0aC5yYW5kb20oKSAqIGQgfVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgY2VsbCBvZiBjZWxscykge1xuICAgICAgICAgICAgLy9zZXQgZmlsbCBjb2xvclxuICAgICAgICAgICAgY29uc3QgY29sID0gdGhpcy5jb2xvciA/IHRoaXMuY29sb3IoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgaWYgKCFjb2wgfHwgY29sID09PSAnbm9uZScpIGNvbnRpbnVlXG4gICAgICAgICAgICBjdHguZmlsbFN0eWxlID0gY29sXG5cbiAgICAgICAgICAgIC8vZ2V0IG9mZnNldFxuICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5vZmZzZXQoY2VsbCwgcmVzb2x1dGlvbiwgeilcblxuICAgICAgICAgICAgLy9jb21wdXRlIHBvc2l0aW9uIG1vc2FpYyBlZmZlY3RcbiAgICAgICAgICAgIGNvbnN0IGxsID0gbW9zYWljKCksXG4gICAgICAgICAgICAgICAgdWwgPSBtb3NhaWMoKSxcbiAgICAgICAgICAgICAgICBsciA9IG1vc2FpYygpLFxuICAgICAgICAgICAgICAgIHVyID0gbW9zYWljKClcblxuICAgICAgICAgICAgLy9zdHJva2VcbiAgICAgICAgICAgIGlmICh0aGlzLnNoYWRvd0ZhY3RvciA+IDApIHtcbiAgICAgICAgICAgICAgICBjdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICBjdHgubW92ZVRvKGNlbGwueCArIG9mZnNldC5keCArIGxsLngsIGNlbGwueSArIG9mZnNldC5keSArIGxsLnkpXG4gICAgICAgICAgICAgICAgY3R4LmxpbmVUbyhjZWxsLnggKyBvZmZzZXQuZHggKyByZXNvbHV0aW9uIC0gbHIueCwgY2VsbC55ICsgb2Zmc2V0LmR5ICsgbHIueSlcbiAgICAgICAgICAgICAgICBjdHgubGluZVRvKGNlbGwueCArIG9mZnNldC5keCArIHJlc29sdXRpb24gLSB1ci54LCBjZWxsLnkgKyBvZmZzZXQuZHkgKyByZXNvbHV0aW9uIC0gdXIueSlcbiAgICAgICAgICAgICAgICBjdHguc3Ryb2tlKClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy9maWxsXG5cbiAgICAgICAgICAgIGN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgY3R4Lm1vdmVUbyhjZWxsLnggKyBvZmZzZXQuZHggKyBsbC54LCBjZWxsLnkgKyBvZmZzZXQuZHkgKyBsbC55KVxuICAgICAgICAgICAgY3R4LmxpbmVUbyhjZWxsLnggKyBvZmZzZXQuZHggKyByZXNvbHV0aW9uIC0gbHIueCwgY2VsbC55ICsgb2Zmc2V0LmR5ICsgbHIueSlcbiAgICAgICAgICAgIGN0eC5saW5lVG8oY2VsbC54ICsgb2Zmc2V0LmR4ICsgcmVzb2x1dGlvbiAtIHVyLngsIGNlbGwueSArIG9mZnNldC5keSArIHJlc29sdXRpb24gLSB1ci55KVxuICAgICAgICAgICAgY3R4LmxpbmVUbyhjZWxsLnggKyBvZmZzZXQuZHggKyB1bC54LCBjZWxsLnkgKyBvZmZzZXQuZHkgKyByZXNvbHV0aW9uIC0gdWwueSlcbiAgICAgICAgICAgIGN0eC5maWxsKClcbiAgICAgICAgfVxuXG4gICAgICAgIC8vdXBkYXRlIGxlZ2VuZHNcbiAgICAgICAgdGhpcy51cGRhdGVMZWdlbmRzKHsgc3R5bGU6IHRoaXMsIHJlc29sdXRpb246IHJlc29sdXRpb24sIHo6IHosIHZpZXdTY2FsZTogdmlld1NjYWxlIH0pXG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBTdHlsZSB9IGZyb20gJy4uL2NvcmUvU3R5bGUuanMnXG5cbi8qKlxuICogQG1vZHVsZSBzdHlsZVxuICogQGF1dGhvciBKb3NlcGggRGF2aWVzLCBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgTmluamFTdGFyU3R5bGUgZXh0ZW5kcyBTdHlsZSB7XG4gICAgLyoqIEBwYXJhbSB7b2JqZWN0fSBvcHRzICovXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKVxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgY29sb3Igb2YgdGhlIGNlbGwuXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwsIG51bWJlciwgbnVtYmVyLCBvYmplY3QpOnN0cmluZ30gKi9cbiAgICAgICAgdGhpcy5jb2xvciA9IG9wdHMuY29sb3IgfHwgKCgpID0+ICcjRUE2QkFDJykgLy8oYyxyLHosdnMpID0+IHt9XG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBzaXplIG9mIGEgY2VsbCwgd2l0aGluIFswLDFdOlxuICAgICAgICAgKiAgLSAwLCBub3RoaW5nIHNob3duXG4gICAgICAgICAqICAtIDEsIGVudGlyZSBzcXVhcmVcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbCwgbnVtYmVyLCBudW1iZXIsIG9iamVjdCk6bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLnNpemUgPSBvcHRzLnNpemUgfHwgKChjZWxsLCByZXNvbHV0aW9uKSA9PiByZXNvbHV0aW9uKSAvLyhjLHIseix2cykgPT4ge31cblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIHNoYXBlLlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0XCIpLkNlbGwpOnN0cmluZ30gKi9cbiAgICAgICAgdGhpcy5zaGFwZSA9IG9wdHMuc2hhcGUgfHwgKCgpID0+ICdvJylcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7QXJyYXkuPGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbD59IGNlbGxzXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhc1wiKS5HZW9DYW52YXN9IGdlb0NhbnZhc1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByZXNvbHV0aW9uXG4gICAgICovXG4gICAgZHJhdyhjZWxscywgZ2VvQ2FudmFzLCByZXNvbHV0aW9uKSB7XG4gICAgICAgIC8vZmlsdGVyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlcikgY2VsbHMgPSBjZWxscy5maWx0ZXIodGhpcy5maWx0ZXIpXG5cbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgeiA9IGdlb0NhbnZhcy52aWV3LnpcbiAgICAgICAgY29uc3QgY3R4ID0gZ2VvQ2FudmFzLm9mZnNjcmVlbkN0eFxuXG4gICAgICAgIC8vZ2V0IHZpZXcgc2NhbGVcbiAgICAgICAgY29uc3Qgdmlld1NjYWxlID0gdGhpcy52aWV3U2NhbGUgPyB0aGlzLnZpZXdTY2FsZShjZWxscywgcmVzb2x1dGlvbiwgeikgOiB1bmRlZmluZWRcblxuICAgICAgICBjb25zdCByMiA9IHJlc29sdXRpb24gKiAwLjVcbiAgICAgICAgZm9yIChsZXQgY2VsbCBvZiBjZWxscykge1xuICAgICAgICAgICAgLy9jb2xvclxuICAgICAgICAgICAgY29uc3QgY29sID0gdGhpcy5jb2xvciA/IHRoaXMuY29sb3IoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgaWYgKCFjb2wgfHwgY29sID09PSAnbm9uZScpIGNvbnRpbnVlXG4gICAgICAgICAgICBjdHguZmlsbFN0eWxlID0gY29sXG5cbiAgICAgICAgICAgIC8vc2l6ZSAtIGluIGdlbyB1bml0XG4gICAgICAgICAgICBsZXQgayA9IHRoaXMuc2l6ZShjZWxsLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpXG4gICAgICAgICAgICBrID0gayA8IDAgPyAwIDogayA+IDEgPyAxIDoga1xuICAgICAgICAgICAgY29uc3Qgc0cyID0gayAqIHIyXG5cbiAgICAgICAgICAgIC8vc2hhcGVcbiAgICAgICAgICAgIGNvbnN0IHNoYXBlID0gdGhpcy5zaGFwZSA/IHRoaXMuc2hhcGUoY2VsbCkgOiAnbydcbiAgICAgICAgICAgIGlmIChzaGFwZSA9PT0gJ25vbmUnKSBjb250aW51ZVxuXG4gICAgICAgICAgICAvL2dldCBvZmZzZXRcbiAgICAgICAgICAgIC8vVE9ETyB1c2VcbiAgICAgICAgICAgIC8vY29uc3Qgb2Zmc2V0ID0gdGhpcy5vZmZzZXQoY2VsbCwgciwgeilcblxuICAgICAgICAgICAgLy9jZW50ZXIgcG9zaXRpb25cbiAgICAgICAgICAgIGNvbnN0IGN4ID0gY2VsbC54ICsgcjJcbiAgICAgICAgICAgIGNvbnN0IGN5ID0gY2VsbC55ICsgcjJcblxuICAgICAgICAgICAgaWYgKHNoYXBlID09PSAncCcpIHtcbiAgICAgICAgICAgICAgICBjdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICBjdHgubW92ZVRvKGN4LCBjeSArIHIyKVxuICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oY3ggKyBzRzIsIGN5ICsgc0cyKVxuICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oY3ggKyByMiwgY3kpXG4gICAgICAgICAgICAgICAgY3R4LmxpbmVUbyhjeCArIHNHMiwgY3kgLSBzRzIpXG4gICAgICAgICAgICAgICAgY3R4LmxpbmVUbyhjeCwgY3kgLSByMilcbiAgICAgICAgICAgICAgICBjdHgubGluZVRvKGN4IC0gc0cyLCBjeSAtIHNHMilcbiAgICAgICAgICAgICAgICBjdHgubGluZVRvKGN4IC0gcjIsIGN5KVxuICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oY3ggLSBzRzIsIGN5ICsgc0cyKVxuICAgICAgICAgICAgICAgIGN0eC5maWxsKClcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2hhcGUgPT09ICdvJykge1xuICAgICAgICAgICAgICAgIGN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgICAgIGN0eC5tb3ZlVG8oY3gsIGN5ICsgc0cyKVxuICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oY3ggKyByMiwgY3kgKyByMilcbiAgICAgICAgICAgICAgICBjdHgubGluZVRvKGN4ICsgc0cyLCBjeSlcbiAgICAgICAgICAgICAgICBjdHgubGluZVRvKGN4ICsgcjIsIGN5IC0gcjIpXG4gICAgICAgICAgICAgICAgY3R4LmxpbmVUbyhjeCwgY3kgLSBzRzIpXG4gICAgICAgICAgICAgICAgY3R4LmxpbmVUbyhjeCAtIHIyLCBjeSAtIHIyKVxuICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oY3ggLSBzRzIsIGN5KVxuICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oY3ggLSByMiwgY3kgKyByMilcbiAgICAgICAgICAgICAgICBjdHguZmlsbCgpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCBzaGFwZTonICsgc2hhcGUpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvL3VwZGF0ZSBsZWdlbmRzXG4gICAgICAgIHRoaXMudXBkYXRlTGVnZW5kcyh7IHN0eWxlOiB0aGlzLCByZXNvbHV0aW9uOiByZXNvbHV0aW9uLCB6OiB6LCB2aWV3U2NhbGU6IHZpZXdTY2FsZSB9KVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgU3R5bGUgfSBmcm9tICcuLi9jb3JlL1N0eWxlLmpzJ1xuXG4vKipcbiAqIEBtb2R1bGUgc3R5bGVcbiAqIEBhdXRob3IgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIFBpbGxhclN0eWxlIGV4dGVuZHMgU3R5bGUge1xuICAgIC8qKiBAcGFyYW0ge29iamVjdH0gb3B0cyAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cylcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIGhlaWdodCBvZiB0aGUgbGluZSByZXByZXNlbnRpbmcgYSBjZWxsLCBpbiBnZW8gdW5pdFxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLCBudW1iZXIsIG51bWJlciwgb2JqZWN0KTpudW1iZXJ9ICovXG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gb3B0cy5oZWlnaHRcblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIGNvbG9yIG9mIHRoZSBsaW5lIHJlcHJlc2VudGluZyBhIGNlbGwuXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwsIG51bWJlciwgbnVtYmVyLCBvYmplY3QpOnN0cmluZ30gKi9cbiAgICAgICAgdGhpcy5jb2xvciA9IG9wdHMuY29sb3IgfHwgKCgpID0+ICcjYzA4YzU5JykgLy8oYyxyLHosdnMpID0+IHt9XG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSB3aWR0aCBvZiB0aGUgbGluZSByZXByZXNlbnRpbmcgYSBjZWxsLCBpbiBnZW8gdW5pdFxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLCBudW1iZXIsIG51bWJlciwgb2JqZWN0KTpudW1iZXJ9ICovXG4gICAgICAgIHRoaXMud2lkdGggPSBvcHRzLndpZHRoIHx8ICgoY2VsbCwgcmVzb2x1dGlvbikgPT4gMC41ICogcmVzb2x1dGlvbilcblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIHdpZHRoIG9mIHRoZSBsaW5lIHJlcHJlc2VudGluZyBhIGNlbGwsIGluIGdlbyB1bml0XG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihudW1iZXIsIG51bWJlcixvYmplY3QpOmJvb2xlYW59ICovXG4gICAgICAgIHRoaXMuc2ltcGxlID0gb3B0cy5zaW1wbGUgfHwgKCgpID0+IGZhbHNlKVxuXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLnZpZXdIZWlnaHRGYWN0b3IgPSBvcHRzLnZpZXdIZWlnaHRGYWN0b3IgfHwgMS41XG4gICAgICAgIC8vMCwwIGlzIHRoZSBjZW50ZXJcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgIHRoaXMudmlld1NYID0gb3B0cy52aWV3U1ggPT0gdW5kZWZpbmVkID8gMCA6IG9wdHMudmlld1NYXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLnZpZXdTWSA9IG9wdHMudmlld1NZID09IHVuZGVmaW5lZCA/IC0wLjUgOiBvcHRzLnZpZXdTWVxuXG4gICAgICAgIC8vVE9ETyByZXBsYWNlIHdpdGggc3VuIGxvY2F0aW9uID9cbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgIHRoaXMuc2hhZG93RGlyZWN0aW9uID1cbiAgICAgICAgICAgIG9wdHMuc2hhZG93RGlyZWN0aW9uID09IHVuZGVmaW5lZCA/ICgtNDAuMyAqIE1hdGguUEkpIC8gMTgwLjAgOiBvcHRzLnNoYWRvd0RpcmVjdGlvblxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgdGhpcy5zaGFkb3dGYWN0b3IgPSBvcHRzLnNoYWRvd0ZhY3RvciB8fCAwLjNcbiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuc2hhZG93Q29sb3IgPSBvcHRzLnNoYWRvd0NvbG9yIHx8ICcjMDAwMDAwMzMnXG5cbiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgICAgIHRoaXMub3V0bGluZUNvbCA9IG9wdHMub3V0bGluZUNvbCB8fCAnI0ZGRkZGRidcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgIHRoaXMub3V0bGluZVdpZHRoUGl4ID0gb3B0cy5vdXRsaW5lV2lkdGhQaXggPT0gdW5kZWZpbmVkID8gMC41IDogb3B0cy5vdXRsaW5lV2lkdGhQaXhcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEcmF3IGNlbGxzIGFzIHNlZ21lbnRzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0XCIpLkNlbGw+fSBjZWxsc1xuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29yZS9HZW9DYW52YXNcIikuR2VvQ2FudmFzfSBnZW9DYW52YXNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVzb2x1dGlvblxuICAgICAqL1xuICAgIGRyYXcoY2VsbHMsIGdlb0NhbnZhcywgcmVzb2x1dGlvbikge1xuICAgICAgICAvL2ZpbHRlclxuICAgICAgICBpZiAodGhpcy5maWx0ZXIpIGNlbGxzID0gY2VsbHMuZmlsdGVyKHRoaXMuZmlsdGVyKVxuXG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IHogPSBnZW9DYW52YXMudmlldy56XG4gICAgICAgIGNvbnN0IGN0eCA9IGdlb0NhbnZhcy5vZmZzY3JlZW5DdHhcblxuICAgICAgICAvL2dldCB2aWV3IHNjYWxlXG4gICAgICAgIGNvbnN0IHZpZXdTY2FsZSA9IHRoaXMudmlld1NjYWxlID8gdGhpcy52aWV3U2NhbGUoY2VsbHMsIHJlc29sdXRpb24sIHopIDogdW5kZWZpbmVkXG5cbiAgICAgICAgLy9nZXQgdmlldyBjZW50ZXIgZ2VvIHBvc2l0aW9uXG4gICAgICAgIGNvbnN0IGN2eCA9IGdlb0NhbnZhcy52aWV3LnggKyB0aGlzLnZpZXdTWCAqIGdlb0NhbnZhcy53ICogelxuICAgICAgICBjb25zdCBjdnkgPSBnZW9DYW52YXMudmlldy55ICsgdGhpcy52aWV3U1kgKiBnZW9DYW52YXMuaCAqIHpcbiAgICAgICAgLy9nZXQgdmlldyBoZWlnaHRcbiAgICAgICAgY29uc3QgSCA9IHRoaXMudmlld0hlaWdodEZhY3RvciAqIChnZW9DYW52YXMudyArIGdlb0NhbnZhcy5oKSAqIDAuNSAqIHpcblxuICAgICAgICAvL3NvcnQgY2VsbHMgYnkgeSBhbmQgeFxuICAgICAgICAvL2NvbnN0IGRpc3RUb1ZpZXdDZW50ZXIgPSAoYykgPT4geyBjb25zdCBkeCA9IGN2eCAtIGMueCwgZHkgPSBjdnkgLSBjLnk7IHJldHVybiBNYXRoLnNxcnQoZHggKiBkeCArIGR5ICogZHkpIH1cbiAgICAgICAgY2VsbHMuc29ydCgoYzEsIGMyKSA9PiAxMDAwMDAwMDAgKiAoYzIueSAtIGMxLnkpICsgYzEueCAtIGMyLngpXG5cbiAgICAgICAgLy9nZXQgc2ltcGxlIGluZm9ybWF0aW9uXG4gICAgICAgIGNvbnN0IHNpbXBsZSA9IHRoaXMuc2ltcGxlKHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSlcblxuICAgICAgICBjdHgubGluZUNhcCA9IHNpbXBsZSA/ICdidXR0JyA6ICdyb3VuZCdcblxuICAgICAgICAvL2RyYXcgc2hhZG93c1xuICAgICAgICBjdHguc3Ryb2tlU3R5bGUgPSB0aGlzLnNoYWRvd0NvbG9yXG4gICAgICAgIGN0eC5maWxsU3R5bGUgPSB0aGlzLnNoYWRvd0NvbG9yXG4gICAgICAgIGZvciAobGV0IGNlbGwgb2YgY2VsbHMpIHtcbiAgICAgICAgICAgIC8vd2lkdGhcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfHVuZGVmaW5lZH0gKi9cbiAgICAgICAgICAgIGNvbnN0IHdHID0gdGhpcy53aWR0aCA/IHRoaXMud2lkdGgoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgaWYgKCF3RyB8fCB3RyA8IDApIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIC8vaGVpZ2h0XG4gICAgICAgICAgICAvKiogQHR5cGUge251bWJlcnx1bmRlZmluZWR9ICovXG4gICAgICAgICAgICBjb25zdCBoRyA9IHRoaXMuaGVpZ2h0ID8gdGhpcy5oZWlnaHQoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgaWYgKCFoRyB8fCBoRyA8IDApIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIC8vZ2V0IG9mZnNldFxuICAgICAgICAgICAgLy9UT0RPIHVzZSB0aGF0XG4gICAgICAgICAgICAvL2NvbnN0IG9mZnNldCA9IHRoaXMub2Zmc2V0KGMsIHJlc29sdXRpb24sIHopXG5cbiAgICAgICAgICAgIC8vc2V0IHdpZHRoXG4gICAgICAgICAgICBjdHgubGluZVdpZHRoID0gd0dcblxuICAgICAgICAgICAgLy9jb21wdXRlIGNlbGwgY2VudGVyIHBvc3RpdGlvblxuICAgICAgICAgICAgY29uc3QgY3ggPSBjZWxsLnggKyByZXNvbHV0aW9uIC8gMlxuICAgICAgICAgICAgY29uc3QgY3kgPSBjZWxsLnkgKyByZXNvbHV0aW9uIC8gMlxuICAgICAgICAgICAgY29uc3QgbHMgPSBoRyAqIHRoaXMuc2hhZG93RmFjdG9yXG5cbiAgICAgICAgICAgIC8vZHJhdyBzZWdtZW50XG4gICAgICAgICAgICBjdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgIGN0eC5tb3ZlVG8oY3gsIGN5KVxuICAgICAgICAgICAgY3R4LmxpbmVUbyhjeCArIGxzICogTWF0aC5jb3ModGhpcy5zaGFkb3dEaXJlY3Rpb24pLCBjeSArIGxzICogTWF0aC5zaW4odGhpcy5zaGFkb3dEaXJlY3Rpb24pKVxuICAgICAgICAgICAgY3R4LnN0cm9rZSgpXG5cbiAgICAgICAgICAgIC8qXG4gICAgICAgICAgICBpZiAodGhpcy5zaW1wbGUpIHtcbiAgICAgICAgICAgICAgICAvL2RyYXcgYmFzZSBjaXJjbGVcbiAgICAgICAgICAgICAgICBjZy5jdHguYmVnaW5QYXRoKCk7XG4gICAgICAgICAgICAgICAgY2cuY3R4LmFyYyhcbiAgICAgICAgICAgICAgICAgICAgY3gsIGN5LFxuICAgICAgICAgICAgICAgICAgICB3RyAqIDAuNSxcbiAgICAgICAgICAgICAgICAgICAgMCwgMiAqIE1hdGguUEksIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAvL2NnLmN0eC5zdHJva2UoKTtcbiAgICAgICAgICAgICAgICBjZy5jdHguZmlsbCgpO1xuICAgICAgICAgICAgfSovXG4gICAgICAgIH1cblxuICAgICAgICAvL2RyYXcgcGlsbGFyc1xuICAgICAgICBmb3IgKGxldCBjZWxsIG9mIGNlbGxzKSB7XG4gICAgICAgICAgICAvL2NvbG9yXG4gICAgICAgICAgICAvKiogQHR5cGUge3N0cmluZ3x1bmRlZmluZWR9ICovXG4gICAgICAgICAgICBjb25zdCBjb2wgPSB0aGlzLmNvbG9yID8gdGhpcy5jb2xvcihjZWxsLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpIDogdW5kZWZpbmVkXG4gICAgICAgICAgICBpZiAoIWNvbCkgY29udGludWVcblxuICAgICAgICAgICAgLy93aWR0aFxuICAgICAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ8dW5kZWZpbmVkfSAqL1xuICAgICAgICAgICAgY29uc3Qgd0cgPSB0aGlzLndpZHRoID8gdGhpcy53aWR0aChjZWxsLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpIDogdW5kZWZpbmVkXG4gICAgICAgICAgICBpZiAoIXdHIHx8IHdHIDwgMCkgY29udGludWVcblxuICAgICAgICAgICAgLy9oZWlnaHRcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfHVuZGVmaW5lZH0gKi9cbiAgICAgICAgICAgIGNvbnN0IGhHID0gdGhpcy5oZWlnaHQgPyB0aGlzLmhlaWdodChjZWxsLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpIDogdW5kZWZpbmVkXG4gICAgICAgICAgICBpZiAoIWhHIHx8IGhHIDwgMCkgY29udGludWVcblxuICAgICAgICAgICAgLy9nZXQgb2Zmc2V0XG4gICAgICAgICAgICAvL1RPRE8gdXNlIHRoYXRcbiAgICAgICAgICAgIC8vY29uc3Qgb2Zmc2V0ID0gdGhpcy5vZmZzZXQoYywgcmVzb2x1dGlvbiwgeilcblxuICAgICAgICAgICAgLy9jb21wdXRlIGNlbGwgY2VudGVyIHBvc3RpdGlvblxuICAgICAgICAgICAgY29uc3QgY3ggPSBjZWxsLnggKyByZXNvbHV0aW9uIC8gMlxuICAgICAgICAgICAgY29uc3QgY3kgPSBjZWxsLnkgKyByZXNvbHV0aW9uIC8gMlxuXG4gICAgICAgICAgICAvL2NvbXB1dGUgYW5nbGVcbiAgICAgICAgICAgIGNvbnN0IGR4ID0gY3ggLSBjdngsXG4gICAgICAgICAgICAgICAgZHkgPSBjeSAtIGN2eVxuICAgICAgICAgICAgY29uc3QgYSA9IE1hdGguYXRhbjIoZHksIGR4KVxuICAgICAgICAgICAgY29uc3QgRCA9IE1hdGguc3FydChkeCAqIGR4ICsgZHkgKiBkeSlcbiAgICAgICAgICAgIGNvbnN0IGQgPSAoRCAqIGhHKSAvIChIIC0gaEcpXG5cbiAgICAgICAgICAgIGlmIChzaW1wbGUpIHtcbiAgICAgICAgICAgICAgICAvL2RyYXcgc2VnbWVudFxuICAgICAgICAgICAgICAgIGN0eC5zdHJva2VTdHlsZSA9IGNvbFxuICAgICAgICAgICAgICAgIGN0eC5saW5lV2lkdGggPSB3R1xuICAgICAgICAgICAgICAgIGN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgICAgIGN0eC5tb3ZlVG8oY3gsIGN5KVxuICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oY3ggKyBkICogTWF0aC5jb3MoYSksIGN5ICsgZCAqIE1hdGguc2luKGEpKVxuICAgICAgICAgICAgICAgIGN0eC5zdHJva2UoKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvL2RyYXcgYmFja2dyb3VuZCBzZWdtZW50XG4gICAgICAgICAgICAgICAgY3R4LnN0cm9rZVN0eWxlID0gdGhpcy5vdXRsaW5lQ29sXG4gICAgICAgICAgICAgICAgY3R4LmxpbmVXaWR0aCA9IHdHICsgMiAqIHRoaXMub3V0bGluZVdpZHRoUGl4ICogelxuICAgICAgICAgICAgICAgIGN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgICAgIGN0eC5tb3ZlVG8oY3gsIGN5KVxuICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oY3ggKyBkICogTWF0aC5jb3MoYSksIGN5ICsgZCAqIE1hdGguc2luKGEpKVxuICAgICAgICAgICAgICAgIGN0eC5zdHJva2UoKVxuXG4gICAgICAgICAgICAgICAgLy9kcmF3IHNlZ21lbnRcbiAgICAgICAgICAgICAgICBjdHguc3Ryb2tlU3R5bGUgPSBjb2xcbiAgICAgICAgICAgICAgICBjdHgubGluZVdpZHRoID0gd0dcbiAgICAgICAgICAgICAgICBjdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICBjdHgubW92ZVRvKGN4LCBjeSlcbiAgICAgICAgICAgICAgICBjdHgubGluZVRvKGN4ICsgZCAqIE1hdGguY29zKGEpLCBjeSArIGQgKiBNYXRoLnNpbihhKSlcbiAgICAgICAgICAgICAgICBjdHguc3Ryb2tlKClcblxuICAgICAgICAgICAgICAgIC8vZHJhdyB0b3AgY2lyY2xlXG4gICAgICAgICAgICAgICAgY3R4LnN0cm9rZVN0eWxlID0gdGhpcy5vdXRsaW5lQ29sXG4gICAgICAgICAgICAgICAgLy9jZy5jdHguZmlsbFN0eWxlID0gXCIjYzA4YzU5XCJcbiAgICAgICAgICAgICAgICBjdHgubGluZVdpZHRoID0gdGhpcy5vdXRsaW5lV2lkdGhQaXggKiB6XG4gICAgICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICAgICAgY3R4LmFyYyhjeCArIGQgKiBNYXRoLmNvcyhhKSwgY3kgKyBkICogTWF0aC5zaW4oYSksIHdHICogMC41LCAwLCAyICogTWF0aC5QSSwgZmFsc2UpXG4gICAgICAgICAgICAgICAgY3R4LnN0cm9rZSgpXG4gICAgICAgICAgICAgICAgLy9jZy5jdHguZmlsbCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy9pbiBjYXNlLi4uXG4gICAgICAgIGN0eC5saW5lQ2FwID0gJ2J1dHQnXG5cbiAgICAgICAgLy91cGRhdGUgbGVnZW5kc1xuICAgICAgICB0aGlzLnVwZGF0ZUxlZ2VuZHMoeyBzdHlsZTogdGhpcywgcmVzb2x1dGlvbjogcmVzb2x1dGlvbiwgejogeiwgdmlld1NjYWxlOiB2aWV3U2NhbGUgfSlcbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IFN0eWxlIH0gZnJvbSAnLi4vY29yZS9TdHlsZS5qcydcblxuLyoqXG4gKiBBIHN0eWxlIHdoZXJlIGVhY2ggY2VsbCBpcyByZXByZXNlbnRlZCBieSBhIHNlZ21lbnQgd2hvc2UgbGVuZ3RoLCB3aWR0aCwgY29sb3IgYW5kIG9yaWVudGF0aW9uIGNhbiB2YXJ5IGFjY29yZGluZyB0byBzdGF0aXN0aWNhbCB2YWx1ZXMuXG4gKlxuICogQG1vZHVsZSBzdHlsZVxuICogQGF1dGhvciBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgU2VnbWVudFN0eWxlIGV4dGVuZHMgU3R5bGUge1xuICAgIC8qKiBAcGFyYW0ge29iamVjdH0gb3B0cyAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cylcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIGNvbG9yIG9mIHRoZSBjZWxsIHNlZ21lbnQuXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwsIG51bWJlciwgbnVtYmVyLCBvYmplY3QpOnN0cmluZ30gKi9cbiAgICAgICAgdGhpcy5jb2xvciA9IG9wdHMuY29sb3IgfHwgKCgpID0+ICcjRUE2QkFDJykgLy8oYyxyLHosdnMpID0+IHt9XG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSB3aWR0aCBvZiB0aGUgc2VnbWVudCByZXByZXNlbnRpbmcgYSBjZWxsLCBpbiBnZW8gdW5pdFxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLCBudW1iZXIsIG51bWJlciwgb2JqZWN0KTpudW1iZXJ9ICovXG4gICAgICAgIHRoaXMud2lkdGggPSBvcHRzLndpZHRoIHx8ICgoY2VsbCwgcmVzb2x1dGlvbikgPT4gcmVzb2x1dGlvbiAqIDAuMSkgLy8oYyxyLHosdnMpID0+IHt9XG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBsZW5ndGggb2YgdGhlIHNlZ21lbnQgcmVwcmVzZW50aW5nIGEgY2VsbCwgaW4gZ2VvIHVuaXRcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbCwgbnVtYmVyLCBudW1iZXIsIG9iamVjdCk6bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLmxlbmd0aCA9IG9wdHMubGVuZ3RoIHx8ICgoY2VsbCwgcmVzb2x1dGlvbikgPT4gcmVzb2x1dGlvbiAqIDAuOSkgLy8oYyxyLHosdnMpID0+IHt9XG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBvcmllbnRhdGlvbiAoaW4gZGVncmVlcykgb2YgdGhlIHNlZ21lbnQgcmVwcmVzZW50aW5nIGEgY2VsbC5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbCwgbnVtYmVyLCBudW1iZXIsIG9iamVjdCk6bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLm9yaWVudGF0aW9uID0gb3B0cy5vcmllbnRhdGlvbiB8fCAoKCkgPT4gMTgwICogTWF0aC5yYW5kb20oKSkgLy8oYyxyLHosdnMpID0+IHt9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRHJhdyBjZWxscyBhcyBzZWdtZW50cy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7QXJyYXkuPGltcG9ydChcIi4uL2NvcmUvRGF0YXNldFwiKS5DZWxsPn0gY2VsbHNcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvcmUvR2VvQ2FudmFzXCIpLkdlb0NhbnZhc30gZ2VvQ2FudmFzXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJlc29sdXRpb25cbiAgICAgKi9cbiAgICBkcmF3KGNlbGxzLCBnZW9DYW52YXMsIHJlc29sdXRpb24pIHtcbiAgICAgICAgLy9maWx0ZXJcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyKSBjZWxscyA9IGNlbGxzLmZpbHRlcih0aGlzLmZpbHRlcilcblxuICAgICAgICAvL1xuICAgICAgICBjb25zdCB6ID0gZ2VvQ2FudmFzLnZpZXcuelxuICAgICAgICBjb25zdCBjdHggPSBnZW9DYW52YXMub2Zmc2NyZWVuQ3R4XG5cbiAgICAgICAgLy9nZXQgdmlldyBzY2FsZVxuICAgICAgICBjb25zdCB2aWV3U2NhbGUgPSB0aGlzLnZpZXdTY2FsZSA/IHRoaXMudmlld1NjYWxlKGNlbGxzLCByZXNvbHV0aW9uLCB6KSA6IHVuZGVmaW5lZFxuXG4gICAgICAgIC8vXG4gICAgICAgIGN0eC5saW5lQ2FwID0gJ2J1dHQnXG5cbiAgICAgICAgLy9jb252ZXJzaW9uIGZhY3RvciBkZWdyZWUgLT4gcmFkaWFuXG4gICAgICAgIGNvbnN0IGYgPSBNYXRoLlBJIC8gMTgwXG5cbiAgICAgICAgZm9yIChsZXQgY2VsbCBvZiBjZWxscykge1xuICAgICAgICAgICAgLy9jb2xvclxuICAgICAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd8dW5kZWZpbmVkfSAqL1xuICAgICAgICAgICAgY29uc3QgY29sID0gdGhpcy5jb2xvciA/IHRoaXMuY29sb3IoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgaWYgKCFjb2wpIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIC8vd2lkdGhcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfHVuZGVmaW5lZH0gKi9cbiAgICAgICAgICAgIGNvbnN0IHdHID0gdGhpcy53aWR0aCA/IHRoaXMud2lkdGgoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgaWYgKCF3RyB8fCB3RyA8IDApIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIC8vbGVuZ3RoXG4gICAgICAgICAgICAvKiogQHR5cGUge251bWJlcnx1bmRlZmluZWR9ICovXG4gICAgICAgICAgICBjb25zdCBsRyA9IHRoaXMubGVuZ3RoID8gdGhpcy5sZW5ndGgoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgaWYgKCFsRyB8fCBsRyA8IDApIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIC8vb3JpZW50YXRpb24gKGluIHJhZGlhbilcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICAgICAgY29uc3Qgb3IgPSB0aGlzLm9yaWVudGF0aW9uKGNlbGwsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgKiBmXG4gICAgICAgICAgICBpZiAob3IgPT09IHVuZGVmaW5lZCB8fCBpc05hTihvcikpIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIC8vZ2V0IG9mZnNldFxuICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5vZmZzZXQoY2VsbCwgcmVzb2x1dGlvbiwgeilcblxuICAgICAgICAgICAgLy9zZXQgY29sb3IgYW5kIHdpZHRoXG4gICAgICAgICAgICBjdHguc3Ryb2tlU3R5bGUgPSBjb2xcbiAgICAgICAgICAgIGN0eC5saW5lV2lkdGggPSB3R1xuXG4gICAgICAgICAgICAvL2NvbXB1dGUgc2VnbWVudCBjZW50ZXIgcG9zdGl0aW9uXG4gICAgICAgICAgICBjb25zdCBjeCA9IGNlbGwueCArIHJlc29sdXRpb24gLyAyICsgb2Zmc2V0LmR4XG4gICAgICAgICAgICBjb25zdCBjeSA9IGNlbGwueSArIHJlc29sdXRpb24gLyAyICsgb2Zmc2V0LmR5XG5cbiAgICAgICAgICAgIC8vY29tcHV0ZSBzZWdtZW50IGRpcmVjdGlvblxuICAgICAgICAgICAgY29uc3QgZHggPSAwLjUgKiBNYXRoLmNvcyhvcikgKiBsR1xuICAgICAgICAgICAgY29uc3QgZHkgPSAwLjUgKiBNYXRoLnNpbihvcikgKiBsR1xuXG4gICAgICAgICAgICAvL2RyYXcgc2VnbWVudFxuICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICBjdHgubW92ZVRvKGN4IC0gZHgsIGN5IC0gZHkpXG4gICAgICAgICAgICBjdHgubGluZVRvKGN4ICsgZHgsIGN5ICsgZHkpXG4gICAgICAgICAgICBjdHguc3Ryb2tlKClcbiAgICAgICAgfVxuXG4gICAgICAgIC8vdXBkYXRlIGxlZ2VuZHNcbiAgICAgICAgdGhpcy51cGRhdGVMZWdlbmRzKHsgdmlld1NjYWxlOiB2aWV3U2NhbGUsIHJlc29sdXRpb246IHJlc29sdXRpb24sIHo6IHosIGNlbGxzOiBjZWxscyB9KVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgU2lkZVN0eWxlIH0gZnJvbSAnLi9TaWRlU3R5bGUuanMnXG5pbXBvcnQgeyBtYXggfSBmcm9tICdkMy1hcnJheSdcblxuLyoqIEB0eXBlZGVmIHt7IHg6bnVtYmVyLCB5Om51bWJlciwgb3I6XCJ2XCJ8XCJoXCIsIGMxOihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwpfHVuZGVmaW5lZCwgYzI6KGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbCl8dW5kZWZpbmVkIH19IFNpZGUgKi9cblxuXG4vKipcbiAqIEBtb2R1bGUgc3R5bGVcbiAqIEBhdXRob3IgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIFNoYWRpbmdTdHlsZSBleHRlbmRzIFNpZGVTdHlsZSB7XG5cbiAgICAvKiogQHBhcmFtIHtvYmplY3R9IG9wdHNcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0cy5lbGV2YXRpb25cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IG9wdHMuZGlhbW9uZFxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IG9wdHMuc2NhbGVcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBvcHRzLndpZHRoXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG9wdHMucmVsaWVmRGlyZWN0aW9uXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG9wdHMuY29sb3JUb3BMZWZ0XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG9wdHMuY29sb3JCb3R0b21SaWdodFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMgPSB7fSkge1xuICAgICAgICBzdXBlcihvcHRzKVxuXG4gICAgICAgIC8qKiBUaGUgY2VsbCBlbGV2YXRpb24gZmllbGQgbmFtZVxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfSAqL1xuICAgICAgICBjb25zdCBlbGV2YXRpb24gPSBvcHRzLmVsZXZhdGlvblxuXG4gICAgICAgIC8vIGNvbXB1dGUgc2lkZSB2YWx1ZSBhcyBlbGV2YXRpb24gZGlmZmVyZW5jZSBhbmQgYXR0YWNoIHRvIHNpZGVcbiAgICAgICAgY29uc3Qgc2lkZVZhbHVlID0gKC8qKiBAdHlwZSB7U2lkZX0gKi8gc2lkZSkgPT4ge1xuICAgICAgICAgICAgaWYgKCFzaWRlLmMxKSBzaWRlLnYgPSAwXG4gICAgICAgICAgICBlbHNlIGlmICghc2lkZS5jMikgc2lkZS52ID0gMFxuICAgICAgICAgICAgZWxzZSBpZiAoIXNpZGUuYzFbZWxldmF0aW9uXSkgc2lkZS52ID0gMFxuICAgICAgICAgICAgZWxzZSBpZiAoIXNpZGUuYzJbZWxldmF0aW9uXSkgc2lkZS52ID0gMFxuICAgICAgICAgICAgZWxzZSBzaWRlLnYgPSArc2lkZS5jMltlbGV2YXRpb25dIC0gc2lkZS5jMVtlbGV2YXRpb25dXG4gICAgICAgICAgICByZXR1cm4gc2lkZS52XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjb21wdXRlIG1heGltdW0gc2lkZSB2YWx1ZSBmb3Igbm9ybWFsaXphdGlvblxuICAgICAgICB0aGlzLnZpZXdTY2FsZSA9IHNpZGVzID0+IG1heChzaWRlcywgcyA9PiBzaWRlVmFsdWUocykpXG5cbiAgICAgICAgY29uc3QgY29sb3JUb3BMZWZ0ID0gb3B0cy5jb2xvclRvcExlZnQgfHwgJzI1NSwyNTUsMjU1J1xuICAgICAgICBjb25zdCBjb2xvckJvdHRvbVJpZ2h0ID0gb3B0cy5jb2xvckJvdHRvbVJpZ2h0IHx8ICcwLDAsMCdcbiAgICAgICAgY29uc3Qgc2NhbGUgPSBvcHRzLnNjYWxlIHx8ICh0PT50KVxuXG4gICAgICAgIHRoaXMuY29sb3IgPSAoc2lkZSwgcmVzb2x1dGlvbiwgeiwgbWF4KSA9PiB7XG4gICAgICAgICAgICBpZiAoc2lkZS52ID09IDApIHJldHVyblxuICAgICAgICAgICAgbGV0IGNvZWZmID0gTWF0aC5hYnMoc2lkZS52IC8gbWF4KVxuICAgICAgICAgICAgY29lZmYgPSBzY2FsZShjb2VmZilcbiAgICAgICAgICAgIGlmICgoc2lkZS52IDwgMCAmJiBzaWRlLm9yID09PSAnaCcpIHx8IChzaWRlLnYgPiAwICYmIHNpZGUub3IgPT09ICd2JykpXG4gICAgICAgICAgICAgICAgcmV0dXJuICdyZ2JhKCcgKyBjb2xvclRvcExlZnQgKyAnLCcgKyBjb2VmZiArICcpJ1xuICAgICAgICAgICAgcmV0dXJuICdyZ2JhKCcgKyBjb2xvckJvdHRvbVJpZ2h0ICsgJywnICsgY29lZmYgKyAnKSdcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMud2lkdGggPSAoXywgciwgeikgPT4gb3B0cy53aWR0aCB8IE1hdGgubWluKDIgKiB6LCByIC8gMylcbiAgICAgICAgdGhpcy5kaWFtb25kID0gb3B0cy5kaWFtb25kXG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBTdHlsZSB9IGZyb20gJy4uL2NvcmUvU3R5bGUuanMnXG5cbi8qKlxuICogQSB2ZXJ5IGdlbmVyaWMgc3R5bGUgdGhhdCBzaG93cyBncmlkIGNlbGxzIHdpdGggc3BlY2lmaWMgY29sb3IsIHNpemUgYW5kIHNoYXBlLlxuICogSXQgY2FuIGJlIHVzZWQgdG8gc2hvdyB2YXJpYWJsZXMgYXMgY2VsbCBjb2xvcnMsIGNlbGwgc2l6ZSwgY2VsbCBzaGFwZSwgb3IgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSB0aHJlZSB2aXN1YWwgdmFyaWFibGVzLlxuICpcbiAqIEBtb2R1bGUgc3R5bGVcbiAqIEBhdXRob3IgSm9zZXBoIERhdmllcywgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIFNoYXBlQ29sb3JTaXplU3R5bGUgZXh0ZW5kcyBTdHlsZSB7XG4gICAgLyoqIEBwYXJhbSB7b2JqZWN0fSBvcHRzICovXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKVxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuICAgICAgICAvKiogQHR5cGUgeyhmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwsIG51bWJlciwgbnVtYmVyLCBvYmplY3QpOnN0cmluZykgfCBzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuY29sb3IgPSBvcHRzLmNvbG9yIHx8ICcjRUE2QkFDJ1xuXG4gICAgICAgIC8qKiBAdHlwZSB7KGZ1bmN0aW9uKGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbCwgbnVtYmVyLCBudW1iZXIsIG9iamVjdCk6bnVtYmVyKSB8IG51bWJlcn0gKi9cbiAgICAgICAgdGhpcy5zaXplID0gb3B0cy5zaXplIHx8ICgoY2VsbCwgcmVzb2x1dGlvbikgPT4gcmVzb2x1dGlvbilcblxuICAgICAgICAvKiogQHR5cGUgeyhmdW5jdGlvbihpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXQuanNcIikuQ2VsbCxudW1iZXIsIG51bWJlcixvYmplY3QpOmltcG9ydChcIi4uL2NvcmUvU3R5bGUuanNcIikuU2hhcGUpIHwgc3RyaW5nfSAqL1xuICAgICAgICB0aGlzLnNoYXBlID0gb3B0cy5zaGFwZSB8fCAnc3F1YXJlJ1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERyYXcgY2VsbHMgYXMgc3F1YXJlcywgd2l0aCB2YXJpb3VzIGNvbG9ycyBhbmQgc2l6ZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXQuanNcIikuQ2VsbD59IGNlbGxzIC0gVGhlIGdyaWQgY2VsbHMgdG8gZHJhdy5cbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvcmUvR2VvQ2FudmFzLmpzXCIpLkdlb0NhbnZhc30gZ2VvQ2FudmFzIC0gVGhlIGNhbnZhcyB0byBkcmF3IG9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByZXNvbHV0aW9uIC0gUmVzb2x1dGlvbiBvZiB0aGUgZ3JpZC5cbiAgICAgKiBAb3ZlcnJpZGVcbiAgICAgKi9cbiAgICBkcmF3KGNlbGxzLCBnZW9DYW52YXMsIHJlc29sdXRpb24pIHtcbiAgICAgICAgLy9maWx0ZXJcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyKSBjZWxscyA9IGNlbGxzLmZpbHRlcih0aGlzLmZpbHRlcilcblxuICAgICAgICAvL3pvb21cbiAgICAgICAgY29uc3QgeiA9IGdlb0NhbnZhcy52aWV3LnpcblxuICAgICAgICAvL2dldCB2aWV3IHNjYWxlXG4gICAgICAgIGNvbnN0IHZpZXdTY2FsZSA9IHRoaXMudmlld1NjYWxlID8gdGhpcy52aWV3U2NhbGUoY2VsbHMsIHJlc29sdXRpb24sIHopIDogdW5kZWZpbmVkXG5cbiAgICAgICAgY29uc3QgcjIgPSByZXNvbHV0aW9uICogMC41XG5cbiAgICAgICAgLy8gUHJlY29tcHV0ZSBpZiBjb2xvciwgc2l6ZSwgYW5kIHNoYXBlIGFyZSBmdW5jdGlvbnMsIGZvciBlZmZpY2llbmN5XG4gICAgICAgIGNvbnN0IGlzQ29sb3JGdW5jdGlvbiA9IHR5cGVvZiB0aGlzLmNvbG9yID09PSAnZnVuY3Rpb24nXG4gICAgICAgIGNvbnN0IGlzU2l6ZUZ1bmN0aW9uID0gdHlwZW9mIHRoaXMuc2l6ZSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICBjb25zdCBpc1NoYXBlRnVuY3Rpb24gPSB0eXBlb2YgdGhpcy5zaGFwZSA9PT0gJ2Z1bmN0aW9uJ1xuXG4gICAgICAgIGNvbnN0IGRlZmF1bHRDb2xvciA9IHRoaXMuY29sb3IgfHwgJ2JsYWNrJ1xuICAgICAgICBjb25zdCBkZWZhdWx0U2l6ZSA9IHRoaXMuc2l6ZSB8fCByZXNvbHV0aW9uXG4gICAgICAgIGNvbnN0IGRlZmF1bHRTaGFwZSA9IHRoaXMuc2hhcGUgfHwgJ3NxdWFyZSdcblxuICAgICAgICAvLyBPcHRpbWl6ZWRcbiAgICAgICAgY29uc3QgY29sb3JGdW5jdGlvbiA9IGlzQ29sb3JGdW5jdGlvbiA/IHRoaXMuY29sb3IgOiBudWxsXG4gICAgICAgIGNvbnN0IHNpemVGdW5jdGlvbiA9IGlzU2l6ZUZ1bmN0aW9uID8gdGhpcy5zaXplIDogbnVsbFxuICAgICAgICBjb25zdCBzaGFwZUZ1bmN0aW9uID0gaXNTaGFwZUZ1bmN0aW9uID8gdGhpcy5zaGFwZSA6IG51bGxcblxuICAgICAgICBmb3IgKGxldCBjIG9mIGNlbGxzKSB7XG4gICAgICAgICAgICAvLyBEZXRlcm1pbmUgY29sb3JcbiAgICAgICAgICAgIC8vQHRzLWlnbm9yZVxuICAgICAgICAgICAgY29uc3QgY29sID0gY29sb3JGdW5jdGlvbiA/IGNvbG9yRnVuY3Rpb24oYywgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IGRlZmF1bHRDb2xvclxuICAgICAgICAgICAgaWYgKCFjb2wgfHwgY29sID09PSAnbm9uZScpIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIC8vIERldGVybWluZSBzaXplXG4gICAgICAgICAgICAvL0B0cy1pZ25vcmVcbiAgICAgICAgICAgIGNvbnN0IHNpemUgPSBzaXplRnVuY3Rpb24gPyBzaXplRnVuY3Rpb24oYywgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IGRlZmF1bHRTaXplXG4gICAgICAgICAgICBpZiAoIXNpemUpIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIC8vIERldGVybWluZSBzaGFwZVxuICAgICAgICAgICAgLy9AdHMtaWdub3JlXG4gICAgICAgICAgICBjb25zdCBzaGFwZSA9IHNoYXBlRnVuY3Rpb24gPyBzaGFwZUZ1bmN0aW9uKGMsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgOiBkZWZhdWx0U2hhcGVcbiAgICAgICAgICAgIGlmIChzaGFwZSA9PT0gJ25vbmUnKSBjb250aW51ZVxuXG4gICAgICAgICAgICAvL2dldCBvZmZzZXRcbiAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMub2Zmc2V0KGMsIHJlc29sdXRpb24sIHopXG5cbiAgICAgICAgICAgIC8vZ2V0IGNvbnRleHRcbiAgICAgICAgICAgIGNvbnN0IGN0eCA9IGdlb0NhbnZhcy5vZmZzY3JlZW5DdHhcbiAgICAgICAgICAgIGN0eC5maWxsU3R5bGUgPSBjb2xcbiAgICAgICAgICAgIGlmIChzaGFwZSA9PT0gJ3NxdWFyZScpIHtcbiAgICAgICAgICAgICAgICAvL2RyYXcgc3F1YXJlXG4gICAgICAgICAgICAgICAgY29uc3QgZCA9IHJlc29sdXRpb24gKiAoMSAtIHNpemUgLyByZXNvbHV0aW9uKSAqIDAuNVxuICAgICAgICAgICAgICAgIGN0eC5maWxsUmVjdChjLnggKyBkICsgb2Zmc2V0LmR4LCBjLnkgKyBkICsgb2Zmc2V0LmR5LCBzaXplLCBzaXplKVxuICAgICAgICAgICAgfSBlbHNlIGlmIChzaGFwZSA9PT0gJ2NpcmNsZScpIHtcbiAgICAgICAgICAgICAgICAvL2RyYXcgY2lyY2xlXG4gICAgICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICAgICAgY3R4LmFyYyhjLnggKyByMiArIG9mZnNldC5keCwgYy55ICsgcjIgKyBvZmZzZXQuZHksIHNpemUgKiAwLjUsIDAsIDIgKiBNYXRoLlBJLCBmYWxzZSlcbiAgICAgICAgICAgICAgICBjdHguZmlsbCgpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNoYXBlID09PSAnZG9udXQnKSB7XG4gICAgICAgICAgICAgICAgLy9kcmF3IGRvbnV0XG4gICAgICAgICAgICAgICAgY29uc3QgeGMgPSBjLnggKyByMiArIG9mZnNldC5keCxcbiAgICAgICAgICAgICAgICAgICAgeWMgPSBjLnkgKyByMiArIG9mZnNldC5keVxuICAgICAgICAgICAgICAgIGN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgICAgIGN0eC5tb3ZlVG8oeGMsIHljKVxuICAgICAgICAgICAgICAgIGN0eC5hcmMoeGMsIHljLCByMiwgMCwgMiAqIE1hdGguUEkpXG4gICAgICAgICAgICAgICAgY3R4LmFyYyh4YywgeWMsICgxIC0gc2l6ZSAvIHJlc29sdXRpb24pICogcjIsIDAsIDIgKiBNYXRoLlBJLCB0cnVlKVxuICAgICAgICAgICAgICAgIGN0eC5jbG9zZVBhdGgoKVxuICAgICAgICAgICAgICAgIGN0eC5maWxsKClcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2hhcGUgPT09ICdkaWFtb25kJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHMyID0gc2l6ZSAqIDAuNVxuICAgICAgICAgICAgICAgIGN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgICAgIGN0eC5tb3ZlVG8oYy54ICsgcjIgLSBzMiwgYy55ICsgcjIpXG4gICAgICAgICAgICAgICAgY3R4LmxpbmVUbyhjLnggKyByMiwgYy55ICsgcjIgKyBzMilcbiAgICAgICAgICAgICAgICBjdHgubGluZVRvKGMueCArIHIyICsgczIsIGMueSArIHIyKVxuICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oYy54ICsgcjIsIGMueSArIHIyIC0gczIpXG4gICAgICAgICAgICAgICAgY3R4LmZpbGwoKVxuICAgICAgICAgICAgfSBlbHNlIGlmIChzaGFwZSA9PT0gJ3RyaWFuZ2xlX3VwJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRyMiA9IChzaXplIC0gcmVzb2x1dGlvbikgLyAyXG4gICAgICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICAgICAgY3R4Lm1vdmVUbyhjLnggLSBkcjIsIGMueSAtIGRyMilcbiAgICAgICAgICAgICAgICBjdHgubGluZVRvKGMueCArIHIyLCBjLnkgKyByZXNvbHV0aW9uICsgZHIyKVxuICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oYy54ICsgcmVzb2x1dGlvbiArIGRyMiwgYy55IC0gZHIyKVxuICAgICAgICAgICAgICAgIGN0eC5maWxsKClcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2hhcGUgPT09ICd0cmlhbmdsZV9kb3duJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRyMiA9IChzaXplIC0gcmVzb2x1dGlvbikgLyAyXG4gICAgICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICAgICAgY3R4Lm1vdmVUbyhjLnggLSBkcjIsIGMueSArIHJlc29sdXRpb24gKyBkcjIpXG4gICAgICAgICAgICAgICAgY3R4LmxpbmVUbyhjLnggKyByMiwgYy55IC0gZHIyKVxuICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oYy54ICsgcmVzb2x1dGlvbiArIGRyMiwgYy55ICsgcmVzb2x1dGlvbiArIGRyMilcbiAgICAgICAgICAgICAgICBjdHguZmlsbCgpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNoYXBlID09PSAndHJpYW5nbGVfbGVmdCcpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkcjIgPSAoc2l6ZSAtIHJlc29sdXRpb24pIC8gMlxuICAgICAgICAgICAgICAgIGN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgICAgIGN0eC5tb3ZlVG8oYy54ICsgcmVzb2x1dGlvbiArIGRyMiwgYy55ICsgcmVzb2x1dGlvbiArIGRyMilcbiAgICAgICAgICAgICAgICBjdHgubGluZVRvKGMueCAtIGRyMiwgYy55ICsgcjIpXG4gICAgICAgICAgICAgICAgY3R4LmxpbmVUbyhjLnggKyByZXNvbHV0aW9uICsgZHIyLCBjLnkgLSBkcjIpXG4gICAgICAgICAgICAgICAgY3R4LmZpbGwoKVxuICAgICAgICAgICAgfSBlbHNlIGlmIChzaGFwZSA9PT0gJ3RyaWFuZ2xlX3JpZ2h0Jykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRyMiA9IChzaXplIC0gcmVzb2x1dGlvbikgLyAyXG4gICAgICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICAgICAgY3R4Lm1vdmVUbyhjLnggLSBkcjIsIGMueSAtIGRyMilcbiAgICAgICAgICAgICAgICBjdHgubGluZVRvKGMueCArIHJlc29sdXRpb24gKyBkcjIsIGMueSArIHIyKVxuICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oYy54IC0gZHIyLCBjLnkgKyByZXNvbHV0aW9uICsgZHIyKVxuICAgICAgICAgICAgICAgIGN0eC5maWxsKClcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIHNoYXBlOicgKyBzaGFwZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vdXBkYXRlIGxlZ2VuZHNcbiAgICAgICAgdGhpcy51cGRhdGVMZWdlbmRzKHsgdmlld1NjYWxlOiB2aWV3U2NhbGUsIHJlc29sdXRpb246IHJlc29sdXRpb24sIHo6IHosIGNlbGxzOiBjZWxscyB9KVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgU2lkZVN0eWxlIH0gZnJvbSAnLi9TaWRlU3R5bGUuanMnXG5cbi8qKlxuICogQSBzdHlsZSB0byBzaG93IHRoZSBzaWRlcyBvZiBncmlkIGNlbGxzIGJhc2VkIG9uIHRoZWlyIGRpZmZlcmVudCBjYXRlZ29yaWVzLlxuICpcbiAqIEBtb2R1bGUgc3R5bGVcbiAqIEBhdXRob3IgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIFNpZGVDYXRlZ29yeVN0eWxlIGV4dGVuZHMgU2lkZVN0eWxlIHtcbiAgICAvKiogQHBhcmFtIHtvYmplY3R9IG9wdHMgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBjYXRlZ29yeSBjb2RlIG9mIGEgY2VsbC5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbCwgbnVtYmVyLCBudW1iZXIpOnN0cmluZ30gKi9cbiAgICAgICAgdGhpcy5jb2RlID0gb3B0cy5jb2RlXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBkaWN0aW9uYXJ5IChzdHJpbmcgLT4gY29sb3IpIHdoaWNoIGdpdmUgdGhlIGNvbG9yIG9mIGVhY2ggY2F0ZWdvcnkuXG4gICAgICAgICAqIEB0eXBlIHtvYmplY3R9ICovXG4gICAgICAgIHRoaXMuY29sb3IgPSBvcHRzLmNvbG9yXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0LmpzXCIpLkNlbGw+fSBjZWxsc1xuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29yZS9HZW9DYW52YXMuanNcIikuR2VvQ2FudmFzfSBnZW9DYW52YXNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVzb2x1dGlvblxuICAgICAqL1xuICAgIGRyYXcoY2VsbHMsIGdlb0NhbnZhcywgcmVzb2x1dGlvbikge1xuICAgICAgICAvL2ZpbHRlclxuICAgICAgICBpZiAodGhpcy5maWx0ZXIpIGNlbGxzID0gY2VsbHMuZmlsdGVyKHRoaXMuZmlsdGVyKVxuXG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IHogPSBnZW9DYW52YXMudmlldy56XG4gICAgICAgIGNvbnN0IGN0eCA9IGdlb0NhbnZhcy5vZmZzY3JlZW5DdHhcblxuICAgICAgICAvL2J1aWxkIHNpZGVzXG5cbiAgICAgICAgLyoqICBAdHlwZSB7QXJyYXkuPGltcG9ydCgnLi9TaWRlU3R5bGUuanMnKS5TaWRlPn0gKi9cbiAgICAgICAgY29uc3Qgc2lkZXMgPSBTaWRlU3R5bGUuYnVpbGRTaWRlcyhjZWxscywgcmVzb2x1dGlvbilcbiAgICAgICAgaWYgKHNpZGVzLmxlbmd0aCA9PSAwKSByZXR1cm5cblxuICAgICAgICAvL2dldCBzaWRlIHZpZXcgc2NhbGVcbiAgICAgICAgY29uc3Qgdmlld1NjYWxlID0gdGhpcy52aWV3U2NhbGUgPyB0aGlzLnZpZXdTY2FsZShzaWRlcywgcmVzb2x1dGlvbiwgeikgOiB1bmRlZmluZWRcblxuICAgICAgICAvL2RyYXcgc2lkZXNcblxuICAgICAgICBjdHgubGluZUNhcCA9ICdidXR0J1xuICAgICAgICBjb25zdCByMiA9IHJlc29sdXRpb24gKiAwLjVcbiAgICAgICAgZm9yIChsZXQgc2lkZSBvZiBzaWRlcykge1xuICAgICAgICAgICAgLy9nZXQgY2F0ZWdvcnkgY29kZXMgZm9yIGJvdGggY2VsbHNcbiAgICAgICAgICAgIGNvbnN0IGNvZGUxID0gc2lkZS5jMSA/IHRoaXMuY29kZShzaWRlLmMxLCByZXNvbHV0aW9uLCB6KSA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgY29uc3QgY29kZTIgPSBzaWRlLmMyID8gdGhpcy5jb2RlKHNpZGUuYzIsIHJlc29sdXRpb24sIHopIDogdW5kZWZpbmVkXG4gICAgICAgICAgICBpZiAoY29kZTEgPT0gY29kZTIpIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIC8vd2lkdGhcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfHVuZGVmaW5lZH0gKi9cbiAgICAgICAgICAgIGNvbnN0IHdHID0gdGhpcy53aWR0aCA/IHRoaXMud2lkdGgoc2lkZSwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgaWYgKCF3RyB8fCB3RyA8PSAwKSBjb250aW51ZVxuICAgICAgICAgICAgY29uc3QgdzIgPSB3RyAqIDAuNVxuXG4gICAgICAgICAgICAvL3NldCB3aWR0aFxuICAgICAgICAgICAgY3R4LmxpbmVXaWR0aCA9IHdHXG5cbiAgICAgICAgICAgIC8vZHJhdyBzZWdtZW50IHdpdGggY29ycmVjdCBvcmllbnRhdGlvblxuICAgICAgICAgICAgaWYgKHNpZGUub3IgPT09ICdoJykge1xuICAgICAgICAgICAgICAgIC8vdG9wIGxpbmVcbiAgICAgICAgICAgICAgICBpZiAoY29kZTIpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICAgICAgICAgIGN0eC5zdHJva2VTdHlsZSA9IHRoaXMuY29sb3JbY29kZTJdXG4gICAgICAgICAgICAgICAgICAgIGN0eC5tb3ZlVG8oc2lkZS54IC0gcjIsIHNpZGUueSArIHcyKVxuICAgICAgICAgICAgICAgICAgICBjdHgubGluZVRvKHNpZGUueCArIHIyLCBzaWRlLnkgKyB3MilcbiAgICAgICAgICAgICAgICAgICAgY3R4LnN0cm9rZSgpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy9ib3R0b20gbGluZVxuICAgICAgICAgICAgICAgIGlmIChjb2RlMSkge1xuICAgICAgICAgICAgICAgICAgICBjdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICAgICAgY3R4LnN0cm9rZVN0eWxlID0gdGhpcy5jb2xvcltjb2RlMV1cbiAgICAgICAgICAgICAgICAgICAgY3R4Lm1vdmVUbyhzaWRlLnggLSByMiwgc2lkZS55IC0gdzIpXG4gICAgICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oc2lkZS54ICsgcjIsIHNpZGUueSAtIHcyKVxuICAgICAgICAgICAgICAgICAgICBjdHguc3Ryb2tlKClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vcmlnaHQgbGluZVxuICAgICAgICAgICAgICAgIGlmIChjb2RlMikge1xuICAgICAgICAgICAgICAgICAgICBjdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICAgICAgY3R4LnN0cm9rZVN0eWxlID0gdGhpcy5jb2xvcltjb2RlMl1cbiAgICAgICAgICAgICAgICAgICAgY3R4Lm1vdmVUbyhzaWRlLnggKyB3Miwgc2lkZS55IC0gcjIpXG4gICAgICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oc2lkZS54ICsgdzIsIHNpZGUueSArIHIyKVxuICAgICAgICAgICAgICAgICAgICBjdHguc3Ryb2tlKClcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvL2xlZnQgbGluZVxuICAgICAgICAgICAgICAgIGlmIChjb2RlMSkge1xuICAgICAgICAgICAgICAgICAgICBjdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICAgICAgY3R4LnN0cm9rZVN0eWxlID0gdGhpcy5jb2xvcltjb2RlMV1cbiAgICAgICAgICAgICAgICAgICAgY3R4Lm1vdmVUbyhzaWRlLnggLSB3Miwgc2lkZS55IC0gcjIpXG4gICAgICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oc2lkZS54IC0gdzIsIHNpZGUueSArIHIyKVxuICAgICAgICAgICAgICAgICAgICBjdHguc3Ryb2tlKClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvL3VwZGF0ZSBsZWdlbmRzXG4gICAgICAgIHRoaXMudXBkYXRlTGVnZW5kcyh7IHN0eWxlOiB0aGlzLCByZXNvbHV0aW9uOiByZXNvbHV0aW9uLCB6OiB6LCB2aWV3U2NhbGU6IHZpZXdTY2FsZSB9KVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgU3R5bGUgfSBmcm9tICcuLi9jb3JlL1N0eWxlLmpzJ1xuXG4vKiogQHR5cGVkZWYge3sgeDpudW1iZXIsIHk6bnVtYmVyLCBvcjpcInZcInxcImhcIiwgYzE6KGltcG9ydCgnLi4vY29yZS9EYXRhc2V0JykuQ2VsbCl8dW5kZWZpbmVkLCBjMjooaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQnKS5DZWxsKXx1bmRlZmluZWQgfX0gU2lkZSAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtmdW5jdGlvbihBcnJheS48U2lkZT4sbnVtYmVyLCBudW1iZXIpOip9IFNpZGVWaWV3U2NhbGUgKi9cblxuLyoqXG4gKiBAbW9kdWxlIHN0eWxlXG4gKiBAYXV0aG9yIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBTaWRlU3R5bGUgZXh0ZW5kcyBTdHlsZSB7XG4gICAgLyoqIEBwYXJhbSB7b2JqZWN0fSBvcHRzICovXG4gICAgY29uc3RydWN0b3Iob3B0cyA9IHt9KSB7XG4gICAgICAgIHN1cGVyKG9wdHMpXG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBjb2xvciBvZiBhIGNlbGwgc2lkZS5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKFNpZGUsIG51bWJlciwgbnVtYmVyLCBvYmplY3QpOnN0cmluZ30gKi9cbiAgICAgICAgdGhpcy5jb2xvciA9IG9wdHMuY29sb3IgfHwgKChzaWRlLCByZXNvbHV0aW9uLCB6LCBzaWRlVmlld1NjYWxlKSA9PiAnI0VBNkJBQycpXG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSB3aWR0aCBvZiBhIGNlbGwgc2lkZSwgaW4gZ2VvIHVuaXRcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKFNpZGUsIG51bWJlciwgbnVtYmVyLCBvYmplY3QpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy53aWR0aCA9IG9wdHMud2lkdGggfHwgKChzaWRlLCByZXNvbHV0aW9uLCB6LCBzaWRlVmlld1NjYWxlKSA9PiByZXNvbHV0aW9uIC8gNSlcblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIGxlbmd0aCBvZiBhIGNlbGwgc2lkZSwgaW4gZ2VvIHVuaXRcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKFNpZGUsIG51bWJlciwgbnVtYmVyLCBvYmplY3QpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy5sZW5ndGggPSBvcHRzLmxlbmd0aCB8fCAoKHNpZGUsIHJlc29sdXRpb24sIHosIHNpZGVWaWV3U2NhbGUpID0+IHJlc29sdXRpb24pXG5cbiAgICAgICAgLyoqIFNldCB0byBBIG9yIHRydWUgc28gdGhhdCB0aGUgc2lkZSBpcyBkcmF3biBhcyBhIGRpYW1vbmQgKi9cbiAgICAgICAgdGhpcy5kaWFtb25kID0gb3B0cy5kaWFtb25kXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0XCIpLkNlbGw+fSBjZWxsc1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByZXNvbHV0aW9uXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhc1wiKS5HZW9DYW52YXN9IGdlb0NhbnZhc1xuICAgICAqL1xuICAgIGRyYXcoY2VsbHMsIGdlb0NhbnZhcywgcmVzb2x1dGlvbikge1xuICAgICAgICAvL2ZpbHRlclxuICAgICAgICBpZiAodGhpcy5maWx0ZXIpIGNlbGxzID0gY2VsbHMuZmlsdGVyKHRoaXMuZmlsdGVyKVxuXG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IHogPSBnZW9DYW52YXMudmlldy56XG4gICAgICAgIGNvbnN0IGN0eCA9IGdlb0NhbnZhcy5vZmZzY3JlZW5DdHhcblxuICAgICAgICAvL2J1aWxkIHNpZGVzXG5cbiAgICAgICAgLyoqICBAdHlwZSB7QXJyYXkuPFNpZGU+fSAqL1xuICAgICAgICBjb25zdCBzaWRlcyA9IFNpZGVTdHlsZS5idWlsZFNpZGVzKGNlbGxzLCByZXNvbHV0aW9uKVxuICAgICAgICBpZiAoc2lkZXMubGVuZ3RoID09IDApIHJldHVyblxuXG4gICAgICAgIC8vZ2V0IHNpZGUgdmlldyBzY2FsZVxuICAgICAgICBjb25zdCB2aWV3U2NhbGUgPSB0aGlzLnZpZXdTY2FsZSA/IHRoaXMudmlld1NjYWxlKHNpZGVzLCByZXNvbHV0aW9uLCB6KSA6IHVuZGVmaW5lZFxuXG4gICAgICAgIC8vZHJhdyBzaWRlc1xuXG4gICAgICAgIGN0eC5saW5lQ2FwID0gJ2J1dHQnXG4gICAgICAgIGNvbnN0IHIyID0gcmVzb2x1dGlvbiAqIDAuNVxuICAgICAgICBmb3IgKGxldCBzaWRlIG9mIHNpZGVzKSB7XG4gICAgICAgICAgICAvL2NvbG9yXG4gICAgICAgICAgICAvKiogQHR5cGUge3N0cmluZ3x1bmRlZmluZWR9ICovXG4gICAgICAgICAgICBjb25zdCBjb2wgPSB0aGlzLmNvbG9yID8gdGhpcy5jb2xvcihzaWRlLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpIDogdW5kZWZpbmVkXG4gICAgICAgICAgICBpZiAoIWNvbCB8fCBjb2wgPT0gJ25vbmUnKSBjb250aW51ZVxuXG4gICAgICAgICAgICBpZiAodGhpcy5kaWFtb25kKSB7XG4gICAgICAgICAgICAgICAgLy9zZXQgY29sb3JcbiAgICAgICAgICAgICAgICBjdHguZmlsbFN0eWxlID0gY29sXG5cbiAgICAgICAgICAgICAgICAvL2RyYXcgZGlhbW9uZFxuICAgICAgICAgICAgICAgIGNvbnN0IHggPSBzaWRlLngsXG4gICAgICAgICAgICAgICAgICAgIHkgPSBzaWRlLnlcbiAgICAgICAgICAgICAgICBjdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICBjdHgubW92ZVRvKHggLSByMiwgeSlcbiAgICAgICAgICAgICAgICBjdHgubGluZVRvKHgsIHkgKyByMilcbiAgICAgICAgICAgICAgICBjdHgubGluZVRvKHggKyByMiwgeSlcbiAgICAgICAgICAgICAgICBjdHgubGluZVRvKHgsIHkgLSByMilcbiAgICAgICAgICAgICAgICBjdHguY2xvc2VQYXRoKClcbiAgICAgICAgICAgICAgICBjdHguZmlsbCgpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vd2lkdGhcbiAgICAgICAgICAgICAgICAvKiogQHR5cGUge251bWJlcnx1bmRlZmluZWR9ICovXG4gICAgICAgICAgICAgICAgY29uc3Qgd0cgPSB0aGlzLndpZHRoID8gdGhpcy53aWR0aChzaWRlLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpIDogdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgaWYgKCF3RyB8fCB3RyA8PSAwKSBjb250aW51ZVxuXG4gICAgICAgICAgICAgICAgLy9sZW5ndGhcbiAgICAgICAgICAgICAgICAvKiogQHR5cGUge251bWJlcnx1bmRlZmluZWR9ICovXG4gICAgICAgICAgICAgICAgY29uc3QgbEcgPSB0aGlzLmxlbmd0aCA/IHRoaXMubGVuZ3RoKHNpZGUsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgOiB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICBpZiAoIWxHIHx8IGxHIDw9IDApIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgY29uc3QgbEcyID0gbEcgKiAwLjVcblxuICAgICAgICAgICAgICAgIC8vc2V0IHdpZHRoXG4gICAgICAgICAgICAgICAgY3R4LmxpbmVXaWR0aCA9IHdHXG4gICAgICAgICAgICAgICAgLy9zZXQgY29sb3JcbiAgICAgICAgICAgICAgICBjdHguc3Ryb2tlU3R5bGUgPSBjb2xcblxuICAgICAgICAgICAgICAgIC8vZHJhdyBzZWdtZW50IHdpdGggY29ycmVjdCBvcmllbnRhdGlvblxuICAgICAgICAgICAgICAgIGNvbnN0IHggPSBzaWRlLngsXG4gICAgICAgICAgICAgICAgICAgIHkgPSBzaWRlLnlcbiAgICAgICAgICAgICAgICBjdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICBpZiAoc2lkZS5vciA9PT0gJ3YnKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eC5tb3ZlVG8oeCwgeSAtIGxHMilcbiAgICAgICAgICAgICAgICAgICAgY3R4LmxpbmVUbyh4LCB5ICsgbEcyKVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eC5tb3ZlVG8oeCAtIGxHMiwgeSlcbiAgICAgICAgICAgICAgICAgICAgY3R4LmxpbmVUbyh4ICsgbEcyLCB5KVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjdHguc3Ryb2tlKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vdXBkYXRlIGxlZ2VuZHNcbiAgICAgICAgdGhpcy51cGRhdGVMZWdlbmRzKHsgc3R5bGU6IHRoaXMsIHJlc29sdXRpb246IHJlc29sdXRpb24sIHo6IHosIHZpZXdTY2FsZTogdmlld1NjYWxlIH0pXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoJy4uL2NvcmUvRGF0YXNldCcpLkNlbGw+fSBjZWxscyBUaGUgY2VsbHMgdG8gdXNlIHRvIGJ1aWxkIHRoZSBzaWRlcy5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVzb2x1dGlvbiBUaGUgY2VsbHMgcmVzb2x1dGlvblxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gd2l0aEhvcml6b250YWwgU2V0IHRvIHRydWUgdG8gYnVpbGQgaG9yaXpvbnRhbCBzaWRlcywgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gd2l0aFZlcnRpY2FsIFNldCB0byB0cnVlIHRvIGJ1aWxkIHZlcnRpY2FsIHNpZGVzLCBmYWxzZSBvdGhlcndpc2UuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBjZW50ZXIgU2V0IHRvIHRydWUgc28gdGhhdCB0aGUgc2lkZSBjb29yZGluYXRlIGFyZSB0aG9zZSBvZiBpdHMgY2VudGVyIHBvaW50IHJhdGhlciB0aGFuIGl0cyBsZWZ0L2JvdHRvbSBwb2ludCAodGhlIHNpZGUgeCx5IGNvb3JkaW5hdGVzIGFyZSB0aG9zZSBvZiB0aGUgbGVmdCBwb2ludCBmb3IgaG9yaXpvbnRhbCBzaWRlcywgYW5kIG9mIHRoZSBib3R0b20gcG9pbnQgZm9yIHZlcnRpY2FsIHNpZGVzKVxuICAgICAqIEByZXR1cm5zIHsgQXJyYXkuPFNpZGU+IH1cbiAgICAgKi9cbiAgICBzdGF0aWMgYnVpbGRTaWRlcyhjZWxscywgcmVzb2x1dGlvbiwgd2l0aEhvcml6b250YWwgPSB0cnVlLCB3aXRoVmVydGljYWwgPSB0cnVlLCBjZW50ZXIgPSB0cnVlKSB7XG4gICAgICAgIC8qKiBAdHlwZSB7IEFycmF5LjxTaWRlPiB9ICovXG4gICAgICAgIGNvbnN0IHNpZGVzID0gW11cblxuICAgICAgICBjb25zdCByMiA9IGNlbnRlciA/IHJlc29sdXRpb24gLyAyIDogMFxuXG4gICAgICAgIC8vbWFrZSBob3Jpem9udGFsIHNpZGVzXG4gICAgICAgIC8vc29ydCBjZWxscyBieSB4IGFuZCB5XG4gICAgICAgIGNlbGxzLnNvcnQoKGMxLCBjMikgPT4gKGMyLnggPT0gYzEueCA/IGMxLnkgLSBjMi55IDogYzEueCAtIGMyLngpKVxuICAgICAgICBsZXQgYzEgPSBjZWxsc1swXVxuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGNlbGxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgYzIgPSBjZWxsc1tpXVxuXG4gICAgICAgICAgICBpZiAoYzEueSArIHJlc29sdXRpb24gPT0gYzIueSAmJiBjMS54ID09IGMyLngpXG4gICAgICAgICAgICAgICAgLy9jZWxscyBpbiBzYW1lIGNvbHVtbiBhbmQgdG91Y2ggYWxvbmcgaG9yaXpvbnRhbCBzaWRlXG4gICAgICAgICAgICAgICAgLy9tYWtlIHNoYXJlZCBzaWRlXG4gICAgICAgICAgICAgICAgc2lkZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIG9yOiAnaCcsXG4gICAgICAgICAgICAgICAgICAgIHg6IGMxLnggKyByMixcbiAgICAgICAgICAgICAgICAgICAgeTogYzIueSxcbiAgICAgICAgICAgICAgICAgICAgYzE6IGMxLFxuICAgICAgICAgICAgICAgICAgICBjMjogYzIsXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vY2VsbHMgZG8gbm90IHRvdWNoIGFsb25nIGhvcml6b250YWwgc2lkZVxuICAgICAgICAgICAgICAgIC8vbWFrZSB0d28gc2lkZXM6IHRvcCBvbmUgZm9yIGMxLCBib3R0b20gZm9yIGMyXG4gICAgICAgICAgICAgICAgc2lkZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIG9yOiAnaCcsXG4gICAgICAgICAgICAgICAgICAgIHg6IGMxLnggKyByMixcbiAgICAgICAgICAgICAgICAgICAgeTogYzEueSArIHJlc29sdXRpb24sXG4gICAgICAgICAgICAgICAgICAgIGMxOiBjMSxcbiAgICAgICAgICAgICAgICAgICAgYzI6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIHNpZGVzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBvcjogJ2gnLFxuICAgICAgICAgICAgICAgICAgICB4OiBjMi54ICsgcjIsXG4gICAgICAgICAgICAgICAgICAgIHk6IGMyLnksXG4gICAgICAgICAgICAgICAgICAgIGMxOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgIGMyOiBjMixcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjMSA9IGMyXG4gICAgICAgIH1cblxuICAgICAgICAvL21ha2UgdmVydGljYWwgc2lkZXNcbiAgICAgICAgLy9zb3J0IGNlbGxzIGJ5IHkgYW5kIHhcbiAgICAgICAgY2VsbHMuc29ydCgoYzEsIGMyKSA9PiAoYzIueSA9PSBjMS55ID8gYzEueCAtIGMyLnggOiBjMS55IC0gYzIueSkpXG4gICAgICAgIGMxID0gY2VsbHNbMF1cbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBjZWxscy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGMyID0gY2VsbHNbaV1cblxuICAgICAgICAgICAgaWYgKGMxLnggKyByZXNvbHV0aW9uID09IGMyLnggJiYgYzEueSA9PSBjMi55KVxuICAgICAgICAgICAgICAgIC8vY2VsbHMgaW4gc2FtZSByb3cgYW5kIHRvdWNoIGFsb25nIHZlcnRpY2FsIHNpZGVcbiAgICAgICAgICAgICAgICAvL21ha2Ugc2hhcmVkIHNpZGVcbiAgICAgICAgICAgICAgICBzaWRlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgb3I6ICd2JyxcbiAgICAgICAgICAgICAgICAgICAgeDogYzEueCArIHJlc29sdXRpb24sXG4gICAgICAgICAgICAgICAgICAgIHk6IGMxLnkgKyByMixcbiAgICAgICAgICAgICAgICAgICAgYzE6IGMxLFxuICAgICAgICAgICAgICAgICAgICBjMjogYzIsXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vY2VsbHMgZG8gbm90IHRvdWNoIGFsb25nIHZlcnRpY2FsIHNpZGVcbiAgICAgICAgICAgICAgICAvL21ha2UgdHdvIHNpZGVzOiByaWdodCBvbmUgZm9yIGMxLCBsZWZ0IGZvciBjMlxuICAgICAgICAgICAgICAgIHNpZGVzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBvcjogJ3YnLFxuICAgICAgICAgICAgICAgICAgICB4OiBjMS54ICsgcmVzb2x1dGlvbixcbiAgICAgICAgICAgICAgICAgICAgeTogYzEueSArIHIyLFxuICAgICAgICAgICAgICAgICAgICBjMTogYzEsXG4gICAgICAgICAgICAgICAgICAgIGMyOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICBzaWRlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgb3I6ICd2JyxcbiAgICAgICAgICAgICAgICAgICAgeDogYzIueCxcbiAgICAgICAgICAgICAgICAgICAgeTogYzIueSArIHIyLFxuICAgICAgICAgICAgICAgICAgICBjMTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICBjMjogYzIsXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYzEgPSBjMlxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzaWRlc1xuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgU3R5bGUgfSBmcm9tICcuLi9jb3JlL1N0eWxlLmpzJ1xuaW1wb3J0IHsgU2lkZVN0eWxlIH0gZnJvbSAnLi9TaWRlU3R5bGUuanMnXG5cbi8qKiBAdHlwZWRlZiB7eyB4Om51bWJlciwgeTpudW1iZXIsIG9yOlwidlwifFwiaFwiLCBjMTooaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsKXx1bmRlZmluZWQsIGMyOihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwpfHVuZGVmaW5lZCB9fSBTaWRlICovXG5cbi8qKlxuICogQHR5cGVkZWYge2Z1bmN0aW9uKEFycmF5LjxTaWRlPixudW1iZXIsIG51bWJlcik6Kn0gU2lkZVZpZXdTY2FsZSAqL1xuXG4vKipcbiAqIEBtb2R1bGUgc3R5bGVcbiAqIEBhdXRob3IgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIFNpZGVUYW5ha2FTdHlsZSBleHRlbmRzIFN0eWxlIHtcbiAgICAvKiogQHBhcmFtIHtvYmplY3R9IG9wdHMgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzID0ge30pIHtcbiAgICAgICAgc3VwZXIob3B0cylcblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIGNlbGxzIGNsYXNzaWZpZXIuXG4gICAgICAgICAqIFRoZSBjZWxsIGNsYXNzaWZpZXIgaXMgYSBmdW5jdGlvbiB0aGF0IGZvciBlYWNoIGNlbGwgcmV0dXJucyBpdHMgY2xhc3MgbnVtYmVyIChpbnQpLlxuICAgICAgICAqL1xuICAgICAgICB0aGlzLmNsYXNzaWZpZXIgPSBvcHRzLmNsYXNzaWZpZXIgfHwgKChjZWxscywgcmVzb2x1dGlvbiwgeikgPT4gYyA9PiAxKVxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgd2lkdGggb2YgYSBjZWxsIHNpZGUsIGluIGdlbyB1bml0XG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihTaWRlLCBudW1iZXIsIG51bWJlciwgbnVtYmVyLCBvYmplY3QpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy53aWR0aCA9IG9wdHMud2lkdGggfHwgKChzaWRlLCBzaWRlVmFsdWUsIHJlc29sdXRpb24sIHosIHNpZGVzU2NhbGUpID0+IE1hdGguYWJzKHNpZGVWYWx1ZSkgKiBNYXRoLm1pbigyICogeiwgcmVzb2x1dGlvbiAvIDMpKVxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgbGVuZ3RoIG9mIGEgY2VsbCBzaWRlLCBpbiBnZW8gdW5pdFxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oU2lkZSwgbnVtYmVyLCBudW1iZXIsIG9iamVjdCk6bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLmxlbmd0aCA9IG9wdHMubGVuZ3RoIHx8ICgoc2lkZSwgcmVzb2x1dGlvbiwgeiwgc2lkZXNTY2FsZSkgPT4gcmVzb2x1dGlvbilcblxuICAgICAgICAvLyB0aGUgZGFyayBjb2xvcjogZm9yIHNpZGUgZmFjaW5nIGF3YXkgZnJvbSBsaWdodCAoY29taW5nIGZyb20gTlcpXG4gICAgICAgIHRoaXMuY29sb3JEYXJrID0gb3B0cy5jb2xvckRhcmsgfHwgJyMxMTEnXG4gICAgICAgIC8vIHRoZSBicmlnaHQgY29sb3I6IGZvciBzaWRlIGZhY2luZyB0aGUgbGlnaHQgKGNvbWluZyBmcm9tIE5XKVxuICAgICAgICB0aGlzLmNvbG9yQnJpZ2h0ID0gb3B0cy5jb2xvckJyaWdodCB8fCAnI2RkZCdcbiAgICAgICAgLy9cbiAgICAgICAgdGhpcy5yZXZlcnQgPSBvcHRzLnJldmVydCA9PSB1bmRlZmluZWQ/IGZhbHNlIDogb3B0cy5yZXZlcnRcblxuICAgICAgICAvKiogU2V0IHRvIEEgb3IgdHJ1ZSBzbyB0aGF0IHRoZSBzaWRlIGlzIGRyYXduIGFzIGEgZGlhbW9uZCAqL1xuICAgICAgICB0aGlzLmRpYW1vbmQgPSBvcHRzLmRpYW1vbmRcblxuICAgICAgICAvKiBEZXRlcm1pbmVzIHdoYXQgdG8gZG8gZm9yIGxpbWl0IHNpZGVzLCBiZXR3ZWVuIGEgY2VsbCB3aXRoIHZhbHVlIGFuZCBvbmUgd2l0aCBubyB2YWx1ZVxuICAgICAgICAqIHN0ZWVwOiB0aGUgY2VsbCB2YWx1ZSBhYnNlbmNlIGlzIGVxdWl2YWxlbnQgdG8gMC4gSXQgc2hvd3MgcG90ZW50aWFsbHkgYSBzdGVlcCBsaW1pdCB0aGVuLlxuICAgICAgICAqIHNraXA6IG5vIHNpZGUgaXMgZHJhd25cbiAgICAgICAgKiBzdGVwOiBhIHNpZGUgd2l0aCBhIDEgc3RlcCAqL1xuICAgICAgICB0aGlzLmxpbWl0ID0gb3B0cy5saW1pdCB8fCBcInN0ZWVwXCJcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXQuanNcIikuQ2VsbD59IGNlbGxzXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJlc29sdXRpb25cbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvcmUvR2VvQ2FudmFzLmpzXCIpLkdlb0NhbnZhc30gZ2VvQ2FudmFzXG4gICAgICovXG4gICAgZHJhdyhjZWxscywgZ2VvQ2FudmFzLCByZXNvbHV0aW9uKSB7XG4gICAgICAgIC8vZmlsdGVyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlcikgY2VsbHMgPSBjZWxscy5maWx0ZXIodGhpcy5maWx0ZXIpXG5cbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgeiA9IGdlb0NhbnZhcy52aWV3LnpcbiAgICAgICAgY29uc3QgY3R4ID0gZ2VvQ2FudmFzLm9mZnNjcmVlbkN0eFxuXG4gICAgICAgIC8vZ2V0IGNlbGwgY2xhc3NpZmllclxuICAgICAgICBjb25zdCBjbGFzc2lmaWVyID0gdGhpcy5jbGFzc2lmaWVyKGNlbGxzLCByZXNvbHV0aW9uLCB6KVxuXG4gICAgICAgIC8vZ2V0IHNpZGUgdmFsdWU6IGNsYXNzIGNoYW5nZSBkaWZmZXJlbmNlXG4gICAgICAgIGNvbnN0IGdldFNpZGVWYWx1ZSA9ICgvKiogQHR5cGUge3sgYzE6IFNpZGU7IGMyOiBTaWRlOyB9fSAqLyBzaWRlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjbDEgPSBzaWRlLmMxID8gY2xhc3NpZmllcihzaWRlLmMxKSA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgY29uc3QgY2wyID0gc2lkZS5jMiA/IGNsYXNzaWZpZXIoc2lkZS5jMikgOiB1bmRlZmluZWRcbiAgICAgICAgICAgIGlmIChjbDEgPT09IHVuZGVmaW5lZCAmJiBjbDIgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgICAgICAgaWYgKGNsMSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdGhpcy5saW1pdD09XCJub25lXCI/IHVuZGVmaW5lZCA6IHRoaXMubGltaXQ9PVwic3RlZXBcIj8gY2wyIDogTWF0aC5zaWduKGNsMilcbiAgICAgICAgICAgIGlmIChjbDIgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRoaXMubGltaXQ9PVwibm9uZVwiPyB1bmRlZmluZWQgOiB0aGlzLmxpbWl0PT1cInN0ZWVwXCI/IC1jbDEgOiBNYXRoLnNpZ24oLWNsMSlcbiAgICAgICAgICAgIHJldHVybiBjbDIgLSBjbDFcbiAgICAgICAgfVxuXG4gICAgICAgIC8vYnVpbGQgc2lkZXNcbiAgICAgICAgLy9UT0RPIGJ1aWxkIG9ubHkgdGhvc2Ugd2l0aCBkaWZmZXJlbnQgY29kZXMgP1xuICAgICAgICAvKiogIEB0eXBlIHtBcnJheS48U2lkZT59ICovXG4gICAgICAgIGNvbnN0IHNpZGVzID0gU2lkZVN0eWxlLmJ1aWxkU2lkZXMoY2VsbHMsIHJlc29sdXRpb24pXG4gICAgICAgIGlmIChzaWRlcy5sZW5ndGggPT0gMCkgcmV0dXJuXG5cbiAgICAgICAgLy9nZXQgc2lkZSB2aWV3IHNjYWxlXG4gICAgICAgIGNvbnN0IHZpZXdTY2FsZSA9IHRoaXMudmlld1NjYWxlID8gdGhpcy52aWV3U2NhbGUoc2lkZXMsIHJlc29sdXRpb24sIHopIDogdW5kZWZpbmVkXG5cbiAgICAgICAgLy9kcmF3IHNpZGVzXG4gICAgICAgIGN0eC5saW5lQ2FwID0gJ2J1dHQnXG4gICAgICAgIGNvbnN0IHIyID0gcmVzb2x1dGlvbiAqIDAuNVxuICAgICAgICBjb25zdCBjZCA9IHRoaXMucmV2ZXJ0PyB0aGlzLmNvbG9yQnJpZ2h0IDogdGhpcy5jb2xvckRhcmtcbiAgICAgICAgY29uc3QgY2IgPSB0aGlzLnJldmVydD8gdGhpcy5jb2xvckRhcmsgOiB0aGlzLmNvbG9yQnJpZ2h0XG4gICAgICAgIGZvciAobGV0IHNpZGUgb2Ygc2lkZXMpIHtcblxuICAgICAgICAgICAgLy9nZXQgc2lkZSB2YWx1ZVxuICAgICAgICAgICAgY29uc3QgdiA9IGdldFNpZGVWYWx1ZShzaWRlKVxuICAgICAgICAgICAgaWYgKHYgPT09IHVuZGVmaW5lZCB8fCB2ID09PSAwKSBjb250aW51ZVxuXG4gICAgICAgICAgICAvL2NvbG9yXG4gICAgICAgICAgICAvKiogQHR5cGUge3N0cmluZ3x1bmRlZmluZWR9ICovXG4gICAgICAgICAgICBjb25zdCBjb2wgPSAoKHYgPCAwICYmIHNpZGUub3IgPT09ICdoJykgfHwgKHYgPiAwICYmIHNpZGUub3IgPT09ICd2JykpID8gY2IgOiBjZFxuICAgICAgICAgICAgaWYgKCFjb2wgfHwgY29sID09ICdub25lJykgY29udGludWVcblxuICAgICAgICAgICAgaWYgKHRoaXMuZGlhbW9uZCkge1xuICAgICAgICAgICAgICAgIC8vc2V0IGNvbG9yXG4gICAgICAgICAgICAgICAgY3R4LmZpbGxTdHlsZSA9IGNvbFxuXG4gICAgICAgICAgICAgICAgLy9kcmF3IGRpYW1vbmRcbiAgICAgICAgICAgICAgICBjb25zdCB4ID0gc2lkZS54LFxuICAgICAgICAgICAgICAgICAgICB5ID0gc2lkZS55XG4gICAgICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICAgICAgY3R4Lm1vdmVUbyh4IC0gcjIsIHkpXG4gICAgICAgICAgICAgICAgY3R4LmxpbmVUbyh4LCB5ICsgcjIpXG4gICAgICAgICAgICAgICAgY3R4LmxpbmVUbyh4ICsgcjIsIHkpXG4gICAgICAgICAgICAgICAgY3R4LmxpbmVUbyh4LCB5IC0gcjIpXG4gICAgICAgICAgICAgICAgY3R4LmNsb3NlUGF0aCgpXG4gICAgICAgICAgICAgICAgY3R4LmZpbGwoKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvL3dpZHRoXG4gICAgICAgICAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ8dW5kZWZpbmVkfSAqL1xuICAgICAgICAgICAgICAgIGNvbnN0IHdHID0gdGhpcy53aWR0aCA/IHRoaXMud2lkdGgoc2lkZSwgdiwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgIGlmICghd0cgfHwgd0cgPD0gMCkgY29udGludWVcblxuICAgICAgICAgICAgICAgIC8vbGVuZ3RoXG4gICAgICAgICAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ8dW5kZWZpbmVkfSAqL1xuICAgICAgICAgICAgICAgIGNvbnN0IGxHID0gdGhpcy5sZW5ndGggPyB0aGlzLmxlbmd0aChzaWRlLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpIDogdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgaWYgKCFsRyB8fCBsRyA8PSAwKSBjb250aW51ZVxuICAgICAgICAgICAgICAgIGNvbnN0IGxHMiA9IGxHICogMC41XG5cbiAgICAgICAgICAgICAgICAvL3NldCB3aWR0aFxuICAgICAgICAgICAgICAgIGN0eC5saW5lV2lkdGggPSB3R1xuICAgICAgICAgICAgICAgIC8vc2V0IGNvbG9yXG4gICAgICAgICAgICAgICAgY3R4LnN0cm9rZVN0eWxlID0gY29sXG5cbiAgICAgICAgICAgICAgICAvL2RyYXcgc2VnbWVudCB3aXRoIGNvcnJlY3Qgb3JpZW50YXRpb25cbiAgICAgICAgICAgICAgICBjb25zdCB4ID0gc2lkZS54LFxuICAgICAgICAgICAgICAgICAgICB5ID0gc2lkZS55XG4gICAgICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICAgICAgaWYgKHNpZGUub3IgPT09ICd2Jykge1xuICAgICAgICAgICAgICAgICAgICBjdHgubW92ZVRvKHgsIHkgLSBsRzIpXG4gICAgICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oeCwgeSArIGxHMilcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjdHgubW92ZVRvKHggLSBsRzIsIHkpXG4gICAgICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oeCArIGxHMiwgeSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY3R4LnN0cm9rZSgpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvL3VwZGF0ZSBsZWdlbmRzXG4gICAgICAgIHRoaXMudXBkYXRlTGVnZW5kcyh7IHN0eWxlOiB0aGlzLCByZXNvbHV0aW9uOiByZXNvbHV0aW9uLCB6OiB6LCB2aWV3U2NhbGU6IHZpZXdTY2FsZSB9KVxuICAgIH1cblxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBTdHlsZSB9IGZyb20gJy4uL2NvcmUvU3R5bGUuanMnXG5pbXBvcnQgeyBtYWtlV2ViR0xDYW52YXMgfSBmcm9tICcuLi91dGlscy93ZWJHTFV0aWxzLmpzJ1xuaW1wb3J0IHsgV2ViR0xTcXVhcmVDb2xvcmluZ0NhdEFkdmFuY2VkIH0gZnJvbSAnLi4vdXRpbHMvV2ViR0xTcXVhcmVDb2xvcmluZ0NhdEFkdmFuY2VkLmpzJ1xuXG4vKipcbiAqIFN0eWxlIGJhc2VkIG9uIHdlYkdMXG4gKiBUbyBzaG93IGNlbGxzIGFzIGNvbG9yZWQgc3F1YXJlcywgZnJvbSBjYXRlZ29yaWVzLlxuICogQWxsIGNlbGxzIGFyZSBkcmF3biBhcyBzcXVhcmVzLCB3aXRoIHRoZSBzYW1lIHNpemVcbiAqXG4gKiBAbW9kdWxlIHN0eWxlXG4gKiBAYXV0aG9yIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBTcXVhcmVDb2xvckNhdGVnb3J5V2ViR0xTdHlsZSBleHRlbmRzIFN0eWxlIHtcbiAgICAvKiogQHBhcmFtIHtvYmplY3R9IG9wdHMgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBjYXRlZ29yeSBjb2RlIG9mIHRoZSBjZWxsLCBmb3IgY29sb3JpbmcuXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwpOnN0cmluZ30gKi9cbiAgICAgICAgdGhpcy5jb2RlID0gb3B0cy5jb2RlXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBkaWN0aW9uYXJ5IChjb2RlIC0+IGNvbG9yKSB3aGljaCBnaXZlcyB0aGUgY29sb3Igb2YgZWFjaCBjYXRlZ29yeSBjb2RlLlxuICAgICAgICAgKiBAdHlwZSB7b2JqZWN0fSAqL1xuICAgICAgICBvcHRzLmNvbG9yID0gb3B0cy5jb2xvciB8fCB1bmRlZmluZWRcblxuICAgICAgICAvKiogQHR5cGUgeyBBcnJheS48c3RyaW5nPiB9ICovXG4gICAgICAgIGNvbnN0IGNvZGVzID0gT2JqZWN0LmtleXMob3B0cy5jb2xvcilcblxuICAgICAgICAvKiogQHR5cGUgeyBvYmplY3QgfSBAcHJpdmF0ZSAqL1xuICAgICAgICB0aGlzLmNhdFRvSSA9IHt9XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29kZXMubGVuZ3RoOyBpKyspIHRoaXMuY2F0VG9JW2NvZGVzW2ldXSA9IGkgKyAnJ1xuXG4gICAgICAgIC8qKiBAdHlwZSB7IEFycmF5LjxzdHJpbmc+IH0gQHByaXZhdGUgKi9cbiAgICAgICAgdGhpcy5jb2xvcnMgPSBbXVxuICAgICAgICBmb3IgKGNvbnN0IGNvZGUgb2YgY29kZXMpIHRoaXMuY29sb3JzLnB1c2gob3B0cy5jb2xvclsnJyArIGNvZGVdKVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgc2l6ZSBvZiB0aGUgY2VsbHMsIGluIGdlb2dyYXBoaWNhbCB1bml0LiBBbGwgY2VsbHMgaGF2ZSB0aGUgc2FtZSBzaXplLlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyLG51bWJlcik6bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLnNpemUgPSBvcHRzLnNpemUgLy8gKHJlc29sdXRpb24sIHopID0+IC4uLlxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAdHlwZSB7IFdlYkdMU3F1YXJlQ29sb3JpbmdDYXRBZHZhbmNlZCB9ICovXG4gICAgICAgIHRoaXMud2dwID0gbmV3IFdlYkdMU3F1YXJlQ29sb3JpbmdDYXRBZHZhbmNlZCh0aGlzLmNvbG9ycylcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXQuanNcIikuQ2VsbD59IGNlbGxzXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhcy5qc1wiKS5HZW9DYW52YXN9IGdlb0NhbnZhc1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByZXNvbHV0aW9uXG4gICAgICovXG4gICAgZHJhdyhjZWxscywgZ2VvQ2FudmFzLCByZXNvbHV0aW9uKSB7XG4gICAgICAgIC8vZmlsdGVyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlcikgY2VsbHMgPSBjZWxscy5maWx0ZXIodGhpcy5maWx0ZXIpXG5cbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgeiA9IGdlb0NhbnZhcy52aWV3LnpcblxuICAgICAgICAvL2FkZCB2ZXJ0aWNlIGFuZCBmcmFnbWVudCBkYXRhXG4gICAgICAgIGNvbnN0IHIyID0gcmVzb2x1dGlvbiAvIDJcbiAgICAgICAgbGV0IGMsXG4gICAgICAgICAgICBuYiA9IGNlbGxzLmxlbmd0aFxuICAgICAgICBjb25zdCB2ZXJ0aWNlc0J1ZmZlciA9IFtdXG4gICAgICAgIGNvbnN0IGlCdWZmZXIgPSBbXVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5iOyBpKyspIHtcbiAgICAgICAgICAgIGMgPSBjZWxsc1tpXVxuICAgICAgICAgICAgY29uc3QgY2F0ID0gdGhpcy5jb2RlKGMpXG4gICAgICAgICAgICBpZiAoY2F0ID09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdVbmV4cGVjdGVkIGNhdGVnb3J5OiAnICsgY2F0KVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgICAgIGNvbnN0IGlfID0gdGhpcy5jYXRUb0lbY2F0XVxuICAgICAgICAgICAgaWYgKGlzTmFOKCtpXykpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnVW5leHBlY3RlZCBjYXRlZ29yeSBpbmRleDogJyArIGNhdCArICcgJyArIGlfKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2ZXJ0aWNlc0J1ZmZlci5wdXNoKGMueCArIHIyLCBjLnkgKyByMilcbiAgICAgICAgICAgIGlCdWZmZXIucHVzaCgraV8pXG4gICAgICAgIH1cblxuICAgICAgICAvL2NyZWF0ZSBjYW52YXMgYW5kIHdlYmdsIHJlbmRlcmVyXG4gICAgICAgIGNvbnN0IGN2V0dMID0gbWFrZVdlYkdMQ2FudmFzKGdlb0NhbnZhcy53ICsgJycsIGdlb0NhbnZhcy5oICsgJycpXG4gICAgICAgIGlmICghY3ZXR0wpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ05vIHdlYkdMJylcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgLy9kcmF3XG4gICAgICAgIGNvbnN0IHNpemVHZW8gPSB0aGlzLnNpemUgPyB0aGlzLnNpemUocmVzb2x1dGlvbiwgeikgOiByZXNvbHV0aW9uICsgMC4yICogelxuICAgICAgICB0aGlzLndncC5kcmF3KGN2V0dMLmdsLCB2ZXJ0aWNlc0J1ZmZlciwgaUJ1ZmZlciwgZ2VvQ2FudmFzLmdldFdlYkdMVHJhbnNmb3JtKCksIHNpemVHZW8gLyB6KVxuXG4gICAgICAgIC8vZHJhdyBpbiBjYW52YXMgZ2VvXG4gICAgICAgIGdlb0NhbnZhcy5pbml0Q2FudmFzVHJhbnNmb3JtKClcbiAgICAgICAgZ2VvQ2FudmFzLm9mZnNjcmVlbkN0eC5kcmF3SW1hZ2UoY3ZXR0wuY2FudmFzLCAwLCAwKVxuXG4gICAgICAgIC8vdXBkYXRlIGxlZ2VuZHNcbiAgICAgICAgdGhpcy51cGRhdGVMZWdlbmRzKHsgc3R5bGU6IHRoaXMsIHJlc29sdXRpb246IHJlc29sdXRpb24sIHo6IHogfSlcbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IFN0eWxlIH0gZnJvbSAnLi4vY29yZS9TdHlsZS5qcydcbmltcG9ydCB7IG1ha2VXZWJHTENhbnZhcyB9IGZyb20gJy4uL3V0aWxzL3dlYkdMVXRpbHMuanMnXG5pbXBvcnQgeyBXZWJHTFNxdWFyZUNvbG9yaW5nQWR2YW5jZWQgfSBmcm9tICcuLi91dGlscy9XZWJHTFNxdWFyZUNvbG9yaW5nQWR2YW5jZWQuanMnXG5cbi8qKlxuICogU3R5bGUgYmFzZWQgb24gd2ViR0xcbiAqIFRvIHNob3cgY2VsbHMgYXMgY29sb3JlZCBzcXVhcmVzLCB3aXRoIGNvbXB1dGF0aW9uIG9mIHRoZSBjb2xvcnMgb24gR1BVIHNpZGUgKGZhc3RlciB0aGFuIEphdmFTY3JpcHQgc2lkZSkuXG4gKiBBbGxzIHNxdWFyZXMgd2l0aCB0aGUgc2FtZSBzaXplXG4gKlxuICogQG1vZHVsZSBzdHlsZVxuICogQGF1dGhvciBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgU3F1YXJlQ29sb3JXZWJHTFN0eWxlIGV4dGVuZHMgU3R5bGUge1xuICAgIC8qKiBAcGFyYW0ge29iamVjdH0gb3B0cyAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cylcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvKipcbiAgICAgICAgICogQSBmdW5jdGlvbiByZXR1cm5pbmcgYSB0IHZhbHVlICh3aXRoaW4gWzAsMV0pIGZvciBhIGNlbGwuXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwsbnVtYmVyLG51bWJlcixvYmplY3QpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy50RnVuID0gb3B0cy50RnVuIC8vKGMscix6LHZzKSA9PiB7fVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEaXN0cmlidXRpb24gc3RyZXRjaGluZyBtZXRob2QuXG4gICAgICAgICAqIFRoZSBzdHJldGNoaW5nIGlzIHBlcmZvcm1lZCBvbiBHUFUgc2lkZSAoZnJhZ21lbnQgc2hhZGVyKS5cbiAgICAgICAgICogQHR5cGUge3sgZnVuOnN0cmluZywgYWxwaGE6bnVtYmVyIH19ICovXG4gICAgICAgIHRoaXMuc3RyZXRjaGluZyA9IG9wdHMuc3RyZXRjaGluZ1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgc2FtcGxlIG9mIHRoZSBjb2xvciByYW1wLlxuICAgICAgICAgKiBUaGUgY29sb3IgaXMgY29tcHV0ZWQgb24gR1BVIHNpZGUgKGZyYWdtZW50IHNoYWRlcikgYmFzZWQgb24gdGhvc2UgdmFsdWVzIChsaW5lYXIgaW50ZXJwb2xhdGlvbikuXG4gICAgICAgICAqIEB0eXBlIHtBcnJheS48c3RyaW5nPn0gKi9cbiAgICAgICAgdGhpcy5jb2xvcnMgPVxuICAgICAgICAgICAgb3B0cy5jb2xvcnMgfHxcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAncmdiKDE1OCwgMSwgNjYpJyxcbiAgICAgICAgICAgICAgICAncmdiKDI0OCwgMTQyLCA4MyknLFxuICAgICAgICAgICAgICAgICdyZ2IoMjUxLCAyNDgsIDE3NiknLFxuICAgICAgICAgICAgICAgICdyZ2IoMTM3LCAyMDcsIDE2NSknLFxuICAgICAgICAgICAgICAgICdyZ2IoOTQsIDc5LCAxNjIpJyxcbiAgICAgICAgICAgIF0ucmV2ZXJzZSgpXG4gICAgICAgIGlmIChvcHRzLmNvbG9yKVxuICAgICAgICAgICAgdGhpcy5jb2xvcnMgPSBbXG4gICAgICAgICAgICAgICAgb3B0cy5jb2xvcigwKSxcbiAgICAgICAgICAgICAgICBvcHRzLmNvbG9yKDAuMiksXG4gICAgICAgICAgICAgICAgb3B0cy5jb2xvcigwLjQpLFxuICAgICAgICAgICAgICAgIG9wdHMuY29sb3IoMC42KSxcbiAgICAgICAgICAgICAgICBvcHRzLmNvbG9yKDAuOCksXG4gICAgICAgICAgICAgICAgb3B0cy5jb2xvcigxKSxcbiAgICAgICAgICAgIF1cblxuICAgICAgICAvKipcbiAgICAgICAgICogRGVmaW5lIHRoZSBvcGFjaXR5IG9mIHRoZSBzdHlsZSwgd2l0aGluIFswLDFdLlxuICAgICAgICAgKiBJZiB0aGlzIG9wYWNpdHkgaXMgZGVmaW5lZCwgdGhlIGluZGl2aWR1YWwgY29sb3Igb3BhY2l0eSB3aWxsIGJlIGlnbm9yZWQuXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihudW1iZXIsbnVtYmVyKTpudW1iZXJ9ICovXG4gICAgICAgIHRoaXMub3BhY2l0eSA9IG9wdHMub3BhY2l0eSAvLyAocix6KSA9PiAuLi5cblxuICAgICAgICAvKipcbiAgICAgICAgICogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIHNpemUgb2YgdGhlIGNlbGxzLCBpbiBnZW9ncmFwaGljYWwgdW5pdC4gQWxsIGNlbGxzIGhhdmUgdGhlIHNhbWUgc2l6ZS5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG51bWJlcixudW1iZXIpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy5zaXplID0gb3B0cy5zaXplIC8vIChyZXNvbHV0aW9uLCB6KSA9PiAuLi5cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXQuanNcIikuQ2VsbD59IGNlbGxzXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhcy5qc1wiKS5HZW9DYW52YXN9IGdlb0NhbnZhc1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByZXNvbHV0aW9uXG4gICAgICovXG4gICAgZHJhdyhjZWxscywgZ2VvQ2FudmFzLCByZXNvbHV0aW9uKSB7XG4gICAgICAgIC8vZmlsdGVyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlcikgY2VsbHMgPSBjZWxscy5maWx0ZXIodGhpcy5maWx0ZXIpXG5cbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgeiA9IGdlb0NhbnZhcy52aWV3LnpcblxuICAgICAgICAvL2dldCB2aWV3IHNjYWxlXG4gICAgICAgIGNvbnN0IHZpZXdTY2FsZSA9IHRoaXMudmlld1NjYWxlID8gdGhpcy52aWV3U2NhbGUoY2VsbHMsIHJlc29sdXRpb24sIHopIDogdW5kZWZpbmVkXG5cbiAgICAgICAgLy9jcmVhdGUgY2FudmFzIGFuZCB3ZWJnbCByZW5kZXJlclxuICAgICAgICAvL2ZvciBvcGFjaXR5IGNvbnRyb2wsIHNlZTogaHR0cHM6Ly93ZWJnbGZ1bmRhbWVudGFscy5vcmcvd2ViZ2wvbGVzc29ucy93ZWJnbC1hbmQtYWxwaGEuaHRtbFxuICAgICAgICBjb25zdCBjdldHTCA9IG1ha2VXZWJHTENhbnZhcyhcbiAgICAgICAgICAgIGdlb0NhbnZhcy53ICsgJycsXG4gICAgICAgICAgICBnZW9DYW52YXMuaCArICcnLFxuICAgICAgICAgICAgdGhpcy5vcGFjaXR5ICE9IHVuZGVmaW5lZCA/IHsgcHJlbXVsdGlwbGllZEFscGhhOiBmYWxzZSB9IDogdW5kZWZpbmVkXG4gICAgICAgIClcbiAgICAgICAgaWYgKCFjdldHTCkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignTm8gd2ViR0wnKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICAvL2FkZCB2ZXJ0aWNlIGFuZCBmcmFnbWVudCBkYXRhXG4gICAgICAgIGNvbnN0IHIyID0gcmVzb2x1dGlvbiAvIDJcbiAgICAgICAgY29uc3QgdmVydGljZXNCdWZmZXIgPSBbXVxuICAgICAgICBjb25zdCB0QnVmZmVyID0gW11cbiAgICAgICAgZm9yIChsZXQgY2VsbCBvZiBjZWxscykge1xuICAgICAgICAgICAgY29uc3QgdCA9IHRoaXMudEZ1bihjZWxsLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpXG4gICAgICAgICAgICBpZiAodCA9PSBudWxsIHx8IHQgPT0gdW5kZWZpbmVkKSBjb250aW51ZVxuICAgICAgICAgICAgdmVydGljZXNCdWZmZXIucHVzaChjZWxsLnggKyByMiwgY2VsbC55ICsgcjIpXG4gICAgICAgICAgICB0QnVmZmVyLnB1c2godCA+IDEgPyAxIDogdCA8IDAgPyAwIDogdClcbiAgICAgICAgfVxuXG4gICAgICAgIC8vY29tcHV0ZSBwaXhlbCBzaXplXG4gICAgICAgIGNvbnN0IHNpemVHZW8gPSB0aGlzLnNpemUgPyB0aGlzLnNpemUocmVzb2x1dGlvbiwgeikgOiByZXNvbHV0aW9uICsgMC4yICogelxuXG4gICAgICAgIC8vY29tcHV0ZSBvcGFjaXR5XG4gICAgICAgIGNvbnN0IG9wID0gdGhpcy5vcGFjaXR5ID8gdGhpcy5vcGFjaXR5KHJlc29sdXRpb24sIHopIDogdW5kZWZpbmVkXG5cbiAgICAgICAgLy9cbiAgICAgICAgY29uc3Qgd2dwID0gbmV3IFdlYkdMU3F1YXJlQ29sb3JpbmdBZHZhbmNlZChjdldHTC5nbCwgdGhpcy5jb2xvcnMsIHRoaXMuc3RyZXRjaGluZywgc2l6ZUdlbyAvIHosIG9wKVxuXG4gICAgICAgIC8vZHJhd1xuICAgICAgICB3Z3AuZHJhdyh2ZXJ0aWNlc0J1ZmZlciwgdEJ1ZmZlciwgZ2VvQ2FudmFzLmdldFdlYkdMVHJhbnNmb3JtKCkpXG5cbiAgICAgICAgLy8gZHJhdyBpbiBjYW52YXMgZ2VvXG4gICAgICAgIC8vIE5PVEU6IGRyYXdpbmcgZWFjaCB0aWxlIHRoaXMgd2F5IGlzIHZlcnkgaW5lZmZpY2llbnQuIFdlYkdMIGlzIGJlc3QgdXNlZCB3aXRoIGZld2VyLCBoZWF2aWVyL2xhcmdlciBkcmF3IGNhbGxzLlxuICAgICAgICBnZW9DYW52YXMuaW5pdENhbnZhc1RyYW5zZm9ybSgpXG4gICAgICAgIGdlb0NhbnZhcy5vZmZzY3JlZW5DdHguZHJhd0ltYWdlKGN2V0dMLmNhbnZhcywgMCwgMClcblxuICAgICAgICAvL3VwZGF0ZSBsZWdlbmRzXG4gICAgICAgIHRoaXMudXBkYXRlTGVnZW5kcyh7IHN0eWxlOiB0aGlzLCByZXNvbHV0aW9uOiByZXNvbHV0aW9uLCB6OiB6LCB2aWV3U2NhbGU6IHZpZXdTY2FsZSB9KVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgU3R5bGUgfSBmcm9tICcuLi9jb3JlL1N0eWxlLmpzJ1xuXG4vKipcbiAqIEBtb2R1bGUgc3R5bGVcbiAqIEBhdXRob3IgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIFN0cm9rZVN0eWxlIGV4dGVuZHMgU3R5bGUge1xuICAgIC8qKiBAcGFyYW0ge29iamVjdH0gb3B0cyAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cylcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIGNvbG9yIG9mIHRoZSBjZWxsLlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLG51bWJlcixudW1iZXIsb2JqZWN0KTpzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuc3Ryb2tlQ29sb3IgPSBvcHRzLnN0cm9rZUNvbG9yIHx8ICgoKSA9PiAnIzY2NicpIC8vKGMscix6LHZzKSA9PiB7fVxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgc2l6ZSBvZiBhIGNlbGwgaW4gZ2VvZ3JhcGhpY2FsIHVuaXQuXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwsbnVtYmVyLG51bWJlcixvYmplY3QpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy5zaXplID0gb3B0cy5zaXplIHx8ICgoY2VsbCwgcmVzb2x1dGlvbikgPT4gcmVzb2x1dGlvbikgLy8oYyxyLHosdnMpID0+IHt9XG5cbiAgICAgICAgLyoqIFRoZSBzdHJva2UgbGluZSB3aWR0aCBpbiBnZW9ncmFwaGljYWwgdW5pdC5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbCxudW1iZXIsbnVtYmVyLG9iamVjdCk6bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLnN0cm9rZVdpZHRoID0gb3B0cy5zdHJva2VXaWR0aCB8fCAoKGNlbGwsIHJlc29sdXRpb24sIHopID0+IHogKiAxLjUpIC8vKGMscix6LHZzKSA9PiB7fVxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgc2hhcGUgb2YgYSBjZWxsLlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0LmpzXCIpLkNlbGwsbnVtYmVyLG51bWJlcixvYmplY3QpOmltcG9ydChcIi4uL2NvcmUvU3R5bGUuanNcIikuU2hhcGV9ICovXG4gICAgICAgIHRoaXMuc2hhcGUgPSBvcHRzLnNoYXBlIHx8ICgoKSA9PiAnc3F1YXJlJykgLy8oYyxyLHosdnMpID0+IHt9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRHJhdyBjZWxscyBhcyBzcXVhcmVzLCB3aXRoIHZhcmlvdXMgY29sb3JzIGFuZCBzaXplLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0XCIpLkNlbGw+fSBjZWxsc1xuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29yZS9HZW9DYW52YXNcIikuR2VvQ2FudmFzfSBnZW9DYW52YXNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVzb2x1dGlvblxuICAgICAqL1xuICAgIGRyYXcoY2VsbHMsIGdlb0NhbnZhcywgcmVzb2x1dGlvbikge1xuICAgICAgICAvL2ZpbHRlclxuICAgICAgICBpZiAodGhpcy5maWx0ZXIpIGNlbGxzID0gY2VsbHMuZmlsdGVyKHRoaXMuZmlsdGVyKVxuXG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IHogPSBnZW9DYW52YXMudmlldy56XG4gICAgICAgIGNvbnN0IGN0eCA9IGdlb0NhbnZhcy5vZmZzY3JlZW5DdHhcblxuICAgICAgICAvL2dldCB2aWV3IHNjYWxlXG4gICAgICAgIGNvbnN0IHZpZXdTY2FsZSA9IHRoaXMudmlld1NjYWxlID8gdGhpcy52aWV3U2NhbGUoY2VsbHMsIHJlc29sdXRpb24sIHopIDogdW5kZWZpbmVkXG5cbiAgICAgICAgY29uc3QgcjIgPSByZXNvbHV0aW9uICogMC41XG4gICAgICAgIGZvciAobGV0IGMgb2YgY2VsbHMpIHtcbiAgICAgICAgICAgIC8vY29sb3JcbiAgICAgICAgICAgIGNvbnN0IGNvbCA9IHRoaXMuc3Ryb2tlQ29sb3IgPyB0aGlzLnN0cm9rZUNvbG9yKGMsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgOiB1bmRlZmluZWRcbiAgICAgICAgICAgIGlmICghY29sIHx8IGNvbCA9PT0gJ25vbmUnKSBjb250aW51ZVxuICAgICAgICAgICAgY3R4LnN0cm9rZVN0eWxlID0gY29sXG5cbiAgICAgICAgICAgIC8vc2l6ZSAtIGluIGdlbyB1bml0XG4gICAgICAgICAgICBjb25zdCBzaXplID0gdGhpcy5zaXplID8gdGhpcy5zaXplKGMsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgOiByZXNvbHV0aW9uXG5cbiAgICAgICAgICAgIC8vd2lkdGhcbiAgICAgICAgICAgIGNvbnN0IHdpID0gdGhpcy5zdHJva2VXaWR0aCA/IHRoaXMuc3Ryb2tlV2lkdGgoYywgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IDEgKiB6XG4gICAgICAgICAgICBpZiAoIXdpIHx8IHdpIDw9IDApIGNvbnRpbnVlXG4gICAgICAgICAgICBjdHgubGluZVdpZHRoID0gd2lcblxuICAgICAgICAgICAgLy9zaGFwZVxuICAgICAgICAgICAgY29uc3Qgc2hhcGUgPSB0aGlzLnNoYXBlID8gdGhpcy5zaGFwZShjLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpIDogJ3NxdWFyZSdcbiAgICAgICAgICAgIGlmIChzaGFwZSA9PT0gJ25vbmUnKSBjb250aW51ZVxuXG4gICAgICAgICAgICAvL2dldCBvZmZzZXRcbiAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMub2Zmc2V0KGMsIHJlc29sdXRpb24sIHopXG5cbiAgICAgICAgICAgIGlmIChzaGFwZSA9PT0gJ3NxdWFyZScpIHtcbiAgICAgICAgICAgICAgICAvL2RyYXcgc3F1YXJlXG4gICAgICAgICAgICAgICAgY29uc3QgZCA9IHJlc29sdXRpb24gKiAoMSAtIHNpemUgLyByZXNvbHV0aW9uKSAqIDAuNVxuICAgICAgICAgICAgICAgIGN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgICAgIGN0eC5yZWN0KGMueCArIGQgKyBvZmZzZXQuZHgsIGMueSArIGQgKyBvZmZzZXQuZHksIHNpemUsIHNpemUpXG4gICAgICAgICAgICAgICAgY3R4LnN0cm9rZSgpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNoYXBlID09PSAnY2lyY2xlJykge1xuICAgICAgICAgICAgICAgIC8vZHJhdyBjaXJjbGVcbiAgICAgICAgICAgICAgICBjdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICBjdHguYXJjKGMueCArIHIyICsgb2Zmc2V0LmR4LCBjLnkgKyByMiArIG9mZnNldC5keSwgc2l6ZSAqIDAuNSwgMCwgMiAqIE1hdGguUEksIGZhbHNlKVxuICAgICAgICAgICAgICAgIGN0eC5zdHJva2UoKVxuICAgICAgICAgICAgfSBlbHNlIGlmIChzaGFwZSA9PT0gJ2RpYW1vbmQnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgczIgPSBzaXplICogMC41XG4gICAgICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICAgICAgY3R4Lm1vdmVUbyhjLnggKyByMiAtIHMyLCBjLnkgKyByMilcbiAgICAgICAgICAgICAgICBjdHgubGluZVRvKGMueCArIHIyLCBjLnkgKyByMiArIHMyKVxuICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oYy54ICsgcjIgKyBzMiwgYy55ICsgcjIpXG4gICAgICAgICAgICAgICAgY3R4LmxpbmVUbyhjLnggKyByMiwgYy55ICsgcjIgLSBzMilcbiAgICAgICAgICAgICAgICBjdHgubGluZVRvKGMueCArIHIyIC0gczIsIGMueSArIHIyKVxuICAgICAgICAgICAgICAgIGN0eC5zdHJva2UoKVxuICAgICAgICAgICAgfSBlbHNlIGlmIChzaGFwZSA9PT0gJ2RvbnV0Jykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ05vdCBpbXBsZW1lbnRlZCcpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNoYXBlID09PSAndHJpYW5nbGVfdXAnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZHIyID0gKHNpemUgLSByZXNvbHV0aW9uKSAvIDJcbiAgICAgICAgICAgICAgICBjdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICBjdHgubW92ZVRvKGMueCAtIGRyMiwgYy55IC0gZHIyKVxuICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oYy54ICsgcjIsIGMueSArIHJlc29sdXRpb24gKyBkcjIpXG4gICAgICAgICAgICAgICAgY3R4LmxpbmVUbyhjLnggKyByZXNvbHV0aW9uICsgZHIyLCBjLnkgLSBkcjIpXG4gICAgICAgICAgICAgICAgY3R4LmNsb3NlUGF0aCgpXG4gICAgICAgICAgICAgICAgY3R4LnN0cm9rZSgpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNoYXBlID09PSAndHJpYW5nbGVfZG93bicpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkcjIgPSAoc2l6ZSAtIHJlc29sdXRpb24pIC8gMlxuICAgICAgICAgICAgICAgIGN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgICAgIGN0eC5tb3ZlVG8oYy54IC0gZHIyLCBjLnkgKyByZXNvbHV0aW9uICsgZHIyKVxuICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oYy54ICsgcjIsIGMueSAtIGRyMilcbiAgICAgICAgICAgICAgICBjdHgubGluZVRvKGMueCArIHJlc29sdXRpb24gKyBkcjIsIGMueSArIHJlc29sdXRpb24gKyBkcjIpXG4gICAgICAgICAgICAgICAgY3R4LmNsb3NlUGF0aCgpXG4gICAgICAgICAgICAgICAgY3R4LnN0cm9rZSgpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNoYXBlID09PSAndHJpYW5nbGVfbGVmdCcpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkcjIgPSAoc2l6ZSAtIHJlc29sdXRpb24pIC8gMlxuICAgICAgICAgICAgICAgIGN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgICAgIGN0eC5tb3ZlVG8oYy54ICsgcmVzb2x1dGlvbiArIGRyMiwgYy55ICsgcmVzb2x1dGlvbiArIGRyMilcbiAgICAgICAgICAgICAgICBjdHgubGluZVRvKGMueCAtIGRyMiwgYy55ICsgcjIpXG4gICAgICAgICAgICAgICAgY3R4LmxpbmVUbyhjLnggKyByZXNvbHV0aW9uICsgZHIyLCBjLnkgLSBkcjIpXG4gICAgICAgICAgICAgICAgY3R4LmNsb3NlUGF0aCgpXG4gICAgICAgICAgICAgICAgY3R4LnN0cm9rZSgpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNoYXBlID09PSAndHJpYW5nbGVfcmlnaHQnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZHIyID0gKHNpemUgLSByZXNvbHV0aW9uKSAvIDJcbiAgICAgICAgICAgICAgICBjdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICBjdHgubW92ZVRvKGMueCAtIGRyMiwgYy55IC0gZHIyKVxuICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oYy54ICsgcmVzb2x1dGlvbiArIGRyMiwgYy55ICsgcjIpXG4gICAgICAgICAgICAgICAgY3R4LmxpbmVUbyhjLnggLSBkcjIsIGMueSArIHJlc29sdXRpb24gKyBkcjIpXG4gICAgICAgICAgICAgICAgY3R4LmNsb3NlUGF0aCgpXG4gICAgICAgICAgICAgICAgY3R4LnN0cm9rZSgpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCBzaGFwZTonICsgc2hhcGUpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvL3VwZGF0ZSBsZWdlbmRzXG4gICAgICAgIHRoaXMudXBkYXRlTGVnZW5kcyh7IHN0eWxlOiB0aGlzLCByZXNvbHV0aW9uOiByZXNvbHV0aW9uLCB6OiB6LCB2aWV3U2NhbGU6IHZpZXdTY2FsZSB9KVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgU3R5bGUgfSBmcm9tICcuLi9jb3JlL1N0eWxlLmpzJ1xuXG4vKipcbiAqIEBtb2R1bGUgc3R5bGVcbiAqIEBhdXRob3IgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIFRleHRTdHlsZSBleHRlbmRzIFN0eWxlIHtcbiAgICAvKiogQHBhcmFtIHtvYmplY3R9IG9wdHMgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSB0ZXh0IG9mIGEgY2VsbC5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbCwgbnVtYmVyLCBudW1iZXIsIG9iamVjdCk6c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLnRleHQgPSBvcHRzLnRleHQgfHwgKCgpID0+ICdYJykgLy8oYyxyLHosdnMpID0+IHt9XG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBjb2xvciBvZiB0aGUgY2VsbC5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbCwgbnVtYmVyLCBudW1iZXIsIG9iamVjdCk6c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLmNvbG9yID0gb3B0cy5jb2xvciB8fCAoKCkgPT4gJ2JsYWNrJykgLy8oYyxyLHosdnMpID0+IHt9XG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBmb250IHNpemUgb2YgYSBjZWxsIGluIGdlbyB1bml0LlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLCBudW1iZXIsIG51bWJlcixvYmplY3QpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy5mb250U2l6ZSA9IG9wdHMuZm9udFNpemUgfHwgKChjZWxsLCByZXNvbHV0aW9uKSA9PiByZXNvbHV0aW9uKSAvLyhjLHIseix2cykgPT4ge31cblxuICAgICAgICAvKiogVGhlIHRleHQgZm9udCBmYW1pbHkuXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwsIG51bWJlciwgbnVtYmVyLCBvYmplY3QpOnN0cmluZ30gKi9cbiAgICAgICAgdGhpcy5mb250RmFtaWx5ID0gb3B0cy5mb250RmFtaWx5IHx8ICgoKSA9PiAnQXJpYWwnKVxuXG4gICAgICAgIC8qKiBUaGUgdGV4dCBmb250IHdlaWdodC5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbCwgbnVtYmVyLCBudW1iZXIsIG9iamVjdCk6c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLmZvbnRXZWlnaHQgPSBvcHRzLmZvbnRXZWlnaHQgfHwgKCgpID0+ICdib2xkJylcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEcmF3IGNlbGxzIGFzIHRleHQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXRcIikuQ2VsbD59IGNlbGxzXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhc1wiKS5HZW9DYW52YXN9IGdlb0NhbnZhc1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByZXNvbHV0aW9uXG4gICAgICovXG4gICAgZHJhdyhjZWxscywgZ2VvQ2FudmFzLCByZXNvbHV0aW9uKSB7XG4gICAgICAgIC8vZmlsdGVyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlcikgY2VsbHMgPSBjZWxscy5maWx0ZXIodGhpcy5maWx0ZXIpXG5cbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgeiA9IGdlb0NhbnZhcy52aWV3LnpcbiAgICAgICAgY29uc3QgY3R4ID0gZ2VvQ2FudmFzLm9mZnNjcmVlbkN0eFxuICAgICAgICAvL2dldCB2aWV3IHNjYWxlXG4gICAgICAgIGNvbnN0IHZpZXdTY2FsZSA9IHRoaXMudmlld1NjYWxlID8gdGhpcy52aWV3U2NhbGUoY2VsbHMsIHJlc29sdXRpb24sIHopIDogdW5kZWZpbmVkXG5cbiAgICAgICAgLy9kcmF3IHdpdGggSFRNTCBjYW52YXNcbiAgICAgICAgLy9pbiBzY3JlZW4gY29vcmRpbmF0ZXNcbiAgICAgICAgZ2VvQ2FudmFzLmluaXRDYW52YXNUcmFuc2Zvcm0oKVxuXG4gICAgICAgIGZvciAobGV0IGNlbGwgb2YgY2VsbHMpIHtcbiAgICAgICAgICAgIC8vZ2V0IGNlbGwgdGV4dFxuICAgICAgICAgICAgY29uc3QgdGV4dCA9IHRoaXMudGV4dCA/IHRoaXMudGV4dChjZWxsLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpIDogdW5kZWZpbmVkXG4gICAgICAgICAgICBpZiAodGV4dCA9PSB1bmRlZmluZWQgfHwgdGV4dCA9PSBudWxsIHx8IHRleHQgKyAnJyA9PT0gJycpIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIC8vY29sb3JcbiAgICAgICAgICAgIGNvbnN0IGNvbCA9IHRoaXMuY29sb3IgPyB0aGlzLmNvbG9yKGNlbGwsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgOiB1bmRlZmluZWRcbiAgICAgICAgICAgIGlmICghY29sKSBjb250aW51ZVxuICAgICAgICAgICAgY3R4LmZpbGxTdHlsZSA9IGNvbFxuXG4gICAgICAgICAgICAvL2ZvbnQgc2l6ZVxuICAgICAgICAgICAgLy9zaXplIC0gaW4gcGl4ZWwgdW5pdFxuICAgICAgICAgICAgY29uc3QgZm9udFNpemVQaXggPSB0aGlzLmZvbnRTaXplKGNlbGwsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgLyB6XG4gICAgICAgICAgICBpZiAoIWZvbnRTaXplUGl4KSBjb250aW51ZVxuXG4gICAgICAgICAgICAvL3NldCBmb250XG4gICAgICAgICAgICBjb25zdCBmb250RmFtaWx5ID0gdGhpcy5mb250RmFtaWx5ID8gdGhpcy5mb250RmFtaWx5KGNlbGwsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgOiAnQXJpYWwnXG4gICAgICAgICAgICBjb25zdCBmb250V2VpZ2h0ID0gdGhpcy5mb250V2VpZ2h0ID8gdGhpcy5mb250V2VpZ2h0KGNlbGwsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgOiAnYm9sZCdcbiAgICAgICAgICAgIGN0eC5mb250ID0gZm9udFdlaWdodCArICcgJyArIGZvbnRTaXplUGl4ICsgJ3B4ICcgKyBmb250RmFtaWx5XG5cbiAgICAgICAgICAgIC8vZ2V0IG9mZnNldFxuICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5vZmZzZXQoY2VsbCwgcmVzb2x1dGlvbiwgeilcblxuICAgICAgICAgICAgLy90ZXh0IHBvc2l0aW9uXG4gICAgICAgICAgICBjdHgudGV4dEFsaWduID0gJ2NlbnRlcidcbiAgICAgICAgICAgIGNvbnN0IHR4ID0gZ2VvQ2FudmFzLmdlb1RvUGl4WChjZWxsLnggKyByZXNvbHV0aW9uICogMC41ICsgb2Zmc2V0LmR4KVxuICAgICAgICAgICAgY29uc3QgdHkgPSBnZW9DYW52YXMuZ2VvVG9QaXhZKGNlbGwueSArIHJlc29sdXRpb24gKiAwLjUgKyBvZmZzZXQuZHkpICsgZm9udFNpemVQaXggKiAwLjMgLy9pdCBzaG91bGQgYmUgMC41IGJ1dCAwLjMgc2VlbXMgdG8gd29yayBiZXR0ZXJcblxuICAgICAgICAgICAgLy9kcmF3IHRoZSB0ZXh0XG4gICAgICAgICAgICBjdHguZmlsbFRleHQodGV4dCwgdHgsIHR5KVxuICAgICAgICB9XG5cbiAgICAgICAgLy91cGRhdGUgbGVnZW5kc1xuICAgICAgICB0aGlzLnVwZGF0ZUxlZ2VuZHMoeyBzdHlsZTogdGhpcywgcmVzb2x1dGlvbjogcmVzb2x1dGlvbiwgejogeiwgdmlld1NjYWxlOiB2aWV3U2NhbGUgfSlcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBCdWlsZCBhIGZ1bmN0aW9uIFswLDFdLT5zdHJpbmcgZm9yIGNoYXJhY3RlcnMgbGVnZW5kXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxzdHJpbmc+fSBjaGFyc1xuICAgICAqIEBwYXJhbSB7KGZ1bmN0aW9uKG51bWJlcik6bnVtYmVyKXx1bmRlZmluZWR9IHNjYWxlXG4gICAgICogQHJldHVybnMge2Z1bmN0aW9uKG51bWJlcik6c3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyB0ZXh0U2NhbGUoY2hhcnMsIHNjYWxlID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IG5iID0gY2hhcnMubGVuZ3RoXG4gICAgICAgIHJldHVybiAodCkgPT4ge1xuICAgICAgICAgICAgaWYgKHNjYWxlKSB0ID0gc2NhbGUodClcbiAgICAgICAgICAgIGlmICh0ID09IDApIHJldHVybiAnJ1xuICAgICAgICAgICAgaWYgKHQgPj0gMSkgcmV0dXJuIGNoYXJzW25iIC0gMV1cbiAgICAgICAgICAgIHJldHVybiBjaGFyc1tNYXRoLmZsb29yKHQgKiBuYildXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IFN0eWxlIH0gZnJvbSAnLi4vY29yZS9TdHlsZS5qcydcblxuLyoqIEB0eXBlZGVmIHtcImZpcnN0XCJ8XCJib3R0b21cInxcImNlbnRlclwifFwidG9wXCJ8XCJsYXN0XCJ9IEFuY2hvck1vZGVZRW51bSAqL1xuXG4vKipcbiAqIFNob3cgY2VsbCBhcyB0aW1lc2VyaWVzIGNoYXJ0XG4gKiBDYW4gYmUgdXNlZCBmb3Igc3BhcmtsaW5lIG1hcCBvZiBodHRwczovL2RhdGFnaXN0aXBzLmh5cG90aGVzZXMub3JnLzQ4OFxuICpcbiAqIEBtb2R1bGUgc3R5bGVcbiAqIEBhdXRob3IgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIFRpbWVTZXJpZXNTdHlsZSBleHRlbmRzIFN0eWxlIHtcbiAgICAvKiogQHBhcmFtIHtvYmplY3R9IG9wdHMgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLyoqIFRoZSBjb2x1bW5zIG9mIHRoZSB0aW1lIHNlcmllcywgb3JkZXJlZCBpbiBjaHJvbm9sb2dpY2FsIG9yZGVyLlxuICAgICAgICAgKiBAdHlwZSB7QXJyYXkuPHN0cmluZz59ICovXG4gICAgICAgIHRoaXMudHMgPSBvcHRzLnRzXG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gc3BlY2lmeWluZyB3aGVuIGEgdmFsdWUgc2hvdWxkIGJlIGNvbnNpZGVyZWQgYXMgXCJubyBkYXRhXCIgYW5kIHRodXMgbm90IGlnbm9yZWQuIFRoZSBsaW5lIHdpbGwgaGF2ZSBhIGJyZWFrIGF0IHRoZXNlIHZhbHVlcy5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKHN0cmluZyk6Ym9vbGVhbn0gKi9cbiAgICAgICAgdGhpcy5ub0RhdGEgPSBvcHRzLm5vRGF0YSB8fCAoKHYpID0+IHYgPT09IHVuZGVmaW5lZCB8fCB2ID09ICcnIHx8IHYgPT09IG51bGwgfHwgaXNOYU4oK3YpKVxuXG4gICAgICAgIC8veFxuICAgICAgICAvKiogaW4gZ2VvIHVuaXRcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydChcIi4uL2NvcmUvRGF0YXNldC5qc1wiKS5DZWxsLG51bWJlcixudW1iZXIpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy5vZmZzZXRYID0gb3B0cy5vZmZzZXRYIHx8ICgoYywgciwgeikgPT4gMClcbiAgICAgICAgLyoqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXQuanNcIikuQ2VsbCxudW1iZXIsbnVtYmVyKTpudW1iZXJ9ICovXG4gICAgICAgIHRoaXMud2lkdGggPSBvcHRzLndpZHRoIHx8ICgoYywgciwgeikgPT4gcilcblxuICAgICAgICAvL3lcbiAgICAgICAgLyoqIGluIGdlbyB1bml0XG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXQuanNcIikuQ2VsbCxudW1iZXIsbnVtYmVyKTpudW1iZXJ9ICovXG4gICAgICAgIHRoaXMub2Zmc2V0WSA9IG9wdHMub2Zmc2V0WSB8fCAoKGMsIHIsIHopID0+IDApXG4gICAgICAgIC8qKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0LmpzXCIpLkNlbGwsbnVtYmVyLG51bWJlcik6bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLmhlaWdodCA9IG9wdHMuaGVpZ2h0IHx8ICgoYywgciwgeikgPT4gcilcbiAgICAgICAgLyoqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXQuanNcIikuQ2VsbCxudW1iZXIsbnVtYmVyKTpBbmNob3JNb2RlWUVudW19ICovXG4gICAgICAgIHRoaXMuYW5jaG9yTW9kZVkgPSBvcHRzLmFuY2hvck1vZGVZIHx8ICgoYywgciwgeikgPT4gJ2NlbnRlcicpXG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSB3aWR0aCBvZiB0aGUgbGluZSwgaW4gZ2VvIHVuaXRcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbCwgbnVtYmVyLCBudW1iZXIsIG9iamVjdCk6bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLmxpbmVXaWR0aCA9IG9wdHMubGluZVdpZHRoIHx8ICgodiwgciwgcywgeikgPT4gMS41ICogeilcblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIGNvbG9yIG9mIHRoZSBjaGFydC5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbCwgbnVtYmVyLCBudW1iZXIsIG9iamVjdCk6c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLmNvbG9yID0gb3B0cy5jb2xvciB8fCAoKCkgPT4gJ2JsYWNrJykgLy8oYyxyLHosdnMpID0+IHt9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRHJhdyBjZWxscyBhcyB0ZXh0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0LmpzXCIpLkNlbGw+fSBjZWxsc1xuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29yZS9HZW9DYW52YXMuanNcIikuR2VvQ2FudmFzfSBnZW9DYW52YXNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVzb2x1dGlvblxuICAgICAqL1xuICAgIGRyYXcoY2VsbHMsIGdlb0NhbnZhcywgcmVzb2x1dGlvbikge1xuICAgICAgICAvL2ZpbHRlclxuICAgICAgICBpZiAodGhpcy5maWx0ZXIpIGNlbGxzID0gY2VsbHMuZmlsdGVyKHRoaXMuZmlsdGVyKVxuXG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IHogPSBnZW9DYW52YXMudmlldy56XG4gICAgICAgIGNvbnN0IGN0eCA9IGdlb0NhbnZhcy5vZmZzY3JlZW5DdHhcblxuICAgICAgICAvL2dldCB2aWV3IHNjYWxlXG4gICAgICAgIGNvbnN0IHZpZXdTY2FsZSA9IHRoaXMudmlld1NjYWxlID8gdGhpcy52aWV3U2NhbGUoY2VsbHMsIHJlc29sdXRpb24sIHopIDogdW5kZWZpbmVkXG5cbiAgICAgICAgLy9jb21wdXRlIGNlbGwgYW1wbGl0dWRlXG4gICAgICAgIGNvbnN0IGdldEFtcGxpdHVkZSA9IChjKSA9PiB7XG4gICAgICAgICAgICBsZXQgbWluLCBtYXhcbiAgICAgICAgICAgIGZvciAobGV0IHQgb2YgdGhpcy50cykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IGNbdF1cbiAgICAgICAgICAgICAgICBpZiAodmFsID09IHVuZGVmaW5lZCkgY29udGludWVcbiAgICAgICAgICAgICAgICBpZiAobWluID09IHVuZGVmaW5lZCB8fCB2YWwgPCBtaW4pIG1pbiA9IHZhbFxuICAgICAgICAgICAgICAgIGlmIChtYXggPT0gdW5kZWZpbmVkIHx8IHZhbCA+IG1heCkgbWF4ID0gdmFsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWluID09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgICAgICAgcmV0dXJuIG1heCAtIG1pblxuICAgICAgICB9XG5cbiAgICAgICAgLy9jb21wdXRlIG1heCBhbXBsaXR1ZGVcbiAgICAgICAgbGV0IGFtcE1heFxuICAgICAgICBmb3IgKGxldCBjIG9mIGNlbGxzKSB7XG4gICAgICAgICAgICBjb25zdCBhbXAgPSBnZXRBbXBsaXR1ZGUoYylcbiAgICAgICAgICAgIGlmIChhbXAgPT0gdW5kZWZpbmVkKSBjb250aW51ZVxuICAgICAgICAgICAgaWYgKGFtcE1heCA9PSB1bmRlZmluZWQgfHwgYW1wID4gYW1wTWF4KSBhbXBNYXggPSBhbXBcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWFtcE1heCkgcmV0dXJuXG5cbiAgICAgICAgY29uc3QgbmIgPSB0aGlzLnRzLmxlbmd0aFxuXG4gICAgICAgIGN0eC5saW5lQ2FwID0gJ2J1dHQnXG4gICAgICAgIGZvciAobGV0IGMgb2YgY2VsbHMpIHtcbiAgICAgICAgICAgIC8vbGluZSB3aWR0aFxuICAgICAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ8dW5kZWZpbmVkfSAqL1xuICAgICAgICAgICAgY29uc3Qgd0cgPSB0aGlzLmxpbmVXaWR0aCA/IHRoaXMubGluZVdpZHRoKGMsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgOiB1bmRlZmluZWRcbiAgICAgICAgICAgIGlmICghd0cgfHwgd0cgPCAwKSBjb250aW51ZVxuXG4gICAgICAgICAgICAvL2xpbmUgY29sb3JcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfHVuZGVmaW5lZH0gKi9cbiAgICAgICAgICAgIGNvbnN0IGNvbCA9IHRoaXMuY29sb3IgPyB0aGlzLmNvbG9yKGMsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgOiB1bmRlZmluZWRcbiAgICAgICAgICAgIGlmICghY29sKSBjb250aW51ZVxuXG4gICAgICAgICAgICAvL3hcbiAgICAgICAgICAgIGNvbnN0IG9mZlggPSB0aGlzLm9mZnNldFggPyB0aGlzLm9mZnNldFgoYywgcmVzb2x1dGlvbiwgeikgOiAwXG4gICAgICAgICAgICBpZiAob2ZmWCA9PSB1bmRlZmluZWQgfHwgaXNOYU4ob2ZmWCkpIGNvbnRpbnVlXG4gICAgICAgICAgICBjb25zdCB3ID0gdGhpcy53aWR0aCA/IHRoaXMud2lkdGgoYywgcmVzb2x1dGlvbiwgeikgOiByZXNvbHV0aW9uXG4gICAgICAgICAgICBpZiAodyA9PSB1bmRlZmluZWQgfHwgaXNOYU4odykpIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIC8veVxuICAgICAgICAgICAgY29uc3Qgb2ZmWSA9IHRoaXMub2Zmc2V0WSA/IHRoaXMub2Zmc2V0WShjLCByZXNvbHV0aW9uLCB6KSA6IDBcbiAgICAgICAgICAgIGlmIChvZmZZID09IHVuZGVmaW5lZCB8fCBpc05hTihvZmZZKSkgY29udGludWVcbiAgICAgICAgICAgIGNvbnN0IGggPSB0aGlzLmhlaWdodCA/IHRoaXMuaGVpZ2h0KGMsIHJlc29sdXRpb24sIHopIDogcmVzb2x1dGlvblxuICAgICAgICAgICAgaWYgKGggPT0gdW5kZWZpbmVkIHx8IGlzTmFOKGgpKSBjb250aW51ZVxuICAgICAgICAgICAgY29uc3QgYW5jaFkgPSB0aGlzLmFuY2hvck1vZGVZID8gdGhpcy5hbmNob3JNb2RlWShjLCByZXNvbHV0aW9uLCB6KSA6ICdjZW50ZXInXG4gICAgICAgICAgICBpZiAoIWFuY2hZKSBjb250aW51ZVxuXG4gICAgICAgICAgICBjdHgubGluZVdpZHRoID0gd0dcbiAgICAgICAgICAgIGN0eC5zdHJva2VTdHlsZSA9IGNvbFxuXG4gICAgICAgICAgICAvL2NvbXB1dGUgYW5jaG9yIFkgZmlndXJlc1xuICAgICAgICAgICAgbGV0IHZhbDAsIHkwXG4gICAgICAgICAgICBpZiAoYW5jaFkgPT09ICdmaXJzdCcpIHtcbiAgICAgICAgICAgICAgICAvL2dldCBmaXJzdCB2YWx1ZVxuICAgICAgICAgICAgICAgIHZhbDAgPSBjW3RoaXMudHNbMF1dXG4gICAgICAgICAgICAgICAgeTAgPSAwXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGFuY2hZID09PSAnbGFzdCcpIHtcbiAgICAgICAgICAgICAgICAvL2dldCBsYXN0IHZhbHVlXG4gICAgICAgICAgICAgICAgdmFsMCA9IGNbdGhpcy50c1t0aGlzLnRzLmxlbmd0aCAtIDFdXVxuICAgICAgICAgICAgICAgIHkwID0gMFxuICAgICAgICAgICAgfSBlbHNlIGlmIChhbmNoWSA9PT0gJ2JvdHRvbScpIHtcbiAgICAgICAgICAgICAgICAvL2dldCBtaW5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCB0IG9mIHRoaXMudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsID0gK2NbdF1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbCA9PSB1bmRlZmluZWQpIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWwwID09IHVuZGVmaW5lZCB8fCB2YWwgPCB2YWwwKSB2YWwwID0gdmFsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHkwID0gMFxuICAgICAgICAgICAgfSBlbHNlIGlmIChhbmNoWSA9PT0gJ3RvcCcpIHtcbiAgICAgICAgICAgICAgICAvL2dldCBtYXhcbiAgICAgICAgICAgICAgICBmb3IgKGxldCB0IG9mIHRoaXMudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsID0gK2NbdF1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbCA9PSB1bmRlZmluZWQpIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWwwID09IHVuZGVmaW5lZCB8fCB2YWwgPiB2YWwwKSB2YWwwID0gdmFsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHkwID0gcmVzb2x1dGlvblxuICAgICAgICAgICAgfSBlbHNlIGlmIChhbmNoWSA9PT0gJ2NlbnRlcicpIHtcbiAgICAgICAgICAgICAgICAvL2dldCBtaW4gYW5kIG1heFxuICAgICAgICAgICAgICAgIGxldCBtaW4sIG1heFxuICAgICAgICAgICAgICAgIGZvciAobGV0IHQgb2YgdGhpcy50cykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSBjW3RdXG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWwgPT0gdW5kZWZpbmVkKSBjb250aW51ZVxuICAgICAgICAgICAgICAgICAgICBpZiAobWluID09IHVuZGVmaW5lZCB8fCB2YWwgPCBtaW4pIG1pbiA9IHZhbFxuICAgICAgICAgICAgICAgICAgICBpZiAobWF4ID09IHVuZGVmaW5lZCB8fCB2YWwgPiBtYXgpIG1heCA9IHZhbFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YWwwID0gKCttYXggKyArbWluKSAqIDAuNVxuICAgICAgICAgICAgICAgIHkwID0gcmVzb2x1dGlvbiAvIDJcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1VuZXhwZWN0ZWQgYW5jaG9yTW9kZVk6ICcgKyBhbmNoWSlcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKi9kcmF3IGxpbmVcbiAgICAgICAgICAgIGlmICh2YWwwID09IHVuZGVmaW5lZCB8fCBpc05hTih2YWwwKSkgY29udGludWVcbiAgICAgICAgICAgIGNnLmN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgY29uc3Qgc1ggPSB3IC8gKG5iIC0gMSlcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmI7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IGNbdGhpcy50c1tpXV1cbiAgICAgICAgICAgICAgICBpZiAodmFsID09IHVuZGVmaW5lZCB8fCBpc05hTih2YWwpKSBicmVha1xuICAgICAgICAgICAgICAgIGlmIChpID09IDApXG4gICAgICAgICAgICAgICAgICAgIGNnLmN0eC5tb3ZlVG8oYy54ICsgaSAqIHNYICsgb2ZmWCwgYy55ICsgeTAgKyAodmFsIC0gdmFsMCkgKiBoIC8gYW1wTWF4ICsgb2ZmWSlcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIGNnLmN0eC5saW5lVG8oYy54ICsgaSAqIHNYICsgb2ZmWCwgYy55ICsgeTAgKyAodmFsIC0gdmFsMCkgKiBoIC8gYW1wTWF4ICsgb2ZmWSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNnLmN0eC5zdHJva2UoKSovXG5cbiAgICAgICAgICAgIC8vZHJhdyBsaW5lLCBzZWdtZW50IGJ5IHNlZ21lbnRcbiAgICAgICAgICAgIGNvbnN0IHNYID0gdyAvIChuYiAtIDEpXG5cbiAgICAgICAgICAgIC8vaGFuZGxlIGZpcnN0IHBvaW50XG4gICAgICAgICAgICBsZXQgdjAgPSBjW3RoaXMudHNbMF1dXG4gICAgICAgICAgICBpZiAoIXRoaXMubm9EYXRhKHYwKSkge1xuICAgICAgICAgICAgICAgIGN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgICAgIGN0eC5tb3ZlVG8oYy54ICsgb2ZmWCwgYy55ICsgeTAgKyAoKHYwIC0gdmFsMCkgKiBoKSAvIGFtcE1heCArIG9mZlkpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKHYwLCBpc05hTih2MCkpXG5cbiAgICAgICAgICAgIGxldCB2MVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBuYjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdjEgPSBjW3RoaXMudHNbaV1dXG5cbiAgICAgICAgICAgICAgICAvL2RyYXcgc2VnbWVudCBmcm9tIHYwIHRvIHYxXG5cbiAgICAgICAgICAgICAgICAvL2JvdGggcG9pbnRzICdubyBkYXRhJ1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm5vRGF0YSh2MCkgJiYgdGhpcy5ub0RhdGEodjEpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vc2Vjb25kIHBvaW50ICdubyBkYXRhJ1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMubm9EYXRhKHYwKSAmJiB0aGlzLm5vRGF0YSh2MSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4LnN0cm9rZSgpXG5cbiAgICAgICAgICAgICAgICAgICAgLy9maXJzdCBwb2ludCAnbm8gZGF0YSdcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMubm9EYXRhKHYwKSAmJiAhdGhpcy5ub0RhdGEodjEpKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgICAgICAgICBjdHgubW92ZVRvKGMueCArIGkgKiBzWCArIG9mZlgsIGMueSArIHkwICsgKCh2MSAtIHZhbDApICogaCkgLyBhbXBNYXggKyBvZmZZKVxuXG4gICAgICAgICAgICAgICAgICAgIC8vYm90aCBwb2ludHMgaGF2ZSBkYXRhOiB0cmFjZSBsaW5lXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4LmxpbmVUbyhjLnggKyBpICogc1ggKyBvZmZYLCBjLnkgKyB5MCArICgodjEgLSB2YWwwKSAqIGgpIC8gYW1wTWF4ICsgb2ZmWSlcbiAgICAgICAgICAgICAgICAgICAgLy9pZiBpdCBpcyB0aGUgbGFzdCBwb2ludCwgc3Ryb2tlXG4gICAgICAgICAgICAgICAgICAgIGlmIChpID09IG5iIC0gMSkgY3R4LnN0cm9rZSgpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHYwID0gdjFcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vdXBkYXRlIGxlZ2VuZCwgaWYgYW55XG4gICAgICAgIHRoaXMudXBkYXRlTGVnZW5kcyh7IHN0eWxlOiB0aGlzLCByZXNvbHV0aW9uOiByZXNvbHV0aW9uLCB6OiB6LCB2aWV3U2NhbGU6IHZpZXdTY2FsZSB9KVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgaW5pdFNoYWRlclByb2dyYW0sIGNyZWF0ZVNoYWRlciB9IGZyb20gJy4vd2ViR0xVdGlscy5qcydcbmltcG9ydCB7IGNvbG9yIH0gZnJvbSAnZDMtY29sb3InXG5cbi8qKlxuICogRXZlcnl0aGluZyB0byBlYXNpbHkgZHJhdyBjb2xvcmVkIHNxdWFyZXMgd2l0aCB3ZWJHTC5cbiAqIEFsbCB0aGUgc2FtZSBzaXplLCBidXQgZGlmZmVyZW50IGZpbGwgY29sb3IuXG4gKi9cbmV4cG9ydCBjbGFzcyBXZWJHTFNxdWFyZUNvbG9yaW5nIHtcbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7V2ViR0xSZW5kZXJpbmdDb250ZXh0fSBnbFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGdsLCBzaXplUGl4KSB7XG4gICAgICAgIHRoaXMuZ2wgPSBnbFxuICAgICAgICB0aGlzLnNpemVQaXggPSBzaXplUGl4IHx8IDEwLjBcblxuICAgICAgICB0aGlzLnByb2dyYW0gPSBpbml0U2hhZGVyUHJvZ3JhbShcbiAgICAgICAgICAgIGdsLFxuICAgICAgICAgICAgY3JlYXRlU2hhZGVyKFxuICAgICAgICAgICAgICAgIGdsLFxuICAgICAgICAgICAgICAgIGdsLlZFUlRFWF9TSEFERVIsXG4gICAgICAgICAgICAgICAgYFxuICAgICAgICAgICAgYXR0cmlidXRlIHZlYzIgcG9zO1xuICAgICAgICAgICAgdW5pZm9ybSBmbG9hdCBzaXplUGl4O1xuICAgICAgICAgICAgdW5pZm9ybSBtYXQzIG1hdDtcbiAgICAgICAgICAgIGF0dHJpYnV0ZSB2ZWM0IGNvbG9yO1xuICAgICAgICAgICAgdmFyeWluZyB2ZWM0IHZDb2xvcjtcbiAgICAgICAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgICAgICAgZ2xfUG9zaXRpb24gPSB2ZWM0KG1hdCAqIHZlYzMocG9zLCAxLjApLCAxLjApO1xuICAgICAgICAgICAgICBnbF9Qb2ludFNpemUgPSBzaXplUGl4O1xuICAgICAgICAgICAgICB2Q29sb3IgPSBjb2xvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBgXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgY3JlYXRlU2hhZGVyKFxuICAgICAgICAgICAgICAgIGdsLFxuICAgICAgICAgICAgICAgIGdsLkZSQUdNRU5UX1NIQURFUixcbiAgICAgICAgICAgICAgICBgXG4gICAgICAgICAgICBwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbiAgICAgICAgICAgIHZhcnlpbmcgdmVjNCB2Q29sb3I7XG4gICAgICAgICAgICB2b2lkIG1haW4odm9pZCkge1xuICAgICAgICAgICAgICAgIHZlYzQgdkNvbG9yXyA9IHZDb2xvciAvIDI1NS4wO1xuICAgICAgICAgICAgICAgIHZDb2xvcl9bM10gPSAyNTUuMCAqIHZDb2xvcl9bM107XG4gICAgICAgICAgICAgICAgZ2xfRnJhZ0NvbG9yID0gdkNvbG9yXztcbiAgICAgICAgICAgIH1gXG4gICAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgICAgZ2wudXNlUHJvZ3JhbSh0aGlzLnByb2dyYW0pXG5cbiAgICAgICAgLy9idWZmZXIgZGF0YVxuICAgICAgICB0aGlzLnZlcnRpY2VzQnVmZmVyID0gW11cbiAgICAgICAgdGhpcy5jb2xvcnNCdWZmZXIgPSBbXVxuICAgIH1cblxuICAgIC8qKiBBZGQgZGF0YSB0byB2ZXJ0aWNlcy9zaXplL2NvbG9yIGJ1ZmZlcnMgZm9yIGNvbG9yIHNxdWFyZXMgZHJhd2luZyAqL1xuICAgIGFkZFBvaW50RGF0YSh4QywgeUMsIGNvbCkge1xuICAgICAgICAvL2NvbnZlcnQgY29sb3JcbiAgICAgICAgY29uc3QgY2MgPSBjb2xvcihjb2wpXG4gICAgICAgIC8vY29uc3QgY2MgPSB7cjo0NSxnOjg3LGI6OTgsb3BhY2l0eTowLjl9XG4gICAgICAgIGlmICghY2MpIHJldHVyblxuXG4gICAgICAgIC8vdmVydGljZXNcbiAgICAgICAgdGhpcy52ZXJ0aWNlc0J1ZmZlci5wdXNoKHhDLCB5QylcbiAgICAgICAgLy9jb2xvclxuICAgICAgICB0aGlzLmNvbG9yc0J1ZmZlci5wdXNoKGNjLnIsIGNjLmcsIGNjLmIsIGNjLm9wYWNpdHkpXG4gICAgfVxuXG4gICAgYWRkUG9pbnREYXRhMih4QywgeUMsIHIsIGcsIGIsIG9wYWNpdHkpIHtcbiAgICAgICAgLy92ZXJ0aWNlc1xuICAgICAgICB0aGlzLnZlcnRpY2VzQnVmZmVyLnB1c2goeEMsIHlDKVxuICAgICAgICAvL2NvbG9yXG4gICAgICAgIHRoaXMuY29sb3JzQnVmZmVyLnB1c2gociwgZywgYiwgb3BhY2l0eSlcbiAgICB9XG5cbiAgICAvKiogICovXG4gICAgZHJhdyh0cmFuc2ZvTWF0KSB7XG4gICAgICAgIGNvbnN0IGdsID0gdGhpcy5nbFxuXG4gICAgICAgIC8vdmVydGljZSBkYXRhXG4gICAgICAgIGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCBnbC5jcmVhdGVCdWZmZXIoKSlcbiAgICAgICAgZ2wuYnVmZmVyRGF0YShnbC5BUlJBWV9CVUZGRVIsIG5ldyBGbG9hdDMyQXJyYXkodGhpcy52ZXJ0aWNlc0J1ZmZlciksIGdsLlNUQVRJQ19EUkFXKVxuICAgICAgICBjb25zdCBwb3NpdGlvbiA9IGdsLmdldEF0dHJpYkxvY2F0aW9uKHRoaXMucHJvZ3JhbSwgJ3BvcycpXG4gICAgICAgIGdsLnZlcnRleEF0dHJpYlBvaW50ZXIoXG4gICAgICAgICAgICBwb3NpdGlvbixcbiAgICAgICAgICAgIDIsIC8vbnVtQ29tcG9uZW50c1xuICAgICAgICAgICAgZ2wuRkxPQVQsIC8vdHlwZVxuICAgICAgICAgICAgZmFsc2UsIC8vbm9ybWFsaXNlXG4gICAgICAgICAgICAwLCAvL3N0cmlkZVxuICAgICAgICAgICAgMCAvL29mZnNldFxuICAgICAgICApXG4gICAgICAgIGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KHBvc2l0aW9uKVxuXG4gICAgICAgIC8vY29sb3IgZGF0YVxuICAgICAgICBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgZ2wuY3JlYXRlQnVmZmVyKCkpXG4gICAgICAgIGdsLmJ1ZmZlckRhdGEoZ2wuQVJSQVlfQlVGRkVSLCBuZXcgRmxvYXQzMkFycmF5KHRoaXMuY29sb3JzQnVmZmVyKSwgZ2wuU1RBVElDX0RSQVcpXG4gICAgICAgIHZhciBjb2xvciA9IGdsLmdldEF0dHJpYkxvY2F0aW9uKHRoaXMucHJvZ3JhbSwgJ2NvbG9yJylcbiAgICAgICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihjb2xvciwgNCwgZ2wuRkxPQVQsIGZhbHNlLCAwLCAwKVxuICAgICAgICBnbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShjb2xvcilcblxuICAgICAgICAvL3NpemVQaXhcbiAgICAgICAgZ2wudW5pZm9ybTFmKGdsLmdldFVuaWZvcm1Mb2NhdGlvbih0aGlzLnByb2dyYW0sICdzaXplUGl4JyksIDEuMCAqIHRoaXMuc2l6ZVBpeClcblxuICAgICAgICAvL3RyYW5zZm9ybWF0aW9uXG4gICAgICAgIGdsLnVuaWZvcm1NYXRyaXgzZnYoZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHRoaXMucHJvZ3JhbSwgJ21hdCcpLCBmYWxzZSwgbmV3IEZsb2F0MzJBcnJheSh0cmFuc2ZvTWF0KSlcblxuICAgICAgICAvLyBFbmFibGUgdGhlIGRlcHRoIHRlc3RcbiAgICAgICAgLy9nbC5lbmFibGUoZ2wuREVQVEhfVEVTVCk7XG4gICAgICAgIC8vIENsZWFyIHRoZSBjb2xvciBidWZmZXIgYml0XG4gICAgICAgIGdsLmNsZWFyKGdsLkNPTE9SX0JVRkZFUl9CSVQpXG4gICAgICAgIC8vIFNldCB0aGUgdmlldyBwb3J0XG4gICAgICAgIC8vZ2wudmlld3BvcnQoMCwgMCwgY2cudywgY2cuaCk7XG5cbiAgICAgICAgZ2wuZHJhd0FycmF5cyhnbC5QT0lOVFMsIDAsIHRoaXMudmVydGljZXNCdWZmZXIubGVuZ3RoIC8gMilcbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IGluaXRTaGFkZXJQcm9ncmFtLCBjcmVhdGVTaGFkZXIgfSBmcm9tICcuL3dlYkdMVXRpbHMuanMnXG5pbXBvcnQgeyBjb2xvciB9IGZyb20gJ2QzLWNvbG9yJ1xuXG4vKipcbiAqIEV2ZXJ5dGhpbmcgdG8gZWFzaWx5IGRyYXcgY29sb3JlZCBzcXVhcmVzIHdpdGggd2ViR0wuXG4gKiBBbGwgdGhlIHNhbWUgc2l6ZSwgYnV0IGRpZmZlcmVudCBmaWxsIGNvbG9yLlxuICogVGhlIGNvbG9yIGludGVycG9sYXRpb24gaXMgY29tcHV0ZWQgaW4gdGhlIGZyYWdtZW50IHNoYWRlciBwcm9ncmFtLCBieSB0aGUgR1BVLCB0aHVzIGl0IGlzIGxlc3MgZmxleGlibGUgYnV0IGZhc3Rlci5cbiAqL1xuZXhwb3J0IGNsYXNzIFdlYkdMU3F1YXJlQ29sb3JpbmdBZHZhbmNlZCB7XG4gICAgLy9zZWU6XG4gICAgLy9odHRwczovL3dlYmdsZnVuZGFtZW50YWxzLm9yZy93ZWJnbC9sZXNzb25zL2ZyL3dlYmdsLXNoYWRlcnMtYW5kLWdsc2wuaHRtbCNsZXMtdW5pZm9ybXMtZGFucy1sZXMtc2hhZGVycy1kZS12ZXJ0ZXhcbiAgICAvL2h0dHBzOi8vdGhlYm9va29mc2hhZGVycy5jb20vZ2xvc3NhcnkvP3NlYXJjaD1taXhcbiAgICAvL2h0dHBzOi8vdGhlYm9va29mc2hhZGVycy5jb20vMDYvXG4gICAgLy9odHRwczovL3RoZWJvb2tvZnNoYWRlcnMuY29tL2dsb3NzYXJ5L1xuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0geyp9IGdsXG4gICAgICogQHBhcmFtIHtBcnJheS48U3RyaW5nPn0gY29sb3JzXG4gICAgICogQHBhcmFtIHt7ZnVuOnN0cmluZyxhbHBoYTpudW1iZXJ9fSBzdHJldGNoaW5nXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHNpemVQaXhcbiAgICAgKiBAcGFyYW0ge251bWJlcnx1bmRlZmluZWR9IGdsb2JhbE9wYWNpdHlcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihnbCwgY29sb3JzLCBzdHJldGNoaW5nLCBzaXplUGl4ID0gMTAsIGdsb2JhbE9wYWNpdHkgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgLyoqIEB0eXBlIHtXZWJHTFJlbmRlcmluZ0NvbnRleHR9ICovXG4gICAgICAgIHRoaXMuZ2wgPSBnbFxuICAgICAgICAvL2dsLnBpeGVsU3RvcmVpKGdsLlVOUEFDS19QUkVNVUxUSVBMWV9BTFBIQV9XRUJHTCwgdHJ1ZSk7XG4gICAgICAgIC8vZ2wuYmxlbmRGdW5jKGdsLlNSQ19BTFBIQSwgZ2wuT05FX01JTlVTX1NSQ19BTFBIQSk7XG4gICAgICAgIC8vZ2wuYmxlbmRGdW5jKGdsLk9ORSwgZ2wuT05FX01JTlVTX1NSQ19BTFBIQSk7XG5cbiAgICAgICAgLyoqIEB0eXBlIHtXZWJHTFNoYWRlcn0gKi9cbiAgICAgICAgY29uc3QgdlNoYWRlciA9IGNyZWF0ZVNoYWRlcihcbiAgICAgICAgICAgIGdsLFxuICAgICAgICAgICAgZ2wuVkVSVEVYX1NIQURFUixcbiAgICAgICAgICAgIGBcbiAgICAgICAgYXR0cmlidXRlIHZlYzIgcG9zO1xuICAgICAgICB1bmlmb3JtIGZsb2F0IHNpemVQaXg7XG4gICAgICAgIHVuaWZvcm0gbWF0MyBtYXQ7XG5cbiAgICAgICAgYXR0cmlidXRlIGZsb2F0IHQ7XG4gICAgICAgIHZhcnlpbmcgZmxvYXQgdnQ7XG5cbiAgICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAgIGdsX1Bvc2l0aW9uID0gdmVjNChtYXQgKiB2ZWMzKHBvcywgMS4wKSwgMS4wKTtcbiAgICAgICAgICBnbF9Qb2ludFNpemUgPSBzaXplUGl4O1xuICAgICAgICAgIHZ0ID0gdDtcbiAgICAgICAgfVxuICAgICAgYFxuICAgICAgICApXG5cbiAgICAgICAgLy9wcmVwYXJlIGZyYWdtZW50IHNoYWRlciBjb2RlXG4gICAgICAgIC8vZGVjbGFyZSB0aGUgdW5pZm9ybSBhbmQgb3RoZXIgdmFyaWFibGVzXG4gICAgICAgIGxldCBmc2hTdHJpbmcgPVxuICAgICAgICAgICAgJycgK1xuICAgICAgICAgICAgJ3ByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xcbicgK1xuICAgICAgICAgICAgJ3ZhcnlpbmcgZmxvYXQgdnQ7XFxuJyArXG4gICAgICAgICAgICAndW5pZm9ybSBmbG9hdCBhbHBoYTtcXG4nICtcbiAgICAgICAgICAgICgoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3V0ID0gW11cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbG9ycy5sZW5ndGg7IGkrKykgb3V0LnB1c2goJ3VuaWZvcm0gdmVjNCBjJyArIGkgKyAnO1xcbicpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG91dC5qb2luKCcnKVxuICAgICAgICAgICAgfSkoKSArXG4gICAgICAgICAgICAvL3N0YXJ0IHRoZSBtYWluIGZ1bmN0aW9uLCBhcHBseSB0aGUgc3RyZXRjaGluZyBvZiB0XG4gICAgICAgICAgICAndm9pZCBtYWluKHZvaWQpIHtcXG4nXG5cbiAgICAgICAgaWYgKHN0cmV0Y2hpbmcpIHtcbiAgICAgICAgICAgIGlmIChzdHJldGNoaW5nLmZ1biA9PSAncG93JylcbiAgICAgICAgICAgICAgICAvL3NQb3cgPSAodCwgYWxwaGEgPSAzKSA9PiBNYXRoLnBvdyh0LCBhbHBoYSk7XG4gICAgICAgICAgICAgICAgZnNoU3RyaW5nICs9ICcgICBmbG9hdCB0ID0gcG93KHZ0LCBhbHBoYSk7XFxuJ1xuICAgICAgICAgICAgZWxzZSBpZiAoc3RyZXRjaGluZy5mdW4gPT0gJ3Bvd0ludicpXG4gICAgICAgICAgICAgICAgLy9zUG93UmV2ID0gKHQsIGFscGhhID0gMykgPT4gMSAtIE1hdGgucG93KDEgLSB0LCAxIC8gYWxwaGEpO1xuICAgICAgICAgICAgICAgIGZzaFN0cmluZyArPSAnICAgZmxvYXQgdCA9IDEuMC1wb3coMS4wLXZ0LCAxLjAvYWxwaGEpO1xcbidcbiAgICAgICAgICAgIGVsc2UgaWYgKHN0cmV0Y2hpbmcuZnVuID09ICdleHAnKVxuICAgICAgICAgICAgICAgIC8vc0V4cCA9ICh0LCBhbHBoYSA9IDMpID0+IGFscGhhID09IDAgPyB0IDogKE1hdGguZXhwKHQgKiBhbHBoYSkgLSAxKSAvIChNYXRoLmV4cChhbHBoYSkgLSAxKTtcbiAgICAgICAgICAgICAgICBmc2hTdHJpbmcgKz1cbiAgICAgICAgICAgICAgICAgICAgc3RyZXRjaGluZy5hbHBoYSA9PSAwXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGBmbG9hdCB0ID0gdnQ7YFxuICAgICAgICAgICAgICAgICAgICAgICAgOiAnICAgZmxvYXQgdCA9IChleHAodnQgKiBhbHBoYSkgLSAxLjApIC8gKGV4cChhbHBoYSkgLSAxLjApO1xcbidcbiAgICAgICAgICAgIGVsc2UgaWYgKHN0cmV0Y2hpbmcuZnVuID09ICdsb2cnKVxuICAgICAgICAgICAgICAgIC8vc0V4cFJldiA9ICh0LCBhbHBoYSA9IDMpID0+IGFscGhhID09IDAgPyB0IDogMSAtICgxIC8gYWxwaGEpICogTWF0aC5sb2coTWF0aC5leHAoYWxwaGEpICogKDEgLSB0KSArIHQpO1xuICAgICAgICAgICAgICAgIGZzaFN0cmluZyArPVxuICAgICAgICAgICAgICAgICAgICBzdHJldGNoaW5nLmFscGhhID09IDBcbiAgICAgICAgICAgICAgICAgICAgICAgID8gYGZsb2F0IHQgPSB2dDtgXG4gICAgICAgICAgICAgICAgICAgICAgICA6ICcgICBmbG9hdCB0ID0gMS4wIC0gKDEuMCAvIGFscGhhKSAqIGxvZyhleHAoYWxwaGEpICogKDEuMCAtIHZ0KSArIHZ0KTtcXG4nXG4gICAgICAgICAgICBlbHNlIGlmIChzdHJldGNoaW5nLmZ1biA9PSAnY2lyY2xlJykge1xuICAgICAgICAgICAgICAgIGlmIChzdHJldGNoaW5nLmFscGhhID09IDApXG4gICAgICAgICAgICAgICAgICAgIC8vaWYgKGFscGhhID09IDApIHJldHVybiB0O1xuICAgICAgICAgICAgICAgICAgICBmc2hTdHJpbmcgKz0gJyAgIGZsb2F0IHQgPSB2dDtcXG4nXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoc3RyZXRjaGluZy5hbHBoYSA9PSAxKVxuICAgICAgICAgICAgICAgICAgICAvLyBpZiAoYWxwaGEgPT0gMSkgcmV0dXJuIE1hdGguc3FydCgyICogdCAtIHQgKiB0KTtcbiAgICAgICAgICAgICAgICAgICAgZnNoU3RyaW5nICs9ICcgICBmbG9hdCB0ID0gc3FydCh2dCAqICgyLjAgLSB2dCkpO1xcbidcbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy9jb25zdCBhID0gYWxwaGEgLyAoMSAtIGFscGhhKTtcbiAgICAgICAgICAgICAgICAgICAgLy9yZXR1cm4gTWF0aC5zcXJ0KDEgLyAoYSAqIGEpICsgdCAqICgyIC8gYSArIDIgLSB0KSkgLSAxIC8gYTtcbiAgICAgICAgICAgICAgICAgICAgZnNoU3RyaW5nICs9XG4gICAgICAgICAgICAgICAgICAgICAgICAnICAgZmxvYXQgYSA9IGFscGhhIC8gKDEuMCAtIGFscGhhKTtcXG4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICcgICBmbG9hdCB0ID0gc3FydCgxLjAgLyAoYSAqIGEpICsgdnQgKiAoIDIuMC9hICsgMi4wIC0gdnQgKSkgLSAxLjAgLyBhO1xcbidcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHN0cmV0Y2hpbmcuZnVuID09ICdjaXJjbGVJbnYnKSB7XG4gICAgICAgICAgICAgICAgLy8gMSAtIHNDaXJjbGVMb3coMSAtIHQsIGFscGhhKVxuICAgICAgICAgICAgICAgIGlmIChzdHJldGNoaW5nLmFscGhhID09IDApXG4gICAgICAgICAgICAgICAgICAgIC8vaWYgKGFscGhhID09IDApIHJldHVybiB0O1xuICAgICAgICAgICAgICAgICAgICBmc2hTdHJpbmcgKz0gJyAgIGZsb2F0IHQgPSB2dDtcXG4nXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoc3RyZXRjaGluZy5hbHBoYSA9PSAxKVxuICAgICAgICAgICAgICAgICAgICAvLyBpZiAoYWxwaGEgPT0gMSkgcmV0dXJuIE1hdGguc3FydCgyICogdCAtIHQgKiB0KTtcbiAgICAgICAgICAgICAgICAgICAgZnNoU3RyaW5nICs9ICcgICBmbG9hdCB0ID0gMS4wIC0gc3FydCgoMS4wIC0gdnQpICogKDEuMCArIHZ0KSk7XFxuJ1xuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvL2NvbnN0IGEgPSBhbHBoYSAvICgxIC0gYWxwaGEpO1xuICAgICAgICAgICAgICAgICAgICAvL3JldHVybiBNYXRoLnNxcnQoMSAvIChhICogYSkgKyAoMiAqIHQpIC8gYSArIDIgKiB0IC0gdCAqIHQpIC0gMSAvIGE7XG4gICAgICAgICAgICAgICAgICAgIGZzaFN0cmluZyArPVxuICAgICAgICAgICAgICAgICAgICAgICAgJyAgIGZsb2F0IGEgPSBhbHBoYSAvICgxLjAgLSBhbHBoYSk7XFxuJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnICAgZmxvYXQgdCA9IDEuMCAtIHNxcnQoMS4wIC8gKGEgKiBhKSArICgxLjAtdnQpICogKCAyLjAvYSArIDEuMCArIHZ0ICkpICsgMS4wIC8gYTtcXG4nXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdVbmV4cGVjdGVkIHN0cmV0Y2hpbmcgZnVuY3Rpb24gY29kZTogJyArIHN0cmV0Y2hpbmcuZnVuKVxuICAgICAgICAgICAgICAgIGZzaFN0cmluZyArPSAnICAgZmxvYXQgdCA9IHZ0O1xcbidcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZzaFN0cmluZyArPSAnICAgZmxvYXQgdCA9IHZ0O1xcbidcbiAgICAgICAgfVxuXG4gICAgICAgIC8vY2hvb3NlIGluaXRpYWwgYW5kIGZpbmFsIGNvbG9ycywgYW5kIGFkanVzdCB0IHZhbHVlXG4gICAgICAgIGlmIChjb2xvcnMubGVuZ3RoID09IDEpIGZzaFN0cmluZyArPSAnICAgdmVjNCBjST1jMDtcXG4gICB2ZWM0IGNGPWMwO1xcbidcbiAgICAgICAgZWxzZSBpZiAoY29sb3JzLmxlbmd0aCA9PSAyKSBmc2hTdHJpbmcgKz0gJyAgIHZlYzQgY0k9YzA7XFxuICAgdmVjNCBjRj1jMTtcXG4nXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgbmIgPSBjb2xvcnMubGVuZ3RoIC0gMVxuICAgICAgICAgICAgY29uc3QgbmJzID0gbmIgKyAnLjAnXG4gICAgICAgICAgICBmc2hTdHJpbmcgKz0gJyAgIHZlYzQgY0k7XFxuJ1xuICAgICAgICAgICAgZnNoU3RyaW5nICs9ICcgICB2ZWM0IGNGO1xcbidcbiAgICAgICAgICAgIGZzaFN0cmluZyArPSAnICAgaWYodDwxLjAvJyArIG5icyArICcpIHsgY0k9YzA7IGNGPWMxOyB0PXQqJyArIG5icyArICc7IH1cXG4nXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMjsgaSA8IG5iOyBpKyspXG4gICAgICAgICAgICAgICAgZnNoU3RyaW5nICs9XG4gICAgICAgICAgICAgICAgICAgICcgICBlbHNlIGlmKHQ8JyArXG4gICAgICAgICAgICAgICAgICAgIGkgK1xuICAgICAgICAgICAgICAgICAgICAnLjAvJyArXG4gICAgICAgICAgICAgICAgICAgIG5icyArXG4gICAgICAgICAgICAgICAgICAgICcpIHsgY0k9YycgK1xuICAgICAgICAgICAgICAgICAgICAoaSAtIDEpICtcbiAgICAgICAgICAgICAgICAgICAgJzsgY0Y9YycgK1xuICAgICAgICAgICAgICAgICAgICBpICtcbiAgICAgICAgICAgICAgICAgICAgJzsgdD0nICtcbiAgICAgICAgICAgICAgICAgICAgbmJzICtcbiAgICAgICAgICAgICAgICAgICAgJyp0LScgK1xuICAgICAgICAgICAgICAgICAgICAoaSAtIDEpICtcbiAgICAgICAgICAgICAgICAgICAgJy4wOyB9XFxuJ1xuICAgICAgICAgICAgZnNoU3RyaW5nICs9XG4gICAgICAgICAgICAgICAgJyAgIGVsc2UgeyBjST1jJyArIChuYiAtIDEpICsgJzsgY0Y9YycgKyBuYiArICc7IHQ9JyArIG5icyArICcqdC0nICsgKG5iIC0gMSkgKyAnLjA7IH1cXG4nXG4gICAgICAgIH1cblxuICAgICAgICAvL29uZSBzaW5nbGUgY29sb3JcbiAgICAgICAgaWYgKGNvbG9ycy5sZW5ndGggPT0gMSkgZnNoU3RyaW5nICs9ICcgICBnbF9GcmFnQ29sb3IgPSB2ZWM0KGMwWzBdLCBjMFsxXSwgYzBbMl0sIGMwWzNdKTt9XFxuJ1xuICAgICAgICAvL3NldCBpbnRlcnBvbGF0ZWQgY29sb3IsIGJldHdlZW4gaW5pdGlhbCBhbmQgZmluYWwgb25lXG4gICAgICAgIGVsc2UgZnNoU3RyaW5nICs9ICcgICBnbF9GcmFnQ29sb3IgPSBtaXgoY0ksIGNGLCB0KTt9XFxuJ1xuXG4gICAgICAgIC8vY29uc29sZS5sb2coZnNoU3RyaW5nKVxuXG4gICAgICAgIC8qKiBAdHlwZSB7V2ViR0xTaGFkZXJ9ICovXG4gICAgICAgIGNvbnN0IGZTaGFkZXIgPSBjcmVhdGVTaGFkZXIoZ2wsIGdsLkZSQUdNRU5UX1NIQURFUiwgZnNoU3RyaW5nKVxuXG4gICAgICAgIC8qKiBAdHlwZSB7V2ViR0xQcm9ncmFtfSAqL1xuICAgICAgICB0aGlzLnByb2dyYW0gPSBpbml0U2hhZGVyUHJvZ3JhbShnbCwgdlNoYWRlciwgZlNoYWRlcilcbiAgICAgICAgZ2wudXNlUHJvZ3JhbSh0aGlzLnByb2dyYW0pXG5cbiAgICAgICAgLy9zZXQgdW5pZm9ybXNcblxuICAgICAgICAvL3NpemVQaXhcbiAgICAgICAgLy9UT0RPOiBidWcgaGVyZS4gU2VlbXMgdG8gYmUgbGltaXRlZCB0byBzb21lIHRocmVzaG9sZCB2YWx1ZSAoYXJvdW5kIDI1MCkuXG4gICAgICAgIGdsLnVuaWZvcm0xZihnbC5nZXRVbmlmb3JtTG9jYXRpb24odGhpcy5wcm9ncmFtLCAnc2l6ZVBpeCcpLCAxLjAgKiBzaXplUGl4KVxuXG4gICAgICAgIC8vc3RyZXRjaGluZyBhbHBoYSBmYWN0b3JcbiAgICAgICAgZ2wudW5pZm9ybTFmKGdsLmdldFVuaWZvcm1Mb2NhdGlvbih0aGlzLnByb2dyYW0sICdhbHBoYScpLCBzdHJldGNoaW5nID8gMS4wICogc3RyZXRjaGluZy5hbHBoYSA6IDAuMClcblxuICAgICAgICAvL2NvbG9yc1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbG9ycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgYyA9IGNvbG9yKGNvbG9yc1tpXSlcblxuICAgICAgICAgICAgbGV0IG9wYWNpdHkgPSBjLm9wYWNpdHlcbiAgICAgICAgICAgIGlmIChjLm9wYWNpdHkgPT0gMSAmJiBnbG9iYWxPcGFjaXR5ICE9IHVuZGVmaW5lZCkgb3BhY2l0eSA9IGdsb2JhbE9wYWNpdHlcblxuICAgICAgICAgICAgZ2wudW5pZm9ybTRmdihnbC5nZXRVbmlmb3JtTG9jYXRpb24odGhpcy5wcm9ncmFtLCAnYycgKyBpKSwgW1xuICAgICAgICAgICAgICAgICtjLnIgLyAyNTUuMCxcbiAgICAgICAgICAgICAgICArYy5nIC8gMjU1LjAsXG4gICAgICAgICAgICAgICAgK2MuYiAvIDI1NS4wLFxuICAgICAgICAgICAgICAgICtvcGFjaXR5LFxuICAgICAgICAgICAgXSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiAgKi9cbiAgICBkcmF3KHZlcnRpY2VzQnVmZmVyLCB0QnVmZmVyLCB0cmFuc2ZvTWF0KSB7XG4gICAgICAgIGNvbnN0IGdsID0gdGhpcy5nbFxuICAgICAgICBjb25zdCBwcm9ncmFtID0gdGhpcy5wcm9ncmFtXG5cbiAgICAgICAgLy92ZXJ0aWNlIGRhdGFcbiAgICAgICAgZ2wuYmluZEJ1ZmZlcihnbC5BUlJBWV9CVUZGRVIsIGdsLmNyZWF0ZUJ1ZmZlcigpKVxuICAgICAgICBnbC5idWZmZXJEYXRhKGdsLkFSUkFZX0JVRkZFUiwgbmV3IEZsb2F0MzJBcnJheSh2ZXJ0aWNlc0J1ZmZlciksIGdsLlNUQVRJQ19EUkFXKVxuICAgICAgICBjb25zdCBwb3NpdGlvbiA9IGdsLmdldEF0dHJpYkxvY2F0aW9uKHByb2dyYW0sICdwb3MnKVxuICAgICAgICBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKFxuICAgICAgICAgICAgcG9zaXRpb24sXG4gICAgICAgICAgICAyLCAvL251bUNvbXBvbmVudHNcbiAgICAgICAgICAgIGdsLkZMT0FULCAvL3R5cGVcbiAgICAgICAgICAgIGZhbHNlLCAvL25vcm1hbGlzZVxuICAgICAgICAgICAgMCwgLy9zdHJpZGVcbiAgICAgICAgICAgIDAgLy9vZmZzZXRcbiAgICAgICAgKVxuICAgICAgICBnbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShwb3NpdGlvbilcblxuICAgICAgICAvL3QgZGF0YVxuICAgICAgICBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgZ2wuY3JlYXRlQnVmZmVyKCkpXG4gICAgICAgIGdsLmJ1ZmZlckRhdGEoZ2wuQVJSQVlfQlVGRkVSLCBuZXcgRmxvYXQzMkFycmF5KHRCdWZmZXIpLCBnbC5TVEFUSUNfRFJBVylcbiAgICAgICAgY29uc3QgdCA9IGdsLmdldEF0dHJpYkxvY2F0aW9uKHByb2dyYW0sICd0JylcbiAgICAgICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcih0LCAxLCBnbC5GTE9BVCwgZmFsc2UsIDAsIDApXG4gICAgICAgIGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KHQpXG5cbiAgICAgICAgLy90cmFuc2Zvcm1hdGlvblxuICAgICAgICBnbC51bmlmb3JtTWF0cml4M2Z2KGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAnbWF0JyksIGZhbHNlLCBuZXcgRmxvYXQzMkFycmF5KHRyYW5zZm9NYXQpKVxuXG4gICAgICAgIC8vIEVuYWJsZSB0aGUgZGVwdGggdGVzdFxuICAgICAgICAvL2dsLmVuYWJsZShnbC5ERVBUSF9URVNUKTtcbiAgICAgICAgLy8gQ2xlYXIgdGhlIGNvbG9yIGJ1ZmZlciBiaXRcbiAgICAgICAgZ2wuY2xlYXIoZ2wuQ09MT1JfQlVGRkVSX0JJVClcbiAgICAgICAgLy8gU2V0IHRoZSB2aWV3IHBvcnRcbiAgICAgICAgLy9nbC52aWV3cG9ydCgwLCAwLCBjZy53LCBjZy5oKTtcblxuICAgICAgICBnbC5kcmF3QXJyYXlzKGdsLlBPSU5UUywgMCwgdmVydGljZXNCdWZmZXIubGVuZ3RoIC8gMilcbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IGluaXRTaGFkZXJQcm9ncmFtLCBjcmVhdGVTaGFkZXIgfSBmcm9tICcuL3dlYkdMVXRpbHMuanMnXG5pbXBvcnQgeyBjb2xvciB9IGZyb20gJ2QzLWNvbG9yJ1xuXG4vKipcbiAqIEV2ZXJ5dGhpbmcgdG8gZWFzaWx5IGRyYXcgY29sb3JlZCBzcXVhcmVzIHdpdGggd2ViR0wuXG4gKiBBbGwgdGhlIHNhbWUgc2l6ZSwgYnV0IGRpZmZlcmVudCBmaWxsIGNvbG9yLlxuICogQ29sb3IgYmFzZWQgb24gY2F0ZWdvcmllcy5cbiAqL1xuZXhwb3J0IGNsYXNzIFdlYkdMU3F1YXJlQ29sb3JpbmdDYXRBZHZhbmNlZCB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtBcnJheS48c3RyaW5nPn0gY29sb3JzXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoY29sb3JzKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAdHlwZSB7QXJyYXkuPHN0cmluZz59ICovXG4gICAgICAgIHRoaXMuY29sb3JzID0gY29sb3JzXG5cbiAgICAgICAgLyoqIFZlY3RvciBzaGFkZXIgcHJvZ3JhbVxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLnZzaFN0cmluZyA9IGBcbiAgICAgICAgYXR0cmlidXRlIHZlYzIgcG9zO1xuICAgICAgICB1bmlmb3JtIGZsb2F0IHNpemVQaXg7XG4gICAgICAgIHVuaWZvcm0gbWF0MyBtYXQ7XG5cbiAgICAgICAgYXR0cmlidXRlIGZsb2F0IGk7XG4gICAgICAgIHZhcnlpbmcgZmxvYXQgdmk7XG5cbiAgICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAgIGdsX1Bvc2l0aW9uID0gdmVjNChtYXQgKiB2ZWMzKHBvcywgMS4wKSwgMS4wKTtcbiAgICAgICAgICBnbF9Qb2ludFNpemUgPSBzaXplUGl4O1xuICAgICAgICAgIHZpID0gaTtcbiAgICAgICAgfVxuICAgICAgICBgXG5cbiAgICAgICAgLy9wcmVwYXJlIGZyYWdtZW50IHNoYWRlciBjb2RlXG4gICAgICAgIC8vZGVjbGFyZSB0aGUgdW5pZm9ybSBhbmQgb3RoZXIgdmFyaWFibGVzXG4gICAgICAgIGNvbnN0IG91dCA9IFtdXG4gICAgICAgIG91dC5wdXNoKCdwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcXG52YXJ5aW5nIGZsb2F0IHZpO1xcbicpXG4gICAgICAgIC8vYWRkIGNvbG9yIHVuaWZvcm1zXG4gICAgICAgIG91dC5wdXNoKCd1bmlmb3JtIHZlYzQnKVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbG9ycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGkgPiAwKSBvdXQucHVzaCgnLCcpXG4gICAgICAgICAgICBvdXQucHVzaCgnIGMnICsgaSlcbiAgICAgICAgfVxuICAgICAgICBvdXQucHVzaCgnO1xcbicpXG4gICAgICAgIC8vc3RhcnQgdGhlIG1haW4gZnVuY3Rpb25cbiAgICAgICAgb3V0LnB1c2goJ3ZvaWQgbWFpbih2b2lkKSB7XFxuJylcbiAgICAgICAgLy9jaG9vc2UgY29sb3IgaVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbG9ycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGkgPiAwKSBvdXQucHVzaCgnZWxzZSAnKVxuICAgICAgICAgICAgb3V0LnB1c2goJ2lmKHZpPT0nKVxuICAgICAgICAgICAgb3V0LnB1c2goaSlcbiAgICAgICAgICAgIG91dC5wdXNoKCcuMCkgZ2xfRnJhZ0NvbG9yID0gdmVjNChjJylcbiAgICAgICAgICAgIG91dC5wdXNoKGkpXG4gICAgICAgICAgICBvdXQucHVzaCgnWzBdLCBjJylcbiAgICAgICAgICAgIG91dC5wdXNoKGkpXG4gICAgICAgICAgICBvdXQucHVzaCgnWzFdLCBjJylcbiAgICAgICAgICAgIG91dC5wdXNoKGkpXG4gICAgICAgICAgICBvdXQucHVzaCgnWzJdLCBjJylcbiAgICAgICAgICAgIG91dC5wdXNoKGkpXG4gICAgICAgICAgICBvdXQucHVzaCgnWzNdKTtcXG4nKVxuICAgICAgICB9XG4gICAgICAgIG91dC5wdXNoKCdlbHNlIGdsX0ZyYWdDb2xvciA9IHZlYzQoMC4wLCAwLjAsIDAuMCwgMS4wKTtcXG59JylcbiAgICAgICAgLyoqIEZyYWdtZW50IHNoYWRlciBwcm9ncmFtXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuZnNoU3RyaW5nID0gb3V0LmpvaW4oJycpXG4gICAgfVxuXG4gICAgLyoqICAqL1xuICAgIGRyYXcoZ2wsIHZlcnRpY2VzQnVmZmVyLCBpQnVmZmVyLCB0cmFuc2ZvTWF0LCBzaXplUGl4ID0gMTApIHtcbiAgICAgICAgLyoqIEB0eXBlIHtXZWJHTFNoYWRlcn0gKi9cbiAgICAgICAgY29uc3QgdlNoYWRlciA9IGNyZWF0ZVNoYWRlcihnbCwgZ2wuVkVSVEVYX1NIQURFUiwgdGhpcy52c2hTdHJpbmcpXG5cbiAgICAgICAgLyoqIEB0eXBlIHtXZWJHTFNoYWRlcn0gKi9cbiAgICAgICAgY29uc3QgZlNoYWRlciA9IGNyZWF0ZVNoYWRlcihnbCwgZ2wuRlJBR01FTlRfU0hBREVSLCB0aGlzLmZzaFN0cmluZylcblxuICAgICAgICAvKiogQHR5cGUge1dlYkdMUHJvZ3JhbX0gKi9cbiAgICAgICAgY29uc3QgcHJvZ3JhbSA9IGluaXRTaGFkZXJQcm9ncmFtKGdsLCB2U2hhZGVyLCBmU2hhZGVyKVxuICAgICAgICBnbC51c2VQcm9ncmFtKHByb2dyYW0pXG5cbiAgICAgICAgLy9zZXQgdW5pZm9ybXNcblxuICAgICAgICAvL3NpemVQaXhcbiAgICAgICAgZ2wudW5pZm9ybTFmKGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAnc2l6ZVBpeCcpLCAxLjAgKiBzaXplUGl4KVxuXG4gICAgICAgIC8vY29sb3JzXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jb2xvcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGMgPSBjb2xvcih0aGlzLmNvbG9yc1tpXSlcbiAgICAgICAgICAgIGdsLnVuaWZvcm00ZnYoZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICdjJyArIGkpLCBbXG4gICAgICAgICAgICAgICAgK2MuciAvIDI1NS4wLFxuICAgICAgICAgICAgICAgICtjLmcgLyAyNTUuMCxcbiAgICAgICAgICAgICAgICArYy5iIC8gMjU1LjAsXG4gICAgICAgICAgICAgICAgK2Mub3BhY2l0eSxcbiAgICAgICAgICAgIF0pXG4gICAgICAgIH1cblxuICAgICAgICAvL3ZlcnRpY2UgZGF0YVxuICAgICAgICBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgZ2wuY3JlYXRlQnVmZmVyKCkpXG4gICAgICAgIGdsLmJ1ZmZlckRhdGEoZ2wuQVJSQVlfQlVGRkVSLCBuZXcgRmxvYXQzMkFycmF5KHZlcnRpY2VzQnVmZmVyKSwgZ2wuU1RBVElDX0RSQVcpXG4gICAgICAgIGNvbnN0IHBvc2l0aW9uID0gZ2wuZ2V0QXR0cmliTG9jYXRpb24ocHJvZ3JhbSwgJ3BvcycpXG4gICAgICAgIGdsLnZlcnRleEF0dHJpYlBvaW50ZXIoXG4gICAgICAgICAgICBwb3NpdGlvbixcbiAgICAgICAgICAgIDIsIC8vbnVtQ29tcG9uZW50c1xuICAgICAgICAgICAgZ2wuRkxPQVQsIC8vdHlwZVxuICAgICAgICAgICAgZmFsc2UsIC8vbm9ybWFsaXNlXG4gICAgICAgICAgICAwLCAvL3N0cmlkZVxuICAgICAgICAgICAgMCAvL29mZnNldFxuICAgICAgICApXG4gICAgICAgIGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KHBvc2l0aW9uKVxuXG4gICAgICAgIC8vaSBkYXRhXG4gICAgICAgIGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCBnbC5jcmVhdGVCdWZmZXIoKSlcbiAgICAgICAgZ2wuYnVmZmVyRGF0YShnbC5BUlJBWV9CVUZGRVIsIG5ldyBGbG9hdDMyQXJyYXkoaUJ1ZmZlciksIGdsLlNUQVRJQ19EUkFXKVxuICAgICAgICBjb25zdCBpID0gZ2wuZ2V0QXR0cmliTG9jYXRpb24ocHJvZ3JhbSwgJ2knKVxuICAgICAgICBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKGksIDEsIGdsLkZMT0FULCBmYWxzZSwgMCwgMClcbiAgICAgICAgZ2wuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoaSlcblxuICAgICAgICAvL3RyYW5zZm9ybWF0aW9uXG4gICAgICAgIGdsLnVuaWZvcm1NYXRyaXgzZnYoZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICdtYXQnKSwgZmFsc2UsIG5ldyBGbG9hdDMyQXJyYXkodHJhbnNmb01hdCkpXG5cbiAgICAgICAgLy8gRW5hYmxlIHRoZSBkZXB0aCB0ZXN0XG4gICAgICAgIC8vZ2wuZW5hYmxlKGdsLkRFUFRIX1RFU1QpO1xuICAgICAgICAvLyBDbGVhciB0aGUgY29sb3IgYnVmZmVyIGJpdFxuICAgICAgICBnbC5jbGVhcihnbC5DT0xPUl9CVUZGRVJfQklUKVxuICAgICAgICAvLyBTZXQgdGhlIHZpZXcgcG9ydFxuICAgICAgICAvL2dsLnZpZXdwb3J0KDAsIDAsIGNnLncsIGNnLmgpO1xuXG4gICAgICAgIGdsLmRyYXdBcnJheXMoZ2wuUE9JTlRTLCAwLCB2ZXJ0aWNlc0J1ZmZlci5sZW5ndGggLyAyKVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgZXh0ZW50LCBtYXggfSBmcm9tICdkMy1hcnJheSdcbmltcG9ydCB7IHNjYWxlUXVhbnRpbGUgfSBmcm9tICdkMy1zY2FsZSdcblxuLyoqXG4gKiBBIHNjYWxlIGlzIHNpbXBseSBhIGZ1bmN0aW9uIHRoYXQgbWFwIGEgZG9tYWluIHRvIGEgcmFuZ2UuXG4gKiBAdHlwZWRlZiB7ZnVuY3Rpb24obnVtYmVyKTpudW1iZXJ9IFNjYWxlICovXG5cbi8qKlxuICogQSBzY2FsZSB3aG9zZSByYW5nZSBpcyBhIGNvbG9yIChzdHJpbmcpLlxuICogQHR5cGVkZWYge2Z1bmN0aW9uKG51bWJlcik6c3RyaW5nfSBDb2xvclNjYWxlICovXG5cbi8qKlxuICogQG1vZHVsZSB1dGlsc1xuICovXG5cbi8qKlxuICogR2VuZXJpYyBmdW5jdGlvbiBmb3IgdmlldyBzY2FsZSAtIGNvbnRpbnVvdXMgb3IgZGlzY3JldGVcbiAqXG4gKiBAcGFyYW0ge3sgdmFsdWVGdW5jdGlvbjpmdW5jdGlvbihpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXRcIikuQ2VsbCk6bnVtYmVyLCBtaW5WYWx1ZT86bnVtYmVyLCBtaW5TaXplUGl4PzpudW1iZXIsIG1heFNpemVGYWN0b3I/Om51bWJlciwgcmFuZ2U/OltudW1iZXIsIG51bWJlcl0sIGRvbWFpbj86W251bWJlciwgbnVtYmVyXSwgc3RyZXRjaGluZz86ZnVuY3Rpb24obnVtYmVyKTpudW1iZXIsIGNsYXNzTnVtYmVyPzpudW1iZXJ9fSBvcHRzXG4gKiBAcmV0dXJucyB7ZnVuY3Rpb24oQXJyYXkuPGltcG9ydChcIi4uL2NvcmUvRGF0YXNldFwiKS5DZWxsPik6U2NhbGV9XG4gKi9cbmV4cG9ydCBjb25zdCB2aWV3U2NhbGUgPSAob3B0cykgPT4ge1xuICAgIGNvbnN0IHZhbHVlRnVuY3Rpb24gPSBvcHRzLnZhbHVlRnVuY3Rpb25cbiAgICBjb25zdCBtaW5WYWx1ZSA9IG9wdHMubWluVmFsdWUgfHwgMFxuICAgIGNvbnN0IG1pblNpemVQaXggPSBvcHRzLm1pblNpemVQaXggfHwgMFxuICAgIGNvbnN0IG1heFNpemVGYWN0b3IgPSBvcHRzLm1heFNpemVGYWN0b3IgfHwgMVxuICAgIGNvbnN0IHN0cmV0Y2hpbmcgPSBvcHRzLnN0cmV0Y2hpbmdcbiAgICBjb25zdCByYW5nZV8gPSBvcHRzLnJhbmdlXG4gICAgY29uc3QgZG9tYWluXyA9IG9wdHMuZG9tYWluXG4gICAgY29uc3QgY2xhc3NOdW1iZXIgPSBvcHRzLmNsYXNzTnVtYmVyXG4gICAgcmV0dXJuIChjZWxscywgcmVzb2x1dGlvbiwgeikgPT4ge1xuICAgICAgICBjb25zdCBkb21haW4gPSBkb21haW5fIHx8IFttaW5WYWx1ZSwgbWF4KGNlbGxzLCB2YWx1ZUZ1bmN0aW9uKV1cbiAgICAgICAgY29uc3QgcmFuZ2UgPSByYW5nZV8gfHwgW21pblNpemVQaXggKiB6LCByZXNvbHV0aW9uICogbWF4U2l6ZUZhY3Rvcl1cbiAgICAgICAgY29uc3QgZG9tYWluU2l6ZSA9IGRvbWFpblsxXSAtIGRvbWFpblswXSxcbiAgICAgICAgICAgIGRvbWFpbk1pbiA9IGRvbWFpblswXVxuICAgICAgICBjb25zdCByYW5nZVNpemUgPSByYW5nZVsxXSAtIHJhbmdlWzBdLFxuICAgICAgICAgICAgcmFuZ2VNaW4gPSByYW5nZVswXVxuICAgICAgICByZXR1cm4gKHQpID0+IHtcbiAgICAgICAgICAgIC8vc2NhbGUgdG8gWzAsMV1cbiAgICAgICAgICAgIHQgPSAodCAtIGRvbWFpbk1pbikgLyBkb21haW5TaXplXG4gICAgICAgICAgICAvL3N0cmV0Y2hcbiAgICAgICAgICAgIGlmIChzdHJldGNoaW5nKSB0ID0gc3RyZXRjaGluZyh0KVxuICAgICAgICAgICAgLy9jbGFzc2lmeVxuICAgICAgICAgICAgaWYgKGNsYXNzTnVtYmVyKSB0ID0gdCA9PSAxID8gMSA6IE1hdGguZmxvb3IodCAqIGNsYXNzTnVtYmVyKSAvIChjbGFzc051bWJlciAtIDEpXG4gICAgICAgICAgICAvL3NjYWxlIHRvIHJhbmdlXG4gICAgICAgICAgICByZXR1cm4gcmFuZ2VNaW4gKyB0ICogcmFuZ2VTaXplXG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuICogR2VuZXJpYyBmdW5jdGlvbiBmb3IgdmlldyBzY2FsZSAtIHF1YW50aWxlXG4gKlxuICogQHBhcmFtIHt7IHZhbHVlRnVuY3Rpb246ZnVuY3Rpb24oaW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0XCIpLkNlbGwpOm51bWJlciwgY2xhc3NOdW1iZXI/Om51bWJlciwgbWluU2l6ZVBpeD86bnVtYmVyLCBtYXhTaXplRmFjdG9yPzpudW1iZXIgfX0gb3B0c1xuICogQHJldHVybnMge2Z1bmN0aW9uKEFycmF5LjxpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXRcIikuQ2VsbD4pOlNjYWxlfVxuICovXG5leHBvcnQgY29uc3Qgdmlld1NjYWxlUXVhbnRpbGUgPSAob3B0cykgPT4ge1xuICAgIGNvbnN0IHZhbHVlRnVuY3Rpb24gPSBvcHRzLnZhbHVlRnVuY3Rpb25cbiAgICBjb25zdCBjbGFzc051bWJlciA9IG9wdHMuY2xhc3NOdW1iZXIgfHwgMTJcbiAgICBjb25zdCBtaW5TaXplUGl4ID0gb3B0cy5taW5TaXplUGl4IHx8IDFcbiAgICBjb25zdCBtYXhTaXplRmFjdG9yID0gb3B0cy5tYXhTaXplRmFjdG9yIHx8IDFcbiAgICBjb25zdCBzY2FsZSA9IHNjYWxlUXVhbnRpbGUoKVxuICAgIHJldHVybiAoY2VsbHMsIHJlc29sdXRpb24sIHopID0+IHtcbiAgICAgICAgc2NhbGUuZG9tYWluKGNlbGxzLm1hcCh2YWx1ZUZ1bmN0aW9uKSlcbiAgICAgICAgY29uc3QgbWluU2l6ZUdlbyA9IG1pblNpemVQaXggKiB6LFxuICAgICAgICAgICAgbWF4U2l6ZUdlbyA9IHJlc29sdXRpb24gKiBtYXhTaXplRmFjdG9yXG4gICAgICAgIHNjYWxlLnJhbmdlKFxuICAgICAgICAgICAgQXJyYXkuZnJvbShcbiAgICAgICAgICAgICAgICB7IGxlbmd0aDogY2xhc3NOdW1iZXIgfSxcbiAgICAgICAgICAgICAgICAoXywgaSkgPT4gbWluU2l6ZUdlbyArIChpICogKG1heFNpemVHZW8gLSBtaW5TaXplR2VvKSkgLyAoY2xhc3NOdW1iZXIgLSAxKVxuICAgICAgICAgICAgKVxuICAgICAgICApXG4gICAgICAgIHNjYWxlLmJyZWFrcyA9IHNjYWxlLnF1YW50aWxlcygpXG4gICAgICAgIHNjYWxlLnZhbHVlcyA9IHNjYWxlLnJhbmdlKClcbiAgICAgICAgcmV0dXJuIHNjYWxlXG4gICAgfVxufVxuXG4vKipcbiAqIEdlbmVyaWMgZnVuY3Rpb24gZm9yIGNvbG9yIHZpZXcgc2NhbGUgLSBjb250aW51b3VzIG9yIGRpc2NyZXRlXG4gKlxuICogQHBhcmFtIHt7IHZhbHVlRnVuY3Rpb246ZnVuY3Rpb24oaW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0XCIpLkNlbGwpOm51bWJlciwgY29sb3JTY2FsZT86ZnVuY3Rpb24obnVtYmVyKTpzdHJpbmcsIGNvbG9ycz86QXJyYXkuPHN0cmluZz4sIHN0cmV0Y2hpbmc/OmZ1bmN0aW9uKG51bWJlcik6bnVtYmVyIH19IG9wdHNcbiAqIEByZXR1cm5zIHtmdW5jdGlvbihBcnJheS48aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0XCIpLkNlbGw+KTpDb2xvclNjYWxlfVxuICovXG5leHBvcnQgY29uc3Qgdmlld1NjYWxlQ29sb3IgPSAob3B0cykgPT4ge1xuICAgIGNvbnN0IHZhbHVlRnVuY3Rpb24gPSBvcHRzLnZhbHVlRnVuY3Rpb25cbiAgICBjb25zdCBzdHJldGNoaW5nID0gb3B0cy5zdHJldGNoaW5nXG4gICAgbGV0IGNvbG9yU2NhbGUgPSBvcHRzLmNvbG9yU2NhbGUgfHwgKCgpID0+ICdwdXJwbGUnKVxuXG4gICAgLy9kaXNjcmV0ZSBjb2xvcnMgY2FzZTogYnVpbGQgY29udGludW91cyBjb2xvciBzY2FsZSBmcm9tIGRpc2NyZXRlIG9uZXMuXG4gICAgY29uc3QgbmJDbGFzcyA9IG9wdHMuY29sb3JzPy5sZW5ndGhcbiAgICBpZiAob3B0cy5jb2xvcnMgJiYgbmJDbGFzcylcbiAgICAgICAgY29sb3JTY2FsZSA9ICh0KSA9PiBvcHRzLmNvbG9yc1t0ID09IDEgPyBuYkNsYXNzIC0gMSA6IE1hdGguZmxvb3IodCAqIG5iQ2xhc3MpXVxuXG4gICAgcmV0dXJuIChjZWxscykgPT4ge1xuICAgICAgICBpZiAoY2VsbHMubGVuZ3RoID09IDAgfHwgIWNlbGxzKSByZXR1cm5cbiAgICAgICAgLyoqIEB0eXBlIHtbdW5kZWZpbmVkLCB1bmRlZmluZWRdIHwgW251bWJlciwgbnVtYmVyXX0gKi9cbiAgICAgICAgY29uc3QgZG9tYWluID0gZXh0ZW50KGNlbGxzLCB2YWx1ZUZ1bmN0aW9uKVxuICAgICAgICBpZiAoZG9tYWluWzBdID09IHVuZGVmaW5lZCkgcmV0dXJuXG4gICAgICAgIGNvbnN0IGRvbWFpblNpemUgPSBkb21haW5bMV0gLSBkb21haW5bMF1cbiAgICAgICAgY29uc3Qgc2NhbGUgPSAodCkgPT4ge1xuICAgICAgICAgICAgLy9zY2FsZSB0byBbMCwxXVxuICAgICAgICAgICAgdCA9ICh0IC0gZG9tYWluWzBdKSAvIGRvbWFpblNpemVcbiAgICAgICAgICAgIC8vc3RyZXRjaFxuICAgICAgICAgICAgaWYgKHN0cmV0Y2hpbmcpIHQgPSBzdHJldGNoaW5nKHQpXG4gICAgICAgICAgICByZXR1cm4gY29sb3JTY2FsZSh0KVxuICAgICAgICB9XG4gICAgICAgIC8vZnVuY3Rpb24gdGhhdCByZXR1cm4gdGhlIGRvbWFpbiB2YWx1ZSBmcm9tIHRoZSBbMCwxXSByYW5nZS5cbiAgICAgICAgc2NhbGUuaW52ZXJ0ID0gKHQpID0+IHtcbiAgICAgICAgICAgIGlmIChzdHJldGNoaW5nKSB0ID0gc3RyZXRjaGluZy5pbnZlcnQodClcbiAgICAgICAgICAgIHJldHVybiBkb21haW5bMF0gKyB0ICogZG9tYWluU2l6ZVxuICAgICAgICB9XG4gICAgICAgIC8vZGlzY3JldGUgY29sb3JzOiByZXR1cm4gdGhlIGJyZWFrc1xuICAgICAgICBpZiAob3B0cy5jb2xvcnMgJiYgbmJDbGFzcykge1xuICAgICAgICAgICAgc2NhbGUuYnJlYWtzID0gW11cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgbmJDbGFzczsgaSsrKSBzY2FsZS5icmVha3MucHVzaChzY2FsZS5pbnZlcnQoaSAvIG5iQ2xhc3MpKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHNjYWxlXG4gICAgfVxufVxuXG4vKipcbiAqIEdlbmVyaWMgZnVuY3Rpb24gZm9yIGNvbG9yIHZpZXcgc2NhbGUgLSBxdWFudGlsZVxuICpcbiAqIEBwYXJhbSB7eyB2YWx1ZUZ1bmN0aW9uOmZ1bmN0aW9uKGltcG9ydChcIi4uL2NvcmUvRGF0YXNldFwiKS5DZWxsKTpudW1iZXIsIGNsYXNzTnVtYmVyPzpudW1iZXIsIGNvbG9ycz86QXJyYXkuPHN0cmluZz4sIGNvbG9yU2NhbGU/OmZ1bmN0aW9uKG51bWJlcik6c3RyaW5nIH19IG9wdHNcbiAqIEByZXR1cm5zIHtmdW5jdGlvbihBcnJheS48aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0XCIpLkNlbGw+KTpDb2xvclNjYWxlfVxuICovXG5leHBvcnQgY29uc3Qgdmlld1NjYWxlQ29sb3JRdWFudGlsZSA9IChvcHRzKSA9PiB7XG4gICAgY29uc3QgdmFsdWVGdW5jdGlvbiA9IG9wdHMudmFsdWVGdW5jdGlvblxuICAgIGNvbnN0IGNsYXNzTnVtYmVyID0gb3B0cy5jbGFzc051bWJlciB8fCAxMlxuXG4gICAgbGV0IGNvbG9ycyA9IG9wdHMuY29sb3JzXG4gICAgaWYgKG9wdHMuY29sb3JTY2FsZSkgY29sb3JzID0gZGlzY3JldGVDb2xvcnMob3B0cy5jb2xvclNjYWxlLCBjbGFzc051bWJlcilcbiAgICBjb2xvcnMgPVxuICAgICAgICBjb2xvcnMgfHxcbiAgICAgICAgQXJyYXkuZnJvbShcbiAgICAgICAgICAgIHsgbGVuZ3RoOiBjbGFzc051bWJlciB9LFxuICAgICAgICAgICAgKF8sIGkpID0+ICdyZ2IoJyArIE1hdGguZmxvb3IoKDI1NSAqIGkpIC8gKGNsYXNzTnVtYmVyIC0gMSkpICsgJywxNTAsMTUwKSdcbiAgICAgICAgKVxuXG4gICAgY29uc3Qgc2NhbGUgPSBzY2FsZVF1YW50aWxlKCkucmFuZ2UoY29sb3JzKVxuICAgIHJldHVybiAoY2VsbHMpID0+IHtcbiAgICAgICAgc2NhbGUuZG9tYWluKGNlbGxzLm1hcCh2YWx1ZUZ1bmN0aW9uKSlcbiAgICAgICAgc2NhbGUuYnJlYWtzID0gc2NhbGUucXVhbnRpbGVzKClcbiAgICAgICAgc2NhbGUuY29sb3JzID0gY29sb3JzXG4gICAgICAgIHJldHVybiBzY2FsZVxuICAgIH1cbn1cblxuLyoqXG4gKiBDb21iaW5lIHZpZXcgc2NhbGUgZnVuY3Rpb25zXG4gKlxuICogQHBhcmFtIHsqfSBvYmpcbiAqIEByZXR1cm5zIHtmdW5jdGlvbn1cbiAqL1xuZXhwb3J0IGNvbnN0IHZpZXdTY2FsZUNvbWJpbmF0aW9uID0gKG9iaikgPT4ge1xuICAgIC8vb2JqOiBwcm9wIGFuZCBhIGZ1bmN0aW9uIHRvIGNhbGxcbiAgICByZXR1cm4gKGNlbGxzLCByZXNvbHV0aW9uLCB6KSA9PiB7XG4gICAgICAgIGNvbnN0IG91dCA9IHt9XG4gICAgICAgIGZvciAoY29uc3QgcCBpbiBvYmopIHtcbiAgICAgICAgICAgIG91dFtwXSA9IG9ialtwXShjZWxscywgcmVzb2x1dGlvbiwgeilcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3V0XG4gICAgfVxufVxuXG5cbi8qKlxuICogUmV0dXJuIGEgY2xhc3NpZmllciBmdW5jdGlvbiBmcm9tIGJyZWFrIHZhbHVlcy5cbiAqIFRoZSBjbGFzc2lmaWVyIGZ1bmN0aW9uIHJldHVybnMgdGhlIGNsYXNzIGlkIChmcm9tIDAgdG8gYnJlYWtzLmxlbmd0aCkgZnJvbSBhIHZhbHVlIHRvIGNsYXNzaWZpeS5cbiAqIEBwYXJhbSB7QXJyYXkuPG51bWJlcj59IGJyZWFrcyB0aGUgYnJlYWtzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGFzc2lmaWVyKGJyZWFrcykge1xuICAgIGNvbnN0IGJsID0gYnJlYWtzLmxlbmd0aFxuICAgIGNvbnN0IGNsYXNzaWZpZXIgPSAodmFsdWUpID0+IHtcbiAgICAgICAgbGV0IGkgPSAwXG4gICAgICAgIHdoaWxlIChpIDwgYmwpIHtcbiAgICAgICAgICAgIGNvbnN0IGJyZWFrXyA9IGJyZWFrc1tpXVxuICAgICAgICAgICAgaWYgKHZhbHVlIDw9IGJyZWFrXykgcmV0dXJuIGlcbiAgICAgICAgICAgIGkrK1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpXG4gICAgfVxuICAgIGNsYXNzaWZpZXIuYnJlYWtzID0gYnJlYWtzXG4gICAgcmV0dXJuIGNsYXNzaWZpZXJcbn1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gbWluXG4gKiBAcGFyYW0ge251bWJlcn0gbWF4XG4gKiBAcGFyYW0ge251bWJlcn0gbmJDbGFzc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY2xhc3NpZmllck1pbk1heChtaW4sIG1heCwgbmJDbGFzcykge1xuICAgIGNvbnN0IGJyZWFrcyA9IFtdXG4gICAgY29uc3Qgc3RlcCA9IChtYXggLSBtaW4pIC8gbmJDbGFzc1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgbmJDbGFzczsgaSsrKSBicmVha3MucHVzaChtaW4gKyBpICogc3RlcClcbiAgICByZXR1cm4gY2xhc3NpZmllcihicmVha3MpXG59XG5cblxuXG4vKipcbiAqIFJldHVybiBhIGNvbG9yIGNsYXNzaWZpZXIgZnVuY3Rpb24gZnJvbSBicmVhayB2YWx1ZXMuXG4gKiBUaGUgY2xhc3NpZmllciBmdW5jdGlvbiByZXR1cm5zIHRoZSBjb2xvciBmcm9tIGEgdmFsdWUgdG8gY2xhc3NpZml5LlxuICogVGhlcmUgc2hvdWxkIGJlIG9uZSBjb2xvciBtb3JlIHRoYW4gYnJlYWsgdmFsdWVzLlxuICogQHBhcmFtIHtBcnJheS48bnVtYmVyPn0gYnJlYWtzIHRoZSBicmVha3NcbiAqIEBwYXJhbSB7QXJyYXkuPHN0cmluZz59IGNvbG9ycyB0aGUgY29sb3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb2xvckNsYXNzaWZpZXIoYnJlYWtzLCBjb2xvcnMpIHtcbiAgICBjb25zdCBjbGFzc2lmaWVyXyA9IGNsYXNzaWZpZXIoYnJlYWtzKVxuICAgIGNvbnN0IGNvbG9yQ2xhc3NpZmllciA9ICh2YWx1ZSkgPT4gY29sb3JzW2NsYXNzaWZpZXJfKHZhbHVlKV1cbiAgICBjb2xvckNsYXNzaWZpZXIuYnJlYWtzID0gYnJlYWtzXG4gICAgY29sb3JDbGFzc2lmaWVyLmNvbG9ycyA9IGNvbG9yc1xuICAgIHJldHVybiBjb2xvckNsYXNzaWZpZXJcbn1cblxuLyoqXG4gKiBNYWtlIGFycmF5IG9mIGNvbG9ycyBmcm9tIGEgY29sb3JTY2FsZS5cbiAqIEl0IGlzIGEga2luZCBvZiBzYW1wbGluZywgb3IgdW4taW50ZXJwb2xhdGlvblxuICpcbiAqIEBwYXJhbSB7ZnVuY3Rpb24obnVtYmVyKTpzdHJpbmd9IGNvbG9yU2NhbGVcbiAqIEBwYXJhbSB7bnVtYmVyfSBuYlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGlzY3JldGVDb2xvcnMoY29sb3JTY2FsZSwgbmIpIHtcbiAgICBpZiAobmIgPT0gMSkgcmV0dXJuIFtjb2xvclNjYWxlKDAuNSldXG4gICAgY29uc3Qgb3V0ID0gW11cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5iOyBpKyspIG91dC5wdXNoKGNvbG9yU2NhbGUoaSAvIChuYiAtIDEpKSlcbiAgICByZXR1cm4gb3V0XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbi8qKlxuICogQG1vZHVsZSB1dGlsc1xuICovXG5cbi8vVE9ETyBpbnZlcnQgZm9yIGNpcmN1bGFyXG4vL1RPRE8gdXNlIE1hdGguc3FydFxuLy9UT0RPIHZhbGlkYXRlXG5cbi8qKlxuICogU29tZSBmdW5jdGlvbiBbMCwxXS0+WzAsMV0gdG8gc3RyZXRjaCByYW5nZSBvZiB2YWx1ZXMuXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9ldXJvc3RhdC9ncmlkdml6L2Jsb2IvbWFzdGVyL2RvY3MvcmVmZXJlbmNlLm1kI3N0cmV0Y2hpbmdcbiAqIEBzZWUgaHR0cHM6Ly9vYnNlcnZhYmxlaHEuY29tL0BqZ2FmZnVyaS9zdHJldGNoaW5nXG4gKi9cblxuLy9pZGVudGl0eSBmdW5jdGlvblxuY29uc3QgaWRlbnRpdHkgPSAodCkgPT4gdFxuaWRlbnRpdHkuaW52ZXJ0ID0gaWRlbnRpdHlcblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gYmFzZVxuICogQHJldHVybnMge2Z1bmN0aW9uKG51bWJlcik6bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgZXhwb25lbnRpYWxTY2FsZSA9IChiYXNlID0gMykgPT4ge1xuICAgIGlmIChiYXNlID09IDApIHJldHVybiBpZGVudGl0eVxuICAgIGNvbnN0IGEgPSBNYXRoLmV4cChiYXNlKSAtIDFcbiAgICBjb25zdCBmID0gKHQpID0+IChNYXRoLmV4cCh0ICogYmFzZSkgLSAxKSAvIGFcbiAgICBmLmludmVydCA9ICh0KSA9PiBNYXRoLmxvZyhhICogdCArIDEpIC8gYmFzZVxuICAgIHJldHVybiBmXG59XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IGJhc2VcbiAqIEByZXR1cm5zIHtmdW5jdGlvbihudW1iZXIpOm51bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IGxvZ2FyaXRobWljU2NhbGUgPSAoYmFzZSA9IDMpID0+IHtcbiAgICBpZiAoYmFzZSA9PSAwKSByZXR1cm4gaWRlbnRpdHlcbiAgICBjb25zdCBhID0gTWF0aC5leHAoYmFzZSksXG4gICAgICAgIGIgPSAxIC0gYVxuICAgIGNvbnN0IGYgPSAodCkgPT4gMSAtIE1hdGgubG9nKGEgKyB0ICogYikgLyBiYXNlXG4gICAgZi5pbnZlcnQgPSAodCkgPT4gKE1hdGguZXhwKCgxIC0gdCkgKiBiYXNlKSAtIGEpIC8gYlxuICAgIHJldHVybiBmXG59XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IGV4cG9uZW50XG4gKiBAcmV0dXJucyB7ZnVuY3Rpb24obnVtYmVyKTpudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBwb3dlclNjYWxlID0gKGV4cG9uZW50ID0gMykgPT4ge1xuICAgIGlmIChleHBvbmVudCA9PSAxKSByZXR1cm4gaWRlbnRpdHlcbiAgICAvL1RPRE8gaWYgKGV4cG9uZW50ID09IDAuNSkgcmV0dXJuIE1hdGguc3FydFxuICAgIGNvbnN0IGYgPSAodCkgPT4gTWF0aC5wb3codCwgZXhwb25lbnQpXG4gICAgY29uc3QgYSA9IDEgLyBleHBvbmVudFxuICAgIGYuaW52ZXJ0ID0gKHQpID0+IE1hdGgucG93KHQsIGEpXG4gICAgcmV0dXJuIGZcbn1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gZXhwb25lbnRcbiAqIEByZXR1cm5zIHtmdW5jdGlvbihudW1iZXIpOm51bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IHBvd2VySW52ZXJzZVNjYWxlID0gKGV4cG9uZW50ID0gMykgPT4ge1xuICAgIGlmIChleHBvbmVudCA9PSAxKSByZXR1cm4gaWRlbnRpdHlcbiAgICAvL1RPRE8gaWYgKGV4cG9uZW50ID09IDIpIHJldHVybiB0ID0+IDEgLSBNYXRoLnNxcnQoMSAtIHQpXG4gICAgY29uc3QgYSA9IDEgLyBleHBvbmVudFxuICAgIGNvbnN0IGYgPSAodCkgPT4gMSAtIE1hdGgucG93KDEgLSB0LCBhKVxuICAgIGYuaW52ZXJ0ID0gKHQpID0+IDEgLSBNYXRoLnBvdygxIC0gdCwgZXhwb25lbnQpXG4gICAgcmV0dXJuIGZcbn1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gY2lyY3VsYXJpdHlcbiAqIEByZXR1cm5zIHtmdW5jdGlvbihudW1iZXIpOm51bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IGNpcmN1bGFyU2NhbGUgPSAoY2lyY3VsYXJpdHkgPSAwLjgpID0+IHtcbiAgICBpZiAoY2lyY3VsYXJpdHkgPT0gMCkgcmV0dXJuIGlkZW50aXR5XG4gICAgaWYgKGNpcmN1bGFyaXR5ID09IDEpIHJldHVybiAodCkgPT4gTWF0aC5zcXJ0KHQgKiAoMiAtIHQpKVxuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBhID0gY2lyY3VsYXJpdHkgLyAoMSAtIGNpcmN1bGFyaXR5KVxuICAgICAgICByZXR1cm4gKHQpID0+IE1hdGguc3FydCgxIC8gKGEgKiBhKSArIHQgKiAoMiAvIGEgKyAyIC0gdCkpIC0gMSAvIGFcbiAgICB9XG59XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IGNpcmN1bGFyaXR5XG4gKiBAcmV0dXJucyB7ZnVuY3Rpb24obnVtYmVyKTpudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBjaXJjdWxhckludmVyc2VTY2FsZSA9IChjaXJjdWxhcml0eSA9IDAuOCkgPT4ge1xuICAgIGlmIChjaXJjdWxhcml0eSA9PSAwKSByZXR1cm4gaWRlbnRpdHlcbiAgICBjb25zdCBmID0gY2lyY3VsYXJTY2FsZShjaXJjdWxhcml0eSlcbiAgICByZXR1cm4gKHQpID0+IDEgLSBmKDEgLSB0KVxufVxuXG4vL3Rlc3Rcbi8qXG5jb25zdCB0ZXN0ID0gKGYsIGZ1biwgYSwgZXJyID0gMWUtMTIpID0+IHtcbiAgICBmb3IgKGxldCB0ID0gMDsgdCA8PSAxOyB0ICs9IDEgLyA1MCkge1xuICAgICAgICBjb25zdCBlciA9IHQgLSBmLmludmVydChmKHQpKVxuICAgICAgICBpZiAoTWF0aC5hYnMoZXIpIDwgZXJyKSBjb250aW51ZVxuICAgICAgICBjb25zb2xlLmxvZyhmdW4sIGEsIGVyKVxuICAgIH1cbn1cblxuZm9yIChsZXQgZnVuIG9mIFtwb3dlclNjYWxlLCBwb3dlckludmVyc2VTY2FsZV0pXG4gICAgZm9yIChsZXQgZXhwID0gLTMwOyBleHAgPD0gNTA7IGV4cCArPSAxKSB7XG4gICAgICAgIGlmIChleHAgPT0gMCkgY29udGludWVcbiAgICAgICAgY29uc3QgZiA9IGZ1bihleHApXG4gICAgICAgIHRlc3QoZiwgZnVuLCBleHApXG4gICAgfVxuXG5cbmZvciAobGV0IGZ1biBvZiBbZXhwb25lbnRpYWxTY2FsZSwgbG9nYXJpdGhtaWNTY2FsZV0pXG4gICAgZm9yIChsZXQgYmFzZSA9IC0yMDsgYmFzZSA8PSAyMDsgYmFzZSArPSAxKSB7XG4gICAgICAgIC8vaWYgKGV4cCA9PSAwKSBjb250aW51ZVxuICAgICAgICBjb25zdCBmID0gZnVuKGJhc2UpXG4gICAgICAgIHRlc3QoZiwgZnVuLCBiYXNlLCAxZS0xMClcbiAgICB9XG4qL1xuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBpbnRlcnBvbGF0ZUxhYiB9IGZyb20gJ2QzLWludGVycG9sYXRlJ1xuXG5leHBvcnQgY29uc3QgdGVybmFyeUNsYXNzaWZpZXIgPSAocHJvcGVydGllcywgdG90YWxGdW5jdGlvbiwgb3B0cyA9IHt9KSA9PiB7XG4gICAgLy90aGUgdGhyZWUgcHJvcGVydGllc1xuICAgIGNvbnN0IHAwID0gcHJvcGVydGllc1swXSxcbiAgICAgICAgcDEgPSBwcm9wZXJ0aWVzWzFdLFxuICAgICAgICBwMiA9IHByb3BlcnRpZXNbMl1cblxuICAgIC8vdGhlIGNsYXNzaWZpZXIgY2VudGVyIHBvaW50LiBzdW0gbXVzdCBiZSBlcXVhbCB0byAxXG4gICAgY29uc3QgW2MwLCBjMSwgYzJdID0gb3B0cy5jZW50ZXIgfHwgWzEgLyAzLCAxIC8gMywgMSAvIDNdXG5cbiAgICAvL3BhcmFtZXRlciB0byBkZWNpZGUgd2V0aGVyIHRvIHVzZSBtaXhlZCBjbGFzc2VzIG0wLCBtMSwgbTIuXG4gICAgY29uc3Qgd2l0aE1peGVkQ2xhc3NlcyA9IG9wdHMud2l0aE1peGVkQ2xhc3NlcyAhPSB1bmRlZmluZWQgPyBvcHRzLndpdGhNaXhlZENsYXNzZXMgOiB0cnVlXG5cbiAgICAvL3BhcmFtZXRlciB0byBkZWNpZGUgd2V0aGVyIHRvIHVzZSBhIGNlbnRyYWwgY2xhc3MsIGFuZCB0aGUgc2l6ZSBvZiB0aGlzIGNlbnRyYWwgY2xhc3MuXG4gICAgLy9zZXQgdG8gMCBvciB1bmRlZmluZWQgZm9yIG5vdCBzaG93aW5nIGFueSBjZW50cmFsIGNsYXNzLiBTZXQgdG8gMSBmb3IgYSBjZW50cmFsIGNsYXNzIHRoYXQgY29udGFpbnMgdGhlIG1peCBjbGFzc2VzXG4gICAgY29uc3QgY2MgPSBvcHRzLmNlbnRlckNvZWZmaWNpZW50ID8gMSAtIG9wdHMuY2VudGVyQ29lZmZpY2llbnQgOiB1bmRlZmluZWRcblxuICAgIC8vdGhlIG91dHB1dCBjbGFzc2lmaWVyIG1ldGhvZFxuICAgIGNvbnN0IGZ1biA9IChjKSA9PiB7XG4gICAgICAgIC8vZ2V0IHRvdGFsXG4gICAgICAgIGNvbnN0IHRvdCA9IHRvdGFsRnVuY3Rpb24oYylcbiAgICAgICAgaWYgKCF0b3QpIHJldHVybiB1bmRlZmluZWRcbiAgICAgICAgLy9jb21wdXRlIHNoYXJlc1xuICAgICAgICBjb25zdCBbczAsIHMxLCBzMl0gPSBbK2NbcDBdIC8gdG90LCArY1twMV0gLyB0b3QsICtjW3AyXSAvIHRvdF1cblxuICAgICAgICAvL2NsYXNzIDBcbiAgICAgICAgaWYgKHMwID49IGMwICYmIHMxIDw9IGMxICYmIHMyIDw9IGMyKSB7XG4gICAgICAgICAgICAvL2NlbnRyYWwgY2xhc3MgbmVhciBjbGFzcyAwXG4gICAgICAgICAgICBpZiAoY2MgIT0gdW5kZWZpbmVkICYmIChzMiAtIGMyKSAqIChjMSAtIGNjICogYzEpID49IChzMSAtIGNjICogYzEpICogKGNjICogYzIgLSBjMikpXG4gICAgICAgICAgICAgICAgcmV0dXJuICdjZW50ZXInXG4gICAgICAgICAgICByZXR1cm4gJzAnXG4gICAgICAgIH1cbiAgICAgICAgLy9jbGFzcyAxXG4gICAgICAgIGlmIChzMCA8PSBjMCAmJiBzMSA+PSBjMSAmJiBzMiA8PSBjMikge1xuICAgICAgICAgICAgLy9jZW50cmFsIGNsYXNzIG5lYXIgY2xhc3MgMVxuICAgICAgICAgICAgaWYgKGNjICE9IHVuZGVmaW5lZCAmJiAoczIgLSBjMikgKiAoYzAgLSBjYyAqIGMwKSA+PSAoczAgLSBjYyAqIGMwKSAqIChjYyAqIGMyIC0gYzIpKVxuICAgICAgICAgICAgICAgIHJldHVybiAnY2VudGVyJ1xuICAgICAgICAgICAgcmV0dXJuICcxJ1xuICAgICAgICB9XG4gICAgICAgIC8vY2xhc3MgMlxuICAgICAgICBpZiAoczAgPD0gYzAgJiYgczEgPD0gYzEgJiYgczIgPj0gYzIpIHtcbiAgICAgICAgICAgIC8vY2VudHJhbCBjbGFzcyBuZWFyIGNsYXNzIDJcbiAgICAgICAgICAgIGlmIChjYyAhPSB1bmRlZmluZWQgJiYgKHMxIC0gYzEpICogKGMwIC0gY2MgKiBjMCkgPj0gKHMwIC0gY2MgKiBjMCkgKiAoY2MgKiBjMSAtIGMxKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2NlbnRlcidcbiAgICAgICAgICAgIHJldHVybiAnMidcbiAgICAgICAgfVxuICAgICAgICAvL21pZGRsZSBjbGFzcyAwIC0gaW50ZXJzZWN0aW9uIGNsYXNzIDEgYW5kIDJcbiAgICAgICAgaWYgKHMwIDw9IGMwICYmIHMxID49IGMxICYmIHMyID49IGMyKSB7XG4gICAgICAgICAgICAvL2NlbnRyYWwgY2xhc3NcbiAgICAgICAgICAgIGlmIChjYyAhPSB1bmRlZmluZWQgJiYgczAgPiBjYyAqIGMwKSByZXR1cm4gJ2NlbnRlcidcbiAgICAgICAgICAgIGlmICh3aXRoTWl4ZWRDbGFzc2VzKSByZXR1cm4gJ20xMidcbiAgICAgICAgICAgIHJldHVybiBzMSA+IHMyID8gJzEnIDogJzInXG4gICAgICAgIH1cbiAgICAgICAgLy9taWRkbGUgY2xhc3MgMSAtIGludGVyc2VjdGlvbiBjbGFzcyAwIGFuZCAxXG4gICAgICAgIGlmIChzMCA+PSBjMCAmJiBzMSA8PSBjMSAmJiBzMiA+PSBjMikge1xuICAgICAgICAgICAgLy9jZW50cmFsIGNsYXNzXG4gICAgICAgICAgICBpZiAoY2MgIT0gdW5kZWZpbmVkICYmIHMxID4gY2MgKiBjMSkgcmV0dXJuICdjZW50ZXInXG4gICAgICAgICAgICBpZiAod2l0aE1peGVkQ2xhc3NlcykgcmV0dXJuICdtMDInXG4gICAgICAgICAgICByZXR1cm4gczAgPiBzMiA/ICcwJyA6ICcyJ1xuICAgICAgICB9XG4gICAgICAgIC8vbWlkZGxlIGNsYXNzIDIgLSBpbnRlcnNlY3Rpb24gY2xhc3MgMCBhbmQgMVxuICAgICAgICBpZiAoczAgPj0gYzAgJiYgczEgPj0gYzEgJiYgczIgPD0gYzIpIHtcbiAgICAgICAgICAgIC8vY2VudHJhbCBjbGFzc1xuICAgICAgICAgICAgaWYgKGNjICE9IHVuZGVmaW5lZCAmJiBzMiA+IGNjICogYzIpIHJldHVybiAnY2VudGVyJ1xuICAgICAgICAgICAgaWYgKHdpdGhNaXhlZENsYXNzZXMpIHJldHVybiAnbTAxJ1xuICAgICAgICAgICAgcmV0dXJuIHMxID4gczAgPyAnMScgOiAnMCdcbiAgICAgICAgfVxuICAgICAgICAvL3Nob3VsZCBub3QgaGFwcGVuXG4gICAgICAgIHJldHVybiAndW5rbm93bidcbiAgICB9XG5cbiAgICAvL2F0dGFjaCBpbmZvcm1hdGlvbiB0byBvdXRwdXQgZnVuY3Rpb25cbiAgICBmdW4uY2VudGVyID0gW2MwLCBjMSwgYzJdXG4gICAgZnVuLmNlbnRlckNvZWZmaWNpZW50ID0gb3B0cy5jZW50ZXJDb2VmZmljaWVudFxuXG4gICAgcmV0dXJuIGZ1blxufVxuXG5leHBvcnQgY29uc3QgdGVybmFyeUNvbG9yQ2xhc3NpZmllciA9IChwcm9wZXJ0aWVzLCB0b3RhbEZ1bmN0aW9uLCBjb2xvcnMsIG9wdHMgPSB7fSkgPT4ge1xuICAgIC8vdGhlIHRocmVlIGNvbG9yc1xuICAgIGNvbnN0IFtjb2xvcjAsIGNvbG9yMSwgY29sb3IyXSA9IGNvbG9ycyB8fCBbJ3JlZCcsICdncmVlbicsICdibHVlJ11cblxuICAgIC8vdGhlIGNvbG9yIGludGVycG9sYXRpb24gZnVuY3Rpb25cbiAgICBjb25zdCBjb2xvckludGVycG9sYXRpb24gPSBvcHRzLmNvbG9ySW50ZXJwb2xhdGlvbiB8fCBpbnRlcnBvbGF0ZUxhYlxuXG4gICAgLy9wYXJhbWV0ZXIgdG8gZGVjaWRlIHdldGhlciB0byB1c2UgbWl4ZWQgY2xhc3Nlcy5cbiAgICBjb25zdCB3aXRoTWl4ZWRDbGFzc2VzID0gb3B0cy53aXRoTWl4ZWRDbGFzc2VzICE9IHVuZGVmaW5lZCA/IG9wdHMud2l0aE1peGVkQ2xhc3NlcyA6IHRydWVcbiAgICAvL2h0dHBzOi8vZDNqcy5vcmcvZDMtaW50ZXJwb2xhdGUvY29sb3JcbiAgICBjb25zdCBtaXhDb2xvckZ1bmN0aW9uID0gKGNvbG9yMSwgY29sb3IyKSA9PiBjb2xvckludGVycG9sYXRpb24oY29sb3IxLCBjb2xvcjIpKDAuNSlcbiAgICAvL3RoZSBjb2xvcnMgY29ycmVzcG9uZGluZyB0byB0aGUgbWl4ZWQgY2xhc3Nlc1xuICAgIGNvbnN0IFttaXhDb2xvcjAsIG1peENvbG9yMSwgbWl4Q29sb3IyXSA9XG4gICAgICAgIG9wdHMubWl4ZWRDb2xvcnMgfHwgd2l0aE1peGVkQ2xhc3Nlc1xuICAgICAgICAgICAgPyBbXG4gICAgICAgICAgICAgICAgICBtaXhDb2xvckZ1bmN0aW9uKGNvbG9yMSwgY29sb3IyKSxcbiAgICAgICAgICAgICAgICAgIG1peENvbG9yRnVuY3Rpb24oY29sb3IwLCBjb2xvcjIpLFxuICAgICAgICAgICAgICAgICAgbWl4Q29sb3JGdW5jdGlvbihjb2xvcjAsIGNvbG9yMSksXG4gICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIDogW11cblxuICAgIC8vdGhlIGNlbnRyYWwgY29sb3IsIHVzZWQgZm9yIHRoZSBjZW50cmFsIGNsYXNzLCBpZiBhbnkuIFRoZSBjZW50cmFsIGNsYXNzIGlzIHRoZSBjbGFzcyBvZiByZWxhdGl2ZWx5IGJhbGFuY2VkIHZhbHVlcywgYXJvdW5kIHRoZSBjZW50ZXIgcG9pbnRcbiAgICBjb25zdCBjZW50ZXJDb2xvciA9XG4gICAgICAgIG9wdHMuY2VudGVyQ29sb3IgfHwgY29sb3JJbnRlcnBvbGF0aW9uKG1peENvbG9yRnVuY3Rpb24oY29sb3IwLCBjb2xvcjEpLCBjb2xvcjIpKDAuMzMzKVxuXG4gICAgLy9tYWtlIGNsYXNzaWZpZXJcbiAgICBjb25zdCBjbGFzc2lmaWVyID0gdGVybmFyeUNsYXNzaWZpZXIocHJvcGVydGllcywgdG90YWxGdW5jdGlvbiwgb3B0cylcblxuICAgIC8vdGhlIG91dHB1dCBjb2xvciBjbGFzc2lmaWVyIG1ldGhvZFxuICAgIGNvbnN0IGZ1biA9IChjKSA9PiB7XG4gICAgICAgIGNvbnN0IGNsYSA9IGNsYXNzaWZpZXIoYylcbiAgICAgICAgaWYgKGNsYSA9PSAnMCcpIHJldHVybiBjb2xvcjBcbiAgICAgICAgaWYgKGNsYSA9PSAnMScpIHJldHVybiBjb2xvcjFcbiAgICAgICAgaWYgKGNsYSA9PSAnMicpIHJldHVybiBjb2xvcjJcbiAgICAgICAgaWYgKGNsYSA9PSAnbTEyJykgcmV0dXJuIG1peENvbG9yMFxuICAgICAgICBpZiAoY2xhID09ICdtMDInKSByZXR1cm4gbWl4Q29sb3IxXG4gICAgICAgIGlmIChjbGEgPT0gJ20wMScpIHJldHVybiBtaXhDb2xvcjJcbiAgICAgICAgaWYgKGNsYSA9PSAnY2VudGVyJykgcmV0dXJuIGNlbnRlckNvbG9yXG4gICAgICAgIHJldHVybiBvcHRzLmRlZmF1bHRDb2xvciB8fCAnYmxhY2snXG4gICAgfVxuICAgIGZ1bi5jZW50ZXIgPSBjbGFzc2lmaWVyLmNlbnRlclxuICAgIGZ1bi5jZW50ZXJDb2VmZmljaWVudCA9IG9wdHMuY2VudGVyQ29lZmZpY2llbnRcbiAgICBmdW4uY29sb3JzID0gW2NvbG9yMCwgY29sb3IxLCBjb2xvcjJdXG4gICAgZnVuLm1peENvbG9ycyA9IFttaXhDb2xvcjAsIG1peENvbG9yMSwgbWl4Q29sb3IyXVxuICAgIGZ1bi5jZW50ZXJDb2xvciA9IGNlbnRlckNvbG9yXG4gICAgZnVuLmNsYXNzaWZpZXIgPSBjbGFzc2lmaWVyXG5cbiAgICByZXR1cm4gZnVuXG59XG5cblxuXG5cbi8vIE9MRCBWRVJTSU9OU1xuXG4vKlxuY29uc3Qgb3JkZXJlZEluZGV4ZXNEZWMgPSBhcnIgPT4gWy4uLmFyci5rZXlzKCldLnNvcnQoKGEsIGIpID0+IGFycltiXSAtIGFyclthXSk7XG5jb25zdCBvcmRlcmVkSW5kZXhlc0luYyA9IGFyciA9PiBbLi4uYXJyLmtleXMoKV0uc29ydCgoYSwgYikgPT4gYXJyW2FdIC0gYXJyW2JdKTtcblxuZXhwb3J0IGNvbnN0IHRlcm5hcnlDbGFzc2lmaWVyID0gKHByb3BlcnRpZXMsIHRvdGFsRnVuY3Rpb24sIG9wdHMgPSB7fSkgPT4ge1xuICAgIGNvbnN0IGxvd1RocmVzaG9sZCA9IG9wdHMubG93VGhyZXNob2xkIHx8IFsxIC8gMywgMSAvIDMsIDEgLyAzXVxuICAgIGNvbnN0IGhpZ2hUaHJlc2hvbGQgPSBvcHRzLmhpZ2hUaHJlc2hvbGQgfHwgWzIgLyAzLCAyIC8gMywgMiAvIDNdXG4gICAgY29uc3QgY29sb3JzID0gb3B0cy5jb2xvcnMgfHwgW1wicmVkXCIsIFwiZ3JlZW5cIiwgXCJibHVlXCJdXG4gICAgY29uc3QgY29sb3JJbnRlcnBvbGF0aW9uID0gb3B0cy5jb2xvckludGVycG9sYXRpb24gfHwgaW50ZXJwb2xhdGVMYWJcblxuICAgIC8vaHR0cHM6Ly9kM2pzLm9yZy9kMy1pbnRlcnBvbGF0ZS9jb2xvclxuICAgIGNvbnN0IG1pZGRsZUNvbG9yRnVuY3Rpb24gPSAoY29sb3IxLCBjb2xvcjIpID0+IGNvbG9ySW50ZXJwb2xhdGlvbihjb2xvcjEsIGNvbG9yMikoMC41KVxuICAgIGNvbnN0IG1pZGRsZUNvbG9ycyA9IG9wdHMubWlkZGxlQ29sb3JzIHx8IFttaWRkbGVDb2xvckZ1bmN0aW9uKGNvbG9yc1sxXSwgY29sb3JzWzJdKSwgbWlkZGxlQ29sb3JGdW5jdGlvbihjb2xvcnNbMF0sIGNvbG9yc1syXSksIG1pZGRsZUNvbG9yRnVuY3Rpb24oY29sb3JzWzBdLCBjb2xvcnNbMV0pXVxuICAgIGNvbnN0IGNlbnRlckNvbG9yID0gb3B0cy5jZW50ZXJDb2xvciB8fCBjb2xvckludGVycG9sYXRpb24obWlkZGxlQ29sb3JzWzJdLCBjb2xvcnNbMl0pKDAuMzMzKVxuXG4gICAgY29uc3QgaGlnaF8gPSBvcmRlcmVkSW5kZXhlc0RlYyhoaWdoVGhyZXNob2xkKVxuICAgIGNvbnN0IGxvd18gPSBvcmRlcmVkSW5kZXhlc0luYyhsb3dUaHJlc2hvbGQpXG5cbiAgICBjb25zdCBwMCA9IHByb3BlcnRpZXNbMF0sIHAxID0gcHJvcGVydGllc1sxXSwgcDIgPSBwcm9wZXJ0aWVzWzJdXG4gICAgY29uc3QgZnVuID0gYyA9PiB7XG4gICAgICAgIC8vZ2V0IHRvdGFsXG4gICAgICAgIGNvbnN0IHRvdCA9IHRvdGFsRnVuY3Rpb24oYylcbiAgICAgICAgaWYgKCF0b3QpIHJldHVybiB1bmRlZmluZWRcbiAgICAgICAgLy9jb21wdXRlIHNoYXJlc1xuICAgICAgICBjb25zdCBzaGFyZXMgPSBbK2NbcDBdIC8gdG90LCArY1twMV0gLyB0b3QsICtjW3AyXSAvIHRvdF1cbiAgICAgICAgLy9yZXR1cm4gY29sb3JzXG4gICAgICAgIC8vc3RhcnQgZmlyc3Qgd2l0aCB0aGUgZXh0cmVtZSBoaWdoICh0cmlhbmdsZXMpOiBmcm9tIHRoZSBsYXJnZXIgdmFsdWUgKHNtYWxsIHRyaWFuZ2xlKSB0byB0aGUgbG93ZXIgdmFsdWUgKGxhcmdlIHRyaWFuZ2xlKVxuICAgICAgICBmb3IgKGxldCBpIG9mIGhpZ2hfKSBpZiAoc2hhcmVzW2ldID4gaGlnaFRocmVzaG9sZFtpXSkgcmV0dXJuIGNvbG9yc1tpXVxuICAgICAgICAvL3RoZW4gZHJhdyB0aGUgZXh0cmVtZSBsb3cgKHRyYXBleml1bXMpOiBmcm9tIHRoZSBsb3dlciB2YWx1ZSAoc21hbGwgdHJhcGV6aXVtcykgdG8gdGhlIGxhcmdlciB2YWx1ZXMgKGxhcmdlIHRyYXBleml1bSlcbiAgICAgICAgZm9yIChsZXQgaSBvZiBsb3dfKSBpZiAoc2hhcmVzW2ldIDwgbG93VGhyZXNob2xkW2ldKSByZXR1cm4gbWlkZGxlQ29sb3JzW2ldXG4gICAgICAgIC8vZWxzZSBjZW50cmFsIGNvbG9yXG4gICAgICAgIHJldHVybiBjZW50ZXJDb2xvclxuICAgIH1cbiAgICBmdW4ubG93VGhyZXNob2xkID0gbG93VGhyZXNob2xkXG4gICAgZnVuLmhpZ2hUaHJlc2hvbGQgPSBoaWdoVGhyZXNob2xkXG4gICAgZnVuLmNvbG9ycyA9IGNvbG9yc1xuICAgIGZ1bi5taWRkbGVDb2xvcnMgPSBtaWRkbGVDb2xvcnNcbiAgICBmdW4uY2VudGVyQ29sb3IgPSBjZW50ZXJDb2xvclxuICAgIGZ1bi5sb3dJbmRleCA9IGxvd19cbiAgICBmdW4uaGlnaEluZGV4ID0gaGlnaF9cbiAgICByZXR1cm4gZnVuXG59XG4qL1xuXG4vKlxuZXhwb3J0IGNvbnN0IHRlcm5hcnlDbGFzc2lmaWVyMyA9IChwcm9wZXJ0aWVzLCB0b3RhbEZ1bmN0aW9uLCBvcHRzID0ge30pID0+IHtcbiAgICBjb25zdCBbYTAxLCBhMTIsIGEyMF0gPSBvcHRzLnRocmVzaG9sZHMgfHwgWzEvMywgMS8zLCAxLzNdXG4gICAgY29uc3QgW2MwLCBjMSwgYzJdID0gb3B0cy5jb2xvcnMgfHwgW1wicmVkXCIsIFwiZ3JlZW5cIiwgXCJibHVlXCJdXG4gICAgY29uc3QgY2VudGVyQ29sb3IgPSBvcHRzLmNlbnRlckNvbG9yIHx8IFwiZ3JheVwiXG5cbiAgICBjb25zdCBmZmYgPSBhID0+IGEgPT0gMSA/IEluZmluaXR5IDogYSAvICgxIC0gYSlcbiAgICBjb25zdCBjMDEgPSBmZmYoYTAxKSwgYzEyID0gZmZmKGExMiksIGMyMCA9IGZmZihhMjApXG5cbiAgICBjb25zdCBwMCA9IHByb3BlcnRpZXNbMF0sIHAxID0gcHJvcGVydGllc1sxXSwgcDIgPSBwcm9wZXJ0aWVzWzJdXG4gICAgY29uc3QgZnVuID0gYyA9PiB7XG4gICAgICAgIC8vZ2V0IHRvdGFsXG4gICAgICAgIGNvbnN0IHRvdCA9IHRvdGFsRnVuY3Rpb24oYylcbiAgICAgICAgaWYgKCF0b3QpIHJldHVybiB1bmRlZmluZWRcbiAgICAgICAgLy9jb21wdXRlIHNoYXJlc1xuICAgICAgICBjb25zdCBbczAsIHMxLCBzMl0gPSBbK2NbcDBdIC8gdG90LCArY1twMV0gLyB0b3QsICtjW3AyXSAvIHRvdF1cbiAgICAgICAgLy9yZXR1cm4gY29sb3JzXG4gICAgICAgIGlmIChzMCAqIGMwMSA+IHMxICYmIHMwID4gczIgKiBjMjApIHJldHVybiBjMFxuICAgICAgICBlbHNlIGlmIChzMSA+IHMwICogYzAxICYmIHMxICogYzEyID4gczIpIHJldHVybiBjMVxuICAgICAgICBlbHNlIGlmIChzMiAqIGMyMCA+IHMwICYmIHMyID4gczEgKiBjMTIpIHJldHVybiBjMlxuICAgICAgICBlbHNlIHJldHVybiBjZW50ZXJDb2xvclxuICAgIH1cbiAgICBmdW4uY29sb3JzID0gW2MwLCBjMSwgYzJdXG4gICAgZnVuLmNlbnRlckNvbG9yID0gY2VudGVyQ29sb3JcbiAgICByZXR1cm4gZnVuXG59XG4qL1xuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG4vKipcbiAqIEdldCB0aGUgY2xhc3MgaWQgZnJvbSBhIHZhbHVlIGFuZCBjbGFzcyBicmVhayB2YWx1ZXNcbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gdiB0aGUgdmFsdWVcbiAqIEBwYXJhbSB7QXJyYXkuPG51bWJlcj59IGJyZWFrcyB0aGUgYnJlYWtzXG4gKiBAcmV0dXJucyBUaGUgY2xhc3MgaWQsIGZyb20gMCB0byBicmVha3MubGVuZ3RoXG4gKiBAZGVwcmVjYXRlZCB1c2UgZ2V0Q2xhc3NpZmllciBpbnN0ZWFkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2xhc3ModiwgYnJlYWtzKSB7XG4gICAgaWYgKCFicmVha3MpIHJldHVyblxuICAgIGlmIChicmVha3MubGVuZ3RoID09IDApIHJldHVybiAwXG4gICAgaWYgKHYgPD0gYnJlYWtzWzBdKSByZXR1cm4gMFxuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgYnJlYWtzLmxlbmd0aDsgaSsrKSBpZiAoYnJlYWtzW2kgLSAxXSA8IHYgJiYgdiA8PSBicmVha3NbaV0pIHJldHVybiBpXG4gICAgcmV0dXJuIGJyZWFrcy5sZW5ndGhcbn1cblxuLy90YWtlICduaWNlJyB2YWx1ZSAocG93ZXIgb2YgdGVuLCBvciBtdWx0aXBsZSlcbmV4cG9ydCBmdW5jdGlvbiBuaWNlKHYsIG11bHRpcGxlcyA9IFs4LCA2LCA1LCA0LCAyLjUsIDJdKSB7XG4gICAgLy9jb21wdXRlIGJpZ2dlciBwb3dlciBvZiB0ZW4gYmVsb3dcbiAgICBjb25zdCB2XyA9IE1hdGgucG93KDEwLCBNYXRoLmZsb29yKE1hdGgubG9nMTAodikpKVxuICAgIGZvciAobGV0IG11bHRpcGxlIG9mIG11bHRpcGxlcykgaWYgKHZfICogbXVsdGlwbGUgPD0gdikgcmV0dXJuIHZfICogbXVsdGlwbGVcbiAgICByZXR1cm4gdl9cbn1cblxuLypcbi8vbm8gbG9uZ2VyIHVzZWRcbmV4cG9ydCBmdW5jdGlvbiBsb2FkSW1hZ2Uoc3JjKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3QgaW1nID0gbmV3IEltYWdlKCk7XG4gICAgICAgIGltZy5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7IHJlc29sdmUoaW1nKTsgfTtcbiAgICAgICAgaW1nLm9uZXJyb3IgPSBmdW5jdGlvbiAoKSB7IHJlamVjdChuZXcgRXJyb3IoJ0Vycm9yIGxvYWRpbmcgaW1hZ2UnKSk7IH07XG4gICAgICAgIGltZy5zcmMgPSBzcmM7XG4gICAgfSk7XG59XG4qL1xuXG4vKlxuZXhwb3J0IGxldCBtb25pdG9yID0gZmFsc2VcblxubGV0IHByZXZpb3VzRGF0ZVxuZXhwb3J0IGZ1bmN0aW9uIG1vbml0b3JEdXJhdGlvbihtZXNzYWdlKSB7XG4gICAgY29uc3Qgbm93RGF0ZSA9IERhdGUubm93KClcblxuICAgIC8vZmlyc3QgY2FsbFxuICAgIGlmICghcHJldmlvdXNEYXRlKSB7XG4gICAgICAgIHByZXZpb3VzRGF0ZSA9IG5vd0RhdGVcbiAgICAgICAgY29uc29sZS5sb2cocHJldmlvdXNEYXRlLCBtZXNzYWdlKVxuICAgICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBkID0gbm93RGF0ZSAtIHByZXZpb3VzRGF0ZVxuICAgIHByZXZpb3VzRGF0ZSA9IG5vd0RhdGVcbiAgICBjb25zb2xlLmxvZyhkLCBtZXNzYWdlKVxufVxuKi9cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gd2lkdGhcbiAqIEBwYXJhbSB7c3RyaW5nfSBoZWlnaHRcbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXG4gKiBAcmV0dXJucyB7e2NhbnZhczpIVE1MQ2FudmFzRWxlbWVudCwgZ2w6V2ViR0xSZW5kZXJpbmdDb250ZXh0fX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1ha2VXZWJHTENhbnZhcyh3aWR0aCwgaGVpZ2h0LCBvcHRzID0ge30pIHtcbiAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKVxuICAgIGNhbnZhcy5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgd2lkdGgpXG4gICAgY2FudmFzLnNldEF0dHJpYnV0ZSgnaGVpZ2h0JywgaGVpZ2h0KVxuICAgIC8qKiBAdHlwZSB7V2ViR0xSZW5kZXJpbmdDb250ZXh0fSAqL1xuICAgIGNvbnN0IGdsID0gY2FudmFzLmdldENvbnRleHQoJ3dlYmdsJywgb3B0cylcbiAgICBpZiAoIWdsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGluaXRpYWxpemUgV2ViR0wuIFlvdXIgYnJvd3NlciBvciBtYWNoaW5lIG1heSBub3Qgc3VwcG9ydCBpdC4nKVxuICAgIH1cbiAgICByZXR1cm4geyBjYW52YXM6IGNhbnZhcywgZ2w6IGdsIH1cbn1cblxuLyoqXG4gKiBJbml0aWFsaXplIGEgc2hhZGVyIHByb2dyYW0sIHNvIFdlYkdMIGtub3dzIGhvdyB0byBkcmF3IG91ciBkYXRhXG4gKlxuICogQHBhcmFtIHtXZWJHTFJlbmRlcmluZ0NvbnRleHR9IGdsXG4gKiBAcGFyYW0gIHsuLi5XZWJHTFNoYWRlcn0gc2hhZGVyc1xuICogQHJldHVybnMge1dlYkdMUHJvZ3JhbX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluaXRTaGFkZXJQcm9ncmFtKGdsLCAuLi5zaGFkZXJzKSB7XG4gICAgLyoqIEB0eXBlIHtXZWJHTFByb2dyYW18bnVsbH0gKi9cbiAgICBjb25zdCBwcm9ncmFtID0gZ2wuY3JlYXRlUHJvZ3JhbSgpXG4gICAgaWYgKHByb2dyYW0gPT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY3JlYXRlIHdlYkdMIHByb2dyYW0nKVxuICAgIGZvciAoY29uc3Qgc2hhZGVyIG9mIHNoYWRlcnMpIGdsLmF0dGFjaFNoYWRlcihwcm9ncmFtLCBzaGFkZXIpXG4gICAgZ2wubGlua1Byb2dyYW0ocHJvZ3JhbSlcbiAgICBpZiAoZ2wuZ2V0UHJvZ3JhbVBhcmFtZXRlcihwcm9ncmFtLCBnbC5MSU5LX1NUQVRVUykpIHJldHVybiBwcm9ncmFtXG4gICAgdGhyb3cgbmV3IEVycm9yKGdsLmdldFByb2dyYW1JbmZvTG9nKHByb2dyYW0pIHx8ICdDYW5ub3QgY3JlYXRlIHdlYkdMIHByb2dyYW0gKDIpJylcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgc2hhZGVyIG9mIHRoZSBnaXZlbiB0eXBlLCB1cGxvYWRzIHRoZSBzb3VyY2UgYW5kIGNvbXBpbGVzIGl0LlxuICpcbiAqIEBwYXJhbSB7V2ViR0xSZW5kZXJpbmdDb250ZXh0fSBnbFxuICogQHBhcmFtIHtudW1iZXJ9IHR5cGVcbiAqIEBwYXJhbSAgey4uLnN0cmluZ30gc291cmNlc1xuICogQHJldHVybnMge1dlYkdMU2hhZGVyfVxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU2hhZGVyKGdsLCB0eXBlLCAuLi5zb3VyY2VzKSB7XG4gICAgLyoqIEB0eXBlIHtXZWJHTFNoYWRlcnxudWxsfSAqL1xuICAgIGNvbnN0IHNoYWRlciA9IGdsLmNyZWF0ZVNoYWRlcih0eXBlKVxuICAgIGlmIChzaGFkZXIgPT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY3JlYXRlIHdlYkdMIHNoYWRlcicpXG4gICAgZ2wuc2hhZGVyU291cmNlKHNoYWRlciwgc291cmNlcy5qb2luKCdcXG4nKSlcbiAgICBnbC5jb21waWxlU2hhZGVyKHNoYWRlcilcbiAgICBpZiAoZ2wuZ2V0U2hhZGVyUGFyYW1ldGVyKHNoYWRlciwgZ2wuQ09NUElMRV9TVEFUVVMpKSByZXR1cm4gc2hhZGVyXG4gICAgdGhyb3cgbmV3IEVycm9yKGdsLmdldFNoYWRlckluZm9Mb2coc2hhZGVyKSB8fCAnQ2Fubm90IGNyZWF0ZSB3ZWJHTCBzaGFkZXIgKDIpJylcbn1cblxuLyoqXG4gKiBDaGVjayBpZiB3ZWJHTCBpcyBzdXBwb3J0ZWRcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrV2ViR0xTdXBwb3J0KCkge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpXG4gICAgICAgIHJldHVybiAhIShcbiAgICAgICAgICAgICEhd2luZG93LldlYkdMUmVuZGVyaW5nQ29udGV4dCAmJlxuICAgICAgICAgICAgKGNhbnZhcy5nZXRDb250ZXh0KCd3ZWJnbCcpIHx8IGNhbnZhcy5nZXRDb250ZXh0KCdleHBlcmltZW50YWwtd2ViZ2wnKSlcbiAgICAgICAgKVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG59XG4iLCIvLyBUaGUgbW9kdWxlIGNhY2hlXG52YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHR2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuXHRcdC8vIG5vIG1vZHVsZS5pZCBuZWVkZWRcblx0XHQvLyBubyBtb2R1bGUubG9hZGVkIG5lZWRlZFxuXHRcdGV4cG9ydHM6IHt9XG5cdH07XG5cblx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdKG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG5cdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuIiwiLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gKGV4cG9ydHMsIGRlZmluaXRpb24pID0+IHtcblx0Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcblx0XHR9XG5cdH1cbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gKG9iaiwgcHJvcCkgPT4gKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKSIsIi8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uciA9IChleHBvcnRzKSA9PiB7XG5cdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuXHR9XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG59OyIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuLy8gdGhlIGFwcGxpY2F0aW9uXG5leHBvcnQgeyBNYXAgfSBmcm9tICcuL2NvcmUvTWFwLmpzJ1xuZXhwb3J0IHsgR2VvQ2FudmFzIH0gZnJvbSAnLi9jb3JlL0dlb0NhbnZhcy5qcydcbmV4cG9ydCB7IFN0eWxlIH0gZnJvbSAnLi9jb3JlL1N0eWxlLmpzJ1xuZXhwb3J0IHsgTGF5ZXIgfSBmcm9tICcuL2NvcmUvTGF5ZXIuanMnXG5leHBvcnQgeyBEYXRhc2V0IH0gZnJvbSAnLi9jb3JlL0RhdGFzZXQuanMnXG5leHBvcnQgeyBNdWx0aVJlc29sdXRpb25EYXRhc2V0IH0gZnJvbSAnLi9jb3JlL011bHRpUmVzb2x1dGlvbkRhdGFzZXQuanMnXG5cbi8vIGV4cG9ydCBkYXRhc2V0IHR5cGVzXG5leHBvcnQgeyBUaWxlZEdyaWQgfSBmcm9tICcuL2RhdGFzZXQvVGlsZWRHcmlkLmpzJ1xuZXhwb3J0IHsgQ1NWR3JpZCB9IGZyb20gJy4vZGF0YXNldC9DU1ZHcmlkLmpzJ1xuZXhwb3J0IHsgSlNHcmlkIH0gZnJvbSAnLi9kYXRhc2V0L0pTR3JpZC5qcydcblxuLy8gZXhwb3J0IHN0eWxlc1xuZXhwb3J0IHsgU2hhcGVDb2xvclNpemVTdHlsZSB9IGZyb20gJy4vc3R5bGUvU2hhcGVDb2xvclNpemVTdHlsZS5qcydcbmV4cG9ydCB7IFN0cm9rZVN0eWxlIH0gZnJvbSAnLi9zdHlsZS9TdHJva2VTdHlsZS5qcydcbmV4cG9ydCB7IEpveVBsb3RTdHlsZSB9IGZyb20gJy4vc3R5bGUvSm95UGxvdFN0eWxlLmpzJ1xuZXhwb3J0IHsgQ29tcG9zaXRpb25TdHlsZSB9IGZyb20gJy4vc3R5bGUvQ29tcG9zaXRpb25TdHlsZS5qcydcbmV4cG9ydCB7IFNlZ21lbnRTdHlsZSB9IGZyb20gJy4vc3R5bGUvU2VnbWVudFN0eWxlLmpzJ1xuZXhwb3J0IHsgVGV4dFN0eWxlIH0gZnJvbSAnLi9zdHlsZS9UZXh0U3R5bGUuanMnXG5leHBvcnQgeyBQaWxsYXJTdHlsZSB9IGZyb20gJy4vc3R5bGUvUGlsbGFyU3R5bGUuanMnXG5leHBvcnQgeyBTaWRlU3R5bGUgfSBmcm9tICcuL3N0eWxlL1NpZGVTdHlsZS5qcydcbmV4cG9ydCB7IFNoYWRpbmdTdHlsZSB9IGZyb20gJy4vc3R5bGUvU2hhZGluZ1N0eWxlLmpzJ1xuZXhwb3J0IHsgU2lkZUNhdGVnb3J5U3R5bGUgfSBmcm9tICcuL3N0eWxlL1NpZGVDYXRlZ29yeVN0eWxlLmpzJ1xuZXhwb3J0IHsgRG90RGVuc2l0eVN0eWxlIH0gZnJvbSAnLi9zdHlsZS9Eb3REZW5zaXR5U3R5bGUuanMnXG5leHBvcnQgeyBTaWRlVGFuYWthU3R5bGUgfSBmcm9tICcuL3N0eWxlL1NpZGVUYW5ha2FTdHlsZS5qcydcbmV4cG9ydCB7IExlZ29TdHlsZSB9IGZyb20gJy4vc3R5bGUvTGVnb1N0eWxlLmpzJ1xuZXhwb3J0IHsgU3F1YXJlQ29sb3JXZWJHTFN0eWxlIH0gZnJvbSAnLi9zdHlsZS9TcXVhcmVDb2xvcldlYkdMU3R5bGUuanMnXG5leHBvcnQgeyBTcXVhcmVDb2xvckNhdGVnb3J5V2ViR0xTdHlsZSB9IGZyb20gJy4vc3R5bGUvU3F1YXJlQ29sb3JDYXRlZ29yeVdlYkdMU3R5bGUuanMnXG5leHBvcnQgeyBNb3NhaWNTdHlsZSB9IGZyb20gJy4vc3R5bGUvTW9zYWljU3R5bGUuanMnXG5leHBvcnQgeyBOaW5qYVN0YXJTdHlsZSB9IGZyb20gJy4vc3R5bGUvTmluamFTdGFyU3R5bGUuanMnXG5leHBvcnQgeyBUaW1lU2VyaWVzU3R5bGUgfSBmcm9tICcuL3N0eWxlL1RpbWVTZXJpZXNTdHlsZS5qcydcbmV4cG9ydCB7IElzb0ZlbmNlU3R5bGUgfSBmcm9tICcuL3N0eWxlL0lzb0ZlbmNlU3R5bGUuanMnXG5leHBvcnQgeyBJbWFnZVN0eWxlIH0gZnJvbSAnLi9zdHlsZS9JbWFnZVN0eWxlLmpzJ1xuXG4vLyBleHBvcnQgYWRkaXRpb25hbCBsYXllcnNcbmV4cG9ydCB7IEdyaWRMYXllciB9IGZyb20gJy4vbGF5ZXIvR3JpZExheWVyLmpzJ1xuZXhwb3J0IHsgQmFja2dyb3VuZExheWVyIH0gZnJvbSAnLi9sYXllci9CYWNrZ3JvdW5kTGF5ZXIuanMnXG5leHBvcnQgeyBCYWNrZ3JvdW5kTGF5ZXJXTVMgfSBmcm9tICcuL2xheWVyL0JhY2tncm91bmRMYXllcldNUy5qcydcbmV4cG9ydCB7IEJhY2tncm91bmRMYXllckltYWdlIH0gZnJvbSAnLi9sYXllci9CYWNrZ3JvdW5kTGF5ZXJJbWFnZS5qcydcbmV4cG9ydCB7IExhYmVsTGF5ZXIgfSBmcm9tICcuL2xheWVyL0xhYmVsTGF5ZXIuanMnXG5leHBvcnQgeyBHZW9KU09OTGF5ZXIgfSBmcm9tICcuL2xheWVyL0dlb0pTT05MYXllci5qcydcblxuLy8gZXhwb3J0IGxlZ2VuZHNcbmV4cG9ydCB7IENvbG9yTGVnZW5kIH0gZnJvbSAnLi9sZWdlbmQvQ29sb3JMZWdlbmQuanMnXG5leHBvcnQgeyBDb2xvckRpc2NyZXRlTGVnZW5kIH0gZnJvbSAnLi9sZWdlbmQvQ29sb3JEaXNjcmV0ZUxlZ2VuZC5qcydcbmV4cG9ydCB7IENvbG9yQ2F0ZWdvcnlMZWdlbmQgfSBmcm9tICcuL2xlZ2VuZC9Db2xvckNhdGVnb3J5TGVnZW5kLmpzJ1xuZXhwb3J0IHtcbiAgICBTaXplTGVnZW5kLFxuICAgIHNpemVMZWdlbmQsXG4gICAgc2l6ZUxlZ2VuZFZpZXdTY2FsZSxcbiAgICBzaXplRGlzY3JldGVMZWdlbmQsXG4gICAgc2l6ZURpc2NyZXRlVmlld1NjYWxlTGVnZW5kLFxufSBmcm9tICcuL2xlZ2VuZC9TaXplTGVnZW5kLmpzJ1xuZXhwb3J0IHsgT3JpZW50YXRpb25MZWdlbmQsIG9yaWVudGF0aW9uTGVnZW5kIH0gZnJvbSAnLi9sZWdlbmQvT3JpZW50YXRpb25MZWdlbmQuanMnXG5leHBvcnQgeyBUZXJuYXJ5TGVnZW5kIH0gZnJvbSAnLi9sZWdlbmQvVGVybmFyeUxlZ2VuZC5qcydcblxuLy8gZXhwb3J0IHsgZ29Ub1N0cmFpZ2h0LCB6b29tVG8gfSBmcm9tIFwiLi91dGlscy96b29tVXRpbHNcIlxuZXhwb3J0ICogZnJvbSAnLi91dGlscy9zdHJldGNoaW5nLmpzJ1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9zY2FsZS5qcydcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvdGVybmFyeS5qcydcbmV4cG9ydCB7IG5pY2UgfSBmcm9tICcuL3V0aWxzL3V0aWxzLmpzJ1xuXG5pbXBvcnQgeyBHZW9DYW52YXMgfSBmcm9tICcuL2NvcmUvR2VvQ2FudmFzLmpzJ1xuZXhwb3J0IGNvbnN0IGdldFBhcmFtZXRlckJ5TmFtZSA9IEdlb0NhbnZhcy5nZXRQYXJhbWV0ZXJCeU5hbWVcblxuLy8gc2V0IGRlZmF1bHQgZDMgbG9jYWxlXG5pbXBvcnQgeyBmb3JtYXREZWZhdWx0TG9jYWxlIH0gZnJvbSAnZDMtZm9ybWF0J1xuZm9ybWF0RGVmYXVsdExvY2FsZSh7XG4gICAgZGVjaW1hbDogJy4nLFxuICAgIHRob3VzYW5kczogJyAnLFxuICAgIGdyb3VwaW5nOiBbM10sXG4gICAgY3VycmVuY3k6IFsnJywgJ+KCrCddLFxufSlcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==
16594
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUF5QixJQUFJO0FBQzdCLHdDQUF3QyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUk7QUFDMUQsd0NBQXdDLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSTtBQUMxRCwwQ0FBMEMsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSTtBQUNuRSwwQ0FBMEMsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSTtBQUNuRSx3Q0FBd0MsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJO0FBQzFELDBDQUEwQyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJOztBQUVuRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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QUFtQyxlQUFlLFlBQVksU0FBUztBQUN2RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7OztBQ3hIb0M7O0FBRXBDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLDBCQUEwQiw4Q0FBTTtBQUN2QztBQUNBLGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNB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QUN4RTtXQUNBLGdEQUFnRCxhQUFhO1dBQzdEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ05BO0FBQ1k7O0FBRVo7QUFDbUM7QUFDWTtBQUNSO0FBQ0E7QUFDSTtBQUM4Qjs7QUFFekU7QUFDa0Q7QUFDSjtBQUNGOztBQUU1QztBQUNvRTtBQUNoQjtBQUNFO0FBQ1E7QUFDUjtBQUNOO0FBQ0k7QUFDSjtBQUNNO0FBQ1U7QUFDSjtBQUNBO0FBQ1o7QUFDd0I7QUFDZ0I7QUFDcEM7QUFDTTtBQUNFO0FBQ0o7QUFDTjs7QUFFbEQ7QUFDZ0Q7QUFDWTtBQUNNO0FBQ0k7QUFDcEI7QUFDSTs7QUFFdEQ7QUFDcUQ7QUFDZ0I7QUFDQTtBQU90QztBQUNxRDtBQUMzQjs7QUFFekQsWUFBWSx1QkFBdUI7QUFDRTtBQUNMO0FBQ0U7QUFDSzs7QUFFdkMsQ0FBK0M7QUFDeEMsMkJBQTJCLHlEQUFTOztBQUUzQztBQUNBLENBQStDO0FBQy9DLHNEQUFtQjtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ncmlkdml6L3dlYnBhY2svdW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbiIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9hc2NlbmRpbmcuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvYmlzZWN0LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL2Jpc2VjdG9yLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL2Rlc2NlbmRpbmcuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvZXh0ZW50LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL2dyZWF0ZXN0LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL21heC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9tYXhJbmRleC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9taW4uanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvbWluSW5kZXguanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvbnVtYmVyLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL3Blcm11dGUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvcXVhbnRpbGUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvcXVpY2tzZWxlY3QuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvc29ydC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWNvbG9yL3NyYy9jb2xvci5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWNvbG9yL3NyYy9kZWZpbmUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1jb2xvci9zcmMvbGFiLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtY29sb3Ivc3JjL21hdGguanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1kaXNwYXRjaC9zcmMvZGlzcGF0Y2guanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1kcmFnL3NyYy9ub2RyYWcuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1kcmFnL3NyYy9ub2V2ZW50LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtZHN2L3NyYy9jc3YuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1kc3Yvc3JjL2Rzdi5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWRzdi9zcmMvdHN2LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtZWFzZS9zcmMvY3ViaWMuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1mZXRjaC9zcmMvZHN2LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtZmV0Y2gvc3JjL2pzb24uanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1mZXRjaC9zcmMvdGV4dC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvZGVmYXVsdExvY2FsZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvZXhwb25lbnQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1mb3JtYXQvc3JjL2Zvcm1hdERlY2ltYWwuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1mb3JtYXQvc3JjL2Zvcm1hdEdyb3VwLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtZm9ybWF0L3NyYy9mb3JtYXROdW1lcmFscy5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvZm9ybWF0UHJlZml4QXV0by5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvZm9ybWF0Um91bmRlZC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvZm9ybWF0U3BlY2lmaWVyLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtZm9ybWF0L3NyYy9mb3JtYXRUcmltLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtZm9ybWF0L3NyYy9mb3JtYXRUeXBlcy5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvaWRlbnRpdHkuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1mb3JtYXQvc3JjL2xvY2FsZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy9iYXNpcy5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy9iYXNpc0Nsb3NlZC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy9jb2xvci5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy9jb25zdGFudC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy9sYWIuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvbnVtYmVyLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL3JnYi5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy9zdHJpbmcuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvdHJhbnNmb3JtL2RlY29tcG9zZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy90cmFuc2Zvcm0vaW5kZXguanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvdHJhbnNmb3JtL3BhcnNlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL3pvb20uanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1yYW5kb20vc3JjL2RlZmF1bHRTb3VyY2UuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1yYW5kb20vc3JjL25vcm1hbC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNjYWxlL3NyYy9pbml0LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2NhbGUvc3JjL3F1YW50aWxlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9hcnJheS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvY29uc3RhbnQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL2NyZWF0b3IuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL21hdGNoZXIuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL25hbWVzcGFjZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvbmFtZXNwYWNlcy5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvcG9pbnRlci5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vYXBwZW5kLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vYXR0ci5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2NhbGwuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9jbGFzc2VkLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vY2xvbmUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9kYXRhLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vZGF0dW0uanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9kaXNwYXRjaC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2VhY2guanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9lbXB0eS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2VudGVyLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vZXhpdC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2ZpbHRlci5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2h0bWwuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9pbmRleC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2luc2VydC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2l0ZXJhdG9yLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vam9pbi5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2xvd2VyLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vbWVyZ2UuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9ub2RlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vbm9kZXMuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9vbi5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL29yZGVyLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vcHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9yYWlzZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3JlbW92ZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3NlbGVjdC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3NlbGVjdEFsbC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3NlbGVjdENoaWxkLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vc2VsZWN0Q2hpbGRyZW4uanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9zaXplLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vc29ydC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3NwYXJzZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3N0eWxlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vdGV4dC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0b3IuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdG9yQWxsLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zb3VyY2VFdmVudC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvd2luZG93LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtdGltZXIvc3JjL3RpbWVvdXQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy10aW1lci9zcmMvdGltZXIuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy9hY3RpdmUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy9pbmRleC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL2ludGVycnVwdC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3NlbGVjdGlvbi9pbmRleC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3NlbGVjdGlvbi9pbnRlcnJ1cHQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy9zZWxlY3Rpb24vdHJhbnNpdGlvbi5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vYXR0ci5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vYXR0clR3ZWVuLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9kZWxheS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vZHVyYXRpb24uanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL2Vhc2UuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL2Vhc2VWYXJ5aW5nLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9lbmQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL2ZpbHRlci5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vaW5kZXguanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL2ludGVycG9sYXRlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9tZXJnZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vb24uanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3JlbW92ZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vc2NoZWR1bGUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3NlbGVjdC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vc2VsZWN0QWxsLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9zZWxlY3Rpb24uanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3N0eWxlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9zdHlsZVR3ZWVuLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi90ZXh0LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi90ZXh0VHdlZW4uanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3RyYW5zaXRpb24uanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3R3ZWVuLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtem9vbS9zcmMvY29uc3RhbnQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL25vZGVfbW9kdWxlcy9kMy16b29tL3NyYy9ldmVudC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXpvb20vc3JjL2luZGV4LmpzIiwid2VicGFjazovL2dyaWR2aXovLi9ub2RlX21vZHVsZXMvZDMtem9vbS9zcmMvbm9ldmVudC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXpvb20vc3JjL3RyYW5zZm9ybS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vbm9kZV9tb2R1bGVzL2QzLXpvb20vc3JjL3pvb20uanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9idXR0b24vQnV0dG9uLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvYnV0dG9uL0Z1bGxzY3JlZW5CdXR0b24uanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9idXR0b24vWm9vbUJ1dHRvbnMuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9jb3JlL0RhdGFzZXQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9jb3JlL0RyYXdhYmxlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvY29yZS9HZW9DYW52YXMuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9jb3JlL0xheWVyLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvY29yZS9MZWdlbmQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9jb3JlL01hcC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL2NvcmUvTXVsdGlSZXNvbHV0aW9uRGF0YXNldC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL2NvcmUvU3R5bGUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9jb3JlL1Rvb2x0aXAuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9kYXRhc2V0L0NTVkdyaWQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9kYXRhc2V0L0pTR3JpZC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL2RhdGFzZXQvVGlsZWRHcmlkLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvbGF5ZXIvQmFja2dyb3VuZExheWVyLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvbGF5ZXIvQmFja2dyb3VuZExheWVySW1hZ2UuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9sYXllci9CYWNrZ3JvdW5kTGF5ZXJXTVMuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9sYXllci9HZW9KU09OTGF5ZXIuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9sYXllci9HcmlkTGF5ZXIuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9sYXllci9MYWJlbExheWVyLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvbGVnZW5kL0NvbG9yQ2F0ZWdvcnlMZWdlbmQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9sZWdlbmQvQ29sb3JEaXNjcmV0ZUxlZ2VuZC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL2xlZ2VuZC9Db2xvckxlZ2VuZC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL2xlZ2VuZC9PcmllbnRhdGlvbkxlZ2VuZC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL2xlZ2VuZC9TaXplTGVnZW5kLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvbGVnZW5kL1Rlcm5hcnlMZWdlbmQuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9zdHlsZS9Db21wb3NpdGlvblN0eWxlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvc3R5bGUvRG90RGVuc2l0eVN0eWxlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvc3R5bGUvSW1hZ2VTdHlsZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL3N0eWxlL0lzb0ZlbmNlU3R5bGUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9zdHlsZS9Kb3lQbG90U3R5bGUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9zdHlsZS9MZWdvU3R5bGUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9zdHlsZS9Nb3NhaWNTdHlsZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL3N0eWxlL05pbmphU3RhclN0eWxlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvc3R5bGUvUGlsbGFyU3R5bGUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9zdHlsZS9TZWdtZW50U3R5bGUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9zdHlsZS9TaGFkaW5nU3R5bGUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9zdHlsZS9TaGFwZUNvbG9yU2l6ZVN0eWxlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvc3R5bGUvU2lkZUNhdGVnb3J5U3R5bGUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9zdHlsZS9TaWRlU3R5bGUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9zdHlsZS9TaWRlVGFuYWthU3R5bGUuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy9zdHlsZS9TcXVhcmVDb2xvckNhdGVnb3J5V2ViR0xTdHlsZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL3N0eWxlL1NxdWFyZUNvbG9yV2ViR0xTdHlsZS5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL3N0eWxlL1N0cm9rZVN0eWxlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvc3R5bGUvVGV4dFN0eWxlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvc3R5bGUvVGltZVNlcmllc1N0eWxlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvdXRpbHMvV2ViR0xTcXVhcmVDb2xvcmluZy5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL3V0aWxzL1dlYkdMU3F1YXJlQ29sb3JpbmdBZHZhbmNlZC5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL3V0aWxzL3NjYWxlLmpzIiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvdXRpbHMvc3RyZXRjaGluZy5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL3V0aWxzL3Rlcm5hcnkuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei8uL3NyYy91dGlscy91dGlscy5qcyIsIndlYnBhY2s6Ly9ncmlkdml6Ly4vc3JjL3V0aWxzL3dlYkdMVXRpbHMuanMiLCJ3ZWJwYWNrOi8vZ3JpZHZpei93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9ncmlkdml6L3dlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyIsIndlYnBhY2s6Ly9ncmlkdml6L3dlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQiLCJ3ZWJwYWNrOi8vZ3JpZHZpei93ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0Iiwid2VicGFjazovL2dyaWR2aXovLi9zcmMvaW5kZXguanMiXSwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoW10sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wiZ3JpZHZpelwiXSA9IGZhY3RvcnkoKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJncmlkdml6XCJdID0gZmFjdG9yeSgpO1xufSkoc2VsZiwgKCkgPT4ge1xucmV0dXJuICIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGFzY2VuZGluZyhhLCBiKSB7XG4gIHJldHVybiBhID09IG51bGwgfHwgYiA9PSBudWxsID8gTmFOIDogYSA8IGIgPyAtMSA6IGEgPiBiID8gMSA6IGEgPj0gYiA/IDAgOiBOYU47XG59XG4iLCJpbXBvcnQgYXNjZW5kaW5nIGZyb20gXCIuL2FzY2VuZGluZy5qc1wiO1xuaW1wb3J0IGJpc2VjdG9yIGZyb20gXCIuL2Jpc2VjdG9yLmpzXCI7XG5pbXBvcnQgbnVtYmVyIGZyb20gXCIuL251bWJlci5qc1wiO1xuXG5jb25zdCBhc2NlbmRpbmdCaXNlY3QgPSBiaXNlY3Rvcihhc2NlbmRpbmcpO1xuZXhwb3J0IGNvbnN0IGJpc2VjdFJpZ2h0ID0gYXNjZW5kaW5nQmlzZWN0LnJpZ2h0O1xuZXhwb3J0IGNvbnN0IGJpc2VjdExlZnQgPSBhc2NlbmRpbmdCaXNlY3QubGVmdDtcbmV4cG9ydCBjb25zdCBiaXNlY3RDZW50ZXIgPSBiaXNlY3RvcihudW1iZXIpLmNlbnRlcjtcbmV4cG9ydCBkZWZhdWx0IGJpc2VjdFJpZ2h0O1xuIiwiaW1wb3J0IGFzY2VuZGluZyBmcm9tIFwiLi9hc2NlbmRpbmcuanNcIjtcbmltcG9ydCBkZXNjZW5kaW5nIGZyb20gXCIuL2Rlc2NlbmRpbmcuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYmlzZWN0b3IoZikge1xuICBsZXQgY29tcGFyZTEsIGNvbXBhcmUyLCBkZWx0YTtcblxuICAvLyBJZiBhbiBhY2Nlc3NvciBpcyBzcGVjaWZpZWQsIHByb21vdGUgaXQgdG8gYSBjb21wYXJhdG9yLiBJbiB0aGlzIGNhc2Ugd2VcbiAgLy8gY2FuIHRlc3Qgd2hldGhlciB0aGUgc2VhcmNoIHZhbHVlIGlzIChzZWxmLSkgY29tcGFyYWJsZS4gV2UgY2Fu4oCZdCBkbyB0aGlzXG4gIC8vIGZvciBhIGNvbXBhcmF0b3IgKGV4Y2VwdCBmb3Igc3BlY2lmaWMsIGtub3duIGNvbXBhcmF0b3JzKSBiZWNhdXNlIHdlIGNhbuKAmXRcbiAgLy8gdGVsbCBpZiB0aGUgY29tcGFyYXRvciBpcyBzeW1tZXRyaWMsIGFuZCBhbiBhc3ltbWV0cmljIGNvbXBhcmF0b3IgY2Fu4oCZdCBiZVxuICAvLyB1c2VkIHRvIHRlc3Qgd2hldGhlciBhIHNpbmdsZSB2YWx1ZSBpcyBjb21wYXJhYmxlLlxuICBpZiAoZi5sZW5ndGggIT09IDIpIHtcbiAgICBjb21wYXJlMSA9IGFzY2VuZGluZztcbiAgICBjb21wYXJlMiA9IChkLCB4KSA9PiBhc2NlbmRpbmcoZihkKSwgeCk7XG4gICAgZGVsdGEgPSAoZCwgeCkgPT4gZihkKSAtIHg7XG4gIH0gZWxzZSB7XG4gICAgY29tcGFyZTEgPSBmID09PSBhc2NlbmRpbmcgfHwgZiA9PT0gZGVzY2VuZGluZyA/IGYgOiB6ZXJvO1xuICAgIGNvbXBhcmUyID0gZjtcbiAgICBkZWx0YSA9IGY7XG4gIH1cblxuICBmdW5jdGlvbiBsZWZ0KGEsIHgsIGxvID0gMCwgaGkgPSBhLmxlbmd0aCkge1xuICAgIGlmIChsbyA8IGhpKSB7XG4gICAgICBpZiAoY29tcGFyZTEoeCwgeCkgIT09IDApIHJldHVybiBoaTtcbiAgICAgIGRvIHtcbiAgICAgICAgY29uc3QgbWlkID0gKGxvICsgaGkpID4+PiAxO1xuICAgICAgICBpZiAoY29tcGFyZTIoYVttaWRdLCB4KSA8IDApIGxvID0gbWlkICsgMTtcbiAgICAgICAgZWxzZSBoaSA9IG1pZDtcbiAgICAgIH0gd2hpbGUgKGxvIDwgaGkpO1xuICAgIH1cbiAgICByZXR1cm4gbG87XG4gIH1cblxuICBmdW5jdGlvbiByaWdodChhLCB4LCBsbyA9IDAsIGhpID0gYS5sZW5ndGgpIHtcbiAgICBpZiAobG8gPCBoaSkge1xuICAgICAgaWYgKGNvbXBhcmUxKHgsIHgpICE9PSAwKSByZXR1cm4gaGk7XG4gICAgICBkbyB7XG4gICAgICAgIGNvbnN0IG1pZCA9IChsbyArIGhpKSA+Pj4gMTtcbiAgICAgICAgaWYgKGNvbXBhcmUyKGFbbWlkXSwgeCkgPD0gMCkgbG8gPSBtaWQgKyAxO1xuICAgICAgICBlbHNlIGhpID0gbWlkO1xuICAgICAgfSB3aGlsZSAobG8gPCBoaSk7XG4gICAgfVxuICAgIHJldHVybiBsbztcbiAgfVxuXG4gIGZ1bmN0aW9uIGNlbnRlcihhLCB4LCBsbyA9IDAsIGhpID0gYS5sZW5ndGgpIHtcbiAgICBjb25zdCBpID0gbGVmdChhLCB4LCBsbywgaGkgLSAxKTtcbiAgICByZXR1cm4gaSA+IGxvICYmIGRlbHRhKGFbaSAtIDFdLCB4KSA+IC1kZWx0YShhW2ldLCB4KSA/IGkgLSAxIDogaTtcbiAgfVxuXG4gIHJldHVybiB7bGVmdCwgY2VudGVyLCByaWdodH07XG59XG5cbmZ1bmN0aW9uIHplcm8oKSB7XG4gIHJldHVybiAwO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZGVzY2VuZGluZyhhLCBiKSB7XG4gIHJldHVybiBhID09IG51bGwgfHwgYiA9PSBudWxsID8gTmFOXG4gICAgOiBiIDwgYSA/IC0xXG4gICAgOiBiID4gYSA/IDFcbiAgICA6IGIgPj0gYSA/IDBcbiAgICA6IE5hTjtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGV4dGVudCh2YWx1ZXMsIHZhbHVlb2YpIHtcbiAgbGV0IG1pbjtcbiAgbGV0IG1heDtcbiAgaWYgKHZhbHVlb2YgPT09IHVuZGVmaW5lZCkge1xuICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgICBpZiAobWluID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAodmFsdWUgPj0gdmFsdWUpIG1pbiA9IG1heCA9IHZhbHVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChtaW4gPiB2YWx1ZSkgbWluID0gdmFsdWU7XG4gICAgICAgICAgaWYgKG1heCA8IHZhbHVlKSBtYXggPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBsZXQgaW5kZXggPSAtMTtcbiAgICBmb3IgKGxldCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICAgIGlmICgodmFsdWUgPSB2YWx1ZW9mKHZhbHVlLCArK2luZGV4LCB2YWx1ZXMpKSAhPSBudWxsKSB7XG4gICAgICAgIGlmIChtaW4gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGlmICh2YWx1ZSA+PSB2YWx1ZSkgbWluID0gbWF4ID0gdmFsdWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKG1pbiA+IHZhbHVlKSBtaW4gPSB2YWx1ZTtcbiAgICAgICAgICBpZiAobWF4IDwgdmFsdWUpIG1heCA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBbbWluLCBtYXhdO1xufVxuIiwiaW1wb3J0IGFzY2VuZGluZyBmcm9tIFwiLi9hc2NlbmRpbmcuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ3JlYXRlc3QodmFsdWVzLCBjb21wYXJlID0gYXNjZW5kaW5nKSB7XG4gIGxldCBtYXg7XG4gIGxldCBkZWZpbmVkID0gZmFsc2U7XG4gIGlmIChjb21wYXJlLmxlbmd0aCA9PT0gMSkge1xuICAgIGxldCBtYXhWYWx1ZTtcbiAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgdmFsdWVzKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGNvbXBhcmUoZWxlbWVudCk7XG4gICAgICBpZiAoZGVmaW5lZFxuICAgICAgICAgID8gYXNjZW5kaW5nKHZhbHVlLCBtYXhWYWx1ZSkgPiAwXG4gICAgICAgICAgOiBhc2NlbmRpbmcodmFsdWUsIHZhbHVlKSA9PT0gMCkge1xuICAgICAgICBtYXggPSBlbGVtZW50O1xuICAgICAgICBtYXhWYWx1ZSA9IHZhbHVlO1xuICAgICAgICBkZWZpbmVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICAgIGlmIChkZWZpbmVkXG4gICAgICAgICAgPyBjb21wYXJlKHZhbHVlLCBtYXgpID4gMFxuICAgICAgICAgIDogY29tcGFyZSh2YWx1ZSwgdmFsdWUpID09PSAwKSB7XG4gICAgICAgIG1heCA9IHZhbHVlO1xuICAgICAgICBkZWZpbmVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1heDtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG1heCh2YWx1ZXMsIHZhbHVlb2YpIHtcbiAgbGV0IG1heDtcbiAgaWYgKHZhbHVlb2YgPT09IHVuZGVmaW5lZCkge1xuICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICBpZiAodmFsdWUgIT0gbnVsbFxuICAgICAgICAgICYmIChtYXggPCB2YWx1ZSB8fCAobWF4ID09PSB1bmRlZmluZWQgJiYgdmFsdWUgPj0gdmFsdWUpKSkge1xuICAgICAgICBtYXggPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbGV0IGluZGV4ID0gLTE7XG4gICAgZm9yIChsZXQgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICBpZiAoKHZhbHVlID0gdmFsdWVvZih2YWx1ZSwgKytpbmRleCwgdmFsdWVzKSkgIT0gbnVsbFxuICAgICAgICAgICYmIChtYXggPCB2YWx1ZSB8fCAobWF4ID09PSB1bmRlZmluZWQgJiYgdmFsdWUgPj0gdmFsdWUpKSkge1xuICAgICAgICBtYXggPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1heDtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG1heEluZGV4KHZhbHVlcywgdmFsdWVvZikge1xuICBsZXQgbWF4O1xuICBsZXQgbWF4SW5kZXggPSAtMTtcbiAgbGV0IGluZGV4ID0gLTE7XG4gIGlmICh2YWx1ZW9mID09PSB1bmRlZmluZWQpIHtcbiAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgICAgKytpbmRleDtcbiAgICAgIGlmICh2YWx1ZSAhPSBudWxsXG4gICAgICAgICAgJiYgKG1heCA8IHZhbHVlIHx8IChtYXggPT09IHVuZGVmaW5lZCAmJiB2YWx1ZSA+PSB2YWx1ZSkpKSB7XG4gICAgICAgIG1heCA9IHZhbHVlLCBtYXhJbmRleCA9IGluZGV4O1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3IgKGxldCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICAgIGlmICgodmFsdWUgPSB2YWx1ZW9mKHZhbHVlLCArK2luZGV4LCB2YWx1ZXMpKSAhPSBudWxsXG4gICAgICAgICAgJiYgKG1heCA8IHZhbHVlIHx8IChtYXggPT09IHVuZGVmaW5lZCAmJiB2YWx1ZSA+PSB2YWx1ZSkpKSB7XG4gICAgICAgIG1heCA9IHZhbHVlLCBtYXhJbmRleCA9IGluZGV4O1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gbWF4SW5kZXg7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtaW4odmFsdWVzLCB2YWx1ZW9mKSB7XG4gIGxldCBtaW47XG4gIGlmICh2YWx1ZW9mID09PSB1bmRlZmluZWQpIHtcbiAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgICAgaWYgKHZhbHVlICE9IG51bGxcbiAgICAgICAgICAmJiAobWluID4gdmFsdWUgfHwgKG1pbiA9PT0gdW5kZWZpbmVkICYmIHZhbHVlID49IHZhbHVlKSkpIHtcbiAgICAgICAgbWluID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGxldCBpbmRleCA9IC0xO1xuICAgIGZvciAobGV0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgICAgaWYgKCh2YWx1ZSA9IHZhbHVlb2YodmFsdWUsICsraW5kZXgsIHZhbHVlcykpICE9IG51bGxcbiAgICAgICAgICAmJiAobWluID4gdmFsdWUgfHwgKG1pbiA9PT0gdW5kZWZpbmVkICYmIHZhbHVlID49IHZhbHVlKSkpIHtcbiAgICAgICAgbWluID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBtaW47XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtaW5JbmRleCh2YWx1ZXMsIHZhbHVlb2YpIHtcbiAgbGV0IG1pbjtcbiAgbGV0IG1pbkluZGV4ID0gLTE7XG4gIGxldCBpbmRleCA9IC0xO1xuICBpZiAodmFsdWVvZiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICAgICsraW5kZXg7XG4gICAgICBpZiAodmFsdWUgIT0gbnVsbFxuICAgICAgICAgICYmIChtaW4gPiB2YWx1ZSB8fCAobWluID09PSB1bmRlZmluZWQgJiYgdmFsdWUgPj0gdmFsdWUpKSkge1xuICAgICAgICBtaW4gPSB2YWx1ZSwgbWluSW5kZXggPSBpbmRleDtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZm9yIChsZXQgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICBpZiAoKHZhbHVlID0gdmFsdWVvZih2YWx1ZSwgKytpbmRleCwgdmFsdWVzKSkgIT0gbnVsbFxuICAgICAgICAgICYmIChtaW4gPiB2YWx1ZSB8fCAobWluID09PSB1bmRlZmluZWQgJiYgdmFsdWUgPj0gdmFsdWUpKSkge1xuICAgICAgICBtaW4gPSB2YWx1ZSwgbWluSW5kZXggPSBpbmRleDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1pbkluZGV4O1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbnVtYmVyKHgpIHtcbiAgcmV0dXJuIHggPT09IG51bGwgPyBOYU4gOiAreDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uKiBudW1iZXJzKHZhbHVlcywgdmFsdWVvZikge1xuICBpZiAodmFsdWVvZiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZm9yIChsZXQgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiAodmFsdWUgPSArdmFsdWUpID49IHZhbHVlKSB7XG4gICAgICAgIHlpZWxkIHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBsZXQgaW5kZXggPSAtMTtcbiAgICBmb3IgKGxldCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICAgIGlmICgodmFsdWUgPSB2YWx1ZW9mKHZhbHVlLCArK2luZGV4LCB2YWx1ZXMpKSAhPSBudWxsICYmICh2YWx1ZSA9ICt2YWx1ZSkgPj0gdmFsdWUpIHtcbiAgICAgICAgeWllbGQgdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBwZXJtdXRlKHNvdXJjZSwga2V5cykge1xuICByZXR1cm4gQXJyYXkuZnJvbShrZXlzLCBrZXkgPT4gc291cmNlW2tleV0pO1xufVxuIiwiaW1wb3J0IG1heCBmcm9tIFwiLi9tYXguanNcIjtcbmltcG9ydCBtYXhJbmRleCBmcm9tIFwiLi9tYXhJbmRleC5qc1wiO1xuaW1wb3J0IG1pbiBmcm9tIFwiLi9taW4uanNcIjtcbmltcG9ydCBtaW5JbmRleCBmcm9tIFwiLi9taW5JbmRleC5qc1wiO1xuaW1wb3J0IHF1aWNrc2VsZWN0IGZyb20gXCIuL3F1aWNrc2VsZWN0LmpzXCI7XG5pbXBvcnQgbnVtYmVyLCB7bnVtYmVyc30gZnJvbSBcIi4vbnVtYmVyLmpzXCI7XG5pbXBvcnQge2FzY2VuZGluZ0RlZmluZWR9IGZyb20gXCIuL3NvcnQuanNcIjtcbmltcG9ydCBncmVhdGVzdCBmcm9tIFwiLi9ncmVhdGVzdC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBxdWFudGlsZSh2YWx1ZXMsIHAsIHZhbHVlb2YpIHtcbiAgdmFsdWVzID0gRmxvYXQ2NEFycmF5LmZyb20obnVtYmVycyh2YWx1ZXMsIHZhbHVlb2YpKTtcbiAgaWYgKCEobiA9IHZhbHVlcy5sZW5ndGgpIHx8IGlzTmFOKHAgPSArcCkpIHJldHVybjtcbiAgaWYgKHAgPD0gMCB8fCBuIDwgMikgcmV0dXJuIG1pbih2YWx1ZXMpO1xuICBpZiAocCA+PSAxKSByZXR1cm4gbWF4KHZhbHVlcyk7XG4gIHZhciBuLFxuICAgICAgaSA9IChuIC0gMSkgKiBwLFxuICAgICAgaTAgPSBNYXRoLmZsb29yKGkpLFxuICAgICAgdmFsdWUwID0gbWF4KHF1aWNrc2VsZWN0KHZhbHVlcywgaTApLnN1YmFycmF5KDAsIGkwICsgMSkpLFxuICAgICAgdmFsdWUxID0gbWluKHZhbHVlcy5zdWJhcnJheShpMCArIDEpKTtcbiAgcmV0dXJuIHZhbHVlMCArICh2YWx1ZTEgLSB2YWx1ZTApICogKGkgLSBpMCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBxdWFudGlsZVNvcnRlZCh2YWx1ZXMsIHAsIHZhbHVlb2YgPSBudW1iZXIpIHtcbiAgaWYgKCEobiA9IHZhbHVlcy5sZW5ndGgpIHx8IGlzTmFOKHAgPSArcCkpIHJldHVybjtcbiAgaWYgKHAgPD0gMCB8fCBuIDwgMikgcmV0dXJuICt2YWx1ZW9mKHZhbHVlc1swXSwgMCwgdmFsdWVzKTtcbiAgaWYgKHAgPj0gMSkgcmV0dXJuICt2YWx1ZW9mKHZhbHVlc1tuIC0gMV0sIG4gLSAxLCB2YWx1ZXMpO1xuICB2YXIgbixcbiAgICAgIGkgPSAobiAtIDEpICogcCxcbiAgICAgIGkwID0gTWF0aC5mbG9vcihpKSxcbiAgICAgIHZhbHVlMCA9ICt2YWx1ZW9mKHZhbHVlc1tpMF0sIGkwLCB2YWx1ZXMpLFxuICAgICAgdmFsdWUxID0gK3ZhbHVlb2YodmFsdWVzW2kwICsgMV0sIGkwICsgMSwgdmFsdWVzKTtcbiAgcmV0dXJuIHZhbHVlMCArICh2YWx1ZTEgLSB2YWx1ZTApICogKGkgLSBpMCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBxdWFudGlsZUluZGV4KHZhbHVlcywgcCwgdmFsdWVvZiA9IG51bWJlcikge1xuICBpZiAoaXNOYU4ocCA9ICtwKSkgcmV0dXJuO1xuICBudW1iZXJzID0gRmxvYXQ2NEFycmF5LmZyb20odmFsdWVzLCAoXywgaSkgPT4gbnVtYmVyKHZhbHVlb2YodmFsdWVzW2ldLCBpLCB2YWx1ZXMpKSk7XG4gIGlmIChwIDw9IDApIHJldHVybiBtaW5JbmRleChudW1iZXJzKTtcbiAgaWYgKHAgPj0gMSkgcmV0dXJuIG1heEluZGV4KG51bWJlcnMpO1xuICB2YXIgbnVtYmVycyxcbiAgICAgIGluZGV4ID0gVWludDMyQXJyYXkuZnJvbSh2YWx1ZXMsIChfLCBpKSA9PiBpKSxcbiAgICAgIGogPSBudW1iZXJzLmxlbmd0aCAtIDEsXG4gICAgICBpID0gTWF0aC5mbG9vcihqICogcCk7XG4gIHF1aWNrc2VsZWN0KGluZGV4LCBpLCAwLCBqLCAoaSwgaikgPT4gYXNjZW5kaW5nRGVmaW5lZChudW1iZXJzW2ldLCBudW1iZXJzW2pdKSk7XG4gIGkgPSBncmVhdGVzdChpbmRleC5zdWJhcnJheSgwLCBpICsgMSksIChpKSA9PiBudW1iZXJzW2ldKTtcbiAgcmV0dXJuIGkgPj0gMCA/IGkgOiAtMTtcbn1cbiIsImltcG9ydCB7YXNjZW5kaW5nRGVmaW5lZCwgY29tcGFyZURlZmluZWR9IGZyb20gXCIuL3NvcnQuanNcIjtcblxuLy8gQmFzZWQgb24gaHR0cHM6Ly9naXRodWIuY29tL21vdXJuZXIvcXVpY2tzZWxlY3Rcbi8vIElTQyBsaWNlbnNlLCBDb3B5cmlnaHQgMjAxOCBWbGFkaW1pciBBZ2Fmb25raW4uXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBxdWlja3NlbGVjdChhcnJheSwgaywgbGVmdCA9IDAsIHJpZ2h0ID0gSW5maW5pdHksIGNvbXBhcmUpIHtcbiAgayA9IE1hdGguZmxvb3Ioayk7XG4gIGxlZnQgPSBNYXRoLmZsb29yKE1hdGgubWF4KDAsIGxlZnQpKTtcbiAgcmlnaHQgPSBNYXRoLmZsb29yKE1hdGgubWluKGFycmF5Lmxlbmd0aCAtIDEsIHJpZ2h0KSk7XG5cbiAgaWYgKCEobGVmdCA8PSBrICYmIGsgPD0gcmlnaHQpKSByZXR1cm4gYXJyYXk7XG5cbiAgY29tcGFyZSA9IGNvbXBhcmUgPT09IHVuZGVmaW5lZCA/IGFzY2VuZGluZ0RlZmluZWQgOiBjb21wYXJlRGVmaW5lZChjb21wYXJlKTtcblxuICB3aGlsZSAocmlnaHQgPiBsZWZ0KSB7XG4gICAgaWYgKHJpZ2h0IC0gbGVmdCA+IDYwMCkge1xuICAgICAgY29uc3QgbiA9IHJpZ2h0IC0gbGVmdCArIDE7XG4gICAgICBjb25zdCBtID0gayAtIGxlZnQgKyAxO1xuICAgICAgY29uc3QgeiA9IE1hdGgubG9nKG4pO1xuICAgICAgY29uc3QgcyA9IDAuNSAqIE1hdGguZXhwKDIgKiB6IC8gMyk7XG4gICAgICBjb25zdCBzZCA9IDAuNSAqIE1hdGguc3FydCh6ICogcyAqIChuIC0gcykgLyBuKSAqIChtIC0gbiAvIDIgPCAwID8gLTEgOiAxKTtcbiAgICAgIGNvbnN0IG5ld0xlZnQgPSBNYXRoLm1heChsZWZ0LCBNYXRoLmZsb29yKGsgLSBtICogcyAvIG4gKyBzZCkpO1xuICAgICAgY29uc3QgbmV3UmlnaHQgPSBNYXRoLm1pbihyaWdodCwgTWF0aC5mbG9vcihrICsgKG4gLSBtKSAqIHMgLyBuICsgc2QpKTtcbiAgICAgIHF1aWNrc2VsZWN0KGFycmF5LCBrLCBuZXdMZWZ0LCBuZXdSaWdodCwgY29tcGFyZSk7XG4gICAgfVxuXG4gICAgY29uc3QgdCA9IGFycmF5W2tdO1xuICAgIGxldCBpID0gbGVmdDtcbiAgICBsZXQgaiA9IHJpZ2h0O1xuXG4gICAgc3dhcChhcnJheSwgbGVmdCwgayk7XG4gICAgaWYgKGNvbXBhcmUoYXJyYXlbcmlnaHRdLCB0KSA+IDApIHN3YXAoYXJyYXksIGxlZnQsIHJpZ2h0KTtcblxuICAgIHdoaWxlIChpIDwgaikge1xuICAgICAgc3dhcChhcnJheSwgaSwgaiksICsraSwgLS1qO1xuICAgICAgd2hpbGUgKGNvbXBhcmUoYXJyYXlbaV0sIHQpIDwgMCkgKytpO1xuICAgICAgd2hpbGUgKGNvbXBhcmUoYXJyYXlbal0sIHQpID4gMCkgLS1qO1xuICAgIH1cblxuICAgIGlmIChjb21wYXJlKGFycmF5W2xlZnRdLCB0KSA9PT0gMCkgc3dhcChhcnJheSwgbGVmdCwgaik7XG4gICAgZWxzZSArK2osIHN3YXAoYXJyYXksIGosIHJpZ2h0KTtcblxuICAgIGlmIChqIDw9IGspIGxlZnQgPSBqICsgMTtcbiAgICBpZiAoayA8PSBqKSByaWdodCA9IGogLSAxO1xuICB9XG5cbiAgcmV0dXJuIGFycmF5O1xufVxuXG5mdW5jdGlvbiBzd2FwKGFycmF5LCBpLCBqKSB7XG4gIGNvbnN0IHQgPSBhcnJheVtpXTtcbiAgYXJyYXlbaV0gPSBhcnJheVtqXTtcbiAgYXJyYXlbal0gPSB0O1xufVxuIiwiaW1wb3J0IGFzY2VuZGluZyBmcm9tIFwiLi9hc2NlbmRpbmcuanNcIjtcbmltcG9ydCBwZXJtdXRlIGZyb20gXCIuL3Blcm11dGUuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc29ydCh2YWx1ZXMsIC4uLkYpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZXNbU3ltYm9sLml0ZXJhdG9yXSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwidmFsdWVzIGlzIG5vdCBpdGVyYWJsZVwiKTtcbiAgdmFsdWVzID0gQXJyYXkuZnJvbSh2YWx1ZXMpO1xuICBsZXQgW2ZdID0gRjtcbiAgaWYgKChmICYmIGYubGVuZ3RoICE9PSAyKSB8fCBGLmxlbmd0aCA+IDEpIHtcbiAgICBjb25zdCBpbmRleCA9IFVpbnQzMkFycmF5LmZyb20odmFsdWVzLCAoZCwgaSkgPT4gaSk7XG4gICAgaWYgKEYubGVuZ3RoID4gMSkge1xuICAgICAgRiA9IEYubWFwKGYgPT4gdmFsdWVzLm1hcChmKSk7XG4gICAgICBpbmRleC5zb3J0KChpLCBqKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgZiBvZiBGKSB7XG4gICAgICAgICAgY29uc3QgYyA9IGFzY2VuZGluZ0RlZmluZWQoZltpXSwgZltqXSk7XG4gICAgICAgICAgaWYgKGMpIHJldHVybiBjO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZiA9IHZhbHVlcy5tYXAoZik7XG4gICAgICBpbmRleC5zb3J0KChpLCBqKSA9PiBhc2NlbmRpbmdEZWZpbmVkKGZbaV0sIGZbal0pKTtcbiAgICB9XG4gICAgcmV0dXJuIHBlcm11dGUodmFsdWVzLCBpbmRleCk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlcy5zb3J0KGNvbXBhcmVEZWZpbmVkKGYpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXBhcmVEZWZpbmVkKGNvbXBhcmUgPSBhc2NlbmRpbmcpIHtcbiAgaWYgKGNvbXBhcmUgPT09IGFzY2VuZGluZykgcmV0dXJuIGFzY2VuZGluZ0RlZmluZWQ7XG4gIGlmICh0eXBlb2YgY29tcGFyZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiY29tcGFyZSBpcyBub3QgYSBmdW5jdGlvblwiKTtcbiAgcmV0dXJuIChhLCBiKSA9PiB7XG4gICAgY29uc3QgeCA9IGNvbXBhcmUoYSwgYik7XG4gICAgaWYgKHggfHwgeCA9PT0gMCkgcmV0dXJuIHg7XG4gICAgcmV0dXJuIChjb21wYXJlKGIsIGIpID09PSAwKSAtIChjb21wYXJlKGEsIGEpID09PSAwKTtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFzY2VuZGluZ0RlZmluZWQoYSwgYikge1xuICByZXR1cm4gKGEgPT0gbnVsbCB8fCAhKGEgPj0gYSkpIC0gKGIgPT0gbnVsbCB8fCAhKGIgPj0gYikpIHx8IChhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogMCk7XG59XG4iLCJpbXBvcnQgZGVmaW5lLCB7ZXh0ZW5kfSBmcm9tIFwiLi9kZWZpbmUuanNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIENvbG9yKCkge31cblxuZXhwb3J0IHZhciBkYXJrZXIgPSAwLjc7XG5leHBvcnQgdmFyIGJyaWdodGVyID0gMSAvIGRhcmtlcjtcblxudmFyIHJlSSA9IFwiXFxcXHMqKFsrLV0/XFxcXGQrKVxcXFxzKlwiLFxuICAgIHJlTiA9IFwiXFxcXHMqKFsrLV0/KD86XFxcXGQqXFxcXC4pP1xcXFxkKyg/OltlRV1bKy1dP1xcXFxkKyk/KVxcXFxzKlwiLFxuICAgIHJlUCA9IFwiXFxcXHMqKFsrLV0/KD86XFxcXGQqXFxcXC4pP1xcXFxkKyg/OltlRV1bKy1dP1xcXFxkKyk/KSVcXFxccypcIixcbiAgICByZUhleCA9IC9eIyhbMC05YS1mXXszLDh9KSQvLFxuICAgIHJlUmdiSW50ZWdlciA9IG5ldyBSZWdFeHAoYF5yZ2JcXFxcKCR7cmVJfSwke3JlSX0sJHtyZUl9XFxcXCkkYCksXG4gICAgcmVSZ2JQZXJjZW50ID0gbmV3IFJlZ0V4cChgXnJnYlxcXFwoJHtyZVB9LCR7cmVQfSwke3JlUH1cXFxcKSRgKSxcbiAgICByZVJnYmFJbnRlZ2VyID0gbmV3IFJlZ0V4cChgXnJnYmFcXFxcKCR7cmVJfSwke3JlSX0sJHtyZUl9LCR7cmVOfVxcXFwpJGApLFxuICAgIHJlUmdiYVBlcmNlbnQgPSBuZXcgUmVnRXhwKGBecmdiYVxcXFwoJHtyZVB9LCR7cmVQfSwke3JlUH0sJHtyZU59XFxcXCkkYCksXG4gICAgcmVIc2xQZXJjZW50ID0gbmV3IFJlZ0V4cChgXmhzbFxcXFwoJHtyZU59LCR7cmVQfSwke3JlUH1cXFxcKSRgKSxcbiAgICByZUhzbGFQZXJjZW50ID0gbmV3IFJlZ0V4cChgXmhzbGFcXFxcKCR7cmVOfSwke3JlUH0sJHtyZVB9LCR7cmVOfVxcXFwpJGApO1xuXG52YXIgbmFtZWQgPSB7XG4gIGFsaWNlYmx1ZTogMHhmMGY4ZmYsXG4gIGFudGlxdWV3aGl0ZTogMHhmYWViZDcsXG4gIGFxdWE6IDB4MDBmZmZmLFxuICBhcXVhbWFyaW5lOiAweDdmZmZkNCxcbiAgYXp1cmU6IDB4ZjBmZmZmLFxuICBiZWlnZTogMHhmNWY1ZGMsXG4gIGJpc3F1ZTogMHhmZmU0YzQsXG4gIGJsYWNrOiAweDAwMDAwMCxcbiAgYmxhbmNoZWRhbG1vbmQ6IDB4ZmZlYmNkLFxuICBibHVlOiAweDAwMDBmZixcbiAgYmx1ZXZpb2xldDogMHg4YTJiZTIsXG4gIGJyb3duOiAweGE1MmEyYSxcbiAgYnVybHl3b29kOiAweGRlYjg4NyxcbiAgY2FkZXRibHVlOiAweDVmOWVhMCxcbiAgY2hhcnRyZXVzZTogMHg3ZmZmMDAsXG4gIGNob2NvbGF0ZTogMHhkMjY5MWUsXG4gIGNvcmFsOiAweGZmN2Y1MCxcbiAgY29ybmZsb3dlcmJsdWU6IDB4NjQ5NWVkLFxuICBjb3Juc2lsazogMHhmZmY4ZGMsXG4gIGNyaW1zb246IDB4ZGMxNDNjLFxuICBjeWFuOiAweDAwZmZmZixcbiAgZGFya2JsdWU6IDB4MDAwMDhiLFxuICBkYXJrY3lhbjogMHgwMDhiOGIsXG4gIGRhcmtnb2xkZW5yb2Q6IDB4Yjg4NjBiLFxuICBkYXJrZ3JheTogMHhhOWE5YTksXG4gIGRhcmtncmVlbjogMHgwMDY0MDAsXG4gIGRhcmtncmV5OiAweGE5YTlhOSxcbiAgZGFya2toYWtpOiAweGJkYjc2YixcbiAgZGFya21hZ2VudGE6IDB4OGIwMDhiLFxuICBkYXJrb2xpdmVncmVlbjogMHg1NTZiMmYsXG4gIGRhcmtvcmFuZ2U6IDB4ZmY4YzAwLFxuICBkYXJrb3JjaGlkOiAweDk5MzJjYyxcbiAgZGFya3JlZDogMHg4YjAwMDAsXG4gIGRhcmtzYWxtb246IDB4ZTk5NjdhLFxuICBkYXJrc2VhZ3JlZW46IDB4OGZiYzhmLFxuICBkYXJrc2xhdGVibHVlOiAweDQ4M2Q4YixcbiAgZGFya3NsYXRlZ3JheTogMHgyZjRmNGYsXG4gIGRhcmtzbGF0ZWdyZXk6IDB4MmY0ZjRmLFxuICBkYXJrdHVycXVvaXNlOiAweDAwY2VkMSxcbiAgZGFya3Zpb2xldDogMHg5NDAwZDMsXG4gIGRlZXBwaW5rOiAweGZmMTQ5MyxcbiAgZGVlcHNreWJsdWU6IDB4MDBiZmZmLFxuICBkaW1ncmF5OiAweDY5Njk2OSxcbiAgZGltZ3JleTogMHg2OTY5NjksXG4gIGRvZGdlcmJsdWU6IDB4MWU5MGZmLFxuICBmaXJlYnJpY2s6IDB4YjIyMjIyLFxuICBmbG9yYWx3aGl0ZTogMHhmZmZhZjAsXG4gIGZvcmVzdGdyZWVuOiAweDIyOGIyMixcbiAgZnVjaHNpYTogMHhmZjAwZmYsXG4gIGdhaW5zYm9ybzogMHhkY2RjZGMsXG4gIGdob3N0d2hpdGU6IDB4ZjhmOGZmLFxuICBnb2xkOiAweGZmZDcwMCxcbiAgZ29sZGVucm9kOiAweGRhYTUyMCxcbiAgZ3JheTogMHg4MDgwODAsXG4gIGdyZWVuOiAweDAwODAwMCxcbiAgZ3JlZW55ZWxsb3c6IDB4YWRmZjJmLFxuICBncmV5OiAweDgwODA4MCxcbiAgaG9uZXlkZXc6IDB4ZjBmZmYwLFxuICBob3RwaW5rOiAweGZmNjliNCxcbiAgaW5kaWFucmVkOiAweGNkNWM1YyxcbiAgaW5kaWdvOiAweDRiMDA4MixcbiAgaXZvcnk6IDB4ZmZmZmYwLFxuICBraGFraTogMHhmMGU2OGMsXG4gIGxhdmVuZGVyOiAweGU2ZTZmYSxcbiAgbGF2ZW5kZXJibHVzaDogMHhmZmYwZjUsXG4gIGxhd25ncmVlbjogMHg3Y2ZjMDAsXG4gIGxlbW9uY2hpZmZvbjogMHhmZmZhY2QsXG4gIGxpZ2h0Ymx1ZTogMHhhZGQ4ZTYsXG4gIGxpZ2h0Y29yYWw6IDB4ZjA4MDgwLFxuICBsaWdodGN5YW46IDB4ZTBmZmZmLFxuICBsaWdodGdvbGRlbnJvZHllbGxvdzogMHhmYWZhZDIsXG4gIGxpZ2h0Z3JheTogMHhkM2QzZDMsXG4gIGxpZ2h0Z3JlZW46IDB4OTBlZTkwLFxuICBsaWdodGdyZXk6IDB4ZDNkM2QzLFxuICBsaWdodHBpbms6IDB4ZmZiNmMxLFxuICBsaWdodHNhbG1vbjogMHhmZmEwN2EsXG4gIGxpZ2h0c2VhZ3JlZW46IDB4MjBiMmFhLFxuICBsaWdodHNreWJsdWU6IDB4ODdjZWZhLFxuICBsaWdodHNsYXRlZ3JheTogMHg3Nzg4OTksXG4gIGxpZ2h0c2xhdGVncmV5OiAweDc3ODg5OSxcbiAgbGlnaHRzdGVlbGJsdWU6IDB4YjBjNGRlLFxuICBsaWdodHllbGxvdzogMHhmZmZmZTAsXG4gIGxpbWU6IDB4MDBmZjAwLFxuICBsaW1lZ3JlZW46IDB4MzJjZDMyLFxuICBsaW5lbjogMHhmYWYwZTYsXG4gIG1hZ2VudGE6IDB4ZmYwMGZmLFxuICBtYXJvb246IDB4ODAwMDAwLFxuICBtZWRpdW1hcXVhbWFyaW5lOiAweDY2Y2RhYSxcbiAgbWVkaXVtYmx1ZTogMHgwMDAwY2QsXG4gIG1lZGl1bW9yY2hpZDogMHhiYTU1ZDMsXG4gIG1lZGl1bXB1cnBsZTogMHg5MzcwZGIsXG4gIG1lZGl1bXNlYWdyZWVuOiAweDNjYjM3MSxcbiAgbWVkaXVtc2xhdGVibHVlOiAweDdiNjhlZSxcbiAgbWVkaXVtc3ByaW5nZ3JlZW46IDB4MDBmYTlhLFxuICBtZWRpdW10dXJxdW9pc2U6IDB4NDhkMWNjLFxuICBtZWRpdW12aW9sZXRyZWQ6IDB4YzcxNTg1LFxuICBtaWRuaWdodGJsdWU6IDB4MTkxOTcwLFxuICBtaW50Y3JlYW06IDB4ZjVmZmZhLFxuICBtaXN0eXJvc2U6IDB4ZmZlNGUxLFxuICBtb2NjYXNpbjogMHhmZmU0YjUsXG4gIG5hdmFqb3doaXRlOiAweGZmZGVhZCxcbiAgbmF2eTogMHgwMDAwODAsXG4gIG9sZGxhY2U6IDB4ZmRmNWU2LFxuICBvbGl2ZTogMHg4MDgwMDAsXG4gIG9saXZlZHJhYjogMHg2YjhlMjMsXG4gIG9yYW5nZTogMHhmZmE1MDAsXG4gIG9yYW5nZXJlZDogMHhmZjQ1MDAsXG4gIG9yY2hpZDogMHhkYTcwZDYsXG4gIHBhbGVnb2xkZW5yb2Q6IDB4ZWVlOGFhLFxuICBwYWxlZ3JlZW46IDB4OThmYjk4LFxuICBwYWxldHVycXVvaXNlOiAweGFmZWVlZSxcbiAgcGFsZXZpb2xldHJlZDogMHhkYjcwOTMsXG4gIHBhcGF5YXdoaXA6IDB4ZmZlZmQ1LFxuICBwZWFjaHB1ZmY6IDB4ZmZkYWI5LFxuICBwZXJ1OiAweGNkODUzZixcbiAgcGluazogMHhmZmMwY2IsXG4gIHBsdW06IDB4ZGRhMGRkLFxuICBwb3dkZXJibHVlOiAweGIwZTBlNixcbiAgcHVycGxlOiAweDgwMDA4MCxcbiAgcmViZWNjYXB1cnBsZTogMHg2NjMzOTksXG4gIHJlZDogMHhmZjAwMDAsXG4gIHJvc3licm93bjogMHhiYzhmOGYsXG4gIHJveWFsYmx1ZTogMHg0MTY5ZTEsXG4gIHNhZGRsZWJyb3duOiAweDhiNDUxMyxcbiAgc2FsbW9uOiAweGZhODA3MixcbiAgc2FuZHlicm93bjogMHhmNGE0NjAsXG4gIHNlYWdyZWVuOiAweDJlOGI1NyxcbiAgc2Vhc2hlbGw6IDB4ZmZmNWVlLFxuICBzaWVubmE6IDB4YTA1MjJkLFxuICBzaWx2ZXI6IDB4YzBjMGMwLFxuICBza3libHVlOiAweDg3Y2VlYixcbiAgc2xhdGVibHVlOiAweDZhNWFjZCxcbiAgc2xhdGVncmF5OiAweDcwODA5MCxcbiAgc2xhdGVncmV5OiAweDcwODA5MCxcbiAgc25vdzogMHhmZmZhZmEsXG4gIHNwcmluZ2dyZWVuOiAweDAwZmY3ZixcbiAgc3RlZWxibHVlOiAweDQ2ODJiNCxcbiAgdGFuOiAweGQyYjQ4YyxcbiAgdGVhbDogMHgwMDgwODAsXG4gIHRoaXN0bGU6IDB4ZDhiZmQ4LFxuICB0b21hdG86IDB4ZmY2MzQ3LFxuICB0dXJxdW9pc2U6IDB4NDBlMGQwLFxuICB2aW9sZXQ6IDB4ZWU4MmVlLFxuICB3aGVhdDogMHhmNWRlYjMsXG4gIHdoaXRlOiAweGZmZmZmZixcbiAgd2hpdGVzbW9rZTogMHhmNWY1ZjUsXG4gIHllbGxvdzogMHhmZmZmMDAsXG4gIHllbGxvd2dyZWVuOiAweDlhY2QzMlxufTtcblxuZGVmaW5lKENvbG9yLCBjb2xvciwge1xuICBjb3B5KGNoYW5uZWxzKSB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24obmV3IHRoaXMuY29uc3RydWN0b3IsIHRoaXMsIGNoYW5uZWxzKTtcbiAgfSxcbiAgZGlzcGxheWFibGUoKSB7XG4gICAgcmV0dXJuIHRoaXMucmdiKCkuZGlzcGxheWFibGUoKTtcbiAgfSxcbiAgaGV4OiBjb2xvcl9mb3JtYXRIZXgsIC8vIERlcHJlY2F0ZWQhIFVzZSBjb2xvci5mb3JtYXRIZXguXG4gIGZvcm1hdEhleDogY29sb3JfZm9ybWF0SGV4LFxuICBmb3JtYXRIZXg4OiBjb2xvcl9mb3JtYXRIZXg4LFxuICBmb3JtYXRIc2w6IGNvbG9yX2Zvcm1hdEhzbCxcbiAgZm9ybWF0UmdiOiBjb2xvcl9mb3JtYXRSZ2IsXG4gIHRvU3RyaW5nOiBjb2xvcl9mb3JtYXRSZ2Jcbn0pO1xuXG5mdW5jdGlvbiBjb2xvcl9mb3JtYXRIZXgoKSB7XG4gIHJldHVybiB0aGlzLnJnYigpLmZvcm1hdEhleCgpO1xufVxuXG5mdW5jdGlvbiBjb2xvcl9mb3JtYXRIZXg4KCkge1xuICByZXR1cm4gdGhpcy5yZ2IoKS5mb3JtYXRIZXg4KCk7XG59XG5cbmZ1bmN0aW9uIGNvbG9yX2Zvcm1hdEhzbCgpIHtcbiAgcmV0dXJuIGhzbENvbnZlcnQodGhpcykuZm9ybWF0SHNsKCk7XG59XG5cbmZ1bmN0aW9uIGNvbG9yX2Zvcm1hdFJnYigpIHtcbiAgcmV0dXJuIHRoaXMucmdiKCkuZm9ybWF0UmdiKCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNvbG9yKGZvcm1hdCkge1xuICB2YXIgbSwgbDtcbiAgZm9ybWF0ID0gKGZvcm1hdCArIFwiXCIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICByZXR1cm4gKG0gPSByZUhleC5leGVjKGZvcm1hdCkpID8gKGwgPSBtWzFdLmxlbmd0aCwgbSA9IHBhcnNlSW50KG1bMV0sIDE2KSwgbCA9PT0gNiA/IHJnYm4obSkgLy8gI2ZmMDAwMFxuICAgICAgOiBsID09PSAzID8gbmV3IFJnYigobSA+PiA4ICYgMHhmKSB8IChtID4+IDQgJiAweGYwKSwgKG0gPj4gNCAmIDB4ZikgfCAobSAmIDB4ZjApLCAoKG0gJiAweGYpIDw8IDQpIHwgKG0gJiAweGYpLCAxKSAvLyAjZjAwXG4gICAgICA6IGwgPT09IDggPyByZ2JhKG0gPj4gMjQgJiAweGZmLCBtID4+IDE2ICYgMHhmZiwgbSA+PiA4ICYgMHhmZiwgKG0gJiAweGZmKSAvIDB4ZmYpIC8vICNmZjAwMDAwMFxuICAgICAgOiBsID09PSA0ID8gcmdiYSgobSA+PiAxMiAmIDB4ZikgfCAobSA+PiA4ICYgMHhmMCksIChtID4+IDggJiAweGYpIHwgKG0gPj4gNCAmIDB4ZjApLCAobSA+PiA0ICYgMHhmKSB8IChtICYgMHhmMCksICgoKG0gJiAweGYpIDw8IDQpIHwgKG0gJiAweGYpKSAvIDB4ZmYpIC8vICNmMDAwXG4gICAgICA6IG51bGwpIC8vIGludmFsaWQgaGV4XG4gICAgICA6IChtID0gcmVSZ2JJbnRlZ2VyLmV4ZWMoZm9ybWF0KSkgPyBuZXcgUmdiKG1bMV0sIG1bMl0sIG1bM10sIDEpIC8vIHJnYigyNTUsIDAsIDApXG4gICAgICA6IChtID0gcmVSZ2JQZXJjZW50LmV4ZWMoZm9ybWF0KSkgPyBuZXcgUmdiKG1bMV0gKiAyNTUgLyAxMDAsIG1bMl0gKiAyNTUgLyAxMDAsIG1bM10gKiAyNTUgLyAxMDAsIDEpIC8vIHJnYigxMDAlLCAwJSwgMCUpXG4gICAgICA6IChtID0gcmVSZ2JhSW50ZWdlci5leGVjKGZvcm1hdCkpID8gcmdiYShtWzFdLCBtWzJdLCBtWzNdLCBtWzRdKSAvLyByZ2JhKDI1NSwgMCwgMCwgMSlcbiAgICAgIDogKG0gPSByZVJnYmFQZXJjZW50LmV4ZWMoZm9ybWF0KSkgPyByZ2JhKG1bMV0gKiAyNTUgLyAxMDAsIG1bMl0gKiAyNTUgLyAxMDAsIG1bM10gKiAyNTUgLyAxMDAsIG1bNF0pIC8vIHJnYigxMDAlLCAwJSwgMCUsIDEpXG4gICAgICA6IChtID0gcmVIc2xQZXJjZW50LmV4ZWMoZm9ybWF0KSkgPyBoc2xhKG1bMV0sIG1bMl0gLyAxMDAsIG1bM10gLyAxMDAsIDEpIC8vIGhzbCgxMjAsIDUwJSwgNTAlKVxuICAgICAgOiAobSA9IHJlSHNsYVBlcmNlbnQuZXhlYyhmb3JtYXQpKSA/IGhzbGEobVsxXSwgbVsyXSAvIDEwMCwgbVszXSAvIDEwMCwgbVs0XSkgLy8gaHNsYSgxMjAsIDUwJSwgNTAlLCAxKVxuICAgICAgOiBuYW1lZC5oYXNPd25Qcm9wZXJ0eShmb3JtYXQpID8gcmdibihuYW1lZFtmb3JtYXRdKSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xuICAgICAgOiBmb3JtYXQgPT09IFwidHJhbnNwYXJlbnRcIiA/IG5ldyBSZ2IoTmFOLCBOYU4sIE5hTiwgMClcbiAgICAgIDogbnVsbDtcbn1cblxuZnVuY3Rpb24gcmdibihuKSB7XG4gIHJldHVybiBuZXcgUmdiKG4gPj4gMTYgJiAweGZmLCBuID4+IDggJiAweGZmLCBuICYgMHhmZiwgMSk7XG59XG5cbmZ1bmN0aW9uIHJnYmEociwgZywgYiwgYSkge1xuICBpZiAoYSA8PSAwKSByID0gZyA9IGIgPSBOYU47XG4gIHJldHVybiBuZXcgUmdiKHIsIGcsIGIsIGEpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmdiQ29udmVydChvKSB7XG4gIGlmICghKG8gaW5zdGFuY2VvZiBDb2xvcikpIG8gPSBjb2xvcihvKTtcbiAgaWYgKCFvKSByZXR1cm4gbmV3IFJnYjtcbiAgbyA9IG8ucmdiKCk7XG4gIHJldHVybiBuZXcgUmdiKG8uciwgby5nLCBvLmIsIG8ub3BhY2l0eSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZ2IociwgZywgYiwgb3BhY2l0eSkge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PT0gMSA/IHJnYkNvbnZlcnQocikgOiBuZXcgUmdiKHIsIGcsIGIsIG9wYWNpdHkgPT0gbnVsbCA/IDEgOiBvcGFjaXR5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFJnYihyLCBnLCBiLCBvcGFjaXR5KSB7XG4gIHRoaXMuciA9ICtyO1xuICB0aGlzLmcgPSArZztcbiAgdGhpcy5iID0gK2I7XG4gIHRoaXMub3BhY2l0eSA9ICtvcGFjaXR5O1xufVxuXG5kZWZpbmUoUmdiLCByZ2IsIGV4dGVuZChDb2xvciwge1xuICBicmlnaHRlcihrKSB7XG4gICAgayA9IGsgPT0gbnVsbCA/IGJyaWdodGVyIDogTWF0aC5wb3coYnJpZ2h0ZXIsIGspO1xuICAgIHJldHVybiBuZXcgUmdiKHRoaXMuciAqIGssIHRoaXMuZyAqIGssIHRoaXMuYiAqIGssIHRoaXMub3BhY2l0eSk7XG4gIH0sXG4gIGRhcmtlcihrKSB7XG4gICAgayA9IGsgPT0gbnVsbCA/IGRhcmtlciA6IE1hdGgucG93KGRhcmtlciwgayk7XG4gICAgcmV0dXJuIG5ldyBSZ2IodGhpcy5yICogaywgdGhpcy5nICogaywgdGhpcy5iICogaywgdGhpcy5vcGFjaXR5KTtcbiAgfSxcbiAgcmdiKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICBjbGFtcCgpIHtcbiAgICByZXR1cm4gbmV3IFJnYihjbGFtcGkodGhpcy5yKSwgY2xhbXBpKHRoaXMuZyksIGNsYW1waSh0aGlzLmIpLCBjbGFtcGEodGhpcy5vcGFjaXR5KSk7XG4gIH0sXG4gIGRpc3BsYXlhYmxlKCkge1xuICAgIHJldHVybiAoLTAuNSA8PSB0aGlzLnIgJiYgdGhpcy5yIDwgMjU1LjUpXG4gICAgICAgICYmICgtMC41IDw9IHRoaXMuZyAmJiB0aGlzLmcgPCAyNTUuNSlcbiAgICAgICAgJiYgKC0wLjUgPD0gdGhpcy5iICYmIHRoaXMuYiA8IDI1NS41KVxuICAgICAgICAmJiAoMCA8PSB0aGlzLm9wYWNpdHkgJiYgdGhpcy5vcGFjaXR5IDw9IDEpO1xuICB9LFxuICBoZXg6IHJnYl9mb3JtYXRIZXgsIC8vIERlcHJlY2F0ZWQhIFVzZSBjb2xvci5mb3JtYXRIZXguXG4gIGZvcm1hdEhleDogcmdiX2Zvcm1hdEhleCxcbiAgZm9ybWF0SGV4ODogcmdiX2Zvcm1hdEhleDgsXG4gIGZvcm1hdFJnYjogcmdiX2Zvcm1hdFJnYixcbiAgdG9TdHJpbmc6IHJnYl9mb3JtYXRSZ2Jcbn0pKTtcblxuZnVuY3Rpb24gcmdiX2Zvcm1hdEhleCgpIHtcbiAgcmV0dXJuIGAjJHtoZXgodGhpcy5yKX0ke2hleCh0aGlzLmcpfSR7aGV4KHRoaXMuYil9YDtcbn1cblxuZnVuY3Rpb24gcmdiX2Zvcm1hdEhleDgoKSB7XG4gIHJldHVybiBgIyR7aGV4KHRoaXMucil9JHtoZXgodGhpcy5nKX0ke2hleCh0aGlzLmIpfSR7aGV4KChpc05hTih0aGlzLm9wYWNpdHkpID8gMSA6IHRoaXMub3BhY2l0eSkgKiAyNTUpfWA7XG59XG5cbmZ1bmN0aW9uIHJnYl9mb3JtYXRSZ2IoKSB7XG4gIGNvbnN0IGEgPSBjbGFtcGEodGhpcy5vcGFjaXR5KTtcbiAgcmV0dXJuIGAke2EgPT09IDEgPyBcInJnYihcIiA6IFwicmdiYShcIn0ke2NsYW1waSh0aGlzLnIpfSwgJHtjbGFtcGkodGhpcy5nKX0sICR7Y2xhbXBpKHRoaXMuYil9JHthID09PSAxID8gXCIpXCIgOiBgLCAke2F9KWB9YDtcbn1cblxuZnVuY3Rpb24gY2xhbXBhKG9wYWNpdHkpIHtcbiAgcmV0dXJuIGlzTmFOKG9wYWNpdHkpID8gMSA6IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIG9wYWNpdHkpKTtcbn1cblxuZnVuY3Rpb24gY2xhbXBpKHZhbHVlKSB7XG4gIHJldHVybiBNYXRoLm1heCgwLCBNYXRoLm1pbigyNTUsIE1hdGgucm91bmQodmFsdWUpIHx8IDApKTtcbn1cblxuZnVuY3Rpb24gaGV4KHZhbHVlKSB7XG4gIHZhbHVlID0gY2xhbXBpKHZhbHVlKTtcbiAgcmV0dXJuICh2YWx1ZSA8IDE2ID8gXCIwXCIgOiBcIlwiKSArIHZhbHVlLnRvU3RyaW5nKDE2KTtcbn1cblxuZnVuY3Rpb24gaHNsYShoLCBzLCBsLCBhKSB7XG4gIGlmIChhIDw9IDApIGggPSBzID0gbCA9IE5hTjtcbiAgZWxzZSBpZiAobCA8PSAwIHx8IGwgPj0gMSkgaCA9IHMgPSBOYU47XG4gIGVsc2UgaWYgKHMgPD0gMCkgaCA9IE5hTjtcbiAgcmV0dXJuIG5ldyBIc2woaCwgcywgbCwgYSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoc2xDb252ZXJ0KG8pIHtcbiAgaWYgKG8gaW5zdGFuY2VvZiBIc2wpIHJldHVybiBuZXcgSHNsKG8uaCwgby5zLCBvLmwsIG8ub3BhY2l0eSk7XG4gIGlmICghKG8gaW5zdGFuY2VvZiBDb2xvcikpIG8gPSBjb2xvcihvKTtcbiAgaWYgKCFvKSByZXR1cm4gbmV3IEhzbDtcbiAgaWYgKG8gaW5zdGFuY2VvZiBIc2wpIHJldHVybiBvO1xuICBvID0gby5yZ2IoKTtcbiAgdmFyIHIgPSBvLnIgLyAyNTUsXG4gICAgICBnID0gby5nIC8gMjU1LFxuICAgICAgYiA9IG8uYiAvIDI1NSxcbiAgICAgIG1pbiA9IE1hdGgubWluKHIsIGcsIGIpLFxuICAgICAgbWF4ID0gTWF0aC5tYXgociwgZywgYiksXG4gICAgICBoID0gTmFOLFxuICAgICAgcyA9IG1heCAtIG1pbixcbiAgICAgIGwgPSAobWF4ICsgbWluKSAvIDI7XG4gIGlmIChzKSB7XG4gICAgaWYgKHIgPT09IG1heCkgaCA9IChnIC0gYikgLyBzICsgKGcgPCBiKSAqIDY7XG4gICAgZWxzZSBpZiAoZyA9PT0gbWF4KSBoID0gKGIgLSByKSAvIHMgKyAyO1xuICAgIGVsc2UgaCA9IChyIC0gZykgLyBzICsgNDtcbiAgICBzIC89IGwgPCAwLjUgPyBtYXggKyBtaW4gOiAyIC0gbWF4IC0gbWluO1xuICAgIGggKj0gNjA7XG4gIH0gZWxzZSB7XG4gICAgcyA9IGwgPiAwICYmIGwgPCAxID8gMCA6IGg7XG4gIH1cbiAgcmV0dXJuIG5ldyBIc2woaCwgcywgbCwgby5vcGFjaXR5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhzbChoLCBzLCBsLCBvcGFjaXR5KSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID09PSAxID8gaHNsQ29udmVydChoKSA6IG5ldyBIc2woaCwgcywgbCwgb3BhY2l0eSA9PSBudWxsID8gMSA6IG9wYWNpdHkpO1xufVxuXG5mdW5jdGlvbiBIc2woaCwgcywgbCwgb3BhY2l0eSkge1xuICB0aGlzLmggPSAraDtcbiAgdGhpcy5zID0gK3M7XG4gIHRoaXMubCA9ICtsO1xuICB0aGlzLm9wYWNpdHkgPSArb3BhY2l0eTtcbn1cblxuZGVmaW5lKEhzbCwgaHNsLCBleHRlbmQoQ29sb3IsIHtcbiAgYnJpZ2h0ZXIoaykge1xuICAgIGsgPSBrID09IG51bGwgPyBicmlnaHRlciA6IE1hdGgucG93KGJyaWdodGVyLCBrKTtcbiAgICByZXR1cm4gbmV3IEhzbCh0aGlzLmgsIHRoaXMucywgdGhpcy5sICogaywgdGhpcy5vcGFjaXR5KTtcbiAgfSxcbiAgZGFya2VyKGspIHtcbiAgICBrID0gayA9PSBudWxsID8gZGFya2VyIDogTWF0aC5wb3coZGFya2VyLCBrKTtcbiAgICByZXR1cm4gbmV3IEhzbCh0aGlzLmgsIHRoaXMucywgdGhpcy5sICogaywgdGhpcy5vcGFjaXR5KTtcbiAgfSxcbiAgcmdiKCkge1xuICAgIHZhciBoID0gdGhpcy5oICUgMzYwICsgKHRoaXMuaCA8IDApICogMzYwLFxuICAgICAgICBzID0gaXNOYU4oaCkgfHwgaXNOYU4odGhpcy5zKSA/IDAgOiB0aGlzLnMsXG4gICAgICAgIGwgPSB0aGlzLmwsXG4gICAgICAgIG0yID0gbCArIChsIDwgMC41ID8gbCA6IDEgLSBsKSAqIHMsXG4gICAgICAgIG0xID0gMiAqIGwgLSBtMjtcbiAgICByZXR1cm4gbmV3IFJnYihcbiAgICAgIGhzbDJyZ2IoaCA+PSAyNDAgPyBoIC0gMjQwIDogaCArIDEyMCwgbTEsIG0yKSxcbiAgICAgIGhzbDJyZ2IoaCwgbTEsIG0yKSxcbiAgICAgIGhzbDJyZ2IoaCA8IDEyMCA/IGggKyAyNDAgOiBoIC0gMTIwLCBtMSwgbTIpLFxuICAgICAgdGhpcy5vcGFjaXR5XG4gICAgKTtcbiAgfSxcbiAgY2xhbXAoKSB7XG4gICAgcmV0dXJuIG5ldyBIc2woY2xhbXBoKHRoaXMuaCksIGNsYW1wdCh0aGlzLnMpLCBjbGFtcHQodGhpcy5sKSwgY2xhbXBhKHRoaXMub3BhY2l0eSkpO1xuICB9LFxuICBkaXNwbGF5YWJsZSgpIHtcbiAgICByZXR1cm4gKDAgPD0gdGhpcy5zICYmIHRoaXMucyA8PSAxIHx8IGlzTmFOKHRoaXMucykpXG4gICAgICAgICYmICgwIDw9IHRoaXMubCAmJiB0aGlzLmwgPD0gMSlcbiAgICAgICAgJiYgKDAgPD0gdGhpcy5vcGFjaXR5ICYmIHRoaXMub3BhY2l0eSA8PSAxKTtcbiAgfSxcbiAgZm9ybWF0SHNsKCkge1xuICAgIGNvbnN0IGEgPSBjbGFtcGEodGhpcy5vcGFjaXR5KTtcbiAgICByZXR1cm4gYCR7YSA9PT0gMSA/IFwiaHNsKFwiIDogXCJoc2xhKFwifSR7Y2xhbXBoKHRoaXMuaCl9LCAke2NsYW1wdCh0aGlzLnMpICogMTAwfSUsICR7Y2xhbXB0KHRoaXMubCkgKiAxMDB9JSR7YSA9PT0gMSA/IFwiKVwiIDogYCwgJHthfSlgfWA7XG4gIH1cbn0pKTtcblxuZnVuY3Rpb24gY2xhbXBoKHZhbHVlKSB7XG4gIHZhbHVlID0gKHZhbHVlIHx8IDApICUgMzYwO1xuICByZXR1cm4gdmFsdWUgPCAwID8gdmFsdWUgKyAzNjAgOiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gY2xhbXB0KHZhbHVlKSB7XG4gIHJldHVybiBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCB2YWx1ZSB8fCAwKSk7XG59XG5cbi8qIEZyb20gRnZEIDEzLjM3LCBDU1MgQ29sb3IgTW9kdWxlIExldmVsIDMgKi9cbmZ1bmN0aW9uIGhzbDJyZ2IoaCwgbTEsIG0yKSB7XG4gIHJldHVybiAoaCA8IDYwID8gbTEgKyAobTIgLSBtMSkgKiBoIC8gNjBcbiAgICAgIDogaCA8IDE4MCA/IG0yXG4gICAgICA6IGggPCAyNDAgPyBtMSArIChtMiAtIG0xKSAqICgyNDAgLSBoKSAvIDYwXG4gICAgICA6IG0xKSAqIDI1NTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGNvbnN0cnVjdG9yLCBmYWN0b3J5LCBwcm90b3R5cGUpIHtcbiAgY29uc3RydWN0b3IucHJvdG90eXBlID0gZmFjdG9yeS5wcm90b3R5cGUgPSBwcm90b3R5cGU7XG4gIHByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGNvbnN0cnVjdG9yO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXh0ZW5kKHBhcmVudCwgZGVmaW5pdGlvbikge1xuICB2YXIgcHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShwYXJlbnQucHJvdG90eXBlKTtcbiAgZm9yICh2YXIga2V5IGluIGRlZmluaXRpb24pIHByb3RvdHlwZVtrZXldID0gZGVmaW5pdGlvbltrZXldO1xuICByZXR1cm4gcHJvdG90eXBlO1xufVxuIiwiaW1wb3J0IGRlZmluZSwge2V4dGVuZH0gZnJvbSBcIi4vZGVmaW5lLmpzXCI7XG5pbXBvcnQge0NvbG9yLCByZ2JDb252ZXJ0LCBSZ2J9IGZyb20gXCIuL2NvbG9yLmpzXCI7XG5pbXBvcnQge2RlZ3JlZXMsIHJhZGlhbnN9IGZyb20gXCIuL21hdGguanNcIjtcblxuLy8gaHR0cHM6Ly9vYnNlcnZhYmxlaHEuY29tL0BtYm9zdG9jay9sYWItYW5kLXJnYlxuY29uc3QgSyA9IDE4LFxuICAgIFhuID0gMC45NjQyMixcbiAgICBZbiA9IDEsXG4gICAgWm4gPSAwLjgyNTIxLFxuICAgIHQwID0gNCAvIDI5LFxuICAgIHQxID0gNiAvIDI5LFxuICAgIHQyID0gMyAqIHQxICogdDEsXG4gICAgdDMgPSB0MSAqIHQxICogdDE7XG5cbmZ1bmN0aW9uIGxhYkNvbnZlcnQobykge1xuICBpZiAobyBpbnN0YW5jZW9mIExhYikgcmV0dXJuIG5ldyBMYWIoby5sLCBvLmEsIG8uYiwgby5vcGFjaXR5KTtcbiAgaWYgKG8gaW5zdGFuY2VvZiBIY2wpIHJldHVybiBoY2wybGFiKG8pO1xuICBpZiAoIShvIGluc3RhbmNlb2YgUmdiKSkgbyA9IHJnYkNvbnZlcnQobyk7XG4gIHZhciByID0gcmdiMmxyZ2Ioby5yKSxcbiAgICAgIGcgPSByZ2IybHJnYihvLmcpLFxuICAgICAgYiA9IHJnYjJscmdiKG8uYiksXG4gICAgICB5ID0geHl6MmxhYigoMC4yMjI1MDQ1ICogciArIDAuNzE2ODc4NiAqIGcgKyAwLjA2MDYxNjkgKiBiKSAvIFluKSwgeCwgejtcbiAgaWYgKHIgPT09IGcgJiYgZyA9PT0gYikgeCA9IHogPSB5OyBlbHNlIHtcbiAgICB4ID0geHl6MmxhYigoMC40MzYwNzQ3ICogciArIDAuMzg1MDY0OSAqIGcgKyAwLjE0MzA4MDQgKiBiKSAvIFhuKTtcbiAgICB6ID0geHl6MmxhYigoMC4wMTM5MzIyICogciArIDAuMDk3MTA0NSAqIGcgKyAwLjcxNDE3MzMgKiBiKSAvIFpuKTtcbiAgfVxuICByZXR1cm4gbmV3IExhYigxMTYgKiB5IC0gMTYsIDUwMCAqICh4IC0geSksIDIwMCAqICh5IC0geiksIG8ub3BhY2l0eSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBncmF5KGwsIG9wYWNpdHkpIHtcbiAgcmV0dXJuIG5ldyBMYWIobCwgMCwgMCwgb3BhY2l0eSA9PSBudWxsID8gMSA6IG9wYWNpdHkpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBsYWIobCwgYSwgYiwgb3BhY2l0eSkge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PT0gMSA/IGxhYkNvbnZlcnQobCkgOiBuZXcgTGFiKGwsIGEsIGIsIG9wYWNpdHkgPT0gbnVsbCA/IDEgOiBvcGFjaXR5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIExhYihsLCBhLCBiLCBvcGFjaXR5KSB7XG4gIHRoaXMubCA9ICtsO1xuICB0aGlzLmEgPSArYTtcbiAgdGhpcy5iID0gK2I7XG4gIHRoaXMub3BhY2l0eSA9ICtvcGFjaXR5O1xufVxuXG5kZWZpbmUoTGFiLCBsYWIsIGV4dGVuZChDb2xvciwge1xuICBicmlnaHRlcihrKSB7XG4gICAgcmV0dXJuIG5ldyBMYWIodGhpcy5sICsgSyAqIChrID09IG51bGwgPyAxIDogayksIHRoaXMuYSwgdGhpcy5iLCB0aGlzLm9wYWNpdHkpO1xuICB9LFxuICBkYXJrZXIoaykge1xuICAgIHJldHVybiBuZXcgTGFiKHRoaXMubCAtIEsgKiAoayA9PSBudWxsID8gMSA6IGspLCB0aGlzLmEsIHRoaXMuYiwgdGhpcy5vcGFjaXR5KTtcbiAgfSxcbiAgcmdiKCkge1xuICAgIHZhciB5ID0gKHRoaXMubCArIDE2KSAvIDExNixcbiAgICAgICAgeCA9IGlzTmFOKHRoaXMuYSkgPyB5IDogeSArIHRoaXMuYSAvIDUwMCxcbiAgICAgICAgeiA9IGlzTmFOKHRoaXMuYikgPyB5IDogeSAtIHRoaXMuYiAvIDIwMDtcbiAgICB4ID0gWG4gKiBsYWIyeHl6KHgpO1xuICAgIHkgPSBZbiAqIGxhYjJ4eXooeSk7XG4gICAgeiA9IFpuICogbGFiMnh5eih6KTtcbiAgICByZXR1cm4gbmV3IFJnYihcbiAgICAgIGxyZ2IycmdiKCAzLjEzMzg1NjEgKiB4IC0gMS42MTY4NjY3ICogeSAtIDAuNDkwNjE0NiAqIHopLFxuICAgICAgbHJnYjJyZ2IoLTAuOTc4NzY4NCAqIHggKyAxLjkxNjE0MTUgKiB5ICsgMC4wMzM0NTQwICogeiksXG4gICAgICBscmdiMnJnYiggMC4wNzE5NDUzICogeCAtIDAuMjI4OTkxNCAqIHkgKyAxLjQwNTI0MjcgKiB6KSxcbiAgICAgIHRoaXMub3BhY2l0eVxuICAgICk7XG4gIH1cbn0pKTtcblxuZnVuY3Rpb24geHl6MmxhYih0KSB7XG4gIHJldHVybiB0ID4gdDMgPyBNYXRoLnBvdyh0LCAxIC8gMykgOiB0IC8gdDIgKyB0MDtcbn1cblxuZnVuY3Rpb24gbGFiMnh5eih0KSB7XG4gIHJldHVybiB0ID4gdDEgPyB0ICogdCAqIHQgOiB0MiAqICh0IC0gdDApO1xufVxuXG5mdW5jdGlvbiBscmdiMnJnYih4KSB7XG4gIHJldHVybiAyNTUgKiAoeCA8PSAwLjAwMzEzMDggPyAxMi45MiAqIHggOiAxLjA1NSAqIE1hdGgucG93KHgsIDEgLyAyLjQpIC0gMC4wNTUpO1xufVxuXG5mdW5jdGlvbiByZ2IybHJnYih4KSB7XG4gIHJldHVybiAoeCAvPSAyNTUpIDw9IDAuMDQwNDUgPyB4IC8gMTIuOTIgOiBNYXRoLnBvdygoeCArIDAuMDU1KSAvIDEuMDU1LCAyLjQpO1xufVxuXG5mdW5jdGlvbiBoY2xDb252ZXJ0KG8pIHtcbiAgaWYgKG8gaW5zdGFuY2VvZiBIY2wpIHJldHVybiBuZXcgSGNsKG8uaCwgby5jLCBvLmwsIG8ub3BhY2l0eSk7XG4gIGlmICghKG8gaW5zdGFuY2VvZiBMYWIpKSBvID0gbGFiQ29udmVydChvKTtcbiAgaWYgKG8uYSA9PT0gMCAmJiBvLmIgPT09IDApIHJldHVybiBuZXcgSGNsKE5hTiwgMCA8IG8ubCAmJiBvLmwgPCAxMDAgPyAwIDogTmFOLCBvLmwsIG8ub3BhY2l0eSk7XG4gIHZhciBoID0gTWF0aC5hdGFuMihvLmIsIG8uYSkgKiBkZWdyZWVzO1xuICByZXR1cm4gbmV3IEhjbChoIDwgMCA/IGggKyAzNjAgOiBoLCBNYXRoLnNxcnQoby5hICogby5hICsgby5iICogby5iKSwgby5sLCBvLm9wYWNpdHkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbGNoKGwsIGMsIGgsIG9wYWNpdHkpIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgPyBoY2xDb252ZXJ0KGwpIDogbmV3IEhjbChoLCBjLCBsLCBvcGFjaXR5ID09IG51bGwgPyAxIDogb3BhY2l0eSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoY2woaCwgYywgbCwgb3BhY2l0eSkge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PT0gMSA/IGhjbENvbnZlcnQoaCkgOiBuZXcgSGNsKGgsIGMsIGwsIG9wYWNpdHkgPT0gbnVsbCA/IDEgOiBvcGFjaXR5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEhjbChoLCBjLCBsLCBvcGFjaXR5KSB7XG4gIHRoaXMuaCA9ICtoO1xuICB0aGlzLmMgPSArYztcbiAgdGhpcy5sID0gK2w7XG4gIHRoaXMub3BhY2l0eSA9ICtvcGFjaXR5O1xufVxuXG5mdW5jdGlvbiBoY2wybGFiKG8pIHtcbiAgaWYgKGlzTmFOKG8uaCkpIHJldHVybiBuZXcgTGFiKG8ubCwgMCwgMCwgby5vcGFjaXR5KTtcbiAgdmFyIGggPSBvLmggKiByYWRpYW5zO1xuICByZXR1cm4gbmV3IExhYihvLmwsIE1hdGguY29zKGgpICogby5jLCBNYXRoLnNpbihoKSAqIG8uYywgby5vcGFjaXR5KTtcbn1cblxuZGVmaW5lKEhjbCwgaGNsLCBleHRlbmQoQ29sb3IsIHtcbiAgYnJpZ2h0ZXIoaykge1xuICAgIHJldHVybiBuZXcgSGNsKHRoaXMuaCwgdGhpcy5jLCB0aGlzLmwgKyBLICogKGsgPT0gbnVsbCA/IDEgOiBrKSwgdGhpcy5vcGFjaXR5KTtcbiAgfSxcbiAgZGFya2VyKGspIHtcbiAgICByZXR1cm4gbmV3IEhjbCh0aGlzLmgsIHRoaXMuYywgdGhpcy5sIC0gSyAqIChrID09IG51bGwgPyAxIDogayksIHRoaXMub3BhY2l0eSk7XG4gIH0sXG4gIHJnYigpIHtcbiAgICByZXR1cm4gaGNsMmxhYih0aGlzKS5yZ2IoKTtcbiAgfVxufSkpO1xuIiwiZXhwb3J0IGNvbnN0IHJhZGlhbnMgPSBNYXRoLlBJIC8gMTgwO1xuZXhwb3J0IGNvbnN0IGRlZ3JlZXMgPSAxODAgLyBNYXRoLlBJO1xuIiwidmFyIG5vb3AgPSB7dmFsdWU6ICgpID0+IHt9fTtcblxuZnVuY3Rpb24gZGlzcGF0Y2goKSB7XG4gIGZvciAodmFyIGkgPSAwLCBuID0gYXJndW1lbnRzLmxlbmd0aCwgXyA9IHt9LCB0OyBpIDwgbjsgKytpKSB7XG4gICAgaWYgKCEodCA9IGFyZ3VtZW50c1tpXSArIFwiXCIpIHx8ICh0IGluIF8pIHx8IC9bXFxzLl0vLnRlc3QodCkpIHRocm93IG5ldyBFcnJvcihcImlsbGVnYWwgdHlwZTogXCIgKyB0KTtcbiAgICBfW3RdID0gW107XG4gIH1cbiAgcmV0dXJuIG5ldyBEaXNwYXRjaChfKTtcbn1cblxuZnVuY3Rpb24gRGlzcGF0Y2goXykge1xuICB0aGlzLl8gPSBfO1xufVxuXG5mdW5jdGlvbiBwYXJzZVR5cGVuYW1lcyh0eXBlbmFtZXMsIHR5cGVzKSB7XG4gIHJldHVybiB0eXBlbmFtZXMudHJpbSgpLnNwbGl0KC9efFxccysvKS5tYXAoZnVuY3Rpb24odCkge1xuICAgIHZhciBuYW1lID0gXCJcIiwgaSA9IHQuaW5kZXhPZihcIi5cIik7XG4gICAgaWYgKGkgPj0gMCkgbmFtZSA9IHQuc2xpY2UoaSArIDEpLCB0ID0gdC5zbGljZSgwLCBpKTtcbiAgICBpZiAodCAmJiAhdHlwZXMuaGFzT3duUHJvcGVydHkodCkpIHRocm93IG5ldyBFcnJvcihcInVua25vd24gdHlwZTogXCIgKyB0KTtcbiAgICByZXR1cm4ge3R5cGU6IHQsIG5hbWU6IG5hbWV9O1xuICB9KTtcbn1cblxuRGlzcGF0Y2gucHJvdG90eXBlID0gZGlzcGF0Y2gucHJvdG90eXBlID0ge1xuICBjb25zdHJ1Y3RvcjogRGlzcGF0Y2gsXG4gIG9uOiBmdW5jdGlvbih0eXBlbmFtZSwgY2FsbGJhY2spIHtcbiAgICB2YXIgXyA9IHRoaXMuXyxcbiAgICAgICAgVCA9IHBhcnNlVHlwZW5hbWVzKHR5cGVuYW1lICsgXCJcIiwgXyksXG4gICAgICAgIHQsXG4gICAgICAgIGkgPSAtMSxcbiAgICAgICAgbiA9IFQubGVuZ3RoO1xuXG4gICAgLy8gSWYgbm8gY2FsbGJhY2sgd2FzIHNwZWNpZmllZCwgcmV0dXJuIHRoZSBjYWxsYmFjayBvZiB0aGUgZ2l2ZW4gdHlwZSBhbmQgbmFtZS5cbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHtcbiAgICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoKHQgPSAodHlwZW5hbWUgPSBUW2ldKS50eXBlKSAmJiAodCA9IGdldChfW3RdLCB0eXBlbmFtZS5uYW1lKSkpIHJldHVybiB0O1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIElmIGEgdHlwZSB3YXMgc3BlY2lmaWVkLCBzZXQgdGhlIGNhbGxiYWNrIGZvciB0aGUgZ2l2ZW4gdHlwZSBhbmQgbmFtZS5cbiAgICAvLyBPdGhlcndpc2UsIGlmIGEgbnVsbCBjYWxsYmFjayB3YXMgc3BlY2lmaWVkLCByZW1vdmUgY2FsbGJhY2tzIG9mIHRoZSBnaXZlbiBuYW1lLlxuICAgIGlmIChjYWxsYmFjayAhPSBudWxsICYmIHR5cGVvZiBjYWxsYmFjayAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIGNhbGxiYWNrOiBcIiArIGNhbGxiYWNrKTtcbiAgICB3aGlsZSAoKytpIDwgbikge1xuICAgICAgaWYgKHQgPSAodHlwZW5hbWUgPSBUW2ldKS50eXBlKSBfW3RdID0gc2V0KF9bdF0sIHR5cGVuYW1lLm5hbWUsIGNhbGxiYWNrKTtcbiAgICAgIGVsc2UgaWYgKGNhbGxiYWNrID09IG51bGwpIGZvciAodCBpbiBfKSBfW3RdID0gc2V0KF9bdF0sIHR5cGVuYW1lLm5hbWUsIG51bGwpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICBjb3B5OiBmdW5jdGlvbigpIHtcbiAgICB2YXIgY29weSA9IHt9LCBfID0gdGhpcy5fO1xuICAgIGZvciAodmFyIHQgaW4gXykgY29weVt0XSA9IF9bdF0uc2xpY2UoKTtcbiAgICByZXR1cm4gbmV3IERpc3BhdGNoKGNvcHkpO1xuICB9LFxuICBjYWxsOiBmdW5jdGlvbih0eXBlLCB0aGF0KSB7XG4gICAgaWYgKChuID0gYXJndW1lbnRzLmxlbmd0aCAtIDIpID4gMCkgZm9yICh2YXIgYXJncyA9IG5ldyBBcnJheShuKSwgaSA9IDAsIG4sIHQ7IGkgPCBuOyArK2kpIGFyZ3NbaV0gPSBhcmd1bWVudHNbaSArIDJdO1xuICAgIGlmICghdGhpcy5fLmhhc093blByb3BlcnR5KHR5cGUpKSB0aHJvdyBuZXcgRXJyb3IoXCJ1bmtub3duIHR5cGU6IFwiICsgdHlwZSk7XG4gICAgZm9yICh0ID0gdGhpcy5fW3R5cGVdLCBpID0gMCwgbiA9IHQubGVuZ3RoOyBpIDwgbjsgKytpKSB0W2ldLnZhbHVlLmFwcGx5KHRoYXQsIGFyZ3MpO1xuICB9LFxuICBhcHBseTogZnVuY3Rpb24odHlwZSwgdGhhdCwgYXJncykge1xuICAgIGlmICghdGhpcy5fLmhhc093blByb3BlcnR5KHR5cGUpKSB0aHJvdyBuZXcgRXJyb3IoXCJ1bmtub3duIHR5cGU6IFwiICsgdHlwZSk7XG4gICAgZm9yICh2YXIgdCA9IHRoaXMuX1t0eXBlXSwgaSA9IDAsIG4gPSB0Lmxlbmd0aDsgaSA8IG47ICsraSkgdFtpXS52YWx1ZS5hcHBseSh0aGF0LCBhcmdzKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gZ2V0KHR5cGUsIG5hbWUpIHtcbiAgZm9yICh2YXIgaSA9IDAsIG4gPSB0eXBlLmxlbmd0aCwgYzsgaSA8IG47ICsraSkge1xuICAgIGlmICgoYyA9IHR5cGVbaV0pLm5hbWUgPT09IG5hbWUpIHtcbiAgICAgIHJldHVybiBjLnZhbHVlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzZXQodHlwZSwgbmFtZSwgY2FsbGJhY2spIHtcbiAgZm9yICh2YXIgaSA9IDAsIG4gPSB0eXBlLmxlbmd0aDsgaSA8IG47ICsraSkge1xuICAgIGlmICh0eXBlW2ldLm5hbWUgPT09IG5hbWUpIHtcbiAgICAgIHR5cGVbaV0gPSBub29wLCB0eXBlID0gdHlwZS5zbGljZSgwLCBpKS5jb25jYXQodHlwZS5zbGljZShpICsgMSkpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIGlmIChjYWxsYmFjayAhPSBudWxsKSB0eXBlLnB1c2goe25hbWU6IG5hbWUsIHZhbHVlOiBjYWxsYmFja30pO1xuICByZXR1cm4gdHlwZTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZGlzcGF0Y2g7XG4iLCJpbXBvcnQge3NlbGVjdH0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuaW1wb3J0IG5vZXZlbnQsIHtub25wYXNzaXZlY2FwdHVyZX0gZnJvbSBcIi4vbm9ldmVudC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2aWV3KSB7XG4gIHZhciByb290ID0gdmlldy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsXG4gICAgICBzZWxlY3Rpb24gPSBzZWxlY3Qodmlldykub24oXCJkcmFnc3RhcnQuZHJhZ1wiLCBub2V2ZW50LCBub25wYXNzaXZlY2FwdHVyZSk7XG4gIGlmIChcIm9uc2VsZWN0c3RhcnRcIiBpbiByb290KSB7XG4gICAgc2VsZWN0aW9uLm9uKFwic2VsZWN0c3RhcnQuZHJhZ1wiLCBub2V2ZW50LCBub25wYXNzaXZlY2FwdHVyZSk7XG4gIH0gZWxzZSB7XG4gICAgcm9vdC5fX25vc2VsZWN0ID0gcm9vdC5zdHlsZS5Nb3pVc2VyU2VsZWN0O1xuICAgIHJvb3Quc3R5bGUuTW96VXNlclNlbGVjdCA9IFwibm9uZVwiO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB5ZXNkcmFnKHZpZXcsIG5vY2xpY2spIHtcbiAgdmFyIHJvb3QgPSB2aWV3LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxcbiAgICAgIHNlbGVjdGlvbiA9IHNlbGVjdCh2aWV3KS5vbihcImRyYWdzdGFydC5kcmFnXCIsIG51bGwpO1xuICBpZiAobm9jbGljaykge1xuICAgIHNlbGVjdGlvbi5vbihcImNsaWNrLmRyYWdcIiwgbm9ldmVudCwgbm9ucGFzc2l2ZWNhcHR1cmUpO1xuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IHNlbGVjdGlvbi5vbihcImNsaWNrLmRyYWdcIiwgbnVsbCk7IH0sIDApO1xuICB9XG4gIGlmIChcIm9uc2VsZWN0c3RhcnRcIiBpbiByb290KSB7XG4gICAgc2VsZWN0aW9uLm9uKFwic2VsZWN0c3RhcnQuZHJhZ1wiLCBudWxsKTtcbiAgfSBlbHNlIHtcbiAgICByb290LnN0eWxlLk1velVzZXJTZWxlY3QgPSByb290Ll9fbm9zZWxlY3Q7XG4gICAgZGVsZXRlIHJvb3QuX19ub3NlbGVjdDtcbiAgfVxufVxuIiwiLy8gVGhlc2UgYXJlIHR5cGljYWxseSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggbm9ldmVudCB0byBlbnN1cmUgdGhhdCB3ZSBjYW5cbi8vIHByZXZlbnREZWZhdWx0IG9uIHRoZSBldmVudC5cbmV4cG9ydCBjb25zdCBub25wYXNzaXZlID0ge3Bhc3NpdmU6IGZhbHNlfTtcbmV4cG9ydCBjb25zdCBub25wYXNzaXZlY2FwdHVyZSA9IHtjYXB0dXJlOiB0cnVlLCBwYXNzaXZlOiBmYWxzZX07XG5cbmV4cG9ydCBmdW5jdGlvbiBub3Byb3BhZ2F0aW9uKGV2ZW50KSB7XG4gIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihldmVudCkge1xuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbn1cbiIsImltcG9ydCBkc3YgZnJvbSBcIi4vZHN2LmpzXCI7XG5cbnZhciBjc3YgPSBkc3YoXCIsXCIpO1xuXG5leHBvcnQgdmFyIGNzdlBhcnNlID0gY3N2LnBhcnNlO1xuZXhwb3J0IHZhciBjc3ZQYXJzZVJvd3MgPSBjc3YucGFyc2VSb3dzO1xuZXhwb3J0IHZhciBjc3ZGb3JtYXQgPSBjc3YuZm9ybWF0O1xuZXhwb3J0IHZhciBjc3ZGb3JtYXRCb2R5ID0gY3N2LmZvcm1hdEJvZHk7XG5leHBvcnQgdmFyIGNzdkZvcm1hdFJvd3MgPSBjc3YuZm9ybWF0Um93cztcbmV4cG9ydCB2YXIgY3N2Rm9ybWF0Um93ID0gY3N2LmZvcm1hdFJvdztcbmV4cG9ydCB2YXIgY3N2Rm9ybWF0VmFsdWUgPSBjc3YuZm9ybWF0VmFsdWU7XG4iLCJ2YXIgRU9MID0ge30sXG4gICAgRU9GID0ge30sXG4gICAgUVVPVEUgPSAzNCxcbiAgICBORVdMSU5FID0gMTAsXG4gICAgUkVUVVJOID0gMTM7XG5cbmZ1bmN0aW9uIG9iamVjdENvbnZlcnRlcihjb2x1bW5zKSB7XG4gIHJldHVybiBuZXcgRnVuY3Rpb24oXCJkXCIsIFwicmV0dXJuIHtcIiArIGNvbHVtbnMubWFwKGZ1bmN0aW9uKG5hbWUsIGkpIHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkobmFtZSkgKyBcIjogZFtcIiArIGkgKyBcIl0gfHwgXFxcIlxcXCJcIjtcbiAgfSkuam9pbihcIixcIikgKyBcIn1cIik7XG59XG5cbmZ1bmN0aW9uIGN1c3RvbUNvbnZlcnRlcihjb2x1bW5zLCBmKSB7XG4gIHZhciBvYmplY3QgPSBvYmplY3RDb252ZXJ0ZXIoY29sdW1ucyk7XG4gIHJldHVybiBmdW5jdGlvbihyb3csIGkpIHtcbiAgICByZXR1cm4gZihvYmplY3Qocm93KSwgaSwgY29sdW1ucyk7XG4gIH07XG59XG5cbi8vIENvbXB1dGUgdW5pcXVlIGNvbHVtbnMgaW4gb3JkZXIgb2YgZGlzY292ZXJ5LlxuZnVuY3Rpb24gaW5mZXJDb2x1bW5zKHJvd3MpIHtcbiAgdmFyIGNvbHVtblNldCA9IE9iamVjdC5jcmVhdGUobnVsbCksXG4gICAgICBjb2x1bW5zID0gW107XG5cbiAgcm93cy5mb3JFYWNoKGZ1bmN0aW9uKHJvdykge1xuICAgIGZvciAodmFyIGNvbHVtbiBpbiByb3cpIHtcbiAgICAgIGlmICghKGNvbHVtbiBpbiBjb2x1bW5TZXQpKSB7XG4gICAgICAgIGNvbHVtbnMucHVzaChjb2x1bW5TZXRbY29sdW1uXSA9IGNvbHVtbik7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gY29sdW1ucztcbn1cblxuZnVuY3Rpb24gcGFkKHZhbHVlLCB3aWR0aCkge1xuICB2YXIgcyA9IHZhbHVlICsgXCJcIiwgbGVuZ3RoID0gcy5sZW5ndGg7XG4gIHJldHVybiBsZW5ndGggPCB3aWR0aCA/IG5ldyBBcnJheSh3aWR0aCAtIGxlbmd0aCArIDEpLmpvaW4oMCkgKyBzIDogcztcbn1cblxuZnVuY3Rpb24gZm9ybWF0WWVhcih5ZWFyKSB7XG4gIHJldHVybiB5ZWFyIDwgMCA/IFwiLVwiICsgcGFkKC15ZWFyLCA2KVxuICAgIDogeWVhciA+IDk5OTkgPyBcIitcIiArIHBhZCh5ZWFyLCA2KVxuICAgIDogcGFkKHllYXIsIDQpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXREYXRlKGRhdGUpIHtcbiAgdmFyIGhvdXJzID0gZGF0ZS5nZXRVVENIb3VycygpLFxuICAgICAgbWludXRlcyA9IGRhdGUuZ2V0VVRDTWludXRlcygpLFxuICAgICAgc2Vjb25kcyA9IGRhdGUuZ2V0VVRDU2Vjb25kcygpLFxuICAgICAgbWlsbGlzZWNvbmRzID0gZGF0ZS5nZXRVVENNaWxsaXNlY29uZHMoKTtcbiAgcmV0dXJuIGlzTmFOKGRhdGUpID8gXCJJbnZhbGlkIERhdGVcIlxuICAgICAgOiBmb3JtYXRZZWFyKGRhdGUuZ2V0VVRDRnVsbFllYXIoKSwgNCkgKyBcIi1cIiArIHBhZChkYXRlLmdldFVUQ01vbnRoKCkgKyAxLCAyKSArIFwiLVwiICsgcGFkKGRhdGUuZ2V0VVRDRGF0ZSgpLCAyKVxuICAgICAgKyAobWlsbGlzZWNvbmRzID8gXCJUXCIgKyBwYWQoaG91cnMsIDIpICsgXCI6XCIgKyBwYWQobWludXRlcywgMikgKyBcIjpcIiArIHBhZChzZWNvbmRzLCAyKSArIFwiLlwiICsgcGFkKG1pbGxpc2Vjb25kcywgMykgKyBcIlpcIlxuICAgICAgOiBzZWNvbmRzID8gXCJUXCIgKyBwYWQoaG91cnMsIDIpICsgXCI6XCIgKyBwYWQobWludXRlcywgMikgKyBcIjpcIiArIHBhZChzZWNvbmRzLCAyKSArIFwiWlwiXG4gICAgICA6IG1pbnV0ZXMgfHwgaG91cnMgPyBcIlRcIiArIHBhZChob3VycywgMikgKyBcIjpcIiArIHBhZChtaW51dGVzLCAyKSArIFwiWlwiXG4gICAgICA6IFwiXCIpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihkZWxpbWl0ZXIpIHtcbiAgdmFyIHJlRm9ybWF0ID0gbmV3IFJlZ0V4cChcIltcXFwiXCIgKyBkZWxpbWl0ZXIgKyBcIlxcblxccl1cIiksXG4gICAgICBERUxJTUlURVIgPSBkZWxpbWl0ZXIuY2hhckNvZGVBdCgwKTtcblxuICBmdW5jdGlvbiBwYXJzZSh0ZXh0LCBmKSB7XG4gICAgdmFyIGNvbnZlcnQsIGNvbHVtbnMsIHJvd3MgPSBwYXJzZVJvd3ModGV4dCwgZnVuY3Rpb24ocm93LCBpKSB7XG4gICAgICBpZiAoY29udmVydCkgcmV0dXJuIGNvbnZlcnQocm93LCBpIC0gMSk7XG4gICAgICBjb2x1bW5zID0gcm93LCBjb252ZXJ0ID0gZiA/IGN1c3RvbUNvbnZlcnRlcihyb3csIGYpIDogb2JqZWN0Q29udmVydGVyKHJvdyk7XG4gICAgfSk7XG4gICAgcm93cy5jb2x1bW5zID0gY29sdW1ucyB8fCBbXTtcbiAgICByZXR1cm4gcm93cztcbiAgfVxuXG4gIGZ1bmN0aW9uIHBhcnNlUm93cyh0ZXh0LCBmKSB7XG4gICAgdmFyIHJvd3MgPSBbXSwgLy8gb3V0cHV0IHJvd3NcbiAgICAgICAgTiA9IHRleHQubGVuZ3RoLFxuICAgICAgICBJID0gMCwgLy8gY3VycmVudCBjaGFyYWN0ZXIgaW5kZXhcbiAgICAgICAgbiA9IDAsIC8vIGN1cnJlbnQgbGluZSBudW1iZXJcbiAgICAgICAgdCwgLy8gY3VycmVudCB0b2tlblxuICAgICAgICBlb2YgPSBOIDw9IDAsIC8vIGN1cnJlbnQgdG9rZW4gZm9sbG93ZWQgYnkgRU9GP1xuICAgICAgICBlb2wgPSBmYWxzZTsgLy8gY3VycmVudCB0b2tlbiBmb2xsb3dlZCBieSBFT0w/XG5cbiAgICAvLyBTdHJpcCB0aGUgdHJhaWxpbmcgbmV3bGluZS5cbiAgICBpZiAodGV4dC5jaGFyQ29kZUF0KE4gLSAxKSA9PT0gTkVXTElORSkgLS1OO1xuICAgIGlmICh0ZXh0LmNoYXJDb2RlQXQoTiAtIDEpID09PSBSRVRVUk4pIC0tTjtcblxuICAgIGZ1bmN0aW9uIHRva2VuKCkge1xuICAgICAgaWYgKGVvZikgcmV0dXJuIEVPRjtcbiAgICAgIGlmIChlb2wpIHJldHVybiBlb2wgPSBmYWxzZSwgRU9MO1xuXG4gICAgICAvLyBVbmVzY2FwZSBxdW90ZXMuXG4gICAgICB2YXIgaSwgaiA9IEksIGM7XG4gICAgICBpZiAodGV4dC5jaGFyQ29kZUF0KGopID09PSBRVU9URSkge1xuICAgICAgICB3aGlsZSAoSSsrIDwgTiAmJiB0ZXh0LmNoYXJDb2RlQXQoSSkgIT09IFFVT1RFIHx8IHRleHQuY2hhckNvZGVBdCgrK0kpID09PSBRVU9URSk7XG4gICAgICAgIGlmICgoaSA9IEkpID49IE4pIGVvZiA9IHRydWU7XG4gICAgICAgIGVsc2UgaWYgKChjID0gdGV4dC5jaGFyQ29kZUF0KEkrKykpID09PSBORVdMSU5FKSBlb2wgPSB0cnVlO1xuICAgICAgICBlbHNlIGlmIChjID09PSBSRVRVUk4pIHsgZW9sID0gdHJ1ZTsgaWYgKHRleHQuY2hhckNvZGVBdChJKSA9PT0gTkVXTElORSkgKytJOyB9XG4gICAgICAgIHJldHVybiB0ZXh0LnNsaWNlKGogKyAxLCBpIC0gMSkucmVwbGFjZSgvXCJcIi9nLCBcIlxcXCJcIik7XG4gICAgICB9XG5cbiAgICAgIC8vIEZpbmQgbmV4dCBkZWxpbWl0ZXIgb3IgbmV3bGluZS5cbiAgICAgIHdoaWxlIChJIDwgTikge1xuICAgICAgICBpZiAoKGMgPSB0ZXh0LmNoYXJDb2RlQXQoaSA9IEkrKykpID09PSBORVdMSU5FKSBlb2wgPSB0cnVlO1xuICAgICAgICBlbHNlIGlmIChjID09PSBSRVRVUk4pIHsgZW9sID0gdHJ1ZTsgaWYgKHRleHQuY2hhckNvZGVBdChJKSA9PT0gTkVXTElORSkgKytJOyB9XG4gICAgICAgIGVsc2UgaWYgKGMgIT09IERFTElNSVRFUikgY29udGludWU7XG4gICAgICAgIHJldHVybiB0ZXh0LnNsaWNlKGosIGkpO1xuICAgICAgfVxuXG4gICAgICAvLyBSZXR1cm4gbGFzdCB0b2tlbiBiZWZvcmUgRU9GLlxuICAgICAgcmV0dXJuIGVvZiA9IHRydWUsIHRleHQuc2xpY2UoaiwgTik7XG4gICAgfVxuXG4gICAgd2hpbGUgKCh0ID0gdG9rZW4oKSkgIT09IEVPRikge1xuICAgICAgdmFyIHJvdyA9IFtdO1xuICAgICAgd2hpbGUgKHQgIT09IEVPTCAmJiB0ICE9PSBFT0YpIHJvdy5wdXNoKHQpLCB0ID0gdG9rZW4oKTtcbiAgICAgIGlmIChmICYmIChyb3cgPSBmKHJvdywgbisrKSkgPT0gbnVsbCkgY29udGludWU7XG4gICAgICByb3dzLnB1c2gocm93KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcm93cztcbiAgfVxuXG4gIGZ1bmN0aW9uIHByZWZvcm1hdEJvZHkocm93cywgY29sdW1ucykge1xuICAgIHJldHVybiByb3dzLm1hcChmdW5jdGlvbihyb3cpIHtcbiAgICAgIHJldHVybiBjb2x1bW5zLm1hcChmdW5jdGlvbihjb2x1bW4pIHtcbiAgICAgICAgcmV0dXJuIGZvcm1hdFZhbHVlKHJvd1tjb2x1bW5dKTtcbiAgICAgIH0pLmpvaW4oZGVsaW1pdGVyKTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZvcm1hdChyb3dzLCBjb2x1bW5zKSB7XG4gICAgaWYgKGNvbHVtbnMgPT0gbnVsbCkgY29sdW1ucyA9IGluZmVyQ29sdW1ucyhyb3dzKTtcbiAgICByZXR1cm4gW2NvbHVtbnMubWFwKGZvcm1hdFZhbHVlKS5qb2luKGRlbGltaXRlcildLmNvbmNhdChwcmVmb3JtYXRCb2R5KHJvd3MsIGNvbHVtbnMpKS5qb2luKFwiXFxuXCIpO1xuICB9XG5cbiAgZnVuY3Rpb24gZm9ybWF0Qm9keShyb3dzLCBjb2x1bW5zKSB7XG4gICAgaWYgKGNvbHVtbnMgPT0gbnVsbCkgY29sdW1ucyA9IGluZmVyQ29sdW1ucyhyb3dzKTtcbiAgICByZXR1cm4gcHJlZm9ybWF0Qm9keShyb3dzLCBjb2x1bW5zKS5qb2luKFwiXFxuXCIpO1xuICB9XG5cbiAgZnVuY3Rpb24gZm9ybWF0Um93cyhyb3dzKSB7XG4gICAgcmV0dXJuIHJvd3MubWFwKGZvcm1hdFJvdykuam9pbihcIlxcblwiKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZvcm1hdFJvdyhyb3cpIHtcbiAgICByZXR1cm4gcm93Lm1hcChmb3JtYXRWYWx1ZSkuam9pbihkZWxpbWl0ZXIpO1xuICB9XG5cbiAgZnVuY3Rpb24gZm9ybWF0VmFsdWUodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPT0gbnVsbCA/IFwiXCJcbiAgICAgICAgOiB2YWx1ZSBpbnN0YW5jZW9mIERhdGUgPyBmb3JtYXREYXRlKHZhbHVlKVxuICAgICAgICA6IHJlRm9ybWF0LnRlc3QodmFsdWUgKz0gXCJcIikgPyBcIlxcXCJcIiArIHZhbHVlLnJlcGxhY2UoL1wiL2csIFwiXFxcIlxcXCJcIikgKyBcIlxcXCJcIlxuICAgICAgICA6IHZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBwYXJzZTogcGFyc2UsXG4gICAgcGFyc2VSb3dzOiBwYXJzZVJvd3MsXG4gICAgZm9ybWF0OiBmb3JtYXQsXG4gICAgZm9ybWF0Qm9keTogZm9ybWF0Qm9keSxcbiAgICBmb3JtYXRSb3dzOiBmb3JtYXRSb3dzLFxuICAgIGZvcm1hdFJvdzogZm9ybWF0Um93LFxuICAgIGZvcm1hdFZhbHVlOiBmb3JtYXRWYWx1ZVxuICB9O1xufVxuIiwiaW1wb3J0IGRzdiBmcm9tIFwiLi9kc3YuanNcIjtcblxudmFyIHRzdiA9IGRzdihcIlxcdFwiKTtcblxuZXhwb3J0IHZhciB0c3ZQYXJzZSA9IHRzdi5wYXJzZTtcbmV4cG9ydCB2YXIgdHN2UGFyc2VSb3dzID0gdHN2LnBhcnNlUm93cztcbmV4cG9ydCB2YXIgdHN2Rm9ybWF0ID0gdHN2LmZvcm1hdDtcbmV4cG9ydCB2YXIgdHN2Rm9ybWF0Qm9keSA9IHRzdi5mb3JtYXRCb2R5O1xuZXhwb3J0IHZhciB0c3ZGb3JtYXRSb3dzID0gdHN2LmZvcm1hdFJvd3M7XG5leHBvcnQgdmFyIHRzdkZvcm1hdFJvdyA9IHRzdi5mb3JtYXRSb3c7XG5leHBvcnQgdmFyIHRzdkZvcm1hdFZhbHVlID0gdHN2LmZvcm1hdFZhbHVlO1xuIiwiZXhwb3J0IGZ1bmN0aW9uIGN1YmljSW4odCkge1xuICByZXR1cm4gdCAqIHQgKiB0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3ViaWNPdXQodCkge1xuICByZXR1cm4gLS10ICogdCAqIHQgKyAxO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3ViaWNJbk91dCh0KSB7XG4gIHJldHVybiAoKHQgKj0gMikgPD0gMSA/IHQgKiB0ICogdCA6ICh0IC09IDIpICogdCAqIHQgKyAyKSAvIDI7XG59XG4iLCJpbXBvcnQge2NzdlBhcnNlLCBkc3ZGb3JtYXQsIHRzdlBhcnNlfSBmcm9tIFwiZDMtZHN2XCI7XG5pbXBvcnQgdGV4dCBmcm9tIFwiLi90ZXh0LmpzXCI7XG5cbmZ1bmN0aW9uIGRzdlBhcnNlKHBhcnNlKSB7XG4gIHJldHVybiBmdW5jdGlvbihpbnB1dCwgaW5pdCwgcm93KSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIgJiYgdHlwZW9mIGluaXQgPT09IFwiZnVuY3Rpb25cIikgcm93ID0gaW5pdCwgaW5pdCA9IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gdGV4dChpbnB1dCwgaW5pdCkudGhlbihmdW5jdGlvbihyZXNwb25zZSkge1xuICAgICAgcmV0dXJuIHBhcnNlKHJlc3BvbnNlLCByb3cpO1xuICAgIH0pO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBkc3YoZGVsaW1pdGVyLCBpbnB1dCwgaW5pdCwgcm93KSB7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzICYmIHR5cGVvZiBpbml0ID09PSBcImZ1bmN0aW9uXCIpIHJvdyA9IGluaXQsIGluaXQgPSB1bmRlZmluZWQ7XG4gIHZhciBmb3JtYXQgPSBkc3ZGb3JtYXQoZGVsaW1pdGVyKTtcbiAgcmV0dXJuIHRleHQoaW5wdXQsIGluaXQpLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHtcbiAgICByZXR1cm4gZm9ybWF0LnBhcnNlKHJlc3BvbnNlLCByb3cpO1xuICB9KTtcbn1cblxuZXhwb3J0IHZhciBjc3YgPSBkc3ZQYXJzZShjc3ZQYXJzZSk7XG5leHBvcnQgdmFyIHRzdiA9IGRzdlBhcnNlKHRzdlBhcnNlKTtcbiIsImZ1bmN0aW9uIHJlc3BvbnNlSnNvbihyZXNwb25zZSkge1xuICBpZiAoIXJlc3BvbnNlLm9rKSB0aHJvdyBuZXcgRXJyb3IocmVzcG9uc2Uuc3RhdHVzICsgXCIgXCIgKyByZXNwb25zZS5zdGF0dXNUZXh0KTtcbiAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gMjA0IHx8IHJlc3BvbnNlLnN0YXR1cyA9PT0gMjA1KSByZXR1cm47XG4gIHJldHVybiByZXNwb25zZS5qc29uKCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGlucHV0LCBpbml0KSB7XG4gIHJldHVybiBmZXRjaChpbnB1dCwgaW5pdCkudGhlbihyZXNwb25zZUpzb24pO1xufVxuIiwiZnVuY3Rpb24gcmVzcG9uc2VUZXh0KHJlc3BvbnNlKSB7XG4gIGlmICghcmVzcG9uc2Uub2spIHRocm93IG5ldyBFcnJvcihyZXNwb25zZS5zdGF0dXMgKyBcIiBcIiArIHJlc3BvbnNlLnN0YXR1c1RleHQpO1xuICByZXR1cm4gcmVzcG9uc2UudGV4dCgpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihpbnB1dCwgaW5pdCkge1xuICByZXR1cm4gZmV0Y2goaW5wdXQsIGluaXQpLnRoZW4ocmVzcG9uc2VUZXh0KTtcbn1cbiIsImltcG9ydCBmb3JtYXRMb2NhbGUgZnJvbSBcIi4vbG9jYWxlLmpzXCI7XG5cbnZhciBsb2NhbGU7XG5leHBvcnQgdmFyIGZvcm1hdDtcbmV4cG9ydCB2YXIgZm9ybWF0UHJlZml4O1xuXG5kZWZhdWx0TG9jYWxlKHtcbiAgdGhvdXNhbmRzOiBcIixcIixcbiAgZ3JvdXBpbmc6IFszXSxcbiAgY3VycmVuY3k6IFtcIiRcIiwgXCJcIl1cbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBkZWZhdWx0TG9jYWxlKGRlZmluaXRpb24pIHtcbiAgbG9jYWxlID0gZm9ybWF0TG9jYWxlKGRlZmluaXRpb24pO1xuICBmb3JtYXQgPSBsb2NhbGUuZm9ybWF0O1xuICBmb3JtYXRQcmVmaXggPSBsb2NhbGUuZm9ybWF0UHJlZml4O1xuICByZXR1cm4gbG9jYWxlO1xufVxuIiwiaW1wb3J0IHtmb3JtYXREZWNpbWFsUGFydHN9IGZyb20gXCIuL2Zvcm1hdERlY2ltYWwuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oeCkge1xuICByZXR1cm4geCA9IGZvcm1hdERlY2ltYWxQYXJ0cyhNYXRoLmFicyh4KSksIHggPyB4WzFdIDogTmFOO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oeCkge1xuICByZXR1cm4gTWF0aC5hYnMoeCA9IE1hdGgucm91bmQoeCkpID49IDFlMjFcbiAgICAgID8geC50b0xvY2FsZVN0cmluZyhcImVuXCIpLnJlcGxhY2UoLywvZywgXCJcIilcbiAgICAgIDogeC50b1N0cmluZygxMCk7XG59XG5cbi8vIENvbXB1dGVzIHRoZSBkZWNpbWFsIGNvZWZmaWNpZW50IGFuZCBleHBvbmVudCBvZiB0aGUgc3BlY2lmaWVkIG51bWJlciB4IHdpdGhcbi8vIHNpZ25pZmljYW50IGRpZ2l0cyBwLCB3aGVyZSB4IGlzIHBvc2l0aXZlIGFuZCBwIGlzIGluIFsxLCAyMV0gb3IgdW5kZWZpbmVkLlxuLy8gRm9yIGV4YW1wbGUsIGZvcm1hdERlY2ltYWxQYXJ0cygxLjIzKSByZXR1cm5zIFtcIjEyM1wiLCAwXS5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXREZWNpbWFsUGFydHMoeCwgcCkge1xuICBpZiAoKGkgPSAoeCA9IHAgPyB4LnRvRXhwb25lbnRpYWwocCAtIDEpIDogeC50b0V4cG9uZW50aWFsKCkpLmluZGV4T2YoXCJlXCIpKSA8IDApIHJldHVybiBudWxsOyAvLyBOYU4sIMKxSW5maW5pdHlcbiAgdmFyIGksIGNvZWZmaWNpZW50ID0geC5zbGljZSgwLCBpKTtcblxuICAvLyBUaGUgc3RyaW5nIHJldHVybmVkIGJ5IHRvRXhwb25lbnRpYWwgZWl0aGVyIGhhcyB0aGUgZm9ybSBcXGRcXC5cXGQrZVstK11cXGQrXG4gIC8vIChlLmcuLCAxLjJlKzMpIG9yIHRoZSBmb3JtIFxcZGVbLStdXFxkKyAoZS5nLiwgMWUrMykuXG4gIHJldHVybiBbXG4gICAgY29lZmZpY2llbnQubGVuZ3RoID4gMSA/IGNvZWZmaWNpZW50WzBdICsgY29lZmZpY2llbnQuc2xpY2UoMikgOiBjb2VmZmljaWVudCxcbiAgICAreC5zbGljZShpICsgMSlcbiAgXTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGdyb3VwaW5nLCB0aG91c2FuZHMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlLCB3aWR0aCkge1xuICAgIHZhciBpID0gdmFsdWUubGVuZ3RoLFxuICAgICAgICB0ID0gW10sXG4gICAgICAgIGogPSAwLFxuICAgICAgICBnID0gZ3JvdXBpbmdbMF0sXG4gICAgICAgIGxlbmd0aCA9IDA7XG5cbiAgICB3aGlsZSAoaSA+IDAgJiYgZyA+IDApIHtcbiAgICAgIGlmIChsZW5ndGggKyBnICsgMSA+IHdpZHRoKSBnID0gTWF0aC5tYXgoMSwgd2lkdGggLSBsZW5ndGgpO1xuICAgICAgdC5wdXNoKHZhbHVlLnN1YnN0cmluZyhpIC09IGcsIGkgKyBnKSk7XG4gICAgICBpZiAoKGxlbmd0aCArPSBnICsgMSkgPiB3aWR0aCkgYnJlYWs7XG4gICAgICBnID0gZ3JvdXBpbmdbaiA9IChqICsgMSkgJSBncm91cGluZy5sZW5ndGhdO1xuICAgIH1cblxuICAgIHJldHVybiB0LnJldmVyc2UoKS5qb2luKHRob3VzYW5kcyk7XG4gIH07XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihudW1lcmFscykge1xuICByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUucmVwbGFjZSgvWzAtOV0vZywgZnVuY3Rpb24oaSkge1xuICAgICAgcmV0dXJuIG51bWVyYWxzWytpXTtcbiAgICB9KTtcbiAgfTtcbn1cbiIsImltcG9ydCB7Zm9ybWF0RGVjaW1hbFBhcnRzfSBmcm9tIFwiLi9mb3JtYXREZWNpbWFsLmpzXCI7XG5cbmV4cG9ydCB2YXIgcHJlZml4RXhwb25lbnQ7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHgsIHApIHtcbiAgdmFyIGQgPSBmb3JtYXREZWNpbWFsUGFydHMoeCwgcCk7XG4gIGlmICghZCkgcmV0dXJuIHggKyBcIlwiO1xuICB2YXIgY29lZmZpY2llbnQgPSBkWzBdLFxuICAgICAgZXhwb25lbnQgPSBkWzFdLFxuICAgICAgaSA9IGV4cG9uZW50IC0gKHByZWZpeEV4cG9uZW50ID0gTWF0aC5tYXgoLTgsIE1hdGgubWluKDgsIE1hdGguZmxvb3IoZXhwb25lbnQgLyAzKSkpICogMykgKyAxLFxuICAgICAgbiA9IGNvZWZmaWNpZW50Lmxlbmd0aDtcbiAgcmV0dXJuIGkgPT09IG4gPyBjb2VmZmljaWVudFxuICAgICAgOiBpID4gbiA/IGNvZWZmaWNpZW50ICsgbmV3IEFycmF5KGkgLSBuICsgMSkuam9pbihcIjBcIilcbiAgICAgIDogaSA+IDAgPyBjb2VmZmljaWVudC5zbGljZSgwLCBpKSArIFwiLlwiICsgY29lZmZpY2llbnQuc2xpY2UoaSlcbiAgICAgIDogXCIwLlwiICsgbmV3IEFycmF5KDEgLSBpKS5qb2luKFwiMFwiKSArIGZvcm1hdERlY2ltYWxQYXJ0cyh4LCBNYXRoLm1heCgwLCBwICsgaSAtIDEpKVswXTsgLy8gbGVzcyB0aGFuIDF5IVxufVxuIiwiaW1wb3J0IHtmb3JtYXREZWNpbWFsUGFydHN9IGZyb20gXCIuL2Zvcm1hdERlY2ltYWwuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oeCwgcCkge1xuICB2YXIgZCA9IGZvcm1hdERlY2ltYWxQYXJ0cyh4LCBwKTtcbiAgaWYgKCFkKSByZXR1cm4geCArIFwiXCI7XG4gIHZhciBjb2VmZmljaWVudCA9IGRbMF0sXG4gICAgICBleHBvbmVudCA9IGRbMV07XG4gIHJldHVybiBleHBvbmVudCA8IDAgPyBcIjAuXCIgKyBuZXcgQXJyYXkoLWV4cG9uZW50KS5qb2luKFwiMFwiKSArIGNvZWZmaWNpZW50XG4gICAgICA6IGNvZWZmaWNpZW50Lmxlbmd0aCA+IGV4cG9uZW50ICsgMSA/IGNvZWZmaWNpZW50LnNsaWNlKDAsIGV4cG9uZW50ICsgMSkgKyBcIi5cIiArIGNvZWZmaWNpZW50LnNsaWNlKGV4cG9uZW50ICsgMSlcbiAgICAgIDogY29lZmZpY2llbnQgKyBuZXcgQXJyYXkoZXhwb25lbnQgLSBjb2VmZmljaWVudC5sZW5ndGggKyAyKS5qb2luKFwiMFwiKTtcbn1cbiIsIi8vIFtbZmlsbF1hbGlnbl1bc2lnbl1bc3ltYm9sXVswXVt3aWR0aF1bLF1bLnByZWNpc2lvbl1bfl1bdHlwZV1cbnZhciByZSA9IC9eKD86KC4pPyhbPD49Xl0pKT8oWytcXC0oIF0pPyhbJCNdKT8oMCk/KFxcZCspPygsKT8oXFwuXFxkKyk/KH4pPyhbYS16JV0pPyQvaTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZm9ybWF0U3BlY2lmaWVyKHNwZWNpZmllcikge1xuICBpZiAoIShtYXRjaCA9IHJlLmV4ZWMoc3BlY2lmaWVyKSkpIHRocm93IG5ldyBFcnJvcihcImludmFsaWQgZm9ybWF0OiBcIiArIHNwZWNpZmllcik7XG4gIHZhciBtYXRjaDtcbiAgcmV0dXJuIG5ldyBGb3JtYXRTcGVjaWZpZXIoe1xuICAgIGZpbGw6IG1hdGNoWzFdLFxuICAgIGFsaWduOiBtYXRjaFsyXSxcbiAgICBzaWduOiBtYXRjaFszXSxcbiAgICBzeW1ib2w6IG1hdGNoWzRdLFxuICAgIHplcm86IG1hdGNoWzVdLFxuICAgIHdpZHRoOiBtYXRjaFs2XSxcbiAgICBjb21tYTogbWF0Y2hbN10sXG4gICAgcHJlY2lzaW9uOiBtYXRjaFs4XSAmJiBtYXRjaFs4XS5zbGljZSgxKSxcbiAgICB0cmltOiBtYXRjaFs5XSxcbiAgICB0eXBlOiBtYXRjaFsxMF1cbiAgfSk7XG59XG5cbmZvcm1hdFNwZWNpZmllci5wcm90b3R5cGUgPSBGb3JtYXRTcGVjaWZpZXIucHJvdG90eXBlOyAvLyBpbnN0YW5jZW9mXG5cbmV4cG9ydCBmdW5jdGlvbiBGb3JtYXRTcGVjaWZpZXIoc3BlY2lmaWVyKSB7XG4gIHRoaXMuZmlsbCA9IHNwZWNpZmllci5maWxsID09PSB1bmRlZmluZWQgPyBcIiBcIiA6IHNwZWNpZmllci5maWxsICsgXCJcIjtcbiAgdGhpcy5hbGlnbiA9IHNwZWNpZmllci5hbGlnbiA9PT0gdW5kZWZpbmVkID8gXCI+XCIgOiBzcGVjaWZpZXIuYWxpZ24gKyBcIlwiO1xuICB0aGlzLnNpZ24gPSBzcGVjaWZpZXIuc2lnbiA9PT0gdW5kZWZpbmVkID8gXCItXCIgOiBzcGVjaWZpZXIuc2lnbiArIFwiXCI7XG4gIHRoaXMuc3ltYm9sID0gc3BlY2lmaWVyLnN5bWJvbCA9PT0gdW5kZWZpbmVkID8gXCJcIiA6IHNwZWNpZmllci5zeW1ib2wgKyBcIlwiO1xuICB0aGlzLnplcm8gPSAhIXNwZWNpZmllci56ZXJvO1xuICB0aGlzLndpZHRoID0gc3BlY2lmaWVyLndpZHRoID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiArc3BlY2lmaWVyLndpZHRoO1xuICB0aGlzLmNvbW1hID0gISFzcGVjaWZpZXIuY29tbWE7XG4gIHRoaXMucHJlY2lzaW9uID0gc3BlY2lmaWVyLnByZWNpc2lvbiA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogK3NwZWNpZmllci5wcmVjaXNpb247XG4gIHRoaXMudHJpbSA9ICEhc3BlY2lmaWVyLnRyaW07XG4gIHRoaXMudHlwZSA9IHNwZWNpZmllci50eXBlID09PSB1bmRlZmluZWQgPyBcIlwiIDogc3BlY2lmaWVyLnR5cGUgKyBcIlwiO1xufVxuXG5Gb3JtYXRTcGVjaWZpZXIucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLmZpbGxcbiAgICAgICsgdGhpcy5hbGlnblxuICAgICAgKyB0aGlzLnNpZ25cbiAgICAgICsgdGhpcy5zeW1ib2xcbiAgICAgICsgKHRoaXMuemVybyA/IFwiMFwiIDogXCJcIilcbiAgICAgICsgKHRoaXMud2lkdGggPT09IHVuZGVmaW5lZCA/IFwiXCIgOiBNYXRoLm1heCgxLCB0aGlzLndpZHRoIHwgMCkpXG4gICAgICArICh0aGlzLmNvbW1hID8gXCIsXCIgOiBcIlwiKVxuICAgICAgKyAodGhpcy5wcmVjaXNpb24gPT09IHVuZGVmaW5lZCA/IFwiXCIgOiBcIi5cIiArIE1hdGgubWF4KDAsIHRoaXMucHJlY2lzaW9uIHwgMCkpXG4gICAgICArICh0aGlzLnRyaW0gPyBcIn5cIiA6IFwiXCIpXG4gICAgICArIHRoaXMudHlwZTtcbn07XG4iLCIvLyBUcmltcyBpbnNpZ25pZmljYW50IHplcm9zLCBlLmcuLCByZXBsYWNlcyAxLjIwMDBrIHdpdGggMS4yay5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHMpIHtcbiAgb3V0OiBmb3IgKHZhciBuID0gcy5sZW5ndGgsIGkgPSAxLCBpMCA9IC0xLCBpMTsgaSA8IG47ICsraSkge1xuICAgIHN3aXRjaCAoc1tpXSkge1xuICAgICAgY2FzZSBcIi5cIjogaTAgPSBpMSA9IGk7IGJyZWFrO1xuICAgICAgY2FzZSBcIjBcIjogaWYgKGkwID09PSAwKSBpMCA9IGk7IGkxID0gaTsgYnJlYWs7XG4gICAgICBkZWZhdWx0OiBpZiAoIStzW2ldKSBicmVhayBvdXQ7IGlmIChpMCA+IDApIGkwID0gMDsgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJldHVybiBpMCA+IDAgPyBzLnNsaWNlKDAsIGkwKSArIHMuc2xpY2UoaTEgKyAxKSA6IHM7XG59XG4iLCJpbXBvcnQgZm9ybWF0RGVjaW1hbCBmcm9tIFwiLi9mb3JtYXREZWNpbWFsLmpzXCI7XG5pbXBvcnQgZm9ybWF0UHJlZml4QXV0byBmcm9tIFwiLi9mb3JtYXRQcmVmaXhBdXRvLmpzXCI7XG5pbXBvcnQgZm9ybWF0Um91bmRlZCBmcm9tIFwiLi9mb3JtYXRSb3VuZGVkLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgXCIlXCI6ICh4LCBwKSA9PiAoeCAqIDEwMCkudG9GaXhlZChwKSxcbiAgXCJiXCI6ICh4KSA9PiBNYXRoLnJvdW5kKHgpLnRvU3RyaW5nKDIpLFxuICBcImNcIjogKHgpID0+IHggKyBcIlwiLFxuICBcImRcIjogZm9ybWF0RGVjaW1hbCxcbiAgXCJlXCI6ICh4LCBwKSA9PiB4LnRvRXhwb25lbnRpYWwocCksXG4gIFwiZlwiOiAoeCwgcCkgPT4geC50b0ZpeGVkKHApLFxuICBcImdcIjogKHgsIHApID0+IHgudG9QcmVjaXNpb24ocCksXG4gIFwib1wiOiAoeCkgPT4gTWF0aC5yb3VuZCh4KS50b1N0cmluZyg4KSxcbiAgXCJwXCI6ICh4LCBwKSA9PiBmb3JtYXRSb3VuZGVkKHggKiAxMDAsIHApLFxuICBcInJcIjogZm9ybWF0Um91bmRlZCxcbiAgXCJzXCI6IGZvcm1hdFByZWZpeEF1dG8sXG4gIFwiWFwiOiAoeCkgPT4gTWF0aC5yb3VuZCh4KS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKSxcbiAgXCJ4XCI6ICh4KSA9PiBNYXRoLnJvdW5kKHgpLnRvU3RyaW5nKDE2KVxufTtcbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHgpIHtcbiAgcmV0dXJuIHg7XG59XG4iLCJpbXBvcnQgZXhwb25lbnQgZnJvbSBcIi4vZXhwb25lbnQuanNcIjtcbmltcG9ydCBmb3JtYXRHcm91cCBmcm9tIFwiLi9mb3JtYXRHcm91cC5qc1wiO1xuaW1wb3J0IGZvcm1hdE51bWVyYWxzIGZyb20gXCIuL2Zvcm1hdE51bWVyYWxzLmpzXCI7XG5pbXBvcnQgZm9ybWF0U3BlY2lmaWVyIGZyb20gXCIuL2Zvcm1hdFNwZWNpZmllci5qc1wiO1xuaW1wb3J0IGZvcm1hdFRyaW0gZnJvbSBcIi4vZm9ybWF0VHJpbS5qc1wiO1xuaW1wb3J0IGZvcm1hdFR5cGVzIGZyb20gXCIuL2Zvcm1hdFR5cGVzLmpzXCI7XG5pbXBvcnQge3ByZWZpeEV4cG9uZW50fSBmcm9tIFwiLi9mb3JtYXRQcmVmaXhBdXRvLmpzXCI7XG5pbXBvcnQgaWRlbnRpdHkgZnJvbSBcIi4vaWRlbnRpdHkuanNcIjtcblxudmFyIG1hcCA9IEFycmF5LnByb3RvdHlwZS5tYXAsXG4gICAgcHJlZml4ZXMgPSBbXCJ5XCIsXCJ6XCIsXCJhXCIsXCJmXCIsXCJwXCIsXCJuXCIsXCLCtVwiLFwibVwiLFwiXCIsXCJrXCIsXCJNXCIsXCJHXCIsXCJUXCIsXCJQXCIsXCJFXCIsXCJaXCIsXCJZXCJdO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihsb2NhbGUpIHtcbiAgdmFyIGdyb3VwID0gbG9jYWxlLmdyb3VwaW5nID09PSB1bmRlZmluZWQgfHwgbG9jYWxlLnRob3VzYW5kcyA9PT0gdW5kZWZpbmVkID8gaWRlbnRpdHkgOiBmb3JtYXRHcm91cChtYXAuY2FsbChsb2NhbGUuZ3JvdXBpbmcsIE51bWJlciksIGxvY2FsZS50aG91c2FuZHMgKyBcIlwiKSxcbiAgICAgIGN1cnJlbmN5UHJlZml4ID0gbG9jYWxlLmN1cnJlbmN5ID09PSB1bmRlZmluZWQgPyBcIlwiIDogbG9jYWxlLmN1cnJlbmN5WzBdICsgXCJcIixcbiAgICAgIGN1cnJlbmN5U3VmZml4ID0gbG9jYWxlLmN1cnJlbmN5ID09PSB1bmRlZmluZWQgPyBcIlwiIDogbG9jYWxlLmN1cnJlbmN5WzFdICsgXCJcIixcbiAgICAgIGRlY2ltYWwgPSBsb2NhbGUuZGVjaW1hbCA9PT0gdW5kZWZpbmVkID8gXCIuXCIgOiBsb2NhbGUuZGVjaW1hbCArIFwiXCIsXG4gICAgICBudW1lcmFscyA9IGxvY2FsZS5udW1lcmFscyA9PT0gdW5kZWZpbmVkID8gaWRlbnRpdHkgOiBmb3JtYXROdW1lcmFscyhtYXAuY2FsbChsb2NhbGUubnVtZXJhbHMsIFN0cmluZykpLFxuICAgICAgcGVyY2VudCA9IGxvY2FsZS5wZXJjZW50ID09PSB1bmRlZmluZWQgPyBcIiVcIiA6IGxvY2FsZS5wZXJjZW50ICsgXCJcIixcbiAgICAgIG1pbnVzID0gbG9jYWxlLm1pbnVzID09PSB1bmRlZmluZWQgPyBcIuKIklwiIDogbG9jYWxlLm1pbnVzICsgXCJcIixcbiAgICAgIG5hbiA9IGxvY2FsZS5uYW4gPT09IHVuZGVmaW5lZCA/IFwiTmFOXCIgOiBsb2NhbGUubmFuICsgXCJcIjtcblxuICBmdW5jdGlvbiBuZXdGb3JtYXQoc3BlY2lmaWVyKSB7XG4gICAgc3BlY2lmaWVyID0gZm9ybWF0U3BlY2lmaWVyKHNwZWNpZmllcik7XG5cbiAgICB2YXIgZmlsbCA9IHNwZWNpZmllci5maWxsLFxuICAgICAgICBhbGlnbiA9IHNwZWNpZmllci5hbGlnbixcbiAgICAgICAgc2lnbiA9IHNwZWNpZmllci5zaWduLFxuICAgICAgICBzeW1ib2wgPSBzcGVjaWZpZXIuc3ltYm9sLFxuICAgICAgICB6ZXJvID0gc3BlY2lmaWVyLnplcm8sXG4gICAgICAgIHdpZHRoID0gc3BlY2lmaWVyLndpZHRoLFxuICAgICAgICBjb21tYSA9IHNwZWNpZmllci5jb21tYSxcbiAgICAgICAgcHJlY2lzaW9uID0gc3BlY2lmaWVyLnByZWNpc2lvbixcbiAgICAgICAgdHJpbSA9IHNwZWNpZmllci50cmltLFxuICAgICAgICB0eXBlID0gc3BlY2lmaWVyLnR5cGU7XG5cbiAgICAvLyBUaGUgXCJuXCIgdHlwZSBpcyBhbiBhbGlhcyBmb3IgXCIsZ1wiLlxuICAgIGlmICh0eXBlID09PSBcIm5cIikgY29tbWEgPSB0cnVlLCB0eXBlID0gXCJnXCI7XG5cbiAgICAvLyBUaGUgXCJcIiB0eXBlLCBhbmQgYW55IGludmFsaWQgdHlwZSwgaXMgYW4gYWxpYXMgZm9yIFwiLjEyfmdcIi5cbiAgICBlbHNlIGlmICghZm9ybWF0VHlwZXNbdHlwZV0pIHByZWNpc2lvbiA9PT0gdW5kZWZpbmVkICYmIChwcmVjaXNpb24gPSAxMiksIHRyaW0gPSB0cnVlLCB0eXBlID0gXCJnXCI7XG5cbiAgICAvLyBJZiB6ZXJvIGZpbGwgaXMgc3BlY2lmaWVkLCBwYWRkaW5nIGdvZXMgYWZ0ZXIgc2lnbiBhbmQgYmVmb3JlIGRpZ2l0cy5cbiAgICBpZiAoemVybyB8fCAoZmlsbCA9PT0gXCIwXCIgJiYgYWxpZ24gPT09IFwiPVwiKSkgemVybyA9IHRydWUsIGZpbGwgPSBcIjBcIiwgYWxpZ24gPSBcIj1cIjtcblxuICAgIC8vIENvbXB1dGUgdGhlIHByZWZpeCBhbmQgc3VmZml4LlxuICAgIC8vIEZvciBTSS1wcmVmaXgsIHRoZSBzdWZmaXggaXMgbGF6aWx5IGNvbXB1dGVkLlxuICAgIHZhciBwcmVmaXggPSBzeW1ib2wgPT09IFwiJFwiID8gY3VycmVuY3lQcmVmaXggOiBzeW1ib2wgPT09IFwiI1wiICYmIC9bYm94WF0vLnRlc3QodHlwZSkgPyBcIjBcIiArIHR5cGUudG9Mb3dlckNhc2UoKSA6IFwiXCIsXG4gICAgICAgIHN1ZmZpeCA9IHN5bWJvbCA9PT0gXCIkXCIgPyBjdXJyZW5jeVN1ZmZpeCA6IC9bJXBdLy50ZXN0KHR5cGUpID8gcGVyY2VudCA6IFwiXCI7XG5cbiAgICAvLyBXaGF0IGZvcm1hdCBmdW5jdGlvbiBzaG91bGQgd2UgdXNlP1xuICAgIC8vIElzIHRoaXMgYW4gaW50ZWdlciB0eXBlP1xuICAgIC8vIENhbiB0aGlzIHR5cGUgZ2VuZXJhdGUgZXhwb25lbnRpYWwgbm90YXRpb24/XG4gICAgdmFyIGZvcm1hdFR5cGUgPSBmb3JtYXRUeXBlc1t0eXBlXSxcbiAgICAgICAgbWF5YmVTdWZmaXggPSAvW2RlZmdwcnMlXS8udGVzdCh0eXBlKTtcblxuICAgIC8vIFNldCB0aGUgZGVmYXVsdCBwcmVjaXNpb24gaWYgbm90IHNwZWNpZmllZCxcbiAgICAvLyBvciBjbGFtcCB0aGUgc3BlY2lmaWVkIHByZWNpc2lvbiB0byB0aGUgc3VwcG9ydGVkIHJhbmdlLlxuICAgIC8vIEZvciBzaWduaWZpY2FudCBwcmVjaXNpb24sIGl0IG11c3QgYmUgaW4gWzEsIDIxXS5cbiAgICAvLyBGb3IgZml4ZWQgcHJlY2lzaW9uLCBpdCBtdXN0IGJlIGluIFswLCAyMF0uXG4gICAgcHJlY2lzaW9uID0gcHJlY2lzaW9uID09PSB1bmRlZmluZWQgPyA2XG4gICAgICAgIDogL1tncHJzXS8udGVzdCh0eXBlKSA/IE1hdGgubWF4KDEsIE1hdGgubWluKDIxLCBwcmVjaXNpb24pKVxuICAgICAgICA6IE1hdGgubWF4KDAsIE1hdGgubWluKDIwLCBwcmVjaXNpb24pKTtcblxuICAgIGZ1bmN0aW9uIGZvcm1hdCh2YWx1ZSkge1xuICAgICAgdmFyIHZhbHVlUHJlZml4ID0gcHJlZml4LFxuICAgICAgICAgIHZhbHVlU3VmZml4ID0gc3VmZml4LFxuICAgICAgICAgIGksIG4sIGM7XG5cbiAgICAgIGlmICh0eXBlID09PSBcImNcIikge1xuICAgICAgICB2YWx1ZVN1ZmZpeCA9IGZvcm1hdFR5cGUodmFsdWUpICsgdmFsdWVTdWZmaXg7XG4gICAgICAgIHZhbHVlID0gXCJcIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlID0gK3ZhbHVlO1xuXG4gICAgICAgIC8vIERldGVybWluZSB0aGUgc2lnbi4gLTAgaXMgbm90IGxlc3MgdGhhbiAwLCBidXQgMSAvIC0wIGlzIVxuICAgICAgICB2YXIgdmFsdWVOZWdhdGl2ZSA9IHZhbHVlIDwgMCB8fCAxIC8gdmFsdWUgPCAwO1xuXG4gICAgICAgIC8vIFBlcmZvcm0gdGhlIGluaXRpYWwgZm9ybWF0dGluZy5cbiAgICAgICAgdmFsdWUgPSBpc05hTih2YWx1ZSkgPyBuYW4gOiBmb3JtYXRUeXBlKE1hdGguYWJzKHZhbHVlKSwgcHJlY2lzaW9uKTtcblxuICAgICAgICAvLyBUcmltIGluc2lnbmlmaWNhbnQgemVyb3MuXG4gICAgICAgIGlmICh0cmltKSB2YWx1ZSA9IGZvcm1hdFRyaW0odmFsdWUpO1xuXG4gICAgICAgIC8vIElmIGEgbmVnYXRpdmUgdmFsdWUgcm91bmRzIHRvIHplcm8gYWZ0ZXIgZm9ybWF0dGluZywgYW5kIG5vIGV4cGxpY2l0IHBvc2l0aXZlIHNpZ24gaXMgcmVxdWVzdGVkLCBoaWRlIHRoZSBzaWduLlxuICAgICAgICBpZiAodmFsdWVOZWdhdGl2ZSAmJiArdmFsdWUgPT09IDAgJiYgc2lnbiAhPT0gXCIrXCIpIHZhbHVlTmVnYXRpdmUgPSBmYWxzZTtcblxuICAgICAgICAvLyBDb21wdXRlIHRoZSBwcmVmaXggYW5kIHN1ZmZpeC5cbiAgICAgICAgdmFsdWVQcmVmaXggPSAodmFsdWVOZWdhdGl2ZSA/IChzaWduID09PSBcIihcIiA/IHNpZ24gOiBtaW51cykgOiBzaWduID09PSBcIi1cIiB8fCBzaWduID09PSBcIihcIiA/IFwiXCIgOiBzaWduKSArIHZhbHVlUHJlZml4O1xuICAgICAgICB2YWx1ZVN1ZmZpeCA9ICh0eXBlID09PSBcInNcIiA/IHByZWZpeGVzWzggKyBwcmVmaXhFeHBvbmVudCAvIDNdIDogXCJcIikgKyB2YWx1ZVN1ZmZpeCArICh2YWx1ZU5lZ2F0aXZlICYmIHNpZ24gPT09IFwiKFwiID8gXCIpXCIgOiBcIlwiKTtcblxuICAgICAgICAvLyBCcmVhayB0aGUgZm9ybWF0dGVkIHZhbHVlIGludG8gdGhlIGludGVnZXIg4oCcdmFsdWXigJ0gcGFydCB0aGF0IGNhbiBiZVxuICAgICAgICAvLyBncm91cGVkLCBhbmQgZnJhY3Rpb25hbCBvciBleHBvbmVudGlhbCDigJxzdWZmaXjigJ0gcGFydCB0aGF0IGlzIG5vdC5cbiAgICAgICAgaWYgKG1heWJlU3VmZml4KSB7XG4gICAgICAgICAgaSA9IC0xLCBuID0gdmFsdWUubGVuZ3RoO1xuICAgICAgICAgIHdoaWxlICgrK2kgPCBuKSB7XG4gICAgICAgICAgICBpZiAoYyA9IHZhbHVlLmNoYXJDb2RlQXQoaSksIDQ4ID4gYyB8fCBjID4gNTcpIHtcbiAgICAgICAgICAgICAgdmFsdWVTdWZmaXggPSAoYyA9PT0gNDYgPyBkZWNpbWFsICsgdmFsdWUuc2xpY2UoaSArIDEpIDogdmFsdWUuc2xpY2UoaSkpICsgdmFsdWVTdWZmaXg7XG4gICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuc2xpY2UoMCwgaSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBJZiB0aGUgZmlsbCBjaGFyYWN0ZXIgaXMgbm90IFwiMFwiLCBncm91cGluZyBpcyBhcHBsaWVkIGJlZm9yZSBwYWRkaW5nLlxuICAgICAgaWYgKGNvbW1hICYmICF6ZXJvKSB2YWx1ZSA9IGdyb3VwKHZhbHVlLCBJbmZpbml0eSk7XG5cbiAgICAgIC8vIENvbXB1dGUgdGhlIHBhZGRpbmcuXG4gICAgICB2YXIgbGVuZ3RoID0gdmFsdWVQcmVmaXgubGVuZ3RoICsgdmFsdWUubGVuZ3RoICsgdmFsdWVTdWZmaXgubGVuZ3RoLFxuICAgICAgICAgIHBhZGRpbmcgPSBsZW5ndGggPCB3aWR0aCA/IG5ldyBBcnJheSh3aWR0aCAtIGxlbmd0aCArIDEpLmpvaW4oZmlsbCkgOiBcIlwiO1xuXG4gICAgICAvLyBJZiB0aGUgZmlsbCBjaGFyYWN0ZXIgaXMgXCIwXCIsIGdyb3VwaW5nIGlzIGFwcGxpZWQgYWZ0ZXIgcGFkZGluZy5cbiAgICAgIGlmIChjb21tYSAmJiB6ZXJvKSB2YWx1ZSA9IGdyb3VwKHBhZGRpbmcgKyB2YWx1ZSwgcGFkZGluZy5sZW5ndGggPyB3aWR0aCAtIHZhbHVlU3VmZml4Lmxlbmd0aCA6IEluZmluaXR5KSwgcGFkZGluZyA9IFwiXCI7XG5cbiAgICAgIC8vIFJlY29uc3RydWN0IHRoZSBmaW5hbCBvdXRwdXQgYmFzZWQgb24gdGhlIGRlc2lyZWQgYWxpZ25tZW50LlxuICAgICAgc3dpdGNoIChhbGlnbikge1xuICAgICAgICBjYXNlIFwiPFwiOiB2YWx1ZSA9IHZhbHVlUHJlZml4ICsgdmFsdWUgKyB2YWx1ZVN1ZmZpeCArIHBhZGRpbmc7IGJyZWFrO1xuICAgICAgICBjYXNlIFwiPVwiOiB2YWx1ZSA9IHZhbHVlUHJlZml4ICsgcGFkZGluZyArIHZhbHVlICsgdmFsdWVTdWZmaXg7IGJyZWFrO1xuICAgICAgICBjYXNlIFwiXlwiOiB2YWx1ZSA9IHBhZGRpbmcuc2xpY2UoMCwgbGVuZ3RoID0gcGFkZGluZy5sZW5ndGggPj4gMSkgKyB2YWx1ZVByZWZpeCArIHZhbHVlICsgdmFsdWVTdWZmaXggKyBwYWRkaW5nLnNsaWNlKGxlbmd0aCk7IGJyZWFrO1xuICAgICAgICBkZWZhdWx0OiB2YWx1ZSA9IHBhZGRpbmcgKyB2YWx1ZVByZWZpeCArIHZhbHVlICsgdmFsdWVTdWZmaXg7IGJyZWFrO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbnVtZXJhbHModmFsdWUpO1xuICAgIH1cblxuICAgIGZvcm1hdC50b1N0cmluZyA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHNwZWNpZmllciArIFwiXCI7XG4gICAgfTtcblxuICAgIHJldHVybiBmb3JtYXQ7XG4gIH1cblxuICBmdW5jdGlvbiBmb3JtYXRQcmVmaXgoc3BlY2lmaWVyLCB2YWx1ZSkge1xuICAgIHZhciBmID0gbmV3Rm9ybWF0KChzcGVjaWZpZXIgPSBmb3JtYXRTcGVjaWZpZXIoc3BlY2lmaWVyKSwgc3BlY2lmaWVyLnR5cGUgPSBcImZcIiwgc3BlY2lmaWVyKSksXG4gICAgICAgIGUgPSBNYXRoLm1heCgtOCwgTWF0aC5taW4oOCwgTWF0aC5mbG9vcihleHBvbmVudCh2YWx1ZSkgLyAzKSkpICogMyxcbiAgICAgICAgayA9IE1hdGgucG93KDEwLCAtZSksXG4gICAgICAgIHByZWZpeCA9IHByZWZpeGVzWzggKyBlIC8gM107XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICByZXR1cm4gZihrICogdmFsdWUpICsgcHJlZml4O1xuICAgIH07XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGZvcm1hdDogbmV3Rm9ybWF0LFxuICAgIGZvcm1hdFByZWZpeDogZm9ybWF0UHJlZml4XG4gIH07XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gYmFzaXModDEsIHYwLCB2MSwgdjIsIHYzKSB7XG4gIHZhciB0MiA9IHQxICogdDEsIHQzID0gdDIgKiB0MTtcbiAgcmV0dXJuICgoMSAtIDMgKiB0MSArIDMgKiB0MiAtIHQzKSAqIHYwXG4gICAgICArICg0IC0gNiAqIHQyICsgMyAqIHQzKSAqIHYxXG4gICAgICArICgxICsgMyAqIHQxICsgMyAqIHQyIC0gMyAqIHQzKSAqIHYyXG4gICAgICArIHQzICogdjMpIC8gNjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWVzKSB7XG4gIHZhciBuID0gdmFsdWVzLmxlbmd0aCAtIDE7XG4gIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgdmFyIGkgPSB0IDw9IDAgPyAodCA9IDApIDogdCA+PSAxID8gKHQgPSAxLCBuIC0gMSkgOiBNYXRoLmZsb29yKHQgKiBuKSxcbiAgICAgICAgdjEgPSB2YWx1ZXNbaV0sXG4gICAgICAgIHYyID0gdmFsdWVzW2kgKyAxXSxcbiAgICAgICAgdjAgPSBpID4gMCA/IHZhbHVlc1tpIC0gMV0gOiAyICogdjEgLSB2MixcbiAgICAgICAgdjMgPSBpIDwgbiAtIDEgPyB2YWx1ZXNbaSArIDJdIDogMiAqIHYyIC0gdjE7XG4gICAgcmV0dXJuIGJhc2lzKCh0IC0gaSAvIG4pICogbiwgdjAsIHYxLCB2MiwgdjMpO1xuICB9O1xufVxuIiwiaW1wb3J0IHtiYXNpc30gZnJvbSBcIi4vYmFzaXMuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWVzKSB7XG4gIHZhciBuID0gdmFsdWVzLmxlbmd0aDtcbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICB2YXIgaSA9IE1hdGguZmxvb3IoKCh0ICU9IDEpIDwgMCA/ICsrdCA6IHQpICogbiksXG4gICAgICAgIHYwID0gdmFsdWVzWyhpICsgbiAtIDEpICUgbl0sXG4gICAgICAgIHYxID0gdmFsdWVzW2kgJSBuXSxcbiAgICAgICAgdjIgPSB2YWx1ZXNbKGkgKyAxKSAlIG5dLFxuICAgICAgICB2MyA9IHZhbHVlc1soaSArIDIpICUgbl07XG4gICAgcmV0dXJuIGJhc2lzKCh0IC0gaSAvIG4pICogbiwgdjAsIHYxLCB2MiwgdjMpO1xuICB9O1xufVxuIiwiaW1wb3J0IGNvbnN0YW50IGZyb20gXCIuL2NvbnN0YW50LmpzXCI7XG5cbmZ1bmN0aW9uIGxpbmVhcihhLCBkKSB7XG4gIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgcmV0dXJuIGEgKyB0ICogZDtcbiAgfTtcbn1cblxuZnVuY3Rpb24gZXhwb25lbnRpYWwoYSwgYiwgeSkge1xuICByZXR1cm4gYSA9IE1hdGgucG93KGEsIHkpLCBiID0gTWF0aC5wb3coYiwgeSkgLSBhLCB5ID0gMSAvIHksIGZ1bmN0aW9uKHQpIHtcbiAgICByZXR1cm4gTWF0aC5wb3coYSArIHQgKiBiLCB5KTtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGh1ZShhLCBiKSB7XG4gIHZhciBkID0gYiAtIGE7XG4gIHJldHVybiBkID8gbGluZWFyKGEsIGQgPiAxODAgfHwgZCA8IC0xODAgPyBkIC0gMzYwICogTWF0aC5yb3VuZChkIC8gMzYwKSA6IGQpIDogY29uc3RhbnQoaXNOYU4oYSkgPyBiIDogYSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnYW1tYSh5KSB7XG4gIHJldHVybiAoeSA9ICt5KSA9PT0gMSA/IG5vZ2FtbWEgOiBmdW5jdGlvbihhLCBiKSB7XG4gICAgcmV0dXJuIGIgLSBhID8gZXhwb25lbnRpYWwoYSwgYiwgeSkgOiBjb25zdGFudChpc05hTihhKSA/IGIgOiBhKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbm9nYW1tYShhLCBiKSB7XG4gIHZhciBkID0gYiAtIGE7XG4gIHJldHVybiBkID8gbGluZWFyKGEsIGQpIDogY29uc3RhbnQoaXNOYU4oYSkgPyBiIDogYSk7XG59XG4iLCJleHBvcnQgZGVmYXVsdCB4ID0+ICgpID0+IHg7XG4iLCJpbXBvcnQge2xhYiBhcyBjb2xvckxhYn0gZnJvbSBcImQzLWNvbG9yXCI7XG5pbXBvcnQgY29sb3IgZnJvbSBcIi4vY29sb3IuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbGFiKHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGwgPSBjb2xvcigoc3RhcnQgPSBjb2xvckxhYihzdGFydCkpLmwsIChlbmQgPSBjb2xvckxhYihlbmQpKS5sKSxcbiAgICAgIGEgPSBjb2xvcihzdGFydC5hLCBlbmQuYSksXG4gICAgICBiID0gY29sb3Ioc3RhcnQuYiwgZW5kLmIpLFxuICAgICAgb3BhY2l0eSA9IGNvbG9yKHN0YXJ0Lm9wYWNpdHksIGVuZC5vcGFjaXR5KTtcbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICBzdGFydC5sID0gbCh0KTtcbiAgICBzdGFydC5hID0gYSh0KTtcbiAgICBzdGFydC5iID0gYih0KTtcbiAgICBzdGFydC5vcGFjaXR5ID0gb3BhY2l0eSh0KTtcbiAgICByZXR1cm4gc3RhcnQgKyBcIlwiO1xuICB9O1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oYSwgYikge1xuICByZXR1cm4gYSA9ICthLCBiID0gK2IsIGZ1bmN0aW9uKHQpIHtcbiAgICByZXR1cm4gYSAqICgxIC0gdCkgKyBiICogdDtcbiAgfTtcbn1cbiIsImltcG9ydCB7cmdiIGFzIGNvbG9yUmdifSBmcm9tIFwiZDMtY29sb3JcIjtcbmltcG9ydCBiYXNpcyBmcm9tIFwiLi9iYXNpcy5qc1wiO1xuaW1wb3J0IGJhc2lzQ2xvc2VkIGZyb20gXCIuL2Jhc2lzQ2xvc2VkLmpzXCI7XG5pbXBvcnQgbm9nYW1tYSwge2dhbW1hfSBmcm9tIFwiLi9jb2xvci5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCAoZnVuY3Rpb24gcmdiR2FtbWEoeSkge1xuICB2YXIgY29sb3IgPSBnYW1tYSh5KTtcblxuICBmdW5jdGlvbiByZ2Ioc3RhcnQsIGVuZCkge1xuICAgIHZhciByID0gY29sb3IoKHN0YXJ0ID0gY29sb3JSZ2Ioc3RhcnQpKS5yLCAoZW5kID0gY29sb3JSZ2IoZW5kKSkuciksXG4gICAgICAgIGcgPSBjb2xvcihzdGFydC5nLCBlbmQuZyksXG4gICAgICAgIGIgPSBjb2xvcihzdGFydC5iLCBlbmQuYiksXG4gICAgICAgIG9wYWNpdHkgPSBub2dhbW1hKHN0YXJ0Lm9wYWNpdHksIGVuZC5vcGFjaXR5KTtcbiAgICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgICAgc3RhcnQuciA9IHIodCk7XG4gICAgICBzdGFydC5nID0gZyh0KTtcbiAgICAgIHN0YXJ0LmIgPSBiKHQpO1xuICAgICAgc3RhcnQub3BhY2l0eSA9IG9wYWNpdHkodCk7XG4gICAgICByZXR1cm4gc3RhcnQgKyBcIlwiO1xuICAgIH07XG4gIH1cblxuICByZ2IuZ2FtbWEgPSByZ2JHYW1tYTtcblxuICByZXR1cm4gcmdiO1xufSkoMSk7XG5cbmZ1bmN0aW9uIHJnYlNwbGluZShzcGxpbmUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKGNvbG9ycykge1xuICAgIHZhciBuID0gY29sb3JzLmxlbmd0aCxcbiAgICAgICAgciA9IG5ldyBBcnJheShuKSxcbiAgICAgICAgZyA9IG5ldyBBcnJheShuKSxcbiAgICAgICAgYiA9IG5ldyBBcnJheShuKSxcbiAgICAgICAgaSwgY29sb3I7XG4gICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgY29sb3IgPSBjb2xvclJnYihjb2xvcnNbaV0pO1xuICAgICAgcltpXSA9IGNvbG9yLnIgfHwgMDtcbiAgICAgIGdbaV0gPSBjb2xvci5nIHx8IDA7XG4gICAgICBiW2ldID0gY29sb3IuYiB8fCAwO1xuICAgIH1cbiAgICByID0gc3BsaW5lKHIpO1xuICAgIGcgPSBzcGxpbmUoZyk7XG4gICAgYiA9IHNwbGluZShiKTtcbiAgICBjb2xvci5vcGFjaXR5ID0gMTtcbiAgICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgICAgY29sb3IuciA9IHIodCk7XG4gICAgICBjb2xvci5nID0gZyh0KTtcbiAgICAgIGNvbG9yLmIgPSBiKHQpO1xuICAgICAgcmV0dXJuIGNvbG9yICsgXCJcIjtcbiAgICB9O1xuICB9O1xufVxuXG5leHBvcnQgdmFyIHJnYkJhc2lzID0gcmdiU3BsaW5lKGJhc2lzKTtcbmV4cG9ydCB2YXIgcmdiQmFzaXNDbG9zZWQgPSByZ2JTcGxpbmUoYmFzaXNDbG9zZWQpO1xuIiwiaW1wb3J0IG51bWJlciBmcm9tIFwiLi9udW1iZXIuanNcIjtcblxudmFyIHJlQSA9IC9bLStdPyg/OlxcZCtcXC4/XFxkKnxcXC4/XFxkKykoPzpbZUVdWy0rXT9cXGQrKT8vZyxcbiAgICByZUIgPSBuZXcgUmVnRXhwKHJlQS5zb3VyY2UsIFwiZ1wiKTtcblxuZnVuY3Rpb24gemVybyhiKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gYjtcbiAgfTtcbn1cblxuZnVuY3Rpb24gb25lKGIpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICByZXR1cm4gYih0KSArIFwiXCI7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGEsIGIpIHtcbiAgdmFyIGJpID0gcmVBLmxhc3RJbmRleCA9IHJlQi5sYXN0SW5kZXggPSAwLCAvLyBzY2FuIGluZGV4IGZvciBuZXh0IG51bWJlciBpbiBiXG4gICAgICBhbSwgLy8gY3VycmVudCBtYXRjaCBpbiBhXG4gICAgICBibSwgLy8gY3VycmVudCBtYXRjaCBpbiBiXG4gICAgICBicywgLy8gc3RyaW5nIHByZWNlZGluZyBjdXJyZW50IG51bWJlciBpbiBiLCBpZiBhbnlcbiAgICAgIGkgPSAtMSwgLy8gaW5kZXggaW4gc1xuICAgICAgcyA9IFtdLCAvLyBzdHJpbmcgY29uc3RhbnRzIGFuZCBwbGFjZWhvbGRlcnNcbiAgICAgIHEgPSBbXTsgLy8gbnVtYmVyIGludGVycG9sYXRvcnNcblxuICAvLyBDb2VyY2UgaW5wdXRzIHRvIHN0cmluZ3MuXG4gIGEgPSBhICsgXCJcIiwgYiA9IGIgKyBcIlwiO1xuXG4gIC8vIEludGVycG9sYXRlIHBhaXJzIG9mIG51bWJlcnMgaW4gYSAmIGIuXG4gIHdoaWxlICgoYW0gPSByZUEuZXhlYyhhKSlcbiAgICAgICYmIChibSA9IHJlQi5leGVjKGIpKSkge1xuICAgIGlmICgoYnMgPSBibS5pbmRleCkgPiBiaSkgeyAvLyBhIHN0cmluZyBwcmVjZWRlcyB0aGUgbmV4dCBudW1iZXIgaW4gYlxuICAgICAgYnMgPSBiLnNsaWNlKGJpLCBicyk7XG4gICAgICBpZiAoc1tpXSkgc1tpXSArPSBiczsgLy8gY29hbGVzY2Ugd2l0aCBwcmV2aW91cyBzdHJpbmdcbiAgICAgIGVsc2Ugc1srK2ldID0gYnM7XG4gICAgfVxuICAgIGlmICgoYW0gPSBhbVswXSkgPT09IChibSA9IGJtWzBdKSkgeyAvLyBudW1iZXJzIGluIGEgJiBiIG1hdGNoXG4gICAgICBpZiAoc1tpXSkgc1tpXSArPSBibTsgLy8gY29hbGVzY2Ugd2l0aCBwcmV2aW91cyBzdHJpbmdcbiAgICAgIGVsc2Ugc1srK2ldID0gYm07XG4gICAgfSBlbHNlIHsgLy8gaW50ZXJwb2xhdGUgbm9uLW1hdGNoaW5nIG51bWJlcnNcbiAgICAgIHNbKytpXSA9IG51bGw7XG4gICAgICBxLnB1c2goe2k6IGksIHg6IG51bWJlcihhbSwgYm0pfSk7XG4gICAgfVxuICAgIGJpID0gcmVCLmxhc3RJbmRleDtcbiAgfVxuXG4gIC8vIEFkZCByZW1haW5zIG9mIGIuXG4gIGlmIChiaSA8IGIubGVuZ3RoKSB7XG4gICAgYnMgPSBiLnNsaWNlKGJpKTtcbiAgICBpZiAoc1tpXSkgc1tpXSArPSBiczsgLy8gY29hbGVzY2Ugd2l0aCBwcmV2aW91cyBzdHJpbmdcbiAgICBlbHNlIHNbKytpXSA9IGJzO1xuICB9XG5cbiAgLy8gU3BlY2lhbCBvcHRpbWl6YXRpb24gZm9yIG9ubHkgYSBzaW5nbGUgbWF0Y2guXG4gIC8vIE90aGVyd2lzZSwgaW50ZXJwb2xhdGUgZWFjaCBvZiB0aGUgbnVtYmVycyBhbmQgcmVqb2luIHRoZSBzdHJpbmcuXG4gIHJldHVybiBzLmxlbmd0aCA8IDIgPyAocVswXVxuICAgICAgPyBvbmUocVswXS54KVxuICAgICAgOiB6ZXJvKGIpKVxuICAgICAgOiAoYiA9IHEubGVuZ3RoLCBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgZm9yICh2YXIgaSA9IDAsIG87IGkgPCBiOyArK2kpIHNbKG8gPSBxW2ldKS5pXSA9IG8ueCh0KTtcbiAgICAgICAgICByZXR1cm4gcy5qb2luKFwiXCIpO1xuICAgICAgICB9KTtcbn1cbiIsInZhciBkZWdyZWVzID0gMTgwIC8gTWF0aC5QSTtcblxuZXhwb3J0IHZhciBpZGVudGl0eSA9IHtcbiAgdHJhbnNsYXRlWDogMCxcbiAgdHJhbnNsYXRlWTogMCxcbiAgcm90YXRlOiAwLFxuICBza2V3WDogMCxcbiAgc2NhbGVYOiAxLFxuICBzY2FsZVk6IDFcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGEsIGIsIGMsIGQsIGUsIGYpIHtcbiAgdmFyIHNjYWxlWCwgc2NhbGVZLCBza2V3WDtcbiAgaWYgKHNjYWxlWCA9IE1hdGguc3FydChhICogYSArIGIgKiBiKSkgYSAvPSBzY2FsZVgsIGIgLz0gc2NhbGVYO1xuICBpZiAoc2tld1ggPSBhICogYyArIGIgKiBkKSBjIC09IGEgKiBza2V3WCwgZCAtPSBiICogc2tld1g7XG4gIGlmIChzY2FsZVkgPSBNYXRoLnNxcnQoYyAqIGMgKyBkICogZCkpIGMgLz0gc2NhbGVZLCBkIC89IHNjYWxlWSwgc2tld1ggLz0gc2NhbGVZO1xuICBpZiAoYSAqIGQgPCBiICogYykgYSA9IC1hLCBiID0gLWIsIHNrZXdYID0gLXNrZXdYLCBzY2FsZVggPSAtc2NhbGVYO1xuICByZXR1cm4ge1xuICAgIHRyYW5zbGF0ZVg6IGUsXG4gICAgdHJhbnNsYXRlWTogZixcbiAgICByb3RhdGU6IE1hdGguYXRhbjIoYiwgYSkgKiBkZWdyZWVzLFxuICAgIHNrZXdYOiBNYXRoLmF0YW4oc2tld1gpICogZGVncmVlcyxcbiAgICBzY2FsZVg6IHNjYWxlWCxcbiAgICBzY2FsZVk6IHNjYWxlWVxuICB9O1xufVxuIiwiaW1wb3J0IG51bWJlciBmcm9tIFwiLi4vbnVtYmVyLmpzXCI7XG5pbXBvcnQge3BhcnNlQ3NzLCBwYXJzZVN2Z30gZnJvbSBcIi4vcGFyc2UuanNcIjtcblxuZnVuY3Rpb24gaW50ZXJwb2xhdGVUcmFuc2Zvcm0ocGFyc2UsIHB4Q29tbWEsIHB4UGFyZW4sIGRlZ1BhcmVuKSB7XG5cbiAgZnVuY3Rpb24gcG9wKHMpIHtcbiAgICByZXR1cm4gcy5sZW5ndGggPyBzLnBvcCgpICsgXCIgXCIgOiBcIlwiO1xuICB9XG5cbiAgZnVuY3Rpb24gdHJhbnNsYXRlKHhhLCB5YSwgeGIsIHliLCBzLCBxKSB7XG4gICAgaWYgKHhhICE9PSB4YiB8fCB5YSAhPT0geWIpIHtcbiAgICAgIHZhciBpID0gcy5wdXNoKFwidHJhbnNsYXRlKFwiLCBudWxsLCBweENvbW1hLCBudWxsLCBweFBhcmVuKTtcbiAgICAgIHEucHVzaCh7aTogaSAtIDQsIHg6IG51bWJlcih4YSwgeGIpfSwge2k6IGkgLSAyLCB4OiBudW1iZXIoeWEsIHliKX0pO1xuICAgIH0gZWxzZSBpZiAoeGIgfHwgeWIpIHtcbiAgICAgIHMucHVzaChcInRyYW5zbGF0ZShcIiArIHhiICsgcHhDb21tYSArIHliICsgcHhQYXJlbik7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcm90YXRlKGEsIGIsIHMsIHEpIHtcbiAgICBpZiAoYSAhPT0gYikge1xuICAgICAgaWYgKGEgLSBiID4gMTgwKSBiICs9IDM2MDsgZWxzZSBpZiAoYiAtIGEgPiAxODApIGEgKz0gMzYwOyAvLyBzaG9ydGVzdCBwYXRoXG4gICAgICBxLnB1c2goe2k6IHMucHVzaChwb3AocykgKyBcInJvdGF0ZShcIiwgbnVsbCwgZGVnUGFyZW4pIC0gMiwgeDogbnVtYmVyKGEsIGIpfSk7XG4gICAgfSBlbHNlIGlmIChiKSB7XG4gICAgICBzLnB1c2gocG9wKHMpICsgXCJyb3RhdGUoXCIgKyBiICsgZGVnUGFyZW4pO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHNrZXdYKGEsIGIsIHMsIHEpIHtcbiAgICBpZiAoYSAhPT0gYikge1xuICAgICAgcS5wdXNoKHtpOiBzLnB1c2gocG9wKHMpICsgXCJza2V3WChcIiwgbnVsbCwgZGVnUGFyZW4pIC0gMiwgeDogbnVtYmVyKGEsIGIpfSk7XG4gICAgfSBlbHNlIGlmIChiKSB7XG4gICAgICBzLnB1c2gocG9wKHMpICsgXCJza2V3WChcIiArIGIgKyBkZWdQYXJlbik7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gc2NhbGUoeGEsIHlhLCB4YiwgeWIsIHMsIHEpIHtcbiAgICBpZiAoeGEgIT09IHhiIHx8IHlhICE9PSB5Yikge1xuICAgICAgdmFyIGkgPSBzLnB1c2gocG9wKHMpICsgXCJzY2FsZShcIiwgbnVsbCwgXCIsXCIsIG51bGwsIFwiKVwiKTtcbiAgICAgIHEucHVzaCh7aTogaSAtIDQsIHg6IG51bWJlcih4YSwgeGIpfSwge2k6IGkgLSAyLCB4OiBudW1iZXIoeWEsIHliKX0pO1xuICAgIH0gZWxzZSBpZiAoeGIgIT09IDEgfHwgeWIgIT09IDEpIHtcbiAgICAgIHMucHVzaChwb3AocykgKyBcInNjYWxlKFwiICsgeGIgKyBcIixcIiArIHliICsgXCIpXCIpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbihhLCBiKSB7XG4gICAgdmFyIHMgPSBbXSwgLy8gc3RyaW5nIGNvbnN0YW50cyBhbmQgcGxhY2Vob2xkZXJzXG4gICAgICAgIHEgPSBbXTsgLy8gbnVtYmVyIGludGVycG9sYXRvcnNcbiAgICBhID0gcGFyc2UoYSksIGIgPSBwYXJzZShiKTtcbiAgICB0cmFuc2xhdGUoYS50cmFuc2xhdGVYLCBhLnRyYW5zbGF0ZVksIGIudHJhbnNsYXRlWCwgYi50cmFuc2xhdGVZLCBzLCBxKTtcbiAgICByb3RhdGUoYS5yb3RhdGUsIGIucm90YXRlLCBzLCBxKTtcbiAgICBza2V3WChhLnNrZXdYLCBiLnNrZXdYLCBzLCBxKTtcbiAgICBzY2FsZShhLnNjYWxlWCwgYS5zY2FsZVksIGIuc2NhbGVYLCBiLnNjYWxlWSwgcywgcSk7XG4gICAgYSA9IGIgPSBudWxsOyAvLyBnY1xuICAgIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgICB2YXIgaSA9IC0xLCBuID0gcS5sZW5ndGgsIG87XG4gICAgICB3aGlsZSAoKytpIDwgbikgc1sobyA9IHFbaV0pLmldID0gby54KHQpO1xuICAgICAgcmV0dXJuIHMuam9pbihcIlwiKTtcbiAgICB9O1xuICB9O1xufVxuXG5leHBvcnQgdmFyIGludGVycG9sYXRlVHJhbnNmb3JtQ3NzID0gaW50ZXJwb2xhdGVUcmFuc2Zvcm0ocGFyc2VDc3MsIFwicHgsIFwiLCBcInB4KVwiLCBcImRlZylcIik7XG5leHBvcnQgdmFyIGludGVycG9sYXRlVHJhbnNmb3JtU3ZnID0gaW50ZXJwb2xhdGVUcmFuc2Zvcm0ocGFyc2VTdmcsIFwiLCBcIiwgXCIpXCIsIFwiKVwiKTtcbiIsImltcG9ydCBkZWNvbXBvc2UsIHtpZGVudGl0eX0gZnJvbSBcIi4vZGVjb21wb3NlLmpzXCI7XG5cbnZhciBzdmdOb2RlO1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBuby11bmRlZiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQ3NzKHZhbHVlKSB7XG4gIGNvbnN0IG0gPSBuZXcgKHR5cGVvZiBET01NYXRyaXggPT09IFwiZnVuY3Rpb25cIiA/IERPTU1hdHJpeCA6IFdlYktpdENTU01hdHJpeCkodmFsdWUgKyBcIlwiKTtcbiAgcmV0dXJuIG0uaXNJZGVudGl0eSA/IGlkZW50aXR5IDogZGVjb21wb3NlKG0uYSwgbS5iLCBtLmMsIG0uZCwgbS5lLCBtLmYpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VTdmcodmFsdWUpIHtcbiAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiBpZGVudGl0eTtcbiAgaWYgKCFzdmdOb2RlKSBzdmdOb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiwgXCJnXCIpO1xuICBzdmdOb2RlLnNldEF0dHJpYnV0ZShcInRyYW5zZm9ybVwiLCB2YWx1ZSk7XG4gIGlmICghKHZhbHVlID0gc3ZnTm9kZS50cmFuc2Zvcm0uYmFzZVZhbC5jb25zb2xpZGF0ZSgpKSkgcmV0dXJuIGlkZW50aXR5O1xuICB2YWx1ZSA9IHZhbHVlLm1hdHJpeDtcbiAgcmV0dXJuIGRlY29tcG9zZSh2YWx1ZS5hLCB2YWx1ZS5iLCB2YWx1ZS5jLCB2YWx1ZS5kLCB2YWx1ZS5lLCB2YWx1ZS5mKTtcbn1cbiIsInZhciBlcHNpbG9uMiA9IDFlLTEyO1xuXG5mdW5jdGlvbiBjb3NoKHgpIHtcbiAgcmV0dXJuICgoeCA9IE1hdGguZXhwKHgpKSArIDEgLyB4KSAvIDI7XG59XG5cbmZ1bmN0aW9uIHNpbmgoeCkge1xuICByZXR1cm4gKCh4ID0gTWF0aC5leHAoeCkpIC0gMSAvIHgpIC8gMjtcbn1cblxuZnVuY3Rpb24gdGFuaCh4KSB7XG4gIHJldHVybiAoKHggPSBNYXRoLmV4cCgyICogeCkpIC0gMSkgLyAoeCArIDEpO1xufVxuXG5leHBvcnQgZGVmYXVsdCAoZnVuY3Rpb24gem9vbVJobyhyaG8sIHJobzIsIHJobzQpIHtcblxuICAvLyBwMCA9IFt1eDAsIHV5MCwgdzBdXG4gIC8vIHAxID0gW3V4MSwgdXkxLCB3MV1cbiAgZnVuY3Rpb24gem9vbShwMCwgcDEpIHtcbiAgICB2YXIgdXgwID0gcDBbMF0sIHV5MCA9IHAwWzFdLCB3MCA9IHAwWzJdLFxuICAgICAgICB1eDEgPSBwMVswXSwgdXkxID0gcDFbMV0sIHcxID0gcDFbMl0sXG4gICAgICAgIGR4ID0gdXgxIC0gdXgwLFxuICAgICAgICBkeSA9IHV5MSAtIHV5MCxcbiAgICAgICAgZDIgPSBkeCAqIGR4ICsgZHkgKiBkeSxcbiAgICAgICAgaSxcbiAgICAgICAgUztcblxuICAgIC8vIFNwZWNpYWwgY2FzZSBmb3IgdTAg4omFIHUxLlxuICAgIGlmIChkMiA8IGVwc2lsb24yKSB7XG4gICAgICBTID0gTWF0aC5sb2codzEgLyB3MCkgLyByaG87XG4gICAgICBpID0gZnVuY3Rpb24odCkge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgIHV4MCArIHQgKiBkeCxcbiAgICAgICAgICB1eTAgKyB0ICogZHksXG4gICAgICAgICAgdzAgKiBNYXRoLmV4cChyaG8gKiB0ICogUylcbiAgICAgICAgXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBHZW5lcmFsIGNhc2UuXG4gICAgZWxzZSB7XG4gICAgICB2YXIgZDEgPSBNYXRoLnNxcnQoZDIpLFxuICAgICAgICAgIGIwID0gKHcxICogdzEgLSB3MCAqIHcwICsgcmhvNCAqIGQyKSAvICgyICogdzAgKiByaG8yICogZDEpLFxuICAgICAgICAgIGIxID0gKHcxICogdzEgLSB3MCAqIHcwIC0gcmhvNCAqIGQyKSAvICgyICogdzEgKiByaG8yICogZDEpLFxuICAgICAgICAgIHIwID0gTWF0aC5sb2coTWF0aC5zcXJ0KGIwICogYjAgKyAxKSAtIGIwKSxcbiAgICAgICAgICByMSA9IE1hdGgubG9nKE1hdGguc3FydChiMSAqIGIxICsgMSkgLSBiMSk7XG4gICAgICBTID0gKHIxIC0gcjApIC8gcmhvO1xuICAgICAgaSA9IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgdmFyIHMgPSB0ICogUyxcbiAgICAgICAgICAgIGNvc2hyMCA9IGNvc2gocjApLFxuICAgICAgICAgICAgdSA9IHcwIC8gKHJobzIgKiBkMSkgKiAoY29zaHIwICogdGFuaChyaG8gKiBzICsgcjApIC0gc2luaChyMCkpO1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgIHV4MCArIHUgKiBkeCxcbiAgICAgICAgICB1eTAgKyB1ICogZHksXG4gICAgICAgICAgdzAgKiBjb3NocjAgLyBjb3NoKHJobyAqIHMgKyByMClcbiAgICAgICAgXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpLmR1cmF0aW9uID0gUyAqIDEwMDAgKiByaG8gLyBNYXRoLlNRUlQyO1xuXG4gICAgcmV0dXJuIGk7XG4gIH1cblxuICB6b29tLnJobyA9IGZ1bmN0aW9uKF8pIHtcbiAgICB2YXIgXzEgPSBNYXRoLm1heCgxZS0zLCArXyksIF8yID0gXzEgKiBfMSwgXzQgPSBfMiAqIF8yO1xuICAgIHJldHVybiB6b29tUmhvKF8xLCBfMiwgXzQpO1xuICB9O1xuXG4gIHJldHVybiB6b29tO1xufSkoTWF0aC5TUVJUMiwgMiwgNCk7XG4iLCJleHBvcnQgZGVmYXVsdCBNYXRoLnJhbmRvbTtcbiIsImltcG9ydCBkZWZhdWx0U291cmNlIGZyb20gXCIuL2RlZmF1bHRTb3VyY2UuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgKGZ1bmN0aW9uIHNvdXJjZVJhbmRvbU5vcm1hbChzb3VyY2UpIHtcbiAgZnVuY3Rpb24gcmFuZG9tTm9ybWFsKG11LCBzaWdtYSkge1xuICAgIHZhciB4LCByO1xuICAgIG11ID0gbXUgPT0gbnVsbCA/IDAgOiArbXU7XG4gICAgc2lnbWEgPSBzaWdtYSA9PSBudWxsID8gMSA6ICtzaWdtYTtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgeTtcblxuICAgICAgLy8gSWYgYXZhaWxhYmxlLCB1c2UgdGhlIHNlY29uZCBwcmV2aW91c2x5LWdlbmVyYXRlZCB1bmlmb3JtIHJhbmRvbS5cbiAgICAgIGlmICh4ICE9IG51bGwpIHkgPSB4LCB4ID0gbnVsbDtcblxuICAgICAgLy8gT3RoZXJ3aXNlLCBnZW5lcmF0ZSBhIG5ldyB4IGFuZCB5LlxuICAgICAgZWxzZSBkbyB7XG4gICAgICAgIHggPSBzb3VyY2UoKSAqIDIgLSAxO1xuICAgICAgICB5ID0gc291cmNlKCkgKiAyIC0gMTtcbiAgICAgICAgciA9IHggKiB4ICsgeSAqIHk7XG4gICAgICB9IHdoaWxlICghciB8fCByID4gMSk7XG5cbiAgICAgIHJldHVybiBtdSArIHNpZ21hICogeSAqIE1hdGguc3FydCgtMiAqIE1hdGgubG9nKHIpIC8gcik7XG4gICAgfTtcbiAgfVxuXG4gIHJhbmRvbU5vcm1hbC5zb3VyY2UgPSBzb3VyY2VSYW5kb21Ob3JtYWw7XG5cbiAgcmV0dXJuIHJhbmRvbU5vcm1hbDtcbn0pKGRlZmF1bHRTb3VyY2UpO1xuIiwiZXhwb3J0IGZ1bmN0aW9uIGluaXRSYW5nZShkb21haW4sIHJhbmdlKSB7XG4gIHN3aXRjaCAoYXJndW1lbnRzLmxlbmd0aCkge1xuICAgIGNhc2UgMDogYnJlYWs7XG4gICAgY2FzZSAxOiB0aGlzLnJhbmdlKGRvbWFpbik7IGJyZWFrO1xuICAgIGRlZmF1bHQ6IHRoaXMucmFuZ2UocmFuZ2UpLmRvbWFpbihkb21haW4pOyBicmVhaztcbiAgfVxuICByZXR1cm4gdGhpcztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluaXRJbnRlcnBvbGF0b3IoZG9tYWluLCBpbnRlcnBvbGF0b3IpIHtcbiAgc3dpdGNoIChhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgY2FzZSAwOiBicmVhaztcbiAgICBjYXNlIDE6IHtcbiAgICAgIGlmICh0eXBlb2YgZG9tYWluID09PSBcImZ1bmN0aW9uXCIpIHRoaXMuaW50ZXJwb2xhdG9yKGRvbWFpbik7XG4gICAgICBlbHNlIHRoaXMucmFuZ2UoZG9tYWluKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICB0aGlzLmRvbWFpbihkb21haW4pO1xuICAgICAgaWYgKHR5cGVvZiBpbnRlcnBvbGF0b3IgPT09IFwiZnVuY3Rpb25cIikgdGhpcy5pbnRlcnBvbGF0b3IoaW50ZXJwb2xhdG9yKTtcbiAgICAgIGVsc2UgdGhpcy5yYW5nZShpbnRlcnBvbGF0b3IpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJldHVybiB0aGlzO1xufVxuIiwiaW1wb3J0IHthc2NlbmRpbmcsIGJpc2VjdCwgcXVhbnRpbGVTb3J0ZWQgYXMgdGhyZXNob2xkfSBmcm9tIFwiZDMtYXJyYXlcIjtcbmltcG9ydCB7aW5pdFJhbmdlfSBmcm9tIFwiLi9pbml0LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHF1YW50aWxlKCkge1xuICB2YXIgZG9tYWluID0gW10sXG4gICAgICByYW5nZSA9IFtdLFxuICAgICAgdGhyZXNob2xkcyA9IFtdLFxuICAgICAgdW5rbm93bjtcblxuICBmdW5jdGlvbiByZXNjYWxlKCkge1xuICAgIHZhciBpID0gMCwgbiA9IE1hdGgubWF4KDEsIHJhbmdlLmxlbmd0aCk7XG4gICAgdGhyZXNob2xkcyA9IG5ldyBBcnJheShuIC0gMSk7XG4gICAgd2hpbGUgKCsraSA8IG4pIHRocmVzaG9sZHNbaSAtIDFdID0gdGhyZXNob2xkKGRvbWFpbiwgaSAvIG4pO1xuICAgIHJldHVybiBzY2FsZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNjYWxlKHgpIHtcbiAgICByZXR1cm4geCA9PSBudWxsIHx8IGlzTmFOKHggPSAreCkgPyB1bmtub3duIDogcmFuZ2VbYmlzZWN0KHRocmVzaG9sZHMsIHgpXTtcbiAgfVxuXG4gIHNjYWxlLmludmVydEV4dGVudCA9IGZ1bmN0aW9uKHkpIHtcbiAgICB2YXIgaSA9IHJhbmdlLmluZGV4T2YoeSk7XG4gICAgcmV0dXJuIGkgPCAwID8gW05hTiwgTmFOXSA6IFtcbiAgICAgIGkgPiAwID8gdGhyZXNob2xkc1tpIC0gMV0gOiBkb21haW5bMF0sXG4gICAgICBpIDwgdGhyZXNob2xkcy5sZW5ndGggPyB0aHJlc2hvbGRzW2ldIDogZG9tYWluW2RvbWFpbi5sZW5ndGggLSAxXVxuICAgIF07XG4gIH07XG5cbiAgc2NhbGUuZG9tYWluID0gZnVuY3Rpb24oXykge1xuICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGRvbWFpbi5zbGljZSgpO1xuICAgIGRvbWFpbiA9IFtdO1xuICAgIGZvciAobGV0IGQgb2YgXykgaWYgKGQgIT0gbnVsbCAmJiAhaXNOYU4oZCA9ICtkKSkgZG9tYWluLnB1c2goZCk7XG4gICAgZG9tYWluLnNvcnQoYXNjZW5kaW5nKTtcbiAgICByZXR1cm4gcmVzY2FsZSgpO1xuICB9O1xuXG4gIHNjYWxlLnJhbmdlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHJhbmdlID0gQXJyYXkuZnJvbShfKSwgcmVzY2FsZSgpKSA6IHJhbmdlLnNsaWNlKCk7XG4gIH07XG5cbiAgc2NhbGUudW5rbm93biA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh1bmtub3duID0gXywgc2NhbGUpIDogdW5rbm93bjtcbiAgfTtcblxuICBzY2FsZS5xdWFudGlsZXMgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhyZXNob2xkcy5zbGljZSgpO1xuICB9O1xuXG4gIHNjYWxlLmNvcHkgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gcXVhbnRpbGUoKVxuICAgICAgICAuZG9tYWluKGRvbWFpbilcbiAgICAgICAgLnJhbmdlKHJhbmdlKVxuICAgICAgICAudW5rbm93bih1bmtub3duKTtcbiAgfTtcblxuICByZXR1cm4gaW5pdFJhbmdlLmFwcGx5KHNjYWxlLCBhcmd1bWVudHMpO1xufVxuIiwiLy8gR2l2ZW4gc29tZXRoaW5nIGFycmF5IGxpa2UgKG9yIG51bGwpLCByZXR1cm5zIHNvbWV0aGluZyB0aGF0IGlzIHN0cmljdGx5IGFuXG4vLyBhcnJheS4gVGhpcyBpcyB1c2VkIHRvIGVuc3VyZSB0aGF0IGFycmF5LWxpa2Ugb2JqZWN0cyBwYXNzZWQgdG8gZDMuc2VsZWN0QWxsXG4vLyBvciBzZWxlY3Rpb24uc2VsZWN0QWxsIGFyZSBjb252ZXJ0ZWQgaW50byBwcm9wZXIgYXJyYXlzIHdoZW4gY3JlYXRpbmcgYVxuLy8gc2VsZWN0aW9uOyB3ZSBkb27igJl0IGV2ZXIgd2FudCB0byBjcmVhdGUgYSBzZWxlY3Rpb24gYmFja2VkIGJ5IGEgbGl2ZVxuLy8gSFRNTENvbGxlY3Rpb24gb3IgTm9kZUxpc3QuIEhvd2V2ZXIsIG5vdGUgdGhhdCBzZWxlY3Rpb24uc2VsZWN0QWxsIHdpbGwgdXNlIGFcbi8vIHN0YXRpYyBOb2RlTGlzdCBhcyBhIGdyb3VwLCBzaW5jZSBpdCBzYWZlbHkgZGVyaXZlZCBmcm9tIHF1ZXJ5U2VsZWN0b3JBbGwuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBhcnJheSh4KSB7XG4gIHJldHVybiB4ID09IG51bGwgPyBbXSA6IEFycmF5LmlzQXJyYXkoeCkgPyB4IDogQXJyYXkuZnJvbSh4KTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHgpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB4O1xuICB9O1xufVxuIiwiaW1wb3J0IG5hbWVzcGFjZSBmcm9tIFwiLi9uYW1lc3BhY2UuanNcIjtcbmltcG9ydCB7eGh0bWx9IGZyb20gXCIuL25hbWVzcGFjZXMuanNcIjtcblxuZnVuY3Rpb24gY3JlYXRvckluaGVyaXQobmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGRvY3VtZW50ID0gdGhpcy5vd25lckRvY3VtZW50LFxuICAgICAgICB1cmkgPSB0aGlzLm5hbWVzcGFjZVVSSTtcbiAgICByZXR1cm4gdXJpID09PSB4aHRtbCAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQubmFtZXNwYWNlVVJJID09PSB4aHRtbFxuICAgICAgICA/IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQobmFtZSlcbiAgICAgICAgOiBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlModXJpLCBuYW1lKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gY3JlYXRvckZpeGVkKGZ1bGxuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lKSB7XG4gIHZhciBmdWxsbmFtZSA9IG5hbWVzcGFjZShuYW1lKTtcbiAgcmV0dXJuIChmdWxsbmFtZS5sb2NhbFxuICAgICAgPyBjcmVhdG9yRml4ZWRcbiAgICAgIDogY3JlYXRvckluaGVyaXQpKGZ1bGxuYW1lKTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHNlbGVjdG9yKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5tYXRjaGVzKHNlbGVjdG9yKTtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNoaWxkTWF0Y2hlcihzZWxlY3Rvcikge1xuICByZXR1cm4gZnVuY3Rpb24obm9kZSkge1xuICAgIHJldHVybiBub2RlLm1hdGNoZXMoc2VsZWN0b3IpO1xuICB9O1xufVxuXG4iLCJpbXBvcnQgbmFtZXNwYWNlcyBmcm9tIFwiLi9uYW1lc3BhY2VzLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUpIHtcbiAgdmFyIHByZWZpeCA9IG5hbWUgKz0gXCJcIiwgaSA9IHByZWZpeC5pbmRleE9mKFwiOlwiKTtcbiAgaWYgKGkgPj0gMCAmJiAocHJlZml4ID0gbmFtZS5zbGljZSgwLCBpKSkgIT09IFwieG1sbnNcIikgbmFtZSA9IG5hbWUuc2xpY2UoaSArIDEpO1xuICByZXR1cm4gbmFtZXNwYWNlcy5oYXNPd25Qcm9wZXJ0eShwcmVmaXgpID8ge3NwYWNlOiBuYW1lc3BhY2VzW3ByZWZpeF0sIGxvY2FsOiBuYW1lfSA6IG5hbWU7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG59XG4iLCJleHBvcnQgdmFyIHhodG1sID0gXCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sXCI7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgc3ZnOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsXG4gIHhodG1sOiB4aHRtbCxcbiAgeGxpbms6IFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiLFxuICB4bWw6IFwiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlXCIsXG4gIHhtbG5zOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAveG1sbnMvXCJcbn07XG4iLCJpbXBvcnQgc291cmNlRXZlbnQgZnJvbSBcIi4vc291cmNlRXZlbnQuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZXZlbnQsIG5vZGUpIHtcbiAgZXZlbnQgPSBzb3VyY2VFdmVudChldmVudCk7XG4gIGlmIChub2RlID09PSB1bmRlZmluZWQpIG5vZGUgPSBldmVudC5jdXJyZW50VGFyZ2V0O1xuICBpZiAobm9kZSkge1xuICAgIHZhciBzdmcgPSBub2RlLm93bmVyU1ZHRWxlbWVudCB8fCBub2RlO1xuICAgIGlmIChzdmcuY3JlYXRlU1ZHUG9pbnQpIHtcbiAgICAgIHZhciBwb2ludCA9IHN2Zy5jcmVhdGVTVkdQb2ludCgpO1xuICAgICAgcG9pbnQueCA9IGV2ZW50LmNsaWVudFgsIHBvaW50LnkgPSBldmVudC5jbGllbnRZO1xuICAgICAgcG9pbnQgPSBwb2ludC5tYXRyaXhUcmFuc2Zvcm0obm9kZS5nZXRTY3JlZW5DVE0oKS5pbnZlcnNlKCkpO1xuICAgICAgcmV0dXJuIFtwb2ludC54LCBwb2ludC55XTtcbiAgICB9XG4gICAgaWYgKG5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KSB7XG4gICAgICB2YXIgcmVjdCA9IG5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICByZXR1cm4gW2V2ZW50LmNsaWVudFggLSByZWN0LmxlZnQgLSBub2RlLmNsaWVudExlZnQsIGV2ZW50LmNsaWVudFkgLSByZWN0LnRvcCAtIG5vZGUuY2xpZW50VG9wXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFtldmVudC5wYWdlWCwgZXZlbnQucGFnZVldO1xufVxuIiwiaW1wb3J0IHtTZWxlY3Rpb24sIHJvb3R9IGZyb20gXCIuL3NlbGVjdGlvbi9pbmRleC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzZWxlY3Rvcikge1xuICByZXR1cm4gdHlwZW9mIHNlbGVjdG9yID09PSBcInN0cmluZ1wiXG4gICAgICA/IG5ldyBTZWxlY3Rpb24oW1tkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKV1dLCBbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XSlcbiAgICAgIDogbmV3IFNlbGVjdGlvbihbW3NlbGVjdG9yXV0sIHJvb3QpO1xufVxuIiwiaW1wb3J0IGNyZWF0b3IgZnJvbSBcIi4uL2NyZWF0b3IuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSkge1xuICB2YXIgY3JlYXRlID0gdHlwZW9mIG5hbWUgPT09IFwiZnVuY3Rpb25cIiA/IG5hbWUgOiBjcmVhdG9yKG5hbWUpO1xuICByZXR1cm4gdGhpcy5zZWxlY3QoZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuYXBwZW5kQ2hpbGQoY3JlYXRlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9KTtcbn1cbiIsImltcG9ydCBuYW1lc3BhY2UgZnJvbSBcIi4uL25hbWVzcGFjZS5qc1wiO1xuXG5mdW5jdGlvbiBhdHRyUmVtb3ZlKG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRyUmVtb3ZlTlMoZnVsbG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0ckNvbnN0YW50KG5hbWUsIHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJDb25zdGFudE5TKGZ1bGxuYW1lLCB2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwsIHZhbHVlKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0ckZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKHYgPT0gbnVsbCkgdGhpcy5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gICAgZWxzZSB0aGlzLnNldEF0dHJpYnV0ZShuYW1lLCB2KTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0ckZ1bmN0aW9uTlMoZnVsbG5hbWUsIHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKHYgPT0gbnVsbCkgdGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwpO1xuICAgIGVsc2UgdGhpcy5zZXRBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwsIHYpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICB2YXIgZnVsbG5hbWUgPSBuYW1lc3BhY2UobmFtZSk7XG5cbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7XG4gICAgdmFyIG5vZGUgPSB0aGlzLm5vZGUoKTtcbiAgICByZXR1cm4gZnVsbG5hbWUubG9jYWxcbiAgICAgICAgPyBub2RlLmdldEF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbClcbiAgICAgICAgOiBub2RlLmdldEF0dHJpYnV0ZShmdWxsbmFtZSk7XG4gIH1cblxuICByZXR1cm4gdGhpcy5lYWNoKCh2YWx1ZSA9PSBudWxsXG4gICAgICA/IChmdWxsbmFtZS5sb2NhbCA/IGF0dHJSZW1vdmVOUyA6IGF0dHJSZW1vdmUpIDogKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICA/IChmdWxsbmFtZS5sb2NhbCA/IGF0dHJGdW5jdGlvbk5TIDogYXR0ckZ1bmN0aW9uKVxuICAgICAgOiAoZnVsbG5hbWUubG9jYWwgPyBhdHRyQ29uc3RhbnROUyA6IGF0dHJDb25zdGFudCkpKShmdWxsbmFtZSwgdmFsdWUpKTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICB2YXIgY2FsbGJhY2sgPSBhcmd1bWVudHNbMF07XG4gIGFyZ3VtZW50c1swXSA9IHRoaXM7XG4gIGNhbGxiYWNrLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gIHJldHVybiB0aGlzO1xufVxuIiwiZnVuY3Rpb24gY2xhc3NBcnJheShzdHJpbmcpIHtcbiAgcmV0dXJuIHN0cmluZy50cmltKCkuc3BsaXQoL158XFxzKy8pO1xufVxuXG5mdW5jdGlvbiBjbGFzc0xpc3Qobm9kZSkge1xuICByZXR1cm4gbm9kZS5jbGFzc0xpc3QgfHwgbmV3IENsYXNzTGlzdChub2RlKTtcbn1cblxuZnVuY3Rpb24gQ2xhc3NMaXN0KG5vZGUpIHtcbiAgdGhpcy5fbm9kZSA9IG5vZGU7XG4gIHRoaXMuX25hbWVzID0gY2xhc3NBcnJheShub2RlLmdldEF0dHJpYnV0ZShcImNsYXNzXCIpIHx8IFwiXCIpO1xufVxuXG5DbGFzc0xpc3QucHJvdG90eXBlID0ge1xuICBhZGQ6IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICB2YXIgaSA9IHRoaXMuX25hbWVzLmluZGV4T2YobmFtZSk7XG4gICAgaWYgKGkgPCAwKSB7XG4gICAgICB0aGlzLl9uYW1lcy5wdXNoKG5hbWUpO1xuICAgICAgdGhpcy5fbm9kZS5zZXRBdHRyaWJ1dGUoXCJjbGFzc1wiLCB0aGlzLl9uYW1lcy5qb2luKFwiIFwiKSk7XG4gICAgfVxuICB9LFxuICByZW1vdmU6IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICB2YXIgaSA9IHRoaXMuX25hbWVzLmluZGV4T2YobmFtZSk7XG4gICAgaWYgKGkgPj0gMCkge1xuICAgICAgdGhpcy5fbmFtZXMuc3BsaWNlKGksIDEpO1xuICAgICAgdGhpcy5fbm9kZS5zZXRBdHRyaWJ1dGUoXCJjbGFzc1wiLCB0aGlzLl9uYW1lcy5qb2luKFwiIFwiKSk7XG4gICAgfVxuICB9LFxuICBjb250YWluczogZnVuY3Rpb24obmFtZSkge1xuICAgIHJldHVybiB0aGlzLl9uYW1lcy5pbmRleE9mKG5hbWUpID49IDA7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIGNsYXNzZWRBZGQobm9kZSwgbmFtZXMpIHtcbiAgdmFyIGxpc3QgPSBjbGFzc0xpc3Qobm9kZSksIGkgPSAtMSwgbiA9IG5hbWVzLmxlbmd0aDtcbiAgd2hpbGUgKCsraSA8IG4pIGxpc3QuYWRkKG5hbWVzW2ldKTtcbn1cblxuZnVuY3Rpb24gY2xhc3NlZFJlbW92ZShub2RlLCBuYW1lcykge1xuICB2YXIgbGlzdCA9IGNsYXNzTGlzdChub2RlKSwgaSA9IC0xLCBuID0gbmFtZXMubGVuZ3RoO1xuICB3aGlsZSAoKytpIDwgbikgbGlzdC5yZW1vdmUobmFtZXNbaV0pO1xufVxuXG5mdW5jdGlvbiBjbGFzc2VkVHJ1ZShuYW1lcykge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgY2xhc3NlZEFkZCh0aGlzLCBuYW1lcyk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNsYXNzZWRGYWxzZShuYW1lcykge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgY2xhc3NlZFJlbW92ZSh0aGlzLCBuYW1lcyk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNsYXNzZWRGdW5jdGlvbihuYW1lcywgdmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICh2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpID8gY2xhc3NlZEFkZCA6IGNsYXNzZWRSZW1vdmUpKHRoaXMsIG5hbWVzKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgdmFyIG5hbWVzID0gY2xhc3NBcnJheShuYW1lICsgXCJcIik7XG5cbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7XG4gICAgdmFyIGxpc3QgPSBjbGFzc0xpc3QodGhpcy5ub2RlKCkpLCBpID0gLTEsIG4gPSBuYW1lcy5sZW5ndGg7XG4gICAgd2hpbGUgKCsraSA8IG4pIGlmICghbGlzdC5jb250YWlucyhuYW1lc1tpXSkpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiB0aGlzLmVhY2goKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICA/IGNsYXNzZWRGdW5jdGlvbiA6IHZhbHVlXG4gICAgICA/IGNsYXNzZWRUcnVlXG4gICAgICA6IGNsYXNzZWRGYWxzZSkobmFtZXMsIHZhbHVlKSk7XG59XG4iLCJmdW5jdGlvbiBzZWxlY3Rpb25fY2xvbmVTaGFsbG93KCkge1xuICB2YXIgY2xvbmUgPSB0aGlzLmNsb25lTm9kZShmYWxzZSksIHBhcmVudCA9IHRoaXMucGFyZW50Tm9kZTtcbiAgcmV0dXJuIHBhcmVudCA/IHBhcmVudC5pbnNlcnRCZWZvcmUoY2xvbmUsIHRoaXMubmV4dFNpYmxpbmcpIDogY2xvbmU7XG59XG5cbmZ1bmN0aW9uIHNlbGVjdGlvbl9jbG9uZURlZXAoKSB7XG4gIHZhciBjbG9uZSA9IHRoaXMuY2xvbmVOb2RlKHRydWUpLCBwYXJlbnQgPSB0aGlzLnBhcmVudE5vZGU7XG4gIHJldHVybiBwYXJlbnQgPyBwYXJlbnQuaW5zZXJ0QmVmb3JlKGNsb25lLCB0aGlzLm5leHRTaWJsaW5nKSA6IGNsb25lO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihkZWVwKSB7XG4gIHJldHVybiB0aGlzLnNlbGVjdChkZWVwID8gc2VsZWN0aW9uX2Nsb25lRGVlcCA6IHNlbGVjdGlvbl9jbG9uZVNoYWxsb3cpO1xufVxuIiwiaW1wb3J0IHtTZWxlY3Rpb259IGZyb20gXCIuL2luZGV4LmpzXCI7XG5pbXBvcnQge0VudGVyTm9kZX0gZnJvbSBcIi4vZW50ZXIuanNcIjtcbmltcG9ydCBjb25zdGFudCBmcm9tIFwiLi4vY29uc3RhbnQuanNcIjtcblxuZnVuY3Rpb24gYmluZEluZGV4KHBhcmVudCwgZ3JvdXAsIGVudGVyLCB1cGRhdGUsIGV4aXQsIGRhdGEpIHtcbiAgdmFyIGkgPSAwLFxuICAgICAgbm9kZSxcbiAgICAgIGdyb3VwTGVuZ3RoID0gZ3JvdXAubGVuZ3RoLFxuICAgICAgZGF0YUxlbmd0aCA9IGRhdGEubGVuZ3RoO1xuXG4gIC8vIFB1dCBhbnkgbm9uLW51bGwgbm9kZXMgdGhhdCBmaXQgaW50byB1cGRhdGUuXG4gIC8vIFB1dCBhbnkgbnVsbCBub2RlcyBpbnRvIGVudGVyLlxuICAvLyBQdXQgYW55IHJlbWFpbmluZyBkYXRhIGludG8gZW50ZXIuXG4gIGZvciAoOyBpIDwgZGF0YUxlbmd0aDsgKytpKSB7XG4gICAgaWYgKG5vZGUgPSBncm91cFtpXSkge1xuICAgICAgbm9kZS5fX2RhdGFfXyA9IGRhdGFbaV07XG4gICAgICB1cGRhdGVbaV0gPSBub2RlO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbnRlcltpXSA9IG5ldyBFbnRlck5vZGUocGFyZW50LCBkYXRhW2ldKTtcbiAgICB9XG4gIH1cblxuICAvLyBQdXQgYW55IG5vbi1udWxsIG5vZGVzIHRoYXQgZG9u4oCZdCBmaXQgaW50byBleGl0LlxuICBmb3IgKDsgaSA8IGdyb3VwTGVuZ3RoOyArK2kpIHtcbiAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XG4gICAgICBleGl0W2ldID0gbm9kZTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYmluZEtleShwYXJlbnQsIGdyb3VwLCBlbnRlciwgdXBkYXRlLCBleGl0LCBkYXRhLCBrZXkpIHtcbiAgdmFyIGksXG4gICAgICBub2RlLFxuICAgICAgbm9kZUJ5S2V5VmFsdWUgPSBuZXcgTWFwLFxuICAgICAgZ3JvdXBMZW5ndGggPSBncm91cC5sZW5ndGgsXG4gICAgICBkYXRhTGVuZ3RoID0gZGF0YS5sZW5ndGgsXG4gICAgICBrZXlWYWx1ZXMgPSBuZXcgQXJyYXkoZ3JvdXBMZW5ndGgpLFxuICAgICAga2V5VmFsdWU7XG5cbiAgLy8gQ29tcHV0ZSB0aGUga2V5IGZvciBlYWNoIG5vZGUuXG4gIC8vIElmIG11bHRpcGxlIG5vZGVzIGhhdmUgdGhlIHNhbWUga2V5LCB0aGUgZHVwbGljYXRlcyBhcmUgYWRkZWQgdG8gZXhpdC5cbiAgZm9yIChpID0gMDsgaSA8IGdyb3VwTGVuZ3RoOyArK2kpIHtcbiAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XG4gICAgICBrZXlWYWx1ZXNbaV0gPSBrZXlWYWx1ZSA9IGtleS5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKSArIFwiXCI7XG4gICAgICBpZiAobm9kZUJ5S2V5VmFsdWUuaGFzKGtleVZhbHVlKSkge1xuICAgICAgICBleGl0W2ldID0gbm9kZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5vZGVCeUtleVZhbHVlLnNldChrZXlWYWx1ZSwgbm9kZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gQ29tcHV0ZSB0aGUga2V5IGZvciBlYWNoIGRhdHVtLlxuICAvLyBJZiB0aGVyZSBhIG5vZGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMga2V5LCBqb2luIGFuZCBhZGQgaXQgdG8gdXBkYXRlLlxuICAvLyBJZiB0aGVyZSBpcyBub3QgKG9yIHRoZSBrZXkgaXMgYSBkdXBsaWNhdGUpLCBhZGQgaXQgdG8gZW50ZXIuXG4gIGZvciAoaSA9IDA7IGkgPCBkYXRhTGVuZ3RoOyArK2kpIHtcbiAgICBrZXlWYWx1ZSA9IGtleS5jYWxsKHBhcmVudCwgZGF0YVtpXSwgaSwgZGF0YSkgKyBcIlwiO1xuICAgIGlmIChub2RlID0gbm9kZUJ5S2V5VmFsdWUuZ2V0KGtleVZhbHVlKSkge1xuICAgICAgdXBkYXRlW2ldID0gbm9kZTtcbiAgICAgIG5vZGUuX19kYXRhX18gPSBkYXRhW2ldO1xuICAgICAgbm9kZUJ5S2V5VmFsdWUuZGVsZXRlKGtleVZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZW50ZXJbaV0gPSBuZXcgRW50ZXJOb2RlKHBhcmVudCwgZGF0YVtpXSk7XG4gICAgfVxuICB9XG5cbiAgLy8gQWRkIGFueSByZW1haW5pbmcgbm9kZXMgdGhhdCB3ZXJlIG5vdCBib3VuZCB0byBkYXRhIHRvIGV4aXQuXG4gIGZvciAoaSA9IDA7IGkgPCBncm91cExlbmd0aDsgKytpKSB7XG4gICAgaWYgKChub2RlID0gZ3JvdXBbaV0pICYmIChub2RlQnlLZXlWYWx1ZS5nZXQoa2V5VmFsdWVzW2ldKSA9PT0gbm9kZSkpIHtcbiAgICAgIGV4aXRbaV0gPSBub2RlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBkYXR1bShub2RlKSB7XG4gIHJldHVybiBub2RlLl9fZGF0YV9fO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIEFycmF5LmZyb20odGhpcywgZGF0dW0pO1xuXG4gIHZhciBiaW5kID0ga2V5ID8gYmluZEtleSA6IGJpbmRJbmRleCxcbiAgICAgIHBhcmVudHMgPSB0aGlzLl9wYXJlbnRzLFxuICAgICAgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzO1xuXG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikgdmFsdWUgPSBjb25zdGFudCh2YWx1ZSk7XG5cbiAgZm9yICh2YXIgbSA9IGdyb3Vwcy5sZW5ndGgsIHVwZGF0ZSA9IG5ldyBBcnJheShtKSwgZW50ZXIgPSBuZXcgQXJyYXkobSksIGV4aXQgPSBuZXcgQXJyYXkobSksIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgdmFyIHBhcmVudCA9IHBhcmVudHNbal0sXG4gICAgICAgIGdyb3VwID0gZ3JvdXBzW2pdLFxuICAgICAgICBncm91cExlbmd0aCA9IGdyb3VwLmxlbmd0aCxcbiAgICAgICAgZGF0YSA9IGFycmF5bGlrZSh2YWx1ZS5jYWxsKHBhcmVudCwgcGFyZW50ICYmIHBhcmVudC5fX2RhdGFfXywgaiwgcGFyZW50cykpLFxuICAgICAgICBkYXRhTGVuZ3RoID0gZGF0YS5sZW5ndGgsXG4gICAgICAgIGVudGVyR3JvdXAgPSBlbnRlcltqXSA9IG5ldyBBcnJheShkYXRhTGVuZ3RoKSxcbiAgICAgICAgdXBkYXRlR3JvdXAgPSB1cGRhdGVbal0gPSBuZXcgQXJyYXkoZGF0YUxlbmd0aCksXG4gICAgICAgIGV4aXRHcm91cCA9IGV4aXRbal0gPSBuZXcgQXJyYXkoZ3JvdXBMZW5ndGgpO1xuXG4gICAgYmluZChwYXJlbnQsIGdyb3VwLCBlbnRlckdyb3VwLCB1cGRhdGVHcm91cCwgZXhpdEdyb3VwLCBkYXRhLCBrZXkpO1xuXG4gICAgLy8gTm93IGNvbm5lY3QgdGhlIGVudGVyIG5vZGVzIHRvIHRoZWlyIGZvbGxvd2luZyB1cGRhdGUgbm9kZSwgc3VjaCB0aGF0XG4gICAgLy8gYXBwZW5kQ2hpbGQgY2FuIGluc2VydCB0aGUgbWF0ZXJpYWxpemVkIGVudGVyIG5vZGUgYmVmb3JlIHRoaXMgbm9kZSxcbiAgICAvLyByYXRoZXIgdGhhbiBhdCB0aGUgZW5kIG9mIHRoZSBwYXJlbnQgbm9kZS5cbiAgICBmb3IgKHZhciBpMCA9IDAsIGkxID0gMCwgcHJldmlvdXMsIG5leHQ7IGkwIDwgZGF0YUxlbmd0aDsgKytpMCkge1xuICAgICAgaWYgKHByZXZpb3VzID0gZW50ZXJHcm91cFtpMF0pIHtcbiAgICAgICAgaWYgKGkwID49IGkxKSBpMSA9IGkwICsgMTtcbiAgICAgICAgd2hpbGUgKCEobmV4dCA9IHVwZGF0ZUdyb3VwW2kxXSkgJiYgKytpMSA8IGRhdGFMZW5ndGgpO1xuICAgICAgICBwcmV2aW91cy5fbmV4dCA9IG5leHQgfHwgbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB1cGRhdGUgPSBuZXcgU2VsZWN0aW9uKHVwZGF0ZSwgcGFyZW50cyk7XG4gIHVwZGF0ZS5fZW50ZXIgPSBlbnRlcjtcbiAgdXBkYXRlLl9leGl0ID0gZXhpdDtcbiAgcmV0dXJuIHVwZGF0ZTtcbn1cblxuLy8gR2l2ZW4gc29tZSBkYXRhLCB0aGlzIHJldHVybnMgYW4gYXJyYXktbGlrZSB2aWV3IG9mIGl0OiBhbiBvYmplY3QgdGhhdFxuLy8gZXhwb3NlcyBhIGxlbmd0aCBwcm9wZXJ0eSBhbmQgYWxsb3dzIG51bWVyaWMgaW5kZXhpbmcuIE5vdGUgdGhhdCB1bmxpa2Vcbi8vIHNlbGVjdEFsbCwgdGhpcyBpc27igJl0IHdvcnJpZWQgYWJvdXQg4oCcbGl2ZeKAnSBjb2xsZWN0aW9ucyBiZWNhdXNlIHRoZSByZXN1bHRpbmdcbi8vIGFycmF5IHdpbGwgb25seSBiZSB1c2VkIGJyaWVmbHkgd2hpbGUgZGF0YSBpcyBiZWluZyBib3VuZC4gKEl0IGlzIHBvc3NpYmxlIHRvXG4vLyBjYXVzZSB0aGUgZGF0YSB0byBjaGFuZ2Ugd2hpbGUgaXRlcmF0aW5nIGJ5IHVzaW5nIGEga2V5IGZ1bmN0aW9uLCBidXQgcGxlYXNlXG4vLyBkb27igJl0OyB3ZeKAmWQgcmF0aGVyIGF2b2lkIGEgZ3JhdHVpdG91cyBjb3B5LilcbmZ1bmN0aW9uIGFycmF5bGlrZShkYXRhKSB7XG4gIHJldHVybiB0eXBlb2YgZGF0YSA9PT0gXCJvYmplY3RcIiAmJiBcImxlbmd0aFwiIGluIGRhdGFcbiAgICA/IGRhdGEgLy8gQXJyYXksIFR5cGVkQXJyYXksIE5vZGVMaXN0LCBhcnJheS1saWtlXG4gICAgOiBBcnJheS5mcm9tKGRhdGEpOyAvLyBNYXAsIFNldCwgaXRlcmFibGUsIHN0cmluZywgb3IgYW55dGhpbmcgZWxzZVxufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGhcbiAgICAgID8gdGhpcy5wcm9wZXJ0eShcIl9fZGF0YV9fXCIsIHZhbHVlKVxuICAgICAgOiB0aGlzLm5vZGUoKS5fX2RhdGFfXztcbn1cbiIsImltcG9ydCBkZWZhdWx0VmlldyBmcm9tIFwiLi4vd2luZG93LmpzXCI7XG5cbmZ1bmN0aW9uIGRpc3BhdGNoRXZlbnQobm9kZSwgdHlwZSwgcGFyYW1zKSB7XG4gIHZhciB3aW5kb3cgPSBkZWZhdWx0Vmlldyhub2RlKSxcbiAgICAgIGV2ZW50ID0gd2luZG93LkN1c3RvbUV2ZW50O1xuXG4gIGlmICh0eXBlb2YgZXZlbnQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGV2ZW50ID0gbmV3IGV2ZW50KHR5cGUsIHBhcmFtcyk7XG4gIH0gZWxzZSB7XG4gICAgZXZlbnQgPSB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRXZlbnQoXCJFdmVudFwiKTtcbiAgICBpZiAocGFyYW1zKSBldmVudC5pbml0RXZlbnQodHlwZSwgcGFyYW1zLmJ1YmJsZXMsIHBhcmFtcy5jYW5jZWxhYmxlKSwgZXZlbnQuZGV0YWlsID0gcGFyYW1zLmRldGFpbDtcbiAgICBlbHNlIGV2ZW50LmluaXRFdmVudCh0eXBlLCBmYWxzZSwgZmFsc2UpO1xuICB9XG5cbiAgbm9kZS5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbn1cblxuZnVuY3Rpb24gZGlzcGF0Y2hDb25zdGFudCh0eXBlLCBwYXJhbXMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBkaXNwYXRjaEV2ZW50KHRoaXMsIHR5cGUsIHBhcmFtcyk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGRpc3BhdGNoRnVuY3Rpb24odHlwZSwgcGFyYW1zKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZGlzcGF0Y2hFdmVudCh0aGlzLCB0eXBlLCBwYXJhbXMuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHR5cGUsIHBhcmFtcykge1xuICByZXR1cm4gdGhpcy5lYWNoKCh0eXBlb2YgcGFyYW1zID09PSBcImZ1bmN0aW9uXCJcbiAgICAgID8gZGlzcGF0Y2hGdW5jdGlvblxuICAgICAgOiBkaXNwYXRjaENvbnN0YW50KSh0eXBlLCBwYXJhbXMpKTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBqID0gMCwgbSA9IGdyb3Vwcy5sZW5ndGg7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgaSA9IDAsIG4gPSBncm91cC5sZW5ndGgsIG5vZGU7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIGNhbGxiYWNrLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiAhdGhpcy5ub2RlKCk7XG59XG4iLCJpbXBvcnQgc3BhcnNlIGZyb20gXCIuL3NwYXJzZS5qc1wiO1xuaW1wb3J0IHtTZWxlY3Rpb259IGZyb20gXCIuL2luZGV4LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFNlbGVjdGlvbih0aGlzLl9lbnRlciB8fCB0aGlzLl9ncm91cHMubWFwKHNwYXJzZSksIHRoaXMuX3BhcmVudHMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gRW50ZXJOb2RlKHBhcmVudCwgZGF0dW0pIHtcbiAgdGhpcy5vd25lckRvY3VtZW50ID0gcGFyZW50Lm93bmVyRG9jdW1lbnQ7XG4gIHRoaXMubmFtZXNwYWNlVVJJID0gcGFyZW50Lm5hbWVzcGFjZVVSSTtcbiAgdGhpcy5fbmV4dCA9IG51bGw7XG4gIHRoaXMuX3BhcmVudCA9IHBhcmVudDtcbiAgdGhpcy5fX2RhdGFfXyA9IGRhdHVtO1xufVxuXG5FbnRlck5vZGUucHJvdG90eXBlID0ge1xuICBjb25zdHJ1Y3RvcjogRW50ZXJOb2RlLFxuICBhcHBlbmRDaGlsZDogZnVuY3Rpb24oY2hpbGQpIHsgcmV0dXJuIHRoaXMuX3BhcmVudC5pbnNlcnRCZWZvcmUoY2hpbGQsIHRoaXMuX25leHQpOyB9LFxuICBpbnNlcnRCZWZvcmU6IGZ1bmN0aW9uKGNoaWxkLCBuZXh0KSB7IHJldHVybiB0aGlzLl9wYXJlbnQuaW5zZXJ0QmVmb3JlKGNoaWxkLCBuZXh0KTsgfSxcbiAgcXVlcnlTZWxlY3RvcjogZnVuY3Rpb24oc2VsZWN0b3IpIHsgcmV0dXJuIHRoaXMuX3BhcmVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTsgfSxcbiAgcXVlcnlTZWxlY3RvckFsbDogZnVuY3Rpb24oc2VsZWN0b3IpIHsgcmV0dXJuIHRoaXMuX3BhcmVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTsgfVxufTtcbiIsImltcG9ydCBzcGFyc2UgZnJvbSBcIi4vc3BhcnNlLmpzXCI7XG5pbXBvcnQge1NlbGVjdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgU2VsZWN0aW9uKHRoaXMuX2V4aXQgfHwgdGhpcy5fZ3JvdXBzLm1hcChzcGFyc2UpLCB0aGlzLl9wYXJlbnRzKTtcbn1cbiIsImltcG9ydCB7U2VsZWN0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuaW1wb3J0IG1hdGNoZXIgZnJvbSBcIi4uL21hdGNoZXIuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obWF0Y2gpIHtcbiAgaWYgKHR5cGVvZiBtYXRjaCAhPT0gXCJmdW5jdGlvblwiKSBtYXRjaCA9IG1hdGNoZXIobWF0Y2gpO1xuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHN1Ymdyb3VwcyA9IG5ldyBBcnJheShtKSwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgc3ViZ3JvdXAgPSBzdWJncm91cHNbal0gPSBbXSwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmICgobm9kZSA9IGdyb3VwW2ldKSAmJiBtYXRjaC5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKSkge1xuICAgICAgICBzdWJncm91cC5wdXNoKG5vZGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgU2VsZWN0aW9uKHN1Ymdyb3VwcywgdGhpcy5fcGFyZW50cyk7XG59XG4iLCJmdW5jdGlvbiBodG1sUmVtb3ZlKCkge1xuICB0aGlzLmlubmVySFRNTCA9IFwiXCI7XG59XG5cbmZ1bmN0aW9uIGh0bWxDb25zdGFudCh2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5pbm5lckhUTUwgPSB2YWx1ZTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gaHRtbEZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgdGhpcy5pbm5lckhUTUwgPSB2ID09IG51bGwgPyBcIlwiIDogdjtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGhcbiAgICAgID8gdGhpcy5lYWNoKHZhbHVlID09IG51bGxcbiAgICAgICAgICA/IGh0bWxSZW1vdmUgOiAodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICA/IGh0bWxGdW5jdGlvblxuICAgICAgICAgIDogaHRtbENvbnN0YW50KSh2YWx1ZSkpXG4gICAgICA6IHRoaXMubm9kZSgpLmlubmVySFRNTDtcbn1cbiIsImltcG9ydCBzZWxlY3Rpb25fc2VsZWN0IGZyb20gXCIuL3NlbGVjdC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9zZWxlY3RBbGwgZnJvbSBcIi4vc2VsZWN0QWxsLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3NlbGVjdENoaWxkIGZyb20gXCIuL3NlbGVjdENoaWxkLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3NlbGVjdENoaWxkcmVuIGZyb20gXCIuL3NlbGVjdENoaWxkcmVuLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2ZpbHRlciBmcm9tIFwiLi9maWx0ZXIuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fZGF0YSBmcm9tIFwiLi9kYXRhLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2VudGVyIGZyb20gXCIuL2VudGVyLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2V4aXQgZnJvbSBcIi4vZXhpdC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9qb2luIGZyb20gXCIuL2pvaW4uanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fbWVyZ2UgZnJvbSBcIi4vbWVyZ2UuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fb3JkZXIgZnJvbSBcIi4vb3JkZXIuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fc29ydCBmcm9tIFwiLi9zb3J0LmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2NhbGwgZnJvbSBcIi4vY2FsbC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9ub2RlcyBmcm9tIFwiLi9ub2Rlcy5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9ub2RlIGZyb20gXCIuL25vZGUuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fc2l6ZSBmcm9tIFwiLi9zaXplLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2VtcHR5IGZyb20gXCIuL2VtcHR5LmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2VhY2ggZnJvbSBcIi4vZWFjaC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9hdHRyIGZyb20gXCIuL2F0dHIuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fc3R5bGUgZnJvbSBcIi4vc3R5bGUuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fcHJvcGVydHkgZnJvbSBcIi4vcHJvcGVydHkuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fY2xhc3NlZCBmcm9tIFwiLi9jbGFzc2VkLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3RleHQgZnJvbSBcIi4vdGV4dC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9odG1sIGZyb20gXCIuL2h0bWwuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fcmFpc2UgZnJvbSBcIi4vcmFpc2UuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fbG93ZXIgZnJvbSBcIi4vbG93ZXIuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fYXBwZW5kIGZyb20gXCIuL2FwcGVuZC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9pbnNlcnQgZnJvbSBcIi4vaW5zZXJ0LmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3JlbW92ZSBmcm9tIFwiLi9yZW1vdmUuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fY2xvbmUgZnJvbSBcIi4vY2xvbmUuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fZGF0dW0gZnJvbSBcIi4vZGF0dW0uanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fb24gZnJvbSBcIi4vb24uanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fZGlzcGF0Y2ggZnJvbSBcIi4vZGlzcGF0Y2guanNcIjtcbmltcG9ydCBzZWxlY3Rpb25faXRlcmF0b3IgZnJvbSBcIi4vaXRlcmF0b3IuanNcIjtcblxuZXhwb3J0IHZhciByb290ID0gW251bGxdO1xuXG5leHBvcnQgZnVuY3Rpb24gU2VsZWN0aW9uKGdyb3VwcywgcGFyZW50cykge1xuICB0aGlzLl9ncm91cHMgPSBncm91cHM7XG4gIHRoaXMuX3BhcmVudHMgPSBwYXJlbnRzO1xufVxuXG5mdW5jdGlvbiBzZWxlY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgU2VsZWN0aW9uKFtbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XV0sIHJvb3QpO1xufVxuXG5mdW5jdGlvbiBzZWxlY3Rpb25fc2VsZWN0aW9uKCkge1xuICByZXR1cm4gdGhpcztcbn1cblxuU2VsZWN0aW9uLnByb3RvdHlwZSA9IHNlbGVjdGlvbi5wcm90b3R5cGUgPSB7XG4gIGNvbnN0cnVjdG9yOiBTZWxlY3Rpb24sXG4gIHNlbGVjdDogc2VsZWN0aW9uX3NlbGVjdCxcbiAgc2VsZWN0QWxsOiBzZWxlY3Rpb25fc2VsZWN0QWxsLFxuICBzZWxlY3RDaGlsZDogc2VsZWN0aW9uX3NlbGVjdENoaWxkLFxuICBzZWxlY3RDaGlsZHJlbjogc2VsZWN0aW9uX3NlbGVjdENoaWxkcmVuLFxuICBmaWx0ZXI6IHNlbGVjdGlvbl9maWx0ZXIsXG4gIGRhdGE6IHNlbGVjdGlvbl9kYXRhLFxuICBlbnRlcjogc2VsZWN0aW9uX2VudGVyLFxuICBleGl0OiBzZWxlY3Rpb25fZXhpdCxcbiAgam9pbjogc2VsZWN0aW9uX2pvaW4sXG4gIG1lcmdlOiBzZWxlY3Rpb25fbWVyZ2UsXG4gIHNlbGVjdGlvbjogc2VsZWN0aW9uX3NlbGVjdGlvbixcbiAgb3JkZXI6IHNlbGVjdGlvbl9vcmRlcixcbiAgc29ydDogc2VsZWN0aW9uX3NvcnQsXG4gIGNhbGw6IHNlbGVjdGlvbl9jYWxsLFxuICBub2Rlczogc2VsZWN0aW9uX25vZGVzLFxuICBub2RlOiBzZWxlY3Rpb25fbm9kZSxcbiAgc2l6ZTogc2VsZWN0aW9uX3NpemUsXG4gIGVtcHR5OiBzZWxlY3Rpb25fZW1wdHksXG4gIGVhY2g6IHNlbGVjdGlvbl9lYWNoLFxuICBhdHRyOiBzZWxlY3Rpb25fYXR0cixcbiAgc3R5bGU6IHNlbGVjdGlvbl9zdHlsZSxcbiAgcHJvcGVydHk6IHNlbGVjdGlvbl9wcm9wZXJ0eSxcbiAgY2xhc3NlZDogc2VsZWN0aW9uX2NsYXNzZWQsXG4gIHRleHQ6IHNlbGVjdGlvbl90ZXh0LFxuICBodG1sOiBzZWxlY3Rpb25faHRtbCxcbiAgcmFpc2U6IHNlbGVjdGlvbl9yYWlzZSxcbiAgbG93ZXI6IHNlbGVjdGlvbl9sb3dlcixcbiAgYXBwZW5kOiBzZWxlY3Rpb25fYXBwZW5kLFxuICBpbnNlcnQ6IHNlbGVjdGlvbl9pbnNlcnQsXG4gIHJlbW92ZTogc2VsZWN0aW9uX3JlbW92ZSxcbiAgY2xvbmU6IHNlbGVjdGlvbl9jbG9uZSxcbiAgZGF0dW06IHNlbGVjdGlvbl9kYXR1bSxcbiAgb246IHNlbGVjdGlvbl9vbixcbiAgZGlzcGF0Y2g6IHNlbGVjdGlvbl9kaXNwYXRjaCxcbiAgW1N5bWJvbC5pdGVyYXRvcl06IHNlbGVjdGlvbl9pdGVyYXRvclxufTtcblxuZXhwb3J0IGRlZmF1bHQgc2VsZWN0aW9uO1xuIiwiaW1wb3J0IGNyZWF0b3IgZnJvbSBcIi4uL2NyZWF0b3IuanNcIjtcbmltcG9ydCBzZWxlY3RvciBmcm9tIFwiLi4vc2VsZWN0b3IuanNcIjtcblxuZnVuY3Rpb24gY29uc3RhbnROdWxsKCkge1xuICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSwgYmVmb3JlKSB7XG4gIHZhciBjcmVhdGUgPSB0eXBlb2YgbmFtZSA9PT0gXCJmdW5jdGlvblwiID8gbmFtZSA6IGNyZWF0b3IobmFtZSksXG4gICAgICBzZWxlY3QgPSBiZWZvcmUgPT0gbnVsbCA/IGNvbnN0YW50TnVsbCA6IHR5cGVvZiBiZWZvcmUgPT09IFwiZnVuY3Rpb25cIiA/IGJlZm9yZSA6IHNlbGVjdG9yKGJlZm9yZSk7XG4gIHJldHVybiB0aGlzLnNlbGVjdChmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5pbnNlcnRCZWZvcmUoY3JlYXRlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksIHNlbGVjdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IG51bGwpO1xuICB9KTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKigpIHtcbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBqID0gMCwgbSA9IGdyb3Vwcy5sZW5ndGg7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgaSA9IDAsIG4gPSBncm91cC5sZW5ndGgsIG5vZGU7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHlpZWxkIG5vZGU7XG4gICAgfVxuICB9XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihvbmVudGVyLCBvbnVwZGF0ZSwgb25leGl0KSB7XG4gIHZhciBlbnRlciA9IHRoaXMuZW50ZXIoKSwgdXBkYXRlID0gdGhpcywgZXhpdCA9IHRoaXMuZXhpdCgpO1xuICBpZiAodHlwZW9mIG9uZW50ZXIgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGVudGVyID0gb25lbnRlcihlbnRlcik7XG4gICAgaWYgKGVudGVyKSBlbnRlciA9IGVudGVyLnNlbGVjdGlvbigpO1xuICB9IGVsc2Uge1xuICAgIGVudGVyID0gZW50ZXIuYXBwZW5kKG9uZW50ZXIgKyBcIlwiKTtcbiAgfVxuICBpZiAob251cGRhdGUgIT0gbnVsbCkge1xuICAgIHVwZGF0ZSA9IG9udXBkYXRlKHVwZGF0ZSk7XG4gICAgaWYgKHVwZGF0ZSkgdXBkYXRlID0gdXBkYXRlLnNlbGVjdGlvbigpO1xuICB9XG4gIGlmIChvbmV4aXQgPT0gbnVsbCkgZXhpdC5yZW1vdmUoKTsgZWxzZSBvbmV4aXQoZXhpdCk7XG4gIHJldHVybiBlbnRlciAmJiB1cGRhdGUgPyBlbnRlci5tZXJnZSh1cGRhdGUpLm9yZGVyKCkgOiB1cGRhdGU7XG59XG4iLCJmdW5jdGlvbiBsb3dlcigpIHtcbiAgaWYgKHRoaXMucHJldmlvdXNTaWJsaW5nKSB0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRoaXMsIHRoaXMucGFyZW50Tm9kZS5maXJzdENoaWxkKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLmVhY2gobG93ZXIpO1xufVxuIiwiaW1wb3J0IHtTZWxlY3Rpb259IGZyb20gXCIuL2luZGV4LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGNvbnRleHQpIHtcbiAgdmFyIHNlbGVjdGlvbiA9IGNvbnRleHQuc2VsZWN0aW9uID8gY29udGV4dC5zZWxlY3Rpb24oKSA6IGNvbnRleHQ7XG5cbiAgZm9yICh2YXIgZ3JvdXBzMCA9IHRoaXMuX2dyb3VwcywgZ3JvdXBzMSA9IHNlbGVjdGlvbi5fZ3JvdXBzLCBtMCA9IGdyb3VwczAubGVuZ3RoLCBtMSA9IGdyb3VwczEubGVuZ3RoLCBtID0gTWF0aC5taW4obTAsIG0xKSwgbWVyZ2VzID0gbmV3IEFycmF5KG0wKSwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cDAgPSBncm91cHMwW2pdLCBncm91cDEgPSBncm91cHMxW2pdLCBuID0gZ3JvdXAwLmxlbmd0aCwgbWVyZ2UgPSBtZXJnZXNbal0gPSBuZXcgQXJyYXkobiksIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwMFtpXSB8fCBncm91cDFbaV0pIHtcbiAgICAgICAgbWVyZ2VbaV0gPSBub2RlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZvciAoOyBqIDwgbTA7ICsraikge1xuICAgIG1lcmdlc1tqXSA9IGdyb3VwczBbal07XG4gIH1cblxuICByZXR1cm4gbmV3IFNlbGVjdGlvbihtZXJnZXMsIHRoaXMuX3BhcmVudHMpO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBqID0gMCwgbSA9IGdyb3Vwcy5sZW5ndGg7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgaSA9IDAsIG4gPSBncm91cC5sZW5ndGg7IGkgPCBuOyArK2kpIHtcbiAgICAgIHZhciBub2RlID0gZ3JvdXBbaV07XG4gICAgICBpZiAobm9kZSkgcmV0dXJuIG5vZGU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIEFycmF5LmZyb20odGhpcyk7XG59XG4iLCJmdW5jdGlvbiBjb250ZXh0TGlzdGVuZXIobGlzdGVuZXIpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgbGlzdGVuZXIuY2FsbCh0aGlzLCBldmVudCwgdGhpcy5fX2RhdGFfXyk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHBhcnNlVHlwZW5hbWVzKHR5cGVuYW1lcykge1xuICByZXR1cm4gdHlwZW5hbWVzLnRyaW0oKS5zcGxpdCgvXnxcXHMrLykubWFwKGZ1bmN0aW9uKHQpIHtcbiAgICB2YXIgbmFtZSA9IFwiXCIsIGkgPSB0LmluZGV4T2YoXCIuXCIpO1xuICAgIGlmIChpID49IDApIG5hbWUgPSB0LnNsaWNlKGkgKyAxKSwgdCA9IHQuc2xpY2UoMCwgaSk7XG4gICAgcmV0dXJuIHt0eXBlOiB0LCBuYW1lOiBuYW1lfTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIG9uUmVtb3ZlKHR5cGVuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgb24gPSB0aGlzLl9fb247XG4gICAgaWYgKCFvbikgcmV0dXJuO1xuICAgIGZvciAodmFyIGogPSAwLCBpID0gLTEsIG0gPSBvbi5sZW5ndGgsIG87IGogPCBtOyArK2opIHtcbiAgICAgIGlmIChvID0gb25bal0sICghdHlwZW5hbWUudHlwZSB8fCBvLnR5cGUgPT09IHR5cGVuYW1lLnR5cGUpICYmIG8ubmFtZSA9PT0gdHlwZW5hbWUubmFtZSkge1xuICAgICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoby50eXBlLCBvLmxpc3RlbmVyLCBvLm9wdGlvbnMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb25bKytpXSA9IG87XG4gICAgICB9XG4gICAgfVxuICAgIGlmICgrK2kpIG9uLmxlbmd0aCA9IGk7XG4gICAgZWxzZSBkZWxldGUgdGhpcy5fX29uO1xuICB9O1xufVxuXG5mdW5jdGlvbiBvbkFkZCh0eXBlbmFtZSwgdmFsdWUsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBvbiA9IHRoaXMuX19vbiwgbywgbGlzdGVuZXIgPSBjb250ZXh0TGlzdGVuZXIodmFsdWUpO1xuICAgIGlmIChvbikgZm9yICh2YXIgaiA9IDAsIG0gPSBvbi5sZW5ndGg7IGogPCBtOyArK2opIHtcbiAgICAgIGlmICgobyA9IG9uW2pdKS50eXBlID09PSB0eXBlbmFtZS50eXBlICYmIG8ubmFtZSA9PT0gdHlwZW5hbWUubmFtZSkge1xuICAgICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoby50eXBlLCBvLmxpc3RlbmVyLCBvLm9wdGlvbnMpO1xuICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoby50eXBlLCBvLmxpc3RlbmVyID0gbGlzdGVuZXIsIG8ub3B0aW9ucyA9IG9wdGlvbnMpO1xuICAgICAgICBvLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKHR5cGVuYW1lLnR5cGUsIGxpc3RlbmVyLCBvcHRpb25zKTtcbiAgICBvID0ge3R5cGU6IHR5cGVuYW1lLnR5cGUsIG5hbWU6IHR5cGVuYW1lLm5hbWUsIHZhbHVlOiB2YWx1ZSwgbGlzdGVuZXI6IGxpc3RlbmVyLCBvcHRpb25zOiBvcHRpb25zfTtcbiAgICBpZiAoIW9uKSB0aGlzLl9fb24gPSBbb107XG4gICAgZWxzZSBvbi5wdXNoKG8pO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih0eXBlbmFtZSwgdmFsdWUsIG9wdGlvbnMpIHtcbiAgdmFyIHR5cGVuYW1lcyA9IHBhcnNlVHlwZW5hbWVzKHR5cGVuYW1lICsgXCJcIiksIGksIG4gPSB0eXBlbmFtZXMubGVuZ3RoLCB0O1xuXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikge1xuICAgIHZhciBvbiA9IHRoaXMubm9kZSgpLl9fb247XG4gICAgaWYgKG9uKSBmb3IgKHZhciBqID0gMCwgbSA9IG9uLmxlbmd0aCwgbzsgaiA8IG07ICsraikge1xuICAgICAgZm9yIChpID0gMCwgbyA9IG9uW2pdOyBpIDwgbjsgKytpKSB7XG4gICAgICAgIGlmICgodCA9IHR5cGVuYW1lc1tpXSkudHlwZSA9PT0gby50eXBlICYmIHQubmFtZSA9PT0gby5uYW1lKSB7XG4gICAgICAgICAgcmV0dXJuIG8udmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgb24gPSB2YWx1ZSA/IG9uQWRkIDogb25SZW1vdmU7XG4gIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHRoaXMuZWFjaChvbih0eXBlbmFtZXNbaV0sIHZhbHVlLCBvcHRpb25zKSk7XG4gIHJldHVybiB0aGlzO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBqID0gLTEsIG0gPSBncm91cHMubGVuZ3RoOyArK2ogPCBtOykge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBpID0gZ3JvdXAubGVuZ3RoIC0gMSwgbmV4dCA9IGdyb3VwW2ldLCBub2RlOyAtLWkgPj0gMDspIHtcbiAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHtcbiAgICAgICAgaWYgKG5leHQgJiYgbm9kZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihuZXh0KSBeIDQpIG5leHQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobm9kZSwgbmV4dCk7XG4gICAgICAgIG5leHQgPSBub2RlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufVxuIiwiZnVuY3Rpb24gcHJvcGVydHlSZW1vdmUobmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgZGVsZXRlIHRoaXNbbmFtZV07XG4gIH07XG59XG5cbmZ1bmN0aW9uIHByb3BlcnR5Q29uc3RhbnQobmFtZSwgdmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXNbbmFtZV0gPSB2YWx1ZTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gcHJvcGVydHlGdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmICh2ID09IG51bGwpIGRlbGV0ZSB0aGlzW25hbWVdO1xuICAgIGVsc2UgdGhpc1tuYW1lXSA9IHY7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID4gMVxuICAgICAgPyB0aGlzLmVhY2goKHZhbHVlID09IG51bGxcbiAgICAgICAgICA/IHByb3BlcnR5UmVtb3ZlIDogdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICA/IHByb3BlcnR5RnVuY3Rpb25cbiAgICAgICAgICA6IHByb3BlcnR5Q29uc3RhbnQpKG5hbWUsIHZhbHVlKSlcbiAgICAgIDogdGhpcy5ub2RlKClbbmFtZV07XG59XG4iLCJmdW5jdGlvbiByYWlzZSgpIHtcbiAgaWYgKHRoaXMubmV4dFNpYmxpbmcpIHRoaXMucGFyZW50Tm9kZS5hcHBlbmRDaGlsZCh0aGlzKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLmVhY2gocmFpc2UpO1xufVxuIiwiZnVuY3Rpb24gcmVtb3ZlKCkge1xuICB2YXIgcGFyZW50ID0gdGhpcy5wYXJlbnROb2RlO1xuICBpZiAocGFyZW50KSBwYXJlbnQucmVtb3ZlQ2hpbGQodGhpcyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5lYWNoKHJlbW92ZSk7XG59XG4iLCJpbXBvcnQge1NlbGVjdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcbmltcG9ydCBzZWxlY3RvciBmcm9tIFwiLi4vc2VsZWN0b3IuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc2VsZWN0KSB7XG4gIGlmICh0eXBlb2Ygc2VsZWN0ICE9PSBcImZ1bmN0aW9uXCIpIHNlbGVjdCA9IHNlbGVjdG9yKHNlbGVjdCk7XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc3ViZ3JvdXBzID0gbmV3IEFycmF5KG0pLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBzdWJncm91cCA9IHN1Ymdyb3Vwc1tqXSA9IG5ldyBBcnJheShuKSwgbm9kZSwgc3Vibm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmICgobm9kZSA9IGdyb3VwW2ldKSAmJiAoc3Vibm9kZSA9IHNlbGVjdC5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKSkpIHtcbiAgICAgICAgaWYgKFwiX19kYXRhX19cIiBpbiBub2RlKSBzdWJub2RlLl9fZGF0YV9fID0gbm9kZS5fX2RhdGFfXztcbiAgICAgICAgc3ViZ3JvdXBbaV0gPSBzdWJub2RlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgU2VsZWN0aW9uKHN1Ymdyb3VwcywgdGhpcy5fcGFyZW50cyk7XG59XG4iLCJpbXBvcnQge1NlbGVjdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcbmltcG9ydCBhcnJheSBmcm9tIFwiLi4vYXJyYXkuanNcIjtcbmltcG9ydCBzZWxlY3RvckFsbCBmcm9tIFwiLi4vc2VsZWN0b3JBbGwuanNcIjtcblxuZnVuY3Rpb24gYXJyYXlBbGwoc2VsZWN0KSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gYXJyYXkoc2VsZWN0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzZWxlY3QpIHtcbiAgaWYgKHR5cGVvZiBzZWxlY3QgPT09IFwiZnVuY3Rpb25cIikgc2VsZWN0ID0gYXJyYXlBbGwoc2VsZWN0KTtcbiAgZWxzZSBzZWxlY3QgPSBzZWxlY3RvckFsbChzZWxlY3QpO1xuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHN1Ymdyb3VwcyA9IFtdLCBwYXJlbnRzID0gW10sIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XG4gICAgICAgIHN1Ymdyb3Vwcy5wdXNoKHNlbGVjdC5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKSk7XG4gICAgICAgIHBhcmVudHMucHVzaChub2RlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IFNlbGVjdGlvbihzdWJncm91cHMsIHBhcmVudHMpO1xufVxuIiwiaW1wb3J0IHtjaGlsZE1hdGNoZXJ9IGZyb20gXCIuLi9tYXRjaGVyLmpzXCI7XG5cbnZhciBmaW5kID0gQXJyYXkucHJvdG90eXBlLmZpbmQ7XG5cbmZ1bmN0aW9uIGNoaWxkRmluZChtYXRjaCkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGZpbmQuY2FsbCh0aGlzLmNoaWxkcmVuLCBtYXRjaCk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNoaWxkRmlyc3QoKSB7XG4gIHJldHVybiB0aGlzLmZpcnN0RWxlbWVudENoaWxkO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihtYXRjaCkge1xuICByZXR1cm4gdGhpcy5zZWxlY3QobWF0Y2ggPT0gbnVsbCA/IGNoaWxkRmlyc3RcbiAgICAgIDogY2hpbGRGaW5kKHR5cGVvZiBtYXRjaCA9PT0gXCJmdW5jdGlvblwiID8gbWF0Y2ggOiBjaGlsZE1hdGNoZXIobWF0Y2gpKSk7XG59XG4iLCJpbXBvcnQge2NoaWxkTWF0Y2hlcn0gZnJvbSBcIi4uL21hdGNoZXIuanNcIjtcblxudmFyIGZpbHRlciA9IEFycmF5LnByb3RvdHlwZS5maWx0ZXI7XG5cbmZ1bmN0aW9uIGNoaWxkcmVuKCkge1xuICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmNoaWxkcmVuKTtcbn1cblxuZnVuY3Rpb24gY2hpbGRyZW5GaWx0ZXIobWF0Y2gpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBmaWx0ZXIuY2FsbCh0aGlzLmNoaWxkcmVuLCBtYXRjaCk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG1hdGNoKSB7XG4gIHJldHVybiB0aGlzLnNlbGVjdEFsbChtYXRjaCA9PSBudWxsID8gY2hpbGRyZW5cbiAgICAgIDogY2hpbGRyZW5GaWx0ZXIodHlwZW9mIG1hdGNoID09PSBcImZ1bmN0aW9uXCIgPyBtYXRjaCA6IGNoaWxkTWF0Y2hlcihtYXRjaCkpKTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICBsZXQgc2l6ZSA9IDA7XG4gIGZvciAoY29uc3Qgbm9kZSBvZiB0aGlzKSArK3NpemU7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgcmV0dXJuIHNpemU7XG59XG4iLCJpbXBvcnQge1NlbGVjdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oY29tcGFyZSkge1xuICBpZiAoIWNvbXBhcmUpIGNvbXBhcmUgPSBhc2NlbmRpbmc7XG5cbiAgZnVuY3Rpb24gY29tcGFyZU5vZGUoYSwgYikge1xuICAgIHJldHVybiBhICYmIGIgPyBjb21wYXJlKGEuX19kYXRhX18sIGIuX19kYXRhX18pIDogIWEgLSAhYjtcbiAgfVxuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHNvcnRncm91cHMgPSBuZXcgQXJyYXkobSksIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIHNvcnRncm91cCA9IHNvcnRncm91cHNbal0gPSBuZXcgQXJyYXkobiksIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XG4gICAgICAgIHNvcnRncm91cFtpXSA9IG5vZGU7XG4gICAgICB9XG4gICAgfVxuICAgIHNvcnRncm91cC5zb3J0KGNvbXBhcmVOb2RlKTtcbiAgfVxuXG4gIHJldHVybiBuZXcgU2VsZWN0aW9uKHNvcnRncm91cHMsIHRoaXMuX3BhcmVudHMpLm9yZGVyKCk7XG59XG5cbmZ1bmN0aW9uIGFzY2VuZGluZyhhLCBiKSB7XG4gIHJldHVybiBhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogYSA+PSBiID8gMCA6IE5hTjtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHVwZGF0ZSkge1xuICByZXR1cm4gbmV3IEFycmF5KHVwZGF0ZS5sZW5ndGgpO1xufVxuIiwiaW1wb3J0IGRlZmF1bHRWaWV3IGZyb20gXCIuLi93aW5kb3cuanNcIjtcblxuZnVuY3Rpb24gc3R5bGVSZW1vdmUobmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gc3R5bGVDb25zdGFudChuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkobmFtZSwgdmFsdWUsIHByaW9yaXR5KTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gc3R5bGVGdW5jdGlvbihuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciB2ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBpZiAodiA9PSBudWxsKSB0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KG5hbWUpO1xuICAgIGVsc2UgdGhpcy5zdHlsZS5zZXRQcm9wZXJ0eShuYW1lLCB2LCBwcmlvcml0eSk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIHZhbHVlLCBwcmlvcml0eSkge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA+IDFcbiAgICAgID8gdGhpcy5lYWNoKCh2YWx1ZSA9PSBudWxsXG4gICAgICAgICAgICA/IHN0eWxlUmVtb3ZlIDogdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICAgID8gc3R5bGVGdW5jdGlvblxuICAgICAgICAgICAgOiBzdHlsZUNvbnN0YW50KShuYW1lLCB2YWx1ZSwgcHJpb3JpdHkgPT0gbnVsbCA/IFwiXCIgOiBwcmlvcml0eSkpXG4gICAgICA6IHN0eWxlVmFsdWUodGhpcy5ub2RlKCksIG5hbWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3R5bGVWYWx1ZShub2RlLCBuYW1lKSB7XG4gIHJldHVybiBub2RlLnN0eWxlLmdldFByb3BlcnR5VmFsdWUobmFtZSlcbiAgICAgIHx8IGRlZmF1bHRWaWV3KG5vZGUpLmdldENvbXB1dGVkU3R5bGUobm9kZSwgbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZShuYW1lKTtcbn1cbiIsImZ1bmN0aW9uIHRleHRSZW1vdmUoKSB7XG4gIHRoaXMudGV4dENvbnRlbnQgPSBcIlwiO1xufVxuXG5mdW5jdGlvbiB0ZXh0Q29uc3RhbnQodmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMudGV4dENvbnRlbnQgPSB2YWx1ZTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gdGV4dEZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgdGhpcy50ZXh0Q29udGVudCA9IHYgPT0gbnVsbCA/IFwiXCIgOiB2O1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aFxuICAgICAgPyB0aGlzLmVhY2godmFsdWUgPT0gbnVsbFxuICAgICAgICAgID8gdGV4dFJlbW92ZSA6ICh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgID8gdGV4dEZ1bmN0aW9uXG4gICAgICAgICAgOiB0ZXh0Q29uc3RhbnQpKHZhbHVlKSlcbiAgICAgIDogdGhpcy5ub2RlKCkudGV4dENvbnRlbnQ7XG59XG4iLCJmdW5jdGlvbiBub25lKCkge31cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc2VsZWN0b3IpIHtcbiAgcmV0dXJuIHNlbGVjdG9yID09IG51bGwgPyBub25lIDogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XG4gIH07XG59XG4iLCJmdW5jdGlvbiBlbXB0eSgpIHtcbiAgcmV0dXJuIFtdO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzZWxlY3Rvcikge1xuICByZXR1cm4gc2VsZWN0b3IgPT0gbnVsbCA/IGVtcHR5IDogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7XG4gIH07XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihldmVudCkge1xuICBsZXQgc291cmNlRXZlbnQ7XG4gIHdoaWxlIChzb3VyY2VFdmVudCA9IGV2ZW50LnNvdXJjZUV2ZW50KSBldmVudCA9IHNvdXJjZUV2ZW50O1xuICByZXR1cm4gZXZlbnQ7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihub2RlKSB7XG4gIHJldHVybiAobm9kZS5vd25lckRvY3VtZW50ICYmIG5vZGUub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldykgLy8gbm9kZSBpcyBhIE5vZGVcbiAgICAgIHx8IChub2RlLmRvY3VtZW50ICYmIG5vZGUpIC8vIG5vZGUgaXMgYSBXaW5kb3dcbiAgICAgIHx8IG5vZGUuZGVmYXVsdFZpZXc7IC8vIG5vZGUgaXMgYSBEb2N1bWVudFxufVxuIiwiaW1wb3J0IHtUaW1lcn0gZnJvbSBcIi4vdGltZXIuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oY2FsbGJhY2ssIGRlbGF5LCB0aW1lKSB7XG4gIHZhciB0ID0gbmV3IFRpbWVyO1xuICBkZWxheSA9IGRlbGF5ID09IG51bGwgPyAwIDogK2RlbGF5O1xuICB0LnJlc3RhcnQoZWxhcHNlZCA9PiB7XG4gICAgdC5zdG9wKCk7XG4gICAgY2FsbGJhY2soZWxhcHNlZCArIGRlbGF5KTtcbiAgfSwgZGVsYXksIHRpbWUpO1xuICByZXR1cm4gdDtcbn1cbiIsInZhciBmcmFtZSA9IDAsIC8vIGlzIGFuIGFuaW1hdGlvbiBmcmFtZSBwZW5kaW5nP1xuICAgIHRpbWVvdXQgPSAwLCAvLyBpcyBhIHRpbWVvdXQgcGVuZGluZz9cbiAgICBpbnRlcnZhbCA9IDAsIC8vIGFyZSBhbnkgdGltZXJzIGFjdGl2ZT9cbiAgICBwb2tlRGVsYXkgPSAxMDAwLCAvLyBob3cgZnJlcXVlbnRseSB3ZSBjaGVjayBmb3IgY2xvY2sgc2tld1xuICAgIHRhc2tIZWFkLFxuICAgIHRhc2tUYWlsLFxuICAgIGNsb2NrTGFzdCA9IDAsXG4gICAgY2xvY2tOb3cgPSAwLFxuICAgIGNsb2NrU2tldyA9IDAsXG4gICAgY2xvY2sgPSB0eXBlb2YgcGVyZm9ybWFuY2UgPT09IFwib2JqZWN0XCIgJiYgcGVyZm9ybWFuY2Uubm93ID8gcGVyZm9ybWFuY2UgOiBEYXRlLFxuICAgIHNldEZyYW1lID0gdHlwZW9mIHdpbmRvdyA9PT0gXCJvYmplY3RcIiAmJiB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lID8gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZS5iaW5kKHdpbmRvdykgOiBmdW5jdGlvbihmKSB7IHNldFRpbWVvdXQoZiwgMTcpOyB9O1xuXG5leHBvcnQgZnVuY3Rpb24gbm93KCkge1xuICByZXR1cm4gY2xvY2tOb3cgfHwgKHNldEZyYW1lKGNsZWFyTm93KSwgY2xvY2tOb3cgPSBjbG9jay5ub3coKSArIGNsb2NrU2tldyk7XG59XG5cbmZ1bmN0aW9uIGNsZWFyTm93KCkge1xuICBjbG9ja05vdyA9IDA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBUaW1lcigpIHtcbiAgdGhpcy5fY2FsbCA9XG4gIHRoaXMuX3RpbWUgPVxuICB0aGlzLl9uZXh0ID0gbnVsbDtcbn1cblxuVGltZXIucHJvdG90eXBlID0gdGltZXIucHJvdG90eXBlID0ge1xuICBjb25zdHJ1Y3RvcjogVGltZXIsXG4gIHJlc3RhcnQ6IGZ1bmN0aW9uKGNhbGxiYWNrLCBkZWxheSwgdGltZSkge1xuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcImNhbGxiYWNrIGlzIG5vdCBhIGZ1bmN0aW9uXCIpO1xuICAgIHRpbWUgPSAodGltZSA9PSBudWxsID8gbm93KCkgOiArdGltZSkgKyAoZGVsYXkgPT0gbnVsbCA/IDAgOiArZGVsYXkpO1xuICAgIGlmICghdGhpcy5fbmV4dCAmJiB0YXNrVGFpbCAhPT0gdGhpcykge1xuICAgICAgaWYgKHRhc2tUYWlsKSB0YXNrVGFpbC5fbmV4dCA9IHRoaXM7XG4gICAgICBlbHNlIHRhc2tIZWFkID0gdGhpcztcbiAgICAgIHRhc2tUYWlsID0gdGhpcztcbiAgICB9XG4gICAgdGhpcy5fY2FsbCA9IGNhbGxiYWNrO1xuICAgIHRoaXMuX3RpbWUgPSB0aW1lO1xuICAgIHNsZWVwKCk7XG4gIH0sXG4gIHN0b3A6IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLl9jYWxsKSB7XG4gICAgICB0aGlzLl9jYWxsID0gbnVsbDtcbiAgICAgIHRoaXMuX3RpbWUgPSBJbmZpbml0eTtcbiAgICAgIHNsZWVwKCk7XG4gICAgfVxuICB9XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gdGltZXIoY2FsbGJhY2ssIGRlbGF5LCB0aW1lKSB7XG4gIHZhciB0ID0gbmV3IFRpbWVyO1xuICB0LnJlc3RhcnQoY2FsbGJhY2ssIGRlbGF5LCB0aW1lKTtcbiAgcmV0dXJuIHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0aW1lckZsdXNoKCkge1xuICBub3coKTsgLy8gR2V0IHRoZSBjdXJyZW50IHRpbWUsIGlmIG5vdCBhbHJlYWR5IHNldC5cbiAgKytmcmFtZTsgLy8gUHJldGVuZCB3ZeKAmXZlIHNldCBhbiBhbGFybSwgaWYgd2UgaGF2ZW7igJl0IGFscmVhZHkuXG4gIHZhciB0ID0gdGFza0hlYWQsIGU7XG4gIHdoaWxlICh0KSB7XG4gICAgaWYgKChlID0gY2xvY2tOb3cgLSB0Ll90aW1lKSA+PSAwKSB0Ll9jYWxsLmNhbGwodW5kZWZpbmVkLCBlKTtcbiAgICB0ID0gdC5fbmV4dDtcbiAgfVxuICAtLWZyYW1lO1xufVxuXG5mdW5jdGlvbiB3YWtlKCkge1xuICBjbG9ja05vdyA9IChjbG9ja0xhc3QgPSBjbG9jay5ub3coKSkgKyBjbG9ja1NrZXc7XG4gIGZyYW1lID0gdGltZW91dCA9IDA7XG4gIHRyeSB7XG4gICAgdGltZXJGbHVzaCgpO1xuICB9IGZpbmFsbHkge1xuICAgIGZyYW1lID0gMDtcbiAgICBuYXAoKTtcbiAgICBjbG9ja05vdyA9IDA7XG4gIH1cbn1cblxuZnVuY3Rpb24gcG9rZSgpIHtcbiAgdmFyIG5vdyA9IGNsb2NrLm5vdygpLCBkZWxheSA9IG5vdyAtIGNsb2NrTGFzdDtcbiAgaWYgKGRlbGF5ID4gcG9rZURlbGF5KSBjbG9ja1NrZXcgLT0gZGVsYXksIGNsb2NrTGFzdCA9IG5vdztcbn1cblxuZnVuY3Rpb24gbmFwKCkge1xuICB2YXIgdDAsIHQxID0gdGFza0hlYWQsIHQyLCB0aW1lID0gSW5maW5pdHk7XG4gIHdoaWxlICh0MSkge1xuICAgIGlmICh0MS5fY2FsbCkge1xuICAgICAgaWYgKHRpbWUgPiB0MS5fdGltZSkgdGltZSA9IHQxLl90aW1lO1xuICAgICAgdDAgPSB0MSwgdDEgPSB0MS5fbmV4dDtcbiAgICB9IGVsc2Uge1xuICAgICAgdDIgPSB0MS5fbmV4dCwgdDEuX25leHQgPSBudWxsO1xuICAgICAgdDEgPSB0MCA/IHQwLl9uZXh0ID0gdDIgOiB0YXNrSGVhZCA9IHQyO1xuICAgIH1cbiAgfVxuICB0YXNrVGFpbCA9IHQwO1xuICBzbGVlcCh0aW1lKTtcbn1cblxuZnVuY3Rpb24gc2xlZXAodGltZSkge1xuICBpZiAoZnJhbWUpIHJldHVybjsgLy8gU29vbmVzdCBhbGFybSBhbHJlYWR5IHNldCwgb3Igd2lsbCBiZS5cbiAgaWYgKHRpbWVvdXQpIHRpbWVvdXQgPSBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gIHZhciBkZWxheSA9IHRpbWUgLSBjbG9ja05vdzsgLy8gU3RyaWN0bHkgbGVzcyB0aGFuIGlmIHdlIHJlY29tcHV0ZWQgY2xvY2tOb3cuXG4gIGlmIChkZWxheSA+IDI0KSB7XG4gICAgaWYgKHRpbWUgPCBJbmZpbml0eSkgdGltZW91dCA9IHNldFRpbWVvdXQod2FrZSwgdGltZSAtIGNsb2NrLm5vdygpIC0gY2xvY2tTa2V3KTtcbiAgICBpZiAoaW50ZXJ2YWwpIGludGVydmFsID0gY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7XG4gIH0gZWxzZSB7XG4gICAgaWYgKCFpbnRlcnZhbCkgY2xvY2tMYXN0ID0gY2xvY2subm93KCksIGludGVydmFsID0gc2V0SW50ZXJ2YWwocG9rZSwgcG9rZURlbGF5KTtcbiAgICBmcmFtZSA9IDEsIHNldEZyYW1lKHdha2UpO1xuICB9XG59XG4iLCJpbXBvcnQge1RyYW5zaXRpb259IGZyb20gXCIuL3RyYW5zaXRpb24vaW5kZXguanNcIjtcbmltcG9ydCB7U0NIRURVTEVEfSBmcm9tIFwiLi90cmFuc2l0aW9uL3NjaGVkdWxlLmpzXCI7XG5cbnZhciByb290ID0gW251bGxdO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihub2RlLCBuYW1lKSB7XG4gIHZhciBzY2hlZHVsZXMgPSBub2RlLl9fdHJhbnNpdGlvbixcbiAgICAgIHNjaGVkdWxlLFxuICAgICAgaTtcblxuICBpZiAoc2NoZWR1bGVzKSB7XG4gICAgbmFtZSA9IG5hbWUgPT0gbnVsbCA/IG51bGwgOiBuYW1lICsgXCJcIjtcbiAgICBmb3IgKGkgaW4gc2NoZWR1bGVzKSB7XG4gICAgICBpZiAoKHNjaGVkdWxlID0gc2NoZWR1bGVzW2ldKS5zdGF0ZSA+IFNDSEVEVUxFRCAmJiBzY2hlZHVsZS5uYW1lID09PSBuYW1lKSB7XG4gICAgICAgIHJldHVybiBuZXcgVHJhbnNpdGlvbihbW25vZGVdXSwgcm9vdCwgbmFtZSwgK2kpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuIiwiaW1wb3J0IFwiLi9zZWxlY3Rpb24vaW5kZXguanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyB0cmFuc2l0aW9ufSBmcm9tIFwiLi90cmFuc2l0aW9uL2luZGV4LmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgYWN0aXZlfSBmcm9tIFwiLi9hY3RpdmUuanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBpbnRlcnJ1cHR9IGZyb20gXCIuL2ludGVycnVwdC5qc1wiO1xuIiwiaW1wb3J0IHtTVEFSVElORywgRU5ESU5HLCBFTkRFRH0gZnJvbSBcIi4vdHJhbnNpdGlvbi9zY2hlZHVsZS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihub2RlLCBuYW1lKSB7XG4gIHZhciBzY2hlZHVsZXMgPSBub2RlLl9fdHJhbnNpdGlvbixcbiAgICAgIHNjaGVkdWxlLFxuICAgICAgYWN0aXZlLFxuICAgICAgZW1wdHkgPSB0cnVlLFxuICAgICAgaTtcblxuICBpZiAoIXNjaGVkdWxlcykgcmV0dXJuO1xuXG4gIG5hbWUgPSBuYW1lID09IG51bGwgPyBudWxsIDogbmFtZSArIFwiXCI7XG5cbiAgZm9yIChpIGluIHNjaGVkdWxlcykge1xuICAgIGlmICgoc2NoZWR1bGUgPSBzY2hlZHVsZXNbaV0pLm5hbWUgIT09IG5hbWUpIHsgZW1wdHkgPSBmYWxzZTsgY29udGludWU7IH1cbiAgICBhY3RpdmUgPSBzY2hlZHVsZS5zdGF0ZSA+IFNUQVJUSU5HICYmIHNjaGVkdWxlLnN0YXRlIDwgRU5ESU5HO1xuICAgIHNjaGVkdWxlLnN0YXRlID0gRU5ERUQ7XG4gICAgc2NoZWR1bGUudGltZXIuc3RvcCgpO1xuICAgIHNjaGVkdWxlLm9uLmNhbGwoYWN0aXZlID8gXCJpbnRlcnJ1cHRcIiA6IFwiY2FuY2VsXCIsIG5vZGUsIG5vZGUuX19kYXRhX18sIHNjaGVkdWxlLmluZGV4LCBzY2hlZHVsZS5ncm91cCk7XG4gICAgZGVsZXRlIHNjaGVkdWxlc1tpXTtcbiAgfVxuXG4gIGlmIChlbXB0eSkgZGVsZXRlIG5vZGUuX190cmFuc2l0aW9uO1xufVxuIiwiaW1wb3J0IHtzZWxlY3Rpb259IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcbmltcG9ydCBzZWxlY3Rpb25faW50ZXJydXB0IGZyb20gXCIuL2ludGVycnVwdC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl90cmFuc2l0aW9uIGZyb20gXCIuL3RyYW5zaXRpb24uanNcIjtcblxuc2VsZWN0aW9uLnByb3RvdHlwZS5pbnRlcnJ1cHQgPSBzZWxlY3Rpb25faW50ZXJydXB0O1xuc2VsZWN0aW9uLnByb3RvdHlwZS50cmFuc2l0aW9uID0gc2VsZWN0aW9uX3RyYW5zaXRpb247XG4iLCJpbXBvcnQgaW50ZXJydXB0IGZyb20gXCIuLi9pbnRlcnJ1cHQuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSkge1xuICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkge1xuICAgIGludGVycnVwdCh0aGlzLCBuYW1lKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQge1RyYW5zaXRpb24sIG5ld0lkfSBmcm9tIFwiLi4vdHJhbnNpdGlvbi9pbmRleC5qc1wiO1xuaW1wb3J0IHNjaGVkdWxlIGZyb20gXCIuLi90cmFuc2l0aW9uL3NjaGVkdWxlLmpzXCI7XG5pbXBvcnQge2Vhc2VDdWJpY0luT3V0fSBmcm9tIFwiZDMtZWFzZVwiO1xuaW1wb3J0IHtub3d9IGZyb20gXCJkMy10aW1lclwiO1xuXG52YXIgZGVmYXVsdFRpbWluZyA9IHtcbiAgdGltZTogbnVsbCwgLy8gU2V0IG9uIHVzZS5cbiAgZGVsYXk6IDAsXG4gIGR1cmF0aW9uOiAyNTAsXG4gIGVhc2U6IGVhc2VDdWJpY0luT3V0XG59O1xuXG5mdW5jdGlvbiBpbmhlcml0KG5vZGUsIGlkKSB7XG4gIHZhciB0aW1pbmc7XG4gIHdoaWxlICghKHRpbWluZyA9IG5vZGUuX190cmFuc2l0aW9uKSB8fCAhKHRpbWluZyA9IHRpbWluZ1tpZF0pKSB7XG4gICAgaWYgKCEobm9kZSA9IG5vZGUucGFyZW50Tm9kZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgdHJhbnNpdGlvbiAke2lkfSBub3QgZm91bmRgKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRpbWluZztcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSkge1xuICB2YXIgaWQsXG4gICAgICB0aW1pbmc7XG5cbiAgaWYgKG5hbWUgaW5zdGFuY2VvZiBUcmFuc2l0aW9uKSB7XG4gICAgaWQgPSBuYW1lLl9pZCwgbmFtZSA9IG5hbWUuX25hbWU7XG4gIH0gZWxzZSB7XG4gICAgaWQgPSBuZXdJZCgpLCAodGltaW5nID0gZGVmYXVsdFRpbWluZykudGltZSA9IG5vdygpLCBuYW1lID0gbmFtZSA9PSBudWxsID8gbnVsbCA6IG5hbWUgKyBcIlwiO1xuICB9XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHtcbiAgICAgICAgc2NoZWR1bGUobm9kZSwgbmFtZSwgaWQsIGksIGdyb3VwLCB0aW1pbmcgfHwgaW5oZXJpdChub2RlLCBpZCkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgVHJhbnNpdGlvbihncm91cHMsIHRoaXMuX3BhcmVudHMsIG5hbWUsIGlkKTtcbn1cbiIsImltcG9ydCB7aW50ZXJwb2xhdGVUcmFuc2Zvcm1TdmcgYXMgaW50ZXJwb2xhdGVUcmFuc2Zvcm19IGZyb20gXCJkMy1pbnRlcnBvbGF0ZVwiO1xuaW1wb3J0IHtuYW1lc3BhY2V9IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcbmltcG9ydCB7dHdlZW5WYWx1ZX0gZnJvbSBcIi4vdHdlZW4uanNcIjtcbmltcG9ydCBpbnRlcnBvbGF0ZSBmcm9tIFwiLi9pbnRlcnBvbGF0ZS5qc1wiO1xuXG5mdW5jdGlvbiBhdHRyUmVtb3ZlKG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRyUmVtb3ZlTlMoZnVsbG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0ckNvbnN0YW50KG5hbWUsIGludGVycG9sYXRlLCB2YWx1ZTEpIHtcbiAgdmFyIHN0cmluZzAwLFxuICAgICAgc3RyaW5nMSA9IHZhbHVlMSArIFwiXCIsXG4gICAgICBpbnRlcnBvbGF0ZTA7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc3RyaW5nMCA9IHRoaXMuZ2V0QXR0cmlidXRlKG5hbWUpO1xuICAgIHJldHVybiBzdHJpbmcwID09PSBzdHJpbmcxID8gbnVsbFxuICAgICAgICA6IHN0cmluZzAgPT09IHN0cmluZzAwID8gaW50ZXJwb2xhdGUwXG4gICAgICAgIDogaW50ZXJwb2xhdGUwID0gaW50ZXJwb2xhdGUoc3RyaW5nMDAgPSBzdHJpbmcwLCB2YWx1ZTEpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRyQ29uc3RhbnROUyhmdWxsbmFtZSwgaW50ZXJwb2xhdGUsIHZhbHVlMSkge1xuICB2YXIgc3RyaW5nMDAsXG4gICAgICBzdHJpbmcxID0gdmFsdWUxICsgXCJcIixcbiAgICAgIGludGVycG9sYXRlMDtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzdHJpbmcwID0gdGhpcy5nZXRBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwpO1xuICAgIHJldHVybiBzdHJpbmcwID09PSBzdHJpbmcxID8gbnVsbFxuICAgICAgICA6IHN0cmluZzAgPT09IHN0cmluZzAwID8gaW50ZXJwb2xhdGUwXG4gICAgICAgIDogaW50ZXJwb2xhdGUwID0gaW50ZXJwb2xhdGUoc3RyaW5nMDAgPSBzdHJpbmcwLCB2YWx1ZTEpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRyRnVuY3Rpb24obmFtZSwgaW50ZXJwb2xhdGUsIHZhbHVlKSB7XG4gIHZhciBzdHJpbmcwMCxcbiAgICAgIHN0cmluZzEwLFxuICAgICAgaW50ZXJwb2xhdGUwO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHN0cmluZzAsIHZhbHVlMSA9IHZhbHVlKHRoaXMpLCBzdHJpbmcxO1xuICAgIGlmICh2YWx1ZTEgPT0gbnVsbCkgcmV0dXJuIHZvaWQgdGhpcy5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gICAgc3RyaW5nMCA9IHRoaXMuZ2V0QXR0cmlidXRlKG5hbWUpO1xuICAgIHN0cmluZzEgPSB2YWx1ZTEgKyBcIlwiO1xuICAgIHJldHVybiBzdHJpbmcwID09PSBzdHJpbmcxID8gbnVsbFxuICAgICAgICA6IHN0cmluZzAgPT09IHN0cmluZzAwICYmIHN0cmluZzEgPT09IHN0cmluZzEwID8gaW50ZXJwb2xhdGUwXG4gICAgICAgIDogKHN0cmluZzEwID0gc3RyaW5nMSwgaW50ZXJwb2xhdGUwID0gaW50ZXJwb2xhdGUoc3RyaW5nMDAgPSBzdHJpbmcwLCB2YWx1ZTEpKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0ckZ1bmN0aW9uTlMoZnVsbG5hbWUsIGludGVycG9sYXRlLCB2YWx1ZSkge1xuICB2YXIgc3RyaW5nMDAsXG4gICAgICBzdHJpbmcxMCxcbiAgICAgIGludGVycG9sYXRlMDtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzdHJpbmcwLCB2YWx1ZTEgPSB2YWx1ZSh0aGlzKSwgc3RyaW5nMTtcbiAgICBpZiAodmFsdWUxID09IG51bGwpIHJldHVybiB2b2lkIHRoaXMucmVtb3ZlQXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTtcbiAgICBzdHJpbmcwID0gdGhpcy5nZXRBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwpO1xuICAgIHN0cmluZzEgPSB2YWx1ZTEgKyBcIlwiO1xuICAgIHJldHVybiBzdHJpbmcwID09PSBzdHJpbmcxID8gbnVsbFxuICAgICAgICA6IHN0cmluZzAgPT09IHN0cmluZzAwICYmIHN0cmluZzEgPT09IHN0cmluZzEwID8gaW50ZXJwb2xhdGUwXG4gICAgICAgIDogKHN0cmluZzEwID0gc3RyaW5nMSwgaW50ZXJwb2xhdGUwID0gaW50ZXJwb2xhdGUoc3RyaW5nMDAgPSBzdHJpbmcwLCB2YWx1ZTEpKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgdmFyIGZ1bGxuYW1lID0gbmFtZXNwYWNlKG5hbWUpLCBpID0gZnVsbG5hbWUgPT09IFwidHJhbnNmb3JtXCIgPyBpbnRlcnBvbGF0ZVRyYW5zZm9ybSA6IGludGVycG9sYXRlO1xuICByZXR1cm4gdGhpcy5hdHRyVHdlZW4obmFtZSwgdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgID8gKGZ1bGxuYW1lLmxvY2FsID8gYXR0ckZ1bmN0aW9uTlMgOiBhdHRyRnVuY3Rpb24pKGZ1bGxuYW1lLCBpLCB0d2VlblZhbHVlKHRoaXMsIFwiYXR0ci5cIiArIG5hbWUsIHZhbHVlKSlcbiAgICAgIDogdmFsdWUgPT0gbnVsbCA/IChmdWxsbmFtZS5sb2NhbCA/IGF0dHJSZW1vdmVOUyA6IGF0dHJSZW1vdmUpKGZ1bGxuYW1lKVxuICAgICAgOiAoZnVsbG5hbWUubG9jYWwgPyBhdHRyQ29uc3RhbnROUyA6IGF0dHJDb25zdGFudCkoZnVsbG5hbWUsIGksIHZhbHVlKSk7XG59XG4iLCJpbXBvcnQge25hbWVzcGFjZX0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuXG5mdW5jdGlvbiBhdHRySW50ZXJwb2xhdGUobmFtZSwgaSkge1xuICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgIHRoaXMuc2V0QXR0cmlidXRlKG5hbWUsIGkuY2FsbCh0aGlzLCB0KSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJJbnRlcnBvbGF0ZU5TKGZ1bGxuYW1lLCBpKSB7XG4gIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwsIGkuY2FsbCh0aGlzLCB0KSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJUd2Vlbk5TKGZ1bGxuYW1lLCB2YWx1ZSkge1xuICB2YXIgdDAsIGkwO1xuICBmdW5jdGlvbiB0d2VlbigpIHtcbiAgICB2YXIgaSA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKGkgIT09IGkwKSB0MCA9IChpMCA9IGkpICYmIGF0dHJJbnRlcnBvbGF0ZU5TKGZ1bGxuYW1lLCBpKTtcbiAgICByZXR1cm4gdDA7XG4gIH1cbiAgdHdlZW4uX3ZhbHVlID0gdmFsdWU7XG4gIHJldHVybiB0d2Vlbjtcbn1cblxuZnVuY3Rpb24gYXR0clR3ZWVuKG5hbWUsIHZhbHVlKSB7XG4gIHZhciB0MCwgaTA7XG4gIGZ1bmN0aW9uIHR3ZWVuKCkge1xuICAgIHZhciBpID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBpZiAoaSAhPT0gaTApIHQwID0gKGkwID0gaSkgJiYgYXR0ckludGVycG9sYXRlKG5hbWUsIGkpO1xuICAgIHJldHVybiB0MDtcbiAgfVxuICB0d2Vlbi5fdmFsdWUgPSB2YWx1ZTtcbiAgcmV0dXJuIHR3ZWVuO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICB2YXIga2V5ID0gXCJhdHRyLlwiICsgbmFtZTtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSByZXR1cm4gKGtleSA9IHRoaXMudHdlZW4oa2V5KSkgJiYga2V5Ll92YWx1ZTtcbiAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiB0aGlzLnR3ZWVuKGtleSwgbnVsbCk7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IEVycm9yO1xuICB2YXIgZnVsbG5hbWUgPSBuYW1lc3BhY2UobmFtZSk7XG4gIHJldHVybiB0aGlzLnR3ZWVuKGtleSwgKGZ1bGxuYW1lLmxvY2FsID8gYXR0clR3ZWVuTlMgOiBhdHRyVHdlZW4pKGZ1bGxuYW1lLCB2YWx1ZSkpO1xufVxuIiwiaW1wb3J0IHtnZXQsIGluaXR9IGZyb20gXCIuL3NjaGVkdWxlLmpzXCI7XG5cbmZ1bmN0aW9uIGRlbGF5RnVuY3Rpb24oaWQsIHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICBpbml0KHRoaXMsIGlkKS5kZWxheSA9ICt2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBkZWxheUNvbnN0YW50KGlkLCB2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgPSArdmFsdWUsIGZ1bmN0aW9uKCkge1xuICAgIGluaXQodGhpcywgaWQpLmRlbGF5ID0gdmFsdWU7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHZhciBpZCA9IHRoaXMuX2lkO1xuXG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoXG4gICAgICA/IHRoaXMuZWFjaCgodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICA/IGRlbGF5RnVuY3Rpb25cbiAgICAgICAgICA6IGRlbGF5Q29uc3RhbnQpKGlkLCB2YWx1ZSkpXG4gICAgICA6IGdldCh0aGlzLm5vZGUoKSwgaWQpLmRlbGF5O1xufVxuIiwiaW1wb3J0IHtnZXQsIHNldH0gZnJvbSBcIi4vc2NoZWR1bGUuanNcIjtcblxuZnVuY3Rpb24gZHVyYXRpb25GdW5jdGlvbihpZCwgdmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHNldCh0aGlzLCBpZCkuZHVyYXRpb24gPSArdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gZHVyYXRpb25Db25zdGFudChpZCwgdmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID0gK3ZhbHVlLCBmdW5jdGlvbigpIHtcbiAgICBzZXQodGhpcywgaWQpLmR1cmF0aW9uID0gdmFsdWU7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHZhciBpZCA9IHRoaXMuX2lkO1xuXG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoXG4gICAgICA/IHRoaXMuZWFjaCgodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICA/IGR1cmF0aW9uRnVuY3Rpb25cbiAgICAgICAgICA6IGR1cmF0aW9uQ29uc3RhbnQpKGlkLCB2YWx1ZSkpXG4gICAgICA6IGdldCh0aGlzLm5vZGUoKSwgaWQpLmR1cmF0aW9uO1xufVxuIiwiaW1wb3J0IHtnZXQsIHNldH0gZnJvbSBcIi4vc2NoZWR1bGUuanNcIjtcblxuZnVuY3Rpb24gZWFzZUNvbnN0YW50KGlkLCB2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBFcnJvcjtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHNldCh0aGlzLCBpZCkuZWFzZSA9IHZhbHVlO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZSkge1xuICB2YXIgaWQgPSB0aGlzLl9pZDtcblxuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aFxuICAgICAgPyB0aGlzLmVhY2goZWFzZUNvbnN0YW50KGlkLCB2YWx1ZSkpXG4gICAgICA6IGdldCh0aGlzLm5vZGUoKSwgaWQpLmVhc2U7XG59XG4iLCJpbXBvcnQge3NldH0gZnJvbSBcIi4vc2NoZWR1bGUuanNcIjtcblxuZnVuY3Rpb24gZWFzZVZhcnlpbmcoaWQsIHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKHR5cGVvZiB2ICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBFcnJvcjtcbiAgICBzZXQodGhpcywgaWQpLmVhc2UgPSB2O1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBFcnJvcjtcbiAgcmV0dXJuIHRoaXMuZWFjaChlYXNlVmFyeWluZyh0aGlzLl9pZCwgdmFsdWUpKTtcbn1cbiIsImltcG9ydCB7c2V0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgdmFyIG9uMCwgb24xLCB0aGF0ID0gdGhpcywgaWQgPSB0aGF0Ll9pZCwgc2l6ZSA9IHRoYXQuc2l6ZSgpO1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgdmFyIGNhbmNlbCA9IHt2YWx1ZTogcmVqZWN0fSxcbiAgICAgICAgZW5kID0ge3ZhbHVlOiBmdW5jdGlvbigpIHsgaWYgKC0tc2l6ZSA9PT0gMCkgcmVzb2x2ZSgpOyB9fTtcblxuICAgIHRoYXQuZWFjaChmdW5jdGlvbigpIHtcbiAgICAgIHZhciBzY2hlZHVsZSA9IHNldCh0aGlzLCBpZCksXG4gICAgICAgICAgb24gPSBzY2hlZHVsZS5vbjtcblxuICAgICAgLy8gSWYgdGhpcyBub2RlIHNoYXJlZCBhIGRpc3BhdGNoIHdpdGggdGhlIHByZXZpb3VzIG5vZGUsXG4gICAgICAvLyBqdXN0IGFzc2lnbiB0aGUgdXBkYXRlZCBzaGFyZWQgZGlzcGF0Y2ggYW5kIHdl4oCZcmUgZG9uZSFcbiAgICAgIC8vIE90aGVyd2lzZSwgY29weS1vbi13cml0ZS5cbiAgICAgIGlmIChvbiAhPT0gb24wKSB7XG4gICAgICAgIG9uMSA9IChvbjAgPSBvbikuY29weSgpO1xuICAgICAgICBvbjEuXy5jYW5jZWwucHVzaChjYW5jZWwpO1xuICAgICAgICBvbjEuXy5pbnRlcnJ1cHQucHVzaChjYW5jZWwpO1xuICAgICAgICBvbjEuXy5lbmQucHVzaChlbmQpO1xuICAgICAgfVxuXG4gICAgICBzY2hlZHVsZS5vbiA9IG9uMTtcbiAgICB9KTtcblxuICAgIC8vIFRoZSBzZWxlY3Rpb24gd2FzIGVtcHR5LCByZXNvbHZlIGVuZCBpbW1lZGlhdGVseVxuICAgIGlmIChzaXplID09PSAwKSByZXNvbHZlKCk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IHttYXRjaGVyfSBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5pbXBvcnQge1RyYW5zaXRpb259IGZyb20gXCIuL2luZGV4LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG1hdGNoKSB7XG4gIGlmICh0eXBlb2YgbWF0Y2ggIT09IFwiZnVuY3Rpb25cIikgbWF0Y2ggPSBtYXRjaGVyKG1hdGNoKTtcblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBzdWJncm91cHMgPSBuZXcgQXJyYXkobSksIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIHN1Ymdyb3VwID0gc3ViZ3JvdXBzW2pdID0gW10sIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAoKG5vZGUgPSBncm91cFtpXSkgJiYgbWF0Y2guY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCkpIHtcbiAgICAgICAgc3ViZ3JvdXAucHVzaChub2RlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IFRyYW5zaXRpb24oc3ViZ3JvdXBzLCB0aGlzLl9wYXJlbnRzLCB0aGlzLl9uYW1lLCB0aGlzLl9pZCk7XG59XG4iLCJpbXBvcnQge3NlbGVjdGlvbn0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuaW1wb3J0IHRyYW5zaXRpb25fYXR0ciBmcm9tIFwiLi9hdHRyLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9hdHRyVHdlZW4gZnJvbSBcIi4vYXR0clR3ZWVuLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9kZWxheSBmcm9tIFwiLi9kZWxheS5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fZHVyYXRpb24gZnJvbSBcIi4vZHVyYXRpb24uanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX2Vhc2UgZnJvbSBcIi4vZWFzZS5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fZWFzZVZhcnlpbmcgZnJvbSBcIi4vZWFzZVZhcnlpbmcuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX2ZpbHRlciBmcm9tIFwiLi9maWx0ZXIuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX21lcmdlIGZyb20gXCIuL21lcmdlLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9vbiBmcm9tIFwiLi9vbi5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fcmVtb3ZlIGZyb20gXCIuL3JlbW92ZS5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fc2VsZWN0IGZyb20gXCIuL3NlbGVjdC5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fc2VsZWN0QWxsIGZyb20gXCIuL3NlbGVjdEFsbC5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fc2VsZWN0aW9uIGZyb20gXCIuL3NlbGVjdGlvbi5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fc3R5bGUgZnJvbSBcIi4vc3R5bGUuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX3N0eWxlVHdlZW4gZnJvbSBcIi4vc3R5bGVUd2Vlbi5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fdGV4dCBmcm9tIFwiLi90ZXh0LmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl90ZXh0VHdlZW4gZnJvbSBcIi4vdGV4dFR3ZWVuLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl90cmFuc2l0aW9uIGZyb20gXCIuL3RyYW5zaXRpb24uanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX3R3ZWVuIGZyb20gXCIuL3R3ZWVuLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9lbmQgZnJvbSBcIi4vZW5kLmpzXCI7XG5cbnZhciBpZCA9IDA7XG5cbmV4cG9ydCBmdW5jdGlvbiBUcmFuc2l0aW9uKGdyb3VwcywgcGFyZW50cywgbmFtZSwgaWQpIHtcbiAgdGhpcy5fZ3JvdXBzID0gZ3JvdXBzO1xuICB0aGlzLl9wYXJlbnRzID0gcGFyZW50cztcbiAgdGhpcy5fbmFtZSA9IG5hbWU7XG4gIHRoaXMuX2lkID0gaWQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRyYW5zaXRpb24obmFtZSkge1xuICByZXR1cm4gc2VsZWN0aW9uKCkudHJhbnNpdGlvbihuYW1lKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5ld0lkKCkge1xuICByZXR1cm4gKytpZDtcbn1cblxudmFyIHNlbGVjdGlvbl9wcm90b3R5cGUgPSBzZWxlY3Rpb24ucHJvdG90eXBlO1xuXG5UcmFuc2l0aW9uLnByb3RvdHlwZSA9IHRyYW5zaXRpb24ucHJvdG90eXBlID0ge1xuICBjb25zdHJ1Y3RvcjogVHJhbnNpdGlvbixcbiAgc2VsZWN0OiB0cmFuc2l0aW9uX3NlbGVjdCxcbiAgc2VsZWN0QWxsOiB0cmFuc2l0aW9uX3NlbGVjdEFsbCxcbiAgc2VsZWN0Q2hpbGQ6IHNlbGVjdGlvbl9wcm90b3R5cGUuc2VsZWN0Q2hpbGQsXG4gIHNlbGVjdENoaWxkcmVuOiBzZWxlY3Rpb25fcHJvdG90eXBlLnNlbGVjdENoaWxkcmVuLFxuICBmaWx0ZXI6IHRyYW5zaXRpb25fZmlsdGVyLFxuICBtZXJnZTogdHJhbnNpdGlvbl9tZXJnZSxcbiAgc2VsZWN0aW9uOiB0cmFuc2l0aW9uX3NlbGVjdGlvbixcbiAgdHJhbnNpdGlvbjogdHJhbnNpdGlvbl90cmFuc2l0aW9uLFxuICBjYWxsOiBzZWxlY3Rpb25fcHJvdG90eXBlLmNhbGwsXG4gIG5vZGVzOiBzZWxlY3Rpb25fcHJvdG90eXBlLm5vZGVzLFxuICBub2RlOiBzZWxlY3Rpb25fcHJvdG90eXBlLm5vZGUsXG4gIHNpemU6IHNlbGVjdGlvbl9wcm90b3R5cGUuc2l6ZSxcbiAgZW1wdHk6IHNlbGVjdGlvbl9wcm90b3R5cGUuZW1wdHksXG4gIGVhY2g6IHNlbGVjdGlvbl9wcm90b3R5cGUuZWFjaCxcbiAgb246IHRyYW5zaXRpb25fb24sXG4gIGF0dHI6IHRyYW5zaXRpb25fYXR0cixcbiAgYXR0clR3ZWVuOiB0cmFuc2l0aW9uX2F0dHJUd2VlbixcbiAgc3R5bGU6IHRyYW5zaXRpb25fc3R5bGUsXG4gIHN0eWxlVHdlZW46IHRyYW5zaXRpb25fc3R5bGVUd2VlbixcbiAgdGV4dDogdHJhbnNpdGlvbl90ZXh0LFxuICB0ZXh0VHdlZW46IHRyYW5zaXRpb25fdGV4dFR3ZWVuLFxuICByZW1vdmU6IHRyYW5zaXRpb25fcmVtb3ZlLFxuICB0d2VlbjogdHJhbnNpdGlvbl90d2VlbixcbiAgZGVsYXk6IHRyYW5zaXRpb25fZGVsYXksXG4gIGR1cmF0aW9uOiB0cmFuc2l0aW9uX2R1cmF0aW9uLFxuICBlYXNlOiB0cmFuc2l0aW9uX2Vhc2UsXG4gIGVhc2VWYXJ5aW5nOiB0cmFuc2l0aW9uX2Vhc2VWYXJ5aW5nLFxuICBlbmQ6IHRyYW5zaXRpb25fZW5kLFxuICBbU3ltYm9sLml0ZXJhdG9yXTogc2VsZWN0aW9uX3Byb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdXG59O1xuIiwiaW1wb3J0IHtjb2xvcn0gZnJvbSBcImQzLWNvbG9yXCI7XG5pbXBvcnQge2ludGVycG9sYXRlTnVtYmVyLCBpbnRlcnBvbGF0ZVJnYiwgaW50ZXJwb2xhdGVTdHJpbmd9IGZyb20gXCJkMy1pbnRlcnBvbGF0ZVwiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihhLCBiKSB7XG4gIHZhciBjO1xuICByZXR1cm4gKHR5cGVvZiBiID09PSBcIm51bWJlclwiID8gaW50ZXJwb2xhdGVOdW1iZXJcbiAgICAgIDogYiBpbnN0YW5jZW9mIGNvbG9yID8gaW50ZXJwb2xhdGVSZ2JcbiAgICAgIDogKGMgPSBjb2xvcihiKSkgPyAoYiA9IGMsIGludGVycG9sYXRlUmdiKVxuICAgICAgOiBpbnRlcnBvbGF0ZVN0cmluZykoYSwgYik7XG59XG4iLCJpbXBvcnQge1RyYW5zaXRpb259IGZyb20gXCIuL2luZGV4LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHRyYW5zaXRpb24pIHtcbiAgaWYgKHRyYW5zaXRpb24uX2lkICE9PSB0aGlzLl9pZCkgdGhyb3cgbmV3IEVycm9yO1xuXG4gIGZvciAodmFyIGdyb3VwczAgPSB0aGlzLl9ncm91cHMsIGdyb3VwczEgPSB0cmFuc2l0aW9uLl9ncm91cHMsIG0wID0gZ3JvdXBzMC5sZW5ndGgsIG0xID0gZ3JvdXBzMS5sZW5ndGgsIG0gPSBNYXRoLm1pbihtMCwgbTEpLCBtZXJnZXMgPSBuZXcgQXJyYXkobTApLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwMCA9IGdyb3VwczBbal0sIGdyb3VwMSA9IGdyb3VwczFbal0sIG4gPSBncm91cDAubGVuZ3RoLCBtZXJnZSA9IG1lcmdlc1tqXSA9IG5ldyBBcnJheShuKSwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmIChub2RlID0gZ3JvdXAwW2ldIHx8IGdyb3VwMVtpXSkge1xuICAgICAgICBtZXJnZVtpXSA9IG5vZGU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZm9yICg7IGogPCBtMDsgKytqKSB7XG4gICAgbWVyZ2VzW2pdID0gZ3JvdXBzMFtqXTtcbiAgfVxuXG4gIHJldHVybiBuZXcgVHJhbnNpdGlvbihtZXJnZXMsIHRoaXMuX3BhcmVudHMsIHRoaXMuX25hbWUsIHRoaXMuX2lkKTtcbn1cbiIsImltcG9ydCB7Z2V0LCBzZXQsIGluaXR9IGZyb20gXCIuL3NjaGVkdWxlLmpzXCI7XG5cbmZ1bmN0aW9uIHN0YXJ0KG5hbWUpIHtcbiAgcmV0dXJuIChuYW1lICsgXCJcIikudHJpbSgpLnNwbGl0KC9efFxccysvKS5ldmVyeShmdW5jdGlvbih0KSB7XG4gICAgdmFyIGkgPSB0LmluZGV4T2YoXCIuXCIpO1xuICAgIGlmIChpID49IDApIHQgPSB0LnNsaWNlKDAsIGkpO1xuICAgIHJldHVybiAhdCB8fCB0ID09PSBcInN0YXJ0XCI7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBvbkZ1bmN0aW9uKGlkLCBuYW1lLCBsaXN0ZW5lcikge1xuICB2YXIgb24wLCBvbjEsIHNpdCA9IHN0YXJ0KG5hbWUpID8gaW5pdCA6IHNldDtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzY2hlZHVsZSA9IHNpdCh0aGlzLCBpZCksXG4gICAgICAgIG9uID0gc2NoZWR1bGUub247XG5cbiAgICAvLyBJZiB0aGlzIG5vZGUgc2hhcmVkIGEgZGlzcGF0Y2ggd2l0aCB0aGUgcHJldmlvdXMgbm9kZSxcbiAgICAvLyBqdXN0IGFzc2lnbiB0aGUgdXBkYXRlZCBzaGFyZWQgZGlzcGF0Y2ggYW5kIHdl4oCZcmUgZG9uZSFcbiAgICAvLyBPdGhlcndpc2UsIGNvcHktb24td3JpdGUuXG4gICAgaWYgKG9uICE9PSBvbjApIChvbjEgPSAob24wID0gb24pLmNvcHkoKSkub24obmFtZSwgbGlzdGVuZXIpO1xuXG4gICAgc2NoZWR1bGUub24gPSBvbjE7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIGxpc3RlbmVyKSB7XG4gIHZhciBpZCA9IHRoaXMuX2lkO1xuXG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoIDwgMlxuICAgICAgPyBnZXQodGhpcy5ub2RlKCksIGlkKS5vbi5vbihuYW1lKVxuICAgICAgOiB0aGlzLmVhY2gob25GdW5jdGlvbihpZCwgbmFtZSwgbGlzdGVuZXIpKTtcbn1cbiIsImZ1bmN0aW9uIHJlbW92ZUZ1bmN0aW9uKGlkKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgcGFyZW50ID0gdGhpcy5wYXJlbnROb2RlO1xuICAgIGZvciAodmFyIGkgaW4gdGhpcy5fX3RyYW5zaXRpb24pIGlmICgraSAhPT0gaWQpIHJldHVybjtcbiAgICBpZiAocGFyZW50KSBwYXJlbnQucmVtb3ZlQ2hpbGQodGhpcyk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5vbihcImVuZC5yZW1vdmVcIiwgcmVtb3ZlRnVuY3Rpb24odGhpcy5faWQpKTtcbn1cbiIsImltcG9ydCB7ZGlzcGF0Y2h9IGZyb20gXCJkMy1kaXNwYXRjaFwiO1xuaW1wb3J0IHt0aW1lciwgdGltZW91dH0gZnJvbSBcImQzLXRpbWVyXCI7XG5cbnZhciBlbXB0eU9uID0gZGlzcGF0Y2goXCJzdGFydFwiLCBcImVuZFwiLCBcImNhbmNlbFwiLCBcImludGVycnVwdFwiKTtcbnZhciBlbXB0eVR3ZWVuID0gW107XG5cbmV4cG9ydCB2YXIgQ1JFQVRFRCA9IDA7XG5leHBvcnQgdmFyIFNDSEVEVUxFRCA9IDE7XG5leHBvcnQgdmFyIFNUQVJUSU5HID0gMjtcbmV4cG9ydCB2YXIgU1RBUlRFRCA9IDM7XG5leHBvcnQgdmFyIFJVTk5JTkcgPSA0O1xuZXhwb3J0IHZhciBFTkRJTkcgPSA1O1xuZXhwb3J0IHZhciBFTkRFRCA9IDY7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5vZGUsIG5hbWUsIGlkLCBpbmRleCwgZ3JvdXAsIHRpbWluZykge1xuICB2YXIgc2NoZWR1bGVzID0gbm9kZS5fX3RyYW5zaXRpb247XG4gIGlmICghc2NoZWR1bGVzKSBub2RlLl9fdHJhbnNpdGlvbiA9IHt9O1xuICBlbHNlIGlmIChpZCBpbiBzY2hlZHVsZXMpIHJldHVybjtcbiAgY3JlYXRlKG5vZGUsIGlkLCB7XG4gICAgbmFtZTogbmFtZSxcbiAgICBpbmRleDogaW5kZXgsIC8vIEZvciBjb250ZXh0IGR1cmluZyBjYWxsYmFjay5cbiAgICBncm91cDogZ3JvdXAsIC8vIEZvciBjb250ZXh0IGR1cmluZyBjYWxsYmFjay5cbiAgICBvbjogZW1wdHlPbixcbiAgICB0d2VlbjogZW1wdHlUd2VlbixcbiAgICB0aW1lOiB0aW1pbmcudGltZSxcbiAgICBkZWxheTogdGltaW5nLmRlbGF5LFxuICAgIGR1cmF0aW9uOiB0aW1pbmcuZHVyYXRpb24sXG4gICAgZWFzZTogdGltaW5nLmVhc2UsXG4gICAgdGltZXI6IG51bGwsXG4gICAgc3RhdGU6IENSRUFURURcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbml0KG5vZGUsIGlkKSB7XG4gIHZhciBzY2hlZHVsZSA9IGdldChub2RlLCBpZCk7XG4gIGlmIChzY2hlZHVsZS5zdGF0ZSA+IENSRUFURUQpIHRocm93IG5ldyBFcnJvcihcInRvbyBsYXRlOyBhbHJlYWR5IHNjaGVkdWxlZFwiKTtcbiAgcmV0dXJuIHNjaGVkdWxlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0KG5vZGUsIGlkKSB7XG4gIHZhciBzY2hlZHVsZSA9IGdldChub2RlLCBpZCk7XG4gIGlmIChzY2hlZHVsZS5zdGF0ZSA+IFNUQVJURUQpIHRocm93IG5ldyBFcnJvcihcInRvbyBsYXRlOyBhbHJlYWR5IHJ1bm5pbmdcIik7XG4gIHJldHVybiBzY2hlZHVsZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldChub2RlLCBpZCkge1xuICB2YXIgc2NoZWR1bGUgPSBub2RlLl9fdHJhbnNpdGlvbjtcbiAgaWYgKCFzY2hlZHVsZSB8fCAhKHNjaGVkdWxlID0gc2NoZWR1bGVbaWRdKSkgdGhyb3cgbmV3IEVycm9yKFwidHJhbnNpdGlvbiBub3QgZm91bmRcIik7XG4gIHJldHVybiBzY2hlZHVsZTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlKG5vZGUsIGlkLCBzZWxmKSB7XG4gIHZhciBzY2hlZHVsZXMgPSBub2RlLl9fdHJhbnNpdGlvbixcbiAgICAgIHR3ZWVuO1xuXG4gIC8vIEluaXRpYWxpemUgdGhlIHNlbGYgdGltZXIgd2hlbiB0aGUgdHJhbnNpdGlvbiBpcyBjcmVhdGVkLlxuICAvLyBOb3RlIHRoZSBhY3R1YWwgZGVsYXkgaXMgbm90IGtub3duIHVudGlsIHRoZSBmaXJzdCBjYWxsYmFjayFcbiAgc2NoZWR1bGVzW2lkXSA9IHNlbGY7XG4gIHNlbGYudGltZXIgPSB0aW1lcihzY2hlZHVsZSwgMCwgc2VsZi50aW1lKTtcblxuICBmdW5jdGlvbiBzY2hlZHVsZShlbGFwc2VkKSB7XG4gICAgc2VsZi5zdGF0ZSA9IFNDSEVEVUxFRDtcbiAgICBzZWxmLnRpbWVyLnJlc3RhcnQoc3RhcnQsIHNlbGYuZGVsYXksIHNlbGYudGltZSk7XG5cbiAgICAvLyBJZiB0aGUgZWxhcHNlZCBkZWxheSBpcyBsZXNzIHRoYW4gb3VyIGZpcnN0IHNsZWVwLCBzdGFydCBpbW1lZGlhdGVseS5cbiAgICBpZiAoc2VsZi5kZWxheSA8PSBlbGFwc2VkKSBzdGFydChlbGFwc2VkIC0gc2VsZi5kZWxheSk7XG4gIH1cblxuICBmdW5jdGlvbiBzdGFydChlbGFwc2VkKSB7XG4gICAgdmFyIGksIGosIG4sIG87XG5cbiAgICAvLyBJZiB0aGUgc3RhdGUgaXMgbm90IFNDSEVEVUxFRCwgdGhlbiB3ZSBwcmV2aW91c2x5IGVycm9yZWQgb24gc3RhcnQuXG4gICAgaWYgKHNlbGYuc3RhdGUgIT09IFNDSEVEVUxFRCkgcmV0dXJuIHN0b3AoKTtcblxuICAgIGZvciAoaSBpbiBzY2hlZHVsZXMpIHtcbiAgICAgIG8gPSBzY2hlZHVsZXNbaV07XG4gICAgICBpZiAoby5uYW1lICE9PSBzZWxmLm5hbWUpIGNvbnRpbnVlO1xuXG4gICAgICAvLyBXaGlsZSB0aGlzIGVsZW1lbnQgYWxyZWFkeSBoYXMgYSBzdGFydGluZyB0cmFuc2l0aW9uIGR1cmluZyB0aGlzIGZyYW1lLFxuICAgICAgLy8gZGVmZXIgc3RhcnRpbmcgYW4gaW50ZXJydXB0aW5nIHRyYW5zaXRpb24gdW50aWwgdGhhdCB0cmFuc2l0aW9uIGhhcyBhXG4gICAgICAvLyBjaGFuY2UgdG8gdGljayAoYW5kIHBvc3NpYmx5IGVuZCk7IHNlZSBkMy9kMy10cmFuc2l0aW9uIzU0IVxuICAgICAgaWYgKG8uc3RhdGUgPT09IFNUQVJURUQpIHJldHVybiB0aW1lb3V0KHN0YXJ0KTtcblxuICAgICAgLy8gSW50ZXJydXB0IHRoZSBhY3RpdmUgdHJhbnNpdGlvbiwgaWYgYW55LlxuICAgICAgaWYgKG8uc3RhdGUgPT09IFJVTk5JTkcpIHtcbiAgICAgICAgby5zdGF0ZSA9IEVOREVEO1xuICAgICAgICBvLnRpbWVyLnN0b3AoKTtcbiAgICAgICAgby5vbi5jYWxsKFwiaW50ZXJydXB0XCIsIG5vZGUsIG5vZGUuX19kYXRhX18sIG8uaW5kZXgsIG8uZ3JvdXApO1xuICAgICAgICBkZWxldGUgc2NoZWR1bGVzW2ldO1xuICAgICAgfVxuXG4gICAgICAvLyBDYW5jZWwgYW55IHByZS1lbXB0ZWQgdHJhbnNpdGlvbnMuXG4gICAgICBlbHNlIGlmICgraSA8IGlkKSB7XG4gICAgICAgIG8uc3RhdGUgPSBFTkRFRDtcbiAgICAgICAgby50aW1lci5zdG9wKCk7XG4gICAgICAgIG8ub24uY2FsbChcImNhbmNlbFwiLCBub2RlLCBub2RlLl9fZGF0YV9fLCBvLmluZGV4LCBvLmdyb3VwKTtcbiAgICAgICAgZGVsZXRlIHNjaGVkdWxlc1tpXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBEZWZlciB0aGUgZmlyc3QgdGljayB0byBlbmQgb2YgdGhlIGN1cnJlbnQgZnJhbWU7IHNlZSBkMy9kMyMxNTc2LlxuICAgIC8vIE5vdGUgdGhlIHRyYW5zaXRpb24gbWF5IGJlIGNhbmNlbGVkIGFmdGVyIHN0YXJ0IGFuZCBiZWZvcmUgdGhlIGZpcnN0IHRpY2shXG4gICAgLy8gTm90ZSB0aGlzIG11c3QgYmUgc2NoZWR1bGVkIGJlZm9yZSB0aGUgc3RhcnQgZXZlbnQ7IHNlZSBkMy9kMy10cmFuc2l0aW9uIzE2IVxuICAgIC8vIEFzc3VtaW5nIHRoaXMgaXMgc3VjY2Vzc2Z1bCwgc3Vic2VxdWVudCBjYWxsYmFja3MgZ28gc3RyYWlnaHQgdG8gdGljay5cbiAgICB0aW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKHNlbGYuc3RhdGUgPT09IFNUQVJURUQpIHtcbiAgICAgICAgc2VsZi5zdGF0ZSA9IFJVTk5JTkc7XG4gICAgICAgIHNlbGYudGltZXIucmVzdGFydCh0aWNrLCBzZWxmLmRlbGF5LCBzZWxmLnRpbWUpO1xuICAgICAgICB0aWNrKGVsYXBzZWQpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gRGlzcGF0Y2ggdGhlIHN0YXJ0IGV2ZW50LlxuICAgIC8vIE5vdGUgdGhpcyBtdXN0IGJlIGRvbmUgYmVmb3JlIHRoZSB0d2VlbiBhcmUgaW5pdGlhbGl6ZWQuXG4gICAgc2VsZi5zdGF0ZSA9IFNUQVJUSU5HO1xuICAgIHNlbGYub24uY2FsbChcInN0YXJ0XCIsIG5vZGUsIG5vZGUuX19kYXRhX18sIHNlbGYuaW5kZXgsIHNlbGYuZ3JvdXApO1xuICAgIGlmIChzZWxmLnN0YXRlICE9PSBTVEFSVElORykgcmV0dXJuOyAvLyBpbnRlcnJ1cHRlZFxuICAgIHNlbGYuc3RhdGUgPSBTVEFSVEVEO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSB0aGUgdHdlZW4sIGRlbGV0aW5nIG51bGwgdHdlZW4uXG4gICAgdHdlZW4gPSBuZXcgQXJyYXkobiA9IHNlbGYudHdlZW4ubGVuZ3RoKTtcbiAgICBmb3IgKGkgPSAwLCBqID0gLTE7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmIChvID0gc2VsZi50d2VlbltpXS52YWx1ZS5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIHNlbGYuaW5kZXgsIHNlbGYuZ3JvdXApKSB7XG4gICAgICAgIHR3ZWVuWysral0gPSBvO1xuICAgICAgfVxuICAgIH1cbiAgICB0d2Vlbi5sZW5ndGggPSBqICsgMTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRpY2soZWxhcHNlZCkge1xuICAgIHZhciB0ID0gZWxhcHNlZCA8IHNlbGYuZHVyYXRpb24gPyBzZWxmLmVhc2UuY2FsbChudWxsLCBlbGFwc2VkIC8gc2VsZi5kdXJhdGlvbikgOiAoc2VsZi50aW1lci5yZXN0YXJ0KHN0b3ApLCBzZWxmLnN0YXRlID0gRU5ESU5HLCAxKSxcbiAgICAgICAgaSA9IC0xLFxuICAgICAgICBuID0gdHdlZW4ubGVuZ3RoO1xuXG4gICAgd2hpbGUgKCsraSA8IG4pIHtcbiAgICAgIHR3ZWVuW2ldLmNhbGwobm9kZSwgdCk7XG4gICAgfVxuXG4gICAgLy8gRGlzcGF0Y2ggdGhlIGVuZCBldmVudC5cbiAgICBpZiAoc2VsZi5zdGF0ZSA9PT0gRU5ESU5HKSB7XG4gICAgICBzZWxmLm9uLmNhbGwoXCJlbmRcIiwgbm9kZSwgbm9kZS5fX2RhdGFfXywgc2VsZi5pbmRleCwgc2VsZi5ncm91cCk7XG4gICAgICBzdG9wKCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gc3RvcCgpIHtcbiAgICBzZWxmLnN0YXRlID0gRU5ERUQ7XG4gICAgc2VsZi50aW1lci5zdG9wKCk7XG4gICAgZGVsZXRlIHNjaGVkdWxlc1tpZF07XG4gICAgZm9yICh2YXIgaSBpbiBzY2hlZHVsZXMpIHJldHVybjsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgIGRlbGV0ZSBub2RlLl9fdHJhbnNpdGlvbjtcbiAgfVxufVxuIiwiaW1wb3J0IHtzZWxlY3Rvcn0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuaW1wb3J0IHtUcmFuc2l0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuaW1wb3J0IHNjaGVkdWxlLCB7Z2V0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzZWxlY3QpIHtcbiAgdmFyIG5hbWUgPSB0aGlzLl9uYW1lLFxuICAgICAgaWQgPSB0aGlzLl9pZDtcblxuICBpZiAodHlwZW9mIHNlbGVjdCAhPT0gXCJmdW5jdGlvblwiKSBzZWxlY3QgPSBzZWxlY3RvcihzZWxlY3QpO1xuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHN1Ymdyb3VwcyA9IG5ldyBBcnJheShtKSwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgc3ViZ3JvdXAgPSBzdWJncm91cHNbal0gPSBuZXcgQXJyYXkobiksIG5vZGUsIHN1Ym5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAoKG5vZGUgPSBncm91cFtpXSkgJiYgKHN1Ym5vZGUgPSBzZWxlY3QuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCkpKSB7XG4gICAgICAgIGlmIChcIl9fZGF0YV9fXCIgaW4gbm9kZSkgc3Vibm9kZS5fX2RhdGFfXyA9IG5vZGUuX19kYXRhX187XG4gICAgICAgIHN1Ymdyb3VwW2ldID0gc3Vibm9kZTtcbiAgICAgICAgc2NoZWR1bGUoc3ViZ3JvdXBbaV0sIG5hbWUsIGlkLCBpLCBzdWJncm91cCwgZ2V0KG5vZGUsIGlkKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uKHN1Ymdyb3VwcywgdGhpcy5fcGFyZW50cywgbmFtZSwgaWQpO1xufVxuIiwiaW1wb3J0IHtzZWxlY3RvckFsbH0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuaW1wb3J0IHtUcmFuc2l0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuaW1wb3J0IHNjaGVkdWxlLCB7Z2V0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzZWxlY3QpIHtcbiAgdmFyIG5hbWUgPSB0aGlzLl9uYW1lLFxuICAgICAgaWQgPSB0aGlzLl9pZDtcblxuICBpZiAodHlwZW9mIHNlbGVjdCAhPT0gXCJmdW5jdGlvblwiKSBzZWxlY3QgPSBzZWxlY3RvckFsbChzZWxlY3QpO1xuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHN1Ymdyb3VwcyA9IFtdLCBwYXJlbnRzID0gW10sIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XG4gICAgICAgIGZvciAodmFyIGNoaWxkcmVuID0gc2VsZWN0LmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApLCBjaGlsZCwgaW5oZXJpdCA9IGdldChub2RlLCBpZCksIGsgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBrIDwgbDsgKytrKSB7XG4gICAgICAgICAgaWYgKGNoaWxkID0gY2hpbGRyZW5ba10pIHtcbiAgICAgICAgICAgIHNjaGVkdWxlKGNoaWxkLCBuYW1lLCBpZCwgaywgY2hpbGRyZW4sIGluaGVyaXQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzdWJncm91cHMucHVzaChjaGlsZHJlbik7XG4gICAgICAgIHBhcmVudHMucHVzaChub2RlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IFRyYW5zaXRpb24oc3ViZ3JvdXBzLCBwYXJlbnRzLCBuYW1lLCBpZCk7XG59XG4iLCJpbXBvcnQge3NlbGVjdGlvbn0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuXG52YXIgU2VsZWN0aW9uID0gc2VsZWN0aW9uLnByb3RvdHlwZS5jb25zdHJ1Y3RvcjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgU2VsZWN0aW9uKHRoaXMuX2dyb3VwcywgdGhpcy5fcGFyZW50cyk7XG59XG4iLCJpbXBvcnQge2ludGVycG9sYXRlVHJhbnNmb3JtQ3NzIGFzIGludGVycG9sYXRlVHJhbnNmb3JtfSBmcm9tIFwiZDMtaW50ZXJwb2xhdGVcIjtcbmltcG9ydCB7c3R5bGV9IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcbmltcG9ydCB7c2V0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuaW1wb3J0IHt0d2VlblZhbHVlfSBmcm9tIFwiLi90d2Vlbi5qc1wiO1xuaW1wb3J0IGludGVycG9sYXRlIGZyb20gXCIuL2ludGVycG9sYXRlLmpzXCI7XG5cbmZ1bmN0aW9uIHN0eWxlTnVsbChuYW1lLCBpbnRlcnBvbGF0ZSkge1xuICB2YXIgc3RyaW5nMDAsXG4gICAgICBzdHJpbmcxMCxcbiAgICAgIGludGVycG9sYXRlMDtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzdHJpbmcwID0gc3R5bGUodGhpcywgbmFtZSksXG4gICAgICAgIHN0cmluZzEgPSAodGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKSwgc3R5bGUodGhpcywgbmFtZSkpO1xuICAgIHJldHVybiBzdHJpbmcwID09PSBzdHJpbmcxID8gbnVsbFxuICAgICAgICA6IHN0cmluZzAgPT09IHN0cmluZzAwICYmIHN0cmluZzEgPT09IHN0cmluZzEwID8gaW50ZXJwb2xhdGUwXG4gICAgICAgIDogaW50ZXJwb2xhdGUwID0gaW50ZXJwb2xhdGUoc3RyaW5nMDAgPSBzdHJpbmcwLCBzdHJpbmcxMCA9IHN0cmluZzEpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBzdHlsZVJlbW92ZShuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KG5hbWUpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBzdHlsZUNvbnN0YW50KG5hbWUsIGludGVycG9sYXRlLCB2YWx1ZTEpIHtcbiAgdmFyIHN0cmluZzAwLFxuICAgICAgc3RyaW5nMSA9IHZhbHVlMSArIFwiXCIsXG4gICAgICBpbnRlcnBvbGF0ZTA7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc3RyaW5nMCA9IHN0eWxlKHRoaXMsIG5hbWUpO1xuICAgIHJldHVybiBzdHJpbmcwID09PSBzdHJpbmcxID8gbnVsbFxuICAgICAgICA6IHN0cmluZzAgPT09IHN0cmluZzAwID8gaW50ZXJwb2xhdGUwXG4gICAgICAgIDogaW50ZXJwb2xhdGUwID0gaW50ZXJwb2xhdGUoc3RyaW5nMDAgPSBzdHJpbmcwLCB2YWx1ZTEpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBzdHlsZUZ1bmN0aW9uKG5hbWUsIGludGVycG9sYXRlLCB2YWx1ZSkge1xuICB2YXIgc3RyaW5nMDAsXG4gICAgICBzdHJpbmcxMCxcbiAgICAgIGludGVycG9sYXRlMDtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzdHJpbmcwID0gc3R5bGUodGhpcywgbmFtZSksXG4gICAgICAgIHZhbHVlMSA9IHZhbHVlKHRoaXMpLFxuICAgICAgICBzdHJpbmcxID0gdmFsdWUxICsgXCJcIjtcbiAgICBpZiAodmFsdWUxID09IG51bGwpIHN0cmluZzEgPSB2YWx1ZTEgPSAodGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKSwgc3R5bGUodGhpcywgbmFtZSkpO1xuICAgIHJldHVybiBzdHJpbmcwID09PSBzdHJpbmcxID8gbnVsbFxuICAgICAgICA6IHN0cmluZzAgPT09IHN0cmluZzAwICYmIHN0cmluZzEgPT09IHN0cmluZzEwID8gaW50ZXJwb2xhdGUwXG4gICAgICAgIDogKHN0cmluZzEwID0gc3RyaW5nMSwgaW50ZXJwb2xhdGUwID0gaW50ZXJwb2xhdGUoc3RyaW5nMDAgPSBzdHJpbmcwLCB2YWx1ZTEpKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gc3R5bGVNYXliZVJlbW92ZShpZCwgbmFtZSkge1xuICB2YXIgb24wLCBvbjEsIGxpc3RlbmVyMCwga2V5ID0gXCJzdHlsZS5cIiArIG5hbWUsIGV2ZW50ID0gXCJlbmQuXCIgKyBrZXksIHJlbW92ZTtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzY2hlZHVsZSA9IHNldCh0aGlzLCBpZCksXG4gICAgICAgIG9uID0gc2NoZWR1bGUub24sXG4gICAgICAgIGxpc3RlbmVyID0gc2NoZWR1bGUudmFsdWVba2V5XSA9PSBudWxsID8gcmVtb3ZlIHx8IChyZW1vdmUgPSBzdHlsZVJlbW92ZShuYW1lKSkgOiB1bmRlZmluZWQ7XG5cbiAgICAvLyBJZiB0aGlzIG5vZGUgc2hhcmVkIGEgZGlzcGF0Y2ggd2l0aCB0aGUgcHJldmlvdXMgbm9kZSxcbiAgICAvLyBqdXN0IGFzc2lnbiB0aGUgdXBkYXRlZCBzaGFyZWQgZGlzcGF0Y2ggYW5kIHdl4oCZcmUgZG9uZSFcbiAgICAvLyBPdGhlcndpc2UsIGNvcHktb24td3JpdGUuXG4gICAgaWYgKG9uICE9PSBvbjAgfHwgbGlzdGVuZXIwICE9PSBsaXN0ZW5lcikgKG9uMSA9IChvbjAgPSBvbikuY29weSgpKS5vbihldmVudCwgbGlzdGVuZXIwID0gbGlzdGVuZXIpO1xuXG4gICAgc2NoZWR1bGUub24gPSBvbjE7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIHZhbHVlLCBwcmlvcml0eSkge1xuICB2YXIgaSA9IChuYW1lICs9IFwiXCIpID09PSBcInRyYW5zZm9ybVwiID8gaW50ZXJwb2xhdGVUcmFuc2Zvcm0gOiBpbnRlcnBvbGF0ZTtcbiAgcmV0dXJuIHZhbHVlID09IG51bGwgPyB0aGlzXG4gICAgICAuc3R5bGVUd2VlbihuYW1lLCBzdHlsZU51bGwobmFtZSwgaSkpXG4gICAgICAub24oXCJlbmQuc3R5bGUuXCIgKyBuYW1lLCBzdHlsZVJlbW92ZShuYW1lKSlcbiAgICA6IHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiID8gdGhpc1xuICAgICAgLnN0eWxlVHdlZW4obmFtZSwgc3R5bGVGdW5jdGlvbihuYW1lLCBpLCB0d2VlblZhbHVlKHRoaXMsIFwic3R5bGUuXCIgKyBuYW1lLCB2YWx1ZSkpKVxuICAgICAgLmVhY2goc3R5bGVNYXliZVJlbW92ZSh0aGlzLl9pZCwgbmFtZSkpXG4gICAgOiB0aGlzXG4gICAgICAuc3R5bGVUd2VlbihuYW1lLCBzdHlsZUNvbnN0YW50KG5hbWUsIGksIHZhbHVlKSwgcHJpb3JpdHkpXG4gICAgICAub24oXCJlbmQuc3R5bGUuXCIgKyBuYW1lLCBudWxsKTtcbn1cbiIsImZ1bmN0aW9uIHN0eWxlSW50ZXJwb2xhdGUobmFtZSwgaSwgcHJpb3JpdHkpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICB0aGlzLnN0eWxlLnNldFByb3BlcnR5KG5hbWUsIGkuY2FsbCh0aGlzLCB0KSwgcHJpb3JpdHkpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBzdHlsZVR3ZWVuKG5hbWUsIHZhbHVlLCBwcmlvcml0eSkge1xuICB2YXIgdCwgaTA7XG4gIGZ1bmN0aW9uIHR3ZWVuKCkge1xuICAgIHZhciBpID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBpZiAoaSAhPT0gaTApIHQgPSAoaTAgPSBpKSAmJiBzdHlsZUludGVycG9sYXRlKG5hbWUsIGksIHByaW9yaXR5KTtcbiAgICByZXR1cm4gdDtcbiAgfVxuICB0d2Vlbi5fdmFsdWUgPSB2YWx1ZTtcbiAgcmV0dXJuIHR3ZWVuO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHtcbiAgdmFyIGtleSA9IFwic3R5bGUuXCIgKyAobmFtZSArPSBcIlwiKTtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSByZXR1cm4gKGtleSA9IHRoaXMudHdlZW4oa2V5KSkgJiYga2V5Ll92YWx1ZTtcbiAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiB0aGlzLnR3ZWVuKGtleSwgbnVsbCk7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IEVycm9yO1xuICByZXR1cm4gdGhpcy50d2VlbihrZXksIHN0eWxlVHdlZW4obmFtZSwgdmFsdWUsIHByaW9yaXR5ID09IG51bGwgPyBcIlwiIDogcHJpb3JpdHkpKTtcbn1cbiIsImltcG9ydCB7dHdlZW5WYWx1ZX0gZnJvbSBcIi4vdHdlZW4uanNcIjtcblxuZnVuY3Rpb24gdGV4dENvbnN0YW50KHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnRleHRDb250ZW50ID0gdmFsdWU7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHRleHRGdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHZhbHVlMSA9IHZhbHVlKHRoaXMpO1xuICAgIHRoaXMudGV4dENvbnRlbnQgPSB2YWx1ZTEgPT0gbnVsbCA/IFwiXCIgOiB2YWx1ZTE7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiB0aGlzLnR3ZWVuKFwidGV4dFwiLCB0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgPyB0ZXh0RnVuY3Rpb24odHdlZW5WYWx1ZSh0aGlzLCBcInRleHRcIiwgdmFsdWUpKVxuICAgICAgOiB0ZXh0Q29uc3RhbnQodmFsdWUgPT0gbnVsbCA/IFwiXCIgOiB2YWx1ZSArIFwiXCIpKTtcbn1cbiIsImZ1bmN0aW9uIHRleHRJbnRlcnBvbGF0ZShpKSB7XG4gIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgdGhpcy50ZXh0Q29udGVudCA9IGkuY2FsbCh0aGlzLCB0KTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gdGV4dFR3ZWVuKHZhbHVlKSB7XG4gIHZhciB0MCwgaTA7XG4gIGZ1bmN0aW9uIHR3ZWVuKCkge1xuICAgIHZhciBpID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBpZiAoaSAhPT0gaTApIHQwID0gKGkwID0gaSkgJiYgdGV4dEludGVycG9sYXRlKGkpO1xuICAgIHJldHVybiB0MDtcbiAgfVxuICB0d2Vlbi5fdmFsdWUgPSB2YWx1ZTtcbiAgcmV0dXJuIHR3ZWVuO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZSkge1xuICB2YXIga2V5ID0gXCJ0ZXh0XCI7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMSkgcmV0dXJuIChrZXkgPSB0aGlzLnR3ZWVuKGtleSkpICYmIGtleS5fdmFsdWU7XG4gIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gdGhpcy50d2VlbihrZXksIG51bGwpO1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBFcnJvcjtcbiAgcmV0dXJuIHRoaXMudHdlZW4oa2V5LCB0ZXh0VHdlZW4odmFsdWUpKTtcbn1cbiIsImltcG9ydCB7VHJhbnNpdGlvbiwgbmV3SWR9IGZyb20gXCIuL2luZGV4LmpzXCI7XG5pbXBvcnQgc2NoZWR1bGUsIHtnZXR9IGZyb20gXCIuL3NjaGVkdWxlLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICB2YXIgbmFtZSA9IHRoaXMuX25hbWUsXG4gICAgICBpZDAgPSB0aGlzLl9pZCxcbiAgICAgIGlkMSA9IG5ld0lkKCk7XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHtcbiAgICAgICAgdmFyIGluaGVyaXQgPSBnZXQobm9kZSwgaWQwKTtcbiAgICAgICAgc2NoZWR1bGUobm9kZSwgbmFtZSwgaWQxLCBpLCBncm91cCwge1xuICAgICAgICAgIHRpbWU6IGluaGVyaXQudGltZSArIGluaGVyaXQuZGVsYXkgKyBpbmhlcml0LmR1cmF0aW9uLFxuICAgICAgICAgIGRlbGF5OiAwLFxuICAgICAgICAgIGR1cmF0aW9uOiBpbmhlcml0LmR1cmF0aW9uLFxuICAgICAgICAgIGVhc2U6IGluaGVyaXQuZWFzZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IFRyYW5zaXRpb24oZ3JvdXBzLCB0aGlzLl9wYXJlbnRzLCBuYW1lLCBpZDEpO1xufVxuIiwiaW1wb3J0IHtnZXQsIHNldH0gZnJvbSBcIi4vc2NoZWR1bGUuanNcIjtcblxuZnVuY3Rpb24gdHdlZW5SZW1vdmUoaWQsIG5hbWUpIHtcbiAgdmFyIHR3ZWVuMCwgdHdlZW4xO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHNjaGVkdWxlID0gc2V0KHRoaXMsIGlkKSxcbiAgICAgICAgdHdlZW4gPSBzY2hlZHVsZS50d2VlbjtcblxuICAgIC8vIElmIHRoaXMgbm9kZSBzaGFyZWQgdHdlZW4gd2l0aCB0aGUgcHJldmlvdXMgbm9kZSxcbiAgICAvLyBqdXN0IGFzc2lnbiB0aGUgdXBkYXRlZCBzaGFyZWQgdHdlZW4gYW5kIHdl4oCZcmUgZG9uZSFcbiAgICAvLyBPdGhlcndpc2UsIGNvcHktb24td3JpdGUuXG4gICAgaWYgKHR3ZWVuICE9PSB0d2VlbjApIHtcbiAgICAgIHR3ZWVuMSA9IHR3ZWVuMCA9IHR3ZWVuO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIG4gPSB0d2VlbjEubGVuZ3RoOyBpIDwgbjsgKytpKSB7XG4gICAgICAgIGlmICh0d2VlbjFbaV0ubmFtZSA9PT0gbmFtZSkge1xuICAgICAgICAgIHR3ZWVuMSA9IHR3ZWVuMS5zbGljZSgpO1xuICAgICAgICAgIHR3ZWVuMS5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBzY2hlZHVsZS50d2VlbiA9IHR3ZWVuMTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gdHdlZW5GdW5jdGlvbihpZCwgbmFtZSwgdmFsdWUpIHtcbiAgdmFyIHR3ZWVuMCwgdHdlZW4xO1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBFcnJvcjtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzY2hlZHVsZSA9IHNldCh0aGlzLCBpZCksXG4gICAgICAgIHR3ZWVuID0gc2NoZWR1bGUudHdlZW47XG5cbiAgICAvLyBJZiB0aGlzIG5vZGUgc2hhcmVkIHR3ZWVuIHdpdGggdGhlIHByZXZpb3VzIG5vZGUsXG4gICAgLy8ganVzdCBhc3NpZ24gdGhlIHVwZGF0ZWQgc2hhcmVkIHR3ZWVuIGFuZCB3ZeKAmXJlIGRvbmUhXG4gICAgLy8gT3RoZXJ3aXNlLCBjb3B5LW9uLXdyaXRlLlxuICAgIGlmICh0d2VlbiAhPT0gdHdlZW4wKSB7XG4gICAgICB0d2VlbjEgPSAodHdlZW4wID0gdHdlZW4pLnNsaWNlKCk7XG4gICAgICBmb3IgKHZhciB0ID0ge25hbWU6IG5hbWUsIHZhbHVlOiB2YWx1ZX0sIGkgPSAwLCBuID0gdHdlZW4xLmxlbmd0aDsgaSA8IG47ICsraSkge1xuICAgICAgICBpZiAodHdlZW4xW2ldLm5hbWUgPT09IG5hbWUpIHtcbiAgICAgICAgICB0d2VlbjFbaV0gPSB0O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoaSA9PT0gbikgdHdlZW4xLnB1c2godCk7XG4gICAgfVxuXG4gICAgc2NoZWR1bGUudHdlZW4gPSB0d2VlbjE7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gIHZhciBpZCA9IHRoaXMuX2lkO1xuXG4gIG5hbWUgKz0gXCJcIjtcblxuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHtcbiAgICB2YXIgdHdlZW4gPSBnZXQodGhpcy5ub2RlKCksIGlkKS50d2VlbjtcbiAgICBmb3IgKHZhciBpID0gMCwgbiA9IHR3ZWVuLmxlbmd0aCwgdDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKCh0ID0gdHdlZW5baV0pLm5hbWUgPT09IG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHQudmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIHRoaXMuZWFjaCgodmFsdWUgPT0gbnVsbCA/IHR3ZWVuUmVtb3ZlIDogdHdlZW5GdW5jdGlvbikoaWQsIG5hbWUsIHZhbHVlKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0d2VlblZhbHVlKHRyYW5zaXRpb24sIG5hbWUsIHZhbHVlKSB7XG4gIHZhciBpZCA9IHRyYW5zaXRpb24uX2lkO1xuXG4gIHRyYW5zaXRpb24uZWFjaChmdW5jdGlvbigpIHtcbiAgICB2YXIgc2NoZWR1bGUgPSBzZXQodGhpcywgaWQpO1xuICAgIChzY2hlZHVsZS52YWx1ZSB8fCAoc2NoZWR1bGUudmFsdWUgPSB7fSkpW25hbWVdID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfSk7XG5cbiAgcmV0dXJuIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICByZXR1cm4gZ2V0KG5vZGUsIGlkKS52YWx1ZVtuYW1lXTtcbiAgfTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IHggPT4gKCkgPT4geDtcbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIFpvb21FdmVudCh0eXBlLCB7XG4gIHNvdXJjZUV2ZW50LFxuICB0YXJnZXQsXG4gIHRyYW5zZm9ybSxcbiAgZGlzcGF0Y2hcbn0pIHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGhpcywge1xuICAgIHR5cGU6IHt2YWx1ZTogdHlwZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlfSxcbiAgICBzb3VyY2VFdmVudDoge3ZhbHVlOiBzb3VyY2VFdmVudCwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlfSxcbiAgICB0YXJnZXQ6IHt2YWx1ZTogdGFyZ2V0LCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWV9LFxuICAgIHRyYW5zZm9ybToge3ZhbHVlOiB0cmFuc2Zvcm0sIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZX0sXG4gICAgXzoge3ZhbHVlOiBkaXNwYXRjaH1cbiAgfSk7XG59XG4iLCJleHBvcnQge2RlZmF1bHQgYXMgem9vbX0gZnJvbSBcIi4vem9vbS5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIHpvb21UcmFuc2Zvcm0sIGlkZW50aXR5IGFzIHpvb21JZGVudGl0eSwgVHJhbnNmb3JtIGFzIFpvb21UcmFuc2Zvcm19IGZyb20gXCIuL3RyYW5zZm9ybS5qc1wiO1xuIiwiZXhwb3J0IGZ1bmN0aW9uIG5vcHJvcGFnYXRpb24oZXZlbnQpIHtcbiAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGV2ZW50KSB7XG4gIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIFRyYW5zZm9ybShrLCB4LCB5KSB7XG4gIHRoaXMuayA9IGs7XG4gIHRoaXMueCA9IHg7XG4gIHRoaXMueSA9IHk7XG59XG5cblRyYW5zZm9ybS5wcm90b3R5cGUgPSB7XG4gIGNvbnN0cnVjdG9yOiBUcmFuc2Zvcm0sXG4gIHNjYWxlOiBmdW5jdGlvbihrKSB7XG4gICAgcmV0dXJuIGsgPT09IDEgPyB0aGlzIDogbmV3IFRyYW5zZm9ybSh0aGlzLmsgKiBrLCB0aGlzLngsIHRoaXMueSk7XG4gIH0sXG4gIHRyYW5zbGF0ZTogZnVuY3Rpb24oeCwgeSkge1xuICAgIHJldHVybiB4ID09PSAwICYgeSA9PT0gMCA/IHRoaXMgOiBuZXcgVHJhbnNmb3JtKHRoaXMuaywgdGhpcy54ICsgdGhpcy5rICogeCwgdGhpcy55ICsgdGhpcy5rICogeSk7XG4gIH0sXG4gIGFwcGx5OiBmdW5jdGlvbihwb2ludCkge1xuICAgIHJldHVybiBbcG9pbnRbMF0gKiB0aGlzLmsgKyB0aGlzLngsIHBvaW50WzFdICogdGhpcy5rICsgdGhpcy55XTtcbiAgfSxcbiAgYXBwbHlYOiBmdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuIHggKiB0aGlzLmsgKyB0aGlzLng7XG4gIH0sXG4gIGFwcGx5WTogZnVuY3Rpb24oeSkge1xuICAgIHJldHVybiB5ICogdGhpcy5rICsgdGhpcy55O1xuICB9LFxuICBpbnZlcnQ6IGZ1bmN0aW9uKGxvY2F0aW9uKSB7XG4gICAgcmV0dXJuIFsobG9jYXRpb25bMF0gLSB0aGlzLngpIC8gdGhpcy5rLCAobG9jYXRpb25bMV0gLSB0aGlzLnkpIC8gdGhpcy5rXTtcbiAgfSxcbiAgaW52ZXJ0WDogZnVuY3Rpb24oeCkge1xuICAgIHJldHVybiAoeCAtIHRoaXMueCkgLyB0aGlzLms7XG4gIH0sXG4gIGludmVydFk6IGZ1bmN0aW9uKHkpIHtcbiAgICByZXR1cm4gKHkgLSB0aGlzLnkpIC8gdGhpcy5rO1xuICB9LFxuICByZXNjYWxlWDogZnVuY3Rpb24oeCkge1xuICAgIHJldHVybiB4LmNvcHkoKS5kb21haW4oeC5yYW5nZSgpLm1hcCh0aGlzLmludmVydFgsIHRoaXMpLm1hcCh4LmludmVydCwgeCkpO1xuICB9LFxuICByZXNjYWxlWTogZnVuY3Rpb24oeSkge1xuICAgIHJldHVybiB5LmNvcHkoKS5kb21haW4oeS5yYW5nZSgpLm1hcCh0aGlzLmludmVydFksIHRoaXMpLm1hcCh5LmludmVydCwgeSkpO1xuICB9LFxuICB0b1N0cmluZzogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIFwidHJhbnNsYXRlKFwiICsgdGhpcy54ICsgXCIsXCIgKyB0aGlzLnkgKyBcIikgc2NhbGUoXCIgKyB0aGlzLmsgKyBcIilcIjtcbiAgfVxufTtcblxuZXhwb3J0IHZhciBpZGVudGl0eSA9IG5ldyBUcmFuc2Zvcm0oMSwgMCwgMCk7XG5cbnRyYW5zZm9ybS5wcm90b3R5cGUgPSBUcmFuc2Zvcm0ucHJvdG90eXBlO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB0cmFuc2Zvcm0obm9kZSkge1xuICB3aGlsZSAoIW5vZGUuX196b29tKSBpZiAoIShub2RlID0gbm9kZS5wYXJlbnROb2RlKSkgcmV0dXJuIGlkZW50aXR5O1xuICByZXR1cm4gbm9kZS5fX3pvb207XG59XG4iLCJpbXBvcnQge2Rpc3BhdGNofSBmcm9tIFwiZDMtZGlzcGF0Y2hcIjtcbmltcG9ydCB7ZHJhZ0Rpc2FibGUsIGRyYWdFbmFibGV9IGZyb20gXCJkMy1kcmFnXCI7XG5pbXBvcnQge2ludGVycG9sYXRlWm9vbX0gZnJvbSBcImQzLWludGVycG9sYXRlXCI7XG5pbXBvcnQge3NlbGVjdCwgcG9pbnRlcn0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuaW1wb3J0IHtpbnRlcnJ1cHR9IGZyb20gXCJkMy10cmFuc2l0aW9uXCI7XG5pbXBvcnQgY29uc3RhbnQgZnJvbSBcIi4vY29uc3RhbnQuanNcIjtcbmltcG9ydCBab29tRXZlbnQgZnJvbSBcIi4vZXZlbnQuanNcIjtcbmltcG9ydCB7VHJhbnNmb3JtLCBpZGVudGl0eX0gZnJvbSBcIi4vdHJhbnNmb3JtLmpzXCI7XG5pbXBvcnQgbm9ldmVudCwge25vcHJvcGFnYXRpb259IGZyb20gXCIuL25vZXZlbnQuanNcIjtcblxuLy8gSWdub3JlIHJpZ2h0LWNsaWNrLCBzaW5jZSB0aGF0IHNob3VsZCBvcGVuIHRoZSBjb250ZXh0IG1lbnUuXG4vLyBleGNlcHQgZm9yIHBpbmNoLXRvLXpvb20sIHdoaWNoIGlzIHNlbnQgYXMgYSB3aGVlbCtjdHJsS2V5IGV2ZW50XG5mdW5jdGlvbiBkZWZhdWx0RmlsdGVyKGV2ZW50KSB7XG4gIHJldHVybiAoIWV2ZW50LmN0cmxLZXkgfHwgZXZlbnQudHlwZSA9PT0gJ3doZWVsJykgJiYgIWV2ZW50LmJ1dHRvbjtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdEV4dGVudCgpIHtcbiAgdmFyIGUgPSB0aGlzO1xuICBpZiAoZSBpbnN0YW5jZW9mIFNWR0VsZW1lbnQpIHtcbiAgICBlID0gZS5vd25lclNWR0VsZW1lbnQgfHwgZTtcbiAgICBpZiAoZS5oYXNBdHRyaWJ1dGUoXCJ2aWV3Qm94XCIpKSB7XG4gICAgICBlID0gZS52aWV3Qm94LmJhc2VWYWw7XG4gICAgICByZXR1cm4gW1tlLngsIGUueV0sIFtlLnggKyBlLndpZHRoLCBlLnkgKyBlLmhlaWdodF1dO1xuICAgIH1cbiAgICByZXR1cm4gW1swLCAwXSwgW2Uud2lkdGguYmFzZVZhbC52YWx1ZSwgZS5oZWlnaHQuYmFzZVZhbC52YWx1ZV1dO1xuICB9XG4gIHJldHVybiBbWzAsIDBdLCBbZS5jbGllbnRXaWR0aCwgZS5jbGllbnRIZWlnaHRdXTtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdFRyYW5zZm9ybSgpIHtcbiAgcmV0dXJuIHRoaXMuX196b29tIHx8IGlkZW50aXR5O1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0V2hlZWxEZWx0YShldmVudCkge1xuICByZXR1cm4gLWV2ZW50LmRlbHRhWSAqIChldmVudC5kZWx0YU1vZGUgPT09IDEgPyAwLjA1IDogZXZlbnQuZGVsdGFNb2RlID8gMSA6IDAuMDAyKSAqIChldmVudC5jdHJsS2V5ID8gMTAgOiAxKTtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdFRvdWNoYWJsZSgpIHtcbiAgcmV0dXJuIG5hdmlnYXRvci5tYXhUb3VjaFBvaW50cyB8fCAoXCJvbnRvdWNoc3RhcnRcIiBpbiB0aGlzKTtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdENvbnN0cmFpbih0cmFuc2Zvcm0sIGV4dGVudCwgdHJhbnNsYXRlRXh0ZW50KSB7XG4gIHZhciBkeDAgPSB0cmFuc2Zvcm0uaW52ZXJ0WChleHRlbnRbMF1bMF0pIC0gdHJhbnNsYXRlRXh0ZW50WzBdWzBdLFxuICAgICAgZHgxID0gdHJhbnNmb3JtLmludmVydFgoZXh0ZW50WzFdWzBdKSAtIHRyYW5zbGF0ZUV4dGVudFsxXVswXSxcbiAgICAgIGR5MCA9IHRyYW5zZm9ybS5pbnZlcnRZKGV4dGVudFswXVsxXSkgLSB0cmFuc2xhdGVFeHRlbnRbMF1bMV0sXG4gICAgICBkeTEgPSB0cmFuc2Zvcm0uaW52ZXJ0WShleHRlbnRbMV1bMV0pIC0gdHJhbnNsYXRlRXh0ZW50WzFdWzFdO1xuICByZXR1cm4gdHJhbnNmb3JtLnRyYW5zbGF0ZShcbiAgICBkeDEgPiBkeDAgPyAoZHgwICsgZHgxKSAvIDIgOiBNYXRoLm1pbigwLCBkeDApIHx8IE1hdGgubWF4KDAsIGR4MSksXG4gICAgZHkxID4gZHkwID8gKGR5MCArIGR5MSkgLyAyIDogTWF0aC5taW4oMCwgZHkwKSB8fCBNYXRoLm1heCgwLCBkeTEpXG4gICk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICB2YXIgZmlsdGVyID0gZGVmYXVsdEZpbHRlcixcbiAgICAgIGV4dGVudCA9IGRlZmF1bHRFeHRlbnQsXG4gICAgICBjb25zdHJhaW4gPSBkZWZhdWx0Q29uc3RyYWluLFxuICAgICAgd2hlZWxEZWx0YSA9IGRlZmF1bHRXaGVlbERlbHRhLFxuICAgICAgdG91Y2hhYmxlID0gZGVmYXVsdFRvdWNoYWJsZSxcbiAgICAgIHNjYWxlRXh0ZW50ID0gWzAsIEluZmluaXR5XSxcbiAgICAgIHRyYW5zbGF0ZUV4dGVudCA9IFtbLUluZmluaXR5LCAtSW5maW5pdHldLCBbSW5maW5pdHksIEluZmluaXR5XV0sXG4gICAgICBkdXJhdGlvbiA9IDI1MCxcbiAgICAgIGludGVycG9sYXRlID0gaW50ZXJwb2xhdGVab29tLFxuICAgICAgbGlzdGVuZXJzID0gZGlzcGF0Y2goXCJzdGFydFwiLCBcInpvb21cIiwgXCJlbmRcIiksXG4gICAgICB0b3VjaHN0YXJ0aW5nLFxuICAgICAgdG91Y2hmaXJzdCxcbiAgICAgIHRvdWNoZW5kaW5nLFxuICAgICAgdG91Y2hEZWxheSA9IDUwMCxcbiAgICAgIHdoZWVsRGVsYXkgPSAxNTAsXG4gICAgICBjbGlja0Rpc3RhbmNlMiA9IDAsXG4gICAgICB0YXBEaXN0YW5jZSA9IDEwO1xuXG4gIGZ1bmN0aW9uIHpvb20oc2VsZWN0aW9uKSB7XG4gICAgc2VsZWN0aW9uXG4gICAgICAgIC5wcm9wZXJ0eShcIl9fem9vbVwiLCBkZWZhdWx0VHJhbnNmb3JtKVxuICAgICAgICAub24oXCJ3aGVlbC56b29tXCIsIHdoZWVsZWQsIHtwYXNzaXZlOiBmYWxzZX0pXG4gICAgICAgIC5vbihcIm1vdXNlZG93bi56b29tXCIsIG1vdXNlZG93bmVkKVxuICAgICAgICAub24oXCJkYmxjbGljay56b29tXCIsIGRibGNsaWNrZWQpXG4gICAgICAuZmlsdGVyKHRvdWNoYWJsZSlcbiAgICAgICAgLm9uKFwidG91Y2hzdGFydC56b29tXCIsIHRvdWNoc3RhcnRlZClcbiAgICAgICAgLm9uKFwidG91Y2htb3ZlLnpvb21cIiwgdG91Y2htb3ZlZClcbiAgICAgICAgLm9uKFwidG91Y2hlbmQuem9vbSB0b3VjaGNhbmNlbC56b29tXCIsIHRvdWNoZW5kZWQpXG4gICAgICAgIC5zdHlsZShcIi13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvclwiLCBcInJnYmEoMCwwLDAsMClcIik7XG4gIH1cblxuICB6b29tLnRyYW5zZm9ybSA9IGZ1bmN0aW9uKGNvbGxlY3Rpb24sIHRyYW5zZm9ybSwgcG9pbnQsIGV2ZW50KSB7XG4gICAgdmFyIHNlbGVjdGlvbiA9IGNvbGxlY3Rpb24uc2VsZWN0aW9uID8gY29sbGVjdGlvbi5zZWxlY3Rpb24oKSA6IGNvbGxlY3Rpb247XG4gICAgc2VsZWN0aW9uLnByb3BlcnR5KFwiX196b29tXCIsIGRlZmF1bHRUcmFuc2Zvcm0pO1xuICAgIGlmIChjb2xsZWN0aW9uICE9PSBzZWxlY3Rpb24pIHtcbiAgICAgIHNjaGVkdWxlKGNvbGxlY3Rpb24sIHRyYW5zZm9ybSwgcG9pbnQsIGV2ZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VsZWN0aW9uLmludGVycnVwdCgpLmVhY2goZnVuY3Rpb24oKSB7XG4gICAgICAgIGdlc3R1cmUodGhpcywgYXJndW1lbnRzKVxuICAgICAgICAgIC5ldmVudChldmVudClcbiAgICAgICAgICAuc3RhcnQoKVxuICAgICAgICAgIC56b29tKG51bGwsIHR5cGVvZiB0cmFuc2Zvcm0gPT09IFwiZnVuY3Rpb25cIiA/IHRyYW5zZm9ybS5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogdHJhbnNmb3JtKVxuICAgICAgICAgIC5lbmQoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICB6b29tLnNjYWxlQnkgPSBmdW5jdGlvbihzZWxlY3Rpb24sIGssIHAsIGV2ZW50KSB7XG4gICAgem9vbS5zY2FsZVRvKHNlbGVjdGlvbiwgZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgazAgPSB0aGlzLl9fem9vbS5rLFxuICAgICAgICAgIGsxID0gdHlwZW9mIGsgPT09IFwiZnVuY3Rpb25cIiA/IGsuYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IGs7XG4gICAgICByZXR1cm4gazAgKiBrMTtcbiAgICB9LCBwLCBldmVudCk7XG4gIH07XG5cbiAgem9vbS5zY2FsZVRvID0gZnVuY3Rpb24oc2VsZWN0aW9uLCBrLCBwLCBldmVudCkge1xuICAgIHpvb20udHJhbnNmb3JtKHNlbGVjdGlvbiwgZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgZSA9IGV4dGVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpLFxuICAgICAgICAgIHQwID0gdGhpcy5fX3pvb20sXG4gICAgICAgICAgcDAgPSBwID09IG51bGwgPyBjZW50cm9pZChlKSA6IHR5cGVvZiBwID09PSBcImZ1bmN0aW9uXCIgPyBwLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiBwLFxuICAgICAgICAgIHAxID0gdDAuaW52ZXJ0KHAwKSxcbiAgICAgICAgICBrMSA9IHR5cGVvZiBrID09PSBcImZ1bmN0aW9uXCIgPyBrLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiBrO1xuICAgICAgcmV0dXJuIGNvbnN0cmFpbih0cmFuc2xhdGUoc2NhbGUodDAsIGsxKSwgcDAsIHAxKSwgZSwgdHJhbnNsYXRlRXh0ZW50KTtcbiAgICB9LCBwLCBldmVudCk7XG4gIH07XG5cbiAgem9vbS50cmFuc2xhdGVCeSA9IGZ1bmN0aW9uKHNlbGVjdGlvbiwgeCwgeSwgZXZlbnQpIHtcbiAgICB6b29tLnRyYW5zZm9ybShzZWxlY3Rpb24sIGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGNvbnN0cmFpbih0aGlzLl9fem9vbS50cmFuc2xhdGUoXG4gICAgICAgIHR5cGVvZiB4ID09PSBcImZ1bmN0aW9uXCIgPyB4LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiB4LFxuICAgICAgICB0eXBlb2YgeSA9PT0gXCJmdW5jdGlvblwiID8geS5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogeVxuICAgICAgKSwgZXh0ZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksIHRyYW5zbGF0ZUV4dGVudCk7XG4gICAgfSwgbnVsbCwgZXZlbnQpO1xuICB9O1xuXG4gIHpvb20udHJhbnNsYXRlVG8gPSBmdW5jdGlvbihzZWxlY3Rpb24sIHgsIHksIHAsIGV2ZW50KSB7XG4gICAgem9vbS50cmFuc2Zvcm0oc2VsZWN0aW9uLCBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBlID0gZXh0ZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksXG4gICAgICAgICAgdCA9IHRoaXMuX196b29tLFxuICAgICAgICAgIHAwID0gcCA9PSBudWxsID8gY2VudHJvaWQoZSkgOiB0eXBlb2YgcCA9PT0gXCJmdW5jdGlvblwiID8gcC5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogcDtcbiAgICAgIHJldHVybiBjb25zdHJhaW4oaWRlbnRpdHkudHJhbnNsYXRlKHAwWzBdLCBwMFsxXSkuc2NhbGUodC5rKS50cmFuc2xhdGUoXG4gICAgICAgIHR5cGVvZiB4ID09PSBcImZ1bmN0aW9uXCIgPyAteC5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogLXgsXG4gICAgICAgIHR5cGVvZiB5ID09PSBcImZ1bmN0aW9uXCIgPyAteS5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogLXlcbiAgICAgICksIGUsIHRyYW5zbGF0ZUV4dGVudCk7XG4gICAgfSwgcCwgZXZlbnQpO1xuICB9O1xuXG4gIGZ1bmN0aW9uIHNjYWxlKHRyYW5zZm9ybSwgaykge1xuICAgIGsgPSBNYXRoLm1heChzY2FsZUV4dGVudFswXSwgTWF0aC5taW4oc2NhbGVFeHRlbnRbMV0sIGspKTtcbiAgICByZXR1cm4gayA9PT0gdHJhbnNmb3JtLmsgPyB0cmFuc2Zvcm0gOiBuZXcgVHJhbnNmb3JtKGssIHRyYW5zZm9ybS54LCB0cmFuc2Zvcm0ueSk7XG4gIH1cblxuICBmdW5jdGlvbiB0cmFuc2xhdGUodHJhbnNmb3JtLCBwMCwgcDEpIHtcbiAgICB2YXIgeCA9IHAwWzBdIC0gcDFbMF0gKiB0cmFuc2Zvcm0uaywgeSA9IHAwWzFdIC0gcDFbMV0gKiB0cmFuc2Zvcm0uaztcbiAgICByZXR1cm4geCA9PT0gdHJhbnNmb3JtLnggJiYgeSA9PT0gdHJhbnNmb3JtLnkgPyB0cmFuc2Zvcm0gOiBuZXcgVHJhbnNmb3JtKHRyYW5zZm9ybS5rLCB4LCB5KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNlbnRyb2lkKGV4dGVudCkge1xuICAgIHJldHVybiBbKCtleHRlbnRbMF1bMF0gKyArZXh0ZW50WzFdWzBdKSAvIDIsICgrZXh0ZW50WzBdWzFdICsgK2V4dGVudFsxXVsxXSkgLyAyXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNjaGVkdWxlKHRyYW5zaXRpb24sIHRyYW5zZm9ybSwgcG9pbnQsIGV2ZW50KSB7XG4gICAgdHJhbnNpdGlvblxuICAgICAgICAub24oXCJzdGFydC56b29tXCIsIGZ1bmN0aW9uKCkgeyBnZXN0dXJlKHRoaXMsIGFyZ3VtZW50cykuZXZlbnQoZXZlbnQpLnN0YXJ0KCk7IH0pXG4gICAgICAgIC5vbihcImludGVycnVwdC56b29tIGVuZC56b29tXCIsIGZ1bmN0aW9uKCkgeyBnZXN0dXJlKHRoaXMsIGFyZ3VtZW50cykuZXZlbnQoZXZlbnQpLmVuZCgpOyB9KVxuICAgICAgICAudHdlZW4oXCJ6b29tXCIsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHZhciB0aGF0ID0gdGhpcyxcbiAgICAgICAgICAgICAgYXJncyA9IGFyZ3VtZW50cyxcbiAgICAgICAgICAgICAgZyA9IGdlc3R1cmUodGhhdCwgYXJncykuZXZlbnQoZXZlbnQpLFxuICAgICAgICAgICAgICBlID0gZXh0ZW50LmFwcGx5KHRoYXQsIGFyZ3MpLFxuICAgICAgICAgICAgICBwID0gcG9pbnQgPT0gbnVsbCA/IGNlbnRyb2lkKGUpIDogdHlwZW9mIHBvaW50ID09PSBcImZ1bmN0aW9uXCIgPyBwb2ludC5hcHBseSh0aGF0LCBhcmdzKSA6IHBvaW50LFxuICAgICAgICAgICAgICB3ID0gTWF0aC5tYXgoZVsxXVswXSAtIGVbMF1bMF0sIGVbMV1bMV0gLSBlWzBdWzFdKSxcbiAgICAgICAgICAgICAgYSA9IHRoYXQuX196b29tLFxuICAgICAgICAgICAgICBiID0gdHlwZW9mIHRyYW5zZm9ybSA9PT0gXCJmdW5jdGlvblwiID8gdHJhbnNmb3JtLmFwcGx5KHRoYXQsIGFyZ3MpIDogdHJhbnNmb3JtLFxuICAgICAgICAgICAgICBpID0gaW50ZXJwb2xhdGUoYS5pbnZlcnQocCkuY29uY2F0KHcgLyBhLmspLCBiLmludmVydChwKS5jb25jYXQodyAvIGIuaykpO1xuICAgICAgICAgIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICBpZiAodCA9PT0gMSkgdCA9IGI7IC8vIEF2b2lkIHJvdW5kaW5nIGVycm9yIG9uIGVuZC5cbiAgICAgICAgICAgIGVsc2UgeyB2YXIgbCA9IGkodCksIGsgPSB3IC8gbFsyXTsgdCA9IG5ldyBUcmFuc2Zvcm0oaywgcFswXSAtIGxbMF0gKiBrLCBwWzFdIC0gbFsxXSAqIGspOyB9XG4gICAgICAgICAgICBnLnpvb20obnVsbCwgdCk7XG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBnZXN0dXJlKHRoYXQsIGFyZ3MsIGNsZWFuKSB7XG4gICAgcmV0dXJuICghY2xlYW4gJiYgdGhhdC5fX3pvb21pbmcpIHx8IG5ldyBHZXN0dXJlKHRoYXQsIGFyZ3MpO1xuICB9XG5cbiAgZnVuY3Rpb24gR2VzdHVyZSh0aGF0LCBhcmdzKSB7XG4gICAgdGhpcy50aGF0ID0gdGhhdDtcbiAgICB0aGlzLmFyZ3MgPSBhcmdzO1xuICAgIHRoaXMuYWN0aXZlID0gMDtcbiAgICB0aGlzLnNvdXJjZUV2ZW50ID0gbnVsbDtcbiAgICB0aGlzLmV4dGVudCA9IGV4dGVudC5hcHBseSh0aGF0LCBhcmdzKTtcbiAgICB0aGlzLnRhcHMgPSAwO1xuICB9XG5cbiAgR2VzdHVyZS5wcm90b3R5cGUgPSB7XG4gICAgZXZlbnQ6IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICBpZiAoZXZlbnQpIHRoaXMuc291cmNlRXZlbnQgPSBldmVudDtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgc3RhcnQ6IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKCsrdGhpcy5hY3RpdmUgPT09IDEpIHtcbiAgICAgICAgdGhpcy50aGF0Ll9fem9vbWluZyA9IHRoaXM7XG4gICAgICAgIHRoaXMuZW1pdChcInN0YXJ0XCIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICB6b29tOiBmdW5jdGlvbihrZXksIHRyYW5zZm9ybSkge1xuICAgICAgaWYgKHRoaXMubW91c2UgJiYga2V5ICE9PSBcIm1vdXNlXCIpIHRoaXMubW91c2VbMV0gPSB0cmFuc2Zvcm0uaW52ZXJ0KHRoaXMubW91c2VbMF0pO1xuICAgICAgaWYgKHRoaXMudG91Y2gwICYmIGtleSAhPT0gXCJ0b3VjaFwiKSB0aGlzLnRvdWNoMFsxXSA9IHRyYW5zZm9ybS5pbnZlcnQodGhpcy50b3VjaDBbMF0pO1xuICAgICAgaWYgKHRoaXMudG91Y2gxICYmIGtleSAhPT0gXCJ0b3VjaFwiKSB0aGlzLnRvdWNoMVsxXSA9IHRyYW5zZm9ybS5pbnZlcnQodGhpcy50b3VjaDFbMF0pO1xuICAgICAgdGhpcy50aGF0Ll9fem9vbSA9IHRyYW5zZm9ybTtcbiAgICAgIHRoaXMuZW1pdChcInpvb21cIik7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIGVuZDogZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoLS10aGlzLmFjdGl2ZSA9PT0gMCkge1xuICAgICAgICBkZWxldGUgdGhpcy50aGF0Ll9fem9vbWluZztcbiAgICAgICAgdGhpcy5lbWl0KFwiZW5kXCIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICBlbWl0OiBmdW5jdGlvbih0eXBlKSB7XG4gICAgICB2YXIgZCA9IHNlbGVjdCh0aGlzLnRoYXQpLmRhdHVtKCk7XG4gICAgICBsaXN0ZW5lcnMuY2FsbChcbiAgICAgICAgdHlwZSxcbiAgICAgICAgdGhpcy50aGF0LFxuICAgICAgICBuZXcgWm9vbUV2ZW50KHR5cGUsIHtcbiAgICAgICAgICBzb3VyY2VFdmVudDogdGhpcy5zb3VyY2VFdmVudCxcbiAgICAgICAgICB0YXJnZXQ6IHpvb20sXG4gICAgICAgICAgdHlwZSxcbiAgICAgICAgICB0cmFuc2Zvcm06IHRoaXMudGhhdC5fX3pvb20sXG4gICAgICAgICAgZGlzcGF0Y2g6IGxpc3RlbmVyc1xuICAgICAgICB9KSxcbiAgICAgICAgZFxuICAgICAgKTtcbiAgICB9XG4gIH07XG5cbiAgZnVuY3Rpb24gd2hlZWxlZChldmVudCwgLi4uYXJncykge1xuICAgIGlmICghZmlsdGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpIHJldHVybjtcbiAgICB2YXIgZyA9IGdlc3R1cmUodGhpcywgYXJncykuZXZlbnQoZXZlbnQpLFxuICAgICAgICB0ID0gdGhpcy5fX3pvb20sXG4gICAgICAgIGsgPSBNYXRoLm1heChzY2FsZUV4dGVudFswXSwgTWF0aC5taW4oc2NhbGVFeHRlbnRbMV0sIHQuayAqIE1hdGgucG93KDIsIHdoZWVsRGVsdGEuYXBwbHkodGhpcywgYXJndW1lbnRzKSkpKSxcbiAgICAgICAgcCA9IHBvaW50ZXIoZXZlbnQpO1xuXG4gICAgLy8gSWYgdGhlIG1vdXNlIGlzIGluIHRoZSBzYW1lIGxvY2F0aW9uIGFzIGJlZm9yZSwgcmV1c2UgaXQuXG4gICAgLy8gSWYgdGhlcmUgd2VyZSByZWNlbnQgd2hlZWwgZXZlbnRzLCByZXNldCB0aGUgd2hlZWwgaWRsZSB0aW1lb3V0LlxuICAgIGlmIChnLndoZWVsKSB7XG4gICAgICBpZiAoZy5tb3VzZVswXVswXSAhPT0gcFswXSB8fCBnLm1vdXNlWzBdWzFdICE9PSBwWzFdKSB7XG4gICAgICAgIGcubW91c2VbMV0gPSB0LmludmVydChnLm1vdXNlWzBdID0gcCk7XG4gICAgICB9XG4gICAgICBjbGVhclRpbWVvdXQoZy53aGVlbCk7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhpcyB3aGVlbCBldmVudCB3b27igJl0IHRyaWdnZXIgYSB0cmFuc2Zvcm0gY2hhbmdlLCBpZ25vcmUgaXQuXG4gICAgZWxzZSBpZiAodC5rID09PSBrKSByZXR1cm47XG5cbiAgICAvLyBPdGhlcndpc2UsIGNhcHR1cmUgdGhlIG1vdXNlIHBvaW50IGFuZCBsb2NhdGlvbiBhdCB0aGUgc3RhcnQuXG4gICAgZWxzZSB7XG4gICAgICBnLm1vdXNlID0gW3AsIHQuaW52ZXJ0KHApXTtcbiAgICAgIGludGVycnVwdCh0aGlzKTtcbiAgICAgIGcuc3RhcnQoKTtcbiAgICB9XG5cbiAgICBub2V2ZW50KGV2ZW50KTtcbiAgICBnLndoZWVsID0gc2V0VGltZW91dCh3aGVlbGlkbGVkLCB3aGVlbERlbGF5KTtcbiAgICBnLnpvb20oXCJtb3VzZVwiLCBjb25zdHJhaW4odHJhbnNsYXRlKHNjYWxlKHQsIGspLCBnLm1vdXNlWzBdLCBnLm1vdXNlWzFdKSwgZy5leHRlbnQsIHRyYW5zbGF0ZUV4dGVudCkpO1xuXG4gICAgZnVuY3Rpb24gd2hlZWxpZGxlZCgpIHtcbiAgICAgIGcud2hlZWwgPSBudWxsO1xuICAgICAgZy5lbmQoKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBtb3VzZWRvd25lZChldmVudCwgLi4uYXJncykge1xuICAgIGlmICh0b3VjaGVuZGluZyB8fCAhZmlsdGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpIHJldHVybjtcbiAgICB2YXIgY3VycmVudFRhcmdldCA9IGV2ZW50LmN1cnJlbnRUYXJnZXQsXG4gICAgICAgIGcgPSBnZXN0dXJlKHRoaXMsIGFyZ3MsIHRydWUpLmV2ZW50KGV2ZW50KSxcbiAgICAgICAgdiA9IHNlbGVjdChldmVudC52aWV3KS5vbihcIm1vdXNlbW92ZS56b29tXCIsIG1vdXNlbW92ZWQsIHRydWUpLm9uKFwibW91c2V1cC56b29tXCIsIG1vdXNldXBwZWQsIHRydWUpLFxuICAgICAgICBwID0gcG9pbnRlcihldmVudCwgY3VycmVudFRhcmdldCksXG4gICAgICAgIHgwID0gZXZlbnQuY2xpZW50WCxcbiAgICAgICAgeTAgPSBldmVudC5jbGllbnRZO1xuXG4gICAgZHJhZ0Rpc2FibGUoZXZlbnQudmlldyk7XG4gICAgbm9wcm9wYWdhdGlvbihldmVudCk7XG4gICAgZy5tb3VzZSA9IFtwLCB0aGlzLl9fem9vbS5pbnZlcnQocCldO1xuICAgIGludGVycnVwdCh0aGlzKTtcbiAgICBnLnN0YXJ0KCk7XG5cbiAgICBmdW5jdGlvbiBtb3VzZW1vdmVkKGV2ZW50KSB7XG4gICAgICBub2V2ZW50KGV2ZW50KTtcbiAgICAgIGlmICghZy5tb3ZlZCkge1xuICAgICAgICB2YXIgZHggPSBldmVudC5jbGllbnRYIC0geDAsIGR5ID0gZXZlbnQuY2xpZW50WSAtIHkwO1xuICAgICAgICBnLm1vdmVkID0gZHggKiBkeCArIGR5ICogZHkgPiBjbGlja0Rpc3RhbmNlMjtcbiAgICAgIH1cbiAgICAgIGcuZXZlbnQoZXZlbnQpXG4gICAgICAgLnpvb20oXCJtb3VzZVwiLCBjb25zdHJhaW4odHJhbnNsYXRlKGcudGhhdC5fX3pvb20sIGcubW91c2VbMF0gPSBwb2ludGVyKGV2ZW50LCBjdXJyZW50VGFyZ2V0KSwgZy5tb3VzZVsxXSksIGcuZXh0ZW50LCB0cmFuc2xhdGVFeHRlbnQpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtb3VzZXVwcGVkKGV2ZW50KSB7XG4gICAgICB2Lm9uKFwibW91c2Vtb3ZlLnpvb20gbW91c2V1cC56b29tXCIsIG51bGwpO1xuICAgICAgZHJhZ0VuYWJsZShldmVudC52aWV3LCBnLm1vdmVkKTtcbiAgICAgIG5vZXZlbnQoZXZlbnQpO1xuICAgICAgZy5ldmVudChldmVudCkuZW5kKCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZGJsY2xpY2tlZChldmVudCwgLi4uYXJncykge1xuICAgIGlmICghZmlsdGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpIHJldHVybjtcbiAgICB2YXIgdDAgPSB0aGlzLl9fem9vbSxcbiAgICAgICAgcDAgPSBwb2ludGVyKGV2ZW50LmNoYW5nZWRUb3VjaGVzID8gZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0gOiBldmVudCwgdGhpcyksXG4gICAgICAgIHAxID0gdDAuaW52ZXJ0KHAwKSxcbiAgICAgICAgazEgPSB0MC5rICogKGV2ZW50LnNoaWZ0S2V5ID8gMC41IDogMiksXG4gICAgICAgIHQxID0gY29uc3RyYWluKHRyYW5zbGF0ZShzY2FsZSh0MCwgazEpLCBwMCwgcDEpLCBleHRlbnQuYXBwbHkodGhpcywgYXJncyksIHRyYW5zbGF0ZUV4dGVudCk7XG5cbiAgICBub2V2ZW50KGV2ZW50KTtcbiAgICBpZiAoZHVyYXRpb24gPiAwKSBzZWxlY3QodGhpcykudHJhbnNpdGlvbigpLmR1cmF0aW9uKGR1cmF0aW9uKS5jYWxsKHNjaGVkdWxlLCB0MSwgcDAsIGV2ZW50KTtcbiAgICBlbHNlIHNlbGVjdCh0aGlzKS5jYWxsKHpvb20udHJhbnNmb3JtLCB0MSwgcDAsIGV2ZW50KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRvdWNoc3RhcnRlZChldmVudCwgLi4uYXJncykge1xuICAgIGlmICghZmlsdGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpIHJldHVybjtcbiAgICB2YXIgdG91Y2hlcyA9IGV2ZW50LnRvdWNoZXMsXG4gICAgICAgIG4gPSB0b3VjaGVzLmxlbmd0aCxcbiAgICAgICAgZyA9IGdlc3R1cmUodGhpcywgYXJncywgZXZlbnQuY2hhbmdlZFRvdWNoZXMubGVuZ3RoID09PSBuKS5ldmVudChldmVudCksXG4gICAgICAgIHN0YXJ0ZWQsIGksIHQsIHA7XG5cbiAgICBub3Byb3BhZ2F0aW9uKGV2ZW50KTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICB0ID0gdG91Y2hlc1tpXSwgcCA9IHBvaW50ZXIodCwgdGhpcyk7XG4gICAgICBwID0gW3AsIHRoaXMuX196b29tLmludmVydChwKSwgdC5pZGVudGlmaWVyXTtcbiAgICAgIGlmICghZy50b3VjaDApIGcudG91Y2gwID0gcCwgc3RhcnRlZCA9IHRydWUsIGcudGFwcyA9IDEgKyAhIXRvdWNoc3RhcnRpbmc7XG4gICAgICBlbHNlIGlmICghZy50b3VjaDEgJiYgZy50b3VjaDBbMl0gIT09IHBbMl0pIGcudG91Y2gxID0gcCwgZy50YXBzID0gMDtcbiAgICB9XG5cbiAgICBpZiAodG91Y2hzdGFydGluZykgdG91Y2hzdGFydGluZyA9IGNsZWFyVGltZW91dCh0b3VjaHN0YXJ0aW5nKTtcblxuICAgIGlmIChzdGFydGVkKSB7XG4gICAgICBpZiAoZy50YXBzIDwgMikgdG91Y2hmaXJzdCA9IHBbMF0sIHRvdWNoc3RhcnRpbmcgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyB0b3VjaHN0YXJ0aW5nID0gbnVsbDsgfSwgdG91Y2hEZWxheSk7XG4gICAgICBpbnRlcnJ1cHQodGhpcyk7XG4gICAgICBnLnN0YXJ0KCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdG91Y2htb3ZlZChldmVudCwgLi4uYXJncykge1xuICAgIGlmICghdGhpcy5fX3pvb21pbmcpIHJldHVybjtcbiAgICB2YXIgZyA9IGdlc3R1cmUodGhpcywgYXJncykuZXZlbnQoZXZlbnQpLFxuICAgICAgICB0b3VjaGVzID0gZXZlbnQuY2hhbmdlZFRvdWNoZXMsXG4gICAgICAgIG4gPSB0b3VjaGVzLmxlbmd0aCwgaSwgdCwgcCwgbDtcblxuICAgIG5vZXZlbnQoZXZlbnQpO1xuICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIHQgPSB0b3VjaGVzW2ldLCBwID0gcG9pbnRlcih0LCB0aGlzKTtcbiAgICAgIGlmIChnLnRvdWNoMCAmJiBnLnRvdWNoMFsyXSA9PT0gdC5pZGVudGlmaWVyKSBnLnRvdWNoMFswXSA9IHA7XG4gICAgICBlbHNlIGlmIChnLnRvdWNoMSAmJiBnLnRvdWNoMVsyXSA9PT0gdC5pZGVudGlmaWVyKSBnLnRvdWNoMVswXSA9IHA7XG4gICAgfVxuICAgIHQgPSBnLnRoYXQuX196b29tO1xuICAgIGlmIChnLnRvdWNoMSkge1xuICAgICAgdmFyIHAwID0gZy50b3VjaDBbMF0sIGwwID0gZy50b3VjaDBbMV0sXG4gICAgICAgICAgcDEgPSBnLnRvdWNoMVswXSwgbDEgPSBnLnRvdWNoMVsxXSxcbiAgICAgICAgICBkcCA9IChkcCA9IHAxWzBdIC0gcDBbMF0pICogZHAgKyAoZHAgPSBwMVsxXSAtIHAwWzFdKSAqIGRwLFxuICAgICAgICAgIGRsID0gKGRsID0gbDFbMF0gLSBsMFswXSkgKiBkbCArIChkbCA9IGwxWzFdIC0gbDBbMV0pICogZGw7XG4gICAgICB0ID0gc2NhbGUodCwgTWF0aC5zcXJ0KGRwIC8gZGwpKTtcbiAgICAgIHAgPSBbKHAwWzBdICsgcDFbMF0pIC8gMiwgKHAwWzFdICsgcDFbMV0pIC8gMl07XG4gICAgICBsID0gWyhsMFswXSArIGwxWzBdKSAvIDIsIChsMFsxXSArIGwxWzFdKSAvIDJdO1xuICAgIH1cbiAgICBlbHNlIGlmIChnLnRvdWNoMCkgcCA9IGcudG91Y2gwWzBdLCBsID0gZy50b3VjaDBbMV07XG4gICAgZWxzZSByZXR1cm47XG5cbiAgICBnLnpvb20oXCJ0b3VjaFwiLCBjb25zdHJhaW4odHJhbnNsYXRlKHQsIHAsIGwpLCBnLmV4dGVudCwgdHJhbnNsYXRlRXh0ZW50KSk7XG4gIH1cblxuICBmdW5jdGlvbiB0b3VjaGVuZGVkKGV2ZW50LCAuLi5hcmdzKSB7XG4gICAgaWYgKCF0aGlzLl9fem9vbWluZykgcmV0dXJuO1xuICAgIHZhciBnID0gZ2VzdHVyZSh0aGlzLCBhcmdzKS5ldmVudChldmVudCksXG4gICAgICAgIHRvdWNoZXMgPSBldmVudC5jaGFuZ2VkVG91Y2hlcyxcbiAgICAgICAgbiA9IHRvdWNoZXMubGVuZ3RoLCBpLCB0O1xuXG4gICAgbm9wcm9wYWdhdGlvbihldmVudCk7XG4gICAgaWYgKHRvdWNoZW5kaW5nKSBjbGVhclRpbWVvdXQodG91Y2hlbmRpbmcpO1xuICAgIHRvdWNoZW5kaW5nID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsgdG91Y2hlbmRpbmcgPSBudWxsOyB9LCB0b3VjaERlbGF5KTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICB0ID0gdG91Y2hlc1tpXTtcbiAgICAgIGlmIChnLnRvdWNoMCAmJiBnLnRvdWNoMFsyXSA9PT0gdC5pZGVudGlmaWVyKSBkZWxldGUgZy50b3VjaDA7XG4gICAgICBlbHNlIGlmIChnLnRvdWNoMSAmJiBnLnRvdWNoMVsyXSA9PT0gdC5pZGVudGlmaWVyKSBkZWxldGUgZy50b3VjaDE7XG4gICAgfVxuICAgIGlmIChnLnRvdWNoMSAmJiAhZy50b3VjaDApIGcudG91Y2gwID0gZy50b3VjaDEsIGRlbGV0ZSBnLnRvdWNoMTtcbiAgICBpZiAoZy50b3VjaDApIGcudG91Y2gwWzFdID0gdGhpcy5fX3pvb20uaW52ZXJ0KGcudG91Y2gwWzBdKTtcbiAgICBlbHNlIHtcbiAgICAgIGcuZW5kKCk7XG4gICAgICAvLyBJZiB0aGlzIHdhcyBhIGRibHRhcCwgcmVyb3V0ZSB0byB0aGUgKG9wdGlvbmFsKSBkYmxjbGljay56b29tIGhhbmRsZXIuXG4gICAgICBpZiAoZy50YXBzID09PSAyKSB7XG4gICAgICAgIHQgPSBwb2ludGVyKHQsIHRoaXMpO1xuICAgICAgICBpZiAoTWF0aC5oeXBvdCh0b3VjaGZpcnN0WzBdIC0gdFswXSwgdG91Y2hmaXJzdFsxXSAtIHRbMV0pIDwgdGFwRGlzdGFuY2UpIHtcbiAgICAgICAgICB2YXIgcCA9IHNlbGVjdCh0aGlzKS5vbihcImRibGNsaWNrLnpvb21cIik7XG4gICAgICAgICAgaWYgKHApIHAuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHpvb20ud2hlZWxEZWx0YSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh3aGVlbERlbHRhID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCgrXyksIHpvb20pIDogd2hlZWxEZWx0YTtcbiAgfTtcblxuICB6b29tLmZpbHRlciA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChmaWx0ZXIgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCEhXyksIHpvb20pIDogZmlsdGVyO1xuICB9O1xuXG4gIHpvb20udG91Y2hhYmxlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRvdWNoYWJsZSA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoISFfKSwgem9vbSkgOiB0b3VjaGFibGU7XG4gIH07XG5cbiAgem9vbS5leHRlbnQgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZXh0ZW50ID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudChbWytfWzBdWzBdLCArX1swXVsxXV0sIFsrX1sxXVswXSwgK19bMV1bMV1dXSksIHpvb20pIDogZXh0ZW50O1xuICB9O1xuXG4gIHpvb20uc2NhbGVFeHRlbnQgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc2NhbGVFeHRlbnRbMF0gPSArX1swXSwgc2NhbGVFeHRlbnRbMV0gPSArX1sxXSwgem9vbSkgOiBbc2NhbGVFeHRlbnRbMF0sIHNjYWxlRXh0ZW50WzFdXTtcbiAgfTtcblxuICB6b29tLnRyYW5zbGF0ZUV4dGVudCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0cmFuc2xhdGVFeHRlbnRbMF1bMF0gPSArX1swXVswXSwgdHJhbnNsYXRlRXh0ZW50WzFdWzBdID0gK19bMV1bMF0sIHRyYW5zbGF0ZUV4dGVudFswXVsxXSA9ICtfWzBdWzFdLCB0cmFuc2xhdGVFeHRlbnRbMV1bMV0gPSArX1sxXVsxXSwgem9vbSkgOiBbW3RyYW5zbGF0ZUV4dGVudFswXVswXSwgdHJhbnNsYXRlRXh0ZW50WzBdWzFdXSwgW3RyYW5zbGF0ZUV4dGVudFsxXVswXSwgdHJhbnNsYXRlRXh0ZW50WzFdWzFdXV07XG4gIH07XG5cbiAgem9vbS5jb25zdHJhaW4gPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoY29uc3RyYWluID0gXywgem9vbSkgOiBjb25zdHJhaW47XG4gIH07XG5cbiAgem9vbS5kdXJhdGlvbiA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkdXJhdGlvbiA9ICtfLCB6b29tKSA6IGR1cmF0aW9uO1xuICB9O1xuXG4gIHpvb20uaW50ZXJwb2xhdGUgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoaW50ZXJwb2xhdGUgPSBfLCB6b29tKSA6IGludGVycG9sYXRlO1xuICB9O1xuXG4gIHpvb20ub24gPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgdmFsdWUgPSBsaXN0ZW5lcnMub24uYXBwbHkobGlzdGVuZXJzLCBhcmd1bWVudHMpO1xuICAgIHJldHVybiB2YWx1ZSA9PT0gbGlzdGVuZXJzID8gem9vbSA6IHZhbHVlO1xuICB9O1xuXG4gIHpvb20uY2xpY2tEaXN0YW5jZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChjbGlja0Rpc3RhbmNlMiA9IChfID0gK18pICogXywgem9vbSkgOiBNYXRoLnNxcnQoY2xpY2tEaXN0YW5jZTIpO1xuICB9O1xuXG4gIHpvb20udGFwRGlzdGFuY2UgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodGFwRGlzdGFuY2UgPSArXywgem9vbSkgOiB0YXBEaXN0YW5jZTtcbiAgfTtcblxuICByZXR1cm4gem9vbTtcbn1cbiIsImltcG9ydCB7IHNlbGVjdCB9IGZyb20gJ2QzLXNlbGVjdGlvbidcblxuLyoqXG4gKiBQYXJlbnQgY2xhc3MgZm9yIGJ1dHRvbiBlbGVtZW50cyB1c2VkIHRvIGludGVyYWN0IHdpdGggdGhlIGdyaWR2aXogdmlld2VyLlxuICpcbiAqIEBtb2R1bGUgYnV0dG9uXG4gKiBAYXV0aG9yIEpvc2VwaCBEYXZpZXMsIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBCdXR0b24ge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzXG4gICAgICogb3B0cy5wYXJlbnROb2RlXG4gICAgICogb3B0cy5pZFxuICAgICAqIG9wdHMudGl0bGVcbiAgICAgKiBvcHRzLmNsYXNzXG4gICAgICogb3B0cy5vbkNsaWNrRnVuY3Rpb25cbiAgICAgKiBvcHRzLnhcbiAgICAgKiBvcHRzLnlcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzID0ge30pIHtcbiAgICAgICAgdGhpcy5tYXAgPSBvcHRzLm1hcFxuICAgICAgICB0aGlzLnBhcmVudE5vZGUgPSBvcHRzLnBhcmVudE5vZGUgfHwgb3B0cy5tYXAuY29udGFpbmVyXG5cbiAgICAgICAgLy8gdGhlIGRpdiBlbGVtZW50XG4gICAgICAgIGlmIChvcHRzLmlkKSB0aGlzLmRpdiA9IHNlbGVjdCgnIycgKyBvcHRzLmlkKVxuXG4gICAgICAgIGlmICghdGhpcy5kaXYgfHwgdGhpcy5kaXYuZW1wdHkoKSkge1xuICAgICAgICAgICAgdGhpcy5kaXYgPSBzZWxlY3QoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykpXG4gICAgICAgICAgICBpZiAob3B0cy5pZCkgdGhpcy5kaXYuYXR0cignaWQnLCBvcHRzLmlkKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdHMudGl0bGUpIHRoaXMuZGl2LmF0dHIoJ3RpdGxlJywgb3B0cy50aXRsZSlcbiAgICAgICAgaWYgKG9wdHMuY2xhc3MpIHRoaXMuZGl2LmF0dHIoJ2NsYXNzJywgb3B0cy5jbGFzcylcblxuICAgICAgICAvLyBhZGQgZXZlbnRzXG4gICAgICAgIGlmIChvcHRzLm9uQ2xpY2tGdW5jdGlvbikgdGhpcy5kaXYub24oJ2NsaWNrJywgb3B0cy5vbkNsaWNrRnVuY3Rpb24pXG5cbiAgICAgICAgLy9zZXQgc3R5bGVzXG4gICAgICAgIHRoaXMuc3R5bGUoXG4gICAgICAgICAgICAnYm94LXNoYWRvdycsXG4gICAgICAgICAgICAnMCA3cHggOHB4IHJnYmEoMCw0NywxMDMsLjA4KSwgMCAwIDIycHggcmdiYSgwLDQ3LDEwMywuMDQpLCAwIDEycHggMTdweCByZ2JhKDAsNDcsMTAzLC4wNCksIDAgLTRweCA0cHggcmdiYSgwLDQ3LDEwMywuMDQpJ1xuICAgICAgICApIC8vLmVjbC11LXNoYWRvdy0zXG4gICAgICAgIHRoaXMuc3R5bGUoJ2JhY2tncm91bmQtY29sb3InLCAnI2ZmZmZmZicpXG4gICAgICAgIHRoaXMuc3R5bGUoJ3Bvc2l0aW9uJywgJ2Fic29sdXRlJylcbiAgICAgICAgdGhpcy5zdHlsZSgnY3Vyc29yJywgJ3BvaW50ZXInKVxuICAgICAgICB0aGlzLnN0eWxlKCdkaXNwbGF5JywgJ2ZsZXgnKVxuICAgICAgICB0aGlzLnN0eWxlKCdqdXN0aWZ5LWNvbnRlbnQnLCAnY2VudGVyJylcbiAgICAgICAgdGhpcy5zdHlsZSgnYWxpZ24taXRlbXMnLCAnY2VudGVyJylcbiAgICAgICAgdGhpcy5zdHlsZSgnd2lkdGgnLCAnMzVweCcpXG4gICAgICAgIHRoaXMuc3R5bGUoJ2hlaWdodCcsICczMHB4JylcbiAgICAgICAgLy8gdGhpcy5zdHlsZShwYWRkaW5nICwgJzRweCdcblxuICAgICAgICAvLyBhcHBlbmQgdG8gcGFyZW50XG4gICAgICAgIHRoaXMucGFyZW50Tm9kZS5hcHBlbmRDaGlsZCh0aGlzLmRpdi5ub2RlKCkpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXBwbHkgYSBzdHlsZSB0byB0aGUgYnV0dG9uIGRpdi5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB2XG4gICAgICogQHJldHVybnMge3RoaXN9XG4gICAgICovXG4gICAgc3R5bGUoaywgdikge1xuICAgICAgICB0aGlzLmRpdi5zdHlsZShrLCB2KVxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cbn1cbiIsImltcG9ydCB7IEJ1dHRvbiB9IGZyb20gJy4vQnV0dG9uLmpzJ1xuXG4vKipcbiAqIEJ1dHRvbiBmb3IgdG9nZ2xpbmcgZnVsbHNjcmVlbiBtb2RlXG4gKlxuICogQG1vZHVsZSBidXR0b25cbiAqIEBhdXRob3IgSm9zZXBoIERhdmllcywgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIEZ1bGxzY3JlZW5CdXR0b24gZXh0ZW5kcyBCdXR0b24ge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzXG4gICAgICogb3B0cy5wYXJlbnROb2RlIC0gdGhlIG5vZGUgdGhhdCB0aGUgYnV0dG9uIGlzIGFwcGVuZGVkIHRvXG4gICAgICogb3B0cy5jYW52YXMgLSB0aGUgZ3JpZHZpeiBjYW52YXNcbiAgICAgKiBvcHRzLmlkXG4gICAgICogb3B0cy50aXRsZSAtIEhUTUwgdGl0bGUgYXR0cmlidXRlXG4gICAgICogb3B0cy5jbGFzcyAtIGNzcyBjbGFzc1xuICAgICAqIG9wdHMub25DbGlja0Z1bmN0aW9uXG4gICAgICogb3B0cy54IC0geCBwb3NpdGlvbiBvZiB0aGUgYnV0dG9uXG4gICAgICogb3B0cy55IC0geSBwb3NpdGlvbiBvZiB0aGUgYnV0dG9uXG4gICAgICovXG5cbiAgICAvLyBkZWZhdWx0IHN0YXRlXG4gICAgaXNGdWxsc2NyZWVuID0gZmFsc2VcblxuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cylcblxuICAgICAgICAvLyBhcHBlbmQgZnVsbHNjcmVlbiBpY29uIHRvIGJ1dHRvbiBjb250YWluZXJcbiAgICAgICAgdGhpcy5kaXYubm9kZSgpLmlubmVySFRNTCA9IGBcbiAgICAgICAgPHN2Z1xuICAgICAgICAgICAgc3R5bGU9XCJoZWlnaHQ6IDEuMnJlbTsgd2lkdGg6IDEuMnJlbTsgZmlsbDpibGFjazsgbWFyZ2luOjA7XCJcbiAgICAgICAgICAgIGZvY3VzYWJsZT1cImZhbHNlXCJcbiAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxzdmcgZmlsbD1cIiMwMDAwMDBcIiB2aWV3Qm94PVwiMCAwIDk2IDk2XCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgPHRpdGxlLz5cbiAgICAgICAgICAgIDxnPlxuICAgICAgICAgICAgPHBhdGggZD1cIk0zMCwwSDZBNS45OTY2LDUuOTk2NiwwLDAsMCwwLDZWMzBhNiw2LDAsMCwwLDEyLDBWMTJIMzBBNiw2LDAsMCwwLDMwLDBaXCIvPlxuICAgICAgICAgICAgPHBhdGggZD1cIk05MCwwSDY2YTYsNiwwLDAsMCwwLDEySDg0VjMwYTYsNiwwLDAsMCwxMiwwVjZBNS45OTY2LDUuOTk2NiwwLDAsMCw5MCwwWlwiLz5cbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNMzAsODRIMTJWNjZBNiw2LDAsMCwwLDAsNjZWOTBhNS45OTY2LDUuOTk2NiwwLDAsMCw2LDZIMzBhNiw2LDAsMCwwLDAtMTJaXCIvPlxuICAgICAgICAgICAgPHBhdGggZD1cIk05MCw2MGE1Ljk5NjYsNS45OTY2LDAsMCwwLTYsNlY4NEg2NmE2LDYsMCwwLDAsMCwxMkg5MGE1Ljk5NjYsNS45OTY2LDAsMCwwLDYtNlY2NkE1Ljk5NjYsNS45OTY2LDAsMCwwLDkwLDYwWlwiLz5cbiAgICAgICAgICAgIDwvZz5cbiAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICA8L3N2Zz5cbiAgICAgICAgYFxuXG4gICAgICAgIC8vc2F2ZSBpbml0aWFsIG1hcCBkaW1lbnNpb25zXG4gICAgICAgIHRoaXMuZGVmYXVsdEhlaWdodCA9IHRoaXMubWFwLmhcbiAgICAgICAgdGhpcy5kZWZhdWx0V2lkdGggPSB0aGlzLm1hcC53XG5cbiAgICAgICAgLy8gZXZlbnQgaGFuZGxlclxuICAgICAgICB0aGlzLmRpdi5vbignY2xpY2snLCAoZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5vbkNsaWNrRnVuY3Rpb24oZSlcbiAgICAgICAgfSlcbiAgICAgICAgdGhpcy5kaXYub24oJ21vdXNlb3ZlcicsIChlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnN0eWxlKCdiYWNrZ3JvdW5kLWNvbG9yJywgJ2xpZ2h0Z3JleScpXG4gICAgICAgIH0pXG4gICAgICAgIHRoaXMuZGl2Lm9uKCdtb3VzZW91dCcsIChlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnN0eWxlKCdiYWNrZ3JvdW5kLWNvbG9yJywgJyNmZmZmZmYnKVxuICAgICAgICB9KVxuXG4gICAgICAgIC8vc2V0IHBvc2l0aW9uXG4gICAgICAgIGlmIChvcHRzLngpIHtcbiAgICAgICAgICAgIHRoaXMuc3R5bGUoJ2xlZnQnLCBvcHRzLnggKyAncHgnKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zdHlsZSgncmlnaHQnLCAnMTBweCcpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdHMueSkge1xuICAgICAgICAgICAgdGhpcy5zdHlsZSgndG9wJywgb3B0cy55ICsgJ3B4JylcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc3R5bGUoJ3RvcCcsICc5MHB4JylcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uQ2xpY2tGdW5jdGlvbihlKSB7XG4gICAgICAgIGlmICh0aGlzLmlzRnVsbHNjcmVlbikge1xuICAgICAgICAgICAgdGhpcy5jbG9zZUZ1bGxzY3JlZW4odGhpcy5tYXAuY29udGFpbmVyKVxuICAgICAgICAgICAgLy9yZXNpemUgY2FudmFzIHRvIGRlZmF1bHRcbiAgICAgICAgICAgIHRoaXMubWFwLmggPSB0aGlzLmRlZmF1bHRIZWlnaHRcbiAgICAgICAgICAgIHRoaXMubWFwLncgPSB0aGlzLmRlZmF1bHRXaWR0aFxuICAgICAgICAgICAgdGhpcy5tYXAuZ2VvQ2FudmFzLmggPSB0aGlzLmRlZmF1bHRIZWlnaHRcbiAgICAgICAgICAgIHRoaXMubWFwLmdlb0NhbnZhcy53ID0gdGhpcy5kZWZhdWx0V2lkdGhcbiAgICAgICAgICAgIHRoaXMubWFwLmdlb0NhbnZhcy5jYW52YXMuc2V0QXR0cmlidXRlKCd3aWR0aCcsICcnICsgdGhpcy5kZWZhdWx0V2lkdGgpXG4gICAgICAgICAgICB0aGlzLm1hcC5nZW9DYW52YXMuY2FudmFzLnNldEF0dHJpYnV0ZSgnaGVpZ2h0JywgJycgKyB0aGlzLmRlZmF1bHRIZWlnaHQpXG4gICAgICAgICAgICB0aGlzLm1hcC5yZWRyYXcoKVxuICAgICAgICAgICAgdGhpcy5pc0Z1bGxzY3JlZW4gPSBmYWxzZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5vcGVuRnVsbHNjcmVlbih0aGlzLm1hcC5jb250YWluZXIpXG4gICAgICAgICAgICAvL3Jlc2l6ZSBjYW52YXMgdG8gZnVsbHNjcmVlblxuICAgICAgICAgICAgdGhpcy5tYXAuaCA9IHdpbmRvdy5zY3JlZW4uaGVpZ2h0XG4gICAgICAgICAgICB0aGlzLm1hcC53ID0gd2luZG93LnNjcmVlbi53aWR0aFxuICAgICAgICAgICAgdGhpcy5pc0Z1bGxzY3JlZW4gPSB0cnVlXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiBPcGVuIGZ1bGxzY3JlZW4gKi9cbiAgICBvcGVuRnVsbHNjcmVlbihlbGVtKSB7XG4gICAgICAgIGlmIChlbGVtLnJlcXVlc3RGdWxsc2NyZWVuKSB7XG4gICAgICAgICAgICBlbGVtLnJlcXVlc3RGdWxsc2NyZWVuKClcbiAgICAgICAgfSBlbHNlIGlmIChlbGVtLndlYmtpdFJlcXVlc3RGdWxsc2NyZWVuKSB7XG4gICAgICAgICAgICAvKiBTYWZhcmkgKi9cbiAgICAgICAgICAgIGVsZW0ud2Via2l0UmVxdWVzdEZ1bGxzY3JlZW4oKVxuICAgICAgICB9IGVsc2UgaWYgKGVsZW0ubXNSZXF1ZXN0RnVsbHNjcmVlbikge1xuICAgICAgICAgICAgLyogSUUxMSAqL1xuICAgICAgICAgICAgZWxlbS5tc1JlcXVlc3RGdWxsc2NyZWVuKClcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qIENsb3NlIGZ1bGxzY3JlZW4gKi9cbiAgICBjbG9zZUZ1bGxzY3JlZW4oKSB7XG4gICAgICAgIGlmIChkb2N1bWVudC5leGl0RnVsbHNjcmVlbikge1xuICAgICAgICAgICAgZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVxuICAgICAgICB9IGVsc2UgaWYgKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKSB7XG4gICAgICAgICAgICAvKiBTYWZhcmkgKi9cbiAgICAgICAgICAgIGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKClcbiAgICAgICAgfSBlbHNlIGlmIChkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKSB7XG4gICAgICAgICAgICAvKiBJRTExICovXG4gICAgICAgICAgICBkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKClcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCB7IEJ1dHRvbiB9IGZyb20gJy4vQnV0dG9uLmpzJ1xuXG4vKipcbiAqIEJ1dHRvbiBmb3IgdG9nZ2xpbmcgZnVsbHNjcmVlbiBtb2RlXG4gKlxuICogQG1vZHVsZSBidXR0b25cbiAqIEBhdXRob3IgSm9zZXBoIERhdmllcywgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIFpvb21CdXR0b25zIGV4dGVuZHMgQnV0dG9uIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0c1xuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cylcblxuICAgICAgICB0aGlzLm9uWm9vbSA9IG9wdHMub25ab29tIC8vIGN1c3RvbSB1c2VyIGV2ZW50IGhhbmRsZXJcbiAgICAgICAgdGhpcy5kZWx0YSA9IG9wdHMuZGVsdGEgfHwgMC4yXG5cbiAgICAgICAgLy8gQ3JlYXRlIHpvb20gaW4gYnV0dG9uXG4gICAgICAgIHRoaXMuem9vbUluQnRuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpXG4gICAgICAgIHRoaXMuem9vbUluQnRuLmlkID0gJ3pvb20taW4nXG4gICAgICAgIHRoaXMuem9vbUluQnRuLmNsYXNzTmFtZSA9ICdncmlkdml6LXpvb20tYnV0dG9uJ1xuICAgICAgICB0aGlzLnpvb21JbkJ0bi50aXRsZSA9ICdab29tIGluJ1xuICAgICAgICB0aGlzLnpvb21JbkJ0bi50ZXh0Q29udGVudCA9ICcrJ1xuICAgICAgICB0aGlzLnpvb21JbkJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnpvb21JbihlKVxuICAgICAgICB9KVxuICAgICAgICB0aGlzLnpvb21JbkJ0bi5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW92ZXInLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnpvb21JbkJ0bi5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAnbGlnaHRncmV5J1xuICAgICAgICB9KVxuICAgICAgICB0aGlzLnpvb21JbkJ0bi5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW91dCcsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuem9vbUluQnRuLnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICcjZmZmZmZmJ1xuICAgICAgICB9KVxuXG4gICAgICAgIC8vIENyZWF0ZSB6b29tIG91dCBidXR0b25cbiAgICAgICAgdGhpcy56b29tT3V0QnRuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpXG4gICAgICAgIHRoaXMuem9vbU91dEJ0bi5pZCA9ICd6b29tLW91dCdcbiAgICAgICAgdGhpcy56b29tT3V0QnRuLmNsYXNzTmFtZSA9ICdncmlkdml6LXpvb20tYnV0dG9uJ1xuICAgICAgICB0aGlzLnpvb21PdXRCdG4udGl0bGUgPSAnWm9vbSBvdXQnXG4gICAgICAgIHRoaXMuem9vbU91dEJ0bi50ZXh0Q29udGVudCA9ICctJ1xuICAgICAgICB0aGlzLnpvb21PdXRCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy56b29tT3V0KGUpXG4gICAgICAgIH0pXG4gICAgICAgIHRoaXMuem9vbU91dEJ0bi5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW92ZXInLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnpvb21PdXRCdG4uc3R5bGUuYmFja2dyb3VuZENvbG9yID0gJ2xpZ2h0Z3JleSdcbiAgICAgICAgfSlcbiAgICAgICAgdGhpcy56b29tT3V0QnRuLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlb3V0JywgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy56b29tT3V0QnRuLnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICcjZmZmZmZmJ1xuICAgICAgICB9KVxuXG4gICAgICAgIC8vIFNldCBjb21tb24gc3R5bGVzIGZvciBidXR0b25zXG4gICAgICAgIGNvbnN0IGJ1dHRvbnMgPSBbdGhpcy56b29tSW5CdG4sIHRoaXMuem9vbU91dEJ0bl1cbiAgICAgICAgYnV0dG9ucy5mb3JFYWNoKChidG4sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBidG4uc3R5bGUuYWxpZ25JdGVtcyA9ICdjZW50ZXInXG4gICAgICAgICAgICBidG4uc3R5bGUuanVzdGlmeUNvbnRlbnQgPSAnY2VudGVyJ1xuICAgICAgICAgICAgYnRuLnN0eWxlLmRpc3BsYXkgPSAnZmxleCdcbiAgICAgICAgICAgIGJ0bi5zdHlsZS5ib3JkZXIgPSAnbm9uZSdcbiAgICAgICAgICAgIGJ0bi5zdHlsZS5jb2xvciA9ICdibGFjaydcbiAgICAgICAgICAgIGJ0bi5zdHlsZS50ZXh0QWxpZ24gPSAnY2VudGVyJ1xuICAgICAgICAgICAgYnRuLnN0eWxlLnRleHREZWNvcmF0aW9uID0gJ25vbmUnXG4gICAgICAgICAgICBidG4uc3R5bGUucGFkZGluZyA9ICc0cHgnXG4gICAgICAgICAgICBidG4uc3R5bGUuZm9udFNpemUgPSAnMjRweCdcbiAgICAgICAgICAgIGJ0bi5zdHlsZS5mb250V2VpZ2h0ID0gJ2JvbGQnXG4gICAgICAgICAgICBidG4uc3R5bGUudXNlclNlbGVjdCA9ICdub25lJ1xuICAgICAgICAgICAgYnRuLnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICcjZmZmZmZmJ1xuICAgICAgICAgICAgaWYgKGluZGV4ID09PSAwKSBidG4uc3R5bGUuYm9yZGVyQm90dG9tID0gJzFweCBzb2xpZCBncmV5JyAvLyBab29tIGluIGJ1dHRvbiBvbmx5XG4gICAgICAgIH0pXG5cbiAgICAgICAgLy8gVW5zZXQgcGFyZW50IGNsYXNzIGhlaWdodCBhbmQgZGlzcGxheSBmb3IgZHVhbCBidXR0b25zXG4gICAgICAgIHRoaXMuc3R5bGUoJ2hlaWdodCcsICd1bnNldCcpXG4gICAgICAgIHRoaXMuc3R5bGUoJ2Rpc3BsYXknLCAndW5zZXQnKVxuXG4gICAgICAgIC8vIFNldCBwb3NpdGlvblxuICAgICAgICBpZiAob3B0cy54KSB7XG4gICAgICAgICAgICB0aGlzLnN0eWxlKCdsZWZ0Jywgb3B0cy54ICsgJ3B4JylcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc3R5bGUoJ3JpZ2h0JywgJzEwcHgnKVxuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRzLnkpIHtcbiAgICAgICAgICAgIHRoaXMuc3R5bGUoJ3RvcCcsIG9wdHMueSArICdweCcpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnN0eWxlKCd0b3AnLCAnMTBweCcpXG4gICAgICAgIH1cblxuICAgICAgICAvLyBBcHBlbmQgYnV0dG9ucyB0byB0aGUgY29udGFpbmVyXG4gICAgICAgIHRoaXMuZGl2Lm5vZGUoKS5hcHBlbmRDaGlsZCh0aGlzLnpvb21JbkJ0bilcbiAgICAgICAgdGhpcy5kaXYubm9kZSgpLmFwcGVuZENoaWxkKHRoaXMuem9vbU91dEJ0bilcbiAgICB9XG5cbiAgICAvKiBab29tIGluICovXG4gICAgem9vbUluKGUpIHtcbiAgICAgICAgdGhpcy5tYXAuc2V0Wm9vbSh0aGlzLm1hcC5nZXRab29tKCkgKiAoMSAtIHRoaXMuZGVsdGEpKS5yZWRyYXcoKVxuICAgICAgICBpZiAodGhpcy5vblpvb20pIHRoaXMub25ab29tKGUpXG4gICAgICAgIGlmICh0aGlzLm1hcC5nZW9DYW52YXMub25ab29tRnVuKSB0aGlzLm1hcC5nZW9DYW52YXMub25ab29tRnVuKGUpXG4gICAgfVxuXG4gICAgLyogWm9vbSBvdXQgKi9cbiAgICB6b29tT3V0KGUpIHtcbiAgICAgICAgdGhpcy5tYXAuc2V0Wm9vbSh0aGlzLm1hcC5nZXRab29tKCkgKiAoMSArIHRoaXMuZGVsdGEpKS5yZWRyYXcoKVxuICAgICAgICBpZiAodGhpcy5vblpvb20pIHRoaXMub25ab29tKGUpXG4gICAgICAgIGlmICh0aGlzLm1hcC5nZW9DYW52YXMub25ab29tRnVuKSB0aGlzLm1hcC5nZW9DYW52YXMub25ab29tRnVuKGUpXG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG4vKipcbiAqIEEgZ3JpZCBjZWxsLlxuICogQHR5cGVkZWYge3t4OiBudW1iZXIsIHk6IG51bWJlcn19IENlbGwgKi9cblxuLyoqXG4gKiBBIGRhdGFzZXQgY29tcG9uZW50LCBvZiBncmlkIGNlbGxzLlxuICogQGFic3RyYWN0XG4gKlxuICogQG1vZHVsZSBjb3JlXG4gKiBAYXV0aG9yIEpvc2VwaCBEYXZpZXMsIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBEYXRhc2V0IHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vTWFwLmpzXCIpLk1hcH0gbWFwIFRoZSBtYXAuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBUaGUgVVJMIG9mIHRoZSBkYXRhc2V0LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByZXNvbHV0aW9uIFRoZSBkYXRhc2V0IHJlc29sdXRpb24sIGluIHRoZSBDUlMgZ2VvZ3JhcGhpY2FsIHVuaXQuXG4gICAgICogQHBhcmFtIHt7cHJlcHJvY2Vzcz86ZnVuY3Rpb24oQ2VsbCk6Ym9vbGVhbiwgbWl4ZWRSZXNvbHV0aW9uPzpmdW5jdGlvbihDZWxsKTpudW1iZXJ9fSBvcHRzXG4gICAgICogQGFic3RyYWN0XG4gICAgICovXG4gICAgY29uc3RydWN0b3IobWFwLCB1cmwsIHJlc29sdXRpb24sIG9wdHMgPSB7fSkge1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIG1hcC5cbiAgICAgICAgICogQHByb3RlY3RlZFxuICAgICAgICAgKiBAdHlwZSB7aW1wb3J0KFwiLi9NYXAuanNcIikuTWFwfSAqL1xuICAgICAgICB0aGlzLm1hcCA9IG1hcFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgdXJsIG9mIHRoZSBkYXRhc2V0LlxuICAgICAgICAgKiBAcHJvdGVjdGVkXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgICAgIHRoaXMudXJsID0gdXJsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBkYXRhc2V0IHJlc29sdXRpb24gaW4gZ2VvZ3JhcGhpY2FsIHVuaXQuXG4gICAgICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgICAgICogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgdGhpcy5yZXNvbHV0aW9uID0gcmVzb2x1dGlvblxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbiBjYXNlIHRoZSBkYXRhc2V0IGlzIGEgZGF0YXNldCB3aXRoIGNlbGxzIGhhdmluZyBkaWZmZXJlbnQgcmVzb2x1dGlvbixcbiAgICAgICAgICogdGhpcyBpcyB0aGUgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSByZXNvbHV0aW9uIG9mIGVhY2ggY2VsbC5cbiAgICAgICAgICogQHByb3RlY3RlZFxuICAgICAgICAgKiBAdHlwZSB7KGZ1bmN0aW9uKENlbGwpOm51bWJlciApfCB1bmRlZmluZWQgfSAqL1xuICAgICAgICB0aGlzLm1peGVkUmVzb2x1dGlvbiA9IG9wdHMubWl4ZWRSZXNvbHV0aW9uXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgcHJlcHJvY2VzcyB0byBydW4gb24gZWFjaCBjZWxsIGFmdGVyIGxvYWRpbmcuIEl0IGNhbiBiZSB1c2VkIHRvIGFwcGx5IHNvbWUgc3BlY2lmaWMgdHJlYXRtZW50IGJlZm9yZSBvciBjb21wdXRlIGEgbmV3IGNvbHVtbi4gQW5kIGFsc28gdG8gZGV0ZXJtaW5lIHdoaWNoIGNlbGxzIHRvIGtlZXAgYWZ0ZXIgbG9hZGluZy5cbiAgICAgICAgICogQHR5cGUgeyhmdW5jdGlvbihDZWxsKTpib29sZWFuICl8IHVuZGVmaW5lZCB9ICovXG4gICAgICAgIHRoaXMucHJlcHJvY2VzcyA9IG9wdHMucHJlcHJvY2VzcyB8fCB1bmRlZmluZWRcblxuICAgICAgICAvKiogVGhlIGNlbGxzIHdpdGhpbiB0aGUgdmlld1xuICAgICAgICAgKiBAcHJvdGVjdGVkXG4gICAgICAgICAqIEB0eXBlIHtBcnJheS48Q2VsbD59ICovXG4gICAgICAgIHRoaXMuY2VsbHNWaWV3Q2FjaGUgPSBbXVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlcXVlc3QgZGF0YSB3aXRoaW4gYSBnZW9ncmFwaGljIGVudmVsb3BlLlxuICAgICAqXG4gICAgICogQGFic3RyYWN0XG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuL0dlb0NhbnZhc1wiKS5FbnZlbG9wZXx1bmRlZmluZWR9IGV4dEdlb1xuICAgICAqIEByZXR1cm5zIHt0aGlzfVxuICAgICAqL1xuICAgIGdldERhdGEoZXh0R2VvID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIGdldERhdGEgbm90IGltcGxlbWVudGVkLicpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmlsbCB0aGUgdmlldyBjYWNoZSB3aXRoIGFsbCBjZWxscyB3aGljaCBhcmUgd2l0aGluIGEgZ2VvZ3JhcGhpY2FsIGVudmVsb3BlLlxuICAgICAqIEBhYnN0cmFjdFxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9HZW9DYW52YXNcIikuRW52ZWxvcGV9IGV4dEdlbyBUaGUgdmlldyBnZW9ncmFwaGljYWwgZW52ZWxvcGUuXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgdXBkYXRlVmlld0NhY2hlKGV4dEdlbykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCB1cGRhdGVWaWV3Q2FjaGUgbm90IGltcGxlbWVudGVkLicpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGEgY2VsbCB1bmRlciBhIGdpdmVuIHBvc2l0aW9uLCBpZiBhbnkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3t4Om51bWJlcix5Om51bWJlcn19IHBvc0dlb1xuICAgICAqIEBwYXJhbSB7QXJyYXkuPENlbGw+fSBjZWxscyBTb21lIGNlbGxzIGZyb20gdGhlIGRhdGFzZXQgKGEgc3Vic2V0IGlmIG5lY2Vzc2FyeSwgdXN1YWxseSB0aGUgdmlldyBjYWNoZSkuXG4gICAgICogQHJldHVybnMge0NlbGx8dW5kZWZpbmVkfVxuICAgICAqL1xuICAgIGdldENlbGxGcm9tUG9zaXRpb24ocG9zR2VvLCBjZWxscykge1xuICAgICAgICAvL2NvbXB1dGUgY2FuZGlkYXRlIGNlbGwgcG9zaXRpb25cbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgIC8vY29uc3QgciA9IHRoaXMuZ2V0UmVzb2x1dGlvbigpXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICAvL2NvbnN0IGNlbGxYID0gciAqIE1hdGguZmxvb3IocG9zR2VvLnggLyByKVxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgLy9jb25zdCBjZWxsWSA9IHIgKiBNYXRoLmZsb29yKHBvc0dlby55IC8gcilcblxuICAgICAgICAvKi9nZXQgY2VsbFxuICAgICAgICBmb3IgKGNvbnN0IGNlbGwgb2YgY2VsbHMpIHtcbiAgICAgICAgICAgIGlmIChjZWxsLnggIT0gY2VsbFgpIGNvbnRpbnVlXG4gICAgICAgICAgICBpZiAoY2VsbC55ICE9IGNlbGxZKSBjb250aW51ZVxuICAgICAgICAgICAgcmV0dXJuIGNlbGxcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkKi9cblxuICAgICAgICAvL3JhcmUgY2FzZSBvZiBtaXhlZCByZXNvbHV0aW9uIGRhdGFzZXRcbiAgICAgICAgaWYgKHRoaXMubWl4ZWRSZXNvbHV0aW9uKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGMgb2YgY2VsbHMpIHtcbiAgICAgICAgICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgICAgICAgICBjb25zdCByID0gK3RoaXMubWl4ZWRSZXNvbHV0aW9uKGMpXG4gICAgICAgICAgICAgICAgaWYgKHBvc0dlby54IDwgYy54KSBjb250aW51ZVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGMueCArIHIgPCBwb3NHZW8ueCkgY29udGludWVcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChwb3NHZW8ueSA8IGMueSkgY29udGludWVcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChjLnkgKyByIDwgcG9zR2VvLnkpIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgZWxzZSByZXR1cm4gY1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgICB9XG5cbiAgICAgICAgLy9jb21tb24gY2FzZVxuXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICBjb25zdCByID0gdGhpcy5nZXRSZXNvbHV0aW9uKClcbiAgICAgICAgZm9yIChjb25zdCBjZWxsIG9mIGNlbGxzKSB7XG4gICAgICAgICAgICBpZiAocG9zR2VvLnggPCBjZWxsLngpIGNvbnRpbnVlXG4gICAgICAgICAgICBlbHNlIGlmIChjZWxsLnggKyByIDwgcG9zR2VvLngpIGNvbnRpbnVlXG4gICAgICAgICAgICBlbHNlIGlmIChwb3NHZW8ueSA8IGNlbGwueSkgY29udGludWVcbiAgICAgICAgICAgIGVsc2UgaWYgKGNlbGwueSArIHIgPCBwb3NHZW8ueSkgY29udGludWVcbiAgICAgICAgICAgIGVsc2UgcmV0dXJuIGNlbGxcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgfVxuXG4gICAgLy9nZXR0ZXJzIGFuZCBzZXR0ZXJzXG5cbiAgICAvKiogQHJldHVybnMge251bWJlcn0gKi9cbiAgICBnZXRSZXNvbHV0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXNvbHV0aW9uXG4gICAgfVxuXG4gICAgLyoqIEByZXR1cm5zIHtBcnJheS48Q2VsbD59ICovXG4gICAgZ2V0Vmlld0NhY2hlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jZWxsc1ZpZXdDYWNoZVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgcmVsZXZhbnQgZGF0YXNldCBmb3IgYSBzcGVjaWZpZWQgem9vbS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gelxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBtaW5QaXhlbHNQZXJDZWxsXG4gICAgICogQHJldHVybnMge0RhdGFzZXR8dW5kZWZpbmVkfVxuICAgICAqICovXG4gICAgZ2V0RGF0YXNldCh6LCBtaW5QaXhlbHNQZXJDZWxsKSB7XG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG4vKipcbiAqIFRoaXMgaXMgYW4gYWJzdHJhY3QgY2xhc3MgdXNlZCB0byBncm91cCBlbGVtZW50cyBzaGFyZWQgYmV0d2VlbiBMYXllciBhbmQgU3R5bGUgY2xhc3Nlcy5cbiAqXG4gKiBAYWJzdHJhY3RcbiAqIEBtb2R1bGUgY29yZVxuICogQGF1dGhvciBKb3NlcGggRGF2aWVzLCBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgRHJhd2FibGUge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXG4gICAgICovXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHNwZWNpZnlpbmcgaWYgdGhlIGVsZW1lbnQgc2hvdWxkIGJlIHZpc2libGUgb3Igbm90LlxuICAgICAgICAgKiBUaGUgZnVuY3Rpb24gcGFyYW1ldGVyIGlzIHRoZSB6b29tIGxldmVsLlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyKTpib29sZWFufSAqL1xuICAgICAgICB0aGlzLnZpc2libGUgPSBvcHRzLnZpc2libGVcblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIGFscGhhICh0cmFuc3BhcmVuY3kvb3BhY2l0eSksIGJldHdlZW4gMC4wIChmdWxseSB0cmFuc3BhcmVudCkgYW5kIDEuMCAoZnVsbHkgb3BhcXVlKS5cbiAgICAgICAgICogIFRoZSBmdW5jdGlvbiBwYXJhbWV0ZXIgaXMgdGhlIHpvb20gbGV2ZWwuXG4gICAgICAgICAqIChzZWUgQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEOiBnbG9iYWxBbHBoYSBwcm9wZXJ0eSlcbiAgICAgICAgICogQHR5cGUgeyhmdW5jdGlvbihudW1iZXIpOm51bWJlcil8dW5kZWZpbmVkfSAqL1xuICAgICAgICB0aGlzLmFscGhhID0gb3B0cy5hbHBoYVxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgYmxlbmQgb3BlcmF0aW9uLlxuICAgICAgICAgKiBUaGUgZnVuY3Rpb24gcGFyYW1ldGVyIGlzIHRoZSB6b29tIGxldmVsLlxuICAgICAgICAgKiAoc2VlIENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRDogZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uIHByb3BlcnR5KVxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyKTpHbG9iYWxDb21wb3NpdGVPcGVyYXRpb259ICovXG4gICAgICAgIHRoaXMuYmxlbmRPcGVyYXRpb24gPSBvcHRzLmJsZW5kT3BlcmF0aW9uIHx8ICgoeikgPT4gJ3NvdXJjZS1vdmVyJylcblxuICAgICAgICAvKiogQHR5cGUgeyhmdW5jdGlvbihudW1iZXIpOnN0cmluZyl8dW5kZWZpbmVkfSAqL1xuICAgICAgICB0aGlzLmZpbHRlckNvbG9yID0gb3B0cy5maWx0ZXJDb2xvciAvLyAoeikgPT4gXCIjZWVlN1wiXG4gICAgICAgIC8qKiBAdHlwZSB7KGZ1bmN0aW9uKG51bWJlcik6R2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9ufFwibm9uZVwiKXx1bmRlZmluZWR9ICovXG4gICAgICAgIHRoaXMuZmlsdGVyQmxlbmRPcGVyYXRpb24gPSBvcHRzLmZpbHRlckJsZW5kT3BlcmF0aW9uIC8vICh6KSA9PiBcIm11bHRpcGx5XCJcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEcmF3IGxheWVyIGZpbHRlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9HZW9DYW52YXMuanNcIikuR2VvQ2FudmFzfSBnZW9DYW52YXMgVGhlIGNhbnZhcyB3aGVyZSB0byBkcmF3IHRoZSBsYXllci5cbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKiBAYWJzdHJhY3RcbiAgICAgKi9cbiAgICBkcmF3RmlsdGVyKGdlb0NhbnZhcykge1xuICAgICAgICAvL25vIGZpbHRlcjogcmV0dXJuXG4gICAgICAgIGlmICghdGhpcy5maWx0ZXJDb2xvcikgcmV0dXJuXG5cbiAgICAgICAgLy9nZXQgZmlsdGVyXG4gICAgICAgIGNvbnN0IGZjID0gdGhpcy5maWx0ZXJDb2xvcihnZW9DYW52YXMudmlldy56KVxuXG4gICAgICAgIC8vbm8gZmlsdGVyOiByZXR1cm5cbiAgICAgICAgaWYgKCFmYyB8fCBmYyA9PSAnbm9uZScpIHJldHVyblxuXG4gICAgICAgIC8vZHJhdyBmaWx0ZXJcblxuICAgICAgICAvL3NldCBjb2xvclxuICAgICAgICBnZW9DYW52YXMub2Zmc2NyZWVuQ3R4LmZpbGxTdHlsZSA9IGZjXG5cbiAgICAgICAgLy9zYXZlIGJsZW5kIG1vZGUgYW5kIHNldCBuZXcsIGlmIGFueVxuICAgICAgICBsZXQgYm8gPSB1bmRlZmluZWQsIGJvMiA9IHVuZGVmaW5lZFxuICAgICAgICBpZiAodGhpcy5maWx0ZXJCbGVuZE9wZXJhdGlvbikge1xuICAgICAgICAgICAgYm8gPSBnZW9DYW52YXMub2Zmc2NyZWVuQ3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvblxuICAgICAgICAgICAgYm8yID0gdGhpcy5maWx0ZXJCbGVuZE9wZXJhdGlvbihnZW9DYW52YXMudmlldy56KVxuICAgICAgICB9XG4gICAgICAgIGlmIChibzIgJiYgYm8yICE9IFwibm9uZVwiKSBnZW9DYW52YXMub2Zmc2NyZWVuQ3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9IGJvMjtcblxuICAgICAgICAvL2RyYXdcbiAgICAgICAgZ2VvQ2FudmFzLm9mZnNjcmVlbkN0eC5maWxsUmVjdCgwLCAwLCBnZW9DYW52YXMudywgZ2VvQ2FudmFzLmgpXG5cbiAgICAgICAgLy9yZXN0b3JlIGJsZW5kIG1vZGVcbiAgICAgICAgaWYgKGJvKSBnZW9DYW52YXMub2Zmc2NyZWVuQ3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9IGJvO1xuXG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG4vKiogQHR5cGVkZWYgeyB7eE1pbjogbnVtYmVyLCB4TWF4OiBudW1iZXIsIHlNaW46IG51bWJlciwgeU1heDogbnVtYmVyfSB9IEVudmVsb3BlICovXG5cbi8qKlxuICogQSB2aWV3c2hlZC5cbiAqIEB0eXBlZGVmIHt7eDogbnVtYmVyLCB5OiBudW1iZXIsIHo6IG51bWJlcn19IFZpZXcgKi9cblxuaW1wb3J0IHsgc2VsZWN0IH0gZnJvbSAnZDMtc2VsZWN0aW9uJ1xuaW1wb3J0IHsgem9vbSBhcyBkM3pvb20sIHpvb21JZGVudGl0eSB9IGZyb20gJ2QzLXpvb20nXG5cbi8qKlxuICogQSBIVE1MIGNhbnZhcyBmb3IgZ2VvIGRhdGEgZGlzcGxheSwgZW5oYW5jZWQgd2l0aCB6b29tIGFuZCBwYW4gY2FwYWJpbGl0aWVzLlxuICpcbiAqIEBtb2R1bGUgY29yZVxuICogQGF1dGhvciBKb3NlcGggRGF2aWVzLCBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgR2VvQ2FudmFzIHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKiBAcGFyYW0ge0hUTUxDYW52YXNFbGVtZW50fSBjYW52YXNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geCBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSB2aWV3XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHkgVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgdmlld1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB6IFRoZSB6b29tIGxldmVsIG9mIHRoZSB2aWV3IChwaXhlbCBzaXplLCBpbiBncm91bmQgbSlcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb3B0c1xuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGNhbnZhcywgeCA9IDAsIHkgPSAwLCB6ID0gMCwgb3B0cyA9IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLm9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLyoqIEB0eXBlIHtIVE1MQ2FudmFzRWxlbWVudH0gKi9cbiAgICAgICAgdGhpcy5jYW52YXMgPSBjYW52YXNcbiAgICAgICAgdGhpcy5jYW52YXMuc3R5bGUuY3Vyc29yID0gJ2dyYWInICAgICAgICAgIC8vIGRlZmF1bHQgc2hvd24gd2hlbiBob3ZlclxuXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLncgPSB0aGlzLmNhbnZhcy5vZmZzZXRXaWR0aFxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgdGhpcy5oID0gdGhpcy5jYW52YXMub2Zmc2V0SGVpZ2h0XG5cbiAgICAgICAgLy8gQWRqdXN0IGNhbnZhcyB3aWR0aCBhbmQgaGVpZ2h0IGJhc2VkIG9uIGRldmljZSBwaXhlbCByYXRpb1xuICAgICAgICAvL2NvbnN0IGRwciA9IHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvIHx8IDEgLy8gR2V0IHRoZSBkZXZpY2UgcGl4ZWwgcmF0aW9cbiAgICAgICAgLy90aGlzLmNhbnZhcy53aWR0aCA9IHRoaXMudyAqIGRwciAvLyBTZXQgY2FudmFzIHdpZHRoXG4gICAgICAgIC8vXFxzdGhpcy5jYW52YXMuaGVpZ2h0ID0gdGhpcy5oICogZHByIC8vIFNldCBjYW52YXMgaGVpZ2h0XG5cbiAgICAgICAgLy8gQ3JlYXRlIG9mZnNjcmVlbiBjYW52YXMgZm9yIGRyYXdpbmcgb3BlcmF0aW9uc1xuICAgICAgICB0aGlzLm9mZnNjcmVlbkNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpXG4gICAgICAgIHRoaXMub2Zmc2NyZWVuQ2FudmFzLndpZHRoID0gdGhpcy53XG4gICAgICAgIHRoaXMub2Zmc2NyZWVuQ2FudmFzLmhlaWdodCA9IHRoaXMuaFxuXG4gICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuY2FudmFzLmdldENvbnRleHQoJzJkJylcbiAgICAgICAgY29uc3Qgb2Zmc2NyZWVuQ3R4ID0gdGhpcy5vZmZzY3JlZW5DYW52YXMuZ2V0Q29udGV4dCgnMmQnKVxuICAgICAgICBpZiAoIWN0eCkgdGhyb3cgJ0ltcG9zc2libGUgdG8gY3JlYXRlIGNhbnZhcyAyRCBjb250ZXh0J1xuICAgICAgICBpZiAoIW9mZnNjcmVlbkN0eCkgdGhyb3cgJ0ltcG9zc2libGUgdG8gY3JlYXRlIGNhbnZhcyAyRCBjb250ZXh0J1xuICAgICAgICAvKipAdHlwZSB7Q2FudmFzUmVuZGVyaW5nQ29udGV4dDJEfSAqL1xuICAgICAgICB0aGlzLmN0eCA9IGN0eFxuICAgICAgICB0aGlzLm9mZnNjcmVlbkN0eCA9IG9mZnNjcmVlbkN0eFxuICAgICAgICAvL3RoaXMuY3R4LnNjYWxlKGRwciwgZHByKSAvLyBTY2FsZSB0aGUgY29udGV4dFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiB6OiBwaXhlbCBzaXplLCBpbiBtL3BpeFxuICAgICAgICAgKiBAdHlwZSB7Vmlld30gICovXG4gICAgICAgIHRoaXMudmlldyA9IHsgeDogeCwgeTogeSwgejogeiB9XG5cbiAgICAgICAgLyoqIEJhY2tncm91bmQgY29sb3IuXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuYmFja2dyb3VuZENvbG9yID0gb3B0cy5iYWNrZ3JvdW5kQ29sb3IgfHwgJ3doaXRlJ1xuXG4gICAgICAgIC8qKiBAdHlwZSB7ZnVuY3Rpb24ob2JqZWN0fHVuZGVmaW5lZCk6dm9pZH0gKi9cbiAgICAgICAgdGhpcy5vblpvb21TdGFydEZ1biA9IG9wdHMub25ab29tU3RhcnRGdW5cblxuICAgICAgICAvKiogQHR5cGUge2Z1bmN0aW9uKG9iamVjdHx1bmRlZmluZWQpOnZvaWR9ICovXG4gICAgICAgIHRoaXMub25ab29tRW5kRnVuID0gb3B0cy5vblpvb21FbmRGdW5cblxuICAgICAgICAvKiogQHR5cGUge2Z1bmN0aW9uKG9iamVjdHx1bmRlZmluZWQpOnZvaWR9ICovXG4gICAgICAgIHRoaXMub25ab29tRnVuID0gb3B0cy5vblpvb21GdW5cblxuICAgICAgICAvL2N1cnJlbnQgZXh0ZW50XG4gICAgICAgIC8qKiBAdHlwZSB7RW52ZWxvcGV9ICovXG4gICAgICAgIHRoaXMuZXh0R2VvID0geyB4TWluOiBOYU4sIHhNYXg6IE5hTiwgeU1pbjogTmFOLCB5TWF4OiBOYU4gfVxuICAgICAgICB0aGlzLnVwZGF0ZUV4dGVudEdlbygpXG5cbiAgICAgICAgLy9yZWx5IG9uIGQzIGZvciB6b29tXG4gICAgICAgIGlmICghb3B0cy5kaXNhYmxlWm9vbSkge1xuICAgICAgICAgICAgbGV0IHRQID0gem9vbUlkZW50aXR5XG4gICAgICAgICAgICBjb25zdCB6ID0gZDN6b29tKClcbiAgICAgICAgICAgICAgICAvLyB0byBtYWtlIHRoZSB6b29taW5nIGEgYml0IGZhc3RlclxuICAgICAgICAgICAgICAgIC53aGVlbERlbHRhKChlKSA9PiAtZS5kZWx0YVkgKiAoZS5kZWx0YU1vZGUgPT09IDEgPyAwLjA3IDogZS5kZWx0YU1vZGUgPyAxIDogMC4wMDQpKVxuICAgICAgICAgICAgICAgIC5vbignem9vbScsIChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzWm9vbWluZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHQgPSBlLnRyYW5zZm9ybVxuICAgICAgICAgICAgICAgICAgICBjb25zdCB6b29tRmFjdG9yID0gdFAuayAvIHQua1xuICAgICAgICAgICAgICAgICAgICBpZiAoem9vbUZhY3RvciA9PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvL3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZHggPSB0UC54IC0gdC54XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkeSA9IHRQLnkgLSB0LnlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlQYW4oZHggKiB0aGlzLnZpZXcueiwgLWR5ICogdGhpcy52aWV3LnopXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVab29tKGUsIHpvb21GYWN0b3IpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdFAgPSB0XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub25ab29tRnVuKSB0aGlzLm9uWm9vbUZ1bihlKVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLm9uKCdzdGFydCcsIChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHN0YXJ0IG9mIHpvb20gZXZlbnRcbiAgICAgICAgICAgICAgICAgICAgLy8gc2hvdyBncmFiYmluZyBkdXJpbmcgcGFuL3pvb21cbiAgICAgICAgICAgICAgICAgICAgdHJ5IHsgdGhpcy5jYW52YXMuc3R5bGUuY3Vyc29yID0gJ2dyYWJiaW5nJyB9IGNhdGNoIChlcnIpIHsgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc1pvb21pbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAvLyBzYXZlIHRoZSBjdXJyZW50IGNhbnZhcyBzdGF0ZSB0byBrZWVwIG9uc2NyZWVuIGR1cmluZyBwYW4vem9vbSBiZWZvcmUgcmVkcmF3aW5nXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZS5jID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJylcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLmMuc2V0QXR0cmlidXRlKCd3aWR0aCcsICcnICsgdGhpcy53KVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUuYy5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsICcnICsgdGhpcy5oKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUuYy5nZXRDb250ZXh0KCcyZCcpPy5kcmF3SW1hZ2UodGhpcy5jYW52YXMsIDAsIDApXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZS5keCA9IDBcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLmR5ID0gMFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUuZiA9IDFcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub25ab29tU3RhcnRGdW4pIHRoaXMub25ab29tU3RhcnRGdW4oZSlcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5vbignZW5kJywgKGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZW5kIG9mIHBhbi96b29tIGV2ZW50XG4gICAgICAgICAgICAgICAgICAgIC8vIHJlc3RvcmUgY3Vyc29yXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7IHRoaXMuY2FudmFzLnN0eWxlLmN1cnNvciA9ICdncmFiJyB9IGNhdGNoIChlcnIpIHsgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc1pvb21pbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWRyYXcoKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUgPSB7IGM6IG51bGwsIGR4OiAwLCBkeTogMCwgZjogMSB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9uWm9vbUVuZEZ1bikgdGhpcy5vblpvb21FbmRGdW4oZSlcblxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICB6KHNlbGVjdCh0aGlzLmNhbnZhcykpXG5cbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZVpvb20gPSAoZXZlbnQsIHpvb21GYWN0b3IpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBjYW5jZWwgb25nb2luZyBkYXRhIHJlcXVlc3RzXG4gICAgICAgICAgICAgICAgdGhpcy5jYW5jZWxDdXJyZW50UmVxdWVzdHMoKVxuICAgICAgICAgICAgICAgIGNvbnN0IHNlID0gZXZlbnQuc291cmNlRXZlbnRcblxuICAgICAgICAgICAgICAgIGlmIChzZSBpbnN0YW5jZW9mIFdoZWVsRXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy96b29tIGF0IHRoZSBtb3VzZSBwb3NpdGlvblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcGx5Wm9vbShcbiAgICAgICAgICAgICAgICAgICAgICAgIHpvb21GYWN0b3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBpeFRvR2VvWChzZS5vZmZzZXRYKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGl4VG9HZW9ZKHNlLm9mZnNldFkpXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNlIGluc3RhbmNlb2YgVG91Y2hFdmVudCkge1xuICAgICAgICAgICAgICAgICAgICAvL2NvbXB1dGUgYXZlcmFnZSBwb3NpdGlvbiBvZiB0aGUgdG91Y2hlc1xuICAgICAgICAgICAgICAgICAgICBsZXQgdHggPSAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHkgPSAwXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHR0IG9mIHNlLnRhcmdldFRvdWNoZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR4ICs9IHR0LmNsaWVudFhcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5ICs9IHR0LmNsaWVudFlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0eCAvPSBzZS50YXJnZXRUb3VjaGVzLmxlbmd0aFxuICAgICAgICAgICAgICAgICAgICB0eSAvPSBzZS50YXJnZXRUb3VjaGVzLmxlbmd0aFxuXG4gICAgICAgICAgICAgICAgICAgIC8vIEFkanVzdCBmb3IgY29udGFpbmVyJ3Mgb2Zmc2V0XG4gICAgICAgICAgICAgICAgICAgIC8vIHR4IC09IGNvbnRhaW5lclJlY3QubGVmdFxuICAgICAgICAgICAgICAgICAgICAvLyB0eSAtPSBjb250YWluZXJSZWN0LnRvcFxuXG4gICAgICAgICAgICAgICAgICAgIC8vem9vbSBhdCB0aGlzIGF2ZXJhZ2UgcG9zaXRpb25cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hcHBseVpvb20oem9vbUZhY3RvciwgdGhpcy5waXhUb0dlb1godHgpLCB0aGlzLnBpeFRvR2VvWSh0eSkpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy9jZW50ZXIgZXh0ZW50XG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfHVuZGVmaW5lZH0gKi9cbiAgICAgICAgdGhpcy54TWluID0gb3B0cy5jZW50ZXJFeHRlbnQgPyBvcHRzLmNlbnRlckV4dGVudFswXSA6IHVuZGVmaW5lZFxuICAgICAgICAvKiogQHR5cGUge251bWJlcnx1bmRlZmluZWR9ICovXG4gICAgICAgIHRoaXMueU1pbiA9IG9wdHMuY2VudGVyRXh0ZW50ID8gb3B0cy5jZW50ZXJFeHRlbnRbMV0gOiB1bmRlZmluZWRcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ8dW5kZWZpbmVkfSAqL1xuICAgICAgICB0aGlzLnhNYXggPSBvcHRzLmNlbnRlckV4dGVudCA/IG9wdHMuY2VudGVyRXh0ZW50WzJdIDogdW5kZWZpbmVkXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfHVuZGVmaW5lZH0gKi9cbiAgICAgICAgdGhpcy55TWF4ID0gb3B0cy5jZW50ZXJFeHRlbnQgPyBvcHRzLmNlbnRlckV4dGVudFszXSA6IHVuZGVmaW5lZFxuXG4gICAgICAgIC8qKiBab29tIGV4dGVudCwgdG8gbGltaXQgem9vbSBpbiBhbmQgb3V0XG4gICAgICAgICAqICBAdHlwZSB7QXJyYXkuPG51bWJlcj59ICovXG4gICAgICAgIHRoaXMuem9vbUV4dGVudCA9IG9wdHMuem9vbUV4dGVudCB8fCBbMCwgSW5maW5pdHldXG5cbiAgICAgICAgLyoqIENhbnZhcyBzdGF0ZSwgdG8gYmUgdXNlZCB0byBhdm9pZCB1bm5lY2Vzc2FyeSByZWRyYXdzIG9uIHpvb20vcGFuXG4gICAgICAgICAqICBAdHlwZSB7e2M6SFRNTENhbnZhc0VsZW1lbnR8bnVsbCxkeDpudW1iZXIsZHk6bnVtYmVyLGY6bnVtYmVyfX0gKi9cbiAgICAgICAgdGhpcy5jYW52YXNTYXZlID0geyBjOiBudWxsLCBkeDogMCwgZHk6IDAsIGY6IDEgfVxuICAgIH1cblxuICAgIC8qKlxuICogQHBhcmFtIHtudW1iZXJ9IGR4R2VvXG4gKiBAcGFyYW0ge251bWJlcn0gZHlHZW9cbiAqL1xuICAgIGFwcGx5UGFuKGR4R2VvID0gMCwgZHlHZW8gPSAwKSB7XG4gICAgICAgIC8vZW5zdXJlcyB4L3kgZXh0ZW50XG4gICAgICAgIGlmICh0aGlzLnhNaW4gIT0gdW5kZWZpbmVkICYmIHRoaXMudmlldy54ICsgZHhHZW8gPCB0aGlzLnhNaW4pIGR4R2VvID0gdGhpcy54TWluIC0gdGhpcy52aWV3LnhcbiAgICAgICAgaWYgKHRoaXMueU1pbiAhPSB1bmRlZmluZWQgJiYgdGhpcy52aWV3LnkgKyBkeUdlbyA8IHRoaXMueU1pbikgZHlHZW8gPSB0aGlzLnlNaW4gLSB0aGlzLnZpZXcueVxuICAgICAgICBpZiAodGhpcy54TWF4ICE9IHVuZGVmaW5lZCAmJiB0aGlzLnZpZXcueCArIGR4R2VvID4gdGhpcy54TWF4KSBkeEdlbyA9IHRoaXMueE1heCAtIHRoaXMudmlldy54XG4gICAgICAgIGlmICh0aGlzLnlNYXggIT0gdW5kZWZpbmVkICYmIHRoaXMudmlldy55ICsgZHlHZW8gPiB0aGlzLnlNYXgpIGR5R2VvID0gdGhpcy55TWF4IC0gdGhpcy52aWV3LnlcblxuICAgICAgICAvL3BhblxuICAgICAgICB0aGlzLnZpZXcueCArPSBkeEdlb1xuICAgICAgICB0aGlzLnZpZXcueSArPSBkeUdlb1xuICAgICAgICB0aGlzLnVwZGF0ZUV4dGVudEdlbygpXG5cbiAgICAgICAgaWYgKHRoaXMuY2FudmFzU2F2ZS5jKSB7XG4gICAgICAgICAgICBjb25zdCBzY2FsZSA9IDEgLyB0aGlzLnZpZXcuelxuXG4gICAgICAgICAgICAvLyBVcGRhdGUgc2F2ZWQgY2FudmFzIG9mZnNldFxuICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLmR4IC09IGR4R2VvICogc2NhbGVcbiAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZS5keSArPSBkeUdlbyAqIHNjYWxlXG5cbiAgICAgICAgICAgIC8vIGNsZWFyIGNhbnZhc1xuICAgICAgICAgICAgdGhpcy5jbGVhcih0aGlzLmJhY2tncm91bmRDb2xvcilcblxuICAgICAgICAgICAgLy8gdGhpcyBkb2VzbnQgd29yayBvbiBtb2JpbGUgaHR0cHM6Ly9naXRodWIuY29tL2V1cm9zdGF0L2dyaWR2aXovaXNzdWVzLzk4XG4gICAgICAgICAgICAvL3RoaXMuY3R4LmRyYXdJbWFnZSh0aGlzLmNhbnZhc1NhdmUuYywgdGhpcy5jYW52YXNTYXZlLmR4LCB0aGlzLmNhbnZhc1NhdmUuZHkpXG4gICAgICAgICAgICB0aGlzLm9mZnNjcmVlbkN0eC5kcmF3SW1hZ2UodGhpcy5jYW52YXNTYXZlLmMsIHRoaXMuY2FudmFzU2F2ZS5keCwgdGhpcy5jYW52YXNTYXZlLmR5KVxuXG4gICAgICAgICAgICAvLyBSZW5kZXIgdGhlIG9mZnNjcmVlbiBjYW52YXMgdG8gdGhlIHZpc2libGUgY29udGV4dFxuICAgICAgICAgICAgdGhpcy5jdHguZHJhd0ltYWdlKHRoaXMub2Zmc2NyZWVuQ3R4LmNhbnZhcywgMCwgMClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdubyBjYW52YXMgc2F2ZScpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBab29tLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBmIFRoZSB6b29tIGZhY3Rvciwgd2l0aGluIF0wLCBJbmZpbml0eV0uIDEgaXMgZm9yIG5vIGNoYW5nZS4gPDEgdG8gem9vbS1pbiwgPjEgdG8gem9vbS1vdXQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHhHZW8gVGhlIHggZ2VvIHBvc2l0aW9uIGZpeGVkIGluIHRoZSBzY3JlZW4uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHlHZW8gVGhlIHkgZ2VvIHBvc2l0aW9uIGZpeGVkIGluIHRoZSBzY3JlZW4uXG4gICAgICovXG4gICAgYXBwbHlab29tKGYgPSAxLCB4R2VvID0gdGhpcy52aWV3LngsIHlHZW8gPSB0aGlzLnZpZXcueSkge1xuICAgICAgICAvL1RPRE8gZm9yY2UgZ2VvIGV4dGVuZCB0byByZW1haW5cblxuICAgICAgICAvL3RyeWluZyB0byB6b29tIGluL291dCBiZXlvbmQgbGltaXRcbiAgICAgICAgaWYgKHRoaXMuem9vbUV4dGVudFswXSA9PSB0aGlzLnZpZXcueiAmJiBmIDw9IDEpIHJldHVyblxuICAgICAgICBpZiAodGhpcy56b29tRXh0ZW50WzFdID09IHRoaXMudmlldy56ICYmIGYgPj0gMSkgcmV0dXJuXG5cbiAgICAgICAgLy9lbnN1cmUgem9vbSBleHRlbnQgcHJlc2VydmVkXG4gICAgICAgIGNvbnN0IG5ld1pmID0gZiAqIHRoaXMudmlldy56XG4gICAgICAgIGlmIChuZXdaZiA8IHRoaXMuem9vbUV4dGVudFswXSkgZiA9IHRoaXMuem9vbUV4dGVudFswXSAvIHRoaXMudmlldy56XG4gICAgICAgIGlmIChuZXdaZiA+IHRoaXMuem9vbUV4dGVudFsxXSkgZiA9IHRoaXMuem9vbUV4dGVudFsxXSAvIHRoaXMudmlldy56XG5cbiAgICAgICAgdGhpcy52aWV3LnogKj0gZlxuXG4gICAgICAgIC8vY29tcHV0ZSBwYW5cbiAgICAgICAgbGV0IGR4R2VvID0gKHhHZW8gLSB0aGlzLnZpZXcueCkgKiAoMSAtIGYpXG4gICAgICAgIGxldCBkeUdlbyA9ICh5R2VvIC0gdGhpcy52aWV3LnkpICogKDEgLSBmKVxuXG4gICAgICAgIC8vZW5zdXJlcyB4L3kgZXh0ZW50XG4gICAgICAgIGlmICh0aGlzLnhNaW4gIT0gdW5kZWZpbmVkICYmIHRoaXMudmlldy54ICsgZHhHZW8gPCB0aGlzLnhNaW4pIGR4R2VvID0gdGhpcy54TWluIC0gdGhpcy52aWV3LnhcbiAgICAgICAgaWYgKHRoaXMueU1pbiAhPSB1bmRlZmluZWQgJiYgdGhpcy52aWV3LnkgKyBkeUdlbyA8IHRoaXMueU1pbikgZHlHZW8gPSB0aGlzLnlNaW4gLSB0aGlzLnZpZXcueVxuICAgICAgICBpZiAodGhpcy54TWF4ICE9IHVuZGVmaW5lZCAmJiB0aGlzLnZpZXcueCArIGR4R2VvID4gdGhpcy54TWF4KSBkeEdlbyA9IHRoaXMueE1heCAtIHRoaXMudmlldy54XG4gICAgICAgIGlmICh0aGlzLnlNYXggIT0gdW5kZWZpbmVkICYmIHRoaXMudmlldy55ICsgZHlHZW8gPiB0aGlzLnlNYXgpIGR5R2VvID0gdGhpcy55TWF4IC0gdGhpcy52aWV3LnlcblxuICAgICAgICAvL3BhblxuICAgICAgICB0aGlzLnZpZXcueCArPSBkeEdlb1xuICAgICAgICB0aGlzLnZpZXcueSArPSBkeUdlb1xuICAgICAgICB0aGlzLnVwZGF0ZUV4dGVudEdlbygpXG5cbiAgICAgICAgdGhpcy5fZHJhd1pvb21GcmFtZShmLCB4R2VvLCB5R2VvKVxuICAgIH1cblxuICAgIF9kcmF3Wm9vbUZyYW1lKGYsIHhHZW8sIHlHZW8pIHtcbiAgICAgICAgLy8gem9vbSBpbiBvbiB0aGUgY3VycmVudCBjYW52YXMgc3RhdGVcbiAgICAgICAgaWYgKHRoaXMuY2FudmFzU2F2ZS5jKSB7XG4gICAgICAgICAgICB0aGlzLmNsZWFyKHRoaXMuYmFja2dyb3VuZENvbG9yKVxuICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLmYgLz0gZlxuICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLmR4ID0gdGhpcy5nZW9Ub1BpeFgoeEdlbykgKiAoMSAtIHRoaXMuY2FudmFzU2F2ZS5mKVxuICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLmR5ID0gdGhpcy5nZW9Ub1BpeFkoeUdlbykgKiAoMSAtIHRoaXMuY2FudmFzU2F2ZS5mKVxuICAgICAgICAgICAgdGhpcy5jbGVhcih0aGlzLmJhY2tncm91bmRDb2xvcilcbiAgICAgICAgICAgIHRoaXMub2Zmc2NyZWVuQ3R4LmRyYXdJbWFnZShcbiAgICAgICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUuYyxcbiAgICAgICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUuZHgsXG4gICAgICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLmR5LFxuICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZS5mICogdGhpcy5jYW52YXNTYXZlLmMud2lkdGgsXG4gICAgICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLmYgKiB0aGlzLmNhbnZhc1NhdmUuYy5oZWlnaHRcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIHRoaXMuY3R4LmRyYXdJbWFnZShcbiAgICAgICAgICAgICAgICB0aGlzLm9mZnNjcmVlbkNhbnZhcywgLy8gVXNlIG9mZnNjcmVlbiBjYW52YXMgYXMgdGhlIHNvdXJjZVxuICAgICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgICAgMCwgLy8gUG9zaXRpb24gdGhlIG9mZnNjcmVlbiBjYW52YXMgYXQgdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgbWFpbiBjYW52YXNcbiAgICAgICAgICAgICAgICB0aGlzLmNhbnZhcy53aWR0aCwgLy8gVGhlIHdpZHRoIG9mIHRoZSB2aXNpYmxlIGNhbnZhc1xuICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzLmhlaWdodCAvLyBUaGUgaGVpZ2h0IG9mIHRoZSB2aXNpYmxlIGNhbnZhc1xuICAgICAgICAgICAgKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gKiBDbGVhci4gVG8gYmUgdXNlZCBiZWZvcmUgYSByZWRyYXcgZm9yIGV4YW1wbGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gY29sb3JcbiAqL1xuICAgIGNsZWFyKGNvbG9yID0gJ3doaXRlJykge1xuICAgICAgICBpZiAodGhpcy5vcHRzLnRyYW5zcGFyZW50QmFja2dyb3VuZCkge1xuICAgICAgICAgICAgdGhpcy5jdHguY2xlYXJSZWN0KDAsIDAsIHRoaXMudywgdGhpcy5oKVxuICAgICAgICAgICAgdGhpcy5vZmZzY3JlZW5DdHguY2xlYXJSZWN0KDAsIDAsIHRoaXMudywgdGhpcy5oKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMuY3R4KSB0aGlzLmN0eC5maWxsU3R5bGUgPSBjb2xvclxuICAgICAgICAgICAgaWYgKHRoaXMub2Zmc2NyZWVuQ3R4KSB0aGlzLm9mZnNjcmVlbkN0eC5maWxsU3R5bGUgPSBjb2xvclxuICAgICAgICAgICAgdGhpcy5jdHguZmlsbFJlY3QoMCwgMCwgdGhpcy53LCB0aGlzLmgpXG4gICAgICAgICAgICB0aGlzLm9mZnNjcmVlbkN0eC5maWxsUmVjdCgwLCAwLCB0aGlzLncsIHRoaXMuaClcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAcmV0dXJucyB7Vmlld30gKi9cbiAgICBnZXRWaWV3KCkge1xuICAgICAgICByZXR1cm4gdGhpcy52aWV3XG4gICAgfVxuXG4gICAgLyoqIEBwYXJhbSB7QXJyYXkuPG51bWJlcj59IHYgKi9cbiAgICBzZXRDZW50ZXJFeHRlbnQodikge1xuICAgICAgICB0aGlzLnhNaW4gPSB2WzBdXG4gICAgICAgIHRoaXMueU1pbiA9IHZbMV1cbiAgICAgICAgdGhpcy54TWF4ID0gdlsyXVxuICAgICAgICB0aGlzLnlNYXggPSB2WzNdXG4gICAgfVxuICAgIC8qKiBAcmV0dXJucyB7QXJyYXkuPG51bWJlcnx1bmRlZmluZWQ+fSAqL1xuICAgIGdldENlbnRlckV4dGVudCgpIHtcbiAgICAgICAgcmV0dXJuIFt0aGlzLnhNaW4sIHRoaXMueU1pbiwgdGhpcy54TWF4LCB0aGlzLnlNYXhdXG4gICAgfVxuXG4gICAgLyoqIEBwYXJhbSB7QXJyYXkuPG51bWJlcj59IHYgKi9cbiAgICBzZXRab29tRXh0ZW50KHYpIHtcbiAgICAgICAgdGhpcy56b29tRXh0ZW50ID0gdlxuICAgIH1cbiAgICAvKiogQHJldHVybnMge0FycmF5LjxudW1iZXI+fSAqL1xuICAgIGdldFpvb21FeHRlbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnpvb21FeHRlbnRcbiAgICB9XG5cbiAgICAvKiogSW5pdGlhbGlzZSBjYW52YXMgdHJhbnNmb3JtIHdpdGggaWRlbnRpdHkgdHJhbnNmb3JtYXRpb24uICovXG4gICAgaW5pdENhbnZhc1RyYW5zZm9ybSgpIHtcbiAgICAgICAgdGhpcy5jdHguc2V0VHJhbnNmb3JtKDEsIDAsIDAsIDEsIDAsIDApXG4gICAgICAgIHRoaXMub2Zmc2NyZWVuQ3R4LnNldFRyYW5zZm9ybSgxLCAwLCAwLCAxLCAwLCAwKVxuICAgIH1cblxuICAgIC8qKiBJbml0aWFsaXNlIGNhbnZhcyB0cmFuc2Zvcm0gd2l0aCBnZW8gdG8gc2NyZWVuIHRyYW5zZm9ybWF0aW9uLCBzbyB0aGF0IGdlbyBvYmplY3RzIGNhbiBiZSBkcmF3biBkaXJlY3RseSBpbiBnZW8gY29vcmRpbmF0ZXMuICovXG4gICAgc2V0Q2FudmFzVHJhbnNmb3JtKCkge1xuICAgICAgICBjb25zdCBrID0gMSAvIHRoaXMudmlldy56XG4gICAgICAgIGNvbnN0IHR4ID0gLXRoaXMudmlldy54IC8gdGhpcy52aWV3LnogKyB0aGlzLncgKiAwLjVcbiAgICAgICAgY29uc3QgdHkgPSB0aGlzLnZpZXcueSAvIHRoaXMudmlldy56ICsgdGhpcy5oICogMC41XG4gICAgICAgIHRoaXMuY3R4LnNldFRyYW5zZm9ybShrLCAwLCAwLCAtaywgdHgsIHR5KVxuICAgICAgICB0aGlzLm9mZnNjcmVlbkN0eC5zZXRUcmFuc2Zvcm0oaywgMCwgMCwgLWssIHR4LCB0eSlcbiAgICB9XG5cbiAgICAvKiogR2V0IHRoZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggdG8gd2ViR0wgc2NyZWVuIGNvb3JkaW5hdGVzLCB3aXRoaW4gWy0xLDFdKlstMSwxXSAqL1xuICAgIGdldFdlYkdMVHJhbnNmb3JtKCkge1xuICAgICAgICBjb25zdCBreCA9IDIuMCAvICh0aGlzLncgKiB0aGlzLnZpZXcueilcbiAgICAgICAgY29uc3Qga3kgPSAyLjAgLyAodGhpcy5oICogdGhpcy52aWV3LnopXG4gICAgICAgIHJldHVybiBba3gsIDAuMCwgMC4wLCAwLjAsIGt5LCAwLjAsIC1reCAqIHRoaXMudmlldy54LCAta3kgKiB0aGlzLnZpZXcueSwgMS4wXVxuICAgIH1cblxuICAgIC8qKiBUaGUgZnVuY3Rpb24gc3BlY2lmeWluZyBob3cgdG8gZHJhdyB0aGUgbWFwLiAqL1xuICAgIHJlZHJhdygpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2QgcmVkcmF3IG5vdCBpbXBsZW1lbnRlZC4nKVxuICAgIH1cblxuICAgIC8qKiBXaGVuIHRoZSB6b29tIGxldmVsIGNoYW5nZXMsIGVuc3VyZXMgdGhhdCBhbnkgb25nb2luZyByZXF1ZXN0cyBhcmUgYWJvcnRlZCBiZWZvcmUgbmV3IG9uZXMgYXJlIGluaXRpYXRlZC4gKi9cbiAgICBjYW5jZWxDdXJyZW50UmVxdWVzdHMoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIGNhbmNlbEN1cnJlbnRSZXF1ZXN0cyBub3QgaW1wbGVtZW50ZWQuJylcbiAgICB9XG5cblxuXG5cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBtYXJnaW5QeFxuICAgICAqIEByZXR1cm5zIHtFbnZlbG9wZX0gVGhlIGVudmVsb3BlIG9mIHRoZSB2aWV3LCBpbiBnZW8gY29vcmRpbmF0ZXMuXG4gICAgICovXG4gICAgdXBkYXRlRXh0ZW50R2VvKG1hcmdpblB4ID0gMjApIHtcbiAgICAgICAgdGhpcy5leHRHZW8gPSB7XG4gICAgICAgICAgICB4TWluOiB0aGlzLnBpeFRvR2VvWCgtbWFyZ2luUHgpLFxuICAgICAgICAgICAgeE1heDogdGhpcy5waXhUb0dlb1godGhpcy53ICsgbWFyZ2luUHgpLFxuICAgICAgICAgICAgeU1pbjogdGhpcy5waXhUb0dlb1kodGhpcy5oICsgbWFyZ2luUHgpLFxuICAgICAgICAgICAgeU1heDogdGhpcy5waXhUb0dlb1koLW1hcmdpblB4KSxcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5leHRHZW9cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiB0aGUgb2JqZWN0IGhhcyB0byBiZSBkcmF3blxuICAgICAqXG4gICAgICogQHBhcmFtIHt7eDpudW1iZXIseTpudW1iZXJ9fSBvYmpcbiAgICAgKi9cbiAgICB0b0RyYXcob2JqKSB7XG4gICAgICAgIGlmIChvYmoueCA8IHRoaXMuZXh0R2VvLnhNaW4pIHJldHVybiBmYWxzZVxuICAgICAgICBpZiAob2JqLnggPiB0aGlzLmV4dEdlby54TWF4KSByZXR1cm4gZmFsc2VcbiAgICAgICAgaWYgKG9iai55IDwgdGhpcy5leHRHZW8ueU1pbikgcmV0dXJuIGZhbHNlXG4gICAgICAgIGlmIChvYmoueSA+IHRoaXMuZXh0R2VvLnlNYXgpIHJldHVybiBmYWxzZVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIC8vY29udmVyc2lvbiBmdW5jdGlvbnNcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geEdlbyBHZW8geCBjb29yZGluYXRlLCBpbiBtLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFNjcmVlbiB4IGNvb3JkaW5hdGUsIGluIHBpeC5cbiAgICAgKi9cbiAgICBnZW9Ub1BpeFgoeEdlbykge1xuICAgICAgICByZXR1cm4gKHhHZW8gLSB0aGlzLnZpZXcueCkgLyB0aGlzLnZpZXcueiArIHRoaXMudyAqIDAuNVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geUdlbyBHZW8geSBjb29yZGluYXRlLCBpbiBtLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFNjcmVlbiB5IGNvb3JkaW5hdGUsIGluIHBpeC5cbiAgICAgKi9cbiAgICBnZW9Ub1BpeFkoeUdlbykge1xuICAgICAgICByZXR1cm4gLSh5R2VvIC0gdGhpcy52aWV3LnkpIC8gdGhpcy52aWV3LnogKyB0aGlzLmggKiAwLjVcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHggU2NyZWVuIHggY29vcmRpbmF0ZSwgaW4gcGl4LlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IEdlbyB4IGNvb3JkaW5hdGUsIGluIG0uXG4gICAgICovXG4gICAgcGl4VG9HZW9YKHgpIHtcbiAgICAgICAgcmV0dXJuICh4IC0gdGhpcy53ICogMC41KSAqIHRoaXMudmlldy56ICsgdGhpcy52aWV3LnhcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHkgU2NyZWVuIHkgY29vcmRpbmF0ZSwgaW4gcGl4LlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IEdlbyB5IGNvb3JkaW5hdGUsIGluIG0uXG4gICAgICovXG4gICAgcGl4VG9HZW9ZKHkpIHtcbiAgICAgICAgcmV0dXJuIC0oeSAtIHRoaXMuaCAqIDAuNSkgKiB0aGlzLnZpZXcueiArIHRoaXMudmlldy55XG4gICAgfVxuXG4gICAgLyoqIEdldCB4LHkseiBlbGVtZW50cyBmcm9tIFVSTCBhbmQgYXNzaWduIHRoZW0gdG8gdGhlIHZpZXcuICovXG4gICAgc2V0Vmlld0Zyb21VUkwoKSB7XG4gICAgICAgIGNvbnN0IHggPSBHZW9DYW52YXMuZ2V0UGFyYW1ldGVyQnlOYW1lKCd4JyksXG4gICAgICAgICAgICB5ID0gR2VvQ2FudmFzLmdldFBhcmFtZXRlckJ5TmFtZSgneScpLFxuICAgICAgICAgICAgeiA9IEdlb0NhbnZhcy5nZXRQYXJhbWV0ZXJCeU5hbWUoJ3onKVxuICAgICAgICBpZiAoeCAhPSBudWxsICYmIHggIT0gdW5kZWZpbmVkICYmICFpc05hTigreCkpIHRoaXMudmlldy54ID0gK3hcbiAgICAgICAgaWYgKHkgIT0gbnVsbCAmJiB5ICE9IHVuZGVmaW5lZCAmJiAhaXNOYU4oK3kpKSB0aGlzLnZpZXcueSA9ICt5XG4gICAgICAgIGlmICh6ICE9IG51bGwgJiYgeiAhPSB1bmRlZmluZWQgJiYgIWlzTmFOKCt6KSkgdGhpcy52aWV3LnogPSArelxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBhIFVSTCBwYXJhbWV0ZXIgYnkgbmFtZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAgICogQHJldHVybnMge3N0cmluZyB8IG51bGx9XG4gICAgICovXG4gICAgc3RhdGljIGdldFBhcmFtZXRlckJ5TmFtZShuYW1lKSB7XG4gICAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoL1tcXFtdLywgJ1xcXFxbJykucmVwbGFjZSgvW1xcXV0vLCAnXFxcXF0nKVxuICAgICAgICB2YXIgcmVnZXggPSBuZXcgUmVnRXhwKCdbXFxcXD8mXScgKyBuYW1lICsgJz0oW14mI10qKScpLFxuICAgICAgICAgICAgcmVzdWx0cyA9IHJlZ2V4LmV4ZWMobG9jYXRpb24uc2VhcmNoKVxuICAgICAgICByZXR1cm4gIXJlc3VsdHMgPyBudWxsIDogZGVjb2RlVVJJQ29tcG9uZW50KHJlc3VsdHNbMV0ucmVwbGFjZSgvXFwrL2csICcgJykpXG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBEcmF3YWJsZSB9IGZyb20gJy4vRHJhd2FibGUuanMnXG5cbi8qKlxuICogQG1vZHVsZSBjb3JlXG4gKiBAYWJzdHJhY3RcbiAqIEBhdXRob3IgSm9zZXBoIERhdmllcywgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIExheWVyIGV4dGVuZHMgRHJhd2FibGUge1xuICAgIC8qKlxuICAgICAqIERyYXcgbGF5ZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vR2VvQ2FudmFzXCIpLkdlb0NhbnZhc30gZ2VvQ2FudmFzIFRoZSBjYW52YXMgd2hlcmUgdG8gZHJhdyB0aGUgbGF5ZXIuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGxlZ2VuZFxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqIEBhYnN0cmFjdFxuICAgICAqL1xuICAgIGRyYXcoZ2VvQ2FudmFzLCBsZWdlbmQgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2QgZHJhdyBub3QgaW1wbGVtZW50ZWQuJylcbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IHNlbGVjdCB9IGZyb20gJ2QzLXNlbGVjdGlvbidcblxuLyoqXG4gKiBBIGxlZ2VuZCBjb250YWluZXIuXG4gKlxuICogQG1vZHVsZSBjb3JlXG4gKiBAYXV0aG9yIEpvc2VwaCBEYXZpZXMsIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBMZWdlbmQge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzXG4gICAgICovXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLmlkID0gb3B0cy5pZFxuXG4gICAgICAgIC8vVE9ETyBzdG9wIHVzaW5nIGl0LiBVc2Ugc3R5bGUgbWV0aG9kIGJlbG93IGluc3RlYWQuXG5cbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9IEBkZXByZWNhdGVkICovXG4gICAgICAgIHRoaXMudG9wID0gb3B0cy50b3BcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9IEBkZXByZWNhdGVkICovXG4gICAgICAgIHRoaXMuYm90dG9tID0gb3B0cy5ib3R0b21cbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9IEBkZXByZWNhdGVkICovXG4gICAgICAgIHRoaXMubGVmdCA9IG9wdHMubGVmdFxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gQGRlcHJlY2F0ZWQgKi9cbiAgICAgICAgdGhpcy5yaWdodCA9IG9wdHMucmlnaHRcbiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9IEBkZXByZWNhdGVkICovXG4gICAgICAgIHRoaXMuYmFja2dyb3VuZCA9IG9wdHMuYmFja2dyb3VuZCB8fCAnbm9uZSdcbiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9IEBkZXByZWNhdGVkICovXG4gICAgICAgIHRoaXMucGFkZGluZyA9IG9wdHMucGFkZGluZyB8fCAnNXB4J1xuICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gQGRlcHJlY2F0ZWQgKi9cbiAgICAgICAgdGhpcy5ib3JkZXIgPSBvcHRzLmJvcmRlciB8fCAnMHB4J1xuICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gQGRlcHJlY2F0ZWQgKi9cbiAgICAgICAgdGhpc1snYm9yZGVyLXJhZGl1cyddID0gb3B0c1snYm9yZGVyLXJhZGl1cyddIHx8ICdub25lJ1xuICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gQGRlcHJlY2F0ZWQgKi9cbiAgICAgICAgdGhpc1snYm94LXNoYWRvdyddID0gb3B0c1snYm94LXNoYWRvdyddIHx8ICdub25lJ1xuICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gQGRlcHJlY2F0ZWQgKi9cbiAgICAgICAgdGhpc1snZm9udC1mYW1pbHknXSA9IG9wdHNbJ2ZvbnQtZmFtaWx5J10gfHwgJ0hlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWYnXG4gICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSBAZGVwcmVjYXRlZCAqL1xuICAgICAgICAvL3RoaXMud2lkdGggPSBvcHRzLndpZHRoXG4gICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSBAZGVwcmVjYXRlZCAqL1xuICAgICAgICAvL3RoaXMuaGVpZ2h0ID0gb3B0cy5oZWlnaHRcblxuICAgICAgICAvL3RoZSBkaXYgZWxlbWVudFxuICAgICAgICBpZiAodGhpcy5pZCkgdGhpcy5kaXYgPSBzZWxlY3QoJyMnICsgdGhpcy5pZClcblxuICAgICAgICBpZiAoIXRoaXMuZGl2IHx8IHRoaXMuZGl2LmVtcHR5KCkpIHtcbiAgICAgICAgICAgIHRoaXMuZGl2ID0gc2VsZWN0KGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKVxuICAgICAgICAgICAgaWYgKHRoaXMuaWQpIHRoaXMuZGl2LmF0dHIoJ2lkJywgdGhpcy5pZClcbiAgICAgICAgfVxuXG4gICAgICAgIC8vc2V0IHN0eWxlXG4gICAgICAgIHRoaXMuZGl2LnN0eWxlKCdiYWNrZ3JvdW5kJywgdGhpcy5iYWNrZ3JvdW5kKVxuICAgICAgICB0aGlzLmRpdi5zdHlsZSgncGFkZGluZycsIHRoaXMucGFkZGluZylcbiAgICAgICAgdGhpcy5kaXYuc3R5bGUoJ2JvcmRlcicsIHRoaXMuYm9yZGVyKVxuICAgICAgICB0aGlzLmRpdi5zdHlsZSgnYm9yZGVyLXJhZGl1cycsIHRoaXNbJ2JvcmRlci1yYWRpdXMnXSlcbiAgICAgICAgdGhpcy5kaXYuc3R5bGUoJ2JveC1zaGFkb3cnLCB0aGlzWydib3gtc2hhZG93J10pXG4gICAgICAgIHRoaXMuZGl2LnN0eWxlKCdmb250LWZhbWlseScsIHRoaXNbJ2ZvbnQtZmFtaWx5J10pXG5cbiAgICAgICAgLy9pZiAodGhpcy53aWR0aCkgdGhpcy5kaXYuc3R5bGUoJ3dpZHRoJywgdGhpcy53aWR0aClcbiAgICAgICAgLy9pZiAodGhpcy5oZWlnaHQpIHRoaXMuZGl2LnN0eWxlKCdoZWlnaHQnLCB0aGlzLmhlaWdodClcblxuICAgICAgICAvL3RpdGxlXG4gICAgICAgIHRoaXMudGl0bGUgPSBvcHRzLnRpdGxlXG4gICAgICAgIHRoaXMudGl0bGVGb250U2l6ZSA9IG9wdHMudGl0bGVGb250U2l6ZSB8fCAnMC44ZW0nXG4gICAgICAgIHRoaXMudGl0bGVGb250V2VpZ2h0ID0gb3B0cy50aXRsZUZvbnRXZWlnaHQgfHwgJ2JvbGQnXG5cbiAgICAgICAgLy9sYWJlbFxuICAgICAgICB0aGlzLmxhYmVsRm9udFNpemUgPSBvcHRzLmxhYmVsRm9udFNpemUgfHwgJzAuOGVtJ1xuICAgICAgICB0aGlzLmxhYmVsVW5pdFRleHQgPSBvcHRzLmxhYmVsVW5pdFRleHQgfHwgJydcbiAgICAgICAgdGhpcy5sYWJlbEZvcm1hdCA9IG9wdHMubGFiZWxGb3JtYXRcbiAgICB9XG5cbiAgICBtYWtlVGl0bGUoKSB7XG4gICAgICAgIGlmICghdGhpcy50aXRsZSkgcmV0dXJuXG4gICAgICAgIHRoaXMuZGl2XG4gICAgICAgICAgICAuYXBwZW5kKCdkaXYnKVxuICAgICAgICAgICAgLnN0eWxlKCdmb250LXNpemUnLCB0aGlzLnRpdGxlRm9udFNpemUpXG4gICAgICAgICAgICAuc3R5bGUoJ2ZvbnQtd2VpZ2h0JywgdGhpcy50aXRsZUZvbnRXZWlnaHQpXG4gICAgICAgICAgICAuc3R5bGUoJ21hcmdpbi1ib3R0b20nLCAnN3B4JylcbiAgICAgICAgICAgIC50ZXh0KHRoaXMudGl0bGUpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXBwbHkgYSBzdHlsZSB0byB0aGUgbGVnZW5kIGRpdi5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB2XG4gICAgICogQHJldHVybnMge3RoaXN8c3RyaW5nfVxuICAgICAqL1xuICAgIHN0eWxlKGssIHYpIHtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMSkgcmV0dXJuIHRoaXMuZGl2LnN0eWxlKGspXG4gICAgICAgIHRoaXMuZGl2LnN0eWxlKGssIHYpXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdHNcbiAgICAgKiBAYWJzdHJhY3RcbiAgICAgKi9cbiAgICB1cGRhdGUob3B0cyA9IHt9KSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0xlZ2VuZCB1cGRhdGUgbm90IGltcGxlbWVudGVkIHlldC4nKVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuLy8gaW50ZXJuYWwgaW1wb3J0c1xuaW1wb3J0IHsgR2VvQ2FudmFzIH0gZnJvbSAnLi9HZW9DYW52YXMuanMnXG5pbXBvcnQgeyBUb29sdGlwIH0gZnJvbSAnLi9Ub29sdGlwLmpzJ1xuaW1wb3J0IHsgWm9vbUJ1dHRvbnMgfSBmcm9tICcuLi9idXR0b24vWm9vbUJ1dHRvbnMuanMnXG5pbXBvcnQgeyBGdWxsc2NyZWVuQnV0dG9uIH0gZnJvbSAnLi4vYnV0dG9uL0Z1bGxzY3JlZW5CdXR0b24uanMnXG5cbi8vIGV4dGVybmFsIGltcG9ydHNcbmltcG9ydCB7IHNlbGVjdCB9IGZyb20gJ2QzLXNlbGVjdGlvbidcblxuLyoqXG4gKiBBIGdyaWR2aXogYXBwbGljYXRpb24uXG4gKlxuICogQG1vZHVsZSBjb3JlXG4gKiBAYXV0aG9yIEpvc2VwaCBEYXZpZXMsIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBNYXAge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7SFRNTERpdkVsZW1lbnR9IGNvbnRhaW5lclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoY29udGFpbmVyLCBvcHRzKSB7XG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBsYXllcnMuXG4gICAgICAgICAqIEB0eXBlIHtBcnJheS48aW1wb3J0KFwiLi9MYXllci5qc1wiKS5MYXllcj59XG4gICAgICAgICAqICovXG4gICAgICAgIHRoaXMubGF5ZXJzID0gb3B0cy5sYXllcnMgfHwgW11cblxuICAgICAgICAvL2dldCBjb250YWluZXIgZWxlbWVudFxuICAgICAgICB0aGlzLmNvbnRhaW5lciA9IGNvbnRhaW5lciB8fCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ3JpZHZpeicpXG4gICAgICAgIGlmICghdGhpcy5jb250YWluZXIpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Nhbm5vdCBmaW5kIGdyaWR2aXogY29udGFpbmVyIGVsZW1lbnQuJylcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgLy9odHRwczovL2Nzcy10cmlja3MuY29tL2Fic29sdXRlLXBvc2l0aW9uaW5nLWluc2lkZS1yZWxhdGl2ZS1wb3NpdGlvbmluZy9cbiAgICAgICAgdGhpcy5jb250YWluZXIuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnIC8vIGNvbnRhaW5lciBlbGVtZW50IG11c3QgaGF2ZSByZWxhdGl2ZSBwb3NpdGlvbmluZ1xuXG4gICAgICAgIC8vc2V0IGRpbWVuc2lvbnNcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgIHRoaXMudyA9IG9wdHMudyB8fCB0aGlzLmNvbnRhaW5lci5vZmZzZXRXaWR0aFxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgdGhpcy5oID0gb3B0cy5oIHx8IHRoaXMuY29udGFpbmVyLm9mZnNldEhlaWdodFxuXG4gICAgICAgIC8vIENyZWF0ZSB0aGUgbWFpbiBjYW52YXMgKGZvciByZW5kZXJpbmcgdG8gc2NyZWVuKVxuICAgICAgICAvKiogQHR5cGUge0hUTUxDYW52YXNFbGVtZW50fSAqL1xuICAgICAgICB0aGlzLl9jYW52YXMgPSBvcHRzLmNhbnZhcyB8fCB0aGlzLmluaXRpYWxpc2VDYW52YXMoKVxuXG4gICAgICAgIC8qKiAgSW5pdGlhbGl6ZSBHZW9DYW52YXNcbiAgICAgICAgICogQHR5cGUge0dlb0NhbnZhc31cbiAgICAgICAgICogQHByaXZhdGUgKi9cbiAgICAgICAgdGhpcy5nZW9DYW52YXMgPSBuZXcgR2VvQ2FudmFzKHRoaXMuX2NhbnZhcywgb3B0cy54LCBvcHRzLnksIG9wdHMueiwgb3B0cylcblxuICAgICAgICB0aGlzLmdlb0NhbnZhcy5yZWRyYXcgPSAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlZHJhdygpXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5nZW9DYW52YXMuY2FuY2VsQ3VycmVudFJlcXVlc3RzID0gKCkgPT4ge1xuICAgICAgICAgICAgLy8gd2hlbiB0aGUgem9vbSBsZXZlbCBjaGFuZ2VzLCBhdm9pZCBkcmF3aW5nIG91dGRhdGVkIHRpbGVzLCBhbmQgZW5zdXJlIHRoYXQgcmVxdWVzdHMgYXJlIHByb3Blcmx5IGFib3J0ZWQgd2hlbiBuZWNlc3NhcnlcbiAgICAgICAgICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgdGhpcy5sYXllcnMpIHtcbiAgICAgICAgICAgICAgICAvL211bHRpcmVzXG4gICAgICAgICAgICAgICAgaWYgKGxheWVyLmRhdGFzZXQ/LmRhdGFzZXRzKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZGF0YXNldCBvZiBsYXllci5kYXRhc2V0Py5kYXRhc2V0cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGFzZXQ/LmNhbmNlbEN1cnJlbnRSZXF1ZXN0cykgZGF0YXNldC5jYW5jZWxDdXJyZW50UmVxdWVzdHMoKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vc2luZ2xlIHJlc1xuICAgICAgICAgICAgICAgIGlmIChsYXllci5kYXRhc2V0Py5jYW5jZWxDdXJyZW50UmVxdWVzdHMpIGxheWVyLmRhdGFzZXQ/LmNhbmNlbEN1cnJlbnRSZXF1ZXN0cygpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBsZWdlbmQgZGl2XG4gICAgICAgIHRoaXMubGVnZW5kID0gb3B0cy5sZWdlbmRDb250YWluZXJcbiAgICAgICAgICAgID8gc2VsZWN0KG9wdHMubGVnZW5kQ29udGFpbmVyKSAvLyBXcmFwIHRoZSBwcm92aWRlZCBIVE1MIG5vZGUgaW4gYSBEMyBzZWxlY3Rpb25cbiAgICAgICAgICAgIDogbnVsbFxuICAgICAgICB0aGlzLl9sZWdlbmRQcm92aWRlZEJ5VXNlciA9ICEhb3B0cy5sZWdlbmRDb250YWluZXJcbiAgICAgICAgaWYgKCF0aGlzLmxlZ2VuZCkgdGhpcy5pbml0aWFsaXNlTGVnZW5kKClcblxuICAgICAgICAvL3Rvb2x0aXBcblxuICAgICAgICAvLyBzZXQgQXBwIGNvbnRhaW5lciBhcyBkZWZhdWx0IHBhcmVudCBlbGVtZW50IGZvciB0b29sdGlwXG4gICAgICAgIGlmICghb3B0cy50b29sdGlwKSBvcHRzLnRvb2x0aXAgPSB7fVxuICAgICAgICBpZiAoIW9wdHMudG9vbHRpcC5wYXJlbnRFbGVtZW50KSBvcHRzLnRvb2x0aXAucGFyZW50RWxlbWVudCA9IHRoaXMuY29udGFpbmVyXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEB0eXBlIHtUb29sdGlwfSAqL1xuICAgICAgICB0aGlzLnRvb2x0aXAgPSBuZXcgVG9vbHRpcChvcHRzLnRvb2x0aXApXG5cbiAgICAgICAgLy8gYWRkIGV2ZW50IGxpc3RlbmVycyB0byBjb250YWluZXJcbiAgICAgICAgdGhpcy5tb3VzZU92ZXJIYW5kbGVyID0gKGUpID0+IHRoaXMuZm9jdXNDZWxsKGUpXG4gICAgICAgIHRoaXMubW91c2VNb3ZlSGFuZGxlciA9IChlKSA9PiB0aGlzLmZvY3VzQ2VsbChlKVxuICAgICAgICB0aGlzLm1vdXNlT3V0SGFuZGxlciA9IChlKSA9PiB0aGlzLnRvb2x0aXAuaGlkZSgpXG4gICAgICAgIHRoaXMuZ2VvQ2FudmFzLmNhbnZhcy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW92ZXInLCB0aGlzLm1vdXNlT3ZlckhhbmRsZXIpXG4gICAgICAgIHRoaXMuZ2VvQ2FudmFzLmNhbnZhcy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLm1vdXNlTW92ZUhhbmRsZXIpXG4gICAgICAgIHRoaXMuZ2VvQ2FudmFzLmNhbnZhcy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW91dCcsIHRoaXMubW91c2VPdXRIYW5kbGVyKVxuXG4gICAgICAgIC8vIGxpc3RlbiBmb3IgcmVzaXplIGV2ZW50cyBvbiB0aGUgQXBwJ3MgY29udGFpbmVyIGFuZCBoYW5kbGUgdGhlbVxuICAgICAgICB0aGlzLmRlZmluZVJlc2l6ZU9ic2VydmVyKClcblxuICAgICAgICAvLyBhZGQgZXh0cmEgbG9naWMgdG8gb25ab29tU3RhcnRGdW5cbiAgICAgICAgdGhpcy5nZW9DYW52YXMub25ab29tU3RhcnRGdW4gPSAoZSkgPT4ge1xuICAgICAgICAgICAgaWYgKG9wdHMub25ab29tU3RhcnRGdW4pIG9wdHMub25ab29tU3RhcnRGdW4oZSlcbiAgICAgICAgICAgIHRoaXMudG9vbHRpcC5oaWRlKClcbiAgICAgICAgfVxuXG4gICAgICAgIC8vZm9yIG1vdXNlIG92ZXJcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEB0eXBlIHtIVE1MQ2FudmFzRWxlbWVudHxudWxsfSAqL1xuICAgICAgICB0aGlzLmNhbnZhc1NhdmUgPSBudWxsXG5cbiAgICAgICAgdGhpcy5zZWxlY3Rpb25SZWN0YW5nbGVDb2xvciA9IG9wdHMuc2VsZWN0aW9uUmVjdGFuZ2xlQ29sb3IgfHwgJyNGRjYzNDcnXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uUmVjdGFuZ2xlV2lkdGhQaXggPSBvcHRzLnNlbGVjdGlvblJlY3RhbmdsZVdpZHRoUGl4IHx8ICgoKSA9PiA0KSAvLyhyLHopID0+IHt9XG5cbiAgICAgICAgLy8gdHJhbnNwYXJlbnQgYmFja2dyb3VuZCAoZS5nLiBsZWFmbGV0KSAncmVkIHBhaW50aW5nJyBmaXhcbiAgICAgICAgdGhpcy50cmFuc3BhcmVudEJhY2tncm91bmQgPSBvcHRzLnRyYW5zcGFyZW50QmFja2dyb3VuZFxuXG4gICAgICAgIC8vc2V0IGRlZmF1bHQgZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uXG4gICAgICAgIHRoaXMuZGVmYXVsdEdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9XG4gICAgICAgICAgICBvcHRzLmRlZmF1bHRHbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gfHwgdGhpcy5nZW9DYW52YXMuY3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvblxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKiBAcmV0dXJucyB7SFRNTENhbnZhc0VsZW1lbnR9XG4gICAgICovXG4gICAgaW5pdGlhbGlzZUNhbnZhcygpIHtcbiAgICAgICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJylcbiAgICAgICAgY2FudmFzLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCAnJyArIHRoaXMudylcbiAgICAgICAgY2FudmFzLnNldEF0dHJpYnV0ZSgnaGVpZ2h0JywgJycgKyB0aGlzLmgpXG4gICAgICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKGNhbnZhcylcbiAgICAgICAgcmV0dXJuIGNhbnZhc1xuICAgIH1cblxuICAgIGluaXRpYWxpc2VMZWdlbmQoKSB7XG4gICAgICAgIHRoaXMubGVnZW5kID0gc2VsZWN0KHRoaXMuY29udGFpbmVyKVxuICAgICAgICAgICAgLmFwcGVuZCgnZGl2JykgLy8gQ3JlYXRlIGEgbmV3IGNvbnRhaW5lclxuICAgICAgICAgICAgLmF0dHIoJ2lkJywgJ2dyaWR2aXotbGVnZW5kJylcbiAgICAgICAgICAgIC5zdHlsZSgncG9zaXRpb24nLCAnYWJzb2x1dGUnKVxuICAgICAgICAgICAgLnN0eWxlKCd3aWR0aCcsICdhdXRvJylcbiAgICAgICAgICAgIC5zdHlsZSgnaGVpZ2h0JywgJ2F1dG8nKVxuICAgICAgICAgICAgLnN0eWxlKCdiYWNrZ3JvdW5kJywgJyNGRkZGRkYnKVxuICAgICAgICAgICAgLy8uc3R5bGUoXCJwYWRkaW5nXCIsIHRoaXMucGFkZGluZylcbiAgICAgICAgICAgIC5zdHlsZSgnYm9yZGVyJywgJzBweCcpXG4gICAgICAgICAgICAvLy5zdHlsZSgnYm9yZGVyLXJhZGl1cycsICc1cHgnKVxuICAgICAgICAgICAgLnN0eWxlKCdib3gtc2hhZG93JywgJzNweCAzcHggM3B4IGdyZXksIC0zcHggLTNweCAzcHggI2RkZCcpXG4gICAgICAgICAgICAuc3R5bGUoJ2ZvbnQtZmFtaWx5JywgJ0hlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWYnKVxuICAgICAgICAgICAgLnN0eWxlKCdib3R0b20nLCAnMTVweCcpXG4gICAgICAgICAgICAuc3R5bGUoJ3JpZ2h0JywgJzE1cHgnKVxuICAgICAgICAvL2hpZGVcbiAgICAgICAgLy8uc3R5bGUoXCJ2aXNpYmlsaXR5XCIsIFwiaGlkZGVuXCIpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0L2dldCBsYXllciBzdGFjay5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7dW5kZWZpbmVkfGltcG9ydChcIi4vTGF5ZXIuanNcIikuTGF5ZXJ8aW1wb3J0KFwiLi9MYXllci5qc1wiKS5MYXllcltdfSBsYXllcnNcbiAgICAgKiBAcmV0dXJucyB7IHRoaXMgfCBpbXBvcnQoXCIuL0xheWVyLmpzXCIpLkxheWVyW10gfVxuICAgICAqL1xuICAgIGxheWVyc18obGF5ZXJzKSB7XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSByZXR1cm4gdGhpcy5sYXllcnNcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShsYXllcnMpKSB0aGlzLmxheWVycyA9IGxheWVyc1xuICAgICAgICAgICAgZWxzZSB0aGlzLmxheWVycyA9IFtsYXllcnNdXG4gICAgICAgIGVsc2UgdGhpcy5sYXllcnMgPSBhcmd1bWVudHNcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKiogQHJldHVybnMge3RoaXN9ICovXG4gICAgcmVkcmF3KCkge1xuICAgICAgICAvL3JlbW92ZSBsZWdlbmQgZWxlbWVudHNcbiAgICAgICAgaWYgKHRoaXMubGVnZW5kKSB0aGlzLmxlZ2VuZC5zZWxlY3RBbGwoJyonKS5yZW1vdmUoKVxuXG4gICAgICAgIC8vY2xlYXJcbiAgICAgICAgdGhpcy5nZW9DYW52YXMuaW5pdENhbnZhc1RyYW5zZm9ybSgpXG4gICAgICAgIHRoaXMuZ2VvQ2FudmFzLmNsZWFyKHRoaXMuZ2VvQ2FudmFzLmJhY2tncm91bmRDb2xvcilcblxuICAgICAgICBjb25zdCB6ID0gdGhpcy5nZW9DYW52YXMudmlldy56XG4gICAgICAgIHRoaXMudXBkYXRlRXh0ZW50R2VvKClcblxuICAgICAgICAvL2dvIHRocm91Z2ggdGhlIGxheWVyc1xuICAgICAgICBmb3IgKGNvbnN0IGxheWVyIG9mIHRoaXMubGF5ZXJzKSB7XG4gICAgICAgICAgICAvL2NoZWNrIGlmIGxheWVyIGlzIHZpc2libGVcbiAgICAgICAgICAgIGlmIChsYXllci52aXNpYmxlICYmICFsYXllci52aXNpYmxlKHopKSBjb250aW51ZVxuXG4gICAgICAgICAgICAvL3NldCBsYXllciBhbHBoYSBhbmQgYmxlbmQgbW9kZVxuICAgICAgICAgICAgdGhpcy5nZW9DYW52YXMub2Zmc2NyZWVuQ3R4Lmdsb2JhbEFscGhhID0gbGF5ZXIuYWxwaGEgPyBsYXllci5hbHBoYSh6KSA6IDEuMFxuICAgICAgICAgICAgaWYgKGxheWVyLmJsZW5kT3BlcmF0aW9uKSB0aGlzLmdlb0NhbnZhcy5vZmZzY3JlZW5DdHguZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gbGF5ZXIuYmxlbmRPcGVyYXRpb24oeilcblxuICAgICAgICAgICAgLy9zZXQgYWZmaW4gdHJhbnNmb3JtIHRvIGRyYXcgd2l0aCBnZW9ncmFwaGljYWwgY29vcmRpbmF0ZXNcbiAgICAgICAgICAgIHRoaXMuZ2VvQ2FudmFzLnNldENhbnZhc1RyYW5zZm9ybSgpXG5cbiAgICAgICAgICAgIC8vZHJhdyBsYXllclxuICAgICAgICAgICAgbGF5ZXIuZHJhdyh0aGlzLmdlb0NhbnZhcywgdGhpcy5sZWdlbmQpXG5cbiAgICAgICAgICAgIC8vZHJhdyBsYXllciBmaWx0ZXJcbiAgICAgICAgICAgIGlmIChsYXllci5maWx0ZXJDb2xvcikgbGF5ZXIuZHJhd0ZpbHRlcih0aGlzLmdlb0NhbnZhcylcblxuICAgICAgICAgICAgLy9yZXN0b3JlIGRlZmF1bHQgYWxwaGEgYW5kIGJsZW5kIG9wZXJhdGlvblxuICAgICAgICAgICAgdGhpcy5nZW9DYW52YXMub2Zmc2NyZWVuQ3R4Lmdsb2JhbEFscGhhID0gMS4wXG4gICAgICAgICAgICB0aGlzLmdlb0NhbnZhcy5vZmZzY3JlZW5DdHguZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gdGhpcy5kZWZhdWx0R2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uXG4gICAgICAgIH1cblxuICAgICAgICAvLyBvbmUgZHJhd0ltYWdlIGNhbGw6IGRyYXcgdGhlIG9mZnNjcmVlbiBjYW52YXMgdG8gdGhlIG1haW4gY2FudmFzXG4gICAgICAgIHRoaXMuZ2VvQ2FudmFzLmluaXRDYW52YXNUcmFuc2Zvcm0oKVxuICAgICAgICB0aGlzLmdlb0NhbnZhcy5jdHguZHJhd0ltYWdlKHRoaXMuZ2VvQ2FudmFzLm9mZnNjcmVlbkNhbnZhcywgMCwgMClcblxuICAgICAgICB0aGlzLmNhbnZhc1NhdmUgPSBudWxsXG5cbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbWFyZ2luUHhcbiAgICAgKiBAcmV0dXJucyB7aW1wb3J0KCcuL0dlb0NhbnZhcy5qcycpLkVudmVsb3BlfVxuICAgICAqIEBwdWJsaWNcbiAgICAgKi9cbiAgICB1cGRhdGVFeHRlbnRHZW8obWFyZ2luUHggPSAyMCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZW9DYW52YXMudXBkYXRlRXh0ZW50R2VvKG1hcmdpblB4KVxuICAgIH1cblxuICAgIC8qKiBAcGFyYW0ge01vdXNlRXZlbnR9IGUgKi9cbiAgICBmb2N1c0NlbGwoZSkge1xuICAgICAgICAvLyBEb27igJl0IHByb2Nlc3MgaG92ZXIgZXZlbnRzIGR1cmluZyBhY3RpdmUgem9vbVxuICAgICAgICBpZiAodGhpcy5nZW9DYW52YXMuX2lzWm9vbWluZykgcmV0dXJuO1xuXG4gICAgICAgIC8vY29tcHV0ZSBtb3VzZSBnZW8gcG9zaXRpb25cbiAgICAgICAgY29uc3QgbW91c2VQb3NpdGlvbkdlbyA9IHtcbiAgICAgICAgICAgIHg6IHRoaXMuZ2VvQ2FudmFzLnBpeFRvR2VvWChlLm9mZnNldFggKyB0aGlzLnRvb2x0aXAueE1vdXNlT2Zmc2V0KSxcbiAgICAgICAgICAgIHk6IHRoaXMuZ2VvQ2FudmFzLnBpeFRvR2VvWShlLm9mZnNldFkgKyB0aGlzLnRvb2x0aXAueU1vdXNlT2Zmc2V0KSxcbiAgICAgICAgfVxuICAgICAgICAvKiogQHR5cGUge3tjZWxsOmltcG9ydCgnLi9EYXRhc2V0LmpzJykuQ2VsbCxodG1sOnN0cmluZyxyZXNvbHV0aW9uOm51bWJlcn0gfCB1bmRlZmluZWR9ICovXG4gICAgICAgIGNvbnN0IGZvY3VzID0gdGhpcy5nZXRDZWxsRm9jdXNJbmZvKG1vdXNlUG9zaXRpb25HZW8pXG5cbiAgICAgICAgLy8gVHJhbnNwYXJlbnQgYmFja2dyb3VuZCAoTGVhZmxldCk6IHJlZHJhdyBiYXNlLCB0aGVuIGRyYXcgZm9jdXMgcmVjdCBkaXJlY3RseSBvbiB0aGUgdmlzaWJsZSBjYW52YXNcbiAgICAgICAgaWYgKHRoaXMudHJhbnNwYXJlbnRCYWNrZ3JvdW5kKSB7XG4gICAgICAgICAgICAvLyBBbHdheXMgcmVzdG9yZSB0aGUgYmFzZSAob2Zmc2NyZWVuKSBpbnRvIHRoZSB2aXNpYmxlIGNhbnZhc1xuICAgICAgICAgICAgdGhpcy5nZW9DYW52YXMuaW5pdENhbnZhc1RyYW5zZm9ybSgpO1xuICAgICAgICAgICAgdGhpcy5nZW9DYW52YXMuY3R4LmNsZWFyUmVjdCgwLCAwLCB0aGlzLncsIHRoaXMuaCk7XG4gICAgICAgICAgICB0aGlzLmdlb0NhbnZhcy5jdHguZHJhd0ltYWdlKHRoaXMuZ2VvQ2FudmFzLm9mZnNjcmVlbkNhbnZhcywgMCwgMCk7XG5cbiAgICAgICAgICAgIGlmIChmb2N1cykge1xuICAgICAgICAgICAgICAgIHRoaXMudG9vbHRpcC5odG1sKGZvY3VzLmh0bWwpO1xuICAgICAgICAgICAgICAgIHRoaXMudG9vbHRpcC5zZXRQb3NpdGlvbihlKTtcbiAgICAgICAgICAgICAgICB0aGlzLnRvb2x0aXAuc2hvdygpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcmVjdFdQaXggPSB0aGlzLnNlbGVjdGlvblJlY3RhbmdsZVdpZHRoUGl4XG4gICAgICAgICAgICAgICAgICAgID8gdGhpcy5zZWxlY3Rpb25SZWN0YW5nbGVXaWR0aFBpeChmb2N1cy5yZXNvbHV0aW9uLCB0aGlzLmdlb0NhbnZhcy52aWV3LnopXG4gICAgICAgICAgICAgICAgICAgIDogNDtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuZ2VvQ2FudmFzLmN0eDsgLy8gZHJhdyBkaXJlY3RseSBvbiB2aXNpYmxlIGNhbnZhc1xuICAgICAgICAgICAgICAgIGN0eC5zYXZlKCk7XG4gICAgICAgICAgICAgICAgY3R4LnN0cm9rZVN0eWxlID0gdGhpcy5zZWxlY3Rpb25SZWN0YW5nbGVDb2xvcjtcbiAgICAgICAgICAgICAgICBjdHgubGluZVdpZHRoID0gcmVjdFdQaXg7XG4gICAgICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpO1xuICAgICAgICAgICAgICAgIC8vIGNvbXB1dGUgaW4gcGl4ZWwgc3BhY2UgKG5vIGdlbyB0cmFuc2Zvcm0gb24gY3R4KVxuICAgICAgICAgICAgICAgIGNvbnN0IHhQaXggPSB0aGlzLmdlb0NhbnZhcy5nZW9Ub1BpeFgoZm9jdXMuY2VsbC54KTtcbiAgICAgICAgICAgICAgICBjb25zdCB5UGl4ID0gdGhpcy5nZW9DYW52YXMuZ2VvVG9QaXhZKGZvY3VzLmNlbGwueSk7XG4gICAgICAgICAgICAgICAgY29uc3Qgd1BpeCA9IGZvY3VzLnJlc29sdXRpb24gLyB0aGlzLmdlb0NhbnZhcy52aWV3Lno7XG4gICAgICAgICAgICAgICAgY29uc3QgaFBpeCA9IC13UGl4OyAvLyB5IGF4aXMgaW52ZXJ0ZWQgaW4gZ2VvVG9QaXhcbiAgICAgICAgICAgICAgICBjdHgucmVjdChcbiAgICAgICAgICAgICAgICAgICAgeFBpeCAtIHJlY3RXUGl4IC8gMixcbiAgICAgICAgICAgICAgICAgICAgeVBpeCArIHJlY3RXUGl4IC8gMixcbiAgICAgICAgICAgICAgICAgICAgd1BpeCArIHJlY3RXUGl4LFxuICAgICAgICAgICAgICAgICAgICBoUGl4IC0gcmVjdFdQaXhcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGN0eC5zdHJva2UoKTtcbiAgICAgICAgICAgICAgICBjdHgucmVzdG9yZSgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRvb2x0aXAuaGlkZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuOyAvLyBoYW5kbGVkXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZm9jdXMpIHtcbiAgICAgICAgICAgIHRoaXMuZ2VvQ2FudmFzLmNhbnZhcy5zdHlsZS5jdXJzb3IgPSAncG9pbnRlcic7XG4gICAgICAgICAgICB0aGlzLnRvb2x0aXAuaHRtbChmb2N1cy5odG1sKVxuICAgICAgICAgICAgdGhpcy50b29sdGlwLnNldFBvc2l0aW9uKGUpXG4gICAgICAgICAgICB0aGlzLnRvb2x0aXAuc2hvdygpXG5cbiAgICAgICAgICAgIC8vc2hvdyBjZWxsIHBvc2l0aW9uIGFzIGEgcmVjdGFuZ2xlXG4gICAgICAgICAgICBpZiAoIXRoaXMuY2FudmFzU2F2ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzU2F2ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpXG4gICAgICAgICAgICAgICAgdGhpcy5jYW52YXNTYXZlLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCAnJyArIHRoaXMudylcbiAgICAgICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUuc2V0QXR0cmlidXRlKCdoZWlnaHQnLCAnJyArIHRoaXMuaClcbiAgICAgICAgICAgICAgICB0aGlzLmNhbnZhc1NhdmUuZ2V0Q29udGV4dCgnMmQnKT8uZHJhd0ltYWdlKHRoaXMuZ2VvQ2FudmFzLm9mZnNjcmVlbkNhbnZhcywgMCwgMClcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5nZW9DYW52YXMub2Zmc2NyZWVuQ3R4LmRyYXdJbWFnZSh0aGlzLmNhbnZhc1NhdmUsIDAsIDApXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vZHJhdyBpbWFnZSBzYXZlZCArIGRyYXcgcmVjdGFuZ2xlXG4gICAgICAgICAgICBjb25zdCByZWN0V1BpeCA9IHRoaXMuc2VsZWN0aW9uUmVjdGFuZ2xlV2lkdGhQaXhcbiAgICAgICAgICAgICAgICA/IHRoaXMuc2VsZWN0aW9uUmVjdGFuZ2xlV2lkdGhQaXgoZm9jdXMucmVzb2x1dGlvbiwgdGhpcy5nZW9DYW52YXMudmlldy56KVxuICAgICAgICAgICAgICAgIDogNFxuICAgICAgICAgICAgdGhpcy5nZW9DYW52YXMuaW5pdENhbnZhc1RyYW5zZm9ybSgpXG4gICAgICAgICAgICBjb25zdCBjdHggPSB0aGlzLmdlb0NhbnZhcy5vZmZzY3JlZW5DdHhcbiAgICAgICAgICAgIGN0eC5zdHJva2VTdHlsZSA9IHRoaXMuc2VsZWN0aW9uUmVjdGFuZ2xlQ29sb3JcbiAgICAgICAgICAgIGN0eC5saW5lV2lkdGggPSByZWN0V1BpeFxuICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpXG5cbiAgICAgICAgICAgIGN0eC5yZWN0KFxuICAgICAgICAgICAgICAgIHRoaXMuZ2VvQ2FudmFzLmdlb1RvUGl4WChmb2N1cy5jZWxsLngpIC0gcmVjdFdQaXggLyAyLFxuICAgICAgICAgICAgICAgIHRoaXMuZ2VvQ2FudmFzLmdlb1RvUGl4WShmb2N1cy5jZWxsLnkpICsgcmVjdFdQaXggLyAyLFxuICAgICAgICAgICAgICAgIGZvY3VzLnJlc29sdXRpb24gLyB0aGlzLmdlb0NhbnZhcy52aWV3LnogKyByZWN0V1BpeCxcbiAgICAgICAgICAgICAgICAtZm9jdXMucmVzb2x1dGlvbiAvIHRoaXMuZ2VvQ2FudmFzLnZpZXcueiAtIHJlY3RXUGl4XG4gICAgICAgICAgICApXG4gICAgICAgICAgICBjdHguc3Ryb2tlKClcbiAgICAgICAgICAgIHRoaXMuZ2VvQ2FudmFzLmN0eC5kcmF3SW1hZ2UodGhpcy5nZW9DYW52YXMub2Zmc2NyZWVuQ2FudmFzLCAwLCAwKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5nZW9DYW52YXMuY2FudmFzLnN0eWxlLmN1cnNvciA9ICdkZWZhdWx0JztcbiAgICAgICAgICAgIHRoaXMudG9vbHRpcC5oaWRlKClcbiAgICAgICAgICAgIGlmICh0aGlzLmNhbnZhc1NhdmUpIHRoaXMuZ2VvQ2FudmFzLmN0eC5kcmF3SW1hZ2UodGhpcy5jYW52YXNTYXZlLCAwLCAwKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSBjZWxsIEhUTUwgaW5mbyBhdCBhIGdpdmVuIGdlbyBwb3NpdGlvbi5cbiAgICAgKiBUaGlzIGlzIHVzZWZ1bGwgZm9yIHVzZXIgaW50ZXJhY3Rpb25zLCB0byBzaG93IHRoaXMgaW5mbyB3aGVyZSB0aGUgdXNlciBjbGlja3MgZm9yIGV4YW1wbGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3t4Om51bWJlcix5Om51bWJlcn19IHBvc0dlb1xuICAgICAqIEByZXR1cm5zIHt7Y2VsbDppbXBvcnQoJy4vRGF0YXNldC5qcycpLkNlbGwsaHRtbDpzdHJpbmcscmVzb2x1dGlvbjpudW1iZXJ9IHwgdW5kZWZpbmVkfVxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKi9cbiAgICBnZXRDZWxsRm9jdXNJbmZvKHBvc0dlbykge1xuICAgICAgICAvL2dvIHRocm91Z2ggdGhlIGxheWVycywgc3RhcnRpbmcgZnJvbSB0b3BcbiAgICAgICAgY29uc3QgeiA9IHRoaXMuZ2VvQ2FudmFzLnZpZXcuelxuICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5sYXllcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9MYXllci5qc1wiKS5MYXllcn0gKi9cbiAgICAgICAgICAgIGNvbnN0IGxheWVyID0gdGhpcy5sYXllcnNbaV1cbiAgICAgICAgICAgIGlmIChsYXllci52aXNpYmxlICYmICFsYXllci52aXNpYmxlKHopKSBjb250aW51ZVxuICAgICAgICAgICAgaWYgKGxheWVyLmNlbGxJbmZvSFRNTCA9PT0gJ25vbmUnKSBjb250aW51ZSAvLyB0aGlzIGlzIG5lY2Vzc2FyeSBpbiBvcmRlciB0byBub3Qgc2hvdyB0b29sdGlwcyBmb3IgbGF5ZXJzICdvbiB0b3AnIChlLmcuIHBvcHVsYXRpb24gY2lyY2xlcyBvbiB0b3Agb2Ygc3F1YXJlcylcbiAgICAgICAgICAgIGlmICghbGF5ZXIuY2VsbEluZm9IVE1MKSBjb250aW51ZVxuICAgICAgICAgICAgaWYgKCFsYXllci5nZXREYXRhc2V0KSBjb250aW51ZVxuICAgICAgICAgICAgY29uc3QgZHNjID0gbGF5ZXIuZ2V0RGF0YXNldCh6KVxuICAgICAgICAgICAgaWYgKCFkc2MpIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIC8vZ2V0IGNlbGwgYXQgbW91c2UgcG9zaXRpb25cbiAgICAgICAgICAgIC8qKiBAdHlwZSB7aW1wb3J0KCcuL0RhdGFzZXQuanMnKS5DZWxsfHVuZGVmaW5lZH0gKi9cbiAgICAgICAgICAgIGNvbnN0IGNlbGwgPSBkc2MuZ2V0Q2VsbEZyb21Qb3NpdGlvbihwb3NHZW8sIGRzYy5nZXRWaWV3Q2FjaGUoKSlcblxuICAgICAgICAgICAgaWYgKCFjZWxsKSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgICAgICAgICAgIC8vcmFyZSBjYXNlIGZvciBhIGRhdGFzZXQgd2l0aCBtaXhlZCByZXNvbHV0aW9uc1xuICAgICAgICAgICAgaWYgKGRzYy5taXhlZFJlc29sdXRpb24pIHtcbiAgICAgICAgICAgICAgICBjb25zdCByID0gK2RzYy5taXhlZFJlc29sdXRpb24oY2VsbClcbiAgICAgICAgICAgICAgICBjb25zdCBodG1sID0gbGF5ZXIuY2VsbEluZm9IVE1MKGNlbGwsIHIpXG4gICAgICAgICAgICAgICAgaWYgKCFodG1sKSByZXR1cm4gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgY2VsbDogY2VsbCwgaHRtbDogaHRtbCwgcmVzb2x1dGlvbjogciB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGh0bWwgPSBsYXllci5jZWxsSW5mb0hUTUwoY2VsbCwgZHNjLmdldFJlc29sdXRpb24oKSlcbiAgICAgICAgICAgIGlmICghaHRtbCkgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgICAgICAgcmV0dXJuIHsgY2VsbDogY2VsbCwgaHRtbDogaHRtbCwgcmVzb2x1dGlvbjogZHNjLmdldFJlc29sdXRpb24oKSB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5XG4gICAgICogQHBhcmFtIHtudW1iZXJ8dW5kZWZpbmVkfSB6XG4gICAgICovXG4gICAgc2V0Vmlldyh4LCB5LCB6ID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuZ2VvQ2FudmFzLnZpZXcueCA9IHhcbiAgICAgICAgdGhpcy5nZW9DYW52YXMudmlldy55ID0geVxuICAgICAgICBpZiAoeiAhPSB1bmRlZmluZWQpIHRoaXMuZ2VvQ2FudmFzLnZpZXcueiA9IHpcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKiogQHJldHVybnMge2ltcG9ydCgnLi9HZW9DYW52YXMuanMnKS5WaWV3fSAqL1xuICAgIGdldFZpZXcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdlb0NhbnZhcy52aWV3XG4gICAgfVxuXG4gICAgLyoqIEByZXR1cm5zIHtudW1iZXJ9ICovXG4gICAgZ2V0Wm9vbSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2VvQ2FudmFzLnZpZXcuelxuICAgIH1cbiAgICAvKiogQHBhcmFtIHtudW1iZXJ9IHogQHJldHVybnMge3RoaXN9ICovXG4gICAgc2V0Wm9vbSh6KSB7XG4gICAgICAgIHRoaXMuZ2VvQ2FudmFzLnZpZXcueiA9IHpcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKiogQHJldHVybnMge0FycmF5LjxudW1iZXJ8dW5kZWZpbmVkPn0gKi9cbiAgICBnZXRDZW50ZXJFeHRlbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdlb0NhbnZhcy5nZXRDZW50ZXJFeHRlbnQoKVxuICAgIH1cbiAgICAvKiogQHBhcmFtIHtBcnJheS48bnVtYmVyPn0gdmFsIEByZXR1cm5zIHt0aGlzfSAqL1xuICAgIHNldENlbnRlckV4dGVudCh2YWwpIHtcbiAgICAgICAgdGhpcy5nZW9DYW52YXMuc2V0Q2VudGVyRXh0ZW50KHZhbClcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKiogQHJldHVybnMge0FycmF5LjxudW1iZXI+fSAqL1xuICAgIGdldFpvb21FeHRlbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdlb0NhbnZhcy5nZXRab29tRXh0ZW50KClcbiAgICB9XG4gICAgLyoqIEBwYXJhbSB7QXJyYXkuPG51bWJlcj59IHZhbCBAcmV0dXJucyB7dGhpc30gKi9cbiAgICBzZXRab29tRXh0ZW50KHZhbCkge1xuICAgICAgICB0aGlzLmdlb0NhbnZhcy5zZXRab29tRXh0ZW50KHZhbClcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKiogQHJldHVybnMge3N0cmluZ30gKi9cbiAgICBnZXRCYWNrZ3JvdW5kQ29sb3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdlb0NhbnZhcy5iYWNrZ3JvdW5kQ29sb3JcbiAgICB9XG4gICAgLyoqIEBwYXJhbSB7c3RyaW5nfSB2YWwgQHJldHVybnMge3RoaXN9ICovXG4gICAgc2V0QmFja2dyb3VuZENvbG9yKHZhbCkge1xuICAgICAgICB0aGlzLmdlb0NhbnZhcy5iYWNrZ3JvdW5kQ29sb3IgPSB2YWxcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgc2V0IG9mIHpvb20gYnV0dG9ucyB0byB0aGUgbWFwXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb3B0c1xuICAgICAqIEByZXR1cm5zIHt0aGlzfVxuICAgICAqL1xuICAgIGFkZFpvb21CdXR0b25zKG9wdHMpIHtcbiAgICAgICAgLy8gKiBvcHRzLmlkXG4gICAgICAgIC8vICogb3B0cy5vblpvb20gLSBjdXN0b20gZXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgICAgICAvLyAqIG9wdHMueFxuICAgICAgICAvLyAqIG9wdHMueVxuICAgICAgICAvLyAqIG9wdHMuZGVsdGEgLSB6b29tIGRlbHRhIGFwcGxpZWQgb24gZWFjaCBjbGlja1xuXG4gICAgICAgIHRoaXMuem9vbUJ1dHRvbnMgPSBuZXcgWm9vbUJ1dHRvbnMoe1xuICAgICAgICAgICAgbWFwOiB0aGlzLFxuICAgICAgICAgICAgaWQ6IG9wdHM/LmlkIHx8ICdncmlkdml6LXpvb20tYnV0dG9ucy0nICsgdGhpcy5jb250YWluZXIuaWQsXG4gICAgICAgICAgICBjbGFzczogb3B0cz8uY2xhc3MsXG4gICAgICAgICAgICB4OiBvcHRzPy54LFxuICAgICAgICAgICAgeTogb3B0cz8ueSxcbiAgICAgICAgICAgIG9uWm9vbTogb3B0cz8ub25ab29tLFxuICAgICAgICAgICAgZGVsdGE6IG9wdHM/LmRlbHRhIHx8IDAuMixcbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBmdWxsc2NyZWVuIHRvZ2dsZSBidXR0b24gdG8gdGhlIGFwcFxuICAgICAqXG4gICAgICogQHBhcmFtIHtvYmplY3R9IG9wdHNcbiAgICAgKiBAcmV0dXJucyB7dGhpc31cbiAgICAgKi9cbiAgICBhZGRGdWxsc2NyZWVuQnV0dG9uKG9wdHMpIHtcbiAgICAgICAgLy8gKiBvcHRzLm1hcCAtIHRoZSBncmlkdml6IG1hcFxuICAgICAgICAvLyAqIG9wdHMuaWRcbiAgICAgICAgLy8gKiBvcHRzLnhcbiAgICAgICAgLy8gKiBvcHRzLnlcblxuICAgICAgICB0aGlzLmZ1bGxzY3JlZW5CdXR0b24gPSBuZXcgRnVsbHNjcmVlbkJ1dHRvbih7XG4gICAgICAgICAgICBtYXA6IHRoaXMsXG4gICAgICAgICAgICBpZDogb3B0cz8uaWQgfHwgJ2dyaWR2aXotZnVsbHNjcmVlbi1idXR0b24nLFxuICAgICAgICAgICAgY2xhc3M6IG9wdHM/LmNsYXNzLFxuICAgICAgICAgICAgeDogb3B0cz8ueCxcbiAgICAgICAgICAgIHk6IG9wdHM/LnksXG4gICAgICAgIH0pXG5cbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKiogQHJldHVybnMge3RoaXN9ICovXG4gICAgc2V0Vmlld0Zyb21VUkwoKSB7XG4gICAgICAgIHRoaXMuZ2VvQ2FudmFzLnNldFZpZXdGcm9tVVJMKClcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gQWRkIGEgcmVzaXplIGV2ZW50IG9ic2VydmVyIHRvIHRoZSBBcHBzIGNvbnRhaW5lciBhbmQgdXBkYXRlIHRoZSBjYW52YXMgYWNjb3JkaW5nbHlcbiAgICAgKiBAbWVtYmVyb2YgQXBwXG4gICAgICovXG4gICAgZGVmaW5lUmVzaXplT2JzZXJ2ZXIoKSB7XG4gICAgICAgIC8vIFRyYWNrIHdoZXRoZXIgdGhlIG9ic2VydmVyIGlzIGN1cnJlbnRseSBwcm9jZXNzaW5nIGEgcmVzaXplIGV2ZW50XG4gICAgICAgIGxldCByZXNpemVQZW5kaW5nID0gZmFsc2VcblxuICAgICAgICBjb25zdCByZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoZW50cmllcykgPT4ge1xuICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGVudHJpZXMpIHx8ICFlbnRyaWVzLmxlbmd0aCkgcmV0dXJuXG5cbiAgICAgICAgICAgIGxldCBjb250YWluZXIgPSB0aGlzLmNvbnRhaW5lclxuXG4gICAgICAgICAgICAvLyBFbnN1cmUgdGhlIGNvbnRhaW5lciBoYXMgdmFsaWQgZGltZW5zaW9uc1xuICAgICAgICAgICAgaWYgKGNvbnRhaW5lci5jbGllbnRXaWR0aCA+IDAgJiYgY29udGFpbmVyLmNsaWVudEhlaWdodCA+IDApIHtcbiAgICAgICAgICAgICAgICBpZiAoIXJlc2l6ZVBlbmRpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzaXplUGVuZGluZyA9IHRydWUgLy8gUHJldmVudCBvdmVybGFwcGluZyByZXNpemUgdHJpZ2dlcnNcblxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc2l6ZVBlbmRpbmcgPSBmYWxzZSAvLyBSZXNldCB0aGUgZmxhZyBhZnRlciBwcm9jZXNzaW5nXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBzaXplIGNoYW5nZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmggIT09IGNvbnRhaW5lci5jbGllbnRIZWlnaHQgfHwgdGhpcy53ICE9PSBjb250YWluZXIuY2xpZW50V2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmggPSBjb250YWluZXIuY2xpZW50SGVpZ2h0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53ID0gY29udGFpbmVyLmNsaWVudFdpZHRoXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgZ2VvQ2FudmFzIHNpemVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZW9DYW52YXMuaCA9IHRoaXMuaFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2VvQ2FudmFzLncgPSB0aGlzLndcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdlb0NhbnZhcy5jYW52YXMuc2V0QXR0cmlidXRlKCd3aWR0aCcsIFN0cmluZyh0aGlzLncpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2VvQ2FudmFzLmNhbnZhcy5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsIFN0cmluZyh0aGlzLmgpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2VvQ2FudmFzLm9mZnNjcmVlbkNhbnZhcy5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgU3RyaW5nKHRoaXMudykpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZW9DYW52YXMub2Zmc2NyZWVuQ2FudmFzLnNldEF0dHJpYnV0ZSgnaGVpZ2h0JywgU3RyaW5nKHRoaXMuaCkpXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZHJhdygpXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPcHRpb25hbGx5IHJlcG9zaXRpb24gVUkgZWxlbWVudHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiAodGhpcy56b29tQnV0dG9ucykgdGhpcy56b29tQnV0dG9ucy5ub2RlLnN0eWxlLmxlZnQgPSB0aGlzLncgLSA1MCArICdweCc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgKHRoaXMuZnVsbHNjcmVlbkJ1dHRvbikgdGhpcy5mdWxsc2NyZWVuQnV0dG9uLm5vZGUuc3R5bGUubGVmdCA9IHRoaXMudyAtIDUwICsgJ3B4JztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG5cbiAgICAgICAgcmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLmNvbnRhaW5lcilcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gRGVzdHJveSB0aGUgbWFwIGFuZCBpdCdzIGV2ZW50IGxpc3RlbmVyc1xuICAgICAqIFRoaXMgc2hvdWxkIHNpZ25pZmljYW50bHkgcmVkdWNlIHRoZSBtZW1vcnkgdXNlZCB3aGVuIGNyZWF0aW5nIGFuZCBkZXN0cm95aW5nIGdyaWR2aXogbWFwIGluc3RhbmNlcyAoZm9yIGV4YW1wbGUgaW4gbGVhZmxldC1ncmlkdml6KVxuICAgICAqIEBtZW1iZXJvZiBBcHBcbiAgICAgKi9cbiAgICBkZXN0cm95KCkge1xuICAgICAgICAvLyBjbGVhciBsYXllcnNcbiAgICAgICAgdGhpcy5sYXllcnMgPSBbXVxuICAgICAgICB0aGlzLmJnTGF5ZXJzID0gW11cblxuICAgICAgICAvLyByZW1vdmUgZXZlbnQgbGlzdGVuZXJzIGZyb20gY29udGFpbmVyXG4gICAgICAgIHRoaXMuY29udGFpbmVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlb3ZlcicsIHRoaXMubW91c2VPdmVySGFuZGxlcilcbiAgICAgICAgdGhpcy5jb250YWluZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5tb3VzZU1vdmVIYW5kbGVyKVxuICAgICAgICB0aGlzLmNvbnRhaW5lci5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW91dCcsIHRoaXMubW91c2VPdXRIYW5kbGVyKVxuXG4gICAgICAgIC8vIHJlbW92ZSBjYW52YXNcbiAgICAgICAgdGhpcy5nZW9DYW52YXMuY2FudmFzLnJlbW92ZSgpXG5cbiAgICAgICAgLy8gcmVtb3ZlIGxlZ2VuZFxuICAgICAgICAvLyBvbmx5IHJlbW92ZSBsZWdlbmQgaWYgZ3JpZHZpeiBjcmVhdGVkIGl0XG4gICAgICAgIGlmICghdGhpcy5fbGVnZW5kUHJvdmlkZWRCeVVzZXIpIHtcbiAgICAgICAgICAgIHRoaXMubGVnZW5kPy5yZW1vdmUoKVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gcmVtb3ZlIHRvb2x0aXBcbiAgICAgICAgdGhpcy50b29sdGlwLnRvb2x0aXA/LnJlbW92ZSgpXG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG4vKipcbiAqIEEgbXVsdGkgcmVzb2x1dGlvbiBkYXRhc2V0IG9mIGdyaWQgY2VsbHMuXG4gKiBJdCBjb25zaXN0cyBvZiBkaWZmZXJlbnQge0BsaW5rIERhdGFzZXR9cyBmb3IgZWFjaCByZXNvbHV0aW9uLlxuICpcbiAqIEBhYnN0cmFjdFxuICpcbiAqIEBtb2R1bGUgY29yZVxuICogQGF1dGhvciBKb3NlcGggRGF2aWVzLCBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgTXVsdGlSZXNvbHV0aW9uRGF0YXNldCB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtBcnJheS48bnVtYmVyPn0gcmVzb2x1dGlvbnMgVGhlIHJlc29sdXRpb25zIG9mIHRoZSBkYXRhc2V0cywgaW4gQ1JTIGdlb2dyYXBoaWNhbCB1bml0LlxuICAgICAqIEBwYXJhbSB7QXJyYXkuPGltcG9ydChcIi4vRGF0YXNldFwiKS5EYXRhc2V0PnxmdW5jdGlvbihudW1iZXIpOmltcG9ydChcIi4vRGF0YXNldFwiKS5EYXRhc2V0fSBkYXRhc2V0cyBUaGUgZGF0YXNldHMgbGlzdCwgb25lIHBlciByZXNvbHV0aW9uLiBPciBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIGRhdGFzZXQgZnJvbSBhIHJlc29sdXRpb24gdmFsdWUuXG4gICAgICogQHBhcmFtIHsge3ByZXByb2Nlc3M/OmZ1bmN0aW9uKGltcG9ydChcIi4vRGF0YXNldFwiKS5DZWxsKTpib29sZWFufSB9IG9wdHMgT3B0aW9ucy4gcHJlcHJvY2VzczogQSBmdW5jdGlvbiB0byBhcHBseSBvbiBlYWNoIGRhdGFzZXQgY2VsbCB0byBwcmVwYXJlIGl0cyB2YWx1ZXMuIENhbiBiZSB1c2VkIGFsc28gdG8gc2VsZWN0IGNlbGxzIHRvIGtlZXAuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IocmVzb2x1dGlvbnMsIGRhdGFzZXRzLCBvcHRzID0ge30pIHtcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvKiogVGhlIHJlc29sdXRpb25zIG9mIHRoZSBkYXRhc2V0cywgaW4gQ1JTIGdlb2dyYXBoaWNhbCB1bml0LlxuICAgICAgICAgKiBAdHlwZSB7QXJyYXkuPG51bWJlcj59ICovXG4gICAgICAgIHRoaXMucmVzb2x1dGlvbnMgPSByZXNvbHV0aW9uc1xuXG4gICAgICAgIC8qKiBUaGUgZGF0YXNldHMuIElmIHRoZSBsaXN0IGlzIG5vdCBleHBsaWN0ZWx5IGRlZmluZWQsIGJ1aWxkIGl0IGZyb20gdGhlIHJlc29sdXRpb24gbGlzdCB3aXRoIHRoZSBmdW5jdGlvblxuICAgICAgICAgKiBAdHlwZSB7QXJyYXkuPGltcG9ydChcIi4vRGF0YXNldFwiKS5EYXRhc2V0Pn0gKi9cbiAgICAgICAgdGhpcy5kYXRhc2V0cyA9IHR5cGVvZiBkYXRhc2V0cyA9PT0gJ2Z1bmN0aW9uJyA/IHRoaXMucmVzb2x1dGlvbnMubWFwKGRhdGFzZXRzKSA6IGRhdGFzZXRzXG5cbiAgICAgICAgLy90aGVyZSBtdXN0IGJlIGFzIG1hbnkgZGF0YXNldHMgYXMgcmVzb2x1dGlvbnNcbiAgICAgICAgaWYgKHRoaXMuZGF0YXNldHMubGVuZ3RoID4gMSAmJiB0aGlzLmRhdGFzZXRzLmxlbmd0aCAhPSB0aGlzLnJlc29sdXRpb25zLmxlbmd0aClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAnVW5jb21wYXRpYmxlIG51bWJlciBvZiBkYXRhc2V0cyBhbmQgcmVzb2x1dGlvbnM6ICcgK1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGFzZXRzLmxlbmd0aCArXG4gICAgICAgICAgICAgICAgICAgICcgJyArXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVzb2x1dGlvbnMubGVuZ3RoXG4gICAgICAgICAgICApXG5cbiAgICAgICAgLy9zZXQgZGF0YXNldCBwcmVwcm9jZXNzZXMgaWYgc3BlY2lmaWVkXG4gICAgICAgIGlmIChvcHRzLnByZXByb2Nlc3MpIHRoaXMuc2V0UHJlcG9jZXNzZXMob3B0cy5wcmVwcm9jZXNzKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgcmVsZXZhbnQgZGF0YXNldCBmb3IgYSBzcGVjaWZpZWQgem9vbS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gelxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBtaW5QaXhlbHNQZXJDZWxsXG4gICAgICogQHJldHVybnMge2ltcG9ydChcIi4vRGF0YXNldFwiKS5EYXRhc2V0fHVuZGVmaW5lZH1cbiAgICAgKiAqL1xuICAgIGdldERhdGFzZXQoeiwgbWluUGl4ZWxzUGVyQ2VsbCkge1xuICAgICAgICAvL3NwZWNpYWwgY2FzZSB3aGl0aCBzaW5nbGUgZGF0YXNldFxuICAgICAgICBpZiAodGhpcy5kYXRhc2V0cy5sZW5ndGggPT0gMSkgcmV0dXJuIHRoaXMuZGF0YXNldHNbMF1cblxuICAgICAgICBjb25zdCBycyA9IHRoaXMucmVzb2x1dGlvbnNcbiAgICAgICAgbGV0IGkgPSAwXG4gICAgICAgIGxldCB6XyA9IHJzW2ldIC8gbWluUGl4ZWxzUGVyQ2VsbFxuICAgICAgICB3aGlsZSAoel8gPCB6ICYmIGkgPCBycy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGkrK1xuICAgICAgICAgICAgel8gPSByc1tpXSAvIG1pblBpeGVsc1BlckNlbGxcbiAgICAgICAgfVxuICAgICAgICAvL2lmIChpID09IDApIHJldHVybiB0aGlzLmRhdGFzZXQuZGF0YXNldHNbMF07XG4gICAgICAgIC8vcmV0dXJuIHRoaXMuZGF0YXNldC5kYXRhc2V0c1tpIC0gMV07XG4gICAgICAgIGlmIChpID09IHJzLmxlbmd0aCkgcmV0dXJuIHRoaXMuZGF0YXNldHNbcnMubGVuZ3RoIC0gMV1cbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YXNldHNbaV1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgYSBwcmVwcm9jZXNzIGZ1bmN0aW9uIGZvciBhbGwgZGF0YXNldHMuXG4gICAgICogVGhpcyBpcyBhIGZ1bmN0aW9uIGFwcGxpZWQgb24gZWFjaCBjZWxsIGFmdGVyIGl0IGhhcyBiZWVuIGxvYWRlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oaW1wb3J0KFwiLi9EYXRhc2V0XCIpLkNlbGwpOmJvb2xlYW59IHByZXByb2Nlc3NcbiAgICAgKiBAcmV0dXJucyB7dGhpc31cbiAgICAgKi9cbiAgICBzZXRQcmVwb2Nlc3NlcyhwcmVwcm9jZXNzKSB7XG4gICAgICAgIGZvciAobGV0IGRzIG9mIHRoaXMuZGF0YXNldHMpIGRzLnByZXByb2Nlc3MgPSBwcmVwcm9jZXNzXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBmdW5jdGlvbiB0byBlYXNlIHRoZSBjcmVhdGlvbiBvZiBtdWx0aSByZXNvbHV0aW9uIGRhdGFzZXRzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtBcnJheS48bnVtYmVyPn0gcmVzb2x1dGlvbnMgVGhlIHJlc29sdXRpb25zIG9mIHRoZSBkYXRhc2V0cywgaW4gQ1JTIGdlb2dyYXBoaWNhbCB1bml0XG4gICAgICogQHBhcmFtIHtmdW5jdGlvbihudW1iZXIpOmltcG9ydChcIi4vRGF0YXNldFwiKS5EYXRhc2V0fSByZXNUb0RhdGFzZXQgRnVuY3Rpb24gcmV0dXJuaW5nIGEgZGF0YXNldCBmcm9tIGEgcmVzb2x1dGlvblxuICAgICAqIEBwYXJhbSB7IHtwcmVwcm9jZXNzPzpmdW5jdGlvbihpbXBvcnQoXCIuL0RhdGFzZXRcIikuQ2VsbCk6Ym9vbGVhbn0gfSBvcHRzIE9wdGlvbnMuIHByZXByb2Nlc3M6IEEgZnVuY3Rpb24gdG8gYXBwbHkgb24gZWFjaCBkYXRhc2V0IGNlbGwgdG8gcHJlcGFyZSBpdHMgdmFsdWVzXG4gICAgICogQHJldHVybnMge011bHRpUmVzb2x1dGlvbkRhdGFzZXR9XG4gICAgICovXG4gICAgLypzdGF0aWMgbWFrZShyZXNvbHV0aW9ucywgcmVzVG9EYXRhc2V0LCBvcHRzKSB7XG4gICAgICAgIC8vbWFrZSBkYXRhc2V0c1xuICAgICAgICBjb25zdCBkc2MgPSBbXVxuICAgICAgICBmb3IgKGNvbnN0IHJlcyBvZiByZXNvbHV0aW9ucykgZHNjLnB1c2gocmVzVG9EYXRhc2V0KHJlcykpXG4gICAgICAgIC8vbWFrZSBtdWx0aSByZXNvbHV0aW9uIGRhdGFzZXRcbiAgICAgICAgcmV0dXJuIG5ldyBNdWx0aVJlc29sdXRpb25EYXRhc2V0KGRzYywgcmVzb2x1dGlvbnMsIG9wdHMpXG4gICAgfSovXG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IERyYXdhYmxlIH0gZnJvbSAnLi9EcmF3YWJsZS5qcydcblxuLyoqIEB0eXBlZGVmIHtcInNxdWFyZVwifFwiY2lyY2xlXCJ8XCJkaWFtb25kXCJ8XCJkb251dFwifFwidHJpYW5nbGVfdXBcInxcInRyaWFuZ2xlX2Rvd25cInxcInRyaWFuZ2xlX2xlZnRcInxcInRyaWFuZ2xlX3JpZ2h0XCJ8XCJub25lXCJ9IFNoYXBlICovXG5cbi8qKlxuICogdmlld1NjYWxlIHR5cGVcbiAqIFJldHVybnMgYW4gb2JqZWN0IGZyb20gYSBsaXN0IG9mIGNlbGxzLFxuICogQHR5cGVkZWYge2Z1bmN0aW9uKEFycmF5LjxpbXBvcnQoJy4vRGF0YXNldC5qcycpLkNlbGw+LG51bWJlciwgbnVtYmVyKToqfSBWaWV3U2NhbGUgKi9cblxuLyoqXG4gKiBBIHN0eWxlLCB0byBzaG93IGEgZ3JpZCBkYXRhc2V0LlxuICpcbiAqIEBtb2R1bGUgY29yZVxuICogQGF1dGhvciBKb3NlcGggRGF2aWVzLCBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgU3R5bGUgZXh0ZW5kcyBEcmF3YWJsZSB7XG4gICAgLyoqXG4gICAgICogQGFic3RyYWN0XG4gICAgICogQHBhcmFtIHt7ZmlsdGVyPzpmdW5jdGlvbihpbXBvcnQoJy4vRGF0YXNldCcpLkNlbGwpOmJvb2xlYW4sIG9mZnNldD86ZnVuY3Rpb24oaW1wb3J0KCcuL0RhdGFzZXQnKS5DZWxsLCBudW1iZXIsIG51bWJlcik6e2R4Om51bWJlcixkeTpudW1iZXJ9LCB2aXNpYmxlPzpmdW5jdGlvbihudW1iZXIpOmJvb2xlYW4sYWxwaGE/OmZ1bmN0aW9uKG51bWJlcik6bnVtYmVyLGJsZW5kT3BlcmF0aW9uPzpmdW5jdGlvbihudW1iZXIpOkdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbixkcmF3RnVuPzpmdW5jdGlvbix2aWV3U2NhbGU/OlZpZXdTY2FsZX19IG9wdHNcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtWaWV3U2NhbGV8dW5kZWZpbmVkfSAqL1xuICAgICAgICB0aGlzLnZpZXdTY2FsZSA9IG9wdHMudmlld1NjYWxlXG5cbiAgICAgICAgLyoqIEEgZmlsdGVyIGZ1bmN0aW9uIHRvIGFwcGx5IHRvIHRoZSBjZWxsIGxpc3QsIHRvIGZpbHRlciBvdXQgc29tZSBjZWxscyBub3QgdG8gYmUgZHJhd24gKHN1Y2ggYXMgZm9yIGV4YW1wbGUgdGhlIGNlbGxzIHdpdGggdmFsdWU9MCkuXG4gICAgICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgICAgICogQHR5cGUgeyhmdW5jdGlvbihpbXBvcnQoJy4vRGF0YXNldCcpLkNlbGwpOmJvb2xlYW4pIHwgdW5kZWZpbmVkfSAqL1xuICAgICAgICB0aGlzLmZpbHRlciA9IG9wdHMuZmlsdGVyIHx8IHVuZGVmaW5lZFxuXG4gICAgICAgIC8qKiBBbiBvZmZzZXQuIFRoaXMgaXMgdG8gYWx0ZXIgdGhlIHBvc2l0aW9uIG9mIGFsbCBzeW1ib2xzIGluIGEgZ2l2ZW4gZGlyZWN0aW9uLiBJbiBnZW9ncmFwaGljYWwgdW5pdC5cbiAgICAgICAgICogQHByb3RlY3RlZFxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuL0RhdGFzZXQnKS5DZWxsLG51bWJlcixudW1iZXIpOntkeDpudW1iZXIsZHk6bnVtYmVyfX0gKi9cbiAgICAgICAgdGhpcy5vZmZzZXQgPSBvcHRzLm9mZnNldCB8fCAoKGMsIHIsIHopID0+ICh7IGR4OiAwLCBkeTogMCB9KSlcblxuICAgICAgICAvKiogQSBkcmF3IGZ1bmN0aW9uIGZvciB0aGUgc3R5bGUuXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbnx1bmRlZmluZWR9ICovXG4gICAgICAgIHRoaXMuZHJhd0Z1biA9IG9wdHMuZHJhd0Z1blxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcHVibGljXG4gICAgICAgICAqIEB0eXBlIHtBcnJheS48aW1wb3J0KFwiLi9MZWdlbmRcIikuTGVnZW5kPn0gKi9cbiAgICAgICAgdGhpcy5sZWdlbmRzID0gW11cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEcmF3IGNlbGxzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KCcuL0RhdGFzZXQnKS5DZWxsPn0gY2VsbHMgVGhlIGNlbGxzIHRvIGRyYXcuXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuL0dlb0NhbnZhc1wiKS5HZW9DYW52YXN9IGdlb0NhbnZhcyBUaGUgY2FudmFzIHdoZXJlIHRvIGRyYXcgdGhlbS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVzb2x1dGlvbiBUaGVpciByZXNvbHV0aW9uIChpbiBnZW9ncmFwaGljIHVuaXQpXG4gICAgICogQGFic3RyYWN0XG4gICAgICovXG4gICAgZHJhdyhjZWxscywgZ2VvQ2FudmFzLCByZXNvbHV0aW9uKSB7XG4gICAgICAgIGlmICh0aGlzLmRyYXdGdW4pIHRoaXMuZHJhd0Z1bihjZWxscywgZ2VvQ2FudmFzLCByZXNvbHV0aW9uKVxuICAgICAgICBlbHNlIHRocm93IG5ldyBFcnJvcignTWV0aG9kIGRyYXcgbm90IGltcGxlbWVudGVkLicpXG4gICAgfVxuXG4gICAgLy9nZXR0ZXJzIGFuZCBzZXR0ZXJzXG5cbiAgICAvKiogQHJldHVybnMge2Z1bmN0aW9uKGltcG9ydCgnLi9EYXRhc2V0JykuQ2VsbCxudW1iZXIsbnVtYmVyKTp7ZHg6bnVtYmVyLGR5Om51bWJlcn19ICovXG4gICAgZ2V0T2Zmc2V0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vZmZzZXRcbiAgICB9XG4gICAgLyoqIEBwYXJhbSB7ZnVuY3Rpb24oaW1wb3J0KCcuL0RhdGFzZXQnKS5DZWxsLG51bWJlcixudW1iZXIpOntkeDpudW1iZXIsZHk6bnVtYmVyfX0gdmFsIEByZXR1cm5zIHt0aGlzfSAqL1xuICAgIHNldE9mZnNldCh2YWwpIHtcbiAgICAgICAgdGhpcy5vZmZzZXQgPSB2YWxcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKiogVXBkYXRlIGxlZ2VuZHMgb2YgdGhlIHN0eWxlLCBpZiBhbnlcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb3B0c1xuICAgICAqIEByZXR1cm5zIHt0aGlzfSAqL1xuICAgIHVwZGF0ZUxlZ2VuZHMob3B0cykge1xuICAgICAgICBTdHlsZS51cGRhdGVMZWdlbmRzUmVjdXJzaXZlKHRoaXMubGVnZW5kcywgb3B0cylcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKiogQHByaXZhdGUgKi9cbiAgICBzdGF0aWMgdXBkYXRlTGVnZW5kc1JlY3Vyc2l2ZShsZywgb3B0cykge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShsZykpIGZvciAoY29uc3QgbGdfIG9mIGxnKSB0aGlzLnVwZGF0ZUxlZ2VuZHNSZWN1cnNpdmUobGdfLCBvcHRzKVxuICAgICAgICBlbHNlIGxnLnVwZGF0ZShvcHRzKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7QXJyYXkuPGltcG9ydChcIi4vTGVnZW5kXCIpLkxlZ2VuZD59IGxlZ2VuZHNcbiAgICAgKiBAcmV0dXJucyB7dGhpc30gKi9cbiAgICBhZGRMZWdlbmRzKGxlZ2VuZHMpIHtcbiAgICAgICAgZm9yIChsZXQgbGVnZW5kIG9mIGxlZ2VuZHMpIHRoaXMubGVnZW5kcy5wdXNoKGxlZ2VuZClcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IHNlbGVjdCB9IGZyb20gJ2QzLXNlbGVjdGlvbidcbi8vaW1wb3J0IHsgdHJhbnNpdGlvbiB9IGZyb20gXCJkMy10cmFuc2l0aW9uXCI7XG5cbi8qKlxuICogQSBnZW5lcmljIGNsYXNzIHRvIG1ha2UgYSB0b29sdGlwLlxuICogSXQgaXMgYSBkaXYgZWxlbWVudCwgd2hpY2ggY2FuIGJlIG1vdmVkIHVuZGVyIHRoZSBtb3VzZSBwb2ludGVyIGFuZCBmaWxsZWQgd2l0aCBzb21lIGluZm9ybWF0aW9uIGluIGh0bWwuXG4gKiBAbW9kdWxlIGNvcmVcbiAqL1xuZXhwb3J0IGNsYXNzIFRvb2x0aXAge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXG4gICAgICovXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLm1heFdpZHRoID0gb3B0cy5tYXhXaWR0aCB8fCAnMjBlbSdcbiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuZm9udFNpemUgPSBvcHRzLmZvbnRTaXplIHx8ICcxLjJlbSdcbiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuYmFja2dyb3VuZCA9IG9wdHMuYmFja2dyb3VuZCB8fCAnd2hpdGUnXG4gICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLnBhZGRpbmcgPSBvcHRzLnBhZGRpbmcgfHwgJzVweCdcbiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuYm9yZGVyID0gb3B0cy5ib3JkZXIgfHwgJzBweCdcbiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgICAgIHRoaXNbJ2JvcmRlci1yYWRpdXMnXSA9IG9wdHNbJ2JvcmRlci1yYWRpdXMnXSB8fCAnMHB4J1xuICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpc1snYm94LXNoYWRvdyddID0gb3B0c1snYm94LXNoYWRvdyddIHx8ICc1cHggNXB4IDVweCBncmV5J1xuICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgdGhpc1snZm9udC1mYW1pbHknXSA9IG9wdHNbJ2ZvbnQtZmFtaWx5J10gfHwgJ0hlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWYnXG5cbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgIHRoaXMudHJhbnNpdGlvbkR1cmF0aW9uID0gb3B0cy50cmFuc2l0aW9uRHVyYXRpb24gfHwgMTAwXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLnhPZmZzZXQgPSBvcHRzLnhPZmZzZXQgfHwgMzBcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgIHRoaXMueU9mZnNldCA9IG9wdHMueU9mZnNldCB8fCAyMFxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi8gLy8gZS5nLiB0byBwcmV2ZW50IG1vdXNlIGN1cnNvciBjb3ZlcmluZyBjZWxsIGJlaW5nIGhpZ2hsaWdodGVkXG4gICAgICAgIHRoaXMueU1vdXNlT2Zmc2V0ID0gb3B0cy55TW91c2VPZmZzZXQgfHwgMFxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgdGhpcy54TW91c2VPZmZzZXQgPSBvcHRzLnhNb3VzZU9mZnNldCB8fCAwXG4gICAgICAgIC8qKiBAdHlwZSB7SFRNTEVsZW1lbnR9ICovXG4gICAgICAgIHRoaXMucGFyZW50RWxlbWVudCA9IG9wdHMucGFyZW50RWxlbWVudCB8fCBkb2N1bWVudC5ib2R5XG4gICAgICAgIC8qKiBAdHlwZSB7SFRNTEVsZW1lbnR9ICovXG4gICAgICAgIHRoaXMudG9vbHRpcEVsZW1lbnQgPSBvcHRzLnRvb2x0aXBFbGVtZW50IHx8IG51bGxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQHB1YmxpY1xuICAgICAgICAgKiBAdHlwZSB7aW1wb3J0KFwiZDMtc2VsZWN0aW9uXCIpLlNlbGVjdGlvbn0gKi9cbiAgICAgICAgdGhpcy50b29sdGlwID0gb3B0cy50b29sdGlwRWxlbWVudFxuICAgICAgICAgICAgPyBzZWxlY3Qob3B0cy50b29sdGlwRWxlbWVudCkgLy8gV3JhcCB0aGUgcHJvdmlkZWQgSFRNTCBub2RlIGluIGEgRDMgc2VsZWN0aW9uXG4gICAgICAgICAgICA6IHNlbGVjdCh0aGlzLnBhcmVudEVsZW1lbnQpLmFwcGVuZCgnZGl2JykuYXR0cignaWQnLCAnZ3JpZHZpei10b29sdGlwJykuYXR0cignY2xhc3MnLCAnZ3JpZHZpei10b29sdGlwJykgLy8gY3JlYXRlIGRlZmF1bHQgZWxlbWVudFxuXG4gICAgICAgIC8vaW5pdGlhbGlzZVxuICAgICAgICB0aGlzLnRvb2x0aXAuc3R5bGUoJ21heC13aWR0aCcsIHRoaXMubWF4V2lkdGgpXG4gICAgICAgIHRoaXMudG9vbHRpcC5zdHlsZSgnb3ZlcmZsb3cnLCAnaGlkZGVuJylcbiAgICAgICAgdGhpcy50b29sdGlwLnN0eWxlKCdmb250LXNpemUnLCB0aGlzLmZvbnRTaXplKVxuICAgICAgICB0aGlzLnRvb2x0aXAuc3R5bGUoJ2JhY2tncm91bmQnLCB0aGlzLmJhY2tncm91bmQpXG4gICAgICAgIHRoaXMudG9vbHRpcC5zdHlsZSgncGFkZGluZycsIHRoaXMucGFkZGluZylcbiAgICAgICAgdGhpcy50b29sdGlwLnN0eWxlKCdib3JkZXInLCB0aGlzLmJvcmRlcilcbiAgICAgICAgdGhpcy50b29sdGlwLnN0eWxlKCdib3JkZXItcmFkaXVzJywgdGhpc1snYm9yZGVyLXJhZGl1cyddKVxuICAgICAgICB0aGlzLnRvb2x0aXAuc3R5bGUoJ2JveC1zaGFkb3cnLCB0aGlzWydib3gtc2hhZG93J10pXG4gICAgICAgIHRoaXMudG9vbHRpcC5zdHlsZSgnZm9udC1mYW1pbHknLCB0aGlzWydmb250LWZhbWlseSddKVxuICAgICAgICB0aGlzLnRvb2x0aXAuc3R5bGUoJ3Bvc2l0aW9uJywgJ2Fic29sdXRlJylcbiAgICAgICAgdGhpcy50b29sdGlwLnN0eWxlKCdwb2ludGVyLWV2ZW50cycsICdub25lJylcbiAgICAgICAgdGhpcy50b29sdGlwLnN0eWxlKCdvcGFjaXR5JywgJzAnKVxuICAgICAgICB0aGlzLnRvb2x0aXAuc3R5bGUoJ3RleHQtd3JhcCcsICdub3dyYXAnKVxuICAgICAgICB0aGlzLnRvb2x0aXAuc3R5bGUoJ3otaW5kZXgnLCA5OTk5OTk5OSkgLy8gaW1wb3J0YW50IGZvciBsZWFmbGV0LWdyaWR2aXogZXRjXG5cbiAgICAgICAgLy8gdGhlc2UgcGxhY2Vob2xkZXJzIGFyZSBuZWVkZWQgdG8gcHJldmVudCBhbiBpbmZpbml0ZSBET00gcmVzaXplT2JzZXJ2ZXIgbG9vcDpcbiAgICAgICAgdGhpcy50b29sdGlwLnN0eWxlKCdsZWZ0JywgJzAnKVxuICAgICAgICB0aGlzLnRvb2x0aXAuc3R5bGUoJ3RvcCcsICcwJylcblxuICAgICAgICAvLyBhcmlhLWxhYmVscyAodGhhbmtzIHRvIHdhaGxhdGxhcylcbiAgICAgICAgdGhpcy50b29sdGlwLmF0dHIoJ3JvbGUnLCAndG9vbHRpcCcpLmF0dHIoJ2FyaWEtbGl2ZScsICdwb2xpdGUnKVxuICAgIH1cblxuICAgIC8qKiBTaG93IHRoZSB0b29sdGlwICovXG4gICAgc2hvdygpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICB0aGlzLnRvb2x0aXAudHJhbnNpdGlvbigpLmR1cmF0aW9uKHRoaXMudHJhbnNpdGlvbkR1cmF0aW9uKS5zdHlsZSgnb3BhY2l0eScsIDEpXG4gICAgfVxuXG4gICAgLyoqIEhpZGUgdGhlIHRvb2x0aXAgKi9cbiAgICBoaWRlKCkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHRoaXMudG9vbHRpcC50cmFuc2l0aW9uKCkuZHVyYXRpb24odGhpcy50cmFuc2l0aW9uRHVyYXRpb24pLnN0eWxlKCdvcGFjaXR5JywgMClcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIGNvbnRlbnQgb2YgdGhlIHRvb2x0aXAuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGh0bWxcbiAgICAgKi9cbiAgICBodG1sKGh0bWwpIHtcbiAgICAgICAgdGhpcy50b29sdGlwLmh0bWwoaHRtbClcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIHBvc2l0aW9uIG9mIHRoZSB0b29sdGlwIGF0IHRoZSBtb3VzZSBldmVudCBwb3NpdGlvbi5cbiAgICAgKiBAcGFyYW0ge01vdXNlRXZlbnR9IGV2ZW50XG4gICAgICovXG4gICAgc2V0UG9zaXRpb24oZXZlbnQpIHtcbiAgICAgICAgLy8gR2V0IHRoZSBib3VuZGluZyByZWN0IG9mIHRoZSBwYXJlbnQgY29udGFpbmVyIChtYXAyKVxuICAgICAgICBsZXQgcGFyZW50UmVjdCA9IHRoaXMucGFyZW50RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuXG4gICAgICAgIC8vIEdldCB0aGUgbW91c2UgcG9zaXRpb24gKHJlbGF0aXZlIHRvIHRoZSBwYXJlbnQgY29udGFpbmVyKVxuICAgICAgICBsZXQgeCA9IGV2ZW50LmNsaWVudFggLSBwYXJlbnRSZWN0LmxlZnQgKyB0aGlzLnhPZmZzZXQgLy8gUmVsYXRpdmUgdG8gcGFyZW50XG4gICAgICAgIGxldCB5ID0gZXZlbnQuY2xpZW50WSAtIHBhcmVudFJlY3QudG9wIC0gdGhpcy55T2Zmc2V0IC8vIFJlbGF0aXZlIHRvIHBhcmVudFxuXG4gICAgICAgIC8vIE5vdywgYXBwbHkgdGhlIHBvc2l0aW9uIHRvIHRoZSB0b29sdGlwXG4gICAgICAgIHRoaXMudG9vbHRpcC5zdHlsZSgnbGVmdCcsIHggKyAncHgnKS5zdHlsZSgndG9wJywgeSArICdweCcpXG5cbiAgICAgICAgLy8gRW5zdXJlIHRoZSB0b29sdGlwIHN0YXlzIGluc2lkZSB0aGUgcGFyZW50IGNvbnRhaW5lclxuICAgICAgICB0aGlzLmVuc3VyZVRvb2x0aXBJbnNpZGVDb250YWluZXIoZXZlbnQsIHBhcmVudFJlY3QsIHRoaXMudG9vbHRpcC5ub2RlKCkpXG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBmdW5jdGlvbiBlbnN1cmVUb29sdGlwSW5zaWRlQ29udGFpbmVyXG4gICAgICogQGRlc2NyaXB0aW9uIFByZXZlbnRzIHRoZSB0b29sdGlwIGZyb20gb3ZlcmZsb3dpbmcgb3V0IG9mIHRoZSBBcHAgY29udGFpbmVyIChlbnN1cmVzIHRoYXQgdGhlIHRvb2x0aXAgaXMgaW5zaWRlIHRoZSBncmlkdml6IGNvbnRhaW5lcilcbiAgICAgKiBAcGFyYW0ge01vdXNlRXZlbnR9IGV2ZW50XG4gICAgICogQHBhcmFtIHtET01SZWN0fSBwYXJlbnRSZWN0XG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gdG9vbHRpcE5vZGVcbiAgICAgKi9cbiAgICBlbnN1cmVUb29sdGlwSW5zaWRlQ29udGFpbmVyKGV2ZW50LCBwYXJlbnRSZWN0LCB0b29sdGlwTm9kZSkge1xuICAgICAgICBsZXQgbm9kZSA9IHRvb2x0aXBOb2RlXG4gICAgICAgIGxldCBwYXJlbnRXaWR0aCA9IHBhcmVudFJlY3Qud2lkdGhcbiAgICAgICAgbGV0IHBhcmVudEhlaWdodCA9IHBhcmVudFJlY3QuaGVpZ2h0XG5cbiAgICAgICAgLy8gRW5zdXJlIHRvb2x0aXAgZG9lc24ndCBnbyBiZXlvbmQgdGhlIHJpZ2h0IGVkZ2VcbiAgICAgICAgaWYgKG5vZGUub2Zmc2V0TGVmdCArIG5vZGUuY2xpZW50V2lkdGggPiBwYXJlbnRXaWR0aCkge1xuICAgICAgICAgICAgbGV0IGxlZnQgPSBldmVudC5jbGllbnRYIC0gbm9kZS5jbGllbnRXaWR0aCAtIHRoaXMueE9mZnNldFxuICAgICAgICAgICAgbm9kZS5zdHlsZS5sZWZ0ID0gbGVmdCArICdweCdcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEVuc3VyZSB0b29sdGlwIGRvZXNuJ3QgZ28gYmV5b25kIHRoZSBib3R0b20gZWRnZVxuICAgICAgICBpZiAobm9kZS5vZmZzZXRUb3AgKyBub2RlLmNsaWVudEhlaWdodCA+IHBhcmVudEhlaWdodCkge1xuICAgICAgICAgICAgbm9kZS5zdHlsZS50b3AgPSBwYXJlbnRIZWlnaHQgLSBub2RlLmNsaWVudEhlaWdodCArICdweCdcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEVuc3VyZSB0b29sdGlwIGRvZXNuJ3QgZ28gYWJvdmUgdGhlIHRvcCBlZGdlXG4gICAgICAgIGlmIChub2RlLm9mZnNldFRvcCA8IDApIHtcbiAgICAgICAgICAgIG5vZGUuc3R5bGUudG9wID0gMCArICdweCdcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEVuc3VyZSB0b29sdGlwIGRvZXNuJ3QgZ28gYmV5b25kIHRoZSBsZWZ0IGVkZ2VcbiAgICAgICAgaWYgKG5vZGUub2Zmc2V0TGVmdCA8IDApIHtcbiAgICAgICAgICAgIG5vZGUuc3R5bGUubGVmdCA9IDAgKyAncHgnXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKlxuXHRteS5tb3VzZW92ZXIgPSBmdW5jdGlvbiAoZXZlbnQsIGh0bWwpIHtcblx0XHRpZiAoaHRtbCkgbXkuaHRtbChodG1sKTtcblx0XHRteS5zZXRQb3NpdGlvbihldmVudCk7XG5cdFx0bXkuc2hvdygpXG5cdFx0Ly90aGlzLmVuc3VyZVRvb2x0aXBJbnNpZGVDb250YWluZXIoKTtcblx0fTtcblx0XG5cdG15Lm1vdXNlbW92ZSA9IGZ1bmN0aW9uIChldmVudCkge1xuXHRcdG15LnNldFBvc2l0aW9uKGV2ZW50KTtcblx0XHQvL3RoaXMuZW5zdXJlVG9vbHRpcEluc2lkZUNvbnRhaW5lcigpO1xuXHR9O1xuXHRcblx0bXkubW91c2VvdXQgPSBmdW5jdGlvbiAoKSB7XG5cdFx0bXkuaGlkZSgpO1xuXHR9OyovXG5cbiAgICBzdHlsZShrLCB2KSB7XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHJldHVybiB0aGlzLnRvb2x0aXAuc3R5bGUoaylcbiAgICAgICAgdGhpcy50b29sdGlwLnN0eWxlKGssIHYpXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgYXR0cihrLCB2KSB7XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHJldHVybiB0aGlzLnRvb2x0aXAuYXR0cihrKVxuICAgICAgICB0aGlzLnRvb2x0aXAuYXR0cihrLCB2KVxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuLyoqIEB0eXBlZGVmIHt7IGRpbXM6IG9iamVjdCwgY3JzOiBzdHJpbmcsIHRpbGVTaXplQ2VsbDogbnVtYmVyLCBvcmlnaW5Qb2ludDoge3g6bnVtYmVyLHk6bnVtYmVyfSwgcmVzb2x1dGlvbkdlbzogbnVtYmVyLCB0aWxpbmdCb3VuZHM6aW1wb3J0KFwiLi4vY29yZS9HZW9DYW52YXMuanNcIikuRW52ZWxvcGUgfX0gR3JpZEluZm8gKi9cblxuaW1wb3J0IHsgZHN2IH0gZnJvbSAnZDMtZmV0Y2gnXG5pbXBvcnQgeyBEYXRhc2V0IH0gZnJvbSAnLi4vY29yZS9EYXRhc2V0LmpzJ1xuXG4vKipcbiAqIEEgZGF0YXNldCBjb21wb3NlZCBvZiBhIHNpbmdsZSBDU1YgZmlsZSAobm90IHRpbGVkKS5cbiAqXG4gKiBAbW9kdWxlIGRhdGFzZXRcbiAqIEBhdXRob3IgSm9zZXBoIERhdmllcywgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIENTVkdyaWQgZXh0ZW5kcyBEYXRhc2V0IHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvcmUvTWFwLmpzXCIpLk1hcH0gbWFwIFRoZSBtYXAuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBUaGUgVVJMIG9mIHRoZSBkYXRhc2V0LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByZXNvbHV0aW9uIFRoZSBkYXRhc2V0IHJlc29sdXRpb24gaW4gZ2VvZ3JhcGhpY2FsIHVuaXQuXG4gICAgICogQHBhcmFtIHt7cHJlcHJvY2Vzcz86KGZ1bmN0aW9uKGltcG9ydChcIi4uL2NvcmUvRGF0YXNldC5qc1wiKS5DZWxsKTpib29sZWFuKSxkZWxpbWl0ZXI/OnN0cmluZ319IG9wdHNcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihtYXAsIHVybCwgcmVzb2x1dGlvbiwgb3B0cyA9IHt9KSB7XG4gICAgICAgIHN1cGVyKG1hcCwgdXJsLCByZXNvbHV0aW9uLCBvcHRzKVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAdHlwZSB7QXJyYXkuPGltcG9ydChcIi4uL2NvcmUvRGF0YXNldC5qc1wiKS5DZWxsPn0gKi9cbiAgICAgICAgdGhpcy5jZWxscyA9IFtdXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuZGVsaW1pdGVyID0gb3B0cy5kZWxpbWl0ZXIgfHwgJywnXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICAgICAqIEBwcml2YXRlICAqL1xuICAgICAgICB0aGlzLmluZm9Mb2FkaW5nU3RhdHVzID0gJ25vdExvYWRlZCdcblxuICAgICAgICAvL2dldCBkYXRhXG4gICAgICAgIHRoaXMuZ2V0RGF0YSh1bmRlZmluZWQpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVxdWVzdCBkYXRhIHdpdGhpbiBhIGdlb2dyYXBoaWMgZW52ZWxvcGUuXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhcy5qc1wiKS5FbnZlbG9wZXx1bmRlZmluZWR9IGVcbiAgICAgKi9cbiAgICBnZXREYXRhKGUpIHtcbiAgICAgICAgLy9jaGVjayBpZiBkYXRhIGFscmVhZHkgbG9hZGVkXG4gICAgICAgIGlmICh0aGlzLmluZm9Mb2FkaW5nU3RhdHVzICE9ICdub3RMb2FkZWQnKSByZXR1cm4gdGhpc1xuXG4gICAgICAgIC8vbG9hZCBkYXRhXG4gICAgICAgIHRoaXMuaW5mb0xvYWRpbmdTdGF0dXMgPSAnbG9hZGluZydcbiAgICAgICAgOyhhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBkc3YodGhpcy5kZWxpbWl0ZXIsIHRoaXMudXJsKVxuXG4gICAgICAgICAgICAgICAgLy9jb252ZXJ0IGNvb3JkaW5hdGVzIGluIG51bWJlcnNcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGMgb2YgZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICBjLnggPSArYy54XG4gICAgICAgICAgICAgICAgICAgIGMueSA9ICtjLnlcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvL3ByZXByb2Nlc3MvZmlsdGVyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucHJlcHJvY2Vzcykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNlbGxzID0gW11cbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBjIG9mIGRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGIgPSB0aGlzLnByZXByb2Nlc3MoYylcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiID09IGZhbHNlKSBjb250aW51ZVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jZWxscy5wdXNoKGMpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNlbGxzID0gZGF0YVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vVE9ETyBjaGVjayBpZiByZWRyYXcgaXMgbmVjZXNzYXJ5XG4gICAgICAgICAgICAgICAgLy90aGF0IGlzIGlmIHRoZSBkYXRhc2V0IGJlbG9uZ3MgdG8gYSBsYXllciB3aGljaCBpcyB2aXNpYmxlIGF0IHRoZSBjdXJyZW50IHpvb20gbGV2ZWxcblxuICAgICAgICAgICAgICAgIC8vcmVkcmF3IG1hcFxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm1hcCkgdGhpcy5tYXAucmVkcmF3KClcblxuICAgICAgICAgICAgICAgIHRoaXMuaW5mb0xvYWRpbmdTdGF0dXMgPSAnbG9hZGVkJ1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAvL21hcmsgYXMgZmFpbGVkXG4gICAgICAgICAgICAgICAgdGhpcy5pbmZvTG9hZGluZ1N0YXR1cyA9ICdmYWlsZWQnXG4gICAgICAgICAgICAgICAgdGhpcy5jZWxscyA9IFtdXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pKClcblxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbGwgdGhlIHZpZXcgY2FjaGUgd2l0aCBhbGwgY2VsbHMgd2hpY2ggYXJlIHdpdGhpbiBhIGdlb2dyYXBoaWNhbCBlbnZlbG9wZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29yZS9HZW9DYW52YXMuanNcIikuRW52ZWxvcGV9IGV4dEdlb1xuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIHVwZGF0ZVZpZXdDYWNoZShleHRHZW8pIHtcbiAgICAgICAgLy9kYXRhIG5vdCBsb2FkZWQgeWV0XG4gICAgICAgIGlmICghdGhpcy5jZWxscykgcmV0dXJuXG5cbiAgICAgICAgdGhpcy5jZWxsc1ZpZXdDYWNoZSA9IFtdXG4gICAgICAgIGZvciAoY29uc3QgY2VsbCBvZiB0aGlzLmNlbGxzKSB7XG4gICAgICAgICAgICBpZiAoK2NlbGwueCArIHRoaXMucmVzb2x1dGlvbiA8IGV4dEdlby54TWluKSBjb250aW51ZVxuICAgICAgICAgICAgaWYgKCtjZWxsLnggLSB0aGlzLnJlc29sdXRpb24gPiBleHRHZW8ueE1heCkgY29udGludWVcbiAgICAgICAgICAgIGlmICgrY2VsbC55ICsgdGhpcy5yZXNvbHV0aW9uIDwgZXh0R2VvLnlNaW4pIGNvbnRpbnVlXG4gICAgICAgICAgICBpZiAoK2NlbGwueSAtIHRoaXMucmVzb2x1dGlvbiA+IGV4dEdlby55TWF4KSBjb250aW51ZVxuICAgICAgICAgICAgdGhpcy5jZWxsc1ZpZXdDYWNoZS5wdXNoKGNlbGwpXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IERhdGFzZXQgfSBmcm9tICcuLi9jb3JlL0RhdGFzZXQuanMnXG5cbi8qKlxuICogQSBkYXRhc2V0IGNvbXBvc2VkIG9mIGNlbGxzIGRlZmluZWQgaW4gamF2YXNjcmlwdCwgb3IgbG9hZGVkIG91dHNpZGUgb2YgZ3JpZHZpeiBtYXAuXG4gKlxuICogQG1vZHVsZSBkYXRhc2V0XG4gKiBAYXV0aG9yIEpvc2VwaCBEYXZpZXMsIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBKU0dyaWQgZXh0ZW5kcyBEYXRhc2V0IHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVzb2x1dGlvbiBUaGUgZGF0YXNldCByZXNvbHV0aW9uIGluIGdlb2dyYXBoaWNhbCB1bml0LlxuICAgICAqIEBwYXJhbSB7QXJyYXkuPE9iamVjdD59IGNlbGxzIFRoZSBjZWxscy5cbiAgICAgKiBAcGFyYW0ge30gb3B0c1xuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHJlc29sdXRpb24sIGNlbGxzLCBvcHRzID0ge30pIHtcbiAgICAgICAgc3VwZXIodW5kZWZpbmVkLCAnJywgcmVzb2x1dGlvbiwgb3B0cylcblxuICAgICAgICAvKipcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHR5cGUge0FycmF5LjxpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGw+fSAqL1xuICAgICAgICB0aGlzLmNlbGxzID0gY2VsbHMgfHwgW11cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXF1ZXN0IGRhdGEgd2l0aGluIGEgZ2VvZ3JhcGhpYyBlbnZlbG9wZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29yZS9HZW9DYW52YXMuanNcIikuRW52ZWxvcGV8dW5kZWZpbmVkfSBlXG4gICAgICovXG4gICAgZ2V0RGF0YShlKSB7XG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmlsbCB0aGUgdmlldyBjYWNoZSB3aXRoIGFsbCBjZWxscyB3aGljaCBhcmUgd2l0aGluIGEgZ2VvZ3JhcGhpY2FsIGVudmVsb3BlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhcy5qc1wiKS5FbnZlbG9wZX0gZXh0R2VvXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgdXBkYXRlVmlld0NhY2hlKGV4dEdlbykge1xuICAgICAgICAvL2RhdGEgbm90IGxvYWRlZCB5ZXRcbiAgICAgICAgaWYgKCF0aGlzLmNlbGxzKSByZXR1cm5cblxuICAgICAgICB0aGlzLmNlbGxzVmlld0NhY2hlID0gW11cbiAgICAgICAgZm9yIChjb25zdCBjZWxsIG9mIHRoaXMuY2VsbHMpIHtcbiAgICAgICAgICAgIGlmICgrY2VsbC54ICsgdGhpcy5yZXNvbHV0aW9uIDwgZXh0R2VvLnhNaW4pIGNvbnRpbnVlXG4gICAgICAgICAgICBpZiAoK2NlbGwueCAtIHRoaXMucmVzb2x1dGlvbiA+IGV4dEdlby54TWF4KSBjb250aW51ZVxuICAgICAgICAgICAgaWYgKCtjZWxsLnkgKyB0aGlzLnJlc29sdXRpb24gPCBleHRHZW8ueU1pbikgY29udGludWVcbiAgICAgICAgICAgIGlmICgrY2VsbC55IC0gdGhpcy5yZXNvbHV0aW9uID4gZXh0R2VvLnlNYXgpIGNvbnRpbnVlXG4gICAgICAgICAgICB0aGlzLmNlbGxzVmlld0NhY2hlLnB1c2goY2VsbClcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuLyoqIEB0eXBlZGVmIHt7IGRpbXM6IG9iamVjdCwgY3JzOiBzdHJpbmcsIHRpbGVTaXplQ2VsbDogbnVtYmVyLCBvcmlnaW5Qb2ludDoge3g6bnVtYmVyLHk6bnVtYmVyfSwgcmVzb2x1dGlvbkdlbzogbnVtYmVyLCB0aWxpbmdCb3VuZHM6aW1wb3J0KFwiLi4vY29yZS9HZW9DYW52YXMuanNcIikuRW52ZWxvcGUgfX0gR3JpZEluZm8gKi9cblxuLy8gaW50ZXJuYWxcbmltcG9ydCB7IERhdGFzZXQgfSBmcm9tICcuLi9jb3JlL0RhdGFzZXQuanMnXG4vL2ltcG9ydCB7IG1vbml0b3IsIG1vbml0b3JEdXJhdGlvbiB9IGZyb20gJy4uL3V0aWxzL1V0aWxzLmpzJ1xuXG4vLyBleHRlcm5hbFxuaW1wb3J0IHsganNvbiwgY3N2IH0gZnJvbSAnZDMtZmV0Y2gnXG5cbi8qKlxuICogQSB0aWxlZCBkYXRhc2V0LCBjb21wb3NlZCBvZiBDU1YgdGlsZXMuXG4gKlxuICogQG1vZHVsZSBkYXRhc2V0XG4gKiBAYXV0aG9yIEpvc2VwaCBEYXZpZXMsIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBUaWxlZEdyaWQgZXh0ZW5kcyBEYXRhc2V0IHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvcmUvTWFwLmpzXCIpLk1hcH0gbWFwIFRoZSBtYXAuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBUaGUgVVJMIG9mIHRoZSBkYXRhc2V0LlxuICAgICAqIEBwYXJhbSB7e3ByZXByb2Nlc3M/OihmdW5jdGlvbihpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXQuanNcIikuQ2VsbCk6Ym9vbGVhbiksIG9ubHlEcmF3V2hlbkFsbFRpbGVzUmVhZHk6Ym9vbGVhbn19IG9wdHNcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihtYXAsIHVybCwgb3B0cyA9IHt9KSB7XG4gICAgICAgIHN1cGVyKG1hcCwgdXJsLCAwLCBvcHRzKVxuICAgICAgICB0aGlzLm9ubHlEcmF3V2hlbkFsbFRpbGVzUmVhZHkgPSBvcHRzLm9ubHlEcmF3V2hlbkFsbFRpbGVzUmVhZHkgfHwgZmFsc2VcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBncmlkIGluZm8gb2JqZWN0LCBmcm9tIHRoZSBpbmZvLmpzb24gZmlsZS5cbiAgICAgICAgICogIEB0eXBlIHtHcmlkSW5mbyB8IHVuZGVmaW5lZH1cbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogICovXG4gICAgICAgIHRoaXMuaW5mbyA9IHVuZGVmaW5lZFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAgICAgKiBAcHJpdmF0ZSAgKi9cbiAgICAgICAgdGhpcy5pbmZvTG9hZGluZ1N0YXR1cyA9ICdub3RMb2FkZWQnXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBjYWNoZSBvZiB0aGUgbG9hZGVkIHRpbGVzLiBJdCBpcyBkb3VibGUgaW5kZXhlZDogYnkgeFQgYW5kIHRoZW4geVQuXG4gICAgICAgICAqIEV4YW1wbGU6IHRoaXMuY2FjaGVbeFRdW3lUXSByZXR1cm5zIHRoZSB0aWxlIGF0IFt4VF1beVRdIGxvY2F0aW9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAdHlwZSB7b2JqZWN0fVxuICAgICAgICAgKiAqL1xuICAgICAgICB0aGlzLmNhY2hlID0ge31cblxuICAgICAgICAvL2xhdW5jaCBsb2FkaW5nXG4gICAgICAgIHRoaXMubG9hZEluZm8oKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvYWQgdGhlIGluZm8uanNvbiBmcm9tIHRoZSB1cmwuXG4gICAgICogQHJldHVybnMgdGhpc1xuICAgICAqL1xuICAgIGxvYWRJbmZvKCkge1xuICAgICAgICBpZiAoIXRoaXMuaW5mbyAmJiB0aGlzLmluZm9Mb2FkaW5nU3RhdHVzID09PSAnbm90TG9hZGVkJykge1xuICAgICAgICAgICAgOyhhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IGpzb24odGhpcy51cmwgKyAnaW5mby5qc29uJylcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmZvID0gZGF0YVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc29sdXRpb24gPSBkYXRhLnJlc29sdXRpb25HZW9cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmZvTG9hZGluZ1N0YXR1cyA9ICdsb2FkZWQnXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWFwLnJlZHJhdygpXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9tYXJrIGFzIGZhaWxlZFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmluZm9Mb2FkaW5nU3RhdHVzID0gJ2ZhaWxlZCdcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSgpXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5pbmZvTG9hZGluZ1N0YXR1cyA9PT0gJ2xvYWRlZCcgfHwgdGhpcy5pbmZvTG9hZGluZ1N0YXR1cyA9PT0gJ2ZhaWxlZCcpIHRoaXMubWFwLnJlZHJhdygpXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29tcHV0ZSBhIHRpbGluZyBlbnZlbG9wZSBmcm9tIGEgZ2VvZ3JhcGhpY2FsIGVudmVsb3BlLlxuICAgICAqIFRoaXMgaXMgdGhlIGZ1bmN0aW9uIHRvIHVzZSB0byBrbm93IHdoaWNoIHRpbGVzIHRvIGRvd25sb2FkIGZvciBhIGdlb2dyYXBoaWNhbCB2aWV3LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhcy5qc1wiKS5FbnZlbG9wZX0gZVxuICAgICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhcy5qc1wiKS5FbnZlbG9wZXx1bmRlZmluZWR9XG4gICAgICovXG4gICAgZ2V0VGlsaW5nRW52ZWxvcGUoZSkge1xuICAgICAgICBpZiAoIXRoaXMuaW5mbykge1xuICAgICAgICAgICAgdGhpcy5sb2FkSW5mbygpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBvID0gdGhpcy5pbmZvLm9yaWdpblBvaW50LFxuICAgICAgICAgICAgciA9IHRoaXMuaW5mby5yZXNvbHV0aW9uR2VvLFxuICAgICAgICAgICAgcyA9IHRoaXMuaW5mby50aWxlU2l6ZUNlbGxcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeE1pbjogTWF0aC5mbG9vcigoZS54TWluIC0gcG8ueCkgLyAociAqIHMpKSxcbiAgICAgICAgICAgIHhNYXg6IE1hdGguZmxvb3IoKGUueE1heCAtIHBvLngpIC8gKHIgKiBzKSksXG4gICAgICAgICAgICB5TWluOiBNYXRoLmZsb29yKChlLnlNaW4gLSBwby55KSAvIChyICogcykpLFxuICAgICAgICAgICAgeU1heDogTWF0aC5mbG9vcigoZS55TWF4IC0gcG8ueSkgLyAociAqIHMpKSxcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlcXVlc3QgZGF0YSB3aXRoaW4gYSBnZW9ncmFwaGljIGVudmVsb3BlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtpbXBvcnQoJy4uL2NvcmUvR2VvQ2FudmFzLmpzJykuRW52ZWxvcGV9IGV4dEdlb1xuICAgICAqIEByZXR1cm5zIHt0aGlzfVxuICAgICAqL1xuICAgIGFzeW5jIGdldERhdGEoZXh0R2VvKSB7XG4gICAgICAgIGlmICghdGhpcy5pbmZvKSByZXR1cm4gdGhpc1xuXG4gICAgICAgIC8vIENyZWF0ZSBhbiBBYm9ydENvbnRyb2xsZXIgZm9yIHRoZSBjdXJyZW50IGRhdGEgcmVxdWVzdFxuICAgICAgICB0aGlzLmFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKVxuICAgICAgICBjb25zdCBzaWduYWwgPSB0aGlzLmFib3J0Q29udHJvbGxlci5zaWduYWxcblxuICAgICAgICAvLyBHZXQgdGhlIHRpbGluZyBlbnZlbG9wZSBhbmQgY2hlY2sgYm91bmRzXG4gICAgICAgIGNvbnN0IHRiID0gdGhpcy5nZXRUaWxpbmdFbnZlbG9wZShleHRHZW8pXG4gICAgICAgIGlmICghdGIpIHJldHVybiB0aGlzXG5cbiAgICAgICAgY29uc3QgeyB4TWluOiBnYlhNaW4sIHhNYXg6IGdiWE1heCwgeU1pbjogZ2JZTWluLCB5TWF4OiBnYllNYXggfSA9IHRoaXMuaW5mby50aWxpbmdCb3VuZHNcblxuICAgICAgICBjb25zdCB4TWluID0gTWF0aC5tYXgodGIueE1pbiwgZ2JYTWluKVxuICAgICAgICBjb25zdCB4TWF4ID0gTWF0aC5taW4odGIueE1heCwgZ2JYTWF4KVxuICAgICAgICBjb25zdCB5TWluID0gTWF0aC5tYXgodGIueU1pbiwgZ2JZTWluKVxuICAgICAgICBjb25zdCB5TWF4ID0gTWF0aC5taW4odGIueU1heCwgZ2JZTWF4KVxuXG4gICAgICAgIGNvbnN0IHRvdGFsVGlsZXMgPSAoeE1heCAtIHhNaW4gKyAxKSAqICh5TWF4IC0geU1pbiArIDEpXG4gICAgICAgIGxldCBwcm9jZXNzZWRUaWxlcyA9IDBcbiAgICAgICAgY29uc3QgdGlsZVByb21pc2VzID0gW11cblxuICAgICAgICAvLyBJdGVyYXRlIG92ZXIgdGlsZXMgd2l0aGluIGJvdW5kc1xuICAgICAgICBmb3IgKGxldCB4VCA9IHhNaW47IHhUIDw9IHhNYXg7IHhUKyspIHtcbiAgICAgICAgICAgIGZvciAobGV0IHlUID0geU1pbjsgeVQgPD0geU1heDsgeVQrKykge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5jYWNoZVt4VF0pIHRoaXMuY2FjaGVbeFRdID0ge31cblxuICAgICAgICAgICAgICAgIC8vIFNraXAgYWxyZWFkeSBsb2FkZWQgdGlsZXMgb3IgcmV0cnkgZmFpbGVkIG9uZXNcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jYWNoZVt4VF1beVRdICYmIHRoaXMuY2FjaGVbeFRdW3lUXSAhPT0gJ2ZhaWxlZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgKytwcm9jZXNzZWRUaWxlc1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIE1hcmsgdGlsZSBhcyBsb2FkaW5nXG4gICAgICAgICAgICAgICAgdGhpcy5jYWNoZVt4VF1beVRdID0gJ2xvYWRpbmcnXG5cbiAgICAgICAgICAgICAgICB0aWxlUHJvbWlzZXMucHVzaChcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkVGlsZSh4VCwgeVQsIHNpZ25hbClcbiAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKCh0aWxlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWNoZVt4VF1beVRdID0gdGlsZVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyB0aGUgbGFzdCB0aWxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNMYXN0VGlsZSA9ICsrcHJvY2Vzc2VkVGlsZXMgPT09IHRvdGFsVGlsZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrQW5kUmVkcmF3KHRpbGUsIGlzTGFzdFRpbGUpXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhY2hlW3hUXVt5VF0gPSAnZmFpbGVkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrcHJvY2Vzc2VkVGlsZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKHRpbGVQcm9taXNlcylcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2FkIGEgdGlsZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4VFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5VFxuICAgICAqIEBwYXJhbSB7QWJvcnRTaWduYWx9IHNpZ25hbFxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAgICovXG4gICAgYXN5bmMgbG9hZFRpbGUoeFQsIHlULCBzaWduYWwpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBjc3YoYCR7dGhpcy51cmx9JHt4VH0vJHt5VH0uY3N2YCwgeyBzaWduYWwgfSlcblxuICAgICAgICAgICAgY29uc3QgY2VsbHMgPSB0aGlzLnByZXByb2Nlc3MgPyBkYXRhLmZpbHRlcigoY2VsbCkgPT4gdGhpcy5wcmVwcm9jZXNzKGNlbGwpICE9PSBmYWxzZSkgOiBkYXRhXG5cbiAgICAgICAgICAgIGlmICghdGhpcy5pbmZvKSB0aHJvdyBuZXcgRXJyb3IoJ1RpbGUgaW5mbyB1bmtub3duJylcblxuICAgICAgICAgICAgcmV0dXJuIGdldEdyaWRUaWxlKGNlbGxzLCB4VCwgeVQsIHRoaXMuaW5mbylcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChlcnJvci5uYW1lID09PSAnQWJvcnRFcnJvcicpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYFRpbGUgcmVxdWVzdCBmb3IgJHt4VH0sICR7eVR9IHdhcyBhYm9ydGVkLmApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnJvclxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FuY2VsIG9uZ29pbmcgZGF0YSByZXF1ZXN0cyB3aGVuIHpvb20gbGV2ZWwgY2hhbmdlcy5cbiAgICAgKi9cbiAgICBjYW5jZWxDdXJyZW50UmVxdWVzdHMoKSB7XG4gICAgICAgIGlmICh0aGlzLmFib3J0Q29udHJvbGxlcikge1xuICAgICAgICAgICAgdGhpcy5hYm9ydENvbnRyb2xsZXIuYWJvcnQoKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgY2hlY2tBbmRSZWRyYXcodGlsZSwgaXNMYXN0VGlsZSkge1xuICAgICAgICAvLyBDaGVjayBpZiBhbnkgdmlzaWJsZSBsYXllciBkZXBlbmRzIG9uIHRoaXMgZGF0YXNldFxuICAgICAgICAvLyBjaGVjayBpZiByZWRyYXcgaXMgcmVhbGx5IG5lZWRlZCwgdGhhdCBpcyBpZjpcbiAgICAgICAgLy8gMS4gdGhlIGRhdGFzZXQgYmVsb25ncyB0byBhIGxheWVyIHdoaWNoIGlzIHZpc2libGUgYXQgdGhlIGN1cnJlbnQgem9vbSBsZXZlbFxuICAgICAgICBsZXQgbmVlZHNSZWRyYXcgPSBmYWxzZVxuICAgICAgICAvL2dvIHRocm91Z2ggdGhlIGxheWVyc1xuICAgICAgICBjb25zdCB6ID0gdGhpcy5tYXAuZ2V0Wm9vbSgpXG4gICAgICAgIGZvciAoY29uc3QgbGF5IG9mIHRoaXMubWFwLmxheWVycykge1xuICAgICAgICAgICAgaWYgKGxheS52aXNpYmxlICYmICFsYXkudmlzaWJsZSh6KSkgY29udGludWVcbiAgICAgICAgICAgIGlmICghbGF5LmdldERhdGFzZXQpIGNvbnRpbnVlXG4gICAgICAgICAgICBpZiAobGF5LmdldERhdGFzZXQoeikgIT0gdGhpcykgY29udGludWVcbiAgICAgICAgICAgIC8vZm91bmQgb25lIGxheWVyLiBObyBuZWVkIHRvIHNlZWsgbW9yZS5cbiAgICAgICAgICAgIG5lZWRzUmVkcmF3ID0gdHJ1ZVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghbmVlZHNSZWRyYXcpIHJldHVyblxuXG4gICAgICAgIC8vIENoZWNrIGlmIHRpbGUgaW50ZXJzZWN0cyB0aGUgY3VycmVudCB2aWV3XG4gICAgICAgIGNvbnN0IGVudiA9IHRoaXMubWFwLnVwZGF0ZUV4dGVudEdlbygpXG4gICAgICAgIGNvbnN0IHsgeE1pbiwgeE1heCwgeU1pbiwgeU1heCB9ID0gdGlsZS5leHRHZW9cbiAgICAgICAgaWYgKGVudi54TWF4IDw9IHhNaW4gfHwgZW52LnhNaW4gPj0geE1heCB8fCBlbnYueU1heCA8PSB5TWluIHx8IGVudi55TWluID49IHlNYXgpIHJldHVyblxuXG4gICAgICAgIC8vIFRyaWdnZXIgcmVkcmF3XG4gICAgICAgIGlmICh0aGlzLm9ubHlEcmF3V2hlbkFsbFRpbGVzUmVhZHkpIHtcbiAgICAgICAgICAgIGlmIChpc0xhc3RUaWxlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tYXAucmVkcmF3KClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubWFwLnJlZHJhdygpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaWxsIHRoZSB2aWV3IGNhY2hlIHdpdGggYWxsIGNlbGxzIHdoaWNoIGFyZSB3aXRoaW4gYSBnZW9ncmFwaGljYWwgZW52ZWxvcGUuXG4gICAgICogQGFic3RyYWN0XG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhcy5qc1wiKS5FbnZlbG9wZX0gZXh0R2VvXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgdXBkYXRlVmlld0NhY2hlKGV4dEdlbykge1xuICAgICAgICAvL1xuICAgICAgICB0aGlzLmNlbGxzVmlld0NhY2hlID0gW11cblxuICAgICAgICAvL2NoZWNrIGlmIGluZm8gaGFzIGJlZW4gbG9hZGVkXG4gICAgICAgIGlmICghdGhpcy5pbmZvKSByZXR1cm5cblxuICAgICAgICAvL3RpbGVzIHdpdGhpbiB0aGUgc2NvcGVcbiAgICAgICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhcy5qc1wiKS5FbnZlbG9wZXx1bmRlZmluZWR9ICovXG4gICAgICAgIGNvbnN0IHRiID0gdGhpcy5nZXRUaWxpbmdFbnZlbG9wZShleHRHZW8pXG4gICAgICAgIGlmICghdGIpIHJldHVyblxuXG4gICAgICAgIC8vZ3JpZCBib3VuZHNcbiAgICAgICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhcy5qc1wiKS5FbnZlbG9wZX0gKi9cbiAgICAgICAgY29uc3QgZ2IgPSB0aGlzLmluZm8udGlsaW5nQm91bmRzXG5cbiAgICAgICAgZm9yIChsZXQgeFQgPSBNYXRoLm1heCh0Yi54TWluLCBnYi54TWluKTsgeFQgPD0gTWF0aC5taW4odGIueE1heCwgZ2IueE1heCk7IHhUKyspIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5jYWNoZVt4VF0pIGNvbnRpbnVlXG4gICAgICAgICAgICBmb3IgKGxldCB5VCA9IE1hdGgubWF4KHRiLnlNaW4sIGdiLnlNaW4pOyB5VCA8PSBNYXRoLm1pbih0Yi55TWF4LCBnYi55TWF4KTsgeVQrKykge1xuICAgICAgICAgICAgICAgIC8vZ2V0IHRpbGVcbiAgICAgICAgICAgICAgICAvKiogQHR5cGUge29iamVjdH0gKi9cbiAgICAgICAgICAgICAgICBjb25zdCB0aWxlID0gdGhpcy5jYWNoZVt4VF1beVRdXG4gICAgICAgICAgICAgICAgaWYgKCF0aWxlIHx8IHR5cGVvZiB0aWxlID09PSAnc3RyaW5nJykgY29udGludWVcblxuICAgICAgICAgICAgICAgIC8vZ2V0IGNlbGxzXG4gICAgICAgICAgICAgICAgLy90aGlzLmNlbGxzVmlld0NhY2hlID0gdGhpcy5jZWxsc1ZpZXdDYWNoZS5jb25jYXQodGlsZS5jZWxscylcblxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgY2VsbCBvZiB0aWxlLmNlbGxzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICgrY2VsbC54ICsgdGhpcy5yZXNvbHV0aW9uIDwgZXh0R2VvLnhNaW4pIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgICAgIGlmICgrY2VsbC54IC0gdGhpcy5yZXNvbHV0aW9uID4gZXh0R2VvLnhNYXgpIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgICAgIGlmICgrY2VsbC55ICsgdGhpcy5yZXNvbHV0aW9uIDwgZXh0R2VvLnlNaW4pIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgICAgIGlmICgrY2VsbC55IC0gdGhpcy5yZXNvbHV0aW9uID4gZXh0R2VvLnlNYXgpIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2VsbHNWaWV3Q2FjaGUucHVzaChjZWxsKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gZ2V0R3JpZFRpbGUoY2VsbHMsIHhULCB5VCwgZ3JpZEluZm8pIHtcbiAgICBjb25zdCB0aWxlID0ge31cblxuICAgIC8qKiBAdHlwZSB7QXJyYXkuPGltcG9ydChcIi4uL2NvcmUvRGF0YXNldFwiKS5DZWxsPn0gKi9cbiAgICB0aWxlLmNlbGxzID0gY2VsbHNcbiAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICB0aWxlLnggPSB4VFxuICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgIHRpbGUueSA9IHlUXG5cbiAgICBjb25zdCByID0gZ3JpZEluZm8ucmVzb2x1dGlvbkdlb1xuICAgIGNvbnN0IHMgPSBncmlkSW5mby50aWxlU2l6ZUNlbGxcblxuICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vY29yZS9HZW9DYW52YXNcIikuRW52ZWxvcGV9ICovXG4gICAgdGlsZS5leHRHZW8gPSB7XG4gICAgICAgIHhNaW46IGdyaWRJbmZvLm9yaWdpblBvaW50LnggKyByICogcyAqIHRpbGUueCxcbiAgICAgICAgeE1heDogZ3JpZEluZm8ub3JpZ2luUG9pbnQueCArIHIgKiBzICogKHRpbGUueCArIDEpLFxuICAgICAgICB5TWluOiBncmlkSW5mby5vcmlnaW5Qb2ludC55ICsgciAqIHMgKiB0aWxlLnksXG4gICAgICAgIHlNYXg6IGdyaWRJbmZvLm9yaWdpblBvaW50LnkgKyByICogcyAqICh0aWxlLnkgKyAxKSxcbiAgICB9XG5cbiAgICAvL2NvbnZlcnQgY2VsbCBjb29yZGluYXRlcyBpbnRvIGdlb2dyYXBoaWNhbCBjb29yZGluYXRlc1xuICAgIGZvciAobGV0IGNlbGwgb2YgdGlsZS5jZWxscykge1xuICAgICAgICBjZWxsLnggPSB0aWxlLmV4dEdlby54TWluICsgY2VsbC54ICogclxuICAgICAgICBjZWxsLnkgPSB0aWxlLmV4dEdlby55TWluICsgY2VsbC55ICogclxuICAgIH1cblxuICAgIHJldHVybiB0aWxlXG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IExheWVyIH0gZnJvbSAnLi4vY29yZS9MYXllci5qcydcblxuLyoqXG4gKlxuICogQSBtYXAgYmFja2dyb3VuZCBsYXllciBpbiBcIlNsaXBweSBtYXBcIiBYWVogc3RhbmRhcmQuXG4gKiBTZWUgaHR0cHM6Ly93aWtpLm9wZW5zdHJlZXRtYXAub3JnL3dpa2kvU2xpcHB5X21hcF90aWxlbmFtZXNcbiAqIGh0dHBzOi8vd3d3Lm1hcHRpbGVyLmNvbS9nb29nbGUtbWFwcy1jb29yZGluYXRlcy10aWxlLWJvdW5kcy1wcm9qZWN0aW9uLyM2LzI3Ljg4LzQ0LjQ4XG4gKlxuICogQG1vZHVsZSBsYXllclxuICogQGF1dGhvciBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgQmFja2dyb3VuZExheWVyIGV4dGVuZHMgTGF5ZXIge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXG4gICAgICovXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKVxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgICAgIC8qKiBUaGUgaW1hZ2UgY2FjaGUsIGluZGV4ZWQgYnkgei95L3hcbiAgICAgICAgICogQHByaXZhdGUgKi9cbiAgICAgICAgdGhpcy5jYWNoZSA9IHt9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgICAgIHRoaXMudXJsID0gb3B0cy51cmxcbiAgICAgICAgLyoqIEB0eXBlIHtmdW5jdGlvbihudW1iZXIsbnVtYmVyLG51bWJlcik6c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLnVybEZ1biA9IG9wdHMudXJsRnVuIHx8ICgoeCwgeSwgeikgPT4gdGhpcy51cmwgKyB6ICsgJy8nICsgeCArICcvJyArIHkgKyAnLnBuZycpXG5cbiAgICAgICAgLyoqIFRoZSBncm91bmQgcmVzb2x1dGlvbnMgb2YgdGhlIHpvb20gbGV2ZWxzLCBzdGFydGluZyBmcm9tIHRoZSBzbWFsbGVzdCAobW9zdCB6b29tZWQtb3V0LCB1c3VhbGx5IDApIHRvIHRoZSBsYXJnZXN0IChtb3N0IHpvb21lZC1pbikuXG4gICAgICAgICAqIFVzdWFsbHkgZGl2aWRlZCBieSAyIGZvciBlYWNoIHpvb20gbGV2ZWwgaW5jcmVtZW50LlxuICAgICAgICAgKiBAdHlwZSB7QXJyYXkuPG51bWJlcj59ICovXG4gICAgICAgIHRoaXMucmVzb2x1dGlvbnMgPSBvcHRzLnJlc29sdXRpb25zXG4gICAgICAgIGlmICghdGhpcy5yZXNvbHV0aW9ucyB8fCB0aGlzLnJlc29sdXRpb25zLmxlbmd0aCA9PSAwKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyByZXNvbHV0aW9ucyBwcm92aWRlZCBmb3IgYmFja2dyb3VuZCBsYXllcicpXG5cbiAgICAgICAgLyoqIFRoZSB0aWxlIHNpemUsIGluIG51bWJlciBvZiBwaXhlbHNcbiAgICAgICAgICogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgdGhpcy5uYlBpeCA9IG9wdHMubmJQaXggfHwgMjU2XG5cbiAgICAgICAgLyoqIENSUyBjb29yZGluYXRlcyBvZiB0b3AgbGVmdCBjb3JuZXIgb2YgdGhlIHRvcCBsZWZ0IHRpbGUsIHRoZSBvbmUgd2l0aCBjb2RlIC8wLzAucG5nLlxuICAgICAgICAgKiBAdHlwZSB7QXJyYXkuPG51bWJlcj59ICovXG4gICAgICAgIHRoaXMub3JpZ2luID0gb3B0cy5vcmlnaW4gfHwgWzAsIDBdXG5cbiAgICAgICAgLyoqIFRoZSBjb2RlIG9mIHRoZSBzbWFsbGVzdCAobW9zdCB6b29tZWQtb3V0KSB6b29tIGxldmVsLCBpbiBjYXNlIGl0IGlzIG5vdCAwLlxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLnowID0gb3B0cy56MCB8fCAwXG5cbiAgICAgICAgLyoqIEEgY29lZmZpY2llbnQgdG8gYWRqdXN0IHRoZSBiYWNrZ3JvdW4gcmVzb2x1dGlvbiB3aXRoIHRoZSBzY3JlZW4gcmVzb2x1dGlvbi5cbiAgICAgICAgICogIElmIHRoZSBiYWNrZ3JvdW5kIGltYWdlcyBhcmUgdG9vIHBpeGVsaXNlZCwgcmVkdWNlIHRoZSB2YWx1ZS5cbiAgICAgICAgICogIElmIHRoZXJlIGFyZSB0b28gbWFueSBpbWFnZXMgdG8gZG93bmxvYWQsIGluY3JlYXNlIHRoZSB2YWx1ZS5cbiAgICAgICAgICogIERlZmF1bHQgdmFsdWUgaXMgMS4wXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgIHRoaXMucGl4ZWxhdGlvbkNvZWZmaWNpZW50ID0gb3B0cy5waXhlbGF0aW9uQ29lZmZpY2llbnQgfHwgMS4wXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHoveC95IGNhY2hlIGRhdGEuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHpcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5XG4gICAgICogQHJldHVybnMge0hUTUxJbWFnZUVsZW1lbnR8c3RyaW5nfHVuZGVmaW5lZH1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGdldCh6LCB4LCB5KSB7XG4gICAgICAgIGxldCBkID0gdGhpcy5jYWNoZVt6XVxuICAgICAgICBpZiAoIWQpIHJldHVyblxuICAgICAgICBkID0gZFt4XVxuICAgICAgICBpZiAoIWQpIHJldHVyblxuICAgICAgICByZXR1cm4gZFt5XVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFB1dCBpbWFnZSBpbiBjYWNoZS5cbiAgICAgKiBAcGFyYW0ge0hUTUxJbWFnZUVsZW1lbnR8c3RyaW5nfSBpbWdcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gelxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHlcbiAgICAgKiBAcmV0dXJuc1xuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHV0KGltZywgeiwgeCwgeSkge1xuICAgICAgICBpZiAoIXRoaXMuY2FjaGVbel0pIHRoaXMuY2FjaGVbel0gPSB7fVxuICAgICAgICBpZiAoIXRoaXMuY2FjaGVbel1beF0pIHRoaXMuY2FjaGVbel1beF0gPSB7fVxuICAgICAgICB0aGlzLmNhY2hlW3pdW3hdW3ldID0gaW1nXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhc1wiKS5HZW9DYW52YXN9IGdlb0NhbnZhcyBUaGUgY2FudmFzIHdoZXJlIHRvIGRyYXcgdGhlIGxheWVyLlxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIGRyYXcoZ2VvQ2FudmFzKSB7XG4gICAgICAgIGlmICghdGhpcy5yZXNvbHV0aW9ucyB8fCB0aGlzLnJlc29sdXRpb25zLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdObyByZXNvbHV0aW9ucyBwcm92aWRlZCBmb3IgYmFja2dyb3VuZCBsYXllcicpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IHogPSBnZW9DYW52YXMudmlldy56XG4gICAgICAgIGNvbnN0IHgwID0gdGhpcy5vcmlnaW5bMF0sIHkwID0gdGhpcy5vcmlnaW5bMV1cblxuICAgICAgICAvL2dldCB6b29tIGxldmVsIGFuZCByZXNvbHV0aW9uXG4gICAgICAgIGxldCB6XyA9IDBcbiAgICAgICAgZm9yICh6XyA9IDA7IHpfIDwgdGhpcy5yZXNvbHV0aW9ucy5sZW5ndGg7IHpfKyspIGlmICh0aGlzLnJlc29sdXRpb25zW3pfXSA8IHogKiB0aGlzLnBpeGVsYXRpb25Db2VmZmljaWVudCkgYnJlYWtcbiAgICAgICAgel8gLT0gMVxuICAgICAgICB6XyA9IE1hdGgubWF4KDAsIHpfKVxuICAgICAgICB6XyA9IE1hdGgubWluKHpfLCB0aGlzLnJlc29sdXRpb25zLmxlbmd0aCAtIDEpXG4gICAgICAgIGNvbnN0IHJlcyA9IHRoaXMucmVzb2x1dGlvbnNbel9dXG4gICAgICAgIHpfICs9IHRoaXMuejBcblxuICAgICAgICBjb25zdCBzaXplRyA9IHRoaXMubmJQaXggKiByZXNcbiAgICAgICAgY29uc3Qgc2l6ZSA9IHNpemVHIC8gelxuXG4gICAgICAgIC8vZ2V0IHRpbGUgbnVtYmVyc1xuICAgICAgICBjb25zdCB4R2VvVG9UTVMgPSAoeCkgPT4gTWF0aC5jZWlsKCh4IC0geDApIC8gc2l6ZUcpXG4gICAgICAgIGNvbnN0IHlHZW9Ub1RNUyA9ICh5KSA9PiBNYXRoLmNlaWwoLSh5IC0geTApIC8gc2l6ZUcpXG4gICAgICAgIGNvbnN0IHhNaW4gPSB4R2VvVG9UTVMoZ2VvQ2FudmFzLmV4dEdlby54TWluKSAtIDFcbiAgICAgICAgY29uc3QgeE1heCA9IHhHZW9Ub1RNUyhnZW9DYW52YXMuZXh0R2VvLnhNYXgpXG4gICAgICAgIGNvbnN0IHlNYXggPSB5R2VvVG9UTVMoZ2VvQ2FudmFzLmV4dEdlby55TWluKVxuICAgICAgICBjb25zdCB5TWluID0geUdlb1RvVE1TKGdlb0NhbnZhcy5leHRHZW8ueU1heCkgLSAxXG5cbiAgICAgICAgLy9oYW5kbGUgaW1hZ2VzXG4gICAgICAgIGZvciAobGV0IHggPSB4TWluOyB4IDwgeE1heDsgeCsrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCB5ID0geU1pbjsgeSA8IHlNYXg7IHkrKykge1xuICAgICAgICAgICAgICAgIC8vZ2V0IGltYWdlXG4gICAgICAgICAgICAgICAgbGV0IGltZyA9IHRoaXMuZ2V0KHpfLCB4LCB5KVxuXG4gICAgICAgICAgICAgICAgLy9ubyBpbWFnZTogbG9hZCBpbWFnZSBmcm9tIFVSTFxuICAgICAgICAgICAgICAgIGlmICghaW1nKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGltZyA9IG5ldyBJbWFnZSgpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHV0KGltZywgel8sIHgsIHkpXG4gICAgICAgICAgICAgICAgICAgIGltZy5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMucmVkcmF3KClcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpbWcub25lcnJvciA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vY2FzZSB3aGVuIG5vIGltYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnB1dCgnZmFpbGVkJywgel8sIHgsIHkpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaW1nLnNyYyA9IHRoaXMudXJsRnVuKHgsIHksIHpfKVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vY2FzZSB3aGVuIG5vIGltYWdlIGF2YWlsYWJsZVxuICAgICAgICAgICAgICAgIGlmIChpbWcgPT09ICdmYWlsZWQnKSBjb250aW51ZVxuICAgICAgICAgICAgICAgIGlmICghKGltZyBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGltZylcbiAgICAgICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGltZy53aWR0aCA9PSAwIHx8IGltZy5oZWlnaHQgPT0gMCkgY29udGludWVcblxuICAgICAgICAgICAgICAgIC8vZHJhdyBpbWFnZVxuICAgICAgICAgICAgICAgIGNvbnN0IHhHZW8gPSB4MCArIHggKiBzaXplR1xuICAgICAgICAgICAgICAgIGNvbnN0IHlHZW8gPSB5MCAtIHkgKiBzaXplR1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5pbml0Q2FudmFzVHJhbnNmb3JtKClcbiAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLm9mZnNjcmVlbkN0eC5kcmF3SW1hZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgICBpbWcsXG4gICAgICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuZ2VvVG9QaXhYKHhHZW8pLFxuICAgICAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmdlb1RvUGl4WSh5R2VvKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsXG4gICAgICAgICAgICAgICAgICAgICAgICBzaXplXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgLy9jZy5jdHguZHJhd0ltYWdlKGltZywgeEdlbywgeUdlbywgc2l6ZUcsIC1zaXplRylcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgTGF5ZXIgfSBmcm9tICcuLi9jb3JlL0xheWVyLmpzJ1xuXG4vKipcbiAqXG4gKiBBIG1hcCBiYWNrZ3JvdW5kIGxheWVyIGNvbXBvc2VkIG9mIGEgc2luZ2xlIGltYWdlIGZpbGUsIGdlb2xvY2F0ZWQuXG4gKlxuICogQG1vZHVsZSBsYXllclxuICogQGF1dGhvciBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgQmFja2dyb3VuZExheWVySW1hZ2UgZXh0ZW5kcyBMYXllciB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtvYmplY3R9IG9wdHNcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLyoqIFRoZSBpbWFnZSBmaWxlIFVSTFxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLnVybCA9IG9wdHMudXJsXG5cbiAgICAgICAgLyoqIFRoZSBpbWFnZSBsZWZ0IGNvb3JkaW5hdGVcbiAgICAgICAgICogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgdGhpcy54TWluID0gb3B0cy54TWluIHx8IDBcbiAgICAgICAgLyoqIFRoZSBpbWFnZSB0b3AgY29vcmRpbmF0ZVxuICAgICAgICAgKiAgQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgdGhpcy55TWF4ID0gb3B0cy55TWF4IHx8IDBcblxuICAgICAgICAvKiogVGhlIGltYWdlIHdpZHRoLCBpbiBnZW8gdW5pdFxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLndpZHRoID0gb3B0cy53aWR0aCB8fCAyMDAwMFxuICAgICAgICAvKiogVGhlIGltYWdlIGhlaWdodCwgaW4gZ2VvIHVuaXRcbiAgICAgICAgICogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgdGhpcy5oZWlnaHQgPSBvcHRzLmhlaWdodCB8fCAyMDAwMFxuXG4gICAgICAgIC8qKiBUaGUgaW1hZ2Ugb2JqZWN0XG4gICAgICAgICAqIEB0eXBlIHtIVE1MSW1hZ2VFbGVtZW50fHVuZGVmaW5lZH0gKi9cbiAgICAgICAgdGhpcy5pbWcgPSB1bmRlZmluZWRcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvcmUvR2VvQ2FudmFzLmpzXCIpLkdlb0NhbnZhc30gZ2VvQ2FudmFzIFRoZSBjYW52YXMgd2hlcmUgdG8gZHJhdyB0aGUgbGF5ZXIuXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgZHJhdyhnZW9DYW52YXMpIHtcbiAgICAgICAgLy91cGRhdGUgbWFwIGV4dGVudFxuICAgICAgICAvL2dlb0NhbnZhcy51cGRhdGVFeHRlbnRHZW8oMClcblxuICAgICAgICBpZiAodGhpcy5pbWcpIHtcbiAgICAgICAgICAgIC8vdGhlIGltYWdlIHdhcyBhbHJlYWR5IGRvd25sb2FkZWQ6IGRyYXcgaXRcblxuICAgICAgICAgICAgLy9jb21wdXRlIHNjcmVlbiBjb29yZGluYXRlcyBhbmQgc2l6ZSByYXRpb1xuICAgICAgICAgICAgY29uc3QgeCA9IGdlb0NhbnZhcy5nZW9Ub1BpeFgodGhpcy54TWluKVxuICAgICAgICAgICAgY29uc3QgeSA9IGdlb0NhbnZhcy5nZW9Ub1BpeFkodGhpcy55TWF4KVxuICAgICAgICAgICAgY29uc3QgeiA9IGdlb0NhbnZhcy5nZXRWaWV3KCkuelxuXG4gICAgICAgICAgICAvL2RyYXcgaW1hZ2VcbiAgICAgICAgICAgIGdlb0NhbnZhcy5pbml0Q2FudmFzVHJhbnNmb3JtKClcbiAgICAgICAgICAgIGdlb0NhbnZhcy5vZmZzY3JlZW5DdHguZHJhd0ltYWdlKHRoaXMuaW1nLCB4LCB5LCB0aGlzLndpZHRoIC8geiwgdGhpcy5oZWlnaHQgLyB6KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy9yZXRyaWV2ZSBpbWFnZVxuXG4gICAgICAgICAgICBpZiAoIXRoaXMuaW1nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbWcgPSBuZXcgSW1hZ2UoKVxuICAgICAgICAgICAgICAgIHRoaXMuaW1nLm9ubG9hZCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLnJlZHJhdygpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuaW1nLm9uZXJyb3IgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vY2FzZSB3aGVuIG5vIGltYWdlXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignQ291bGQgbm90IHJldHJpZXZlIGJhY2tncm91bmQgaW1hZ2UgZnJvbScsIHRoaXMudXJsKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy9zZXQgVVJMIHRvIGxhdW5jaCB0aGUgZG93bmxvYWRcbiAgICAgICAgICAgIHRoaXMuaW1nLnNyYyA9IHRoaXMudXJsXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IExheWVyIH0gZnJvbSAnLi4vY29yZS9MYXllci5qcydcblxuLyoqXG4gKlxuICogQSBtYXAgV01TIGJhY2tncm91bmQgbGF5ZXIuXG4gKlxuICogQG1vZHVsZSBsYXllclxuICogQGF1dGhvciBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgQmFja2dyb3VuZExheWVyV01TIGV4dGVuZHMgTGF5ZXIge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXG4gICAgICovXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKVxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLnVybCA9IG9wdHMudXJsXG5cbiAgICAgICAgLyoqIEB0eXBlIHtIVE1MSW1hZ2VFbGVtZW50fHVuZGVmaW5lZH0gKi9cbiAgICAgICAgdGhpcy5pbWcgPSB1bmRlZmluZWRcblxuICAgICAgICAvKiogQHR5cGUge251bWJlcnx1bmRlZmluZWR9ICovXG4gICAgICAgIHRoaXMueE1pbiA9IHVuZGVmaW5lZFxuICAgICAgICAvKiogQHR5cGUge251bWJlcnx1bmRlZmluZWR9ICovXG4gICAgICAgIHRoaXMueE1heCA9IHVuZGVmaW5lZFxuICAgICAgICAvKiogQHR5cGUge251bWJlcnx1bmRlZmluZWR9ICovXG4gICAgICAgIHRoaXMueU1pbiA9IHVuZGVmaW5lZFxuICAgICAgICAvKiogQHR5cGUge251bWJlcnx1bmRlZmluZWR9ICovXG4gICAgICAgIHRoaXMueU1heCA9IHVuZGVmaW5lZFxuICAgIH1cblxuICAgIC8qKiBDaGVjayBpZiB0aGUgdmlldyBoYXMgbW92ZWQgYW5kIGEgbmV3IGltYWdlIG5lZWRzIHRvIGJlIHJldHJpZXZlZC5cbiAgICAgKiBAcHJpdmF0ZSAqL1xuICAgIGhhc01vdmVkKGV4dEdlbykge1xuICAgICAgICBpZiAoZXh0R2VvLnhNaW4gIT0gdGhpcy54TWluKSByZXR1cm4gdHJ1ZVxuICAgICAgICBlbHNlIGlmIChleHRHZW8ueE1heCAhPSB0aGlzLnhNYXgpIHJldHVybiB0cnVlXG4gICAgICAgIGVsc2UgaWYgKGV4dEdlby55TWluICE9IHRoaXMueU1pbikgcmV0dXJuIHRydWVcbiAgICAgICAgZWxzZSBpZiAoZXh0R2VvLnlNYXggIT0gdGhpcy55TWF4KSByZXR1cm4gdHJ1ZVxuICAgICAgICBlbHNlIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29yZS9HZW9DYW52YXNcIikuR2VvQ2FudmFzfSBnZW9DYW52YXMgVGhlIGNhbnZhcyB3aGVyZSB0byBkcmF3IHRoZSBsYXllci5cbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICBkcmF3KGdlb0NhbnZhcykge1xuICAgICAgICAvL3VwZGF0ZSBtYXAgZXh0ZW50XG4gICAgICAgIGdlb0NhbnZhcy51cGRhdGVFeHRlbnRHZW8oMClcblxuICAgICAgICBpZiAoIXRoaXMuaGFzTW92ZWQoZ2VvQ2FudmFzLmV4dEdlbykgJiYgdGhpcy5pbWcpIHtcbiAgICAgICAgICAgIC8vdGhlIG1hcCBkaWQgbm90IG1vdmUgYW5kIHRoZSBpbWFnZSB3YXMgYWxyZWFkeSBkb3dubG9hZGVkOiBkcmF3IHRoZSBpbWFnZVxuICAgICAgICAgICAgZ2VvQ2FudmFzLmluaXRDYW52YXNUcmFuc2Zvcm0oKVxuICAgICAgICAgICAgZ2VvQ2FudmFzLm9mZnNjcmVlbkN0eC5kcmF3SW1hZ2UodGhpcy5pbWcsIDAsIDAsIGdlb0NhbnZhcy53LCBnZW9DYW52YXMuaClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vdGhlIG1hcCBtb3ZlZDogcmV0cmlldmUgbmV3IGltYWdlXG5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICB0aGlzLnhNaW4gPSBnZW9DYW52YXMuZXh0R2VvLnhNaW5cbiAgICAgICAgICAgIHRoaXMueE1heCA9IGdlb0NhbnZhcy5leHRHZW8ueE1heFxuICAgICAgICAgICAgdGhpcy55TWluID0gZ2VvQ2FudmFzLmV4dEdlby55TWluXG4gICAgICAgICAgICB0aGlzLnlNYXggPSBnZW9DYW52YXMuZXh0R2VvLnlNYXhcblxuICAgICAgICAgICAgLy9idWlsZCBXTVMgVVJMXG4gICAgICAgICAgICBjb25zdCB1cmwgPSBbXVxuICAgICAgICAgICAgdXJsLnB1c2godGhpcy51cmwpXG4gICAgICAgICAgICB1cmwucHVzaCgnJndpZHRoPScpXG4gICAgICAgICAgICB1cmwucHVzaChnZW9DYW52YXMudylcbiAgICAgICAgICAgIHVybC5wdXNoKCcmaGVpZ2h0PScpXG4gICAgICAgICAgICB1cmwucHVzaChnZW9DYW52YXMuaClcbiAgICAgICAgICAgIC8vYmJveDogeG1pbiB5bWluIHhtYXggeW1heFxuICAgICAgICAgICAgdXJsLnB1c2goJyZiYm94PScpXG4gICAgICAgICAgICB1cmwucHVzaChnZW9DYW52YXMuZXh0R2VvLnhNaW4pXG4gICAgICAgICAgICB1cmwucHVzaCgnLCcpXG4gICAgICAgICAgICB1cmwucHVzaChnZW9DYW52YXMuZXh0R2VvLnlNaW4pXG4gICAgICAgICAgICB1cmwucHVzaCgnLCcpXG4gICAgICAgICAgICB1cmwucHVzaChnZW9DYW52YXMuZXh0R2VvLnhNYXgpXG4gICAgICAgICAgICB1cmwucHVzaCgnLCcpXG4gICAgICAgICAgICB1cmwucHVzaChnZW9DYW52YXMuZXh0R2VvLnlNYXgpXG5cbiAgICAgICAgICAgIGNvbnN0IHVybFMgPSB1cmwuam9pbignJylcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2codXJsUylcblxuICAgICAgICAgICAgaWYgKCF0aGlzLmltZykge1xuICAgICAgICAgICAgICAgIHRoaXMuaW1nID0gbmV3IEltYWdlKClcbiAgICAgICAgICAgICAgICB0aGlzLmltZy5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5yZWRyYXcoKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmltZy5vbmVycm9yID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvL2Nhc2Ugd2hlbiBubyBpbWFnZVxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ0NvdWxkIG5vdCByZXRyaWV2ZSBXTVMgYmFja2dyb3VuZCBpbWFnZSBmcm9tJywgdXJsUylcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vc2V0IFVSTCB0byBsYXVuY2ggdGhlIGRvd25sb2FkXG4gICAgICAgICAgICB0aGlzLmltZy5zcmMgPSB1cmxTXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IExheWVyIH0gZnJvbSAnLi4vY29yZS9MYXllci5qcydcbmltcG9ydCB7IGpzb24gfSBmcm9tICdkMy1mZXRjaCdcblxuLyoqXG4gKiBAbW9kdWxlIGxheWVyXG4gKiBAYXV0aG9yIEpvc2VwaCBEYXZpZXMsIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBHZW9KU09OTGF5ZXIgZXh0ZW5kcyBMYXllciB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtvYmplY3R9IG9wdHNcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgICAgIHRoaXMudXJsID0gb3B0cy51cmxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQSBwcmVwcm9jZXNzIHRvIHJ1biBvbiBlYWNoIGZlYXR1cmUgYWZ0ZXIgbG9hZGluZy5cbiAgICAgICAgICogSXQgY2FuIGJlIHVzZWQgdG8gYXBwbHkgc29tZSBzcGVjaWZpYyB0cmVhdG1lbnQgYmVmb3JlLCBmb3JtYXQgdGhlIGxhYmVsIGRhdGEsIHByb2plY3QgY29vcmRpbmF0ZXMsIGV0Yy5cbiAgICAgICAgICogUmV0dXJuIGZhbHNlIGlmIHRoZSBsYWJlbCBzaG91bGQgbm90IGJlIGtlcHQuXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihvYmplY3QpOmJvb2xlYW59ICovXG4gICAgICAgIHRoaXMucHJlcHJvY2VzcyA9IG9wdHMucHJlcHJvY2Vzc1xuXG4gICAgICAgIC8vZm9yIHBvaW50c1xuICAgICAgICAvKipcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG9iamVjdCxudW1iZXIpOnN0cmluZ30gKi9cbiAgICAgICAgdGhpcy5zaGFwZSA9IG9wdHMuc2hhcGUgfHwgKChmLCB6KSA9PiAnY2lyY2xlJylcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEluIHBpeGVsXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihvYmplY3QsbnVtYmVyKTpudW1iZXJ9ICovXG4gICAgICAgIHRoaXMuc2l6ZSA9IG9wdHMuc2l6ZSB8fCAoKGYsIHopID0+IDEwKVxuICAgICAgICAvKipcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG9iamVjdCxudW1iZXIpOnN0cmluZ30gKi9cbiAgICAgICAgdGhpcy5zdHJva2VTdHlsZSA9IG9wdHMuc3Ryb2tlU3R5bGUgfHwgKChmLCB6KSA9PiAncmVkJylcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihvYmplY3QsbnVtYmVyKTpzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuZmlsbFN0eWxlID0gb3B0cy5maWxsU3R5bGUgfHwgKChmLCB6KSA9PiAnYmxhY2snKVxuICAgICAgICAvKipcbiAgICAgICAgICogSW4gcGl4ZWxcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG9iamVjdCxudW1iZXIpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy5saW5lV2lkdGggPSBvcHRzLmxpbmVXaWR0aCB8fCAoKGYsIHopID0+IDIpXG5cbiAgICAgICAgLy9mb3IgbGluZXNcblxuICAgICAgICAvKipcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG9iamVjdCxudW1iZXIpOnN0cmluZ30gKi9cbiAgICAgICAgdGhpcy5jb2xvciA9IG9wdHMuY29sb3IgfHwgKChmLCB6KSA9PiAnZ3JheScpXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbiBwaXhlbFxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24ob2JqZWN0LG51bWJlcik6bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLndpZHRoID0gb3B0cy53aWR0aCB8fCAoKGYsIHopID0+IDIpXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24ob2JqZWN0LG51bWJlcik6QXJyYXkuPG51bWJlcj58dW5kZWZpbmVkfSAqL1xuICAgICAgICB0aGlzLmxpbmVEYXNoID0gb3B0cy5saW5lRGFzaCB8fCAoKGYsIHopID0+IHVuZGVmaW5lZClcblxuICAgICAgICAvKipcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHR5cGUge0FycmF5LjxvYmplY3Q+IHwgdW5kZWZpbmVkfSAqL1xuICAgICAgICB0aGlzLmZzID0gdW5kZWZpbmVkXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgICAgIHRoaXMubG9hZGluZ1N0YXR1cyA9ICdub3RMb2FkZWQnXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRHJhdyB0aGUgbGF5ZXIuXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhcy5qc1wiKS5HZW9DYW52YXN9IGdlb0NhbnZhcyBUaGUgY2FudmFzIHdoZXJlIHRvIGRyYXcgdGhlIGxheWVyLlxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIGRyYXcoZ2VvQ2FudmFzKSB7XG4gICAgICAgIC8vbG9hZCBkYXRhLCBpZiBub3QgZG9uZSB5ZXQuXG4gICAgICAgIGlmICghdGhpcy5mcykge1xuICAgICAgICAgICAgdGhpcy5sb2FkKGdlb0NhbnZhcy5yZWRyYXcpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IHogPSBnZW9DYW52YXMudmlldy56XG4gICAgICAgIGNvbnN0IGN0eCA9IGdlb0NhbnZhcy5vZmZzY3JlZW5DdHhcblxuICAgICAgICBmb3IgKGNvbnN0IGYgb2YgdGhpcy5mcykge1xuICAgICAgICAgICAgY29uc3QgZ3QgPSBmLmdlb21ldHJ5LnR5cGVcblxuICAgICAgICAgICAgaWYgKGd0ID09ICdQb2ludCcgfHwgZ3QgPT0gJ011bHRpUG9pbnQnKSB7XG5cbiAgICAgICAgICAgICAgICAvL2dldCBzdHlsZSBwYXJhbWV0ZXJzIGZvciB0aGUgcG9pbnQgZmVhdHVyZVxuICAgICAgICAgICAgICAgIGNvbnN0IHNoYXBlID0gdGhpcy5zaGFwZShmLCB6KVxuICAgICAgICAgICAgICAgIGlmICghc2hhcGUgfHwgc2hhcGUgPT0gJ25vbmUnKSBjb250aW51ZVxuICAgICAgICAgICAgICAgIGNvbnN0IHNpemUgPSB0aGlzLnNpemUoZiwgeikgKiB6XG4gICAgICAgICAgICAgICAgaWYgKCFzaXplKSBjb250aW51ZVxuICAgICAgICAgICAgICAgIGNvbnN0IHN0cm9rZVN0eWxlID0gdGhpcy5zdHJva2VTdHlsZShmLCB6KVxuICAgICAgICAgICAgICAgIGNvbnN0IGZpbGxTdHlsZSA9IHRoaXMuZmlsbFN0eWxlKGYsIHopXG4gICAgICAgICAgICAgICAgY29uc3QgbGluZVdpZHRoID0gdGhpcy5saW5lV2lkdGgoZiwgeikgKiB6XG5cbiAgICAgICAgICAgICAgICAvL3NldCBjYW52YXMgZHJhd2luZyBwYXJhbWV0ZXJzXG4gICAgICAgICAgICAgICAgaWYgKHN0cm9rZVN0eWxlKSBjdHguc3Ryb2tlU3R5bGUgPSBzdHJva2VTdHlsZVxuICAgICAgICAgICAgICAgIGlmIChmaWxsU3R5bGUpIGN0eC5maWxsU3R5bGUgPSBmaWxsU3R5bGVcbiAgICAgICAgICAgICAgICBpZiAobGluZVdpZHRoKSBjdHgubGluZVdpZHRoID0gbGluZVdpZHRoXG5cbiAgICAgICAgICAgICAgICBsZXQgY3MgPSBmLmdlb21ldHJ5LmNvb3JkaW5hdGVzXG4gICAgICAgICAgICAgICAgaWYgKGd0ID09ICdQb2ludCcpIGNzID0gW2NzXVxuXG4gICAgICAgICAgICAgICAgaWYgKHNoYXBlID09ICdjaXJjbGUnKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vZHJhdyBjaXJjbGUgLSBmaWxsIGFuZCBzdHJva2VcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBjIG9mIGNzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5hcmMoY1swXSwgY1sxXSwgc2l6ZSAvIDIsIDAsIDIgKiBNYXRoLlBJLCBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWxsU3R5bGUpIGN0eC5maWxsKClcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJva2VTdHlsZSAmJiBsaW5lV2lkdGgpIGN0eC5zdHJva2UoKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzaGFwZSA9PSAnc3F1YXJlJykge1xuICAgICAgICAgICAgICAgICAgICAvL2RyYXcgc3F1YXJlIC0gZmlsbCBhbmQgc3Ryb2tlXG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYyBvZiBjcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICAgICAgICAgICAgICBjdHgucmVjdChjWzBdIC0gc2l6ZSAvIDIsIGNbMV0gLSBzaXplIC8gMiwgc2l6ZSwgc2l6ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWxsU3R5bGUpIGN0eC5maWxsKClcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJva2VTdHlsZSAmJiBsaW5lV2lkdGgpIGN0eC5zdHJva2UoKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignVW5leHBlY3RlZCBzaGFwZSBmb3IgcG9pbnQgZ2VvanNvbjogJyArIHNoYXBlKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZ3QgPT0gJ0xpbmVTdHJpbmcnIHx8IGd0ID09ICdNdWx0aUxpbmVTdHJpbmcnKSB7XG5cbiAgICAgICAgICAgICAgICAvL3NldCBjb2xvclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbCA9IHRoaXMuY29sb3IoZiwgeilcbiAgICAgICAgICAgICAgICBpZiAoIWNvbCB8fCBjb2wgPT0gJ25vbmUnKSBjb250aW51ZVxuICAgICAgICAgICAgICAgIGN0eC5zdHJva2VTdHlsZSA9IGNvbFxuXG4gICAgICAgICAgICAgICAgLy9zZXQgbGluZXdpZHRoXG4gICAgICAgICAgICAgICAgY29uc3Qgd1AgPSB0aGlzLndpZHRoKGYsIHopXG4gICAgICAgICAgICAgICAgaWYgKCF3UCB8fCB3UCA8IDApIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgY3R4LmxpbmVXaWR0aCA9IHdQICogelxuXG4gICAgICAgICAgICAgICAgLy9zZXQgbGluZSBkYXNoXG4gICAgICAgICAgICAgICAgY29uc3QgbGRQID0gdGhpcy5saW5lRGFzaChmLCB6KVxuICAgICAgICAgICAgICAgIGlmIChsZFApIGN0eC5zZXRMaW5lRGFzaChsZFApXG5cbiAgICAgICAgICAgICAgICBsZXQgY3NzID0gZi5nZW9tZXRyeS5jb29yZGluYXRlc1xuICAgICAgICAgICAgICAgIGlmIChndCA9PSAnTGluZVN0cmluZycpIGNzcyA9IFtjc3NdXG5cbiAgICAgICAgICAgICAgICAvL2RyYXcgbGluZXNcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGNzIG9mIGNzcykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY3MubGVuZ3RoIDwgMikgY29udGludWVcbiAgICAgICAgICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICAgICAgICAgIGN0eC5tb3ZlVG8oY3NbMF1bMF0sIGNzWzBdWzFdKVxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGNzLmxlbmd0aDsgaSsrKSBjdHgubGluZVRvKGNzW2ldWzBdLCBjc1tpXVsxXSlcbiAgICAgICAgICAgICAgICAgICAgY3R4LnN0cm9rZSgpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnVW5zdXBwb3J0ZWQgZ2VvbWV0cnkgdHlwZSBpbiBHZW9KU09OTGF5ZXI6ICcgKyBndClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vLi4uXG4gICAgICAgIGN0eC5zZXRMaW5lRGFzaChbXSlcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2FkIGRhdGEgZm9yIGxhYmVscywgZnJvbSBVUkwgdGhpcy51cmxcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCk6dm9pZH0gY2FsbGJhY2tcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGFzeW5jIGxvYWQoY2FsbGJhY2spIHtcbiAgICAgICAgaWYgKCF0aGlzLnVybCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ0ZhaWxlZCBsb2FkaW5nIGJvdW5kYXJpZXM6IE5vIFVSTCBzcGVjaWZpZWQuICcgKyB0aGlzLnVybClcbiAgICAgICAgICAgIHRoaXMubG9hZGluZ1N0YXR1cyA9ICdmYWlsZWQnXG4gICAgICAgICAgICB0aGlzLmxhYmVscyA9IFtdXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIC8vY2hlY2sgaWYgZGF0YSBhbHJlYWR5IGxvYWRlZFxuICAgICAgICBpZiAodGhpcy5sb2FkaW5nU3RhdHVzICE9ICdub3RMb2FkZWQnKSByZXR1cm5cblxuICAgICAgICAvL2xvYWQgZGF0YVxuICAgICAgICB0aGlzLmxvYWRpbmdTdGF0dXMgPSAnbG9hZGluZydcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgZGF0YV8gPSBhd2FpdCBqc29uKHRoaXMudXJsKVxuXG4gICAgICAgICAgICAvKiogQHR5cGUgeyBBcnJheS48b2JqZWN0PiB9ICovXG4gICAgICAgICAgICBjb25zdCBkYXRhID0gZGF0YV8uZmVhdHVyZXNcblxuICAgICAgICAgICAgLy9wcmVwcm9jZXNzL2ZpbHRlclxuICAgICAgICAgICAgaWYgKHRoaXMucHJlcHJvY2Vzcykge1xuICAgICAgICAgICAgICAgIHRoaXMuZnMgPSBbXVxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYyBvZiBkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGIgPSB0aGlzLnByZXByb2Nlc3MoYylcbiAgICAgICAgICAgICAgICAgICAgaWYgKGIgPT0gZmFsc2UpIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZnMucHVzaChjKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy9zdG9yZSBsYWJlbHNcbiAgICAgICAgICAgICAgICB0aGlzLmZzID0gZGF0YVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmxvYWRpbmdTdGF0dXMgPSAnbG9hZGVkJ1xuXG4gICAgICAgICAgICAvL3JlZHJhd1xuICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSBjYWxsYmFjaygpXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnRmFpbGVkIGxvYWRpbmcgYm91bmRhcmllcyBmcm9tICcgKyB0aGlzLnVybClcbiAgICAgICAgICAgIHRoaXMuZnMgPSBbXVxuICAgICAgICAgICAgdGhpcy5sb2FkaW5nU3RhdHVzID0gJ2ZhaWxlZCdcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgTGF5ZXIgfSBmcm9tICcuLi9jb3JlL0xheWVyLmpzJ1xuXG4vKipcbiAqIEEgbGF5ZXIsIHdoaWNoIHNwZWNpZmllcyBhIGRhdGFzZXQgdG8gYmUgc2hvd24gd2l0aCBzcGVjaWZpZWQgc3R5bGVzLlxuICpcbiAqIEBtb2R1bGUgbGF5ZXJcbiAqIEBhdXRob3IgSm9zZXBoIERhdmllcywgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIEdyaWRMYXllciBleHRlbmRzIExheWVyIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvcmUvRGF0YXNldFwiKS5EYXRhc2V0fGltcG9ydChcIi4uL2NvcmUvTXVsdGlSZXNvbHV0aW9uRGF0YXNldFwiKS5NdWx0aVJlc29sdXRpb25EYXRhc2V0fSBkYXRhc2V0IFRoZSBkYXRhc2V0IHRvIHNob3cuXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi4vY29yZS9TdHlsZVwiKS5TdHlsZT59IHN0eWxlcyBUaGUgc3R5bGVzLCBvcmRlcmVkIGluIGRyYXdpbmcgb3JkZXIuXG4gICAgICogQHBhcmFtIHt7dmlzaWJsZT86ZnVuY3Rpb24obnVtYmVyKTpib29sZWFuLGFscGhhPzpmdW5jdGlvbihudW1iZXIpOm51bWJlcixibGVuZE9wZXJhdGlvbj86ZnVuY3Rpb24obnVtYmVyKTpHbG9iYWxDb21wb3NpdGVPcGVyYXRpb24sbWluUGl4ZWxzUGVyQ2VsbD86bnVtYmVyLGNlbGxJbmZvSFRNTD86J25vbmUnfGZ1bmN0aW9uKGltcG9ydChcIi4uL2NvcmUvRGF0YXNldFwiKS5DZWxsKTpzdHJpbmd9fSBvcHRzXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoZGF0YXNldCwgc3R5bGVzLCBvcHRzID0ge30pIHtcbiAgICAgICAgc3VwZXIob3B0cylcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvKiogQHR5cGUge2ltcG9ydChcIi4uL2NvcmUvRGF0YXNldFwiKS5EYXRhc2V0fGltcG9ydChcIi4uL2NvcmUvTXVsdGlSZXNvbHV0aW9uRGF0YXNldFwiKS5NdWx0aVJlc29sdXRpb25EYXRhc2V0fSAqL1xuICAgICAgICB0aGlzLmRhdGFzZXQgPSBkYXRhc2V0XG5cbiAgICAgICAgLyoqIEB0eXBlIHtBcnJheS48aW1wb3J0KFwiLi4vY29yZS9TdHlsZVwiKS5TdHlsZT59ICovXG4gICAgICAgIHRoaXMuc3R5bGVzID0gc3R5bGVzXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgcGFyYW1ldGVyIGlzIHVzZWQgd2hlbiB0aGUgZGF0YXNldCBpcyBhIE11bHRpUmVzb2x1dGlvbkRhdGFzZXQuXG4gICAgICAgICAqIEl0IGRlZmluZXMgdGhlIG1pbmltdW0gbnVtYmVyIG9mIHBpeGVscyBhIGdyaWQgY2VsbCBzaG91bGQgaGF2ZSB0byBzZWxlY3QgdGhlIGRhdGFzZXQgdG8gZGlzcGxheSBiYXNlZCBvbiBpdHMgcmVzb2x1dGlvbi5cbiAgICAgICAgICogQSBsb3cgdmFsdWUsIG1lYW5zIHRoYXQgdGhlIG1hcCB3aWxsIGJlIG1vcmUgZGV0YWlsbGVkIChzbWFsbGVyIGNlbGxzKS5cbiAgICAgICAgICogQSBoaWdoIHZhbHVlLCBtZWFucyB0aGF0IHRoZSBtYXAgd2lsbCBiZSBsZXNzIGRldGFpbGxlZCAobGFyZ2VyIGNlbGxzKS5cbiAgICAgICAgICogVGhpcyB2YWx1ZSBzaG91bGQgYmUgaGlnaGVyIHRoYW4gMSwgb3RoZXJ3aXNlIGl0IG1lYW5zIGEgZ3JpZCBjZWxsIGlzIHNtYWxsZXIgdGhhbiB0aGUgc2NyZWVuIHJlc29sdXRpb24uXG4gICAgICAgICAqIEZvciBtb3JlIGNvbXBsZXggY2VsbCByZXByZXNlbnRhdGlvbnMgdGhhdCByZXF1aXJlIHNvbWUgbW9yZSBtYXAgc3BhY2UsIHRoaXMgdmFsdWUgc2hvdWxkIGJlIGhpZ2hlci5cbiAgICAgICAgICogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgdGhpcy5taW5QaXhlbHNQZXJDZWxsID0gb3B0cy5taW5QaXhlbHNQZXJDZWxsIHx8IDNcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGZ1bmN0aW9uIHJldHVybmluZyBjZWxsIGluZm9ybWF0aW9uIGFzIEhUTUwuXG4gICAgICAgICAqIFRoaXMgaXMgdHlwaWNhbGx5IHVzZWQgZm9yIHRvb2x0aXAgaW5mb3JtYXRpb24uXG4gICAgICAgICAqIFNldCB0byAnbm9uZScgdG8gZGlzYWJsZSBjZWxsIGluZm8uXG4gICAgICAgICAqIEB0eXBlIHsnbm9uZSd8ZnVuY3Rpb24oaW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0XCIpLkNlbGwsIG51bWJlcik6c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLmNlbGxJbmZvSFRNTCA9IG9wdHMuY2VsbEluZm9IVE1MIHx8IEdyaWRMYXllci5kZWZhdWx0Q2VsbEluZm9IVE1MXG4gICAgfVxuXG4gICAgLyoqICovXG4gICAgZHJhdyhnZW9DYW52YXMsIGxlZ2VuZCkge1xuICAgICAgICAvL2dldCB6b29tIGxldmVsXG4gICAgICAgIGNvbnN0IHogPSBnZW9DYW52YXMudmlldy56XG4gICAgICAgIGNvbnN0IGN0eCA9IGdlb0NhbnZhcy5vZmZzY3JlZW5DdHhcblxuICAgICAgICAvL2dldCBsYXllciBkYXRhc2V0IGNvbXBvbmVudFxuICAgICAgICAvKiogQHR5cGUge2ltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuRGF0YXNldHx1bmRlZmluZWR9ICovXG4gICAgICAgIGNvbnN0IGRzYyA9IHRoaXMuZ2V0RGF0YXNldCh6KVxuICAgICAgICBpZiAoIWRzYykgcmV0dXJuXG5cbiAgICAgICAgLy9sYXVuY2ggZGF0YSBkb3dubG9hZCwgaWYgbmVjZXNzYXJ5XG4gICAgICAgIGRzYy5nZXREYXRhKGdlb0NhbnZhcy5leHRHZW8pXG5cbiAgICAgICAgLy91cGRhdGUgZGF0YXNldCB2aWV3IGNhY2hlXG4gICAgICAgIGRzYy51cGRhdGVWaWV3Q2FjaGUoZ2VvQ2FudmFzLmV4dEdlbylcblxuICAgICAgICAvL2RyYXcgY2VsbHMsIHN0eWxlIGJ5IHN0eWxlXG4gICAgICAgIGZvciAoY29uc3QgcyBvZiB0aGlzLnN0eWxlcykge1xuICAgICAgICAgICAgLy9jaGVjayBpZiBzdHlsZSBpcyB2aXNpYmxlXG4gICAgICAgICAgICBpZiAocy52aXNpYmxlICYmICFzLnZpc2libGUoeikpIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIC8vc2V0IHN0eWxlIGFscGhhIGFuZCBibGVuZCBtb2RlXG4gICAgICAgICAgICAvL1RPRE86IG11bHRpcGx5IGJ5IGxheWVyIGFscGhhID9cbiAgICAgICAgICAgIGN0eC5nbG9iYWxBbHBoYSA9IHMuYWxwaGEgPyBzLmFscGhhKHopIDogMS4wXG4gICAgICAgICAgICBpZiAocy5ibGVuZE9wZXJhdGlvbikgY3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9IHMuYmxlbmRPcGVyYXRpb24oeilcblxuICAgICAgICAgICAgLy9zZXQgYWZmaW4gdHJhbnNmb3JtIHRvIGRyYXcgd2l0aCBnZW9ncmFwaGljYWwgY29vcmRpbmF0ZXNcbiAgICAgICAgICAgIGdlb0NhbnZhcy5zZXRDYW52YXNUcmFuc2Zvcm0oKVxuXG4gICAgICAgICAgICAvL2RyYXcgd2l0aCBzdHlsZVxuICAgICAgICAgICAgcy5kcmF3KGRzYy5nZXRWaWV3Q2FjaGUoKSwgZ2VvQ2FudmFzLCBkc2MuZ2V0UmVzb2x1dGlvbigpKVxuXG4gICAgICAgICAgICAvL2RyYXcgc3R5bGUgZmlsdGVyXG4gICAgICAgICAgICBpZiAocy5maWx0ZXJDb2xvcikgcy5kcmF3RmlsdGVyKGdlb0NhbnZhcylcbiAgICAgICAgfVxuXG4gICAgICAgIC8vYWRkIGxlZ2VuZCBlbGVtZW50XG4gICAgICAgIGlmIChsZWdlbmQpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcyBvZiB0aGlzLnN0eWxlcykge1xuICAgICAgICAgICAgICAgIC8vY2hlY2sgaWYgc3R5bGUgaXMgdmlzaWJsZVxuICAgICAgICAgICAgICAgIGlmIChzLnZpc2libGUgJiYgIXMudmlzaWJsZSh6KSkgY29udGludWVcbiAgICAgICAgICAgICAgICBHcmlkTGF5ZXIuYWRkTGVnZW5kcyhsZWdlbmQsIHMubGVnZW5kcylcblxuICAgICAgICAgICAgICAgIC8vY2FzZSBmb3Igc3R5bGVzIG9mIHN0eWxlcywgbGlrZSBrZXJuZWwgc21vb3RoaW5nXG4gICAgICAgICAgICAgICAgLy9UT0RPIGRvIGJldHRlclxuICAgICAgICAgICAgICAgIGlmIChzWydzdHlsZXMnXSkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHMyIG9mIHNbJ3N0eWxlcyddKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoczIudmlzaWJsZSAmJiAhczIudmlzaWJsZSh6KSkgY29udGludWVcbiAgICAgICAgICAgICAgICAgICAgICAgIEdyaWRMYXllci5hZGRMZWdlbmRzKGxlZ2VuZCwgczIubGVnZW5kcylcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAcHJpdmF0ZSAqL1xuICAgIHN0YXRpYyBhZGRMZWdlbmRzKGxlZ2VuZENvbXAsIGxnKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGxnKSkgZm9yIChjb25zdCBsZ18gb2YgbGcpIHRoaXMuYWRkTGVnZW5kcyhsZWdlbmRDb21wLCBsZ18pXG4gICAgICAgIGVsc2UgbGVnZW5kQ29tcC5ub2RlKCkuYXBwZW5kKGxnLmRpdi5ub2RlKCkpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSByZWxldmFudCBkYXRhc2V0IGNvbXBvbmVudCBmb3IgYSBzcGVjaWZpZWQgem9vbS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB6XG4gICAgICogQHJldHVybnMge2ltcG9ydChcIi4uL2NvcmUvRGF0YXNldFwiKS5EYXRhc2V0fHVuZGVmaW5lZH1cbiAgICAgKiAqL1xuICAgIGdldERhdGFzZXQoeikge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhc2V0LmdldERhdGFzZXQoeiwgdGhpcy5taW5QaXhlbHNQZXJDZWxsKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldC9nZXQgc3R5bGUgc3RhY2suXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3VuZGVmaW5lZHxpbXBvcnQoXCIuLi9jb3JlL1N0eWxlXCIpLlN0eWxlfEFycmF5LjxpbXBvcnQoXCIuLi9jb3JlL1N0eWxlXCIpLlN0eWxlPn0gc3R5bGVzXG4gICAgICogQHJldHVybnMgeyB0aGlzIHwgQXJyYXkuPGltcG9ydChcIi4uL2NvcmUvU3R5bGVcIikuU3R5bGU+IH1cbiAgICAgKi9cbiAgICBzdHlsZXNfKHN0eWxlcykge1xuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHRoaXMuc3R5bGVzXG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKVxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc3R5bGVzKSkgdGhpcy5zdHlsZXMgPSBzdHlsZXNcbiAgICAgICAgICAgIGVsc2UgdGhpcy5zdHlsZXMgPSBbc3R5bGVzXVxuICAgICAgICBlbHNlIHRoaXMuc3R5bGVzID0gYXJndW1lbnRzXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGRlZmF1bHQgZnVuY3Rpb24gcmV0dXJuaW5nIGNlbGwgaW5mb3JtYXRpb24gYXMgSFRNTC5cbiAgICAgKiBUaGlzIGlzIHR5cGljYWxseSB1c2VkIGZvciB0b29sdGlwIGluZm9ybWF0aW9uLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXRcIikuQ2VsbH0gY2VsbFxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGRlZmF1bHRDZWxsSW5mb0hUTUwoY2VsbCkge1xuICAgICAgICBjb25zdCBidWYgPSBbXVxuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhjZWxsKSkge1xuICAgICAgICAgICAgaWYgKGtleSA9PT0gJ3gnKSBjb250aW51ZVxuICAgICAgICAgICAgaWYgKGtleSA9PT0gJ3knKSBjb250aW51ZVxuICAgICAgICAgICAgYnVmLnB1c2goJzxiPicsIGtleSwgJzwvYj4nLCAnIDogJywgY2VsbFtrZXldLCAnPGJyPicpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ1Zi5qb2luKCcnKVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgTGF5ZXIgfSBmcm9tICcuLi9jb3JlL0xheWVyLmpzJ1xuaW1wb3J0IHsgY3N2IH0gZnJvbSAnZDMtZmV0Y2gnXG5cbi8qKiBBIGxhYmVsLiBUaGUgbmFtZSBpcyB0aGUgdGV4dCB0byBzaG93LiAoeCx5KSBhcmUgdGhlIGNvb3JkaW5hdGVzIGluIHRoZSBzYW1lIENSUyBhcyB0aGUgZ3JpZC5cbiAqIEB0eXBlZGVmIHt7bmFtZTogc3RyaW5nLCB4Om51bWJlciwgeTpudW1iZXIgfX0gTGFiZWwgKi9cblxuLyoqXG4gKiBBIChnZW5lcmljKSBsYXllciBmb3IgcGxhY2VuYW1lIGxhYmVscywgdG8gYmUgc2hvd24gb24gdG9wIG9mIHRoZSBncmlkIGxheWVycy5cbiAqIFRoZSBpbnB1dCBpcyBhIENTViBmaWxlIHdpdGggdGhlIHBvc2l0aW9uICh4LCB5KSBvZiB0aGUgbGFiZWxzIGFuZCBuYW1lICsgc29tZSBvdGhlciBpbmZvIG9uIHRoZSBsYWJlbCBpbXBvcnRhbmNlLlxuICogSWYgdGhlIGxhYmVsIGRhdGEgaXMgbm90IGluIHRoZSBleHBlY3RlZCBmb3JtYXQgb3IgaW4gdGhlIHNhbWUgQ1JTIGFzIHRoZSBncmlkLCBpdCBjYW4gYmUgY29ycmVjdGVkIHdpdGggdGhlIFwicHJlcHJvY2Vzc1wiIGZ1bmN0aW9uLlxuICogVGhlIHNlbGVjdGlvbiBvZiB0aGUgbGFiZWwsIHRoZWlyIHN0eWxlIChmb250LCB3ZWlnaHQsIGV0Yy4pIGFuZCBjb2xvciBjYW4gYmUgc3BlY2lmaWVkIGRlcGVuZGluZyBvbiB0aGVpciBpbXBvcnRhbmNlIGFuZCB0aGUgem9vbSBsZXZlbC5cbiAqXG4gKiBAbW9kdWxlIGxheWVyXG4gKiBAYXV0aG9yIEpvc2VwaCBEYXZpZXMsIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBMYWJlbExheWVyIGV4dGVuZHMgTGF5ZXIge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXG4gICAgICovXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKVxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgVVJMIG9mIHRoZSBsYWJlbCBkYXRhLCBhcyBDU1YgZmlsZS5cbiAgICAgICAgICogVGhlIGZpbGUgc2hvdWxkIGNvbnRhaW4gdGhlIGluZm9ybWF0aW9uIGZvciBlYWNoIGxhYmVsIHN1Y2ggYXMgdGhlIHRleHQsIHRoZSBwb3NpdGlvbiBhbmQgb3RoZXIgaW5mb3JtYXRpb24gZm9yIHRoZSBkaXNwbGF5IG9mIHRoZSBsYWJlbCBhY2NvcmRpbmcgdG8gdGhlIHpvb20gbGV2ZWwuXG4gICAgICAgICAqIElmIG5lY2Vzc2FyeSwgdGhpcyBkYXRhIGNhbiBiZSByZWZvcm1hdGVkIHdpdGggdGhlICdwcmVwcm9jZXNzJyBwYXJhbWV0ZXIuXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgICAgIHRoaXMudXJsID0gb3B0cy51cmxcblxuICAgICAgICAvKiogU3BlY2lmeSBpZiBhbmQgaG93IGEgbGFiZWwgc2hvdWxkIGJlIGRyYXduLCBkZXBlbmRpbmcgb24gaXRzIGltcG9ydGFuY2UgYW5kIHRoZSB6b29tIGxldmVsLlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oTGFiZWwsbnVtYmVyKTpzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuc3R5bGUgPSBvcHRzLnN0eWxlIHx8ICgoKSA9PiAnMS4yZW0gQXJpYWwnKVxuXG4gICAgICAgIC8qKiBTcGVjaWZ5IHRoZSBsYWJlbCBjb2xvciwgZGVwZW5kaW5nIG9uIGl0cyBpbXBvcnRhbmNlIGFuZCB0aGUgem9vbSBsZXZlbC5cbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKExhYmVsLG51bWJlcik6c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLmNvbG9yID0gb3B0cy5jb2xvciB8fCAob3B0cy5kYXJrID8gKCkgPT4gJ3doaXRlJyA6ICgpID0+ICdibGFjaycpXG5cbiAgICAgICAgLyoqIFNwZWNpZnkgdGhlIGxhYmVsIGhhbG8gY29sb3IsIGRlcGVuZGluZyBvbiBpdHMgaW1wb3J0YW5jZSBhbmQgdGhlIHpvb20gbGV2ZWwuXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihMYWJlbCxudW1iZXIpOnN0cmluZ30gKi9cbiAgICAgICAgdGhpcy5oYWxvQ29sb3IgPSBvcHRzLmhhbG9Db2xvciB8fCAob3B0cy5kYXJrID8gKCkgPT4gJ2JsYWNrJyA6ICgpID0+ICd3aGl0ZScpXG5cbiAgICAgICAgLyoqIFNwZWNpZnkgdGhlIGxhYmVsIGhhbG8gd2lkdGgsIGRlcGVuZGluZyBvbiBpdHMgaW1wb3J0YW5jZSBhbmQgdGhlIHpvb20gbGV2ZWwuXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihMYWJlbCxudW1iZXIpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy5oYWxvV2lkdGggPSBvcHRzLmhhbG9XaWR0aCB8fCAoKCkgPT4gMi41KVxuXG4gICAgICAgIC8qKiBUaGUgYW5jaG9yIHdoZXJlIHRvIGRyYXcgdGhlIHRleHQsIGZyb20gbGFiZWwgcG9zaXRpb24uIFNlZSBIVE1MLWNhbnZhcyB0ZXh0QWxpZ24gcHJvcGVydHkuXG4gICAgICAgICAqIFwibGVmdFwiIHx8IFwicmlnaHRcIiB8fCBcImNlbnRlclwiIHx8IFwic3RhcnRcIiB8fCBcImVuZFwiXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEB0eXBlIHtDYW52YXNUZXh0QWxpZ259ICovXG4gICAgICAgIHRoaXMudGV4dEFsaWduID0gb3B0cy50ZXh0QWxpZ24gfHwgJ3N0YXJ0J1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAdHlwZSB7QXJyYXkuPG51bWJlcj59ICovXG4gICAgICAgIHRoaXMub2Zmc2V0UGl4ID0gb3B0cy5vZmZzZXRQaXggfHwgWzUsIDVdXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgcHJlcHJvY2VzcyB0byBydW4gb24gZWFjaCBsYWJlbCBhZnRlciBsb2FkaW5nLlxuICAgICAgICAgKiBJdCBjYW4gYmUgdXNlZCB0byBhcHBseSBzb21lIHNwZWNpZmljIHRyZWF0bWVudCBiZWZvcmUsIGZvcm1hdCB0aGUgbGFiZWwgZGF0YSwgcHJvamVjdCBjb29yZGluYXRlcywgZXRjLlxuICAgICAgICAgKiBSZXR1cm4gZmFsc2UgaWYgdGhlIGxhYmVsIHNob3VsZCBub3QgYmUga2VwdC5cbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKExhYmVsKTpib29sZWFufSAqL1xuICAgICAgICB0aGlzLnByZXByb2Nlc3MgPSBvcHRzLnByZXByb2Nlc3NcblxuICAgICAgICAvKipcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHR5cGUge0FycmF5LjxMYWJlbD4gfCB1bmRlZmluZWR9ICovXG4gICAgICAgIHRoaXMubGFiZWxzID0gdW5kZWZpbmVkXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgICAgIHRoaXMubG9hZGluZ1N0YXR1cyA9ICdub3RMb2FkZWQnXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRHJhdyB0aGUgbGFiZWwgbGF5ZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvcmUvR2VvQ2FudmFzXCIpLkdlb0NhbnZhc30gZ2VvQ2FudmFzIFRoZSBjYW52YXMgd2hlcmUgdG8gZHJhdyB0aGUgbGF5ZXIuXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgZHJhdyhnZW9DYW52YXMpIHtcbiAgICAgICAgLy9sb2FkIGxhYmVscywgaWYgbm90IGRvbmUgeWV0LlxuICAgICAgICBpZiAoIXRoaXMubGFiZWxzKSB7XG4gICAgICAgICAgICB0aGlzLmxvYWQoZ2VvQ2FudmFzLnJlZHJhdylcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgeiA9IGdlb0NhbnZhcy52aWV3LnpcbiAgICAgICAgY29uc3QgY3R4ID0gZ2VvQ2FudmFzLm9mZnNjcmVlbkN0eFxuXG4gICAgICAgIC8vdGV4dCBhbGlnblxuICAgICAgICBjdHgudGV4dEFsaWduID0gdGhpcy50ZXh0QWxpZ24gfHwgJ3N0YXJ0J1xuXG4gICAgICAgIC8vbGluZSBqb2luIGFuZCBjYXBcbiAgICAgICAgY3R4LmxpbmVKb2luID0gJ2JldmVsJyAvL3x8IFwicm91bmRcIiB8fCBcIm1pdGVyXCI7XG4gICAgICAgIGN0eC5saW5lQ2FwID0gJ2J1dHQnIC8vfHwgXCJyb3VuZFwiIHx8IFwic3F1YXJlXCI7XG5cbiAgICAgICAgLy9kcmF3IGluIHBpeCBjb29yZGluYXRlc1xuICAgICAgICBnZW9DYW52YXMuaW5pdENhbnZhc1RyYW5zZm9ybSgpXG5cbiAgICAgICAgLy9kcmF3IGxhYmVscywgb25lIGJ5IG9uZVxuICAgICAgICBmb3IgKGNvbnN0IGxiIG9mIHRoaXMubGFiZWxzKSB7XG4gICAgICAgICAgICAvL2dldCBsYWJlbCBzdHlsZVxuICAgICAgICAgICAgY29uc3Qgc3QgPSB0aGlzLnN0eWxlKGxiLCB6KVxuICAgICAgICAgICAgaWYgKCFzdCkgY29udGludWVcbiAgICAgICAgICAgIGN0eC5mb250ID0gc3RcblxuICAgICAgICAgICAgLy9jaGVjayBsYWJlbCB3aXRoaW4gdGhlIHZpZXcsIHRvIGJlIGRyYXduXG4gICAgICAgICAgICBpZiAoIWdlb0NhbnZhcy50b0RyYXcobGIpKSBjb250aW51ZVxuXG4gICAgICAgICAgICAvL3Bvc2l0aW9uXG4gICAgICAgICAgICBjb25zdCB4UCA9IGdlb0NhbnZhcy5nZW9Ub1BpeFgobGIueCkgKyB0aGlzLm9mZnNldFBpeFswXVxuICAgICAgICAgICAgY29uc3QgeVAgPSBnZW9DYW52YXMuZ2VvVG9QaXhZKGxiLnkpIC0gdGhpcy5vZmZzZXRQaXhbMV1cblxuICAgICAgICAgICAgLy9sYWJlbCBzdHJva2UsIGZvciB0aGUgaGFsb1xuICAgICAgICAgICAgaWYgKHRoaXMuaGFsb0NvbG9yICYmIHRoaXMuaGFsb1dpZHRoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaGMgPSB0aGlzLmhhbG9Db2xvcihsYiwgeilcbiAgICAgICAgICAgICAgICBjb25zdCBodyA9IHRoaXMuaGFsb1dpZHRoKGxiLCB6KVxuICAgICAgICAgICAgICAgIGlmIChoYyAmJiBodyAmJiBodyA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4LnN0cm9rZVN0eWxlID0gaGNcbiAgICAgICAgICAgICAgICAgICAgY3R4LmxpbmVXaWR0aCA9IGh3XG4gICAgICAgICAgICAgICAgICAgIGN0eC5zdHJva2VUZXh0KGxiLm5hbWUsIHhQLCB5UClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vbGFiZWwgZmlsbFxuICAgICAgICAgICAgaWYgKHRoaXMuY29sb3IpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb2wgPSB0aGlzLmNvbG9yKGxiLCB6KVxuICAgICAgICAgICAgICAgIGlmIChjb2wpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4LmZpbGxTdHlsZSA9IGNvbFxuICAgICAgICAgICAgICAgICAgICBjdHguZmlsbFRleHQobGIubmFtZSwgeFAsIHlQKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvYWQgZGF0YSBmb3IgbGFiZWxzLCBmcm9tIFVSTCB0aGlzLnVybFxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oKTp2b2lkfSBjYWxsYmFja1xuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgYXN5bmMgbG9hZChjYWxsYmFjaykge1xuICAgICAgICBpZiAoIXRoaXMudXJsKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnRmFpbGVkIGxvYWRpbmcgbGFiZWxzOiBObyBVUkwgc3BlY2lmaWVkLiAnICsgdGhpcy51cmwpXG4gICAgICAgICAgICB0aGlzLmxvYWRpbmdTdGF0dXMgPSAnZmFpbGVkJ1xuICAgICAgICAgICAgdGhpcy5sYWJlbHMgPSBbXVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICAvL2NoZWNrIGlmIGRhdGEgYWxyZWFkeSBsb2FkZWRcbiAgICAgICAgaWYgKHRoaXMubG9hZGluZ1N0YXR1cyAhPSAnbm90TG9hZGVkJykgcmV0dXJuXG5cbiAgICAgICAgLy9sb2FkIGRhdGFcbiAgICAgICAgdGhpcy5sb2FkaW5nU3RhdHVzID0gJ2xvYWRpbmcnXG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7IEFycmF5LjxMYWJlbD4gfSAqL1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IGNzdih0aGlzLnVybClcblxuICAgICAgICAgICAgLy9wcmVwcm9jZXNzL2ZpbHRlclxuICAgICAgICAgICAgaWYgKHRoaXMucHJlcHJvY2Vzcykge1xuICAgICAgICAgICAgICAgIHRoaXMubGFiZWxzID0gW11cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGMgb2YgZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBiID0gdGhpcy5wcmVwcm9jZXNzKGMpXG4gICAgICAgICAgICAgICAgICAgIGlmIChiID09IGZhbHNlKSBjb250aW51ZVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxhYmVscy5wdXNoKGMpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvL3N0b3JlIGxhYmVsc1xuICAgICAgICAgICAgICAgIHRoaXMubGFiZWxzID0gZGF0YVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmxvYWRpbmdTdGF0dXMgPSAnbG9hZGVkJ1xuXG4gICAgICAgICAgICAvL3JlZHJhd1xuICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSBjYWxsYmFjaygpXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnRmFpbGVkIGxvYWRpbmcgbGFiZWxzIGZyb20gJyArIHRoaXMudXJsKVxuICAgICAgICAgICAgdGhpcy5sYWJlbHMgPSBbXVxuICAgICAgICAgICAgdGhpcy5sb2FkaW5nU3RhdHVzID0gJ2ZhaWxlZCdcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgTGVnZW5kIH0gZnJvbSAnLi4vY29yZS9MZWdlbmQuanMnXG5cbi8qKlxuICogQSBsZWdlbmQgZWxlbWVudCBmb3IgY29sb3IgY2F0ZWdyb3JpZXMuXG4gKlxuICogQG1vZHVsZSBsZWdlbmRcbiAqIEBhdXRob3IgSm9zZXBoIERhdmllcywgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIENvbG9yQ2F0ZWdvcnlMZWdlbmQgZXh0ZW5kcyBMZWdlbmQge1xuICAgIC8qKiBAcGFyYW0ge09iamVjdH0gb3B0cyAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cylcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvL2NvbC9jYXRlZ29yaWVzIGFycmF5LCBpbiBkaXNwbGF5IG9yZGVyXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAdHlwZSB7QXJyYXkuPFtzdHJpbmcsc3RyaW5nXT59ICovXG4gICAgICAgIHRoaXMuY29sb3JMYWJlbCA9IG9wdHMuY29sb3JMYWJlbCB8fCBbWydncmF5JywgJy0nXV1cblxuICAgICAgICAvKipcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHR5cGUge2ltcG9ydChcIi4uL2NvcmUvU3R5bGUuanNcIikuU2hhcGV9ICovXG4gICAgICAgIHRoaXMuc2hhcGUgPSBvcHRzLnNoYXBlIHx8ICdjaXJjbGUnXG4gICAgICAgIHRoaXMuZGltZW5zaW9uID0gb3B0cy5kaW1lbnNpb24gfHwgeyByOiA4IH1cbiAgICAgICAgdGhpcy5zdHJva2VDb2xvciA9IG9wdHMuc3Ryb2tlQ29sb3IgfHwgJ2dyYXknXG4gICAgICAgIHRoaXMuc3Ryb2tlV2lkdGggPSBvcHRzLnN0cm9rZVdpZHRoIHx8IDFcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKi9cbiAgICB1cGRhdGUoKSB7XG4gICAgICAgIC8vY2xlYXJcbiAgICAgICAgdGhpcy5kaXYuc2VsZWN0QWxsKCcqJykucmVtb3ZlKClcblxuICAgICAgICAvL3RpdGxlXG4gICAgICAgIHRoaXMubWFrZVRpdGxlKClcblxuICAgICAgICAvL2NhdGVnb3JpZXNcbiAgICAgICAgY29uc3QgbmIgPSB0aGlzLmNvbG9yTGFiZWwubGVuZ3RoXG4gICAgICAgIGlmIChuYiA9PSAwKSByZXR1cm5cblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5iOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGNhdCA9IHRoaXMuY29sb3JMYWJlbFtpXVxuXG4gICAgICAgICAgICAvL21ha2UgZGl2IGZvciBjYXRlZ29yeVxuICAgICAgICAgICAgY29uc3QgZCA9IHRoaXMuZGl2LmFwcGVuZCgnZGl2JylcbiAgICAgICAgICAgIC8vdG8gZW5hYmxlIHZlcnRpY2FsIGNlbnRlcmluZ1xuICAgICAgICAgICAgLy8uc3R5bGUoXCJwb3NpdGlvblwiLCBcInJlbGF0aXZlXCIpXG5cbiAgICAgICAgICAgIGNvbnN0IHN3ID0gdGhpcy5zdHJva2VXaWR0aFxuXG4gICAgICAgICAgICAvL2RyYXcgZ3JhcGhpYyBlbGVtZW50OiBib3ggLyBjaXJjbGVcbiAgICAgICAgICAgIGlmICh0aGlzLnNoYXBlID09PSAnc3F1YXJlJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGggPSB0aGlzLmRpbWVuc2lvbi5oIHx8IDE1XG4gICAgICAgICAgICAgICAgY29uc3QgdyA9IHRoaXMuZGltZW5zaW9uLncgfHwgMjBcbiAgICAgICAgICAgICAgICBkLmFwcGVuZCgnZGl2JylcbiAgICAgICAgICAgICAgICAgICAgLnN0eWxlKCdkaXNwbGF5JywgJ2lubGluZScpXG5cbiAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgnc3ZnJylcbiAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ3dpZHRoJywgdyArIDIgKiBzdylcbiAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ2hlaWdodCcsIGggKyAyICogc3cpXG5cbiAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgncmVjdCcpXG4gICAgICAgICAgICAgICAgICAgIC5hdHRyKCd4Jywgc3cpXG4gICAgICAgICAgICAgICAgICAgIC5hdHRyKCd5Jywgc3cpXG4gICAgICAgICAgICAgICAgICAgIC5hdHRyKCd3aWR0aCcsIHcpXG4gICAgICAgICAgICAgICAgICAgIC5hdHRyKCdoZWlnaHQnLCBoKVxuICAgICAgICAgICAgICAgICAgICAuc3R5bGUoJ2ZpbGwnLCBjYXRbMF0pXG4gICAgICAgICAgICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlJywgdGhpcy5zdHJva2VDb2xvcilcbiAgICAgICAgICAgICAgICAgICAgLnN0eWxlKCdzdHJva2Utd2lkdGgnLCB0aGlzLnN0cm9rZVdpZHRoKVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNoYXBlID09PSAnY2lyY2xlJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHIgPSB0aGlzLmRpbWVuc2lvbi5yIHx8IDhcbiAgICAgICAgICAgICAgICBjb25zdCBoID0gMiAqIHIgKyAyICogc3dcbiAgICAgICAgICAgICAgICBkLmFwcGVuZCgnZGl2JylcbiAgICAgICAgICAgICAgICAgICAgLnN0eWxlKCdkaXNwbGF5JywgJ2lubGluZScpXG5cbiAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgnc3ZnJylcbiAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ3dpZHRoJywgaClcbiAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ2hlaWdodCcsIGgpXG5cbiAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgnY2lyY2xlJylcbiAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ2N4JywgciArIHN3KVxuICAgICAgICAgICAgICAgICAgICAuYXR0cignY3knLCByICsgc3cpXG4gICAgICAgICAgICAgICAgICAgIC5hdHRyKCdyJywgcilcbiAgICAgICAgICAgICAgICAgICAgLnN0eWxlKCdmaWxsJywgY2F0WzBdKVxuICAgICAgICAgICAgICAgICAgICAuc3R5bGUoJ3N0cm9rZScsIHRoaXMuc3Ryb2tlQ29sb3IpXG4gICAgICAgICAgICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlLXdpZHRoJywgdGhpcy5zdHJva2VXaWR0aClcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIHNoYXBlOicgKyB0aGlzLnNoYXBlKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvL3dyaXRlIGxhYmVsIHRleHRcbiAgICAgICAgICAgIGQuYXBwZW5kKCdkaXYnKVxuICAgICAgICAgICAgICAgIC8vc2hvdyBvbiByaWdodCBvZiBncmFwaGljXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdkaXNwbGF5JywgJ2lubGluZScpXG5cbiAgICAgICAgICAgICAgICAvL2NlbnRlciB2ZXJ0aWNhbGx5XG4gICAgICAgICAgICAgICAgLy8uc3R5bGUoXCJwb3NpdGlvblwiLCBcImFic29sdXRlXCIpLnN0eWxlKFwidG9wXCIsIFwiMFwiKS5zdHlsZShcImJvdHRvbVwiLCBcIjBcIilcblxuICAgICAgICAgICAgICAgIC5zdHlsZSgncGFkZGluZy1sZWZ0JywgJzVweCcpXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdmb250LXNpemUnLCB0aGlzLmxhYmVsRm9udFNpemUpXG4gICAgICAgICAgICAgICAgLnRleHQoY2F0WzFdKVxuICAgICAgICB9XG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBMZWdlbmQgfSBmcm9tICcuLi9jb3JlL0xlZ2VuZC5qcydcblxuLyoqXG4gKiBBIGxlZ2VuZCBlbGVtZW50IGZvciBkaXNjcmV0ZSBjb2xvciBzdHlsZS5cbiAqIEluc3BpcmF0aW9uOiBodHRwczovL29ic2VydmFibGVocS5jb20vQGQzL2NvbG9yLWxlZ2VuZFxuICpcbiAqIEBtb2R1bGUgbGVnZW5kXG4gKiBAYXV0aG9yIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBDb2xvckRpc2NyZXRlTGVnZW5kIGV4dGVuZHMgTGVnZW5kIHtcbiAgICAvKiogQHBhcmFtIHtPYmplY3R9IG9wdHMgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLyoqIEBwcml2YXRlIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvU3R5bGUnKS5WaWV3U2NhbGUpOkFycmF5LjxzdHJpbmc+fSAqL1xuICAgICAgICB0aGlzLmNvbG9ycyA9IG9wdHMuY29sb3JzXG4gICAgICAgIC8qKiBAcHJpdmF0ZSBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL1N0eWxlJykuVmlld1NjYWxlKTpBcnJheS48bnVtYmVyPn0gKi9cbiAgICAgICAgdGhpcy5icmVha3MgPSBvcHRzLmJyZWFrc1xuXG4gICAgICAgIHRoaXMud2lkdGggPSBvcHRzLndpZHRoIHx8IDMwMFxuICAgICAgICB0aGlzLmhlaWdodCA9IG9wdHMuaGVpZ2h0IHx8IDE1XG5cbiAgICAgICAgdGhpcy50aWNrU2l6ZSA9IG9wdHMudGlja1NpemUgfHwgM1xuXG4gICAgICAgIC8vbGFiZWxcbiAgICAgICAgdGhpcy5pbnZlcnQgPSBvcHRzLmludmVydFxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7e3ZpZXdTY2FsZTppbXBvcnQoJy4uL2NvcmUvU3R5bGUnKS5WaWV3U2NhbGV9IH0gb3B0c1xuICAgICAqL1xuICAgIHVwZGF0ZShvcHRzKSB7XG4gICAgICAgIC8vY2xlYXJcbiAgICAgICAgdGhpcy5kaXYuc2VsZWN0QWxsKCcqJykucmVtb3ZlKClcblxuICAgICAgICAvL3RpdGxlXG4gICAgICAgIHRoaXMubWFrZVRpdGxlKClcblxuICAgICAgICAvL2dldCBjb2xvcnMgYW5kIGJyZWFrc1xuICAgICAgICBjb25zdCBjb2xvcnMgPSB0aGlzLmNvbG9ycyhvcHRzLnZpZXdTY2FsZSlcbiAgICAgICAgY29uc3QgYnJlYWtzID0gdGhpcy5icmVha3Mob3B0cy52aWV3U2NhbGUpXG4gICAgICAgIGlmICghYnJlYWtzKSByZXR1cm5cblxuICAgICAgICAvL2NsYXNzZXNcbiAgICAgICAgY29uc3QgbmIgPSBjb2xvcnMubGVuZ3RoXG4gICAgICAgIGlmIChuYiA9PSAwKSByZXR1cm5cbiAgICAgICAgY29uc3QgdyA9IHRoaXMud2lkdGggLyBuYlxuXG4gICAgICAgIC8vbWFrZSBzdmcgZWxlbWVudFxuICAgICAgICBjb25zdCBzdmcgPSB0aGlzLmRpdlxuICAgICAgICAgICAgLmFwcGVuZCgnc3ZnJylcbiAgICAgICAgICAgIC5hdHRyKCd3aWR0aCcsIHRoaXMud2lkdGgpXG4gICAgICAgICAgICAuYXR0cignaGVpZ2h0JywgdGhpcy5oZWlnaHQgKyB0aGlzLnRpY2tTaXplICsgMiArIDEwKVxuXG4gICAgICAgIC8vZHJhdyBncmFwaGljIGVsZW1lbnRzXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmI7IGkrKykge1xuICAgICAgICAgICAgc3ZnLmFwcGVuZCgncmVjdCcpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3gnLCBpICogdylcbiAgICAgICAgICAgICAgICAuYXR0cigneScsIDApXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3dpZHRoJywgdylcbiAgICAgICAgICAgICAgICAuYXR0cignaGVpZ2h0JywgdGhpcy5oZWlnaHQpXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdmaWxsJywgY29sb3JzW2ldKVxuICAgICAgICB9XG5cbiAgICAgICAgLy90aWNrIGxpbmVcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBuYjsgaSsrKSB7XG4gICAgICAgICAgICBzdmcuYXBwZW5kKCdsaW5lJylcbiAgICAgICAgICAgICAgICAuYXR0cigneDEnLCB3ICogaSlcbiAgICAgICAgICAgICAgICAuYXR0cigneTEnLCAwKVxuICAgICAgICAgICAgICAgIC5hdHRyKCd4MicsIHcgKiBpKVxuICAgICAgICAgICAgICAgIC5hdHRyKCd5MicsIHRoaXMuaGVpZ2h0ICsgdGhpcy50aWNrU2l6ZSlcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ3N0cm9rZScsICdibGFjaycpXG4gICAgICAgIH1cblxuICAgICAgICAvL2xhYmVsc1xuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IG5iOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBsYWJlbCA9IGJyZWFrc1tpIC0gMV1cbiAgICAgICAgICAgIGlmIChpc05hTihsYWJlbCkgfHwgbGFiZWwgPT0gdW5kZWZpbmVkKSBjb250aW51ZVxuICAgICAgICAgICAgaWYgKHRoaXMubGFiZWxGb3JtYXQpIGxhYmVsID0gdGhpcy5sYWJlbEZvcm1hdChsYWJlbCwgaSlcblxuICAgICAgICAgICAgLy9sYWJlbFxuICAgICAgICAgICAgc3ZnLmFwcGVuZCgndGV4dCcpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ2lkJywgJ3RpY2tsYWJlbF8nICsgaSlcbiAgICAgICAgICAgICAgICAuYXR0cigneCcsIHcgKiBpKVxuICAgICAgICAgICAgICAgIC5hdHRyKCd5JywgdGhpcy5oZWlnaHQgKyB0aGlzLnRpY2tTaXplICsgMilcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsIHRoaXMubGFiZWxGb250U2l6ZSlcbiAgICAgICAgICAgICAgICAvLy5zdHlsZShcImZvbnQtd2VpZ2h0XCIsIFwiYm9sZFwiKVxuICAgICAgICAgICAgICAgIC8vLnN0eWxlKFwiZm9udC1mYW1pbHlcIiwgXCJBcmlhbFwiKVxuICAgICAgICAgICAgICAgIC5zdHlsZSgndGV4dC1hbmNob3InLCAnbWlkZGxlJylcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ2FsaWdubWVudC1iYXNlbGluZScsICd0b3AnKVxuICAgICAgICAgICAgICAgIC5zdHlsZSgnZG9taW5hbnQtYmFzZWxpbmUnLCAnaGFuZ2luZycpXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdwb2ludGVyLWV2ZW50cycsICdub25lJylcbiAgICAgICAgICAgICAgICAudGV4dChsYWJlbClcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgTGVnZW5kIH0gZnJvbSAnLi4vY29yZS9MZWdlbmQuanMnXG5cbi8qKlxuICogQSBsZWdlbmQgZWxlbWVudCBmb3IgY29udGludW91cyBjb2xvciBzdHlsZS5cbiAqIEluc3BpcmF0aW9uOiBodHRwczovL29ic2VydmFibGVocS5jb20vQGQzL2NvbG9yLWxlZ2VuZFxuICpcbiAqIEBtb2R1bGUgbGVnZW5kXG4gKiBAYXV0aG9yIEpvc2VwaCBEYXZpZXMsIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBDb2xvckxlZ2VuZCBleHRlbmRzIExlZ2VuZCB7XG4gICAgLyoqIEBwYXJhbSB7T2JqZWN0fSBvcHRzICovXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKVxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgICAgIC8vYSBmdW5jdGlvbiBbMCwxXS0+Y29sb3IgZm9yIGNvbnRpbnVvdXMgY29sb3JzLlxuICAgICAgICAvL2l0IGNhbiB0YWtlIGFzIHNlY29uZCBhcmd1bWVudCB0aGUgdmlld3NjYWxlLlxuICAgICAgICB0aGlzLmNvbG9yU2NhbGUgPSBvcHRzLmNvbG9yU2NhbGVcblxuICAgICAgICAvL2Z1bmN0aW9uICh0WzAsMV0pIC0+IHZhbHVlIChmb3IgbGFiZWwgdGV4dClcbiAgICAgICAgLy9pdCBjYW4gdGFrZSBhcyBzZWNvbmQgYXJndW1lbnQgdGhlIHZpZXdzY2FsZS5cbiAgICAgICAgdGhpcy50ZXh0U2NhbGUgPSBvcHRzLnRleHRTY2FsZSB8fCAoKHQpID0+IHQpXG5cbiAgICAgICAgdGhpcy5tYXJnaW4gPSBvcHRzLm1hcmdpbiB8fCA1XG5cbiAgICAgICAgLy9yZXBsYWNlIHdpdGggbGFiZWxzID9cbiAgICAgICAgdGhpcy50aWNrU2l6ZSA9IG9wdHMudGlja1NpemUgfHwgNlxuICAgICAgICB0aGlzLnRpY2tzID0gb3B0cy50aWNrcyB8fCBNYXRoLmZsb29yKHRoaXMud2lkdGggLyA1MClcbiAgICAgICAgdGhpcy50aWNrRm9ybWF0ID0gb3B0cy50aWNrRm9ybWF0XG4gICAgICAgIHRoaXMudGlja1VuaXQgPSBvcHRzLnRpY2tVbml0XG5cbiAgICAgICAgdGhpcy5mb250U2l6ZSA9IG9wdHMuZm9udFNpemUgfHwgJzAuOGVtJ1xuICAgICAgICB0aGlzLmludmVydCA9IG9wdHMuaW52ZXJ0XG5cbiAgICAgICAgdGhpcy53aWR0aCA9IG9wdHMud2lkdGggfHwgMzAwXG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gb3B0cy5oZWlnaHQgfHwgMTVcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge3t2aWV3U2NhbGU6aW1wb3J0KCcuLi9jb3JlL1N0eWxlJykuVmlld1NjYWxlfSB9IG9wdHNcbiAgICAgKi9cbiAgICB1cGRhdGUob3B0cykge1xuICAgICAgICAvL2NsZWFyXG4gICAgICAgIHRoaXMuZGl2LnNlbGVjdEFsbCgnKicpLnJlbW92ZSgpXG5cbiAgICAgICAgLy90aXRsZVxuICAgICAgICB0aGlzLm1ha2VUaXRsZSgpXG5cbiAgICAgICAgY29uc3Qgc3ZnVyA9IHRoaXMud2lkdGggKyAyICogdGhpcy5tYXJnaW5cbiAgICAgICAgY29uc3Qgc3ZnSCA9IHRoaXMuaGVpZ2h0ICsgdGhpcy5tYXJnaW4gKyB0aGlzLnRpY2tTaXplICsgMTBcbiAgICAgICAgY29uc3Qgc3ZnID0gdGhpcy5kaXYuYXBwZW5kKCdzdmcnKS5hdHRyKCd3aWR0aCcsIHN2Z1cpLmF0dHIoJ2hlaWdodCcsIHN2Z0gpXG4gICAgICAgIC8vICA8cmVjdCB3aWR0aD1cIjMwMFwiIGhlaWdodD1cIjEwMFwiIHN0eWxlPVwiZmlsbDpyZ2IoMCwwLDI1NSk7c3Ryb2tlLXdpZHRoOjM7c3Ryb2tlOnJnYigwLDAsMClcIiAvPlxuXG4gICAgICAgIGNvbnN0IGcgPSBzdmcuYXBwZW5kKCdnJykuYXR0cigndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgnICsgdGhpcy5tYXJnaW4gKyAnICcgKyAwICsgJyknKVxuXG4gICAgICAgIC8vZHJhdyBjb2xvciBiYXJcbiAgICAgICAgY29uc3QgdyA9IHRoaXMud2lkdGgsXG4gICAgICAgICAgICBoID0gdGhpcy5oZWlnaHRcbiAgICAgICAgY29uc3Qgc3RlcCA9IDVcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB3OyBpICs9IHN0ZXApIHtcbiAgICAgICAgICAgIGxldCB0ID0gaSAvICh3IC0gMSlcbiAgICAgICAgICAgIGlmICh0aGlzLmludmVydCkgdCA9IDEgLSB0XG4gICAgICAgICAgICBnLmFwcGVuZCgncmVjdCcpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3gnLCBpKVxuICAgICAgICAgICAgICAgIC5hdHRyKCd5JywgMClcbiAgICAgICAgICAgICAgICAuYXR0cignd2lkdGgnLCBzdGVwKVxuICAgICAgICAgICAgICAgIC5hdHRyKCdoZWlnaHQnLCBoKVxuICAgICAgICAgICAgICAgIC5zdHlsZSgnZmlsbCcsIHRoaXMuY29sb3JTY2FsZSh0LCBvcHRzLnZpZXdTY2FsZSkpXG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMudGlja3M7IGkrKykge1xuICAgICAgICAgICAgbGV0IHQgPSBpIC8gKHRoaXMudGlja3MgLSAxKVxuXG4gICAgICAgICAgICAvL3RpY2sgbGluZVxuICAgICAgICAgICAgZy5hcHBlbmQoJ2xpbmUnKVxuICAgICAgICAgICAgICAgIC5hdHRyKCd4MScsIHcgKiB0KVxuICAgICAgICAgICAgICAgIC5hdHRyKCd5MScsIDApXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3gyJywgdyAqIHQpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3kyJywgaCArIHRoaXMudGlja1NpemUpXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdzdHJva2UnLCAnYmxhY2snKVxuXG4gICAgICAgICAgICAvL3ByZXBhcmUgdGljayBsYWJlbFxuICAgICAgICAgICAgZy5hcHBlbmQoJ3RleHQnKVxuICAgICAgICAgICAgICAgIC5hdHRyKCdpZCcsICd0aWNrbGFiZWxfJyArIGkpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3gnLCB3ICogdClcbiAgICAgICAgICAgICAgICAuYXR0cigneScsIGggKyB0aGlzLnRpY2tTaXplICsgMilcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsIHRoaXMuZm9udFNpemUpXG4gICAgICAgICAgICAgICAgLy8uc3R5bGUoXCJmb250LXdlaWdodFwiLCBcImJvbGRcIilcbiAgICAgICAgICAgICAgICAvLy5zdHlsZShcImZvbnQtZmFtaWx5XCIsIFwiQXJpYWxcIilcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ3RleHQtYW5jaG9yJywgaSA9PSAwID8gJ3N0YXJ0JyA6IGkgPT0gdGhpcy50aWNrcyAtIDEgPyAnZW5kJyA6ICdtaWRkbGUnKVxuICAgICAgICAgICAgICAgIC5zdHlsZSgnYWxpZ25tZW50LWJhc2VsaW5lJywgJ3RvcCcpXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdkb21pbmFudC1iYXNlbGluZScsICdoYW5naW5nJylcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ3BvaW50ZXItZXZlbnRzJywgJ25vbmUnKVxuICAgICAgICAgICAgLy8udGV4dChcIi1cIilcbiAgICAgICAgfVxuXG4gICAgICAgIC8vdXBkYXRlIHRpY2sgbGFiZWxzXG5cbiAgICAgICAgLy9sYWJlbCB0ZXh0IGZvcm1hdFxuICAgICAgICBjb25zdCBmID0gdGhpcy50aWNrRm9ybWF0ICYmIHRoaXMudGlja0Zvcm1hdCAhPSAndGV4dCcgPyB0aGlzLnRpY2tGb3JtYXQgOiAodikgPT4gdlxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMudGlja3M7IGkrKykge1xuICAgICAgICAgICAgbGV0IHQgPSBpIC8gKHRoaXMudGlja3MgLSAxKVxuXG4gICAgICAgICAgICBjb25zdCB2ID0gdGhpcy50ZXh0U2NhbGUodCwgb3B0cy52aWV3U2NhbGUpXG4gICAgICAgICAgICBjb25zdCB0ZXh0ID0gKHYgPyBmKHYpIDogJzAnKSArICh0aGlzLnRpY2tVbml0ID8gdGhpcy50aWNrVW5pdCA6ICcnKVxuICAgICAgICAgICAgaWYgKHRleHQgPT0gdW5kZWZpbmVkKSBjb250aW51ZVxuXG4gICAgICAgICAgICAvL3RpY2sgbGFiZWxcbiAgICAgICAgICAgIHRoaXMuZGl2LnNlbGVjdCgnIycgKyAndGlja2xhYmVsXycgKyBpKS50ZXh0KHRleHQpXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IExlZ2VuZCB9IGZyb20gJy4uL2NvcmUvTGVnZW5kLmpzJ1xuXG4vKipcbiAqIEEgbGVnZW5kIGVsZW1lbnQgZm9yIHNlZ21lbnQgb3JpZW50YXRpb24uXG4gKlxuICogQG1vZHVsZSBsZWdlbmRcbiAqIEBhdXRob3IgSm9zZXBoIERhdmllcywgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIE9yaWVudGF0aW9uTGVnZW5kIGV4dGVuZHMgTGVnZW5kIHtcbiAgICAvKiogQHBhcmFtIHtPYmplY3R9IG9wdHMgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLy9vcmllbnRhdGlvblxuICAgICAgICB0aGlzLm9yaWVudGF0aW9uID0gb3B0cy5vcmllbnRhdGlvbiB8fCAwXG4gICAgICAgIC8vY29sb3JcbiAgICAgICAgdGhpcy5jb2xvciA9IG9wdHMuY29sb3IgfHwgKChyZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpID0+ICdncmF5JylcbiAgICAgICAgLy93aWR0aFxuICAgICAgICB0aGlzLndpZHRoID0gb3B0cy53aWR0aCB8fCAoKHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgPT4gMyAqIHopXG4gICAgICAgIC8vbGVuZ3RoXG4gICAgICAgIHRoaXMubGVuZ3RoID0gb3B0cy5sZW5ndGggfHwgKChyZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpID0+IHJlc29sdXRpb24pXG5cbiAgICAgICAgLy9sYWJlbFxuICAgICAgICB0aGlzLmxhYmVsID0gb3B0cy5sYWJlbCB8fCAnLSdcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge3sgc3R5bGU6IGltcG9ydChcIi4uL3N0eWxlL1NlZ21lbnRTdHlsZS5qc1wiKS5TZWdtZW50U3R5bGUsIHJlc29sdXRpb246IG51bWJlciwgejogbnVtYmVyLCB2aWV3U2NhbGU6b2JqZWN0IH19IG9wdHNcbiAgICAgKi9cbiAgICB1cGRhdGUob3B0cykge1xuICAgICAgICAvL2NsZWFyXG4gICAgICAgIHRoaXMuZGl2LnNlbGVjdEFsbCgnKicpLnJlbW92ZSgpXG5cbiAgICAgICAgLy90aXRsZVxuICAgICAgICB0aGlzLm1ha2VUaXRsZSgpXG5cbiAgICAgICAgY29uc3QgZCA9IHRoaXMuZGl2LmFwcGVuZCgnZGl2JylcblxuICAgICAgICAvL2NvbXB1dGUgc2VnbWVudCBjb2xvciwgd2lkdGggYW5kIGxlbmd0aFxuICAgICAgICBjb25zdCBjb2xvciA9IHRoaXMuY29sb3Iob3B0cy5yZXNvbHV0aW9uLCBvcHRzLnosIG9wdHMudmlld1NjYWxlKVxuICAgICAgICBjb25zdCB3aWR0aFBpeCA9IHRoaXMud2lkdGgob3B0cy5yZXNvbHV0aW9uLCBvcHRzLnosIG9wdHMudmlld1NjYWxlKSAvIG9wdHMuelxuICAgICAgICBjb25zdCBsZW5ndGhQaXggPSB0aGlzLmxlbmd0aChvcHRzLnJlc29sdXRpb24sIG9wdHMueiwgb3B0cy52aWV3U2NhbGUpIC8gb3B0cy56XG5cbiAgICAgICAgLy9kcmF3IFNWRyBzZWdtZW50XG4gICAgICAgIGNvbnN0IHN2Z1MgPSBNYXRoLm1heChsZW5ndGhQaXgsIHdpZHRoUGl4KVxuICAgICAgICBjb25zdCBzdmcgPSBkLmFwcGVuZCgnc3ZnJykuYXR0cignd2lkdGgnLCBzdmdTKS5hdHRyKCdoZWlnaHQnLCBzdmdTKS5zdHlsZSgnJywgJ2lubGluZS1ibG9jaycpXG5cbiAgICAgICAgY29uc3QgY29zID0gTWF0aC5jb3MoKC10aGlzLm9yaWVudGF0aW9uICogTWF0aC5QSSkgLyAxODApXG4gICAgICAgIGNvbnN0IHNpbiA9IE1hdGguc2luKCgtdGhpcy5vcmllbnRhdGlvbiAqIE1hdGguUEkpIC8gMTgwKVxuICAgICAgICBjb25zdCBkYyA9IHN2Z1MgKiAwLjUsXG4gICAgICAgICAgICBsMiA9IGxlbmd0aFBpeCAqIDAuNVxuICAgICAgICBzdmcuYXBwZW5kKCdsaW5lJylcbiAgICAgICAgICAgIC5hdHRyKCd4MScsIGRjIC0gY29zICogbDIpXG4gICAgICAgICAgICAuYXR0cigneTEnLCBkYyAtIHNpbiAqIGwyKVxuICAgICAgICAgICAgLmF0dHIoJ3gyJywgZGMgKyBjb3MgKiBsMilcbiAgICAgICAgICAgIC5hdHRyKCd5MicsIGRjICsgc2luICogbDIpXG4gICAgICAgICAgICAuc3R5bGUoJ3N0cm9rZScsIGNvbG9yKVxuICAgICAgICAgICAgLnN0eWxlKCdzdHJva2Utd2lkdGgnLCB3aWR0aFBpeClcblxuICAgICAgICAvL2xhYmVsXG4gICAgICAgIGQuYXBwZW5kKCdkaXYnKVxuICAgICAgICAgICAgLnN0eWxlKCdkaXNwbGF5JywgJ2lubGluZScpXG4gICAgICAgICAgICAuc3R5bGUoJ3BhZGRpbmctbGVmdCcsICc1cHgnKVxuICAgICAgICAgICAgLnN0eWxlKCdmb250LXNpemUnLCB0aGlzLmxhYmVsRm9udFNpemUpXG4gICAgICAgICAgICAudGV4dCh0aGlzLmxhYmVsICsgKHRoaXMubGFiZWxVbml0VGV4dCA/ICcgJyA6ICcnKSArIHRoaXMubGFiZWxVbml0VGV4dClcbiAgICB9XG59XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7QXJyYXkuPG51bWJlcj59IG9yaWVudGF0aW9uc1xuICogQHBhcmFtIHtBcnJheS48c3RyaW5nPn0gbGFiZWxzXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0c1xuICogQHJldHVybnMgIHsgQXJyYXkuPE9yaWVudGF0aW9uTGVnZW5kPiB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvcmllbnRhdGlvbkxlZ2VuZChvcmllbnRhdGlvbnMsIGxhYmVscywgb3B0cyA9IHt9KSB7XG4gICAgY29uc3QgbGVnZW5kcyA9IFtdXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvcmllbnRhdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgb3B0cy50aXRsZSA9IGkgPT0gMCA/IG9wdHMudGl0bGUgOiB1bmRlZmluZWRcbiAgICAgICAgb3B0cy5vcmllbnRhdGlvbiA9IG9yaWVudGF0aW9uc1tpXVxuICAgICAgICBvcHRzLmxhYmVsID0gbGFiZWxzW2ldXG4gICAgICAgIGxlZ2VuZHMucHVzaChuZXcgT3JpZW50YXRpb25MZWdlbmQob3B0cykpXG4gICAgfVxuICAgIHJldHVybiBsZWdlbmRzXG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IExlZ2VuZCB9IGZyb20gJy4uL2NvcmUvTGVnZW5kLmpzJ1xuaW1wb3J0IHsgbmljZSB9IGZyb20gJy4uL3V0aWxzL3V0aWxzLmpzJ1xuaW1wb3J0IHsgbWF4IH0gZnJvbSAnZDMtYXJyYXknXG5cbi8qKlxuICogQSBsZWdlbmQgZWxlbWVudCBmb3IgcHJvcG9ydGlvbmFsIHN5bWJvbHMuXG4gKlxuICogQG1vZHVsZSBsZWdlbmRcbiAqIEBhdXRob3IgSm9zZXBoIERhdmllcywgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIFNpemVMZWdlbmQgZXh0ZW5kcyBMZWdlbmQge1xuICAgIC8qKiBAcGFyYW0ge09iamVjdH0gb3B0cyAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cylcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIHRleHQgbGFiZWwsIGZyb20gdGhlIHZpZXcgc2NhbGUgYW5kIGxpc3Qgb2YgY2VsbHMsIHJlc29sdXRpb24gYW5kIHpvb21cbiAgICAgICAgICogIEB0eXBlIHsgZnVuY3Rpb24ob2JqZWN0LCBBcnJheS48aW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsPiwgbnVtYmVyLCBudW1iZXIpOihudW1iZXJ8c3RyaW5nKSB9ICovXG4gICAgICAgIHRoaXMubGFiZWwgPSBvcHRzLmxhYmVsIHx8IHVuZGVmaW5lZFxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgc2l6ZSBvZiB0aGUgbGVnZW5kIHN5bWJvbCwgaW4gZ2VvIFVvTSwgZnJvbSB0aGUgdmlld3NjYWxlLCByZXNvbHV0aW9uIGFuZCB6b29tXG4gICAgICAgICAqICBAdHlwZSB7IGZ1bmN0aW9uKG9iamVjdCwgbnVtYmVyLCBudW1iZXIpOm51bWJlciB9ICovXG4gICAgICAgIHRoaXMuc2l6ZSA9IG9wdHMuc2l6ZSB8fCB1bmRlZmluZWRcblxuICAgICAgICAvL3N5bWJvbFxuICAgICAgICAvKiogIEB0eXBlIHsoaW1wb3J0KFwiLi4vY29yZS9TdHlsZVwiKS5TaGFwZSl8XCJsaW5lXCJ9ICovXG4gICAgICAgIHRoaXMuc2hhcGUgPSBvcHRzLnNoYXBlIHx8ICdjaXJjbGUnXG5cbiAgICAgICAgLy9nZW5lcmFsIGNhc2VcbiAgICAgICAgdGhpcy5maWxsQ29sb3IgPSBvcHRzLmZpbGxDb2xvciB8fCAnbm9uZSdcbiAgICAgICAgdGhpcy5zdHJva2VDb2xvciA9IG9wdHMuc3Ryb2tlQ29sb3IgfHwgJ2dyYXknXG4gICAgICAgIHRoaXMuc3Ryb2tlV2lkdGggPSBvcHRzLnN0cm9rZVdpZHRoIHx8IDFcblxuICAgICAgICAvL2ZvciBsaW5lIHNoYXBlXG4gICAgICAgIC8vVE9ETyB0aGlzLm9yaWVudGF0aW9uID0gb3B0cy5vcmllbnRhdGlvbiB8fCAwXG4gICAgICAgIHRoaXMuY29sb3IgPSBvcHRzLmNvbG9yIHx8ICdncmF5J1xuICAgICAgICB0aGlzLmxlbmd0aCA9IG9wdHMubGVuZ3RoIHx8ICgocmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA9PiByZXNvbHV0aW9uKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7eyB2aWV3U2NhbGU6b2JqZWN0LCByZXNvbHV0aW9uOiBudW1iZXIsIHo6bnVtYmVyLCBjZWxsczpBcnJheS48aW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsPiB9fSBvcHRzXG4gICAgICovXG4gICAgdXBkYXRlKG9wdHMpIHtcbiAgICAgICAgLy9jbGVhclxuICAgICAgICB0aGlzLmRpdi5zZWxlY3RBbGwoJyonKS5yZW1vdmUoKVxuXG4gICAgICAgIC8vdGl0bGVcbiAgICAgICAgdGhpcy5tYWtlVGl0bGUoKVxuXG4gICAgICAgIC8vZ2V0IGxhYmVsLiBNYXkgbm90IGJlIGEgbnVtYmVyICghKVxuICAgICAgICBsZXQgbGFiZWwgPSB0aGlzLmxhYmVsKG9wdHMudmlld1NjYWxlLCBvcHRzLmNlbGxzLCBvcHRzLnJlc29sdXRpb24sIG9wdHMueilcblxuICAgICAgICAvL2NvbXB1dGUgc2l6ZSBvZiBzeW1ib2wsIGluIHBpeFxuICAgICAgICBsZXQgc2l6ZVBpeFxuICAgICAgICBpZiAodGhpcy5zaXplKSBzaXplUGl4ID0gdGhpcy5zaXplKG9wdHMudmlld1NjYWxlLCBvcHRzLnJlc29sdXRpb24sIG9wdHMueikgLyBvcHRzLnpcbiAgICAgICAgZWxzZSBzaXplUGl4ID0gb3B0cy52aWV3U2NhbGUoK2xhYmVsKSAvIG9wdHMuelxuICAgICAgICBpZiAoIXNpemVQaXgpIHJldHVyblxuXG4gICAgICAgIC8vZm9ybWF0IGxhYmVsLCBpZiBzcGVjaWZpZWQgYW5kIHBvc3NpYmxlXG4gICAgICAgIGlmICh0aGlzLmxhYmVsRm9ybWF0ICYmICFpc05hTigrbGFiZWwpKSBsYWJlbCA9IHRoaXMubGFiZWxGb3JtYXQobGFiZWwpXG5cbiAgICAgICAgY29uc3QgZCA9IHRoaXMuZGl2LmFwcGVuZCgnZGl2JylcbiAgICAgICAgLy90byBlbmFibGUgdmVydGljYWwgY2VudGVyaW5nXG4gICAgICAgIC8vLnN0eWxlKFwicG9zaXRpb25cIiwgXCJyZWxhdGl2ZVwiKVxuXG4gICAgICAgIC8vZGVmYXVsdCBzdmcgY29uc3RydWN0aW9uLCBmb3Igc3F1YXJlIGFuZCBjaXJjbGVcbiAgICAgICAgY29uc3Qgc3ZnID0gKCkgPT5cbiAgICAgICAgICAgIGRcbiAgICAgICAgICAgICAgICAuYXBwZW5kKCdzdmcnKVxuICAgICAgICAgICAgICAgIC5hdHRyKCd3aWR0aCcsIHNpemVQaXggKyB0aGlzLnN0cm9rZVdpZHRoICsgMilcbiAgICAgICAgICAgICAgICAuYXR0cignaGVpZ2h0Jywgc2l6ZVBpeCArIHRoaXMuc3Ryb2tlV2lkdGggKyAyKVxuICAgICAgICAgICAgICAgIC5zdHlsZSgnJywgJ2lubGluZS1ibG9jaycpXG5cbiAgICAgICAgaWYgKHRoaXMuc2hhcGUgPT09ICdzcXVhcmUnKSB7XG4gICAgICAgICAgICBzdmcoKVxuICAgICAgICAgICAgICAgIC5hcHBlbmQoJ3JlY3QnKVxuICAgICAgICAgICAgICAgIC5hdHRyKCd4JywgMClcbiAgICAgICAgICAgICAgICAuYXR0cigneScsIDApXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3dpZHRoJywgc2l6ZVBpeClcbiAgICAgICAgICAgICAgICAuYXR0cignaGVpZ2h0Jywgc2l6ZVBpeClcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ2ZpbGwnLCB0aGlzLmZpbGxDb2xvcilcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ3N0cm9rZScsIHRoaXMuc3Ryb2tlQ29sb3IpXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdzdHJva2Utd2lkdGgnLCB0aGlzLnN0cm9rZVdpZHRoKVxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2hhcGUgPT09ICdjaXJjbGUnKSB7XG4gICAgICAgICAgICAvLyA8Y2lyY2xlIGN4PVwiNTBcIiBjeT1cIjUwXCIgcj1cIjQwXCIgc3Ryb2tlPVwiYmxhY2tcIiBzdHJva2Utd2lkdGg9XCIzXCIgZmlsbD1cInJlZFwiIC8+XG4gICAgICAgICAgICBjb25zdCByID0gKHNpemVQaXggKyB0aGlzLnN0cm9rZVdpZHRoKSAqIDAuNVxuICAgICAgICAgICAgc3ZnKClcbiAgICAgICAgICAgICAgICAuYXBwZW5kKCdjaXJjbGUnKVxuICAgICAgICAgICAgICAgIC5hdHRyKCdjeCcsIHIgKyAxKVxuICAgICAgICAgICAgICAgIC5hdHRyKCdjeScsIHIgKyAxKVxuICAgICAgICAgICAgICAgIC5hdHRyKCdyJywgcilcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ2ZpbGwnLCB0aGlzLmZpbGxDb2xvcilcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ3N0cm9rZScsIHRoaXMuc3Ryb2tlQ29sb3IpXG4gICAgICAgICAgICAgICAgLnN0eWxlKCdzdHJva2Utd2lkdGgnLCB0aGlzLnN0cm9rZVdpZHRoKVxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2hhcGUgPT09ICdkb251dCcpIHtcbiAgICAgICAgICAgIC8vVE9ET1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2hhcGUgPT09ICdkaWFtb25kJykge1xuICAgICAgICAgICAgLy9UT0RPXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zaGFwZSA9PT0gJ2xpbmUnKSB7XG4gICAgICAgICAgICAvL2dldCBzZWdtZW50IGxlbmd0aFxuICAgICAgICAgICAgbGV0IGxlbmd0aFBpeCA9IHRoaXMubGVuZ3RoXG4gICAgICAgICAgICAgICAgPyB0aGlzLmxlbmd0aChvcHRzLnJlc29sdXRpb24sIG9wdHMueiwgb3B0cy52aWV3U2NhbGUpXG4gICAgICAgICAgICAgICAgOiBvcHRzLnJlc29sdXRpb25cbiAgICAgICAgICAgIGxlbmd0aFBpeCAvPSBvcHRzLnpcblxuICAgICAgICAgICAgY29uc3Qgc3ZnID0gZFxuICAgICAgICAgICAgICAgIC5hcHBlbmQoJ3N2ZycpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3dpZHRoJywgbGVuZ3RoUGl4KVxuICAgICAgICAgICAgICAgIC5hdHRyKCdoZWlnaHQnLCBzaXplUGl4KVxuICAgICAgICAgICAgICAgIC5zdHlsZSgnJywgJ2lubGluZS1ibG9jaycpXG5cbiAgICAgICAgICAgIC8vVE9ETyBvcmllbnRhdGlvblxuICAgICAgICAgICAgLy88bGluZSB4MT1cIjBcIiB5MT1cIjBcIiB4Mj1cIjIwMFwiIHkyPVwiMjAwXCIgc3R5bGU9XCJzdHJva2U6cmdiKDI1NSwwLDApO3N0cm9rZS13aWR0aDoyXCIgLz5cbiAgICAgICAgICAgIHN2Zy5hcHBlbmQoJ2xpbmUnKVxuICAgICAgICAgICAgICAgIC5hdHRyKCd4MScsIDApXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3kxJywgc2l6ZVBpeCAvIDIpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3gyJywgbGVuZ3RoUGl4KVxuICAgICAgICAgICAgICAgIC5hdHRyKCd5MicsIHNpemVQaXggLyAyKVxuICAgICAgICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlJywgdGhpcy5jb2xvcilcbiAgICAgICAgICAgICAgICAuc3R5bGUoJ3N0cm9rZS13aWR0aCcsIHNpemVQaXgpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgc2hhcGU6JyArIHRoaXMuc2hhcGUpXG4gICAgICAgIH1cblxuICAgICAgICAvL2xhYmVsXG4gICAgICAgIGQuYXBwZW5kKCdkaXYnKVxuICAgICAgICAgICAgLnN0eWxlKCdkaXNwbGF5JywgJ2lubGluZScpXG4gICAgICAgICAgICAuc3R5bGUoJ3BhZGRpbmctbGVmdCcsICc1cHgnKVxuICAgICAgICAgICAgLnN0eWxlKCdmb250LXNpemUnLCB0aGlzLmxhYmVsRm9udFNpemUpXG4gICAgICAgICAgICAudGV4dChsYWJlbCArICh0aGlzLmxhYmVsVW5pdFRleHQgPyAnICcgOiAnJykgKyB0aGlzLmxhYmVsVW5pdFRleHQpXG4gICAgfVxufVxuXG4vKipcbiAqIEBwYXJhbSB7QXJyYXkuPG51bWJlcj59IHZhbHVlc1xuICogQHBhcmFtIHtmdW5jdGlvbihudW1iZXIpOm51bWJlcn0gc2l6ZVxuICogQHBhcmFtIHsgb2JqZWN0IH0gb3B0c1xuICogQHJldHVybnMge0FycmF5LjxTaXplTGVnZW5kPn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNpemVMZWdlbmQodmFsdWVzLCBzaXplLCBvcHRzID0ge30pIHtcbiAgICBjb25zdCBsZWdlbmRzID0gW11cbiAgICBmb3IgKGxldCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICAgICAgb3B0cy50aXRsZSA9IHZhbHVlID09IHZhbHVlc1swXSA/IG9wdHMudGl0bGUgOiB1bmRlZmluZWRcbiAgICAgICAgb3B0cy5zaXplID0gKCkgPT4gc2l6ZSh2YWx1ZSlcbiAgICAgICAgb3B0cy5sYWJlbCA9ICgpID0+IHZhbHVlXG4gICAgICAgIGxlZ2VuZHMucHVzaChuZXcgU2l6ZUxlZ2VuZChvcHRzKSlcbiAgICB9XG4gICAgcmV0dXJuIGxlZ2VuZHNcbn1cblxuLyoqXG4gKiBAcGFyYW0geyBmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwpOm51bWJlciB9IHZhbHVlXG4gKiBAcGFyYW0geyp9IG9wdHNcbiAqIEByZXR1cm5zIHtBcnJheS48U2l6ZUxlZ2VuZD59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaXplTGVnZW5kVmlld1NjYWxlKHZhbHVlLCBvcHRzID0ge30pIHtcbiAgICBjb25zdCBrID0gb3B0cy5rIHx8IFswLjksIDAuNSwgMC4yLCAwLjA1XVxuICAgIGNvbnN0IGxlZ2VuZHMgPSBbXVxuICAgIGZvciAobGV0IGtfIG9mIGspIHtcbiAgICAgICAgb3B0cy50aXRsZSA9IGtfID09IGtbMF0gPyBvcHRzLnRpdGxlIDogdW5kZWZpbmVkXG4gICAgICAgIG9wdHMubGFiZWwgPSAodmlld1NjYWxlLCBjZWxscykgPT4gbmljZShrXyAqIG1heChjZWxscywgdmFsdWUpKVxuICAgICAgICBsZWdlbmRzLnB1c2gobmV3IFNpemVMZWdlbmQob3B0cykpXG4gICAgfVxuICAgIHJldHVybiBsZWdlbmRzXG59XG5cbi8qKlxuICogQSBmdW5jdGlvbiB3aGljaCByZXR1cm4gYSBzdGFjayBvZiBzaXplIGxlZ2VuZHMgZm9yIGEgZGlzY3JldGUgY2xhc3NpZmljYXRpb24uXG4gKlxuICogQHBhcmFtIHsgQXJyYXkuPG51bWJlcj4gfSBicmVha3NcbiAqIEBwYXJhbSB7IEFycmF5LjxudW1iZXI+IH0gc2l6ZXNcbiAqIEBwYXJhbSB7IG9iamVjdCB9IG9wdHNcbiAqIEByZXR1cm5zIHtBcnJheS48U2l6ZUxlZ2VuZD59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaXplRGlzY3JldGVMZWdlbmQoYnJlYWtzLCBzaXplcywgb3B0cyA9IHt9KSB7XG4gICAgY29uc3QgZiA9IG9wdHMubGFiZWxGb3JtYXQgfHwgKCh4KSA9PiB4KVxuICAgIGNvbnN0IGxhYmVsVGV4dCA9IG9wdHMubGFiZWxUZXh0IHx8IGRlZmF1bHRMYWJlbFRleHQoZilcbiAgICBjb25zdCBsZWdlbmRzID0gW11cbiAgICBmb3IgKGxldCBpID0gc2l6ZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgb3B0cy50aXRsZSA9IGkgPT0gc2l6ZXMubGVuZ3RoIC0gMSA/IG9wdHMudGl0bGUgOiB1bmRlZmluZWRcbiAgICAgICAgb3B0cy5zaXplID0gKCkgPT4gc2l6ZXNbaV1cbiAgICAgICAgb3B0cy5sYWJlbCA9ICgpID0+IGxhYmVsVGV4dChicmVha3NbaSAtIDFdLCBicmVha3NbaV0pXG4gICAgICAgIGxlZ2VuZHMucHVzaChuZXcgU2l6ZUxlZ2VuZChvcHRzKSlcbiAgICB9XG4gICAgcmV0dXJuIGxlZ2VuZHNcbn1cblxuLyoqXG4gKiBBIGZ1bmN0aW9uIHdoaWNoIHJldHVybiBhIHN0YWNrIG9mIHNpemUgbGVnZW5kcyBmb3IgYSBkaXNjcmV0ZSBjbGFzc2lmaWNhdGlvbiB1c2luZyBhIHZpZXdzY2FsZS5cbiAqIEBwYXJhbSB7IG51bWJlciB9IGNsYXNzTnVtYmVyXG4gKiBAcGFyYW0geyBvYmplY3QgfSBvcHRzXG4gKiBAcmV0dXJucyB7QXJyYXkuPFNpemVMZWdlbmQ+fVxuICovXG5leHBvcnQgZnVuY3Rpb24gc2l6ZURpc2NyZXRlVmlld1NjYWxlTGVnZW5kKGNsYXNzTnVtYmVyLCBvcHRzID0ge30pIHtcbiAgICBjb25zdCBmID0gb3B0cy5sYWJlbEZvcm1hdCB8fCAoKHgpID0+IHgpXG4gICAgY29uc3QgbGFiZWxUZXh0ID0gb3B0cy5sYWJlbFRleHQgfHwgZGVmYXVsdExhYmVsVGV4dChmKVxuICAgIGNvbnN0IGxlZ2VuZHMgPSBbXVxuICAgIGNvbnN0IHZpZXdTY2FsZUZ1biA9IG9wdHMudmlld1NjYWxlRnVuIHx8ICgodCkgPT4gdCkgLy9UT0RPIGRvIGl0IGRpZmZlcmVudGx5PyBBdCBzaXplbGVnZW5kIGxldmVsICFcbiAgICBmb3IgKGxldCBpID0gY2xhc3NOdW1iZXIgLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICBvcHRzLnRpdGxlID0gaSA9PSBjbGFzc051bWJlciAtIDEgPyBvcHRzLnRpdGxlIDogdW5kZWZpbmVkXG4gICAgICAgIG9wdHMuc2l6ZSA9ICh2aWV3U2NhbGUpID0+IHZpZXdTY2FsZUZ1bih2aWV3U2NhbGUpLnZhbHVlc1tpXVxuICAgICAgICBvcHRzLmxhYmVsID0gKHZpZXdTY2FsZSkgPT5cbiAgICAgICAgICAgIGxhYmVsVGV4dCh2aWV3U2NhbGVGdW4odmlld1NjYWxlKS5icmVha3NbaSAtIDFdLCB2aWV3U2NhbGVGdW4odmlld1NjYWxlKS5icmVha3NbaV0pXG4gICAgICAgIGxlZ2VuZHMucHVzaChuZXcgU2l6ZUxlZ2VuZChvcHRzKSlcbiAgICB9XG4gICAgcmV0dXJuIGxlZ2VuZHNcbn1cblxuLyoqXG4gKiBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIGZ1bmN0aW9uIHRvIGZvcm1hdCBsYWJlcmxzIGZvciBkaXNjcmV0ZSBzY2FsZSBsZWdlbmRzLlxuICogQHBhcmFtIHsgZnVuY3Rpb24obnVtYmVyKTpzdHJpbmcgfSBmb3JtYXRcbiAqIEByZXR1cm5zIHsgZnVuY3Rpb24obnVtYmVyfHVuZGVmaW5lZCwgbnVtYmVyfHVuZGVmaW5lZCk6IHN0cmluZyB9XG4gKi9cbmZ1bmN0aW9uIGRlZmF1bHRMYWJlbFRleHQoZm9ybWF0KSB7XG4gICAgcmV0dXJuICh2MCwgdjEpID0+IHtcbiAgICAgICAgaWYgKHYwID09IHVuZGVmaW5lZCAmJiB2MSA9PSB1bmRlZmluZWQpIHJldHVybiAnJ1xuICAgICAgICBpZiAodjEgPT0gdW5kZWZpbmVkKSByZXR1cm4gJz4gJyArIGZvcm1hdCh2MClcbiAgICAgICAgaWYgKHYwID09IHVuZGVmaW5lZCkgcmV0dXJuICc8ICcgKyBmb3JtYXQodjEpXG4gICAgICAgIHJldHVybiBmb3JtYXQodjApICsgJyAtICcgKyBmb3JtYXQodjEpXG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBzZWxlY3QgfSBmcm9tICdkMy1zZWxlY3Rpb24nXG5pbXBvcnQgeyBMZWdlbmQgfSBmcm9tICcuLi9jb3JlL0xlZ2VuZC5qcydcblxuLyoqXG4gKlxuICogQG1vZHVsZSBsZWdlbmRcbiAqIEBhdXRob3IgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIFRlcm5hcnlMZWdlbmQgZXh0ZW5kcyBMZWdlbmQge1xuICAgIC8qKiBAcGFyYW0ge09iamVjdH0gb3B0cyAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cylcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvL2NsYXNzaWZpZXJcbiAgICAgICAgdGhpcy5jbGFzc2lmaWVyID0gb3B0cy5jbGFzc2lmaWVyXG5cbiAgICAgICAgdGhpcy53aWR0aCA9IG9wdHMud2lkdGggfHwgMTUwXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uQ29sb3IgPSB0aGlzLnNlbGVjdGlvbkNvbG9yIHx8ICdyZWQnXG4gICAgICAgIHRoaXMudG9vbHRpcCA9IG9wdHMudG9vbHRpcFxuICAgICAgICB0aGlzLnRleHRzID0gb3B0cy50ZXh0c1xuXG4gICAgICAgIHRoaXMubGVmdFRleHQgPSBvcHRzLmxlZnRUZXh0IHx8ICdDYXRlZ29yeSAwJ1xuICAgICAgICB0aGlzLnRvcFRleHQgPSBvcHRzLnRvcFRleHQgfHwgJ0NhdGVnb3J5IDEnXG4gICAgICAgIHRoaXMucmlnaHRUZXh0ID0gb3B0cy5yaWdodFRleHQgfHwgJ0NhdGVnb3J5IDInXG5cbiAgICAgICAgdGhpcy5jZW50ZXJDb2VmZmljaWVudCA9IG9wdHMuY2VudGVyQ29lZmZpY2llbnQgfHwgdGhpcy5jbGFzc2lmaWVyLmNlbnRlckNvZWZmaWNpZW50XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHt7fSB9IG9wdHNcbiAgICAgKi9cbiAgICB1cGRhdGUob3B0cykge1xuICAgICAgICAvL2NsZWFyXG4gICAgICAgIHRoaXMuZGl2LnNlbGVjdEFsbCgnKicpLnJlbW92ZSgpXG5cbiAgICAgICAgLy90aXRsZVxuICAgICAgICB0aGlzLm1ha2VUaXRsZSgpXG5cbiAgICAgICAgY29uc3Qgc3FydDNvdmVyMiA9IDAuODY2MDI1XG4gICAgICAgIGNvbnN0IHcgPSB0aGlzLndpZHRoLFxuICAgICAgICAgICAgaCA9IHcgKiBzcXJ0M292ZXIyXG4gICAgICAgIGNvbnN0IGNsYXNzaWZpZXIgPSB0aGlzLmNsYXNzaWZpZXJcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uQ29sb3IgPSB0aGlzLnNlbGVjdGlvbkNvbG9yXG4gICAgICAgIGNvbnN0IHNlbGVjdGlvblN0cm9rZVdpZHRoID0gMFxuICAgICAgICBjb25zdCB0dCA9IHRoaXMudG9vbHRpcFxuICAgICAgICBjb25zdCB0ZXh0cyA9IHRoaXMudGV4dHMgfHwge31cblxuICAgICAgICBjb25zdCBwYWRkaW5nID0gMlxuICAgICAgICBjb25zdCBmb250U2l6ZSA9IDEyXG5cbiAgICAgICAgLy9tYWtlIHN2ZyBlbGVtZW50XG4gICAgICAgIGNvbnN0IHN2ZyA9IHRoaXMuZGl2XG4gICAgICAgICAgICAuYXBwZW5kKCdzdmcnKVxuICAgICAgICAgICAgLmF0dHIoJ3dpZHRoJywgdyArIHNlbGVjdGlvblN0cm9rZVdpZHRoKVxuICAgICAgICAgICAgLmF0dHIoJ2hlaWdodCcsIGggKyA0ICogcGFkZGluZyArIDIgKiBmb250U2l6ZSlcblxuICAgICAgICAvL3RvcCBsYWJlbFxuICAgICAgICBzdmcuYXBwZW5kKCd0ZXh0JylcbiAgICAgICAgICAgIC5hdHRyKCd4JywgdyAvIDIpXG4gICAgICAgICAgICAuYXR0cigneScsIHBhZGRpbmcgKyBmb250U2l6ZSlcbiAgICAgICAgICAgIC50ZXh0KHRoaXMudG9wVGV4dClcbiAgICAgICAgICAgIC5hdHRyKCdmb250LXNpemUnLCBmb250U2l6ZSlcbiAgICAgICAgICAgIC5hdHRyKCd0ZXh0LWFuY2hvcicsICdtaWRkbGUnKVxuICAgICAgICAvL2xlZnQgbGFiZWxcbiAgICAgICAgc3ZnLmFwcGVuZCgndGV4dCcpXG4gICAgICAgICAgICAuYXR0cigneCcsIDApXG4gICAgICAgICAgICAuYXR0cigneScsIDMgKiBwYWRkaW5nICsgMiAqIGZvbnRTaXplICsgaClcbiAgICAgICAgICAgIC50ZXh0KHRoaXMubGVmdFRleHQpXG4gICAgICAgICAgICAuYXR0cignZm9udC1zaXplJywgZm9udFNpemUpXG4gICAgICAgICAgICAuYXR0cigndGV4dC1hbmNob3InLCAnc3RhcnQnKVxuICAgICAgICAvL3JpZ2h0IGxhYmVsXG4gICAgICAgIHN2Zy5hcHBlbmQoJ3RleHQnKVxuICAgICAgICAgICAgLmF0dHIoJ3gnLCB3KVxuICAgICAgICAgICAgLmF0dHIoJ3knLCAzICogcGFkZGluZyArIDIgKiBmb250U2l6ZSArIGgpXG4gICAgICAgICAgICAudGV4dCh0aGlzLnJpZ2h0VGV4dClcbiAgICAgICAgICAgIC5hdHRyKCdmb250LXNpemUnLCBmb250U2l6ZSlcbiAgICAgICAgICAgIC5hdHRyKCd0ZXh0LWFuY2hvcicsICdlbmQnKVxuXG4gICAgICAgIC8vdHJpYW5nbGUgZ3JvdXBcbiAgICAgICAgY29uc3QgZyA9IHN2Z1xuICAgICAgICAgICAgLmFwcGVuZCgnZycpXG4gICAgICAgICAgICAuYXR0cihcbiAgICAgICAgICAgICAgICAndHJhbnNmb3JtJyxcbiAgICAgICAgICAgICAgICAndHJhbnNsYXRlKCcgK1xuICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25TdHJva2VXaWR0aCAvIDIgK1xuICAgICAgICAgICAgICAgICAgICAnICcgK1xuICAgICAgICAgICAgICAgICAgICAoc2VsZWN0aW9uU3Ryb2tlV2lkdGggLyAyICsgKDIgKiBwYWRkaW5nICsgZm9udFNpemUpKSArXG4gICAgICAgICAgICAgICAgICAgICcpJ1xuICAgICAgICAgICAgKVxuXG4gICAgICAgIC8vY29tbW9uIGZ1bmN0aW9uIGZvciB0cmlhbmdsZSBwYXRjaGVzXG4gICAgICAgIGNvbnN0IHNldEF0dHJpYnV0ZXMgPSAoZWx0LCBjb2xvciwgdGV4dCkgPT4ge1xuICAgICAgICAgICAgLy9lbHQucmFpc2UoKTtcbiAgICAgICAgICAgIGVsdC5hdHRyKCdmaWxsJywgY29sb3IpXG4gICAgICAgICAgICAgICAgLy8uYXR0cihcInN0cm9rZVwiLCBjb2xvck92ZXIpXG4gICAgICAgICAgICAgICAgLy8uYXR0cihcInN0cm9rZS13aWR0aFwiLCAwKVxuICAgICAgICAgICAgICAgIC8vLmF0dHIoXCJzdHJva2UtbGluZWpvaW5cIiwgXCJyb3VuZFwiKVxuICAgICAgICAgICAgICAgIC5vbignbW91c2VvdmVyJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgLyp0aGlzLnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQodGhpcyk7IHNlbGVjdCh0aGlzKS5hdHRyKFwic3Ryb2tlLXdpZHRoXCIsIHNlbGVjdGlvblN0cm9rZVdpZHRoKTsqL1xuICAgICAgICAgICAgICAgICAgICBzZWxlY3QodGhpcykuYXR0cignZmlsbCcsIHNlbGVjdGlvbkNvbG9yKVxuICAgICAgICAgICAgICAgICAgICBpZiAoIXR0IHx8ICF0ZXh0KSByZXR1cm5cbiAgICAgICAgICAgICAgICAgICAgdHQuaHRtbCh0ZXh0KVxuICAgICAgICAgICAgICAgICAgICB0dC5zZXRQb3NpdGlvbihlKVxuICAgICAgICAgICAgICAgICAgICB0dC5zaG93KClcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5vbignbW91c2VvdXQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIC8qc2VsZWN0KHRoaXMpLmF0dHIoXCJzdHJva2Utd2lkdGhcIiwgMCk7Ki9cbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0KHRoaXMpLmF0dHIoJ2ZpbGwnLCBjb2xvcilcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR0KSB0dC5oaWRlKClcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgaWYgKHR0ICYmIHRleHQpXG4gICAgICAgICAgICAgICAgZWx0Lm9uKCdtb3VzZW1vdmUnLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgICAgICB0dC5zZXRQb3NpdGlvbihlKVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgICAgICAvL2NvbnN0IFtjMCwgYzEsIGMyXSA9IGNsYXNzaWZpZXIuY2VudGVyXG5cbiAgICAgICAgLy90cmFwZXppdW0gczBcbiAgICAgICAgY29uc3QgdDAgPSBnXG4gICAgICAgICAgICAuYXBwZW5kKCdwb2x5Z29uJylcbiAgICAgICAgICAgIC5hdHRyKFxuICAgICAgICAgICAgICAgICdwb2ludHMnLFxuICAgICAgICAgICAgICAgICcwLCcgK1xuICAgICAgICAgICAgICAgICAgICBoICtcbiAgICAgICAgICAgICAgICAgICAgJyAnICtcbiAgICAgICAgICAgICAgICAgICAgdyAvIDMgK1xuICAgICAgICAgICAgICAgICAgICAnLCcgK1xuICAgICAgICAgICAgICAgICAgICBoICtcbiAgICAgICAgICAgICAgICAgICAgJyAnICtcbiAgICAgICAgICAgICAgICAgICAgdyAvIDIgK1xuICAgICAgICAgICAgICAgICAgICAnLCcgK1xuICAgICAgICAgICAgICAgICAgICAoaCAqIDIpIC8gMyArXG4gICAgICAgICAgICAgICAgICAgICcgJyArXG4gICAgICAgICAgICAgICAgICAgIHcgLyA2ICtcbiAgICAgICAgICAgICAgICAgICAgJywnICtcbiAgICAgICAgICAgICAgICAgICAgKGggKiAyKSAvIDNcbiAgICAgICAgICAgIClcbiAgICAgICAgc2V0QXR0cmlidXRlcyh0MCwgY2xhc3NpZmllci5jb2xvcnNbMF0sIHRleHRzWycwJ10pXG4gICAgICAgIC8vdHJhcGV6aXVtIHMxXG4gICAgICAgIGNvbnN0IHQxID0gZ1xuICAgICAgICAgICAgLmFwcGVuZCgncG9seWdvbicpXG4gICAgICAgICAgICAuYXR0cihcbiAgICAgICAgICAgICAgICAncG9pbnRzJyxcbiAgICAgICAgICAgICAgICB3IC8gMiArXG4gICAgICAgICAgICAgICAgICAgICcsMCAnICtcbiAgICAgICAgICAgICAgICAgICAgKHcgKiAyKSAvIDMgK1xuICAgICAgICAgICAgICAgICAgICAnLCcgK1xuICAgICAgICAgICAgICAgICAgICBoIC8gMyArXG4gICAgICAgICAgICAgICAgICAgICcgJyArXG4gICAgICAgICAgICAgICAgICAgIHcgLyAyICtcbiAgICAgICAgICAgICAgICAgICAgJywnICtcbiAgICAgICAgICAgICAgICAgICAgKGggKiAyKSAvIDMgK1xuICAgICAgICAgICAgICAgICAgICAnICcgK1xuICAgICAgICAgICAgICAgICAgICB3IC8gMyArXG4gICAgICAgICAgICAgICAgICAgICcsJyArXG4gICAgICAgICAgICAgICAgICAgIGggLyAzXG4gICAgICAgICAgICApXG4gICAgICAgIHNldEF0dHJpYnV0ZXModDEsIGNsYXNzaWZpZXIuY29sb3JzWzFdLCB0ZXh0c1snMSddKVxuICAgICAgICAvL3RyYXBleml1bSBzMlxuICAgICAgICBjb25zdCB0MiA9IGdcbiAgICAgICAgICAgIC5hcHBlbmQoJ3BvbHlnb24nKVxuICAgICAgICAgICAgLmF0dHIoXG4gICAgICAgICAgICAgICAgJ3BvaW50cycsXG4gICAgICAgICAgICAgICAgdyArXG4gICAgICAgICAgICAgICAgICAgICcsJyArXG4gICAgICAgICAgICAgICAgICAgIGggK1xuICAgICAgICAgICAgICAgICAgICAnICcgK1xuICAgICAgICAgICAgICAgICAgICAodyAqIDUpIC8gNiArXG4gICAgICAgICAgICAgICAgICAgICcsJyArXG4gICAgICAgICAgICAgICAgICAgICgyICogaCkgLyAzICtcbiAgICAgICAgICAgICAgICAgICAgJyAnICtcbiAgICAgICAgICAgICAgICAgICAgdyAvIDIgK1xuICAgICAgICAgICAgICAgICAgICAnLCcgK1xuICAgICAgICAgICAgICAgICAgICAoaCAqIDIpIC8gMyArXG4gICAgICAgICAgICAgICAgICAgICcgJyArXG4gICAgICAgICAgICAgICAgICAgICh3ICogMikgLyAzICtcbiAgICAgICAgICAgICAgICAgICAgJywnICtcbiAgICAgICAgICAgICAgICAgICAgaFxuICAgICAgICAgICAgKVxuICAgICAgICBzZXRBdHRyaWJ1dGVzKHQyLCBjbGFzc2lmaWVyLmNvbG9yc1syXSwgdGV4dHNbJzInXSlcbiAgICAgICAgLy90cmlhbmdsZSBzMFxuICAgICAgICBjb25zdCB0MF8gPSBnXG4gICAgICAgICAgICAuYXBwZW5kKCdwb2x5Z29uJylcbiAgICAgICAgICAgIC5hdHRyKFxuICAgICAgICAgICAgICAgICdwb2ludHMnLFxuICAgICAgICAgICAgICAgIHcgLyAyICtcbiAgICAgICAgICAgICAgICAgICAgJywnICtcbiAgICAgICAgICAgICAgICAgICAgKGggKiAyKSAvIDMgK1xuICAgICAgICAgICAgICAgICAgICAnICcgK1xuICAgICAgICAgICAgICAgICAgICAodyAqIDUpIC8gNiArXG4gICAgICAgICAgICAgICAgICAgICcsJyArXG4gICAgICAgICAgICAgICAgICAgIChoICogMikgLyAzICtcbiAgICAgICAgICAgICAgICAgICAgJyAnICtcbiAgICAgICAgICAgICAgICAgICAgKHcgKiAyKSAvIDMgK1xuICAgICAgICAgICAgICAgICAgICAnLCcgK1xuICAgICAgICAgICAgICAgICAgICBoIC8gM1xuICAgICAgICAgICAgKVxuICAgICAgICBzZXRBdHRyaWJ1dGVzKHQwXywgY2xhc3NpZmllci5taXhDb2xvcnNbMF0sIHRleHRzWydtMTInXSlcbiAgICAgICAgLy90cmlhbmdsZSBzMVxuICAgICAgICBjb25zdCB0MV8gPSBnXG4gICAgICAgICAgICAuYXBwZW5kKCdwb2x5Z29uJylcbiAgICAgICAgICAgIC5hdHRyKCdwb2ludHMnLCB3IC8gMiArICcsJyArIChoICogMikgLyAzICsgJyAnICsgdyAvIDMgKyAnLCcgKyBoICsgJyAnICsgKHcgKiAyKSAvIDMgKyAnLCcgKyBoKVxuICAgICAgICBzZXRBdHRyaWJ1dGVzKHQxXywgY2xhc3NpZmllci5taXhDb2xvcnNbMV0sIHRleHRzWydtMDInXSlcbiAgICAgICAgLy90cmlhbmdsZSBzMlxuICAgICAgICBjb25zdCB0Ml8gPSBnXG4gICAgICAgICAgICAuYXBwZW5kKCdwb2x5Z29uJylcbiAgICAgICAgICAgIC5hdHRyKFxuICAgICAgICAgICAgICAgICdwb2ludHMnLFxuICAgICAgICAgICAgICAgIHcgLyAyICsgJywnICsgKGggKiAyKSAvIDMgKyAnICcgKyB3IC8gNiArICcsJyArIChoICogMikgLyAzICsgJyAnICsgdyAvIDMgKyAnLCcgKyBoIC8gM1xuICAgICAgICAgICAgKVxuICAgICAgICBzZXRBdHRyaWJ1dGVzKHQyXywgY2xhc3NpZmllci5taXhDb2xvcnNbMl0sIHRleHRzWydtMDEnXSlcblxuICAgICAgICAvL2NlbnRlclxuICAgICAgICBpZiAodGhpcy5jZW50ZXJDb2VmZmljaWVudCkge1xuICAgICAgICAgICAgLy9UT0RPIG1ha2UgaXQgYW4gaGV4YWdvbiAhXG4gICAgICAgICAgICBjb25zdCBjZW50ZXIgPSBnXG4gICAgICAgICAgICAgICAgLmFwcGVuZCgnY2lyY2xlJylcbiAgICAgICAgICAgICAgICAuYXR0cignY3gnLCB3IC8gMilcbiAgICAgICAgICAgICAgICAuYXR0cignY3knLCAoaCAqIDIpIC8gMylcbiAgICAgICAgICAgICAgICAuYXR0cigncicsICh0aGlzLmNlbnRlckNvZWZmaWNpZW50ICogaCkgLyAzKVxuICAgICAgICAgICAgc2V0QXR0cmlidXRlcyhjZW50ZXIsIGNsYXNzaWZpZXIuY2VudGVyQ29sb3IsIHRleHRzWydjZW50ZXInXSlcbiAgICAgICAgfVxuXG4gICAgICAgIC8qXG4gICAgICAgIGxldCBtaWRkbGUsIGxlZnQsIHRvcCwgcmlnaHQsIGxlZnRfLCBib3R0b21fLCByaWdodF9cbiAgICAgICAgaWYgKCF0aGlzLnJlYWwpIHtcblxuICAgICAgICAgICAgLy8wIGxlZnQgdHJpYW5nbGVcbiAgICAgICAgICAgIGxlZnQgPSBnLmFwcGVuZCgncG9seWdvbicpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3BvaW50cycsIFwiMCxcIiArIGggKyBcIiBcIiArICh3IC8gMykgKyBcIixcIiArIGggKyBcIiBcIiArICh3IC8gNikgKyBcIixcIiArICgyICogaCAvIDMpKVxuICAgICAgICAgICAgLy8xIHRvcCB0cmlhbmdsZVxuICAgICAgICAgICAgdG9wID0gZy5hcHBlbmQoJ3BvbHlnb24nKVxuICAgICAgICAgICAgICAgIC5hdHRyKCdwb2ludHMnLCAodyAvIDMpICsgXCIsXCIgKyAoaCAvIDMpICsgXCIgXCIgKyAodyAqIDIgLyAzKSArIFwiLFwiICsgKGggLyAzKSArIFwiIFwiICsgKHcgLyAyKSArIFwiLDBcIilcbiAgICAgICAgICAgIC8vMiByaWdodCB0cmlhbmdsZVxuICAgICAgICAgICAgcmlnaHQgPSBnLmFwcGVuZCgncG9seWdvbicpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3BvaW50cycsICh3ICogMiAvIDMpICsgXCIsXCIgKyBoICsgXCIgXCIgKyB3ICsgXCIsXCIgKyBoICsgXCIgXCIgKyAodyAqIDUgLyA2KSArIFwiLFwiICsgKDIgKiBoIC8gMykpXG4gICAgICAgICAgICAvL21pZGRsZSB0cmlhbmdsZVxuICAgICAgICAgICAgbWlkZGxlID0gZy5hcHBlbmQoJ3BvbHlnb24nKVxuICAgICAgICAgICAgICAgIC5hdHRyKCdwb2ludHMnLCAodyAvIDIpICsgXCIsXCIgKyAoaCAvIDMpICsgXCIgXCIgKyAodyAvIDQpICsgXCIsXCIgKyAoaCAqIDUgLyA2KSArIFwiIFwiICsgKDMgKiB3IC8gNCkgKyBcIixcIiArIChoICogNSAvIDYpKVxuICAgICAgICAgICAgLy8wMSBsZWZ0IHRyYXBleml1bVxuICAgICAgICAgICAgbGVmdF8gPSBnLmFwcGVuZCgncG9seWdvbicpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3BvaW50cycsICh3IC8gNikgKyBcIixcIiArIChoICogMiAvIDMpICsgXCIgXCIgKyAodyAvIDQpICsgXCIsXCIgKyAoaCAqIDUgLyA2KSArIFwiIFwiICsgKHcgLyAyKSArIFwiLFwiICsgKGggLyAzKSArIFwiIFwiICsgKHcgLyAzKSArIFwiLFwiICsgKGggLyAzKSlcbiAgICAgICAgICAgIC8vMDIgYm90dG9tIHRyYXBleml1bVxuICAgICAgICAgICAgYm90dG9tXyA9IGcuYXBwZW5kKCdwb2x5Z29uJylcbiAgICAgICAgICAgICAgICAuYXR0cigncG9pbnRzJywgKHcgLyAzKSArIFwiLFwiICsgKGgpICsgXCIgXCIgKyAoMiAqIHcgLyAzKSArIFwiLFwiICsgKGgpICsgXCIgXCIgKyAodyAqIDMgLyA0KSArIFwiLFwiICsgKGggKiA1IC8gNikgKyBcIiBcIiArICh3IC8gNCkgKyBcIixcIiArIChoICogNSAvIDYpKVxuICAgICAgICAgICAgLy8xMiByaWdodCB0cmFwZXppdW1cbiAgICAgICAgICAgIHJpZ2h0XyA9IGcuYXBwZW5kKCdwb2x5Z29uJylcbiAgICAgICAgICAgICAgICAuYXR0cigncG9pbnRzJywgKHcgLyAyKSArIFwiLFwiICsgKGggLyAzKSArIFwiIFwiICsgKHcgKiAzIC8gNCkgKyBcIixcIiArIChoICogNSAvIDYpICsgXCIgXCIgKyAodyAqIDUgLyA2KSArIFwiLFwiICsgKGggKiAyIC8gMykgKyBcIiBcIiArICh3ICogMiAvIDMpICsgXCIsXCIgKyAoaCAvIDMpKVxuXG4gICAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgICAgIC8vbWlkZGxlIHRyaWFuZ2xlXG4gICAgICAgICAgICBtaWRkbGUgPSBnLmFwcGVuZCgncG9seWdvbicpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3BvaW50cycsICh3IC8gMikgKyBcIiwwIDAsXCIgKyBoICsgXCIgXCIgKyB3ICsgXCIsXCIgKyBoKVxuXG4gICAgICAgICAgICAvL2RyYXcgdHJhcGV6aXVtXG4gICAgICAgICAgICAvL2RyYXcgbGFyZ2UgdHJhcGV6aXVtIGZpcnN0XG4gICAgICAgICAgICBmb3IgKGxldCBpXyA9IDI7IGlfID49IDA7IGlfLS0pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpID0gdGhpcy5jbGFzc2lmaWVyLmxvd0luZGV4W2lfXVxuICAgICAgICAgICAgICAgIGNvbnN0IHIgPSB0aGlzLmNsYXNzaWZpZXIubG93VGhyZXNob2xkW2ldXG4gICAgICAgICAgICAgICAgaWYgKGkgPT0gMilcbiAgICAgICAgICAgICAgICAgICAgLy8wMSBsZWZ0IHRyYXBleml1bVxuICAgICAgICAgICAgICAgICAgICBsZWZ0XyA9IGcuYXBwZW5kKCdwb2x5Z29uJylcbiAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCdwb2ludHMnLCB3IC8gMiArIFwiLDAgMCxcIiArIGggKyBcIiBcIiArIHcgKiByICsgXCIsXCIgKyBoICsgXCIgXCIgKyB3ICogKDEgKyByKSAvIDIgKyBcIixcIiArIHIgKiBoKVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGkgPT0gMSlcbiAgICAgICAgICAgICAgICAgICAgLy8wMiBib3R0b20gdHJhcGV6aXVtXG4gICAgICAgICAgICAgICAgICAgIGJvdHRvbV8gPSBnLmFwcGVuZCgncG9seWdvbicpXG4gICAgICAgICAgICAgICAgICAgICAgICAuYXR0cigncG9pbnRzJywgXCIwLFwiICsgaCArIFwiIFwiICsgdyArIFwiLFwiICsgaCArIFwiIFwiICsgdyAqICgxIC0gciAvIDIpICsgXCIsXCIgKyBoICogKDEgLSByKSArIFwiIFwiICsgciAqIHcgLyAyICsgXCIsXCIgKyBoICogKDEgLSByKSlcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIC8vMTIgcmlnaHQgdHJhcGV6aXVtXG4gICAgICAgICAgICAgICAgICAgIHJpZ2h0XyA9IGcuYXBwZW5kKCdwb2x5Z29uJylcbiAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCdwb2ludHMnLCB3ICsgXCIsXCIgKyBoICsgXCIgXCIgKyB3IC8gMiArIFwiLDAgXCIgKyB3ICogKDEgLSByKSAvIDIgKyBcIixcIiArIGggKiByICsgXCIgXCIgKyB3ICogKDEgLSByKSArIFwiLFwiICsgaClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy9kcmF3IHRyaWFuZ2xlc1xuICAgICAgICAgICAgLy9kcmF3IGxhcmdlIHRyaWFuZ2xlcyBmaXJzdFxuICAgICAgICAgICAgZm9yIChsZXQgaV8gPSAyOyBpXyA+PSAwOyBpXy0tKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaSA9IHRoaXMuY2xhc3NpZmllci5oaWdoSW5kZXhbaV9dXG4gICAgICAgICAgICAgICAgY29uc3QgciA9IHRoaXMuY2xhc3NpZmllci5oaWdoVGhyZXNob2xkW2ldXG5cbiAgICAgICAgICAgICAgICBpZiAoaSA9PSAyKVxuICAgICAgICAgICAgICAgICAgICAvLzIgcmlnaHQgdHJpYW5nbGVcbiAgICAgICAgICAgICAgICAgICAgcmlnaHQgPSBnLmFwcGVuZCgncG9seWdvbicpXG4gICAgICAgICAgICAgICAgICAgICAgICAuYXR0cigncG9pbnRzJywgdyArIFwiLFwiICsgaCArIFwiIFwiICsgdyAqIHIgKyBcIixcIiArIGggKyBcIiBcIiArIHcgKiAoMSArIHIpIC8gMiArIFwiLFwiICsgaCAqIHIpXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoaSA9PSAxKVxuICAgICAgICAgICAgICAgICAgICAvLzEgdG9wIHRyaWFuZ2xlXG4gICAgICAgICAgICAgICAgICAgIHRvcCA9IGcuYXBwZW5kKCdwb2x5Z29uJylcbiAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCdwb2ludHMnLCAodyAvIDIpICsgXCIsMCBcIiArIHcgKiByIC8gMiArIFwiLFwiICsgaCAqICgxIC0gcikgKyBcIiBcIiArIHcgKiAoMSAtIHIgLyAyKSArIFwiLFwiICsgaCAqICgxIC0gcikpXG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAvLzAgbGVmdCB0cmlhbmdsZVxuICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gZy5hcHBlbmQoJ3BvbHlnb24nKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ3BvaW50cycsIFwiMCxcIiArIGggKyBcIiBcIiArIHcgKiAoMSAtIHIpICsgXCIsXCIgKyBoICsgXCIgXCIgKyB3ICogKDEgLSByKSAvIDIgKyBcIixcIiArIGggKiByKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0qL1xuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgU3R5bGUgfSBmcm9tICcuLi9jb3JlL1N0eWxlLmpzJ1xuXG4vKiogQHR5cGVkZWYge1wiZmxhZ1wifFwicGllY2hhcnRcInxcInJpbmdcInxcInNlZ21lbnRcInxcInJhZGFyXCJ8XCJhZ2VweXJhbWlkXCJ8XCJoYWxmdG9uZVwifSBDb21wb3NpdGlvblR5cGUgKi9cblxuLyoqXG4gKiBBIHN0eWxlIHNob3dpbmcgdGhlIGNvbXBvc2l0aW9uIG9mIGEgdG90YWwgaW4gZGlmZmVyZW50IGNhdGVnb3JpZXMsIHdpdGggZGlmZmVyZW50IGNvbG9yIGh1ZXMuXG4gKiBJdCBjb25zaXN0cyBvZiBhIHN5bWJvbCB3aXRoIGRpZmZlcmVudCBwYXJ0cywgd2hvc2Ugc2l6ZSByZWZsZWN0IHRoZSBwcm9wb3J0aW9uIG9mIHRoZSBjb3JyZXNwb25kaW5nIGNhdGVnb3J5LlxuICogRm9yIGEgbGlzdCBvZiBzdXBwb3J0ZWQgc3ltYm9scywgQHNlZSBDb21wb3NpdGlvblR5cGVcbiAqIFRoZSBzeW1ib2wgY2FuIGJlIHNjYWxlZCBkZXBlbmRpbmcgb24gdGhlIGNlbGwgaW1wb3J0YW5jZS5cbiAqXG4gKiBAbW9kdWxlIHN0eWxlXG4gKiBAYXV0aG9yIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBDb21wb3NpdGlvblN0eWxlIGV4dGVuZHMgU3R5bGUge1xuICAgIC8qKiBAcGFyYW0ge29iamVjdH0gb3B0cyAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cylcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGRpY3Rpb25hcnkgKHN0cmluZyAtPiBjb2xvcikgd2hpY2ggZ2l2ZSB0aGUgY29sb3Igb2YgZWFjaCBjYXRlZ29yeS5cbiAgICAgICAgICogQHR5cGUge29iamVjdH0gKi9cbiAgICAgICAgdGhpcy5jb2xvciA9IG9wdHMuY29sb3JcblxuICAgICAgICAvKipcbiAgICAgICAgICogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIHR5cGUgb2YgZGVjb21wb3NpdGlvbiBzeW1ib2wgb2YgYSBjZWxsLCBAc2VlIENvbXBvc2l0aW9uVHlwZVxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0LmpzXCIpLkNlbGwsbnVtYmVyLCBudW1iZXIsb2JqZWN0KTpDb21wb3NpdGlvblR5cGV9ICovXG4gICAgICAgIHRoaXMudHlwZSA9IG9wdHMudHlwZSB8fCAoKCkgPT4gJ2ZsYWcnKSAvLyhjLHIseix2cykgPT4ge31cblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIHNpemUgb2YgYSBjZWxsIGluIGdlb2dyYXBoaWNhbCB1bml0LlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLCBudW1iZXIsIG51bWJlciwgb2JqZWN0KTpudW1iZXJ9ICovXG4gICAgICAgIHRoaXMuc2l6ZSA9IG9wdHMuc2l6ZSB8fCAoKGMsIHIpID0+IHIpIC8vKGMscix6LHZzKSA9PiB7fVxuXG4gICAgICAgIC8qKiBGb3Igc3R5bGUgdHlwZXMgd2l0aCBzdHJpcGVzIChmbGFnLCBzZWdtZW50KSwgdGhlIG9yaWVudGF0aW9uIG9mIHRoZSBzdHJpcGVzICgwIGZvciBob3Jpem9udGFsLCBvdGhlciBmb3IgdmVydGljYWwpLlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0LmpzXCIpLkNlbGwsbnVtYmVyLG51bWJlcixvYmplY3QpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy5zdHJpcGVzT3JpZW50YXRpb24gPSBvcHRzLnN0cmlwZXNPcmllbnRhdGlvbiB8fCAoKCkgPT4gMCkgLy8oYyxyLHosdnMpID0+IC4uLlxuXG4gICAgICAgIC8qKiBUaGUgZnVuY3Rpb24gc3BlY2lmeWluZyBhbiBvZmZzZXQgYW5nbGUgZm9yIGEgcmFkYXIsIGhhbGZ0b25lIG9yIHBpZSBjaGFydCBzdHlsZS5cbiAgICAgICAgICogVGhlIGFuZ2xlIGlzIHNwZWNpZmllZCBpbiBkZWdyZWUuIFRoZSByb3RhdGlvbiBpcyBhbnRpLWNsb2Nrd2lzZS5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydChcIi4uL2NvcmUvRGF0YXNldC5qc1wiKS5DZWxsLG51bWJlcixudW1iZXIsb2JqZWN0KTpudW1iZXJ9ICovXG4gICAgICAgIHRoaXMub2Zmc2V0QW5nbGUgPSBvcHRzLm9mZnNldEFuZ2xlIHx8ICgoKSA9PiAwKSAvLyhjLHIseix2cykgPT4gLi4uXG5cbiAgICAgICAgLyoqIFRoZSBmdW5jdGlvbiBzcGVjaWZ5aW5nIHRoZSBoZWlnaHQgb2YgdGhlIGFnZSBweXJhbWlkLCBpbiBnZW8gdW5pdC5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydChcIi4uL2NvcmUvRGF0YXNldC5qc1wiKS5DZWxsLG51bWJlcixudW1iZXIsb2JqZWN0KTpudW1iZXJ9ICovXG4gICAgICAgIHRoaXMuYWdlUHlyYW1pZEhlaWdodCA9IG9wdHMuYWdlUHlyYW1pZEhlaWdodCB8fCAoKGMsIHIpID0+IHIpIC8vKGMscix6LHZzKSA9PiAuLi5cblxuICAgICAgICAvKiogRm9yIHBpZSBjaGFydCwgdGhpcyBpcyBwYXJhbWV0ZXIgZm9yIGludGVybmFsIHJhZGl1cywgc28gdGhhdCB0aGUgcGllIGNoYXJ0IGxvb2tzIGxpa2UgYSBkb251dC5cbiAgICAgICAgICogMCBmb3Igbm9ybWFsIHBpZSBjaGFydHMsIDAuNSB0byBlbXB0eSBoYWxmIG9mIHRoZSByYWRpdXMuXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgIHRoaXMucGllQ2hhcnRJbnRlcm5hbFJhZGl1c0ZhY3RvciA9IG9wdHMucGllQ2hhcnRJbnRlcm5hbFJhZGl1c0ZhY3RvciB8fCAwXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRHJhdyBjZWxscyBhcyBzcXVhcmVzIGRlcGVuZGluZyBvbiB0aGVpciB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7QXJyYXkuPGltcG9ydChcIi4uL2NvcmUvRGF0YXNldC5qc1wiKS5DZWxsPn0gY2VsbHNcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvcmUvR2VvQ2FudmFzLmpzXCIpLkdlb0NhbnZhc30gZ2VvQ2FudmFzXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJlc29sdXRpb25cbiAgICAgKi9cbiAgICBkcmF3KGNlbGxzLCBnZW9DYW52YXMsIHJlc29sdXRpb24pIHtcbiAgICAgICAgLy9maWx0ZXJcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyKSBjZWxscyA9IGNlbGxzLmZpbHRlcih0aGlzLmZpbHRlcilcblxuICAgICAgICAvL1xuICAgICAgICBjb25zdCB6ID0gZ2VvQ2FudmFzLnZpZXcuelxuICAgICAgICBjb25zdCBjdHggPSBnZW9DYW52YXMub2Zmc2NyZWVuQ3R4XG5cbiAgICAgICAgLy9nZXQgdmlldyBzY2FsZVxuICAgICAgICBjb25zdCB2aWV3U2NhbGUgPSB0aGlzLnZpZXdTY2FsZSA/IHRoaXMudmlld1NjYWxlKGNlbGxzLCByZXNvbHV0aW9uLCB6KSA6IHVuZGVmaW5lZFxuXG4gICAgICAgIC8vbmIgY2F0ZWdvcmllcyAtIHVzZWQgZm9yIHJhZGFyIGFuZCBhZ2VweXJhbWlkXG4gICAgICAgIGNvbnN0IG5iQ2F0ID0gT2JqZWN0LmVudHJpZXModGhpcy5jb2xvcikubGVuZ3RoXG5cbiAgICAgICAgLy9kcmF3IGNhbGxzXG4gICAgICAgIGZvciAobGV0IGNlbGwgb2YgY2VsbHMpIHtcbiAgICAgICAgICAgIC8vc2l6ZVxuICAgICAgICAgICAgY29uc3Qgc0cgPSB0aGlzLnNpemUgPyB0aGlzLnNpemUoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IHJlc29sdXRpb25cbiAgICAgICAgICAgIGlmICghc0cpIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIC8vZ2V0IG9mZnNldFxuICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5vZmZzZXQoY2VsbCwgcmVzb2x1dGlvbiwgeilcblxuICAgICAgICAgICAgLy9nZXQgc3ltYm9sIHR5cGVcbiAgICAgICAgICAgIGNvbnN0IHR5cGVfID0gdGhpcy50eXBlID8gdGhpcy50eXBlKGNlbGwsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgOiAnZmxhZydcblxuICAgICAgICAgICAgLy9jb21wdXRlIGNlbnRlciBwb3NpdGlvblxuICAgICAgICAgICAgY29uc3QgeGMgPSBjZWxsLnggKyBvZmZzZXQuZHggKyAodHlwZV8gPT09ICdhZ2VweXJhbWlkJyA/IDAgOiByZXNvbHV0aW9uICogMC41KVxuICAgICAgICAgICAgY29uc3QgeWMgPSBjZWxsLnkgKyBvZmZzZXQuZHkgKyAodHlwZV8gPT09ICdhZ2VweXJhbWlkJyA/IDAgOiByZXNvbHV0aW9uICogMC41KVxuXG4gICAgICAgICAgICAvL2NvbXB1dGUgb2Zmc2V0IGFuZ2xlLCB3aGVuIHJlbGV2YW50XG4gICAgICAgICAgICBjb25zdCBvZmZBbmcgPSB0aGlzLm9mZnNldEFuZ2xlXG4gICAgICAgICAgICAgICAgPyAodGhpcy5vZmZzZXRBbmdsZShjZWxsLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpICogTWF0aC5QSSkgLyAxODBcbiAgICAgICAgICAgICAgICA6IDBcblxuICAgICAgICAgICAgaWYgKHR5cGVfID09PSAnYWdlcHlyYW1pZCcgfHwgdHlwZV8gPT09ICdyYWRhcicgfHwgdHlwZV8gPT09ICdoYWxmdG9uZScpIHtcbiAgICAgICAgICAgICAgICAvL2dldCBjZWxsIGNhdGVnb3J5IG1heCB2YWx1ZVxuICAgICAgICAgICAgICAgIGxldCBtYXhWYWwgPSAtSW5maW5pdHlcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBrZXkgb2YgT2JqZWN0LmtleXModGhpcy5jb2xvcikpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdiA9ICtjZWxsW2tleV1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHYgPiBtYXhWYWwpIG1heFZhbCA9IHZcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvL2N1bXVsXG4gICAgICAgICAgICAgICAgbGV0IGN1bXVsID0gMFxuICAgICAgICAgICAgICAgIGlmICh0eXBlXyA9PT0gJ2FnZXB5cmFtaWQnICYmIHRoaXMuYWdlUHlyYW1pZEhlaWdodClcbiAgICAgICAgICAgICAgICAgICAgY3VtdWwgPSAocmVzb2x1dGlvbiAtIHRoaXMuYWdlUHlyYW1pZEhlaWdodChjZWxsLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpKSAvIDJcbiAgICAgICAgICAgICAgICBpZiAodHlwZV8gPT09ICdyYWRhcicgfHwgdHlwZV8gPT09ICdoYWxmdG9uZScpIGN1bXVsID0gTWF0aC5QSSAvIDIgKyBvZmZBbmdcblxuICAgICAgICAgICAgICAgIC8vY29tcHV0ZSB0aGUgaW5jcmVtZW50LCB3aGljaCBpcyB0aGUgdmFsdWUgdG8gaW5jcmVtZW50IHRoZSBjdW11bCBmb3IgZWFjaCBjYXRlZ29yeVxuICAgICAgICAgICAgICAgIGNvbnN0IGluY3IgPVxuICAgICAgICAgICAgICAgICAgICB0eXBlXyA9PT0gJ2FnZXB5cmFtaWQnXG4gICAgICAgICAgICAgICAgICAgICAgICA/ICh0aGlzLmFnZVB5cmFtaWRIZWlnaHRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gdGhpcy5hZ2VQeXJhbWlkSGVpZ2h0KGNlbGwsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogcmVzb2x1dGlvbikgLyBuYkNhdFxuICAgICAgICAgICAgICAgICAgICAgICAgOiB0eXBlXyA9PT0gJ3JhZGFyJyB8fCB0eXBlXyA9PT0gJ2hhbGZ0b25lJ1xuICAgICAgICAgICAgICAgICAgICAgICAgPyAoMiAqIE1hdGguUEkpIC8gbmJDYXRcbiAgICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgaWYgKGluY3IgPT09IHVuZGVmaW5lZCkgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIHN5bWJvbCB0eXBlOicgKyB0eXBlXylcblxuICAgICAgICAgICAgICAgIGZvciAobGV0IFtjb2x1bW4sIGNvbG9yXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLmNvbG9yKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZV8gPT09ICdhZ2VweXJhbWlkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9zZXQgY2F0ZWdvcnkgY29sb3JcbiAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5maWxsU3R5bGUgPSBjb2xvclxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2dldCBjYXRlZ29yeSB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsID0gY2VsbFtjb2x1bW5dXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vY29tcHV0ZSBjYXRlZ29yeSBsZW5ndGggLSBpbiBnZW9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd0cgPSAoc0cgKiB2YWwpIC8gbWF4VmFsXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vZHJhdyBiYXJcbiAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5maWxsUmVjdCh4YyArIChyZXNvbHV0aW9uIC0gd0cpIC8gMiwgeWMgKyBjdW11bCwgd0csIGluY3IpXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vbmV4dCBoZWlnaHRcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1bXVsICs9IGluY3JcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlXyA9PT0gJ3JhZGFyJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9zZXQgY2F0ZWdvcnkgY29sb3JcbiAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5maWxsU3R5bGUgPSBjb2xvclxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2dldCBjYXRlZ3JveSB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsID0gY2VsbFtjb2x1bW5dXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vY29tcHV0ZSBjYXRlZ29yeSByYWRpdXMgLSBpbiBnZW9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zdCByRyA9IHRoaXMucmFkaXVzKHZhbCwgciwgc3RhdCwgY2VsbFN0YXQsIHopXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByRyA9IChzRyAvIDIpICogTWF0aC5zcXJ0KHZhbCAvIG1heFZhbClcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy9kcmF3IGFuZ3VsYXIgc2VjdG9yXG4gICAgICAgICAgICAgICAgICAgICAgICBjdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5tb3ZlVG8oeGMsIHljKVxuICAgICAgICAgICAgICAgICAgICAgICAgY3R4LmFyYyh4YywgeWMsIHJHLCBjdW11bCAtIGluY3IsIGN1bXVsKVxuICAgICAgICAgICAgICAgICAgICAgICAgY3R4LmxpbmVUbyh4YywgeWMpXG4gICAgICAgICAgICAgICAgICAgICAgICBjdHguZmlsbCgpXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vbmV4dCBhbmd1bGFyIHNlY3RvclxuICAgICAgICAgICAgICAgICAgICAgICAgY3VtdWwgKz0gaW5jclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVfID09PSAnaGFsZnRvbmUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvL3NldCBjYXRlZ29yeSBjb2xvclxuICAgICAgICAgICAgICAgICAgICAgICAgY3R4LmZpbGxTdHlsZSA9IGNvbG9yXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vZ2V0IGNhdGVncm95IHZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSBjZWxsW2NvbHVtbl1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy9jb21wdXRlIGNhdGVnb3J5IHJhZGl1cyAtIGluIGdlb1xuICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByRyA9IHNHICogMC4zMzMgKiBNYXRoLnNxcnQodmFsIC8gbWF4VmFsKVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2RyYXcgY2lyY2xlXG4gICAgICAgICAgICAgICAgICAgICAgICBjdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5hcmMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeGMgKyByZXNvbHV0aW9uICogMC4yNSAqIE1hdGguY29zKGN1bXVsKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5YyArIHJlc29sdXRpb24gKiAwLjI1ICogTWF0aC5zaW4oY3VtdWwpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJHLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAqIE1hdGguUElcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5maWxsKClcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy9uZXh0IGFuZ3VsYXIgc2VjdG9yXG4gICAgICAgICAgICAgICAgICAgICAgICBjdW11bCArPSBpbmNyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgc3ltYm9sIHR5cGU6JyArIHR5cGVfKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvL2NvbXB1dGUgdG90YWxcbiAgICAgICAgICAgICAgICBsZXQgdG90YWwgPSAwXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgY29sdW1uIG9mIE9iamVjdC5rZXlzKHRoaXMuY29sb3IpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHYgPSArY2VsbFtjb2x1bW5dXG4gICAgICAgICAgICAgICAgICAgIGlmICghdikgY29udGludWVcbiAgICAgICAgICAgICAgICAgICAgdG90YWwgKz0gdlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXRvdGFsIHx8IGlzTmFOKHRvdGFsKSkgY29udGludWVcblxuICAgICAgICAgICAgICAgIC8vZHJhdyBkZWNvbXBvc2l0aW9uIHN5bWJvbFxuICAgICAgICAgICAgICAgIGxldCBjdW11bCA9IDBcbiAgICAgICAgICAgICAgICBjb25zdCBkID0gcmVzb2x1dGlvbiAqICgxIC0gc0cgLyByZXNvbHV0aW9uKSAqIDAuNVxuICAgICAgICAgICAgICAgIGNvbnN0IG9yaSA9IHRoaXMuc3RyaXBlc09yaWVudGF0aW9uKGNlbGwsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSlcblxuICAgICAgICAgICAgICAgIGZvciAobGV0IFtjb2x1bW4sIGNvbG9yXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLmNvbG9yKSkge1xuICAgICAgICAgICAgICAgICAgICAvL2dldCBzaGFyZVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZSA9IGNlbGxbY29sdW1uXSAvIHRvdGFsXG4gICAgICAgICAgICAgICAgICAgIGlmICghc2hhcmUgfHwgaXNOYU4oc2hhcmUpKSBjb250aW51ZVxuXG4gICAgICAgICAgICAgICAgICAgIC8vc2V0IGNvbG9yXG4gICAgICAgICAgICAgICAgICAgIGN0eC5maWxsU3R5bGUgPSBjb2xvclxuXG4gICAgICAgICAgICAgICAgICAgIC8vZHJhdyBzeW1ib2wgcGFydFxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZV8gPT09ICdmbGFnJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9kcmF3IGZsYWcgc3RyaXBlXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3JpID09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2hvcml6b250YWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHguZmlsbFJlY3QoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGwueCArIGQgKyBvZmZzZXQuZHgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGwueSArIGQgKyBjdW11bCAqIHNHICsgb2Zmc2V0LmR5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzRyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmUgKiBzR1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy92ZXJ0aWNhbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5maWxsUmVjdChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbC54ICsgZCArIGN1bXVsICogc0cgKyBvZmZzZXQuZHgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGwueSArIGQgKyBvZmZzZXQuZHksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlICogc0csXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNHXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVfID09PSAncGllY2hhcnQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvL2RyYXcgcGllIGNoYXJ0IGFuZ3VsYXIgc2VjdG9yXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vY29tcHV0ZSBhbmdsZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGExID0gY3VtdWwgKiAyICogTWF0aC5QSVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYTIgPSAoY3VtdWwgKyBzaGFyZSkgKiAyICogTWF0aC5QSVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2RyYXdcbiAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgICAgICAgICAgICAgY3R4Lm1vdmVUbyh4YywgeWMpXG4gICAgICAgICAgICAgICAgICAgICAgICBjdHguYXJjKHhjLCB5Yywgc0cgKiAwLjUsIGExICsgb2ZmQW5nLCBhMiArIG9mZkFuZylcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnBpZUNoYXJ0SW50ZXJuYWxSYWRpdXNGYWN0b3IpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LmFyYyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHljLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzRyAqIDAuNSAqIHRoaXMucGllQ2hhcnRJbnRlcm5hbFJhZGl1c0ZhY3RvcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYTEgKyBvZmZBbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEyICsgb2ZmQW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgY3R4LmNsb3NlUGF0aCgpXG4gICAgICAgICAgICAgICAgICAgICAgICBjdHguZmlsbCgpXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZV8gPT09ICdyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9kcmF3IHJpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgICAgICAgICAgICAgY3R4LmFyYyh4YywgeWMsIE1hdGguc3FydCgxIC0gY3VtdWwpICogc0cgKiAwLjUsIDAsIDIgKiBNYXRoLlBJKVxuICAgICAgICAgICAgICAgICAgICAgICAgY3R4LmZpbGwoKVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVfID09PSAnc2VnbWVudCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vZHJhdyBzZWdtZW50IHNlY3Rpb25zXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3RyA9IChzRyAqIHNHKSAvIHJlc29sdXRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcmkgPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaG9yaXpvbnRhbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5maWxsUmVjdChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbC54ICsgb2Zmc2V0LmR4LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxsLnkgKyAocmVzb2x1dGlvbiAtIHdHKSAvIDIgKyBjdW11bCAqIHdHICsgb2Zmc2V0LmR5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZSAqIHdHXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3ZlcnRpY2FsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LmZpbGxSZWN0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxsLnggKyBjdW11bCAqIHJlc29sdXRpb24gKyBvZmZzZXQuZHgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGwueSArIChyZXNvbHV0aW9uIC0gd0cpIC8gMiArIG9mZnNldC5keSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmUgKiByZXNvbHV0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3R1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCBzeW1ib2wgdHlwZTonICsgdHlwZV8pXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBjdW11bCArPSBzaGFyZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vdXBkYXRlIGxlZ2VuZHNcbiAgICAgICAgdGhpcy51cGRhdGVMZWdlbmRzKHsgc3R5bGU6IHRoaXMsIHJlc29sdXRpb246IHJlc29sdXRpb24sIHo6IHosIHZpZXdTY2FsZTogdmlld1NjYWxlIH0pXG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBTdHlsZSB9IGZyb20gJy4uL2NvcmUvU3R5bGUuanMnXG5pbXBvcnQgeyByYW5kb21Ob3JtYWwgfSBmcm9tICdkMy1yYW5kb20nXG5pbXBvcnQgeyBjaGVja1dlYkdMU3VwcG9ydCwgbWFrZVdlYkdMQ2FudmFzIH0gZnJvbSAnLi4vdXRpbHMvd2ViR0xVdGlscy5qcydcbmltcG9ydCB7IFdlYkdMU3F1YXJlQ29sb3JpbmcgfSBmcm9tICcuLi91dGlscy9XZWJHTFNxdWFyZUNvbG9yaW5nLmpzJ1xuaW1wb3J0IHsgY29sb3IgfSBmcm9tICdkMy1jb2xvcidcblxuLyoqXG4gKlxuICogQG1vZHVsZSBzdHlsZVxuICogQGF1dGhvciBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgRG90RGVuc2l0eVN0eWxlIGV4dGVuZHMgU3R5bGUge1xuICAgIC8qKiBAcGFyYW0ge29iamVjdH0gb3B0cyAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cylcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIG51bWJlciBvZiBkb3RzIGZvciBhIGNlbGwgdmFsdWUuXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwsIG51bWJlciwgbnVtYmVyLCBvYmplY3QpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy5kb3ROdW1iZXIgPSBvcHRzLmRvdE51bWJlciB8fCAoKGNlbGwsIHJlc29sdXRpb24pID0+IHJlc29sdXRpb24gLyAxMDApIC8vKGMscix6LHZzKSA9PiB7fVxuXG4gICAgICAgIC8qKiBUaGUgY29sb3Igb2YgdGhlIGRvdHMuIFNhbWUgY29sb3IgZm9yIGFsbCBkb3RzIHdpdGhpbiBhIGNlbGwuXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwsIG51bWJlciwgbnVtYmVyLCBvYmplY3QpOnN0cmluZ30gKi9cbiAgICAgICAgdGhpcy5jb2xvciA9IG9wdHMuY29sb3IgfHwgKCgpID0+ICcjRkY1NzMzJykgLy8oYyxyLHosdnMpID0+IHt9XG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBzaXplIG9mIHRoZSBkb3RzLCBpbiBnZW8gdW5pdC4gU2FtZSBzaXplIGZvciBhbGwgY2VsbHMuXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihudW1iZXIsIG51bWJlcixvYmplY3QpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy5kb3RTaXplID0gb3B0cy5kb3RTaXplIHx8ICgocmVzb2x1dGlvbiwgeikgPT4gMS41ICogeikgLy8oYyxyLHosdnMpID0+IHt9XG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBzaWdtYSBvZiB0aGUgZG90cyBkaXN0cmlidXRpb24uIFNhbWUgdmFsdWUgZm9yIGFsbCBjZWxscy5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG51bWJlciwgbnVtYmVyLG9iamVjdCk6bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLnNpZ21hID0gb3B0cy5zaWdtYSB8fCAoKHJlc29sdXRpb24sIHopID0+IHJlc29sdXRpb24gLyAyKSAvLyhjLHIseix2cykgPT4ge31cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEcmF3IGNlbGxzIGFzIHRleHQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXRcIikuQ2VsbD59IGNlbGxzXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhc1wiKS5HZW9DYW52YXN9IGdlb0NhbnZhc1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByZXNvbHV0aW9uXG4gICAgICovXG4gICAgZHJhdyhjZWxscywgZ2VvQ2FudmFzLCByZXNvbHV0aW9uKSB7XG4gICAgICAgIC8vZmlsdGVyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlcikgY2VsbHMgPSBjZWxscy5maWx0ZXIodGhpcy5maWx0ZXIpXG5cbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgeiA9IGdlb0NhbnZhcy52aWV3LnpcblxuICAgICAgICAvL2dldCB2aWV3IHNjYWxlXG4gICAgICAgIGNvbnN0IHZpZXdTY2FsZSA9IHRoaXMudmlld1NjYWxlID8gdGhpcy52aWV3U2NhbGUoY2VsbHMsIHJlc29sdXRpb24sIHopIDogdW5kZWZpbmVkXG5cbiAgICAgICAgLy9nZXQgc2l6ZVxuICAgICAgICBjb25zdCBzR2VvID0gdGhpcy5kb3RTaXplID8gdGhpcy5kb3RTaXplKHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgOiB6XG5cbiAgICAgICAgLy9tYWtlIHJhbmRvbSBmdW5jdGlvblxuICAgICAgICBjb25zdCBzaWcgPSB0aGlzLnNpZ21hID8gdGhpcy5zaWdtYShyZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpIDogcmVzb2x1dGlvbiAqIDAuNFxuICAgICAgICBjb25zdCByYW5kID0gcmFuZG9tTm9ybWFsKDAsIHNpZylcblxuICAgICAgICBjb25zdCBjdHggPSBnZW9DYW52YXMub2Zmc2NyZWVuQ3R4XG5cbiAgICAgICAgaWYgKGNoZWNrV2ViR0xTdXBwb3J0KCkpIHtcbiAgICAgICAgICAgIC8vY3JlYXRlIGNhbnZhcyBhbmQgd2ViZ2wgcmVuZGVyZXJcbiAgICAgICAgICAgIGNvbnN0IGN2V0dMID0gbWFrZVdlYkdMQ2FudmFzKGdlb0NhbnZhcy53ICsgJycsIGdlb0NhbnZhcy5oICsgJycpXG4gICAgICAgICAgICBpZiAoIWN2V0dMKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignTm8gd2ViR0wnKVxuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvL2NyZWF0ZSB3ZWJHTCBwcm9ncmFtXG4gICAgICAgICAgICBjb25zdCBwcm9nID0gbmV3IFdlYkdMU3F1YXJlQ29sb3JpbmcoY3ZXR0wuZ2wsIHNHZW8gLyB6KVxuXG4gICAgICAgICAgICBjb25zdCByMiA9IHJlc29sdXRpb24gLyAyXG5cbiAgICAgICAgICAgIGZvciAobGV0IGNlbGwgb2YgY2VsbHMpIHtcbiAgICAgICAgICAgICAgICAvL2dldCBjb2xvclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbCA9IHRoaXMuY29sb3IoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKVxuICAgICAgICAgICAgICAgIGlmICghY29sIHx8IGNvbCA9PT0gJ25vbmUnKSBjb250aW51ZVxuXG4gICAgICAgICAgICAgICAgLy9udW1iZXIgb2YgZG90c1xuICAgICAgICAgICAgICAgIGNvbnN0IGRvdE51bWJlciA9IHRoaXMuZG90TnVtYmVyKGNlbGwsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSlcblxuICAgICAgICAgICAgICAgIC8vZ2V0IG9mZnNldFxuICAgICAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMub2Zmc2V0KGNlbGwsIHJlc29sdXRpb24sIHopXG5cbiAgICAgICAgICAgICAgICAvL2NlbGwgY2VudGVyXG4gICAgICAgICAgICAgICAgY29uc3QgY3ggPSBjZWxsLnggKyBvZmZzZXQuZHggKyByMlxuICAgICAgICAgICAgICAgIGNvbnN0IGN5ID0gY2VsbC55ICsgb2Zmc2V0LmR5ICsgcjJcblxuICAgICAgICAgICAgICAgIC8vY29udmVydCBjb2xvclxuICAgICAgICAgICAgICAgIGNvbnN0IGNjID0gY29sb3IoY29sKVxuICAgICAgICAgICAgICAgIGlmICghY2MpIHJldHVyblxuXG4gICAgICAgICAgICAgICAgLy9yYW5kb20gcG9pbnRzXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gZG90TnVtYmVyOyBpKyspXG4gICAgICAgICAgICAgICAgICAgIHByb2cuYWRkUG9pbnREYXRhMihjeCArIHJhbmQoKSwgY3kgKyByYW5kKCksIGNjLnIsIGNjLmcsIGNjLmIsIGNjLm9wYWNpdHkpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vZHJhd1xuICAgICAgICAgICAgcHJvZy5kcmF3KGdlb0NhbnZhcy5nZXRXZWJHTFRyYW5zZm9ybSgpKVxuXG4gICAgICAgICAgICAvL2RyYXcgaW4gY2FudmFzIGdlb1xuICAgICAgICAgICAgZ2VvQ2FudmFzLmluaXRDYW52YXNUcmFuc2Zvcm0oKVxuICAgICAgICAgICAgY3R4LmRyYXdJbWFnZShjdldHTC5jYW52YXMsIDAsIDApXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGxldCBjZWxsIG9mIGNlbGxzKSB7XG4gICAgICAgICAgICAgICAgLy9nZXQgY29sb3JcbiAgICAgICAgICAgICAgICBjb25zdCBjb2wgPSB0aGlzLmNvbG9yKGNlbGwsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSlcbiAgICAgICAgICAgICAgICBpZiAoIWNvbCB8fCBjb2wgPT09ICdub25lJykgY29udGludWVcbiAgICAgICAgICAgICAgICAvL3NldCBjb2xvclxuICAgICAgICAgICAgICAgIGN0eC5maWxsU3R5bGUgPSBjb2xcblxuICAgICAgICAgICAgICAgIC8vbnVtYmVyIG9mIGRvdHNcbiAgICAgICAgICAgICAgICBjb25zdCBkb3ROdW1iZXIgPSB0aGlzLmRvdE51bWJlcihjZWxsLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpXG5cbiAgICAgICAgICAgICAgICAvL2dldCBvZmZzZXRcbiAgICAgICAgICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLm9mZnNldChjZWxsLCByZXNvbHV0aW9uLCB6KVxuXG4gICAgICAgICAgICAgICAgLy9kcmF3IHJhbmRvbSBkb3RzXG4gICAgICAgICAgICAgICAgY29uc3QgY3ggPSBjZWxsLnggKyBvZmZzZXQuZHggKyByZXNvbHV0aW9uIC8gMixcbiAgICAgICAgICAgICAgICAgICAgY3kgPSBjZWxsLnkgKyBvZmZzZXQuZHkgKyByZXNvbHV0aW9uIC8gMlxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IGRvdE51bWJlcjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eC5maWxsUmVjdChjeCArIHJhbmQoKSwgY3kgKyByYW5kKCksIHNHZW8sIHNHZW8pXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy91cGRhdGUgbGVnZW5kc1xuICAgICAgICB0aGlzLnVwZGF0ZUxlZ2VuZHMoeyBzdHlsZTogdGhpcywgcmVzb2x1dGlvbjogcmVzb2x1dGlvbiwgejogeiwgdmlld1NjYWxlOiB2aWV3U2NhbGUgfSlcbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IFN0eWxlIH0gZnJvbSAnLi4vY29yZS9TdHlsZS5qcydcblxuLyoqXG4gKiBAbW9kdWxlIHN0eWxlXG4gKiBAYXV0aG9yIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBJbWFnZVN0eWxlIGV4dGVuZHMgU3R5bGUge1xuICAgIC8qKiBAcGFyYW0ge29iamVjdH0gb3B0cyAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cylcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIGltYWdlIFVSTCBvZiBhIGNlbGwuXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwsIG51bWJlciwgbnVtYmVyLCBvYmplY3QpOnN0cmluZ30gKi9cbiAgICAgICAgdGhpcy5pbWFnZSA9IG9wdHMuaW1hZ2UgfHwgKCgpID0+ICcnKSAvLyhjLHIseix2cykgPT4ge31cblxuICAgICAgICAvKiogVGhlIGltYWdlIHNpemUgaW4gZ3JvdW5kIG1ldGVyc1xuICAgICAgICAgKiAgQHR5cGUge2Z1bmN0aW9uKGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbCwgbnVtYmVyLCBudW1iZXIsIG9iamVjdCk6bnVtYmVyfSAgICAgICAgKi9cbiAgICAgICAgdGhpcy5zaXplID0gb3B0cy5zaXplIHx8ICgoY2VsbCwgcmVzb2x1dGlvbikgPT4gcmVzb2x1dGlvbilcblxuICAgICAgICAvKiogRGljdGlvbm5hcnkgb2YgcHJlbG9hZGVkIGltYWdlcy4gdXJsIC0+IGltYWdlXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEB0eXBlIHtvYmplY3R9ICovXG4gICAgICAgIHRoaXMuY2FjaGUgPSB7fVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7QXJyYXkuPGltcG9ydChcIi4uL2NvcmUvRGF0YXNldC5qc1wiKS5DZWxsPn0gY2VsbHNcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvcmUvR2VvQ2FudmFzLmpzXCIpLkdlb0NhbnZhc30gZ2VvQ2FudmFzXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJlc29sdXRpb25cbiAgICAgKiBAb3ZlcnJpZGVcbiAgICAgKi9cbiAgICBhc3luYyBkcmF3KGNlbGxzLCBnZW9DYW52YXMsIHJlc29sdXRpb24pIHtcbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgeiA9IGdlb0NhbnZhcy52aWV3LnosXG4gICAgICAgICAgICByZXNvbHV0aW9uUGl4ID0gcmVzb2x1dGlvbiAvIHpcblxuICAgICAgICAvL2dldCB2aWV3IHNjYWxlXG4gICAgICAgIGNvbnN0IHZpZXdTY2FsZSA9IHRoaXMudmlld1NjYWxlID8gdGhpcy52aWV3U2NhbGUoY2VsbHMsIHJlc29sdXRpb24sIHopIDogdW5kZWZpbmVkXG5cbiAgICAgICAgLy9kcmF3IGluIHNjcmVlbiBjb29yZGluYXRlc1xuICAgICAgICBnZW9DYW52YXMuaW5pdENhbnZhc1RyYW5zZm9ybSgpXG5cbiAgICAgICAgLy9cbiAgICAgICAgZm9yIChsZXQgY2VsbCBvZiBjZWxscykge1xuICAgICAgICAgICAgLy9nZXQgY2VsbCBpbWFnZSB1cmxcbiAgICAgICAgICAgIGNvbnN0IHVybCA9IHRoaXMuaW1hZ2UoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKVxuICAgICAgICAgICAgaWYgKCF1cmwpIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIC8vc2l6ZSBhbmQgcG9zaXRpb24gdmFsdWVzXG4gICAgICAgICAgICBsZXQgc2l6ZVBpeCA9IHRoaXMuc2l6ZShjZWxsLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpIC8gelxuICAgICAgICAgICAgaWYgKCFzaXplUGl4KSBjb250aW51ZVxuXG4gICAgICAgICAgICAvL2dldCBpbWFnZSBmcm9tIGNhY2hlXG4gICAgICAgICAgICBjb25zdCBpbWFnZSA9IHRoaXMuY2FjaGVbdXJsXVxuXG4gICAgICAgICAgICAvL2xvYWRpbmcsIGtlZXAgd2FpdGluZ1xuICAgICAgICAgICAgaWYgKGltYWdlID09ICdsb2FkaW5nJykgcmV0dXJuXG4gICAgICAgICAgICAvL25vIGltYWdlOiBsb2FkIGl0XG4gICAgICAgICAgICBlbHNlIGlmICghaW1hZ2UpIHtcbiAgICAgICAgICAgICAgICAvL3RhZyBhcyBsb2FkaW5nXG4gICAgICAgICAgICAgICAgdGhpcy5jYWNoZVt1cmxdID0gJ2xvYWRpbmcnXG5cbiAgICAgICAgICAgICAgICAvL2RlZmluZSBpbWFnZVxuICAgICAgICAgICAgICAgIGNvbnN0IGltZyA9IG5ldyBJbWFnZSgpXG4gICAgICAgICAgICAgICAgaW1nLm9ubG9hZCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy9zdG9yZSBpbWFnZSBkYXRhIGluIGNhY2hlIGFuZCByZWRyYXdcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWNoZVt1cmxdID0gaW1nXG4gICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5yZWRyYXcoKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpbWcub25lcnJvciA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy9jYXNlIHdoZW4gbm8gaW1hZ2VcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdDb3VsZCBub3QgcmV0cmlldmUgaW1hZ2UgZnJvbScsIHVybClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy9zZXQgVVJMIHRvIGxhdW5jaCB0aGUgZG93bmxvYWRcbiAgICAgICAgICAgICAgICBpbWcuc3JjID0gdXJsXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vZHJhdyBpbWFnZVxuICAgICAgICAgICAgICAgIGNvbnN0IGQgPSAocmVzb2x1dGlvblBpeCAtIHNpemVQaXgpIC8gMlxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGdlb0NhbnZhcy5vZmZzY3JlZW5DdHguZHJhd0ltYWdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBnZW9DYW52YXMuZ2VvVG9QaXhYKGNlbGwueCkgKyBkLFxuICAgICAgICAgICAgICAgICAgICAgICAgZ2VvQ2FudmFzLmdlb1RvUGl4WShjZWxsLnkpICsgZCAtIHJlc29sdXRpb25QaXgsXG4gICAgICAgICAgICAgICAgICAgICAgICBzaXplUGl4LFxuICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZVBpeFxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcilcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvL3VwZGF0ZSBsZWdlbmRzXG4gICAgICAgIHRoaXMudXBkYXRlTGVnZW5kcyh7IHN0eWxlOiB0aGlzLCByZXNvbHV0aW9uOiByZXNvbHV0aW9uLCB6OiB6LCB2aWV3U2NhbGU6IHZpZXdTY2FsZSB9KVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgU3R5bGUgfSBmcm9tICcuLi9jb3JlL1N0eWxlLmpzJ1xuaW1wb3J0IHsgU2lkZVN0eWxlIH0gZnJvbSAnLi9TaWRlU3R5bGUuanMnXG5cbi8qKiBAdHlwZWRlZiB7e3g6bnVtYmVyLHk6bnVtYmVyLG9yOlwidlwifFwiaFwiLGMxOmltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbHx1bmRlZmluZWQsYzI6aW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsfHVuZGVmaW5lZH19IFNpZGUgKi9cblxuLyoqXG4gKiBAbW9kdWxlIHN0eWxlXG4gKiBAYXV0aG9yIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBJc29GZW5jZVN0eWxlIGV4dGVuZHMgU3R5bGUge1xuICAgIC8qKiBAcGFyYW0ge29iamVjdH0gb3B0cyAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cylcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGRpY3Rpb25hcnkgKHN0cmluZyAtPiBjb2xvcikgd2hpY2ggZ2l2ZSB0aGUgY29sb3Igb2YgZWFjaCBjYXRlZ29yeS5cbiAgICAgICAgICogQHR5cGUge29iamVjdH0gKi9cbiAgICAgICAgdGhpcy5jb2xvciA9IG9wdHMuY29sb3JcblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIGhlaWdodCBvZiBhIGNlbGwgaW4gZ2VvZ3JhcGhpY2FsIHVuaXQuXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwsIG51bWJlciwgbnVtYmVyLCBvYmplY3QpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy5oZWlnaHQgPSBvcHRzLmhlaWdodCB8fCAoKGNlbGwsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgPT4gcmVzb2x1dGlvbiAqIDAuNClcblxuICAgICAgICAvKiogVGhlIHBlcnNwZWN0aXZlIGFuZ2xlLCBpbiBkZWdyZWUsIHdpdGhpbiBbLTE4MCwxODBdLCBmcm9tIFtPLHhdIGF4aXMuXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgIHRoaXMuYW5nbGUgPSBvcHRzLmFuZ2xlICE9IHVuZGVmaW5lZCA/IG9wdHMuYW5nbGUgOiA1MFxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgY29ybmVyIGxpbmUgc3Ryb2tlIHN0eWxlLlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLG51bWJlcixudW1iZXIsbnVtYmVyKTpzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuY29ybmVyTGluZVN0cm9rZUNvbG9yID0gb3B0cy5jb3JuZXJMaW5lU3Ryb2tlQ29sb3IgfHwgKChjLCByLCB6LCBhbmdsZSkgPT4gJyM5OTknKVxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgY29ybmVyIGxpbmUgd2lkdGguXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwsbnVtYmVyLG51bWJlcixudW1iZXIpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy5jb3JuZXJMaW5lV2lkdGggPSBvcHRzLmNvcm5lckxpbmVXaWR0aCB8fCAoKGMsIHIsIHosIGFuZ2xlKSA9PiAoYW5nbGUgJSA5MCA9PSAwID8gMCA6IDAuOCAqIHopKVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTaG93IHZlcnRpY2FsIGNyb3NzLXNlY3Rpb25zLlxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn0gKi9cbiAgICAgICAgdGhpcy5zVmVydCA9IG9wdHMuc1ZlcnQgIT0gdW5kZWZpbmVkID8gb3B0cy5zVmVydCA6IHRydWVcblxuICAgICAgICAvKipcbiAgICAgICAgICogU2hvdyBob3Jpem9udGFsIGNyb3NzLXNlY3Rpb25zLlxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn0gKi9cbiAgICAgICAgdGhpcy5zSG9yID0gb3B0cy5zSG9yICE9IHVuZGVmaW5lZCA/IG9wdHMuc0hvciA6IHRydWVcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXQuanNcIikuQ2VsbD59IGNlbGxzXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhcy5qc1wiKS5HZW9DYW52YXN9IGdlb0NhbnZhc1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByZXNvbHV0aW9uXG4gICAgICogQG92ZXJyaWRlXG4gICAgICovXG4gICAgZHJhdyhjZWxscywgZ2VvQ2FudmFzLCByZXNvbHV0aW9uKSB7XG4gICAgICAgIC8vZmlsdGVyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlcikgY2VsbHMgPSBjZWxscy5maWx0ZXIodGhpcy5maWx0ZXIpXG5cbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgeiA9IGdlb0NhbnZhcy52aWV3LnpcbiAgICAgICAgY29uc3QgY3R4ID0gZ2VvQ2FudmFzLm9mZnNjcmVlbkN0eFxuXG4gICAgICAgIC8vZ2V0IHZpZXcgc2NhbGVcbiAgICAgICAgY29uc3Qgdmlld1NjYWxlID0gdGhpcy52aWV3U2NhbGUgPyB0aGlzLnZpZXdTY2FsZShjZWxscywgcmVzb2x1dGlvbiwgeikgOiB1bmRlZmluZWRcblxuICAgICAgICAvL25iIGNhdGVnb3JpZXMgLSB1c2VkIGZvciByYWRhciBhbmQgYWdlcHlyYW1pZFxuICAgICAgICBjb25zdCBjYXRzID0gT2JqZWN0LmtleXModGhpcy5jb2xvcilcblxuICAgICAgICAvL2hhbGYgcmVzb2x1dGlvblxuICAgICAgICBjb25zdCByMiA9IHJlc29sdXRpb24gLyAyXG5cbiAgICAgICAgLy9nZXQgb2Zmc2V0XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5vZmZzZXQodW5kZWZpbmVkLCByZXNvbHV0aW9uLCB6KSxcbiAgICAgICAgICAgIGR4ID0gb2Zmc2V0LmR4LFxuICAgICAgICAgICAgZHkgPSBvZmZzZXQuZHlcblxuICAgICAgICAvL21ha2Ugc2lkZXNcbiAgICAgICAgLyoqICBAdHlwZSB7QXJyYXkuPFNpZGU+fSAqL1xuICAgICAgICBjb25zdCBzaWRlcyA9IFNpZGVTdHlsZS5idWlsZFNpZGVzKFxuICAgICAgICAgICAgY2VsbHMsXG4gICAgICAgICAgICByZXNvbHV0aW9uLFxuICAgICAgICAgICAgdGhpcy5hbmdsZSAlIDE4MCAhPSA5MCAmJiB0aGlzLnNWZXJ0LFxuICAgICAgICAgICAgdGhpcy5hbmdsZSAlIDE4MCAhPSAwICYmIHRoaXMuc0hvclxuICAgICAgICApXG5cbiAgICAgICAgLy9cbiAgICAgICAgaWYgKHNpZGVzLmxlbmd0aCA9PSAwKSByZXR1cm5cblxuICAgICAgICAvL2FuZ2xlIGluIHJhZGlhbnNcbiAgICAgICAgY29uc3QgYVJhZCA9ICh0aGlzLmFuZ2xlICogTWF0aC5QSSkgLyAxODAsXG4gICAgICAgICAgICBjb3MgPSBNYXRoLmNvcyhhUmFkKSxcbiAgICAgICAgICAgIHNpbiA9IE1hdGguc2luKGFSYWQpXG5cbiAgICAgICAgLy9zb3J0IHNpZGVzIHNvIHRoYXQgdGhlIGJhY2sgb25lcyBhcmUgZHJhd24gZmlyc3QuIFRoaXMgZGVwZW5kcyBvbiB0aGUgYW5nbGUuXG4gICAgICAgIC8vZGVwZW5kaW5nIG9uIGRpc3RhbmNlIHRvIHRoZSByZWZlcmVuY2UgY29ybmVyIHBvaW50XG4gICAgICAgIGNvbnN0IHhDb3JuZXIgPSBNYXRoLmFicyh0aGlzLmFuZ2xlKSA8IDkwID8gZ2VvQ2FudmFzLmV4dEdlby54TWluIDogZ2VvQ2FudmFzLmV4dEdlby54TWF4XG4gICAgICAgIGNvbnN0IHlDb3JuZXIgPSB0aGlzLmFuZ2xlIDwgMCA/IGdlb0NhbnZhcy5leHRHZW8ueU1heCA6IGdlb0NhbnZhcy5leHRHZW8ueU1pblxuICAgICAgICBzaWRlcy5zb3J0KFxuICAgICAgICAgICAgKHMxLCBzMikgPT5cbiAgICAgICAgICAgICAgICBNYXRoLmh5cG90KHMyLnggLSB4Q29ybmVyLCBzMi55IC0geUNvcm5lcikgLSBNYXRoLmh5cG90KHMxLnggLSB4Q29ybmVyLCBzMS55IC0geUNvcm5lcilcbiAgICAgICAgKVxuXG4gICAgICAgIC8vcHJlcGFyZSBmdW5jdGlvbiB0byBkcmF3IGNvcm5lciBsaW5lIGZvciBhIGNlbGwgKmMqXG4gICAgICAgIGNvbnN0IGRyYXdDb3JuZXJMaW5lID0gKGNlbGwpID0+IHtcbiAgICAgICAgICAgIGlmICghY2VsbCkgcmV0dXJuXG4gICAgICAgICAgICAvL2xpbmUgc3R5bGVcbiAgICAgICAgICAgIGNvbnN0IGx3ID0gdGhpcy5jb3JuZXJMaW5lV2lkdGggPyB0aGlzLmNvcm5lckxpbmVXaWR0aChjZWxsLCByZXNvbHV0aW9uLCB6LCB0aGlzLmFuZ2xlKSA6IDAuOCAqIHpcbiAgICAgICAgICAgIGlmIChsdyA9PSAwKSByZXR1cm5cbiAgICAgICAgICAgIGN0eC5zdHJva2VTdHlsZSA9IHRoaXMuY29ybmVyTGluZVN0cm9rZUNvbG9yXG4gICAgICAgICAgICAgICAgPyB0aGlzLmNvcm5lckxpbmVTdHJva2VDb2xvcihjZWxsLCByZXNvbHV0aW9uLCB6LCB0aGlzLmFuZ2xlKVxuICAgICAgICAgICAgICAgIDogJyMzMzMnXG4gICAgICAgICAgICBjdHgubGluZVdpZHRoID0gbHdcblxuICAgICAgICAgICAgLy9oZWlnaHQgLSBpbiBnZW9cbiAgICAgICAgICAgIGNvbnN0IGhHID0gdGhpcy5oZWlnaHQoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKVxuXG4gICAgICAgICAgICAvL2RyYXcgbGluZVxuICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICBjdHgubW92ZVRvKGNlbGwueCArIHIyICsgZHgsIGNlbGwueSArIHIyICsgZHkpXG4gICAgICAgICAgICBjdHgubGluZVRvKGNlbGwueCArIHIyICsgaEcgKiBjb3MgKyBkeCwgY2VsbC55ICsgcjIgKyBoRyAqIHNpbiArIGR5KVxuICAgICAgICAgICAgY3R4LnN0cm9rZSgpXG4gICAgICAgIH1cblxuICAgICAgICAvL2RyYXcgc2lkZXNcbiAgICAgICAgY3R4LmxpbmVDYXAgPSAncm91bmQnXG4gICAgICAgIGZvciAobGV0IHNpZGUgb2Ygc2lkZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGMxID0gc2lkZS5jMSxcbiAgICAgICAgICAgICAgICBjMiA9IHNpZGUuYzIsXG4gICAgICAgICAgICAgICAgeCA9IHNpZGUueCxcbiAgICAgICAgICAgICAgICB5ID0gc2lkZS55XG5cbiAgICAgICAgICAgIC8vaGVpZ2h0cyAtIGluIGdlb1xuICAgICAgICAgICAgY29uc3QgaEcxID0gYzEgPyB0aGlzLmhlaWdodChjMSwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IDAsXG4gICAgICAgICAgICAgICAgaEcyID0gYzIgPyB0aGlzLmhlaWdodChjMiwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IDBcblxuICAgICAgICAgICAgLy9jb21wdXRlIHRvdGFscyBmb3IgYm90aCBjZWxsc1xuICAgICAgICAgICAgY29uc3QgdG90YWwxID0gY29tcHV0ZVRvdGFsKGMxLCBjYXRzKSxcbiAgICAgICAgICAgICAgICB0b3RhbDIgPSBjb21wdXRlVG90YWwoYzIsIGNhdHMpXG4gICAgICAgICAgICBpZiAodG90YWwxID09IDAgJiYgdG90YWwyID09IDApIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIGxldCBjdW11bDEgPSAwLFxuICAgICAgICAgICAgICAgIGN1bXVsMiA9IDBcbiAgICAgICAgICAgIGZvciAobGV0IFtjb2x1bW4sIGNvbG9yXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLmNvbG9yKSkge1xuICAgICAgICAgICAgICAgIC8vZHJhdyBzdHJpcGUgb2Ygc2lkZSBzIGFuZCBjYXRlZ29yeSBjb2x1bW5cblxuICAgICAgICAgICAgICAgIC8vZ2V0IHZhbHVlcyBmb3IgYm90aCBjZWxsc1xuICAgICAgICAgICAgICAgIGxldCB2MSA9IGMxID8gK2MxW2NvbHVtbl0gOiAwXG4gICAgICAgICAgICAgICAgbGV0IHYyID0gYzIgPyArYzJbY29sdW1uXSA6IDBcbiAgICAgICAgICAgICAgICBpZiAodjEgPT0gMCAmJiB2MiA9PSAwKSBjb250aW51ZVxuXG4gICAgICAgICAgICAgICAgLy9jb21wdXRlIGhlaWdodHNcbiAgICAgICAgICAgICAgICBjb25zdCBoMSA9IChoRzEgKiBjdW11bDEpIC8gdG90YWwxIHx8IDBcbiAgICAgICAgICAgICAgICBjb25zdCBoMW4gPSAoaEcxICogKGN1bXVsMSArIHYxKSkgLyB0b3RhbDEgfHwgMFxuICAgICAgICAgICAgICAgIGNvbnN0IGgyID0gKGhHMiAqIGN1bXVsMikgLyB0b3RhbDIgfHwgMFxuICAgICAgICAgICAgICAgIGNvbnN0IGgybiA9IChoRzIgKiAoY3VtdWwyICsgdjIpKSAvIHRvdGFsMiB8fCAwXG5cbiAgICAgICAgICAgICAgICAvL21ha2UgcGF0aFxuICAgICAgICAgICAgICAgIGN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgICAgIGlmIChzaWRlLm9yID09ICdoJykge1xuICAgICAgICAgICAgICAgICAgICAvL2hvcml6b250YWwgc2lkZSAtIHZlcnRpY2FsIHNlY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgLy9ib3R0b20gbGVmdFxuICAgICAgICAgICAgICAgICAgICBjdHgubW92ZVRvKHggKyBoMSAqIGNvcyArIGR4LCB5IC0gcjIgKyBoMSAqIHNpbiArIGR5KVxuICAgICAgICAgICAgICAgICAgICAvL3RvcCBsZWZ0XG4gICAgICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oeCArIGgyICogY29zICsgZHgsIHkgKyByMiArIGgyICogc2luICsgZHkpXG4gICAgICAgICAgICAgICAgICAgIC8vdG9wIHJpZ2h0XG4gICAgICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oeCArIGgybiAqIGNvcyArIGR4LCB5ICsgcjIgKyBoMm4gKiBzaW4gKyBkeSlcbiAgICAgICAgICAgICAgICAgICAgLy9ib3R0b20gcmlnaHRcbiAgICAgICAgICAgICAgICAgICAgY3R4LmxpbmVUbyh4ICsgaDFuICogY29zICsgZHgsIHkgLSByMiArIGgxbiAqIHNpbiArIGR5KVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vdmVydGljYWwgc2lkZSAtIGhvcml6b250YWwgc2VjdGlvblxuICAgICAgICAgICAgICAgICAgICAvL2JvdHRvbSBsZWZ0XG4gICAgICAgICAgICAgICAgICAgIGN0eC5tb3ZlVG8oeCAtIHIyICsgaDEgKiBjb3MgKyBkeCwgeSArIGgxICogc2luICsgZHkpXG4gICAgICAgICAgICAgICAgICAgIC8vYm90dG9tIHJpZ2h0XG4gICAgICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oeCArIHIyICsgaDIgKiBjb3MgKyBkeCwgeSArIGgyICogc2luICsgZHkpXG4gICAgICAgICAgICAgICAgICAgIC8vdG9wIHJpZ2h0XG4gICAgICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oeCArIHIyICsgaDJuICogY29zICsgZHgsIHkgKyBoMm4gKiBzaW4gKyBkeSlcbiAgICAgICAgICAgICAgICAgICAgLy90b3AgbGVmdFxuICAgICAgICAgICAgICAgICAgICBjdHgubGluZVRvKHggLSByMiArIGgxbiAqIGNvcyArIGR4LCB5ICsgaDFuICogc2luICsgZHkpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vY2cuY3R4LmNsb3NlUGF0aCgpXG5cbiAgICAgICAgICAgICAgICAvL2ZpbGxcbiAgICAgICAgICAgICAgICBjdHguZmlsbFN0eWxlID0gY29sb3JcbiAgICAgICAgICAgICAgICBjdHguZmlsbCgpXG5cbiAgICAgICAgICAgICAgICBjdW11bDEgKz0gdjFcbiAgICAgICAgICAgICAgICBjdW11bDIgKz0gdjJcblxuICAgICAgICAgICAgICAgIC8vVE9ETyBkcmF3IG9ubHkgb25lIGxpbmVcbiAgICAgICAgICAgICAgICAvL2RyYXcgY29ybmVyIGxpbmVcbiAgICAgICAgICAgICAgICAvL2lmIChzaWRlLm9yID09IFwiaFwiKSB7XG4gICAgICAgICAgICAgICAgZHJhd0Nvcm5lckxpbmUoYzEpXG4gICAgICAgICAgICAgICAgZHJhd0Nvcm5lckxpbmUoYzIpXG4gICAgICAgICAgICAgICAgLy9pZiAodGhpcy5hbmdsZSA+IDAgJiYgc2lkZS5vciA9PSBcImhcIikgZHJhd0Nvcm5lckxpbmUoYzIpXG4gICAgICAgICAgICAgICAgLy9lbHNlIGRyYXdDb3JuZXJMaW5lKGMyKVxuICAgICAgICAgICAgICAgIC8vfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy91cGRhdGUgbGVnZW5kc1xuICAgICAgICB0aGlzLnVwZGF0ZUxlZ2VuZHMoeyBzdHlsZTogdGhpcywgcmVzb2x1dGlvbjogcmVzb2x1dGlvbiwgejogeiwgdmlld1NjYWxlOiB2aWV3U2NhbGUgfSlcbiAgICB9XG59XG5cbmNvbnN0IGNvbXB1dGVUb3RhbCA9IChjZWxsLCBjYXRlZ29yaWVzKSA9PiB7XG4gICAgaWYgKCFjZWxsKSByZXR1cm4gMFxuICAgIGxldCB0b3RhbCA9IDBcbiAgICBmb3IgKGxldCBjb2x1bW4gb2YgY2F0ZWdvcmllcykge1xuICAgICAgICBjb25zdCB2ID0gY2VsbFtjb2x1bW5dXG4gICAgICAgIGlmICghdikgY29udGludWVcbiAgICAgICAgdG90YWwgKz0gK3ZcbiAgICB9XG4gICAgcmV0dXJuIHRvdGFsIHx8IDBcbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgU3R5bGUgfSBmcm9tICcuLi9jb3JlL1N0eWxlLmpzJ1xuXG4vKipcbiAqIEBtb2R1bGUgc3R5bGVcbiAqIEBhdXRob3IgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIEpveVBsb3RTdHlsZSBleHRlbmRzIFN0eWxlIHtcbiAgICAvKiogQHBhcmFtIHtvYmplY3R9IG9wdHMgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBoZWlnaHQgb2YgYSBjZWxsIGluIGdlb2dyYXBoaWNhbCB1bml0LlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLCBudW1iZXIsIG51bWJlciwgb2JqZWN0KTpudW1iZXJ9ICovXG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gb3B0cy5oZWlnaHQgfHwgKChjLCByKSA9PiByICogTWF0aC5yYW5kb20oKSkgLy8oYyxyLHosdnMpID0+IHt9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihudW1iZXIse21pbjpudW1iZXIsIG1heDpudW1iZXJ9LG51bWJlcixudW1iZXIpOnN0cmluZ30gKi9cbiAgICAgICAgdGhpcy5saW5lQ29sb3IgPSBvcHRzLmxpbmVDb2xvciB8fCAoKHksIHlzLCByLCB6KSA9PiAnI0JCQicpXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyLHttaW46bnVtYmVyLCBtYXg6bnVtYmVyfSxudW1iZXIsbnVtYmVyKTpudW1iZXJ9ICovXG4gICAgICAgIHRoaXMubGluZVdpZHRoID0gb3B0cy5saW5lV2lkdGggfHwgKCh5LCB5cywgciwgeikgPT4geilcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihudW1iZXIse21pbjpudW1iZXIsIG1heDpudW1iZXJ9LG51bWJlcixudW1iZXIpOnN0cmluZ30gKi9cbiAgICAgICAgdGhpcy5maWxsQ29sb3IgPSBvcHRzLmZpbGxDb2xvciB8fCAoKHksIHlzLCByLCB6KSA9PiAnI2MwOGM1OTY4JylcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXQuanNcIikuQ2VsbD59IGNlbGxzXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhcy5qc1wiKS5HZW9DYW52YXN9IGdlb0NhbnZhc1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByZXNvbHV0aW9uXG4gICAgICogQG92ZXJyaWRlXG4gICAgICovXG4gICAgZHJhdyhjZWxscywgZ2VvQ2FudmFzLCByZXNvbHV0aW9uKSB7XG4gICAgICAgIC8vZmlsdGVyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlcikgY2VsbHMgPSBjZWxscy5maWx0ZXIodGhpcy5maWx0ZXIpXG5cbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgeiA9IGdlb0NhbnZhcy52aWV3LnpcbiAgICAgICAgY29uc3QgY3R4ID0gZ2VvQ2FudmFzLm9mZnNjcmVlbkN0eFxuXG4gICAgICAgIC8vZ2V0IHZpZXcgc2NhbGVcbiAgICAgICAgY29uc3Qgdmlld1NjYWxlID0gdGhpcy52aWV3U2NhbGUgPyB0aGlzLnZpZXdTY2FsZShjZWxscywgcmVzb2x1dGlvbiwgeikgOiB1bmRlZmluZWRcblxuICAgICAgICAvL2luZGV4IGNlbGxzIGJ5IHkgYW5kIHhcbiAgICAgICAgLyoqICBAdHlwZSB7b2JqZWN0fSAqL1xuICAgICAgICBjb25zdCBpbmQgPSB7fVxuICAgICAgICBmb3IgKGNvbnN0IGNlbGwgb2YgY2VsbHMpIHtcbiAgICAgICAgICAgIGxldCByb3cgPSBpbmRbY2VsbC55XVxuICAgICAgICAgICAgaWYgKCFyb3cpIHtcbiAgICAgICAgICAgICAgICByb3cgPSB7fVxuICAgICAgICAgICAgICAgIGluZFtjZWxsLnldID0gcm93XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByb3dbY2VsbC54XSA9IHRoaXMuaGVpZ2h0KGNlbGwsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSlcbiAgICAgICAgfVxuXG4gICAgICAgIC8vY29tcHV0ZSBleHRlbnRcbiAgICAgICAgY29uc3QgZSA9IGdlb0NhbnZhcy5leHRHZW9cbiAgICAgICAgaWYgKCFlKSByZXR1cm5cbiAgICAgICAgY29uc3QgeE1pbiA9IE1hdGguZmxvb3IoZS54TWluIC8gcmVzb2x1dGlvbikgKiByZXNvbHV0aW9uXG4gICAgICAgIGNvbnN0IHhNYXggPSBNYXRoLmZsb29yKGUueE1heCAvIHJlc29sdXRpb24pICogcmVzb2x1dGlvblxuICAgICAgICBjb25zdCB5TWluID0gTWF0aC5mbG9vcihlLnlNaW4gLyByZXNvbHV0aW9uKSAqIHJlc29sdXRpb25cbiAgICAgICAgY29uc3QgeU1heCA9IE1hdGguZmxvb3IoZS55TWF4IC8gcmVzb2x1dGlvbikgKiByZXNvbHV0aW9uXG5cbiAgICAgICAgLyoqICBAdHlwZSB7e21pbjpudW1iZXIsIG1heDpudW1iZXJ9fSAqL1xuICAgICAgICBjb25zdCB5cyA9IHsgbWluOiB5TWluLCBtYXg6IHlNYXggfVxuXG4gICAgICAgIC8vZHJhdyBsaW5lcywgcm93IGJ5IHJvdywgc3RhdGluZyBmcm9tIHRoZSB0b3BcbiAgICAgICAgY3R4LmxpbmVKb2luID0gJ3JvdW5kJ1xuICAgICAgICBmb3IgKGxldCB5ID0geU1heDsgeSA+PSB5TWluOyB5IC09IHJlc29sdXRpb24pIHtcbiAgICAgICAgICAgIC8vZ2V0IHJvd1xuICAgICAgICAgICAgY29uc3Qgcm93ID0gaW5kW3ldXG5cbiAgICAgICAgICAgIC8vbm8gcm93XG4gICAgICAgICAgICBpZiAoIXJvdykgY29udGludWVcblxuICAgICAgICAgICAgLy9wbGFjZSBmaXJzdCBwb2ludFxuICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICBjdHgubW92ZVRvKHhNaW4gLSByZXNvbHV0aW9uIC8gMiwgeSlcblxuICAgICAgICAgICAgLy9zdG9yZSB0aGUgcHJldmlvdXMgaGVpZ2h0XG4gICAgICAgICAgICAvKiogQHR5cGUge251bWJlcnx1bmRlZmluZWR9ICovXG4gICAgICAgICAgICBsZXQgaEdfXG5cbiAgICAgICAgICAgIC8vZ28gdGhyb3VnaCB0aGUgbGluZSBjZWxsc1xuICAgICAgICAgICAgZm9yIChsZXQgeCA9IHhNaW47IHggPD0geE1heDsgeCArPSByZXNvbHV0aW9uKSB7XG4gICAgICAgICAgICAgICAgLy9nZXQgY29sdW1uIHZhbHVlXG4gICAgICAgICAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgICAgICAgICAgbGV0IGhHID0gcm93W3hdXG4gICAgICAgICAgICAgICAgaWYgKCFoRykgaEcgPSAwXG5cbiAgICAgICAgICAgICAgICBpZiAoaEcgfHwgaEdfKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vZHJhdyBsaW5lIG9ubHkgd2hlbiBhdCBsZWFzdCBvbmUgb2YgYm90aCB2YWx1ZXMgaXMgbm9uLW51bGxcbiAgICAgICAgICAgICAgICAgICAgLy9UT0RPIHRlc3QgYmV6aWVyQ3VydmVUb1xuICAgICAgICAgICAgICAgICAgICBjdHgubGluZVRvKHggKyByZXNvbHV0aW9uIC8gMiwgeSArIGhHKVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vZWxzZSBtb3ZlIHRoZSBwb2ludFxuICAgICAgICAgICAgICAgICAgICBjdHgubW92ZVRvKHggKyByZXNvbHV0aW9uIC8gMiwgeSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy9zdG9yZSB0aGUgcHJldmlvdXMgdmFsdWVcbiAgICAgICAgICAgICAgICBoR18gPSBoR1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvL2xhc3QgcG9pbnRcbiAgICAgICAgICAgIGlmIChoR18pIGN0eC5saW5lVG8oeE1heCArIHJlc29sdXRpb24gLyAyLCB5KVxuXG4gICAgICAgICAgICAvL2RyYXcgZmlsbFxuICAgICAgICAgICAgY29uc3QgZmMgPSB0aGlzLmZpbGxDb2xvcih5LCB5cywgcmVzb2x1dGlvbiwgeilcbiAgICAgICAgICAgIGlmIChmYyAmJiBmYyAhPSAnbm9uZScpIHtcbiAgICAgICAgICAgICAgICBjdHguZmlsbFN0eWxlID0gZmNcbiAgICAgICAgICAgICAgICBjdHguZmlsbCgpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vZHJhdyBsaW5lXG4gICAgICAgICAgICBjb25zdCBsYyA9IHRoaXMubGluZUNvbG9yKHksIHlzLCByZXNvbHV0aW9uLCB6KVxuICAgICAgICAgICAgY29uc3QgbHcgPSB0aGlzLmxpbmVXaWR0aCh5LCB5cywgcmVzb2x1dGlvbiwgeilcbiAgICAgICAgICAgIGlmIChsYyAmJiBsYyAhPSAnbm9uZScgJiYgbHcgPiAwKSB7XG4gICAgICAgICAgICAgICAgY3R4LnN0cm9rZVN0eWxlID0gbGNcbiAgICAgICAgICAgICAgICBjdHgubGluZVdpZHRoID0gbHdcbiAgICAgICAgICAgICAgICBjdHguc3Ryb2tlKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuLy9pbXBvcnQgeyBUYW5ha2FTdHlsZSB9IGZyb20gJy4vU2lkZVRhbmFrYVN0eWxlX19fT0xELmpzJ1xuaW1wb3J0IHsgU3Ryb2tlU3R5bGUgfSBmcm9tICcuL1N0cm9rZVN0eWxlLmpzJ1xuaW1wb3J0IHsgU3F1YXJlQ29sb3JDYXRlZ29yeVdlYkdMU3R5bGUgfSBmcm9tICcuL1NxdWFyZUNvbG9yQ2F0ZWdvcnlXZWJHTFN0eWxlLmpzJ1xuaW1wb3J0IHsgU3R5bGUgfSBmcm9tICcuLi9jb3JlL1N0eWxlLmpzJ1xuLy9pbXBvcnQgeyBTaWRlU3R5bGUgfSBmcm9tICcuL1NpZGVTdHlsZS5qcydcbmltcG9ydCB7IGNsYXNzaWZpZXIgYXMgY2xGdW4sIGNvbG9yQ2xhc3NpZmllciBhcyBjY2xGdW4gfSBmcm9tICcuLi91dGlscy9zY2FsZS5qcydcbmltcG9ydCB7IFNpZGVUYW5ha2FTdHlsZSB9IGZyb20gJy4vU2lkZVRhbmFrYVN0eWxlLmpzJ1xuXG5cbi8qKlxuICogQG1vZHVsZSBzdHlsZVxuICogQGF1dGhvciBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgTGVnb1N0eWxlIHtcbiAgICBzdGF0aWMgZ2V0KHZhbHVlLCBicmVha3MsIGNvbG9ycywgb3B0cyA9IHt9KSB7XG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLy90aGUgY29sb3JzXG4gICAgICAgIC8vaHR0cDovL3d3dy5qZW5ueXNjcmF5b25jb2xsZWN0aW9uLmNvbS8yMDIxLzA2L2FsbC1jdXJyZW50LWxlZ28tY29sb3JzLmh0bWxcbiAgICAgICAgLy9odHRwczovL2xlb25hd2ljei5naXRodWIuaW8vbGVnb2NvbG9ycy9yZWZlcmVuY2UvZmlndXJlcy9SRUFETUUtcGxvdC0xLnBuZ1xuICAgICAgICAvKm9wdHMuY29sb3JzID0gb3B0cy5jb2xvcnMgfHwgW1xuICAgICAgICAgICAgJyMwMDg1MmInLCAvL2RhcmtlciBncmVlblxuICAgICAgICAgICAgJyNhZmQyNDYnLCAvL2xpZ2h0IGdyZWVuXG4gICAgICAgICAgICAnI2ZhYzgwYScsIC8vZGFyayB5ZWxsb3dcbiAgICAgICAgICAgICcjYmI4MDVhJywgLy9icm93blxuICAgICAgICAgICAgJyNkNjc5MjMnLCAvL21vc3RhcmRcbiAgICAgICAgICAgICcjY2I0ZTI5JywgLy9yZWRpc2hcbiAgICAgICAgICAgICcjYjQwMDAwJywgLy9yZWRcbiAgICAgICAgICAgICcjNzIwMDEyJywgLy9kYXJrIHJlZFxuICAgICAgICAgICAgLy9cInB1cnBsZVwiLFxuICAgICAgICAgICAgLy9cIiNlZWVcIiAvL3doaXRoZVxuICAgICAgICBdKi9cblxuICAgICAgICBvcHRzLmNvbG9yRGFyayA9IG9wdHMuY29sb3JEYXJrIHx8ICcjMzMzJ1xuICAgICAgICBvcHRzLmNvbG9yQnJpZ2h0ID0gb3B0cy5jb2xvckJyaWdodCB8fCAnI2FhYSdcblxuICAgICAgICAvL21ha2UgY2xhc3NpZmllclxuICAgICAgICBjb25zdCBjbGFzc2lmaWVyID0gY2xGdW4oYnJlYWtzKVxuICAgICAgICBjb25zdCBjbGFzc2lmaWVyMiA9IGNlbGwgPT4gY2xhc3NpZmllcih2YWx1ZShjZWxsKSlcbiAgICAgICAgLy9tYWtlIGNvbG9ycyB0YWJsZVxuICAgICAgICBjb25zdCBjb2xvcnNEaWN0ID0ge31cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2xvcnMubGVuZ3RoOyBpKyspIGNvbG9yc0RpY3RbaSArICcnXSA9IGNvbG9yc1tpXVxuXG4gICAgICAgIC8vbWFrZSBjZWxsIGZpbGwgc3R5bGVcbiAgICAgICAgY29uc3QgY2VsbFN0eWxlID0gbmV3IFNxdWFyZUNvbG9yQ2F0ZWdvcnlXZWJHTFN0eWxlKHtcbiAgICAgICAgICAgIGNvZGU6IGNsYXNzaWZpZXIyLFxuICAgICAgICAgICAgY29sb3I6IGNvbG9yc0RpY3QsXG4gICAgICAgIH0pXG5cbiAgICAgICAgLy9tYWtlIHRhbmFrYSBzaWRlIHN0eWxlXG4gICAgICAgIGNvbnN0IHRhbmFrYVN0eWxlID0gbmV3IFNpZGVUYW5ha2FTdHlsZSh7XG4gICAgICAgICAgICBjbGFzc2lmaWVyOiAoKSA9PiBjbGFzc2lmaWVyMixcbiAgICAgICAgICAgIGNvbG9yRGFyayA6IG9wdHMuY29sb3JEYXJrLFxuICAgICAgICAgICAgY29sb3JCcmlnaHQgOiBvcHRzLmNvbG9yQnJpZ2h0LFxuICAgICAgICAgICAgZGlhbW9uZDogb3B0cy5kaWFtb25kLFxuICAgICAgICB9KVxuXG4gICAgICAgIC8vc3R5bGUgdG8gc2hvdyBsaW1pdHMgYmV0d2VlbiBwaWVjZXNcbiAgICAgICAgY29uc3Qgc3N0ID0gbmV3IFN0cm9rZVN0eWxlKHtcbiAgICAgICAgICAgIHN0cm9rZUNvbG9yOiAoKSA9PiAnIzY2NicsXG4gICAgICAgICAgICBzdHJva2VXaWR0aDogKGMsIHIsIHopID0+IDAuMiAqIHosXG4gICAgICAgICAgICBmaWx0ZXI6IG9wdHMuZmlsdGVyLFxuICAgICAgICB9KVxuXG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBjZWxsU3R5bGUsXG4gICAgICAgICAgICBzc3QsXG4gICAgICAgICAgICB0YW5ha2FTdHlsZSxcbiAgICAgICAgICAgIG5ldyBMZWdvVG9wU3R5bGUoeyBjb2xEYXJrOiBvcHRzLmNvbERhcmssIGNvbEJyaWdodDogb3B0cy5jb2xCcmlnaHQsIGZpbHRlcjogb3B0cy5maWx0ZXIgfSksXG4gICAgICAgIF1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbCk6c3RyaW5nfSBjb2RlXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGNvbG9yXG4gICAgICogQHBhcmFtIHtvYmplY3R9IG9wdHNcbiAgICAgKiBAcmV0dXJucyB7QXJyYXkuPFN0eWxlPn1cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0Q2F0ZWdvcnkoY29kZSwgY29sb3IsIG9wdHMpIHtcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICBvcHRzLmNvbERhcmsgPSBvcHRzLmNvbERhcmsgfHwgJyMzMzMnXG4gICAgICAgIG9wdHMuY29sQnJpZ2h0ID0gb3B0cy5jb2xCcmlnaHQgfHwgJyNhYWEnXG5cbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgcyA9IG5ldyBTcXVhcmVDb2xvckNhdGVnb3J5V2ViR0xTdHlsZSh7IGNvZGU6IGNvZGUsIGNvbG9yOiBjb2xvciB9KVxuICAgICAgICAvL3N0eWxlIHRvIHNob3cgbGltaXRzIGJldHdlZW4gcGllY2VzXG4gICAgICAgIGNvbnN0IHNzdCA9IG5ldyBTdHJva2VTdHlsZSh7IHN0cm9rZUNvbG9yOiAoKSA9PiAnIzY2NicsIHN0cm9rZVdpZHRoOiAoYywgciwgeikgPT4gMC4yICogeiB9KVxuXG4gICAgICAgIHJldHVybiBbcywgc3N0LCBuZXcgTGVnb1RvcFN0eWxlKHsgY29sRGFyazogb3B0cy5jb2xEYXJrLCBjb2xCcmlnaHQ6IG9wdHMuY29sQnJpZ2h0IH0pXVxuICAgIH1cbn1cblxuLyoqXG4gKiBBIHN0eWxlIHRvIGRyYXcgdG9wIGNpcmNsZSBvZiBsZWdvIGJyaWNrcy5cbiAqL1xuY2xhc3MgTGVnb1RvcFN0eWxlIGV4dGVuZHMgU3R5bGUge1xuICAgIC8qKiBAcGFyYW0ge29iamVjdHx1bmRlZmluZWR9IG9wdHMgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG4gICAgICAgIHRoaXMuY29sRGFyayA9IG9wdHMuY29sRGFyayB8fCAnIzMzMydcbiAgICAgICAgdGhpcy5jb2xCcmlnaHQgPSBvcHRzLmNvbEJyaWdodCB8fCAnI2FhYSdcbiAgICB9XG5cbiAgICBkcmF3KGNlbGxzLCBnZW9DYW52YXMsIHIpIHtcbiAgICAgICAgLy9maWx0ZXJcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyKSBjZWxscyA9IGNlbGxzLmZpbHRlcih0aGlzLmZpbHRlcilcbiAgICAgICAgY29uc3QgY3R4ID0gZ2VvQ2FudmFzLm9mZnNjcmVlbkN0eFxuXG4gICAgICAgIGN0eC5saW5lV2lkdGggPSAwLjYgKiBnZW9DYW52YXMudmlldy56XG5cbiAgICAgICAgLy9kYXJrIHBhcnRcbiAgICAgICAgY3R4LnN0cm9rZVN0eWxlID0gdGhpcy5jb2xEYXJrXG4gICAgICAgIGZvciAobGV0IGMgb2YgY2VsbHMpIHtcbiAgICAgICAgICAgIGN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgY3R4LmFyYyhjLnggKyByICogMC41LCBjLnkgKyByICogMC41LCByICogMC41NSAqIDAuNSwgTWF0aC5QSSAvIDQsIC1NYXRoLlBJICogKDMgLyA0KSwgdHJ1ZSlcbiAgICAgICAgICAgIGN0eC5zdHJva2UoKVxuICAgICAgICB9XG5cbiAgICAgICAgLy9icmlnaHQgcGFydFxuICAgICAgICBjdHguc3Ryb2tlU3R5bGUgPSB0aGlzLmNvbEJyaWdodFxuICAgICAgICBmb3IgKGxldCBjIG9mIGNlbGxzKSB7XG4gICAgICAgICAgICBjdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgIGN0eC5hcmMoYy54ICsgciAqIDAuNSwgYy55ICsgciAqIDAuNSwgciAqIDAuNTUgKiAwLjUsIE1hdGguUEkgLyA0LCAtTWF0aC5QSSAqICgzIC8gNCksIGZhbHNlKVxuICAgICAgICAgICAgY3R4LnN0cm9rZSgpXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IFN0eWxlIH0gZnJvbSAnLi4vY29yZS9TdHlsZS5qcydcblxuLyoqXG4gKiBAbW9kdWxlIHN0eWxlXG4gKiBAYXV0aG9yIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBNb3NhaWNTdHlsZSBleHRlbmRzIFN0eWxlIHtcbiAgICAvKiogQHBhcmFtIHtvYmplY3R9IG9wdHMgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBjb2xvciBvZiB0aGUgY2VsbC5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbCwgbnVtYmVyLCBudW1iZXIsIG9iamVjdCk6c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLmNvbG9yID0gb3B0cy5jb2xvciB8fCAoKCkgPT4gJyNFQTZCQUMnKSAvLyhjLHIseix2cykgPT4ge31cblxuICAgICAgICAvKiogVGhlIG1vc2FpYyBmYWN0b3IsIHdpdGhpbiBbMCwwLjVdLiBTZXQgdG8gMCBmb3Igbm8gbW9zYWljIGVmZmVjdC4gU2V0IHRvIDAuNSBmb3Igc3Ryb25nIG1vc2FpYyBlZmZlY3QuXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgIHRoaXMubW9zYWljRmFjdG9yID0gb3B0cy5tb3NhaWNGYWN0b3IgfHwgMC4xNVxuXG4gICAgICAgIC8qKiBUaGUgbW9zYWljIHNoYWRvdyBmYWN0b3IsIHdpdGhpbiBbMCwwLjVdLiBTZXQgdG8gMCBmb3Igbm8gbW9zYWljIHNoYWRvdy4gU2V0IHRvIDAuNSBmb3Igc3Ryb25nIG1vc2FpYyBzaGFkb3cuXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgIHRoaXMuc2hhZG93RmFjdG9yID0gb3B0cy5zaGFkb3dGYWN0b3IgfHwgMC4yXG5cbiAgICAgICAgLyoqIFRoZSBtb3NhaWMgc2hhZG93IGNvbG9yLlxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLnNoYWRvd0NvbG9yID0gb3B0cy5zaGFkb3dDb2xvciB8fCAnIzU1NSdcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7QXJyYXkuPGltcG9ydChcIi4uL2NvcmUvRGF0YXNldFwiKS5DZWxsPn0gY2VsbHNcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvcmUvR2VvQ2FudmFzXCIpLkdlb0NhbnZhc30gZ2VvQ2FudmFzXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJlc29sdXRpb25cbiAgICAgKi9cbiAgICBkcmF3KGNlbGxzLCBnZW9DYW52YXMsIHJlc29sdXRpb24pIHtcbiAgICAgICAgLy9maWx0ZXJcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyKSBjZWxscyA9IGNlbGxzLmZpbHRlcih0aGlzLmZpbHRlcilcblxuICAgICAgICAvL1xuICAgICAgICBjb25zdCB6ID0gZ2VvQ2FudmFzLnZpZXcuelxuICAgICAgICBjb25zdCBjdHggPSBnZW9DYW52YXMub2Zmc2NyZWVuQ3R4XG5cbiAgICAgICAgLy9nZXQgdmlldyBzY2FsZVxuICAgICAgICBjb25zdCB2aWV3U2NhbGUgPSB0aGlzLnZpZXdTY2FsZSA/IHRoaXMudmlld1NjYWxlKGNlbGxzLCByZXNvbHV0aW9uLCB6KSA6IHVuZGVmaW5lZFxuXG4gICAgICAgIC8vc2V0IHN0cm9rZSBzdHlsZSwgZm9yIHNoYWRvd1xuICAgICAgICBjdHguc3Ryb2tlU3R5bGUgPSB0aGlzLnNoYWRvd0NvbG9yXG4gICAgICAgIGN0eC5saW5lV2lkdGggPSB0aGlzLnNoYWRvd0ZhY3RvciAqIHJlc29sdXRpb25cbiAgICAgICAgY3R4LmxpbmVKb2luID0gJ3JvdW5kJ1xuICAgICAgICBjdHgubGluZUNhcCA9ICdidXR0J1xuXG4gICAgICAgIC8vZnVuY3Rpb24gdG8gY29tcHV0ZSBwb3NpdGlvbiBtb3NhaWMgZWZmZWN0XG4gICAgICAgIGNvbnN0IGQgPSByZXNvbHV0aW9uICogdGhpcy5tb3NhaWNGYWN0b3JcbiAgICAgICAgY29uc3QgbW9zYWljID0gKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHsgeDogTWF0aC5yYW5kb20oKSAqIGQsIHk6IE1hdGgucmFuZG9tKCkgKiBkIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGNlbGwgb2YgY2VsbHMpIHtcbiAgICAgICAgICAgIC8vc2V0IGZpbGwgY29sb3JcbiAgICAgICAgICAgIGNvbnN0IGNvbCA9IHRoaXMuY29sb3IgPyB0aGlzLmNvbG9yKGNlbGwsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgOiB1bmRlZmluZWRcbiAgICAgICAgICAgIGlmICghY29sIHx8IGNvbCA9PT0gJ25vbmUnKSBjb250aW51ZVxuICAgICAgICAgICAgY3R4LmZpbGxTdHlsZSA9IGNvbFxuXG4gICAgICAgICAgICAvL2dldCBvZmZzZXRcbiAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMub2Zmc2V0KGNlbGwsIHJlc29sdXRpb24sIHopXG5cbiAgICAgICAgICAgIC8vY29tcHV0ZSBwb3NpdGlvbiBtb3NhaWMgZWZmZWN0XG4gICAgICAgICAgICBjb25zdCBsbCA9IG1vc2FpYygpLFxuICAgICAgICAgICAgICAgIHVsID0gbW9zYWljKCksXG4gICAgICAgICAgICAgICAgbHIgPSBtb3NhaWMoKSxcbiAgICAgICAgICAgICAgICB1ciA9IG1vc2FpYygpXG5cbiAgICAgICAgICAgIC8vc3Ryb2tlXG4gICAgICAgICAgICBpZiAodGhpcy5zaGFkb3dGYWN0b3IgPiAwKSB7XG4gICAgICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICAgICAgY3R4Lm1vdmVUbyhjZWxsLnggKyBvZmZzZXQuZHggKyBsbC54LCBjZWxsLnkgKyBvZmZzZXQuZHkgKyBsbC55KVxuICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oY2VsbC54ICsgb2Zmc2V0LmR4ICsgcmVzb2x1dGlvbiAtIGxyLngsIGNlbGwueSArIG9mZnNldC5keSArIGxyLnkpXG4gICAgICAgICAgICAgICAgY3R4LmxpbmVUbyhjZWxsLnggKyBvZmZzZXQuZHggKyByZXNvbHV0aW9uIC0gdXIueCwgY2VsbC55ICsgb2Zmc2V0LmR5ICsgcmVzb2x1dGlvbiAtIHVyLnkpXG4gICAgICAgICAgICAgICAgY3R4LnN0cm9rZSgpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vZmlsbFxuXG4gICAgICAgICAgICBjdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgIGN0eC5tb3ZlVG8oY2VsbC54ICsgb2Zmc2V0LmR4ICsgbGwueCwgY2VsbC55ICsgb2Zmc2V0LmR5ICsgbGwueSlcbiAgICAgICAgICAgIGN0eC5saW5lVG8oY2VsbC54ICsgb2Zmc2V0LmR4ICsgcmVzb2x1dGlvbiAtIGxyLngsIGNlbGwueSArIG9mZnNldC5keSArIGxyLnkpXG4gICAgICAgICAgICBjdHgubGluZVRvKGNlbGwueCArIG9mZnNldC5keCArIHJlc29sdXRpb24gLSB1ci54LCBjZWxsLnkgKyBvZmZzZXQuZHkgKyByZXNvbHV0aW9uIC0gdXIueSlcbiAgICAgICAgICAgIGN0eC5saW5lVG8oY2VsbC54ICsgb2Zmc2V0LmR4ICsgdWwueCwgY2VsbC55ICsgb2Zmc2V0LmR5ICsgcmVzb2x1dGlvbiAtIHVsLnkpXG4gICAgICAgICAgICBjdHguZmlsbCgpXG4gICAgICAgIH1cblxuICAgICAgICAvL3VwZGF0ZSBsZWdlbmRzXG4gICAgICAgIHRoaXMudXBkYXRlTGVnZW5kcyh7IHN0eWxlOiB0aGlzLCByZXNvbHV0aW9uOiByZXNvbHV0aW9uLCB6OiB6LCB2aWV3U2NhbGU6IHZpZXdTY2FsZSB9KVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgU3R5bGUgfSBmcm9tICcuLi9jb3JlL1N0eWxlLmpzJ1xuXG4vKipcbiAqIEBtb2R1bGUgc3R5bGVcbiAqIEBhdXRob3IgSm9zZXBoIERhdmllcywgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIE5pbmphU3RhclN0eWxlIGV4dGVuZHMgU3R5bGUge1xuICAgIC8qKiBAcGFyYW0ge29iamVjdH0gb3B0cyAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cylcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIGNvbG9yIG9mIHRoZSBjZWxsLlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLCBudW1iZXIsIG51bWJlciwgb2JqZWN0KTpzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuY29sb3IgPSBvcHRzLmNvbG9yIHx8ICgoKSA9PiAnI0VBNkJBQycpIC8vKGMscix6LHZzKSA9PiB7fVxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgc2l6ZSBvZiBhIGNlbGwsIHdpdGhpbiBbMCwxXTpcbiAgICAgICAgICogIC0gMCwgbm90aGluZyBzaG93blxuICAgICAgICAgKiAgLSAxLCBlbnRpcmUgc3F1YXJlXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwsIG51bWJlciwgbnVtYmVyLCBvYmplY3QpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy5zaXplID0gb3B0cy5zaXplIHx8ICgoY2VsbCwgcmVzb2x1dGlvbikgPT4gcmVzb2x1dGlvbikgLy8oYyxyLHosdnMpID0+IHt9XG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBzaGFwZS5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydChcIi4uL2NvcmUvRGF0YXNldFwiKS5DZWxsKTpzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuc2hhcGUgPSBvcHRzLnNoYXBlIHx8ICgoKSA9PiAnbycpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGw+fSBjZWxsc1xuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29yZS9HZW9DYW52YXNcIikuR2VvQ2FudmFzfSBnZW9DYW52YXNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVzb2x1dGlvblxuICAgICAqL1xuICAgIGRyYXcoY2VsbHMsIGdlb0NhbnZhcywgcmVzb2x1dGlvbikge1xuICAgICAgICAvL2ZpbHRlclxuICAgICAgICBpZiAodGhpcy5maWx0ZXIpIGNlbGxzID0gY2VsbHMuZmlsdGVyKHRoaXMuZmlsdGVyKVxuXG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IHogPSBnZW9DYW52YXMudmlldy56XG4gICAgICAgIGNvbnN0IGN0eCA9IGdlb0NhbnZhcy5vZmZzY3JlZW5DdHhcblxuICAgICAgICAvL2dldCB2aWV3IHNjYWxlXG4gICAgICAgIGNvbnN0IHZpZXdTY2FsZSA9IHRoaXMudmlld1NjYWxlID8gdGhpcy52aWV3U2NhbGUoY2VsbHMsIHJlc29sdXRpb24sIHopIDogdW5kZWZpbmVkXG5cbiAgICAgICAgY29uc3QgcjIgPSByZXNvbHV0aW9uICogMC41XG4gICAgICAgIGZvciAobGV0IGNlbGwgb2YgY2VsbHMpIHtcbiAgICAgICAgICAgIC8vY29sb3JcbiAgICAgICAgICAgIGNvbnN0IGNvbCA9IHRoaXMuY29sb3IgPyB0aGlzLmNvbG9yKGNlbGwsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgOiB1bmRlZmluZWRcbiAgICAgICAgICAgIGlmICghY29sIHx8IGNvbCA9PT0gJ25vbmUnKSBjb250aW51ZVxuICAgICAgICAgICAgY3R4LmZpbGxTdHlsZSA9IGNvbFxuXG4gICAgICAgICAgICAvL3NpemUgLSBpbiBnZW8gdW5pdFxuICAgICAgICAgICAgbGV0IGsgPSB0aGlzLnNpemUoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKVxuICAgICAgICAgICAgayA9IGsgPCAwID8gMCA6IGsgPiAxID8gMSA6IGtcbiAgICAgICAgICAgIGNvbnN0IHNHMiA9IGsgKiByMlxuXG4gICAgICAgICAgICAvL3NoYXBlXG4gICAgICAgICAgICBjb25zdCBzaGFwZSA9IHRoaXMuc2hhcGUgPyB0aGlzLnNoYXBlKGNlbGwpIDogJ28nXG4gICAgICAgICAgICBpZiAoc2hhcGUgPT09ICdub25lJykgY29udGludWVcblxuICAgICAgICAgICAgLy9nZXQgb2Zmc2V0XG4gICAgICAgICAgICAvL1RPRE8gdXNlXG4gICAgICAgICAgICAvL2NvbnN0IG9mZnNldCA9IHRoaXMub2Zmc2V0KGNlbGwsIHIsIHopXG5cbiAgICAgICAgICAgIC8vY2VudGVyIHBvc2l0aW9uXG4gICAgICAgICAgICBjb25zdCBjeCA9IGNlbGwueCArIHIyXG4gICAgICAgICAgICBjb25zdCBjeSA9IGNlbGwueSArIHIyXG5cbiAgICAgICAgICAgIGlmIChzaGFwZSA9PT0gJ3AnKSB7XG4gICAgICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICAgICAgY3R4Lm1vdmVUbyhjeCwgY3kgKyByMilcbiAgICAgICAgICAgICAgICBjdHgubGluZVRvKGN4ICsgc0cyLCBjeSArIHNHMilcbiAgICAgICAgICAgICAgICBjdHgubGluZVRvKGN4ICsgcjIsIGN5KVxuICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oY3ggKyBzRzIsIGN5IC0gc0cyKVxuICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oY3gsIGN5IC0gcjIpXG4gICAgICAgICAgICAgICAgY3R4LmxpbmVUbyhjeCAtIHNHMiwgY3kgLSBzRzIpXG4gICAgICAgICAgICAgICAgY3R4LmxpbmVUbyhjeCAtIHIyLCBjeSlcbiAgICAgICAgICAgICAgICBjdHgubGluZVRvKGN4IC0gc0cyLCBjeSArIHNHMilcbiAgICAgICAgICAgICAgICBjdHguZmlsbCgpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNoYXBlID09PSAnbycpIHtcbiAgICAgICAgICAgICAgICBjdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICBjdHgubW92ZVRvKGN4LCBjeSArIHNHMilcbiAgICAgICAgICAgICAgICBjdHgubGluZVRvKGN4ICsgcjIsIGN5ICsgcjIpXG4gICAgICAgICAgICAgICAgY3R4LmxpbmVUbyhjeCArIHNHMiwgY3kpXG4gICAgICAgICAgICAgICAgY3R4LmxpbmVUbyhjeCArIHIyLCBjeSAtIHIyKVxuICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oY3gsIGN5IC0gc0cyKVxuICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oY3ggLSByMiwgY3kgLSByMilcbiAgICAgICAgICAgICAgICBjdHgubGluZVRvKGN4IC0gc0cyLCBjeSlcbiAgICAgICAgICAgICAgICBjdHgubGluZVRvKGN4IC0gcjIsIGN5ICsgcjIpXG4gICAgICAgICAgICAgICAgY3R4LmZpbGwoKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgc2hhcGU6JyArIHNoYXBlKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy91cGRhdGUgbGVnZW5kc1xuICAgICAgICB0aGlzLnVwZGF0ZUxlZ2VuZHMoeyBzdHlsZTogdGhpcywgcmVzb2x1dGlvbjogcmVzb2x1dGlvbiwgejogeiwgdmlld1NjYWxlOiB2aWV3U2NhbGUgfSlcbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IFN0eWxlIH0gZnJvbSAnLi4vY29yZS9TdHlsZS5qcydcblxuLyoqXG4gKiBAbW9kdWxlIHN0eWxlXG4gKiBAYXV0aG9yIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBQaWxsYXJTdHlsZSBleHRlbmRzIFN0eWxlIHtcbiAgICAvKiogQHBhcmFtIHtvYmplY3R9IG9wdHMgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBoZWlnaHQgb2YgdGhlIGxpbmUgcmVwcmVzZW50aW5nIGEgY2VsbCwgaW4gZ2VvIHVuaXRcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbCwgbnVtYmVyLCBudW1iZXIsIG9iamVjdCk6bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLmhlaWdodCA9IG9wdHMuaGVpZ2h0XG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBjb2xvciBvZiB0aGUgbGluZSByZXByZXNlbnRpbmcgYSBjZWxsLlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLCBudW1iZXIsIG51bWJlciwgb2JqZWN0KTpzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuY29sb3IgPSBvcHRzLmNvbG9yIHx8ICgoKSA9PiAnI2MwOGM1OScpIC8vKGMscix6LHZzKSA9PiB7fVxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgd2lkdGggb2YgdGhlIGxpbmUgcmVwcmVzZW50aW5nIGEgY2VsbCwgaW4gZ2VvIHVuaXRcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbCwgbnVtYmVyLCBudW1iZXIsIG9iamVjdCk6bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLndpZHRoID0gb3B0cy53aWR0aCB8fCAoKGNlbGwsIHJlc29sdXRpb24pID0+IDAuNSAqIHJlc29sdXRpb24pXG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSB3aWR0aCBvZiB0aGUgbGluZSByZXByZXNlbnRpbmcgYSBjZWxsLCBpbiBnZW8gdW5pdFxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyLCBudW1iZXIsb2JqZWN0KTpib29sZWFufSAqL1xuICAgICAgICB0aGlzLnNpbXBsZSA9IG9wdHMuc2ltcGxlIHx8ICgoKSA9PiBmYWxzZSlcblxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgdGhpcy52aWV3SGVpZ2h0RmFjdG9yID0gb3B0cy52aWV3SGVpZ2h0RmFjdG9yIHx8IDEuNVxuICAgICAgICAvLzAsMCBpcyB0aGUgY2VudGVyXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLnZpZXdTWCA9IG9wdHMudmlld1NYID09IHVuZGVmaW5lZCA/IDAgOiBvcHRzLnZpZXdTWFxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgdGhpcy52aWV3U1kgPSBvcHRzLnZpZXdTWSA9PSB1bmRlZmluZWQgPyAtMC41IDogb3B0cy52aWV3U1lcblxuICAgICAgICAvL1RPRE8gcmVwbGFjZSB3aXRoIHN1biBsb2NhdGlvbiA/XG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLnNoYWRvd0RpcmVjdGlvbiA9XG4gICAgICAgICAgICBvcHRzLnNoYWRvd0RpcmVjdGlvbiA9PSB1bmRlZmluZWQgPyAoLTQwLjMgKiBNYXRoLlBJKSAvIDE4MC4wIDogb3B0cy5zaGFkb3dEaXJlY3Rpb25cbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgIHRoaXMuc2hhZG93RmFjdG9yID0gb3B0cy5zaGFkb3dGYWN0b3IgfHwgMC4zXG4gICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLnNoYWRvd0NvbG9yID0gb3B0cy5zaGFkb3dDb2xvciB8fCAnIzAwMDAwMDMzJ1xuXG4gICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLm91dGxpbmVDb2wgPSBvcHRzLm91dGxpbmVDb2wgfHwgJyNGRkZGRkYnXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLm91dGxpbmVXaWR0aFBpeCA9IG9wdHMub3V0bGluZVdpZHRoUGl4ID09IHVuZGVmaW5lZCA/IDAuNSA6IG9wdHMub3V0bGluZVdpZHRoUGl4XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRHJhdyBjZWxscyBhcyBzZWdtZW50cy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7QXJyYXkuPGltcG9ydChcIi4uL2NvcmUvRGF0YXNldFwiKS5DZWxsPn0gY2VsbHNcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvcmUvR2VvQ2FudmFzXCIpLkdlb0NhbnZhc30gZ2VvQ2FudmFzXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJlc29sdXRpb25cbiAgICAgKi9cbiAgICBkcmF3KGNlbGxzLCBnZW9DYW52YXMsIHJlc29sdXRpb24pIHtcbiAgICAgICAgLy9maWx0ZXJcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyKSBjZWxscyA9IGNlbGxzLmZpbHRlcih0aGlzLmZpbHRlcilcblxuICAgICAgICAvL1xuICAgICAgICBjb25zdCB6ID0gZ2VvQ2FudmFzLnZpZXcuelxuICAgICAgICBjb25zdCBjdHggPSBnZW9DYW52YXMub2Zmc2NyZWVuQ3R4XG5cbiAgICAgICAgLy9nZXQgdmlldyBzY2FsZVxuICAgICAgICBjb25zdCB2aWV3U2NhbGUgPSB0aGlzLnZpZXdTY2FsZSA/IHRoaXMudmlld1NjYWxlKGNlbGxzLCByZXNvbHV0aW9uLCB6KSA6IHVuZGVmaW5lZFxuXG4gICAgICAgIC8vZ2V0IHZpZXcgY2VudGVyIGdlbyBwb3NpdGlvblxuICAgICAgICBjb25zdCBjdnggPSBnZW9DYW52YXMudmlldy54ICsgdGhpcy52aWV3U1ggKiBnZW9DYW52YXMudyAqIHpcbiAgICAgICAgY29uc3QgY3Z5ID0gZ2VvQ2FudmFzLnZpZXcueSArIHRoaXMudmlld1NZICogZ2VvQ2FudmFzLmggKiB6XG4gICAgICAgIC8vZ2V0IHZpZXcgaGVpZ2h0XG4gICAgICAgIGNvbnN0IEggPSB0aGlzLnZpZXdIZWlnaHRGYWN0b3IgKiAoZ2VvQ2FudmFzLncgKyBnZW9DYW52YXMuaCkgKiAwLjUgKiB6XG5cbiAgICAgICAgLy9zb3J0IGNlbGxzIGJ5IHkgYW5kIHhcbiAgICAgICAgLy9jb25zdCBkaXN0VG9WaWV3Q2VudGVyID0gKGMpID0+IHsgY29uc3QgZHggPSBjdnggLSBjLngsIGR5ID0gY3Z5IC0gYy55OyByZXR1cm4gTWF0aC5zcXJ0KGR4ICogZHggKyBkeSAqIGR5KSB9XG4gICAgICAgIGNlbGxzLnNvcnQoKGMxLCBjMikgPT4gMTAwMDAwMDAwICogKGMyLnkgLSBjMS55KSArIGMxLnggLSBjMi54KVxuXG4gICAgICAgIC8vZ2V0IHNpbXBsZSBpbmZvcm1hdGlvblxuICAgICAgICBjb25zdCBzaW1wbGUgPSB0aGlzLnNpbXBsZShyZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpXG5cbiAgICAgICAgY3R4LmxpbmVDYXAgPSBzaW1wbGUgPyAnYnV0dCcgOiAncm91bmQnXG5cbiAgICAgICAgLy9kcmF3IHNoYWRvd3NcbiAgICAgICAgY3R4LnN0cm9rZVN0eWxlID0gdGhpcy5zaGFkb3dDb2xvclxuICAgICAgICBjdHguZmlsbFN0eWxlID0gdGhpcy5zaGFkb3dDb2xvclxuICAgICAgICBmb3IgKGxldCBjZWxsIG9mIGNlbGxzKSB7XG4gICAgICAgICAgICAvL3dpZHRoXG4gICAgICAgICAgICAvKiogQHR5cGUge251bWJlcnx1bmRlZmluZWR9ICovXG4gICAgICAgICAgICBjb25zdCB3RyA9IHRoaXMud2lkdGggPyB0aGlzLndpZHRoKGNlbGwsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgOiB1bmRlZmluZWRcbiAgICAgICAgICAgIGlmICghd0cgfHwgd0cgPCAwKSBjb250aW51ZVxuXG4gICAgICAgICAgICAvL2hlaWdodFxuICAgICAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ8dW5kZWZpbmVkfSAqL1xuICAgICAgICAgICAgY29uc3QgaEcgPSB0aGlzLmhlaWdodCA/IHRoaXMuaGVpZ2h0KGNlbGwsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgOiB1bmRlZmluZWRcbiAgICAgICAgICAgIGlmICghaEcgfHwgaEcgPCAwKSBjb250aW51ZVxuXG4gICAgICAgICAgICAvL2dldCBvZmZzZXRcbiAgICAgICAgICAgIC8vVE9ETyB1c2UgdGhhdFxuICAgICAgICAgICAgLy9jb25zdCBvZmZzZXQgPSB0aGlzLm9mZnNldChjLCByZXNvbHV0aW9uLCB6KVxuXG4gICAgICAgICAgICAvL3NldCB3aWR0aFxuICAgICAgICAgICAgY3R4LmxpbmVXaWR0aCA9IHdHXG5cbiAgICAgICAgICAgIC8vY29tcHV0ZSBjZWxsIGNlbnRlciBwb3N0aXRpb25cbiAgICAgICAgICAgIGNvbnN0IGN4ID0gY2VsbC54ICsgcmVzb2x1dGlvbiAvIDJcbiAgICAgICAgICAgIGNvbnN0IGN5ID0gY2VsbC55ICsgcmVzb2x1dGlvbiAvIDJcbiAgICAgICAgICAgIGNvbnN0IGxzID0gaEcgKiB0aGlzLnNoYWRvd0ZhY3RvclxuXG4gICAgICAgICAgICAvL2RyYXcgc2VnbWVudFxuICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICBjdHgubW92ZVRvKGN4LCBjeSlcbiAgICAgICAgICAgIGN0eC5saW5lVG8oY3ggKyBscyAqIE1hdGguY29zKHRoaXMuc2hhZG93RGlyZWN0aW9uKSwgY3kgKyBscyAqIE1hdGguc2luKHRoaXMuc2hhZG93RGlyZWN0aW9uKSlcbiAgICAgICAgICAgIGN0eC5zdHJva2UoKVxuXG4gICAgICAgICAgICAvKlxuICAgICAgICAgICAgaWYgKHRoaXMuc2ltcGxlKSB7XG4gICAgICAgICAgICAgICAgLy9kcmF3IGJhc2UgY2lyY2xlXG4gICAgICAgICAgICAgICAgY2cuY3R4LmJlZ2luUGF0aCgpO1xuICAgICAgICAgICAgICAgIGNnLmN0eC5hcmMoXG4gICAgICAgICAgICAgICAgICAgIGN4LCBjeSxcbiAgICAgICAgICAgICAgICAgICAgd0cgKiAwLjUsXG4gICAgICAgICAgICAgICAgICAgIDAsIDIgKiBNYXRoLlBJLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgLy9jZy5jdHguc3Ryb2tlKCk7XG4gICAgICAgICAgICAgICAgY2cuY3R4LmZpbGwoKTtcbiAgICAgICAgICAgIH0qL1xuICAgICAgICB9XG5cbiAgICAgICAgLy9kcmF3IHBpbGxhcnNcbiAgICAgICAgZm9yIChsZXQgY2VsbCBvZiBjZWxscykge1xuICAgICAgICAgICAgLy9jb2xvclxuICAgICAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd8dW5kZWZpbmVkfSAqL1xuICAgICAgICAgICAgY29uc3QgY29sID0gdGhpcy5jb2xvciA/IHRoaXMuY29sb3IoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgaWYgKCFjb2wpIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIC8vd2lkdGhcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfHVuZGVmaW5lZH0gKi9cbiAgICAgICAgICAgIGNvbnN0IHdHID0gdGhpcy53aWR0aCA/IHRoaXMud2lkdGgoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgaWYgKCF3RyB8fCB3RyA8IDApIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIC8vaGVpZ2h0XG4gICAgICAgICAgICAvKiogQHR5cGUge251bWJlcnx1bmRlZmluZWR9ICovXG4gICAgICAgICAgICBjb25zdCBoRyA9IHRoaXMuaGVpZ2h0ID8gdGhpcy5oZWlnaHQoY2VsbCwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgaWYgKCFoRyB8fCBoRyA8IDApIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIC8vZ2V0IG9mZnNldFxuICAgICAgICAgICAgLy9UT0RPIHVzZSB0aGF0XG4gICAgICAgICAgICAvL2NvbnN0IG9mZnNldCA9IHRoaXMub2Zmc2V0KGMsIHJlc29sdXRpb24sIHopXG5cbiAgICAgICAgICAgIC8vY29tcHV0ZSBjZWxsIGNlbnRlciBwb3N0aXRpb25cbiAgICAgICAgICAgIGNvbnN0IGN4ID0gY2VsbC54ICsgcmVzb2x1dGlvbiAvIDJcbiAgICAgICAgICAgIGNvbnN0IGN5ID0gY2VsbC55ICsgcmVzb2x1dGlvbiAvIDJcblxuICAgICAgICAgICAgLy9jb21wdXRlIGFuZ2xlXG4gICAgICAgICAgICBjb25zdCBkeCA9IGN4IC0gY3Z4LFxuICAgICAgICAgICAgICAgIGR5ID0gY3kgLSBjdnlcbiAgICAgICAgICAgIGNvbnN0IGEgPSBNYXRoLmF0YW4yKGR5LCBkeClcbiAgICAgICAgICAgIGNvbnN0IEQgPSBNYXRoLnNxcnQoZHggKiBkeCArIGR5ICogZHkpXG4gICAgICAgICAgICBjb25zdCBkID0gKEQgKiBoRykgLyAoSCAtIGhHKVxuXG4gICAgICAgICAgICBpZiAoc2ltcGxlKSB7XG4gICAgICAgICAgICAgICAgLy9kcmF3IHNlZ21lbnRcbiAgICAgICAgICAgICAgICBjdHguc3Ryb2tlU3R5bGUgPSBjb2xcbiAgICAgICAgICAgICAgICBjdHgubGluZVdpZHRoID0gd0dcbiAgICAgICAgICAgICAgICBjdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICBjdHgubW92ZVRvKGN4LCBjeSlcbiAgICAgICAgICAgICAgICBjdHgubGluZVRvKGN4ICsgZCAqIE1hdGguY29zKGEpLCBjeSArIGQgKiBNYXRoLnNpbihhKSlcbiAgICAgICAgICAgICAgICBjdHguc3Ryb2tlKClcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy9kcmF3IGJhY2tncm91bmQgc2VnbWVudFxuICAgICAgICAgICAgICAgIGN0eC5zdHJva2VTdHlsZSA9IHRoaXMub3V0bGluZUNvbFxuICAgICAgICAgICAgICAgIGN0eC5saW5lV2lkdGggPSB3RyArIDIgKiB0aGlzLm91dGxpbmVXaWR0aFBpeCAqIHpcbiAgICAgICAgICAgICAgICBjdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICBjdHgubW92ZVRvKGN4LCBjeSlcbiAgICAgICAgICAgICAgICBjdHgubGluZVRvKGN4ICsgZCAqIE1hdGguY29zKGEpLCBjeSArIGQgKiBNYXRoLnNpbihhKSlcbiAgICAgICAgICAgICAgICBjdHguc3Ryb2tlKClcblxuICAgICAgICAgICAgICAgIC8vZHJhdyBzZWdtZW50XG4gICAgICAgICAgICAgICAgY3R4LnN0cm9rZVN0eWxlID0gY29sXG4gICAgICAgICAgICAgICAgY3R4LmxpbmVXaWR0aCA9IHdHXG4gICAgICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICAgICAgY3R4Lm1vdmVUbyhjeCwgY3kpXG4gICAgICAgICAgICAgICAgY3R4LmxpbmVUbyhjeCArIGQgKiBNYXRoLmNvcyhhKSwgY3kgKyBkICogTWF0aC5zaW4oYSkpXG4gICAgICAgICAgICAgICAgY3R4LnN0cm9rZSgpXG5cbiAgICAgICAgICAgICAgICAvL2RyYXcgdG9wIGNpcmNsZVxuICAgICAgICAgICAgICAgIGN0eC5zdHJva2VTdHlsZSA9IHRoaXMub3V0bGluZUNvbFxuICAgICAgICAgICAgICAgIC8vY2cuY3R4LmZpbGxTdHlsZSA9IFwiI2MwOGM1OVwiXG4gICAgICAgICAgICAgICAgY3R4LmxpbmVXaWR0aCA9IHRoaXMub3V0bGluZVdpZHRoUGl4ICogelxuICAgICAgICAgICAgICAgIGN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgICAgIGN0eC5hcmMoY3ggKyBkICogTWF0aC5jb3MoYSksIGN5ICsgZCAqIE1hdGguc2luKGEpLCB3RyAqIDAuNSwgMCwgMiAqIE1hdGguUEksIGZhbHNlKVxuICAgICAgICAgICAgICAgIGN0eC5zdHJva2UoKVxuICAgICAgICAgICAgICAgIC8vY2cuY3R4LmZpbGwoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vaW4gY2FzZS4uLlxuICAgICAgICBjdHgubGluZUNhcCA9ICdidXR0J1xuXG4gICAgICAgIC8vdXBkYXRlIGxlZ2VuZHNcbiAgICAgICAgdGhpcy51cGRhdGVMZWdlbmRzKHsgc3R5bGU6IHRoaXMsIHJlc29sdXRpb246IHJlc29sdXRpb24sIHo6IHosIHZpZXdTY2FsZTogdmlld1NjYWxlIH0pXG4gICAgfVxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBTdHlsZSB9IGZyb20gJy4uL2NvcmUvU3R5bGUuanMnXG5cbi8qKlxuICogQSBzdHlsZSB3aGVyZSBlYWNoIGNlbGwgaXMgcmVwcmVzZW50ZWQgYnkgYSBzZWdtZW50IHdob3NlIGxlbmd0aCwgd2lkdGgsIGNvbG9yIGFuZCBvcmllbnRhdGlvbiBjYW4gdmFyeSBhY2NvcmRpbmcgdG8gc3RhdGlzdGljYWwgdmFsdWVzLlxuICpcbiAqIEBtb2R1bGUgc3R5bGVcbiAqIEBhdXRob3IgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIFNlZ21lbnRTdHlsZSBleHRlbmRzIFN0eWxlIHtcbiAgICAvKiogQHBhcmFtIHtvYmplY3R9IG9wdHMgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBjb2xvciBvZiB0aGUgY2VsbCBzZWdtZW50LlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLCBudW1iZXIsIG51bWJlciwgb2JqZWN0KTpzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuY29sb3IgPSBvcHRzLmNvbG9yIHx8ICgoKSA9PiAnI0VBNkJBQycpIC8vKGMscix6LHZzKSA9PiB7fVxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgd2lkdGggb2YgdGhlIHNlZ21lbnQgcmVwcmVzZW50aW5nIGEgY2VsbCwgaW4gZ2VvIHVuaXRcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbCwgbnVtYmVyLCBudW1iZXIsIG9iamVjdCk6bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLndpZHRoID0gb3B0cy53aWR0aCB8fCAoKGNlbGwsIHJlc29sdXRpb24pID0+IHJlc29sdXRpb24gKiAwLjEpIC8vKGMscix6LHZzKSA9PiB7fVxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgbGVuZ3RoIG9mIHRoZSBzZWdtZW50IHJlcHJlc2VudGluZyBhIGNlbGwsIGluIGdlbyB1bml0XG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwsIG51bWJlciwgbnVtYmVyLCBvYmplY3QpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy5sZW5ndGggPSBvcHRzLmxlbmd0aCB8fCAoKGNlbGwsIHJlc29sdXRpb24pID0+IHJlc29sdXRpb24gKiAwLjkpIC8vKGMscix6LHZzKSA9PiB7fVxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgb3JpZW50YXRpb24gKGluIGRlZ3JlZXMpIG9mIHRoZSBzZWdtZW50IHJlcHJlc2VudGluZyBhIGNlbGwuXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwsIG51bWJlciwgbnVtYmVyLCBvYmplY3QpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy5vcmllbnRhdGlvbiA9IG9wdHMub3JpZW50YXRpb24gfHwgKCgpID0+IDE4MCAqIE1hdGgucmFuZG9tKCkpIC8vKGMscix6LHZzKSA9PiB7fVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERyYXcgY2VsbHMgYXMgc2VnbWVudHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXRcIikuQ2VsbD59IGNlbGxzXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhc1wiKS5HZW9DYW52YXN9IGdlb0NhbnZhc1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByZXNvbHV0aW9uXG4gICAgICovXG4gICAgZHJhdyhjZWxscywgZ2VvQ2FudmFzLCByZXNvbHV0aW9uKSB7XG4gICAgICAgIC8vZmlsdGVyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlcikgY2VsbHMgPSBjZWxscy5maWx0ZXIodGhpcy5maWx0ZXIpXG5cbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgeiA9IGdlb0NhbnZhcy52aWV3LnpcbiAgICAgICAgY29uc3QgY3R4ID0gZ2VvQ2FudmFzLm9mZnNjcmVlbkN0eFxuXG4gICAgICAgIC8vZ2V0IHZpZXcgc2NhbGVcbiAgICAgICAgY29uc3Qgdmlld1NjYWxlID0gdGhpcy52aWV3U2NhbGUgPyB0aGlzLnZpZXdTY2FsZShjZWxscywgcmVzb2x1dGlvbiwgeikgOiB1bmRlZmluZWRcblxuICAgICAgICAvL1xuICAgICAgICBjdHgubGluZUNhcCA9ICdidXR0J1xuXG4gICAgICAgIC8vY29udmVyc2lvbiBmYWN0b3IgZGVncmVlIC0+IHJhZGlhblxuICAgICAgICBjb25zdCBmID0gTWF0aC5QSSAvIDE4MFxuXG4gICAgICAgIGZvciAobGV0IGNlbGwgb2YgY2VsbHMpIHtcbiAgICAgICAgICAgIC8vY29sb3JcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfHVuZGVmaW5lZH0gKi9cbiAgICAgICAgICAgIGNvbnN0IGNvbCA9IHRoaXMuY29sb3IgPyB0aGlzLmNvbG9yKGNlbGwsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgOiB1bmRlZmluZWRcbiAgICAgICAgICAgIGlmICghY29sKSBjb250aW51ZVxuXG4gICAgICAgICAgICAvL3dpZHRoXG4gICAgICAgICAgICAvKiogQHR5cGUge251bWJlcnx1bmRlZmluZWR9ICovXG4gICAgICAgICAgICBjb25zdCB3RyA9IHRoaXMud2lkdGggPyB0aGlzLndpZHRoKGNlbGwsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgOiB1bmRlZmluZWRcbiAgICAgICAgICAgIGlmICghd0cgfHwgd0cgPCAwKSBjb250aW51ZVxuXG4gICAgICAgICAgICAvL2xlbmd0aFxuICAgICAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ8dW5kZWZpbmVkfSAqL1xuICAgICAgICAgICAgY29uc3QgbEcgPSB0aGlzLmxlbmd0aCA/IHRoaXMubGVuZ3RoKGNlbGwsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgOiB1bmRlZmluZWRcbiAgICAgICAgICAgIGlmICghbEcgfHwgbEcgPCAwKSBjb250aW51ZVxuXG4gICAgICAgICAgICAvL29yaWVudGF0aW9uIChpbiByYWRpYW4pXG4gICAgICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgICAgIGNvbnN0IG9yID0gdGhpcy5vcmllbnRhdGlvbihjZWxsLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpICogZlxuICAgICAgICAgICAgaWYgKG9yID09PSB1bmRlZmluZWQgfHwgaXNOYU4ob3IpKSBjb250aW51ZVxuXG4gICAgICAgICAgICAvL2dldCBvZmZzZXRcbiAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMub2Zmc2V0KGNlbGwsIHJlc29sdXRpb24sIHopXG5cbiAgICAgICAgICAgIC8vc2V0IGNvbG9yIGFuZCB3aWR0aFxuICAgICAgICAgICAgY3R4LnN0cm9rZVN0eWxlID0gY29sXG4gICAgICAgICAgICBjdHgubGluZVdpZHRoID0gd0dcblxuICAgICAgICAgICAgLy9jb21wdXRlIHNlZ21lbnQgY2VudGVyIHBvc3RpdGlvblxuICAgICAgICAgICAgY29uc3QgY3ggPSBjZWxsLnggKyByZXNvbHV0aW9uIC8gMiArIG9mZnNldC5keFxuICAgICAgICAgICAgY29uc3QgY3kgPSBjZWxsLnkgKyByZXNvbHV0aW9uIC8gMiArIG9mZnNldC5keVxuXG4gICAgICAgICAgICAvL2NvbXB1dGUgc2VnbWVudCBkaXJlY3Rpb25cbiAgICAgICAgICAgIGNvbnN0IGR4ID0gMC41ICogTWF0aC5jb3Mob3IpICogbEdcbiAgICAgICAgICAgIGNvbnN0IGR5ID0gMC41ICogTWF0aC5zaW4ob3IpICogbEdcblxuICAgICAgICAgICAgLy9kcmF3IHNlZ21lbnRcbiAgICAgICAgICAgIGN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgY3R4Lm1vdmVUbyhjeCAtIGR4LCBjeSAtIGR5KVxuICAgICAgICAgICAgY3R4LmxpbmVUbyhjeCArIGR4LCBjeSArIGR5KVxuICAgICAgICAgICAgY3R4LnN0cm9rZSgpXG4gICAgICAgIH1cblxuICAgICAgICAvL3VwZGF0ZSBsZWdlbmRzXG4gICAgICAgIHRoaXMudXBkYXRlTGVnZW5kcyh7IHZpZXdTY2FsZTogdmlld1NjYWxlLCByZXNvbHV0aW9uOiByZXNvbHV0aW9uLCB6OiB6LCBjZWxsczogY2VsbHMgfSlcbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IFNpZGVTdHlsZSB9IGZyb20gJy4vU2lkZVN0eWxlLmpzJ1xuaW1wb3J0IHsgbWF4IH0gZnJvbSAnZDMtYXJyYXknXG5cbi8qKiBAdHlwZWRlZiB7eyB4Om51bWJlciwgeTpudW1iZXIsIG9yOlwidlwifFwiaFwiLCBjMTooaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsKXx1bmRlZmluZWQsIGMyOihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwpfHVuZGVmaW5lZCB9fSBTaWRlICovXG5cblxuLyoqXG4gKiBAbW9kdWxlIHN0eWxlXG4gKiBAYXV0aG9yIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBTaGFkaW5nU3R5bGUgZXh0ZW5kcyBTaWRlU3R5bGUge1xuXG4gICAgLyoqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG9wdHMuZWxldmF0aW9uXG4gICAgICogQHBhcmFtIHtib29sZWFufSBvcHRzLmRpYW1vbmRcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBvcHRzLnNjYWxlXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbn0gb3B0cy53aWR0aFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBvcHRzLnJlbGllZkRpcmVjdGlvblxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRzLmNvbG9yVG9wTGVmdFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRzLmNvbG9yQm90dG9tUmlnaHRcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzID0ge30pIHtcbiAgICAgICAgc3VwZXIob3B0cylcblxuICAgICAgICAvKiogVGhlIGNlbGwgZWxldmF0aW9uIGZpZWxkIG5hbWVcbiAgICAgICAgICogQHR5cGUge3N0cmluZ30gKi9cbiAgICAgICAgY29uc3QgZWxldmF0aW9uID0gb3B0cy5lbGV2YXRpb25cblxuICAgICAgICAvLyBjb21wdXRlIHNpZGUgdmFsdWUgYXMgZWxldmF0aW9uIGRpZmZlcmVuY2UgYW5kIGF0dGFjaCB0byBzaWRlXG4gICAgICAgIGNvbnN0IHNpZGVWYWx1ZSA9ICgvKiogQHR5cGUge1NpZGV9ICovIHNpZGUpID0+IHtcbiAgICAgICAgICAgIGlmICghc2lkZS5jMSkgc2lkZS52ID0gMFxuICAgICAgICAgICAgZWxzZSBpZiAoIXNpZGUuYzIpIHNpZGUudiA9IDBcbiAgICAgICAgICAgIGVsc2UgaWYgKCFzaWRlLmMxW2VsZXZhdGlvbl0pIHNpZGUudiA9IDBcbiAgICAgICAgICAgIGVsc2UgaWYgKCFzaWRlLmMyW2VsZXZhdGlvbl0pIHNpZGUudiA9IDBcbiAgICAgICAgICAgIGVsc2Ugc2lkZS52ID0gK3NpZGUuYzJbZWxldmF0aW9uXSAtIHNpZGUuYzFbZWxldmF0aW9uXVxuICAgICAgICAgICAgcmV0dXJuIHNpZGUudlxuICAgICAgICB9XG5cbiAgICAgICAgLy8gY29tcHV0ZSBtYXhpbXVtIHNpZGUgdmFsdWUgZm9yIG5vcm1hbGl6YXRpb25cbiAgICAgICAgdGhpcy52aWV3U2NhbGUgPSBzaWRlcyA9PiBtYXgoc2lkZXMsIHMgPT4gc2lkZVZhbHVlKHMpKVxuXG4gICAgICAgIC8vIGdldCBjb2xvcnNcbiAgICAgICAgbGV0IGNvbG9yVG9wTGVmdCA9IG9wdHMuY29sb3JUb3BMZWZ0IHx8ICcyNTUsMjU1LDI1NSdcbiAgICAgICAgbGV0IGNvbG9yQm90dG9tUmlnaHQgPSBvcHRzLmNvbG9yQm90dG9tUmlnaHQgfHwgJzAsMCwwJ1xuXG4gICAgICAgIC8vIHJldmVydCBjb2xvcnMgKHRvIHJldmVydCB0aGUgcmVsaWVmLCBzaG93IGRlcHJlc3Npb25zIGFzIGhpbGxzKVxuICAgICAgICBjb25zdCByZXZlcnQgPSBvcHRzLnJldmVydCA9PSB1bmRlZmluZWQ/IGZhbHNlIDogb3B0cy5yZXZlcnRcbiAgICAgICAgaWYocmV2ZXJ0KSB7XG4gICAgICAgICAgICBsZXQgYSA9IGNvbG9yVG9wTGVmdFxuICAgICAgICAgICAgY29sb3JUb3BMZWZ0ID0gY29sb3JCb3R0b21SaWdodFxuICAgICAgICAgICAgY29sb3JCb3R0b21SaWdodCA9IGFcbiAgICAgICAgfVxuXG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IHNjYWxlID0gb3B0cy5zY2FsZVxuXG4gICAgICAgIHRoaXMuY29sb3IgPSAoc2lkZSwgcmVzb2x1dGlvbiwgeiwgbWF4KSA9PiB7XG4gICAgICAgICAgICBpZiAoc2lkZS52ID09IDApIHJldHVyblxuICAgICAgICAgICAgbGV0IGNvZWZmID0gTWF0aC5hYnMoc2lkZS52IC8gbWF4KVxuICAgICAgICAgICAgaWYoc2NhbGUpIGNvZWZmID0gc2NhbGUoY29lZmYpXG4gICAgICAgICAgICBpZiAoKHNpZGUudiA8IDAgJiYgc2lkZS5vciA9PT0gJ2gnKSB8fCAoc2lkZS52ID4gMCAmJiBzaWRlLm9yID09PSAndicpKVxuICAgICAgICAgICAgICAgIHJldHVybiAncmdiYSgnICsgY29sb3JUb3BMZWZ0ICsgJywnICsgY29lZmYgKyAnKSdcbiAgICAgICAgICAgIHJldHVybiAncmdiYSgnICsgY29sb3JCb3R0b21SaWdodCArICcsJyArIGNvZWZmICsgJyknXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLndpZHRoID0gKF8sIHIsIHopID0+IG9wdHMud2lkdGggfCBNYXRoLm1pbigyICogeiwgciAvIDMpXG4gICAgICAgIHRoaXMuZGlhbW9uZCA9IG9wdHMuZGlhbW9uZFxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgU3R5bGUgfSBmcm9tICcuLi9jb3JlL1N0eWxlLmpzJ1xuXG4vKipcbiAqIEEgdmVyeSBnZW5lcmljIHN0eWxlIHRoYXQgc2hvd3MgZ3JpZCBjZWxscyB3aXRoIHNwZWNpZmljIGNvbG9yLCBzaXplIGFuZCBzaGFwZS5cbiAqIEl0IGNhbiBiZSB1c2VkIHRvIHNob3cgdmFyaWFibGVzIGFzIGNlbGwgY29sb3JzLCBjZWxsIHNpemUsIGNlbGwgc2hhcGUsIG9yIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgdGhyZWUgdmlzdWFsIHZhcmlhYmxlcy5cbiAqXG4gKiBAbW9kdWxlIHN0eWxlXG4gKiBAYXV0aG9yIEpvc2VwaCBEYXZpZXMsIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBTaGFwZUNvbG9yU2l6ZVN0eWxlIGV4dGVuZHMgU3R5bGUge1xuICAgIC8qKiBAcGFyYW0ge29iamVjdH0gb3B0cyAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cylcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cbiAgICAgICAgLyoqIEB0eXBlIHsoZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLCBudW1iZXIsIG51bWJlciwgb2JqZWN0KTpzdHJpbmcpIHwgc3RyaW5nfSAqL1xuICAgICAgICB0aGlzLmNvbG9yID0gb3B0cy5jb2xvciB8fCAnI0VBNkJBQydcblxuICAgICAgICAvKiogQHR5cGUgeyhmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwsIG51bWJlciwgbnVtYmVyLCBvYmplY3QpOm51bWJlcikgfCBudW1iZXJ9ICovXG4gICAgICAgIHRoaXMuc2l6ZSA9IG9wdHMuc2l6ZSB8fCAoKGNlbGwsIHJlc29sdXRpb24pID0+IHJlc29sdXRpb24pXG5cbiAgICAgICAgLyoqIEB0eXBlIHsoZnVuY3Rpb24oaW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0LmpzXCIpLkNlbGwsbnVtYmVyLCBudW1iZXIsb2JqZWN0KTppbXBvcnQoXCIuLi9jb3JlL1N0eWxlLmpzXCIpLlNoYXBlKSB8IHN0cmluZ30gKi9cbiAgICAgICAgdGhpcy5zaGFwZSA9IG9wdHMuc2hhcGUgfHwgJ3NxdWFyZSdcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEcmF3IGNlbGxzIGFzIHNxdWFyZXMsIHdpdGggdmFyaW91cyBjb2xvcnMgYW5kIHNpemVzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0LmpzXCIpLkNlbGw+fSBjZWxscyAtIFRoZSBncmlkIGNlbGxzIHRvIGRyYXcuXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhcy5qc1wiKS5HZW9DYW52YXN9IGdlb0NhbnZhcyAtIFRoZSBjYW52YXMgdG8gZHJhdyBvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVzb2x1dGlvbiAtIFJlc29sdXRpb24gb2YgdGhlIGdyaWQuXG4gICAgICogQG92ZXJyaWRlXG4gICAgICovXG4gICAgZHJhdyhjZWxscywgZ2VvQ2FudmFzLCByZXNvbHV0aW9uKSB7XG4gICAgICAgIC8vZmlsdGVyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlcikgY2VsbHMgPSBjZWxscy5maWx0ZXIodGhpcy5maWx0ZXIpXG5cbiAgICAgICAgLy96b29tXG4gICAgICAgIGNvbnN0IHogPSBnZW9DYW52YXMudmlldy56XG5cbiAgICAgICAgLy9nZXQgdmlldyBzY2FsZVxuICAgICAgICBjb25zdCB2aWV3U2NhbGUgPSB0aGlzLnZpZXdTY2FsZSA/IHRoaXMudmlld1NjYWxlKGNlbGxzLCByZXNvbHV0aW9uLCB6KSA6IHVuZGVmaW5lZFxuXG4gICAgICAgIGNvbnN0IHIyID0gcmVzb2x1dGlvbiAqIDAuNVxuXG4gICAgICAgIC8vIFByZWNvbXB1dGUgaWYgY29sb3IsIHNpemUsIGFuZCBzaGFwZSBhcmUgZnVuY3Rpb25zLCBmb3IgZWZmaWNpZW5jeVxuICAgICAgICBjb25zdCBpc0NvbG9yRnVuY3Rpb24gPSB0eXBlb2YgdGhpcy5jb2xvciA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICBjb25zdCBpc1NpemVGdW5jdGlvbiA9IHR5cGVvZiB0aGlzLnNpemUgPT09ICdmdW5jdGlvbidcbiAgICAgICAgY29uc3QgaXNTaGFwZUZ1bmN0aW9uID0gdHlwZW9mIHRoaXMuc2hhcGUgPT09ICdmdW5jdGlvbidcblxuICAgICAgICBjb25zdCBkZWZhdWx0Q29sb3IgPSB0aGlzLmNvbG9yIHx8ICdibGFjaydcbiAgICAgICAgY29uc3QgZGVmYXVsdFNpemUgPSB0aGlzLnNpemUgfHwgcmVzb2x1dGlvblxuICAgICAgICBjb25zdCBkZWZhdWx0U2hhcGUgPSB0aGlzLnNoYXBlIHx8ICdzcXVhcmUnXG5cbiAgICAgICAgLy8gT3B0aW1pemVkXG4gICAgICAgIGNvbnN0IGNvbG9yRnVuY3Rpb24gPSBpc0NvbG9yRnVuY3Rpb24gPyB0aGlzLmNvbG9yIDogbnVsbFxuICAgICAgICBjb25zdCBzaXplRnVuY3Rpb24gPSBpc1NpemVGdW5jdGlvbiA/IHRoaXMuc2l6ZSA6IG51bGxcbiAgICAgICAgY29uc3Qgc2hhcGVGdW5jdGlvbiA9IGlzU2hhcGVGdW5jdGlvbiA/IHRoaXMuc2hhcGUgOiBudWxsXG5cbiAgICAgICAgZm9yIChsZXQgYyBvZiBjZWxscykge1xuICAgICAgICAgICAgLy8gRGV0ZXJtaW5lIGNvbG9yXG4gICAgICAgICAgICAvL0B0cy1pZ25vcmVcbiAgICAgICAgICAgIGNvbnN0IGNvbCA9IGNvbG9yRnVuY3Rpb24gPyBjb2xvckZ1bmN0aW9uKGMsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgOiBkZWZhdWx0Q29sb3JcbiAgICAgICAgICAgIGlmICghY29sIHx8IGNvbCA9PT0gJ25vbmUnKSBjb250aW51ZVxuXG4gICAgICAgICAgICAvLyBEZXRlcm1pbmUgc2l6ZVxuICAgICAgICAgICAgLy9AdHMtaWdub3JlXG4gICAgICAgICAgICBjb25zdCBzaXplID0gc2l6ZUZ1bmN0aW9uID8gc2l6ZUZ1bmN0aW9uKGMsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgOiBkZWZhdWx0U2l6ZVxuICAgICAgICAgICAgaWYgKCFzaXplKSBjb250aW51ZVxuXG4gICAgICAgICAgICAvLyBEZXRlcm1pbmUgc2hhcGVcbiAgICAgICAgICAgIC8vQHRzLWlnbm9yZVxuICAgICAgICAgICAgY29uc3Qgc2hhcGUgPSBzaGFwZUZ1bmN0aW9uID8gc2hhcGVGdW5jdGlvbihjLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpIDogZGVmYXVsdFNoYXBlXG4gICAgICAgICAgICBpZiAoc2hhcGUgPT09ICdub25lJykgY29udGludWVcblxuICAgICAgICAgICAgLy9nZXQgb2Zmc2V0XG4gICAgICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLm9mZnNldChjLCByZXNvbHV0aW9uLCB6KVxuXG4gICAgICAgICAgICAvL2dldCBjb250ZXh0XG4gICAgICAgICAgICBjb25zdCBjdHggPSBnZW9DYW52YXMub2Zmc2NyZWVuQ3R4XG4gICAgICAgICAgICBjdHguZmlsbFN0eWxlID0gY29sXG4gICAgICAgICAgICBpZiAoc2hhcGUgPT09ICdzcXVhcmUnKSB7XG4gICAgICAgICAgICAgICAgLy9kcmF3IHNxdWFyZVxuICAgICAgICAgICAgICAgIGNvbnN0IGQgPSByZXNvbHV0aW9uICogKDEgLSBzaXplIC8gcmVzb2x1dGlvbikgKiAwLjVcbiAgICAgICAgICAgICAgICBjdHguZmlsbFJlY3QoYy54ICsgZCArIG9mZnNldC5keCwgYy55ICsgZCArIG9mZnNldC5keSwgc2l6ZSwgc2l6ZSlcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2hhcGUgPT09ICdjaXJjbGUnKSB7XG4gICAgICAgICAgICAgICAgLy9kcmF3IGNpcmNsZVxuICAgICAgICAgICAgICAgIGN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgICAgIGN0eC5hcmMoYy54ICsgcjIgKyBvZmZzZXQuZHgsIGMueSArIHIyICsgb2Zmc2V0LmR5LCBzaXplICogMC41LCAwLCAyICogTWF0aC5QSSwgZmFsc2UpXG4gICAgICAgICAgICAgICAgY3R4LmZpbGwoKVxuICAgICAgICAgICAgfSBlbHNlIGlmIChzaGFwZSA9PT0gJ2RvbnV0Jykge1xuICAgICAgICAgICAgICAgIC8vZHJhdyBkb251dFxuICAgICAgICAgICAgICAgIGNvbnN0IHhjID0gYy54ICsgcjIgKyBvZmZzZXQuZHgsXG4gICAgICAgICAgICAgICAgICAgIHljID0gYy55ICsgcjIgKyBvZmZzZXQuZHlcbiAgICAgICAgICAgICAgICBjdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICBjdHgubW92ZVRvKHhjLCB5YylcbiAgICAgICAgICAgICAgICBjdHguYXJjKHhjLCB5YywgcjIsIDAsIDIgKiBNYXRoLlBJKVxuICAgICAgICAgICAgICAgIGN0eC5hcmMoeGMsIHljLCAoMSAtIHNpemUgLyByZXNvbHV0aW9uKSAqIHIyLCAwLCAyICogTWF0aC5QSSwgdHJ1ZSlcbiAgICAgICAgICAgICAgICBjdHguY2xvc2VQYXRoKClcbiAgICAgICAgICAgICAgICBjdHguZmlsbCgpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNoYXBlID09PSAnZGlhbW9uZCcpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzMiA9IHNpemUgKiAwLjVcbiAgICAgICAgICAgICAgICBjdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICBjdHgubW92ZVRvKGMueCArIHIyIC0gczIsIGMueSArIHIyKVxuICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oYy54ICsgcjIsIGMueSArIHIyICsgczIpXG4gICAgICAgICAgICAgICAgY3R4LmxpbmVUbyhjLnggKyByMiArIHMyLCBjLnkgKyByMilcbiAgICAgICAgICAgICAgICBjdHgubGluZVRvKGMueCArIHIyLCBjLnkgKyByMiAtIHMyKVxuICAgICAgICAgICAgICAgIGN0eC5maWxsKClcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2hhcGUgPT09ICd0cmlhbmdsZV91cCcpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkcjIgPSAoc2l6ZSAtIHJlc29sdXRpb24pIC8gMlxuICAgICAgICAgICAgICAgIGN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgICAgIGN0eC5tb3ZlVG8oYy54IC0gZHIyLCBjLnkgLSBkcjIpXG4gICAgICAgICAgICAgICAgY3R4LmxpbmVUbyhjLnggKyByMiwgYy55ICsgcmVzb2x1dGlvbiArIGRyMilcbiAgICAgICAgICAgICAgICBjdHgubGluZVRvKGMueCArIHJlc29sdXRpb24gKyBkcjIsIGMueSAtIGRyMilcbiAgICAgICAgICAgICAgICBjdHguZmlsbCgpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNoYXBlID09PSAndHJpYW5nbGVfZG93bicpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkcjIgPSAoc2l6ZSAtIHJlc29sdXRpb24pIC8gMlxuICAgICAgICAgICAgICAgIGN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgICAgIGN0eC5tb3ZlVG8oYy54IC0gZHIyLCBjLnkgKyByZXNvbHV0aW9uICsgZHIyKVxuICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oYy54ICsgcjIsIGMueSAtIGRyMilcbiAgICAgICAgICAgICAgICBjdHgubGluZVRvKGMueCArIHJlc29sdXRpb24gKyBkcjIsIGMueSArIHJlc29sdXRpb24gKyBkcjIpXG4gICAgICAgICAgICAgICAgY3R4LmZpbGwoKVxuICAgICAgICAgICAgfSBlbHNlIGlmIChzaGFwZSA9PT0gJ3RyaWFuZ2xlX2xlZnQnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZHIyID0gKHNpemUgLSByZXNvbHV0aW9uKSAvIDJcbiAgICAgICAgICAgICAgICBjdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICBjdHgubW92ZVRvKGMueCArIHJlc29sdXRpb24gKyBkcjIsIGMueSArIHJlc29sdXRpb24gKyBkcjIpXG4gICAgICAgICAgICAgICAgY3R4LmxpbmVUbyhjLnggLSBkcjIsIGMueSArIHIyKVxuICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oYy54ICsgcmVzb2x1dGlvbiArIGRyMiwgYy55IC0gZHIyKVxuICAgICAgICAgICAgICAgIGN0eC5maWxsKClcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2hhcGUgPT09ICd0cmlhbmdsZV9yaWdodCcpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkcjIgPSAoc2l6ZSAtIHJlc29sdXRpb24pIC8gMlxuICAgICAgICAgICAgICAgIGN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgICAgIGN0eC5tb3ZlVG8oYy54IC0gZHIyLCBjLnkgLSBkcjIpXG4gICAgICAgICAgICAgICAgY3R4LmxpbmVUbyhjLnggKyByZXNvbHV0aW9uICsgZHIyLCBjLnkgKyByMilcbiAgICAgICAgICAgICAgICBjdHgubGluZVRvKGMueCAtIGRyMiwgYy55ICsgcmVzb2x1dGlvbiArIGRyMilcbiAgICAgICAgICAgICAgICBjdHguZmlsbCgpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCBzaGFwZTonICsgc2hhcGUpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvL3VwZGF0ZSBsZWdlbmRzXG4gICAgICAgIHRoaXMudXBkYXRlTGVnZW5kcyh7IHZpZXdTY2FsZTogdmlld1NjYWxlLCByZXNvbHV0aW9uOiByZXNvbHV0aW9uLCB6OiB6LCBjZWxsczogY2VsbHMgfSlcbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IFNpZGVTdHlsZSB9IGZyb20gJy4vU2lkZVN0eWxlLmpzJ1xuXG4vKipcbiAqIEEgc3R5bGUgdG8gc2hvdyB0aGUgc2lkZXMgb2YgZ3JpZCBjZWxscyBiYXNlZCBvbiB0aGVpciBkaWZmZXJlbnQgY2F0ZWdvcmllcy5cbiAqXG4gKiBAbW9kdWxlIHN0eWxlXG4gKiBAYXV0aG9yIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBTaWRlQ2F0ZWdvcnlTdHlsZSBleHRlbmRzIFNpZGVTdHlsZSB7XG4gICAgLyoqIEBwYXJhbSB7b2JqZWN0fSBvcHRzICovXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKVxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgY2F0ZWdvcnkgY29kZSBvZiBhIGNlbGwuXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwsIG51bWJlciwgbnVtYmVyKTpzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuY29kZSA9IG9wdHMuY29kZVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgZGljdGlvbmFyeSAoc3RyaW5nIC0+IGNvbG9yKSB3aGljaCBnaXZlIHRoZSBjb2xvciBvZiBlYWNoIGNhdGVnb3J5LlxuICAgICAgICAgKiBAdHlwZSB7b2JqZWN0fSAqL1xuICAgICAgICB0aGlzLmNvbG9yID0gb3B0cy5jb2xvclxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7QXJyYXkuPGltcG9ydChcIi4uL2NvcmUvRGF0YXNldC5qc1wiKS5DZWxsPn0gY2VsbHNcbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvcmUvR2VvQ2FudmFzLmpzXCIpLkdlb0NhbnZhc30gZ2VvQ2FudmFzXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJlc29sdXRpb25cbiAgICAgKi9cbiAgICBkcmF3KGNlbGxzLCBnZW9DYW52YXMsIHJlc29sdXRpb24pIHtcbiAgICAgICAgLy9maWx0ZXJcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyKSBjZWxscyA9IGNlbGxzLmZpbHRlcih0aGlzLmZpbHRlcilcblxuICAgICAgICAvL1xuICAgICAgICBjb25zdCB6ID0gZ2VvQ2FudmFzLnZpZXcuelxuICAgICAgICBjb25zdCBjdHggPSBnZW9DYW52YXMub2Zmc2NyZWVuQ3R4XG5cbiAgICAgICAgLy9idWlsZCBzaWRlc1xuXG4gICAgICAgIC8qKiAgQHR5cGUge0FycmF5LjxpbXBvcnQoJy4vU2lkZVN0eWxlLmpzJykuU2lkZT59ICovXG4gICAgICAgIGNvbnN0IHNpZGVzID0gU2lkZVN0eWxlLmJ1aWxkU2lkZXMoY2VsbHMsIHJlc29sdXRpb24pXG4gICAgICAgIGlmIChzaWRlcy5sZW5ndGggPT0gMCkgcmV0dXJuXG5cbiAgICAgICAgLy9nZXQgc2lkZSB2aWV3IHNjYWxlXG4gICAgICAgIGNvbnN0IHZpZXdTY2FsZSA9IHRoaXMudmlld1NjYWxlID8gdGhpcy52aWV3U2NhbGUoc2lkZXMsIHJlc29sdXRpb24sIHopIDogdW5kZWZpbmVkXG5cbiAgICAgICAgLy9kcmF3IHNpZGVzXG5cbiAgICAgICAgY3R4LmxpbmVDYXAgPSAnYnV0dCdcbiAgICAgICAgY29uc3QgcjIgPSByZXNvbHV0aW9uICogMC41XG4gICAgICAgIGZvciAobGV0IHNpZGUgb2Ygc2lkZXMpIHtcbiAgICAgICAgICAgIC8vZ2V0IGNhdGVnb3J5IGNvZGVzIGZvciBib3RoIGNlbGxzXG4gICAgICAgICAgICBjb25zdCBjb2RlMSA9IHNpZGUuYzEgPyB0aGlzLmNvZGUoc2lkZS5jMSwgcmVzb2x1dGlvbiwgeikgOiB1bmRlZmluZWRcbiAgICAgICAgICAgIGNvbnN0IGNvZGUyID0gc2lkZS5jMiA/IHRoaXMuY29kZShzaWRlLmMyLCByZXNvbHV0aW9uLCB6KSA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgaWYgKGNvZGUxID09IGNvZGUyKSBjb250aW51ZVxuXG4gICAgICAgICAgICAvL3dpZHRoXG4gICAgICAgICAgICAvKiogQHR5cGUge251bWJlcnx1bmRlZmluZWR9ICovXG4gICAgICAgICAgICBjb25zdCB3RyA9IHRoaXMud2lkdGggPyB0aGlzLndpZHRoKHNpZGUsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgOiB1bmRlZmluZWRcbiAgICAgICAgICAgIGlmICghd0cgfHwgd0cgPD0gMCkgY29udGludWVcbiAgICAgICAgICAgIGNvbnN0IHcyID0gd0cgKiAwLjVcblxuICAgICAgICAgICAgLy9zZXQgd2lkdGhcbiAgICAgICAgICAgIGN0eC5saW5lV2lkdGggPSB3R1xuXG4gICAgICAgICAgICAvL2RyYXcgc2VnbWVudCB3aXRoIGNvcnJlY3Qgb3JpZW50YXRpb25cbiAgICAgICAgICAgIGlmIChzaWRlLm9yID09PSAnaCcpIHtcbiAgICAgICAgICAgICAgICAvL3RvcCBsaW5lXG4gICAgICAgICAgICAgICAgaWYgKGNvZGUyKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgICAgICAgICBjdHguc3Ryb2tlU3R5bGUgPSB0aGlzLmNvbG9yW2NvZGUyXVxuICAgICAgICAgICAgICAgICAgICBjdHgubW92ZVRvKHNpZGUueCAtIHIyLCBzaWRlLnkgKyB3MilcbiAgICAgICAgICAgICAgICAgICAgY3R4LmxpbmVUbyhzaWRlLnggKyByMiwgc2lkZS55ICsgdzIpXG4gICAgICAgICAgICAgICAgICAgIGN0eC5zdHJva2UoKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vYm90dG9tIGxpbmVcbiAgICAgICAgICAgICAgICBpZiAoY29kZTEpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICAgICAgICAgIGN0eC5zdHJva2VTdHlsZSA9IHRoaXMuY29sb3JbY29kZTFdXG4gICAgICAgICAgICAgICAgICAgIGN0eC5tb3ZlVG8oc2lkZS54IC0gcjIsIHNpZGUueSAtIHcyKVxuICAgICAgICAgICAgICAgICAgICBjdHgubGluZVRvKHNpZGUueCArIHIyLCBzaWRlLnkgLSB3MilcbiAgICAgICAgICAgICAgICAgICAgY3R4LnN0cm9rZSgpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvL3JpZ2h0IGxpbmVcbiAgICAgICAgICAgICAgICBpZiAoY29kZTIpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICAgICAgICAgIGN0eC5zdHJva2VTdHlsZSA9IHRoaXMuY29sb3JbY29kZTJdXG4gICAgICAgICAgICAgICAgICAgIGN0eC5tb3ZlVG8oc2lkZS54ICsgdzIsIHNpZGUueSAtIHIyKVxuICAgICAgICAgICAgICAgICAgICBjdHgubGluZVRvKHNpZGUueCArIHcyLCBzaWRlLnkgKyByMilcbiAgICAgICAgICAgICAgICAgICAgY3R4LnN0cm9rZSgpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy9sZWZ0IGxpbmVcbiAgICAgICAgICAgICAgICBpZiAoY29kZTEpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICAgICAgICAgIGN0eC5zdHJva2VTdHlsZSA9IHRoaXMuY29sb3JbY29kZTFdXG4gICAgICAgICAgICAgICAgICAgIGN0eC5tb3ZlVG8oc2lkZS54IC0gdzIsIHNpZGUueSAtIHIyKVxuICAgICAgICAgICAgICAgICAgICBjdHgubGluZVRvKHNpZGUueCAtIHcyLCBzaWRlLnkgKyByMilcbiAgICAgICAgICAgICAgICAgICAgY3R4LnN0cm9rZSgpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy91cGRhdGUgbGVnZW5kc1xuICAgICAgICB0aGlzLnVwZGF0ZUxlZ2VuZHMoeyBzdHlsZTogdGhpcywgcmVzb2x1dGlvbjogcmVzb2x1dGlvbiwgejogeiwgdmlld1NjYWxlOiB2aWV3U2NhbGUgfSlcbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IFN0eWxlIH0gZnJvbSAnLi4vY29yZS9TdHlsZS5qcydcblxuLyoqIEB0eXBlZGVmIHt7IHg6bnVtYmVyLCB5Om51bWJlciwgb3I6XCJ2XCJ8XCJoXCIsIGMxOihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldCcpLkNlbGwpfHVuZGVmaW5lZCwgYzI6KGltcG9ydCgnLi4vY29yZS9EYXRhc2V0JykuQ2VsbCl8dW5kZWZpbmVkIH19IFNpZGUgKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7ZnVuY3Rpb24oQXJyYXkuPFNpZGU+LG51bWJlciwgbnVtYmVyKToqfSBTaWRlVmlld1NjYWxlICovXG5cbi8qKlxuICogQG1vZHVsZSBzdHlsZVxuICogQGF1dGhvciBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgU2lkZVN0eWxlIGV4dGVuZHMgU3R5bGUge1xuICAgIC8qKiBAcGFyYW0ge29iamVjdH0gb3B0cyAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMgPSB7fSkge1xuICAgICAgICBzdXBlcihvcHRzKVxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgY29sb3Igb2YgYSBjZWxsIHNpZGUuXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihTaWRlLCBudW1iZXIsIG51bWJlciwgb2JqZWN0KTpzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuY29sb3IgPSBvcHRzLmNvbG9yIHx8ICgoc2lkZSwgcmVzb2x1dGlvbiwgeiwgc2lkZVZpZXdTY2FsZSkgPT4gJyNFQTZCQUMnKVxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgd2lkdGggb2YgYSBjZWxsIHNpZGUsIGluIGdlbyB1bml0XG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihTaWRlLCBudW1iZXIsIG51bWJlciwgb2JqZWN0KTpudW1iZXJ9ICovXG4gICAgICAgIHRoaXMud2lkdGggPSBvcHRzLndpZHRoIHx8ICgoc2lkZSwgcmVzb2x1dGlvbiwgeiwgc2lkZVZpZXdTY2FsZSkgPT4gcmVzb2x1dGlvbiAvIDUpXG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBsZW5ndGggb2YgYSBjZWxsIHNpZGUsIGluIGdlbyB1bml0XG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihTaWRlLCBudW1iZXIsIG51bWJlciwgb2JqZWN0KTpudW1iZXJ9ICovXG4gICAgICAgIHRoaXMubGVuZ3RoID0gb3B0cy5sZW5ndGggfHwgKChzaWRlLCByZXNvbHV0aW9uLCB6LCBzaWRlVmlld1NjYWxlKSA9PiByZXNvbHV0aW9uKVxuXG4gICAgICAgIC8qKiBTZXQgdG8gQSBvciB0cnVlIHNvIHRoYXQgdGhlIHNpZGUgaXMgZHJhd24gYXMgYSBkaWFtb25kICovXG4gICAgICAgIHRoaXMuZGlhbW9uZCA9IG9wdHMuZGlhbW9uZFxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7QXJyYXkuPGltcG9ydChcIi4uL2NvcmUvRGF0YXNldFwiKS5DZWxsPn0gY2VsbHNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVzb2x1dGlvblxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29yZS9HZW9DYW52YXNcIikuR2VvQ2FudmFzfSBnZW9DYW52YXNcbiAgICAgKi9cbiAgICBkcmF3KGNlbGxzLCBnZW9DYW52YXMsIHJlc29sdXRpb24pIHtcbiAgICAgICAgLy9maWx0ZXJcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyKSBjZWxscyA9IGNlbGxzLmZpbHRlcih0aGlzLmZpbHRlcilcblxuICAgICAgICAvL1xuICAgICAgICBjb25zdCB6ID0gZ2VvQ2FudmFzLnZpZXcuelxuICAgICAgICBjb25zdCBjdHggPSBnZW9DYW52YXMub2Zmc2NyZWVuQ3R4XG5cbiAgICAgICAgLy9idWlsZCBzaWRlc1xuXG4gICAgICAgIC8qKiAgQHR5cGUge0FycmF5LjxTaWRlPn0gKi9cbiAgICAgICAgY29uc3Qgc2lkZXMgPSBTaWRlU3R5bGUuYnVpbGRTaWRlcyhjZWxscywgcmVzb2x1dGlvbilcbiAgICAgICAgaWYgKHNpZGVzLmxlbmd0aCA9PSAwKSByZXR1cm5cblxuICAgICAgICAvL2dldCBzaWRlIHZpZXcgc2NhbGVcbiAgICAgICAgY29uc3Qgdmlld1NjYWxlID0gdGhpcy52aWV3U2NhbGUgPyB0aGlzLnZpZXdTY2FsZShzaWRlcywgcmVzb2x1dGlvbiwgeikgOiB1bmRlZmluZWRcblxuICAgICAgICAvL2RyYXcgc2lkZXNcblxuICAgICAgICBjdHgubGluZUNhcCA9ICdidXR0J1xuICAgICAgICBjb25zdCByMiA9IHJlc29sdXRpb24gKiAwLjVcbiAgICAgICAgZm9yIChsZXQgc2lkZSBvZiBzaWRlcykge1xuICAgICAgICAgICAgLy9jb2xvclxuICAgICAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd8dW5kZWZpbmVkfSAqL1xuICAgICAgICAgICAgY29uc3QgY29sID0gdGhpcy5jb2xvciA/IHRoaXMuY29sb3Ioc2lkZSwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgaWYgKCFjb2wgfHwgY29sID09ICdub25lJykgY29udGludWVcblxuICAgICAgICAgICAgaWYgKHRoaXMuZGlhbW9uZCkge1xuICAgICAgICAgICAgICAgIC8vc2V0IGNvbG9yXG4gICAgICAgICAgICAgICAgY3R4LmZpbGxTdHlsZSA9IGNvbFxuXG4gICAgICAgICAgICAgICAgLy9kcmF3IGRpYW1vbmRcbiAgICAgICAgICAgICAgICBjb25zdCB4ID0gc2lkZS54LFxuICAgICAgICAgICAgICAgICAgICB5ID0gc2lkZS55XG4gICAgICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICAgICAgY3R4Lm1vdmVUbyh4IC0gcjIsIHkpXG4gICAgICAgICAgICAgICAgY3R4LmxpbmVUbyh4LCB5ICsgcjIpXG4gICAgICAgICAgICAgICAgY3R4LmxpbmVUbyh4ICsgcjIsIHkpXG4gICAgICAgICAgICAgICAgY3R4LmxpbmVUbyh4LCB5IC0gcjIpXG4gICAgICAgICAgICAgICAgY3R4LmNsb3NlUGF0aCgpXG4gICAgICAgICAgICAgICAgY3R4LmZpbGwoKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvL3dpZHRoXG4gICAgICAgICAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ8dW5kZWZpbmVkfSAqL1xuICAgICAgICAgICAgICAgIGNvbnN0IHdHID0gdGhpcy53aWR0aCA/IHRoaXMud2lkdGgoc2lkZSwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgIGlmICghd0cgfHwgd0cgPD0gMCkgY29udGludWVcblxuICAgICAgICAgICAgICAgIC8vbGVuZ3RoXG4gICAgICAgICAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ8dW5kZWZpbmVkfSAqL1xuICAgICAgICAgICAgICAgIGNvbnN0IGxHID0gdGhpcy5sZW5ndGggPyB0aGlzLmxlbmd0aChzaWRlLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpIDogdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgaWYgKCFsRyB8fCBsRyA8PSAwKSBjb250aW51ZVxuICAgICAgICAgICAgICAgIGNvbnN0IGxHMiA9IGxHICogMC41XG5cbiAgICAgICAgICAgICAgICAvL3NldCB3aWR0aFxuICAgICAgICAgICAgICAgIGN0eC5saW5lV2lkdGggPSB3R1xuICAgICAgICAgICAgICAgIC8vc2V0IGNvbG9yXG4gICAgICAgICAgICAgICAgY3R4LnN0cm9rZVN0eWxlID0gY29sXG5cbiAgICAgICAgICAgICAgICAvL2RyYXcgc2VnbWVudCB3aXRoIGNvcnJlY3Qgb3JpZW50YXRpb25cbiAgICAgICAgICAgICAgICBjb25zdCB4ID0gc2lkZS54LFxuICAgICAgICAgICAgICAgICAgICB5ID0gc2lkZS55XG4gICAgICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICAgICAgaWYgKHNpZGUub3IgPT09ICd2Jykge1xuICAgICAgICAgICAgICAgICAgICBjdHgubW92ZVRvKHgsIHkgLSBsRzIpXG4gICAgICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oeCwgeSArIGxHMilcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjdHgubW92ZVRvKHggLSBsRzIsIHkpXG4gICAgICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oeCArIGxHMiwgeSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY3R4LnN0cm9rZSgpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvL3VwZGF0ZSBsZWdlbmRzXG4gICAgICAgIHRoaXMudXBkYXRlTGVnZW5kcyh7IHN0eWxlOiB0aGlzLCByZXNvbHV0aW9uOiByZXNvbHV0aW9uLCB6OiB6LCB2aWV3U2NhbGU6IHZpZXdTY2FsZSB9KVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQnKS5DZWxsPn0gY2VsbHMgVGhlIGNlbGxzIHRvIHVzZSB0byBidWlsZCB0aGUgc2lkZXMuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJlc29sdXRpb24gVGhlIGNlbGxzIHJlc29sdXRpb25cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHdpdGhIb3Jpem9udGFsIFNldCB0byB0cnVlIHRvIGJ1aWxkIGhvcml6b250YWwgc2lkZXMsIGZhbHNlIG90aGVyd2lzZS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHdpdGhWZXJ0aWNhbCBTZXQgdG8gdHJ1ZSB0byBidWlsZCB2ZXJ0aWNhbCBzaWRlcywgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gY2VudGVyIFNldCB0byB0cnVlIHNvIHRoYXQgdGhlIHNpZGUgY29vcmRpbmF0ZSBhcmUgdGhvc2Ugb2YgaXRzIGNlbnRlciBwb2ludCByYXRoZXIgdGhhbiBpdHMgbGVmdC9ib3R0b20gcG9pbnQgKHRoZSBzaWRlIHgseSBjb29yZGluYXRlcyBhcmUgdGhvc2Ugb2YgdGhlIGxlZnQgcG9pbnQgZm9yIGhvcml6b250YWwgc2lkZXMsIGFuZCBvZiB0aGUgYm90dG9tIHBvaW50IGZvciB2ZXJ0aWNhbCBzaWRlcylcbiAgICAgKiBAcmV0dXJucyB7IEFycmF5LjxTaWRlPiB9XG4gICAgICovXG4gICAgc3RhdGljIGJ1aWxkU2lkZXMoY2VsbHMsIHJlc29sdXRpb24sIHdpdGhIb3Jpem9udGFsID0gdHJ1ZSwgd2l0aFZlcnRpY2FsID0gdHJ1ZSwgY2VudGVyID0gdHJ1ZSwgZXBzID0gMC4wMSkge1xuICAgICAgICAvKiogQHR5cGUgeyBBcnJheS48U2lkZT4gfSAqL1xuICAgICAgICBjb25zdCBzaWRlcyA9IFtdXG5cbiAgICAgICAgLy8gaGFsZiByZXNvbHV0aW9uXG4gICAgICAgIGNvbnN0IHIyID0gY2VudGVyID8gcmVzb2x1dGlvbiAvIDIgOiAwXG5cbiAgICAgICAgLy8gZXBzaWxvblxuICAgICAgICBlcHMgPSByZXNvbHV0aW9uICogZXBzXG4gICAgICAgIGNvbnN0IGFicyA9IE1hdGguYWJzXG5cbiAgICAgICAgLy9tYWtlIGhvcml6b250YWwgc2lkZXNcbiAgICAgICAgLy9zb3J0IGNlbGxzIGJ5IHggYW5kIHlcbiAgICAgICAgY2VsbHMuc29ydCgoYzEsIGMyKSA9PiAoYzIueCA9PSBjMS54ID8gYzEueSAtIGMyLnkgOiBjMS54IC0gYzIueCkpXG4gICAgICAgIGxldCBjMSA9IGNlbGxzWzBdXG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgY2VsbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBjMiA9IGNlbGxzW2ldXG5cbiAgICAgICAgICAgIGlmIChhYnMoYzEueSArIHJlc29sdXRpb24gLSBjMi55KSA8IGVwcyAmJiBhYnMoYzEueCAtIGMyLngpIDwgZXBzKVxuICAgICAgICAgICAgICAgIC8vY2VsbHMgaW4gc2FtZSBjb2x1bW4gYW5kIHRvdWNoIGFsb25nIGhvcml6b250YWwgc2lkZVxuICAgICAgICAgICAgICAgIC8vbWFrZSBzaGFyZWQgc2lkZVxuICAgICAgICAgICAgICAgIHNpZGVzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBvcjogJ2gnLFxuICAgICAgICAgICAgICAgICAgICB4OiBjMS54ICsgcjIsXG4gICAgICAgICAgICAgICAgICAgIHk6IGMyLnksXG4gICAgICAgICAgICAgICAgICAgIGMxOiBjMSxcbiAgICAgICAgICAgICAgICAgICAgYzI6IGMyLFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvL2NlbGxzIGRvIG5vdCB0b3VjaCBhbG9uZyBob3Jpem9udGFsIHNpZGVcbiAgICAgICAgICAgICAgICAvL21ha2UgdHdvIHNpZGVzOiB0b3Agb25lIGZvciBjMSwgYm90dG9tIGZvciBjMlxuICAgICAgICAgICAgICAgIHNpZGVzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBvcjogJ2gnLFxuICAgICAgICAgICAgICAgICAgICB4OiBjMS54ICsgcjIsXG4gICAgICAgICAgICAgICAgICAgIHk6IGMxLnkgKyByZXNvbHV0aW9uLFxuICAgICAgICAgICAgICAgICAgICBjMTogYzEsXG4gICAgICAgICAgICAgICAgICAgIGMyOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICBzaWRlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgb3I6ICdoJyxcbiAgICAgICAgICAgICAgICAgICAgeDogYzIueCArIHIyLFxuICAgICAgICAgICAgICAgICAgICB5OiBjMi55LFxuICAgICAgICAgICAgICAgICAgICBjMTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICBjMjogYzIsXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYzEgPSBjMlxuICAgICAgICB9XG5cbiAgICAgICAgLy9tYWtlIHZlcnRpY2FsIHNpZGVzXG4gICAgICAgIC8vc29ydCBjZWxscyBieSB5IGFuZCB4XG4gICAgICAgIGNlbGxzLnNvcnQoKGMxLCBjMikgPT4gKGMyLnkgPT0gYzEueSA/IGMxLnggLSBjMi54IDogYzEueSAtIGMyLnkpKVxuICAgICAgICBjMSA9IGNlbGxzWzBdXG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgY2VsbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBjMiA9IGNlbGxzW2ldXG5cbiAgICAgICAgICAgIGlmIChhYnMoYzEueCArIHJlc29sdXRpb24gLSBjMi54KSA8IGVwcyAmJiBhYnMoYzEueSAtIGMyLnkpIDwgZXBzKVxuICAgICAgICAgICAgICAgIC8vY2VsbHMgaW4gc2FtZSByb3cgYW5kIHRvdWNoIGFsb25nIHZlcnRpY2FsIHNpZGVcbiAgICAgICAgICAgICAgICAvL21ha2Ugc2hhcmVkIHNpZGVcbiAgICAgICAgICAgICAgICBzaWRlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgb3I6ICd2JyxcbiAgICAgICAgICAgICAgICAgICAgeDogYzEueCArIHJlc29sdXRpb24sXG4gICAgICAgICAgICAgICAgICAgIHk6IGMxLnkgKyByMixcbiAgICAgICAgICAgICAgICAgICAgYzE6IGMxLFxuICAgICAgICAgICAgICAgICAgICBjMjogYzIsXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vY2VsbHMgZG8gbm90IHRvdWNoIGFsb25nIHZlcnRpY2FsIHNpZGVcbiAgICAgICAgICAgICAgICAvL21ha2UgdHdvIHNpZGVzOiByaWdodCBvbmUgZm9yIGMxLCBsZWZ0IGZvciBjMlxuICAgICAgICAgICAgICAgIHNpZGVzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBvcjogJ3YnLFxuICAgICAgICAgICAgICAgICAgICB4OiBjMS54ICsgcmVzb2x1dGlvbixcbiAgICAgICAgICAgICAgICAgICAgeTogYzEueSArIHIyLFxuICAgICAgICAgICAgICAgICAgICBjMTogYzEsXG4gICAgICAgICAgICAgICAgICAgIGMyOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICBzaWRlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgb3I6ICd2JyxcbiAgICAgICAgICAgICAgICAgICAgeDogYzIueCxcbiAgICAgICAgICAgICAgICAgICAgeTogYzIueSArIHIyLFxuICAgICAgICAgICAgICAgICAgICBjMTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICBjMjogYzIsXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYzEgPSBjMlxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzaWRlc1xuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgU3R5bGUgfSBmcm9tICcuLi9jb3JlL1N0eWxlLmpzJ1xuaW1wb3J0IHsgU2lkZVN0eWxlIH0gZnJvbSAnLi9TaWRlU3R5bGUuanMnXG5cbi8qKiBAdHlwZWRlZiB7eyB4Om51bWJlciwgeTpudW1iZXIsIG9yOlwidlwifFwiaFwiLCBjMTooaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsKXx1bmRlZmluZWQsIGMyOihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwpfHVuZGVmaW5lZCB9fSBTaWRlICovXG5cbi8qKlxuICogQHR5cGVkZWYge2Z1bmN0aW9uKEFycmF5LjxTaWRlPixudW1iZXIsIG51bWJlcik6Kn0gU2lkZVZpZXdTY2FsZSAqL1xuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9tYW5pZm9sZC5uZXQvZG9jL21mZDkvZXhhbXBsZV9fdGFuYWthX2NvbnRvdXJzLmh0bVxuICogXG4gKiBAbW9kdWxlIHN0eWxlXG4gKiBAYXV0aG9yIEp1bGllbiBHYWZmdXJpXG4gKi9cbmV4cG9ydCBjbGFzcyBTaWRlVGFuYWthU3R5bGUgZXh0ZW5kcyBTdHlsZSB7XG4gICAgLyoqIEBwYXJhbSB7b2JqZWN0fSBvcHRzICovXG4gICAgY29uc3RydWN0b3Iob3B0cyA9IHt9KSB7XG4gICAgICAgIHN1cGVyKG9wdHMpXG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBjZWxscyBjbGFzc2lmaWVyLlxuICAgICAgICAgKiBUaGUgY2VsbCBjbGFzc2lmaWVyIGlzIGEgZnVuY3Rpb24gdGhhdCBmb3IgZWFjaCBjZWxsIHJldHVybnMgaXRzIGNsYXNzIG51bWJlciAoaW50KS5cbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jbGFzc2lmaWVyID0gb3B0cy5jbGFzc2lmaWVyIHx8ICgoY2VsbHMsIHJlc29sdXRpb24sIHopID0+IGMgPT4gMSlcblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIHdpZHRoIG9mIGEgY2VsbCBzaWRlLCBpbiBnZW8gdW5pdFxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oU2lkZSwgbnVtYmVyLCBudW1iZXIsIG51bWJlciwgb2JqZWN0KTpudW1iZXJ9ICovXG4gICAgICAgIHRoaXMud2lkdGggPSBvcHRzLndpZHRoIHx8ICgoc2lkZSwgc2lkZVZhbHVlLCByZXNvbHV0aW9uLCB6LCBzaWRlc1NjYWxlKSA9PiBNYXRoLmFicyhzaWRlVmFsdWUpICogeikgLy9NYXRoLm1pbigyICogeiwgcmVzb2x1dGlvbiAvIDMpKVxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgbGVuZ3RoIG9mIGEgY2VsbCBzaWRlLCBpbiBnZW8gdW5pdFxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oU2lkZSwgbnVtYmVyLCBudW1iZXIsIG9iamVjdCk6bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLmxlbmd0aCA9IG9wdHMubGVuZ3RoIHx8ICgoc2lkZSwgcmVzb2x1dGlvbiwgeiwgc2lkZXNTY2FsZSkgPT4gcmVzb2x1dGlvbilcblxuICAgICAgICAvLyB0aGUgZGFyayBjb2xvcjogZm9yIHNpZGUgZmFjaW5nIGF3YXkgZnJvbSBsaWdodCAoY29taW5nIGZyb20gTlcpXG4gICAgICAgIHRoaXMuY29sb3JEYXJrID0gb3B0cy5jb2xvckRhcmsgfHwgJyMxMTEnXG4gICAgICAgIC8vIHRoZSBicmlnaHQgY29sb3I6IGZvciBzaWRlIGZhY2luZyB0aGUgbGlnaHQgKGNvbWluZyBmcm9tIE5XKVxuICAgICAgICB0aGlzLmNvbG9yQnJpZ2h0ID0gb3B0cy5jb2xvckJyaWdodCB8fCAnI2RkZCdcbiAgICAgICAgLy9cbiAgICAgICAgdGhpcy5yZXZlcnQgPSBvcHRzLnJldmVydCA9PSB1bmRlZmluZWQ/IGZhbHNlIDogb3B0cy5yZXZlcnRcblxuICAgICAgICAvKiogU2V0IHRvIEEgb3IgdHJ1ZSBzbyB0aGF0IHRoZSBzaWRlIGlzIGRyYXduIGFzIGEgZGlhbW9uZCAqL1xuICAgICAgICB0aGlzLmRpYW1vbmQgPSBvcHRzLmRpYW1vbmRcblxuICAgICAgICAvKiBEZXRlcm1pbmVzIHdoYXQgdG8gZG8gZm9yIGxpbWl0IHNpZGVzLCBiZXR3ZWVuIGEgY2VsbCB3aXRoIHZhbHVlIGFuZCBvbmUgd2l0aCBubyB2YWx1ZVxuICAgICAgICAqIHN0ZWVwOiB0aGUgY2VsbCB2YWx1ZSBhYnNlbmNlIGlzIGVxdWl2YWxlbnQgdG8gMC4gSXQgc2hvd3MgcG90ZW50aWFsbHkgYSBzdGVlcCBsaW1pdCB0aGVuLlxuICAgICAgICAqIHNraXA6IG5vIHNpZGUgaXMgZHJhd25cbiAgICAgICAgKiBzdGVwOiBhIHNpZGUgd2l0aCBhIDEgc3RlcCAqL1xuICAgICAgICB0aGlzLmxpbWl0ID0gb3B0cy5saW1pdCB8fCBcInN0ZWVwXCJcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXQuanNcIikuQ2VsbD59IGNlbGxzXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJlc29sdXRpb25cbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvcmUvR2VvQ2FudmFzLmpzXCIpLkdlb0NhbnZhc30gZ2VvQ2FudmFzXG4gICAgICovXG4gICAgZHJhdyhjZWxscywgZ2VvQ2FudmFzLCByZXNvbHV0aW9uKSB7XG4gICAgICAgIC8vZmlsdGVyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlcikgY2VsbHMgPSBjZWxscy5maWx0ZXIodGhpcy5maWx0ZXIpXG5cbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgeiA9IGdlb0NhbnZhcy52aWV3LnpcbiAgICAgICAgY29uc3QgY3R4ID0gZ2VvQ2FudmFzLm9mZnNjcmVlbkN0eFxuXG4gICAgICAgIC8vZ2V0IGNlbGwgY2xhc3NpZmllclxuICAgICAgICBjb25zdCBjbGFzc2lmaWVyID0gdGhpcy5jbGFzc2lmaWVyKGNlbGxzLCByZXNvbHV0aW9uLCB6KVxuXG4gICAgICAgIC8vZ2V0IHNpZGUgdmFsdWU6IGNsYXNzIGNoYW5nZSBkaWZmZXJlbmNlXG4gICAgICAgIGNvbnN0IGdldFNpZGVWYWx1ZSA9ICgvKiogQHR5cGUge3sgYzE6IFNpZGU7IGMyOiBTaWRlOyB9fSAqLyBzaWRlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjbDEgPSBzaWRlLmMxID8gY2xhc3NpZmllcihzaWRlLmMxKSA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgY29uc3QgY2wyID0gc2lkZS5jMiA/IGNsYXNzaWZpZXIoc2lkZS5jMikgOiB1bmRlZmluZWRcbiAgICAgICAgICAgIGlmIChjbDEgPT09IHVuZGVmaW5lZCAmJiBjbDIgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgICAgICAgaWYgKGNsMSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdGhpcy5saW1pdD09XCJub25lXCI/IHVuZGVmaW5lZCA6IHRoaXMubGltaXQ9PVwic3RlZXBcIj8gY2wyIDogTWF0aC5zaWduKGNsMilcbiAgICAgICAgICAgIGlmIChjbDIgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRoaXMubGltaXQ9PVwibm9uZVwiPyB1bmRlZmluZWQgOiB0aGlzLmxpbWl0PT1cInN0ZWVwXCI/IC1jbDEgOiBNYXRoLnNpZ24oLWNsMSlcbiAgICAgICAgICAgIHJldHVybiBjbDIgLSBjbDFcbiAgICAgICAgfVxuXG4gICAgICAgIC8vYnVpbGQgc2lkZXNcbiAgICAgICAgLy9UT0RPIGJ1aWxkIG9ubHkgdGhvc2Ugd2l0aCBkaWZmZXJlbnQgY29kZXMgP1xuICAgICAgICAvKiogIEB0eXBlIHtBcnJheS48U2lkZT59ICovXG4gICAgICAgIGNvbnN0IHNpZGVzID0gU2lkZVN0eWxlLmJ1aWxkU2lkZXMoY2VsbHMsIHJlc29sdXRpb24pXG4gICAgICAgIGlmIChzaWRlcy5sZW5ndGggPT0gMCkgcmV0dXJuXG5cbiAgICAgICAgLy9nZXQgc2lkZSB2aWV3IHNjYWxlXG4gICAgICAgIGNvbnN0IHZpZXdTY2FsZSA9IHRoaXMudmlld1NjYWxlID8gdGhpcy52aWV3U2NhbGUoc2lkZXMsIHJlc29sdXRpb24sIHopIDogdW5kZWZpbmVkXG5cbiAgICAgICAgLy9kcmF3IHNpZGVzXG4gICAgICAgIGN0eC5saW5lQ2FwID0gJ2J1dHQnXG4gICAgICAgIGNvbnN0IHIyID0gcmVzb2x1dGlvbiAqIDAuNVxuICAgICAgICBjb25zdCBjZCA9IHRoaXMucmV2ZXJ0PyB0aGlzLmNvbG9yQnJpZ2h0IDogdGhpcy5jb2xvckRhcmtcbiAgICAgICAgY29uc3QgY2IgPSB0aGlzLnJldmVydD8gdGhpcy5jb2xvckRhcmsgOiB0aGlzLmNvbG9yQnJpZ2h0XG4gICAgICAgIGZvciAobGV0IHNpZGUgb2Ygc2lkZXMpIHtcblxuICAgICAgICAgICAgLy9nZXQgc2lkZSB2YWx1ZVxuICAgICAgICAgICAgY29uc3QgdiA9IGdldFNpZGVWYWx1ZShzaWRlKVxuICAgICAgICAgICAgaWYgKHYgPT09IHVuZGVmaW5lZCB8fCB2ID09PSAwKSBjb250aW51ZVxuXG4gICAgICAgICAgICAvL2NvbG9yXG4gICAgICAgICAgICAvKiogQHR5cGUge3N0cmluZ3x1bmRlZmluZWR9ICovXG4gICAgICAgICAgICBjb25zdCBjb2wgPSAoKHYgPCAwICYmIHNpZGUub3IgPT09ICdoJykgfHwgKHYgPiAwICYmIHNpZGUub3IgPT09ICd2JykpID8gY2IgOiBjZFxuICAgICAgICAgICAgaWYgKCFjb2wgfHwgY29sID09ICdub25lJykgY29udGludWVcblxuICAgICAgICAgICAgaWYgKHRoaXMuZGlhbW9uZCkge1xuICAgICAgICAgICAgICAgIC8vc2V0IGNvbG9yXG4gICAgICAgICAgICAgICAgY3R4LmZpbGxTdHlsZSA9IGNvbFxuXG4gICAgICAgICAgICAgICAgLy9kcmF3IGRpYW1vbmRcbiAgICAgICAgICAgICAgICBjb25zdCB4ID0gc2lkZS54LFxuICAgICAgICAgICAgICAgICAgICB5ID0gc2lkZS55XG4gICAgICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICAgICAgY3R4Lm1vdmVUbyh4IC0gcjIsIHkpXG4gICAgICAgICAgICAgICAgY3R4LmxpbmVUbyh4LCB5ICsgcjIpXG4gICAgICAgICAgICAgICAgY3R4LmxpbmVUbyh4ICsgcjIsIHkpXG4gICAgICAgICAgICAgICAgY3R4LmxpbmVUbyh4LCB5IC0gcjIpXG4gICAgICAgICAgICAgICAgY3R4LmNsb3NlUGF0aCgpXG4gICAgICAgICAgICAgICAgY3R4LmZpbGwoKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvL3dpZHRoXG4gICAgICAgICAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ8dW5kZWZpbmVkfSAqL1xuICAgICAgICAgICAgICAgIGNvbnN0IHdHID0gdGhpcy53aWR0aCA/IHRoaXMud2lkdGgoc2lkZSwgdiwgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgIGlmICghd0cgfHwgd0cgPD0gMCkgY29udGludWVcblxuICAgICAgICAgICAgICAgIC8vbGVuZ3RoXG4gICAgICAgICAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ8dW5kZWZpbmVkfSAqL1xuICAgICAgICAgICAgICAgIGNvbnN0IGxHID0gdGhpcy5sZW5ndGggPyB0aGlzLmxlbmd0aChzaWRlLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpIDogdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgaWYgKCFsRyB8fCBsRyA8PSAwKSBjb250aW51ZVxuICAgICAgICAgICAgICAgIGNvbnN0IGxHMiA9IGxHICogMC41XG5cbiAgICAgICAgICAgICAgICAvL3NldCB3aWR0aFxuICAgICAgICAgICAgICAgIGN0eC5saW5lV2lkdGggPSB3R1xuICAgICAgICAgICAgICAgIC8vc2V0IGNvbG9yXG4gICAgICAgICAgICAgICAgY3R4LnN0cm9rZVN0eWxlID0gY29sXG5cbiAgICAgICAgICAgICAgICAvL2RyYXcgc2VnbWVudCB3aXRoIGNvcnJlY3Qgb3JpZW50YXRpb25cbiAgICAgICAgICAgICAgICBjb25zdCB4ID0gc2lkZS54LFxuICAgICAgICAgICAgICAgICAgICB5ID0gc2lkZS55XG4gICAgICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICAgICAgaWYgKHNpZGUub3IgPT09ICd2Jykge1xuICAgICAgICAgICAgICAgICAgICBjdHgubW92ZVRvKHgsIHkgLSBsRzIpXG4gICAgICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oeCwgeSArIGxHMilcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjdHgubW92ZVRvKHggLSBsRzIsIHkpXG4gICAgICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oeCArIGxHMiwgeSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY3R4LnN0cm9rZSgpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvL3VwZGF0ZSBsZWdlbmRzXG4gICAgICAgIHRoaXMudXBkYXRlTGVnZW5kcyh7IHN0eWxlOiB0aGlzLCByZXNvbHV0aW9uOiByZXNvbHV0aW9uLCB6OiB6LCB2aWV3U2NhbGU6IHZpZXdTY2FsZSB9KVxuICAgIH1cblxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBTdHlsZSB9IGZyb20gJy4uL2NvcmUvU3R5bGUuanMnXG5pbXBvcnQgeyBpbml0U2hhZGVyUHJvZ3JhbSwgY3JlYXRlU2hhZGVyLCBtYWtlV2ViR0xDYW52YXMgfSBmcm9tICcuLi91dGlscy93ZWJHTFV0aWxzLmpzJ1xuaW1wb3J0IHsgY29sb3IgfSBmcm9tICdkMy1jb2xvcidcblxuLyoqXG4gKiBTdHlsZSBiYXNlZCBvbiB3ZWJHTFxuICogVG8gc2hvdyBjZWxscyBhcyBjb2xvcmVkIHNxdWFyZXMsIGZyb20gY2F0ZWdvcmllcy5cbiAqIEFsbCBjZWxscyBhcmUgZHJhd24gYXMgc3F1YXJlcywgd2l0aCB0aGUgc2FtZSBzaXplXG4gKlxuICogQG1vZHVsZSBzdHlsZVxuICogQGF1dGhvciBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgU3F1YXJlQ29sb3JDYXRlZ29yeVdlYkdMU3R5bGUgZXh0ZW5kcyBTdHlsZSB7XG4gICAgLyoqIEBwYXJhbSB7b2JqZWN0fSBvcHRzICovXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKVxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgY2F0ZWdvcnkgY29kZSBvZiB0aGUgY2VsbCwgZm9yIGNvbG9yaW5nLlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLCBudW1iZXIsIG51bWJlciwgdmlld1NjYWxlKTpzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuY29kZSA9IG9wdHMuY29kZSAgLy8gKGMsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgPT4gXCJjb2RlMVwiXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBkaWN0aW9uYXJ5IChjb2RlIC0+IGNvbG9yKSB3aGljaCBnaXZlcyB0aGUgY29sb3Igb2YgZWFjaCBjYXRlZ29yeSBjb2RlLlxuICAgICAgICAgKiBAdHlwZSB7b2JqZWN0fSAqL1xuICAgICAgICBvcHRzLmNvbG9yID0gb3B0cy5jb2xvciB8fCB1bmRlZmluZWRcblxuICAgICAgICAvKiogQHR5cGUgeyBBcnJheS48c3RyaW5nPiB9ICovXG4gICAgICAgIGNvbnN0IGNvZGVzID0gT2JqZWN0LmtleXMob3B0cy5jb2xvcilcblxuICAgICAgICAvKiogQHR5cGUgeyBvYmplY3QgfSBAcHJpdmF0ZSAqL1xuICAgICAgICB0aGlzLmNhdFRvSSA9IHt9XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29kZXMubGVuZ3RoOyBpKyspIHRoaXMuY2F0VG9JW2NvZGVzW2ldXSA9IGkgKyAnJ1xuXG4gICAgICAgIC8qKiBAdHlwZSB7IEFycmF5LjxzdHJpbmc+IH0gQHByaXZhdGUgKi9cbiAgICAgICAgdGhpcy5jb2xvcnMgPSBbXVxuICAgICAgICBmb3IgKGNvbnN0IGNvZGUgb2YgY29kZXMpIHRoaXMuY29sb3JzLnB1c2gob3B0cy5jb2xvclsnJyArIGNvZGVdKVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgc2l6ZSBvZiB0aGUgY2VsbHMsIGluIGdlb2dyYXBoaWNhbCB1bml0LiBBbGwgY2VsbHMgaGF2ZSB0aGUgc2FtZSBzaXplLlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24obnVtYmVyLG51bWJlcik6bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLnNpemUgPSBvcHRzLnNpemUgLy8gKHJlc29sdXRpb24sIHopID0+IC4uLlxuXG4gICAgICAgIC8qKiAgKiBAdHlwZSB7e2NhbnZhczpIVE1MQ2FudmFzRWxlbWVudCwgZ2w6V2ViR0xSZW5kZXJpbmdDb250ZXh0LCB3aWR0aDpudW1iZXIsIGhlaWdodDpudW1iZXIgfX0qL1xuICAgICAgICB0aGlzLmN2V0dMID0gdW5kZWZpbmVkXG4gICAgICAgIHRoaXMucHJvZ3JhbW0gPSB1bmRlZmluZWRcblxuICAgICAgICB0aGlzLnggPSB1bmRlZmluZWRcbiAgICAgICAgdGhpcy55ID0gdW5kZWZpbmVkXG4gICAgICAgIHRoaXMueiA9IHVuZGVmaW5lZFxuICAgICAgICB0aGlzLmNlbGxzTmIgPSB1bmRlZmluZWRcbiAgICB9XG5cbiAgICBpbml0KHcsIGgpIHtcbiAgICAgICAgdGhpcy5jdldHTCA9IG1ha2VXZWJHTENhbnZhcyh3ICsgJycsIGggKyAnJylcbiAgICAgICAgaWYgKCF0aGlzLmN2V0dMKSB7IGNvbnNvbGUuZXJyb3IoJ05vIHdlYkdMJyk7IHJldHVybiB9XG5cbiAgICAgICAgY29uc3QgZ2wgPSB0aGlzLmN2V0dMLmdsXG5cbiAgICAgICAgLy9kcmF3XG4gICAgICAgIGNvbnN0IHZlY3RvclNoYWRlciA9IGBcbiAgICAgICAgYXR0cmlidXRlIHZlYzIgcG9zO1xuICAgICAgICB1bmlmb3JtIGZsb2F0IHNpemVQaXg7XG4gICAgICAgIHVuaWZvcm0gbWF0MyBtYXQ7XG4gICAgICAgIGF0dHJpYnV0ZSBmbG9hdCBpO1xuICAgICAgICB2YXJ5aW5nIGZsb2F0IHZpO1xuICAgICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgICAgZ2xfUG9zaXRpb24gPSB2ZWM0KG1hdCAqIHZlYzMocG9zLCAxLjApLCAxLjApO1xuICAgICAgICAgIGdsX1BvaW50U2l6ZSA9IHNpemVQaXg7XG4gICAgICAgICAgdmkgPSBpO1xuICAgICAgICB9YFxuICAgICAgICAvKiogQHR5cGUge1dlYkdMU2hhZGVyfSAqL1xuICAgICAgICBjb25zdCB2U2hhZGVyID0gY3JlYXRlU2hhZGVyKGdsLCBnbC5WRVJURVhfU0hBREVSLCB2ZWN0b3JTaGFkZXIpXG5cbiAgICAgICAgY29uc3QgZnJhZ21lbnRTaGFkZXIgPSBgXG4gICAgICAgIHByZWNpc2lvbiBoaWdocCBmbG9hdDtcbiAgICAgICAgdmFyeWluZyBmbG9hdCB2aTtcbiAgICAgICAgdW5pZm9ybSBzYW1wbGVyMkQgY29sb3JMVVQ7XG4gICAgICAgIHVuaWZvcm0gZmxvYXQgbHV0U2l6ZTtcbiAgICAgICAgdm9pZCBtYWluKHZvaWQpIHtcbiAgICAgICAgICAgIGZsb2F0IGlkeCA9IGZsb29yKHZpICsgMC41KTtcbiAgICAgICAgICAgIGZsb2F0IHUgPSAoaWR4ICsgMC41KSAvIGx1dFNpemU7XG4gICAgICAgICAgICBnbF9GcmFnQ29sb3IgPSB0ZXh0dXJlMkQoY29sb3JMVVQsIHZlYzIodSwgMC41KSk7XG4gICAgICAgIH1gXG4gICAgICAgIC8qKiBAdHlwZSB7V2ViR0xTaGFkZXJ9ICovXG4gICAgICAgIGNvbnN0IGZTaGFkZXIgPSBjcmVhdGVTaGFkZXIoZ2wsIGdsLkZSQUdNRU5UX1NIQURFUiwgZnJhZ21lbnRTaGFkZXIpXG5cbiAgICAgICAgLyoqIEB0eXBlIHtXZWJHTFByb2dyYW19ICovXG4gICAgICAgIHRoaXMucHJvZ3JhbSA9IGluaXRTaGFkZXJQcm9ncmFtKGdsLCB2U2hhZGVyLCBmU2hhZGVyKVxuICAgICAgICBnbC51c2VQcm9ncmFtKHRoaXMucHJvZ3JhbSlcbiAgICB9XG5cbiAgICBiaW5kQ29sb3JzKCkge1xuICAgICAgICBjb25zdCBnbCA9IHRoaXMuY3ZXR0wuZ2xcbiAgICAgICAgY29uc3QgbHV0U2l6ZSA9IHRoaXMuY29sb3JzLmxlbmd0aDtcbiAgICAgICAgY29uc3QgbHV0RGF0YSA9IG5ldyBVaW50OEFycmF5KGx1dFNpemUgKiA0KTsgLy8gUkdCQSBmb3IgZWFjaCBlbnRyeVxuXG4gICAgICAgIC8vIEZpbGwgbHV0RGF0YSB3aXRoIHlvdXIgY29sb3IgdmFsdWVzIChlLmcuLCByYWluYm93LCBncmF5c2NhbGUsIGV0Yy4pXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbHV0U2l6ZTsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBjID0gY29sb3IodGhpcy5jb2xvcnNbaV0pXG4gICAgICAgICAgICBsdXREYXRhW2kgKiA0XSA9ICtjLnI7ICAgICAvLyBSXG4gICAgICAgICAgICBsdXREYXRhW2kgKiA0ICsgMV0gPSBjLmc7IC8vIEdcbiAgICAgICAgICAgIGx1dERhdGFbaSAqIDQgKyAyXSA9IGMuYjsgLy8gQlxuICAgICAgICAgICAgbHV0RGF0YVtpICogNCArIDNdID0gYz8ub3BhY2l0eSAqIDI1NTsgLy8gQVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ3JlYXRlIGFuZCBiaW5kIHRleHR1cmVcbiAgICAgICAgY29uc3QgbHV0VGV4dHVyZSA9IGdsLmNyZWF0ZVRleHR1cmUoKTtcbiAgICAgICAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgbHV0VGV4dHVyZSk7XG4gICAgICAgIGdsLnRleEltYWdlMkQoZ2wuVEVYVFVSRV8yRCwgMCwgZ2wuUkdCQSwgbHV0U2l6ZSwgMSwgMCwgZ2wuUkdCQSwgZ2wuVU5TSUdORURfQllURSwgbHV0RGF0YSk7XG4gICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9NSU5fRklMVEVSLCBnbC5ORUFSRVNUKTtcbiAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01BR19GSUxURVIsIGdsLk5FQVJFU1QpO1xuICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9TLCBnbC5DTEFNUF9UT19FREdFKTtcbiAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX1dSQVBfVCwgZ2wuQ0xBTVBfVE9fRURHRSk7XG5cbiAgICAgICAgLy8gR2V0IHVuaWZvcm0gbG9jYXRpb25zXG4gICAgICAgIGNvbnN0IHVDb2xvckxVVCA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbih0aGlzLnByb2dyYW0sICdjb2xvckxVVCcpO1xuICAgICAgICBjb25zdCB1THV0U2l6ZSA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbih0aGlzLnByb2dyYW0sICdsdXRTaXplJyk7XG5cbiAgICAgICAgLy8gU2V0IHVuaWZvcm0gdmFsdWVzXG4gICAgICAgIGdsLnVuaWZvcm0xaSh1Q29sb3JMVVQsIDApOyAvLyBUZXh0dXJlIHVuaXQgMFxuICAgICAgICBnbC51bmlmb3JtMWYodUx1dFNpemUsIGx1dFNpemUpO1xuXG4gICAgICAgIC8vIEJpbmQgdGhlIHRleHR1cmUgdG8gdGV4dHVyZSB1bml0IDBcbiAgICAgICAgZ2wuYWN0aXZlVGV4dHVyZShnbC5URVhUVVJFMCk7XG4gICAgICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIGx1dFRleHR1cmUpO1xuICAgIH1cblxuICAgIGJpbmRWZXJ0aWNlcyhjZWxscywgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSB7XG4gICAgICAgIGNvbnN0IGdsID0gdGhpcy5jdldHTC5nbFxuICAgICAgICAvL2FkZCB2ZXJ0aWNlIGFuZCBmcmFnbWVudCBkYXRhXG4gICAgICAgIGNvbnN0IHIyID0gcmVzb2x1dGlvbiAvIDJcbiAgICAgICAgbGV0IGMsIG5iID0gY2VsbHMubGVuZ3RoXG4gICAgICAgIGNvbnN0IHZlcnRpY2VzQnVmZmVyID0gW11cbiAgICAgICAgY29uc3QgaUJ1ZmZlciA9IFtdXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmI7IGkrKykge1xuICAgICAgICAgICAgYyA9IGNlbGxzW2ldXG4gICAgICAgICAgICBjb25zdCBjYXQgPSB0aGlzLmNvZGUoYywgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKVxuICAgICAgICAgICAgaWYgKGNhdCA9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnVW5leHBlY3RlZCBjYXRlZ29yeTogJyArIGNhdClcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgaV8gPSB0aGlzLmNhdFRvSVtjYXRdXG4gICAgICAgICAgICBpZiAoaXNOYU4oK2lfKSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdVbmV4cGVjdGVkIGNhdGVnb3J5IGluZGV4OiAnICsgY2F0ICsgJyAnICsgaV8pXG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZlcnRpY2VzQnVmZmVyLnB1c2goYy54ICsgcjIsIGMueSArIHIyKVxuICAgICAgICAgICAgaUJ1ZmZlci5wdXNoKCtpXylcbiAgICAgICAgfVxuXG4gICAgICAgIC8vYmluZCB2ZXJ0aWNlIGRhdGFcbiAgICAgICAgZ2wuYmluZEJ1ZmZlcihnbC5BUlJBWV9CVUZGRVIsIGdsLmNyZWF0ZUJ1ZmZlcigpKVxuICAgICAgICBnbC5idWZmZXJEYXRhKGdsLkFSUkFZX0JVRkZFUiwgbmV3IEZsb2F0MzJBcnJheSh2ZXJ0aWNlc0J1ZmZlciksIGdsLlNUQVRJQ19EUkFXKVxuICAgICAgICBjb25zdCBwb3NpdGlvbiA9IGdsLmdldEF0dHJpYkxvY2F0aW9uKHRoaXMucHJvZ3JhbSwgJ3BvcycpXG4gICAgICAgIGdsLnZlcnRleEF0dHJpYlBvaW50ZXIoXG4gICAgICAgICAgICBwb3NpdGlvbixcbiAgICAgICAgICAgIDIsIC8vbnVtQ29tcG9uZW50c1xuICAgICAgICAgICAgZ2wuRkxPQVQsIC8vdHlwZVxuICAgICAgICAgICAgZmFsc2UsIC8vbm9ybWFsaXNlXG4gICAgICAgICAgICAwLCAvL3N0cmlkZVxuICAgICAgICAgICAgMCAvL29mZnNldFxuICAgICAgICApXG4gICAgICAgIGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KHBvc2l0aW9uKVxuXG4gICAgICAgIC8vaSBkYXRhXG4gICAgICAgIGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCBnbC5jcmVhdGVCdWZmZXIoKSlcbiAgICAgICAgZ2wuYnVmZmVyRGF0YShnbC5BUlJBWV9CVUZGRVIsIG5ldyBGbG9hdDMyQXJyYXkoaUJ1ZmZlciksIGdsLlNUQVRJQ19EUkFXKVxuICAgICAgICBjb25zdCBpID0gZ2wuZ2V0QXR0cmliTG9jYXRpb24odGhpcy5wcm9ncmFtLCAnaScpXG4gICAgICAgIGdsLnZlcnRleEF0dHJpYlBvaW50ZXIoaSwgMSwgZ2wuRkxPQVQsIGZhbHNlLCAwLCAwKVxuICAgICAgICBnbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShpKVxuICAgIH1cblxuXG5cbiAgICAvLyBjaGVjayBpZiB0aGUgdmVydGljZXMgaGF2ZSB0byBiZSBib3VuZCBhZ2FpblxuICAgIG1hcENvbnRlbnRDaGFuZ2VkKHYsIGNlbGxzTmIpIHtcbiAgICAgICAgaWYgKHYueCA9PSB0aGlzLnggJiYgdi55ID09IHRoaXMueSAmJiB2LnogPT0gdGhpcy56ICYmIHRoaXMuY2VsbHNOYiA9PSBjZWxsc05iKSByZXR1cm4gZmFsc2VcbiAgICAgICAgdGhpcy54ID0gdi54XG4gICAgICAgIHRoaXMueSA9IHYueVxuICAgICAgICB0aGlzLnogPSB2LnpcbiAgICAgICAgdGhpcy5jZWxsc05iID0gY2VsbHNOYlxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0LmpzXCIpLkNlbGw+fSBjZWxsc1xuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29yZS9HZW9DYW52YXMuanNcIikuR2VvQ2FudmFzfSBnZW9DYW52YXNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVzb2x1dGlvblxuICAgICAqL1xuICAgIGRyYXcoY2VsbHMsIGdlb0NhbnZhcywgcmVzb2x1dGlvbikge1xuICAgICAgICAvL2ZpbHRlclxuICAgICAgICBpZiAodGhpcy5maWx0ZXIpIGNlbGxzID0gY2VsbHMuZmlsdGVyKHRoaXMuZmlsdGVyKVxuXG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IHogPSBnZW9DYW52YXMudmlldy56XG5cbiAgICAgICAgLy9nZXQgdmlldyBzY2FsZVxuICAgICAgICBjb25zdCB2aWV3U2NhbGUgPSB0aGlzLnZpZXdTY2FsZSA/IHRoaXMudmlld1NjYWxlKGNlbGxzLCByZXNvbHV0aW9uLCB6KSA6IHVuZGVmaW5lZFxuXG4gICAgICAgIC8vY3JlYXRlIGNhbnZhcyBhbmQgd2ViZ2wgcmVuZGVyZXJcbiAgICAgICAgaWYgKCF0aGlzLmN2V0dMIHx8IGdlb0NhbnZhcy53ICE9IHRoaXMuY3ZXR0wud2lkdGggfHwgZ2VvQ2FudmFzLmggIT0gdGhpcy5jdldHTC5oZWlnaHQpIHtcbiAgICAgICAgICAgIHRoaXMuaW5pdChnZW9DYW52YXMudywgZ2VvQ2FudmFzLmgpXG4gICAgICAgICAgICB0aGlzLmJpbmRDb2xvcnMoKVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGdsID0gdGhpcy5jdldHTC5nbFxuICAgICAgICBjb25zdCBjYW52YXMgPSB0aGlzLmN2V0dMLmNhbnZhc1xuXG4gICAgICAgIC8vYmluZCBzaXplUGl4XG4gICAgICAgIGNvbnN0IHNpemVQaXggPSB0aGlzLnNpemUgPyB0aGlzLnNpemUocmVzb2x1dGlvbiwgeikgLyB6IDogcmVzb2x1dGlvbiAvIHogKyAwLjJcbiAgICAgICAgZ2wudW5pZm9ybTFmKGdsLmdldFVuaWZvcm1Mb2NhdGlvbih0aGlzLnByb2dyYW0sICdzaXplUGl4JyksIDEuMCAqIHNpemVQaXgpXG5cbiAgICAgICAgLy9cbiAgICAgICAgaWYgKHRoaXMubWFwQ29udGVudENoYW5nZWQoZ2VvQ2FudmFzLnZpZXcsIGNlbGxzLmxlbmd0aCkpXG4gICAgICAgICAgICAvL2JpbmQgdmVydGljZXNcbiAgICAgICAgICAgIHRoaXMuYmluZFZlcnRpY2VzKGNlbGxzLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpXG4gICAgICAgICAgICAvL3RyYW5zZm9ybWF0aW9uXG4gICAgICAgICAgICBnbC51bmlmb3JtTWF0cml4M2Z2KGdsLmdldFVuaWZvcm1Mb2NhdGlvbih0aGlzLnByb2dyYW0sICdtYXQnKSwgZmFsc2UsIG5ldyBGbG9hdDMyQXJyYXkoZ2VvQ2FudmFzLmdldFdlYkdMVHJhbnNmb3JtKCkpKVxuXG4gICAgICAgIC8vIEVuYWJsZSB0aGUgZGVwdGggdGVzdFxuICAgICAgICAvL2dsLmVuYWJsZShnbC5ERVBUSF9URVNUKTtcbiAgICAgICAgLy8gQ2xlYXIgdGhlIGNvbG9yIGJ1ZmZlciBiaXRcbiAgICAgICAgZ2wuY2xlYXIoZ2wuQ09MT1JfQlVGRkVSX0JJVClcbiAgICAgICAgLy8gU2V0IHRoZSB2aWV3IHBvcnRcbiAgICAgICAgLy9nbC52aWV3cG9ydCgwLCAwLCBjZy53LCBjZy5oKTtcblxuICAgICAgICBnbC5kcmF3QXJyYXlzKGdsLlBPSU5UUywgMCwgY2VsbHMubGVuZ3RoKVxuXG4gICAgICAgIC8vZHJhdyBpbiBjYW52YXMgZ2VvXG4gICAgICAgIGdlb0NhbnZhcy5pbml0Q2FudmFzVHJhbnNmb3JtKClcbiAgICAgICAgZ2VvQ2FudmFzLm9mZnNjcmVlbkN0eC5kcmF3SW1hZ2UoY2FudmFzLCAwLCAwKVxuXG4gICAgICAgIC8vdXBkYXRlIGxlZ2VuZHNcbiAgICAgICAgdGhpcy51cGRhdGVMZWdlbmRzKHsgc3R5bGU6IHRoaXMsIHJlc29sdXRpb246IHJlc29sdXRpb24sIHo6IHogfSlcbiAgICB9XG59XG5cblxuXG4vLyBlYXJseSB0ZXN0cyBmb3Igd2ViZ2wyIG1pZ3JhdGlvblxuXG4vKlxuZnVuY3Rpb24gZ2V0VmVjdG9yU2hhZGVyMigpIHtcbiAgICByZXR1cm4gYFxuICAgICAgICAjdmVyc2lvbiAzMDAgZXNcbiAgICAgICAgcHJlY2lzaW9uIGhpZ2hwIGZsb2F0O1xuXG4gICAgICAgIGluIHZlYzIgcG9zO1xuICAgICAgICBpbiBpbnQgaTtcblxuICAgICAgICB1bmlmb3JtIGZsb2F0IHNpemVQaXg7XG4gICAgICAgIHVuaWZvcm0gbWF0MyBtYXQ7XG5cbiAgICAgICAgZmxhdCBvdXQgaW50IHZpO1xuXG4gICAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgICAgIGdsX1Bvc2l0aW9uID0gdmVjNChtYXQgKiB2ZWMzKHBvcywgMS4wKSwgMS4wKTtcbiAgICAgICAgICAgIGdsX1BvaW50U2l6ZSA9IHNpemVQaXg7XG4gICAgICAgICAgICB2aSA9IGk7XG4gICAgICAgIH1cbiAgICAgICAgYFxufVxuXG5cbmZ1bmN0aW9uIGdldEZyYWdtZW50U2hhZGVyMihjb2xvcnMpIHtcblxuICAgIC8vcHJlcGFyZSBmcmFnbWVudCBzaGFkZXIgY29kZVxuICAgIC8vZGVjbGFyZSB0aGUgdW5pZm9ybSBhbmQgb3RoZXIgdmFyaWFibGVzXG4gICAgY29uc3Qgb3V0ID0gW11cbiAgICBvdXQucHVzaCgnI3ZlcnNpb24gMzAwIGVzXFxucHJlY2lzaW9uIGhpZ2hwIGZsb2F0O1xcbmZsYXQgaW4gaW50IHZpO1xcbicpXG5cbiAgICAvL2FkZCBjb2xvciB1bmlmb3Jtc1xuICAgIC8vdW5pZm9ybSB2ZWM0IGNvbG9yc1sxMl07XG4gICAgb3V0LnB1c2goJ3VuaWZvcm0gdmVjNCBjb2xvcnNbJylcbiAgICBvdXQucHVzaChjb2xvcnMubGVuZ3RoKVxuICAgIG91dC5wdXNoKCddO1xcbicpXG5cbiAgICBvdXQucHVzaCgnb3V0IHZlYzQgZnJhZ0NvbG9yO1xcbicpXG5cbiAgICAvL3N0YXJ0IHRoZSBtYWluIGZ1bmN0aW9uXG4gICAgLy92b2lkIG1haW4oKSB7IGZyYWdDb2xvciA9IGNvbG9yc1tjbGFtcCh2aSwgMCwgMTEpXTsgfVxuICAgIG91dC5wdXNoKCd2b2lkIG1haW4oKSB7IGZyYWdDb2xvciA9IGNvbG9yc1t2aV07IH1cXG4nKVxuXG4gICAgLyoqIEZyYWdtZW50IHNoYWRlciBwcm9ncmFtXG4gICAgY29uc3QgZnNoU3RyaW5nID0gb3V0LmpvaW4oJycpXG4gICAgY29uc29sZS5sb2coZnNoU3RyaW5nKVxuICAgIHJldHVybiBmc2hTdHJpbmdcbn1cblxuKi8iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IFN0eWxlIH0gZnJvbSAnLi4vY29yZS9TdHlsZS5qcydcbmltcG9ydCB7IG1ha2VXZWJHTENhbnZhcyB9IGZyb20gJy4uL3V0aWxzL3dlYkdMVXRpbHMuanMnXG5pbXBvcnQgeyBXZWJHTFNxdWFyZUNvbG9yaW5nQWR2YW5jZWQgfSBmcm9tICcuLi91dGlscy9XZWJHTFNxdWFyZUNvbG9yaW5nQWR2YW5jZWQuanMnXG5cbi8qKlxuICogU3R5bGUgYmFzZWQgb24gd2ViR0xcbiAqIFRvIHNob3cgY2VsbHMgYXMgY29sb3JlZCBzcXVhcmVzLCB3aXRoIGNvbXB1dGF0aW9uIG9mIHRoZSBjb2xvcnMgb24gR1BVIHNpZGUgKGZhc3RlciB0aGFuIEphdmFTY3JpcHQgc2lkZSkuXG4gKiBBbGxzIHNxdWFyZXMgd2l0aCB0aGUgc2FtZSBzaXplXG4gKlxuICogQG1vZHVsZSBzdHlsZVxuICogQGF1dGhvciBKdWxpZW4gR2FmZnVyaVxuICovXG5leHBvcnQgY2xhc3MgU3F1YXJlQ29sb3JXZWJHTFN0eWxlIGV4dGVuZHMgU3R5bGUge1xuICAgIC8qKiBAcGFyYW0ge29iamVjdH0gb3B0cyAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cylcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvKipcbiAgICAgICAgICogQSBmdW5jdGlvbiByZXR1cm5pbmcgYSB0IHZhbHVlICh3aXRoaW4gWzAsMV0pIGZvciBhIGNlbGwuXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwsbnVtYmVyLG51bWJlcixvYmplY3QpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy50RnVuID0gb3B0cy50RnVuIC8vKGMscix6LHZzKSA9PiB7fVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEaXN0cmlidXRpb24gc3RyZXRjaGluZyBtZXRob2QuXG4gICAgICAgICAqIFRoZSBzdHJldGNoaW5nIGlzIHBlcmZvcm1lZCBvbiBHUFUgc2lkZSAoZnJhZ21lbnQgc2hhZGVyKS5cbiAgICAgICAgICogQHR5cGUge3sgZnVuOnN0cmluZywgYWxwaGE6bnVtYmVyIH19ICovXG4gICAgICAgIHRoaXMuc3RyZXRjaGluZyA9IG9wdHMuc3RyZXRjaGluZ1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgc2FtcGxlIG9mIHRoZSBjb2xvciByYW1wLlxuICAgICAgICAgKiBUaGUgY29sb3IgaXMgY29tcHV0ZWQgb24gR1BVIHNpZGUgKGZyYWdtZW50IHNoYWRlcikgYmFzZWQgb24gdGhvc2UgdmFsdWVzIChsaW5lYXIgaW50ZXJwb2xhdGlvbikuXG4gICAgICAgICAqIEB0eXBlIHtBcnJheS48c3RyaW5nPn0gKi9cbiAgICAgICAgdGhpcy5jb2xvcnMgPVxuICAgICAgICAgICAgb3B0cy5jb2xvcnMgfHxcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAncmdiKDE1OCwgMSwgNjYpJyxcbiAgICAgICAgICAgICAgICAncmdiKDI0OCwgMTQyLCA4MyknLFxuICAgICAgICAgICAgICAgICdyZ2IoMjUxLCAyNDgsIDE3NiknLFxuICAgICAgICAgICAgICAgICdyZ2IoMTM3LCAyMDcsIDE2NSknLFxuICAgICAgICAgICAgICAgICdyZ2IoOTQsIDc5LCAxNjIpJyxcbiAgICAgICAgICAgIF0ucmV2ZXJzZSgpXG4gICAgICAgIGlmIChvcHRzLmNvbG9yKVxuICAgICAgICAgICAgdGhpcy5jb2xvcnMgPSBbXG4gICAgICAgICAgICAgICAgb3B0cy5jb2xvcigwKSxcbiAgICAgICAgICAgICAgICBvcHRzLmNvbG9yKDAuMiksXG4gICAgICAgICAgICAgICAgb3B0cy5jb2xvcigwLjQpLFxuICAgICAgICAgICAgICAgIG9wdHMuY29sb3IoMC42KSxcbiAgICAgICAgICAgICAgICBvcHRzLmNvbG9yKDAuOCksXG4gICAgICAgICAgICAgICAgb3B0cy5jb2xvcigxKSxcbiAgICAgICAgICAgIF1cblxuICAgICAgICAvKipcbiAgICAgICAgICogRGVmaW5lIHRoZSBvcGFjaXR5IG9mIHRoZSBzdHlsZSwgd2l0aGluIFswLDFdLlxuICAgICAgICAgKiBJZiB0aGlzIG9wYWNpdHkgaXMgZGVmaW5lZCwgdGhlIGluZGl2aWR1YWwgY29sb3Igb3BhY2l0eSB3aWxsIGJlIGlnbm9yZWQuXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihudW1iZXIsbnVtYmVyKTpudW1iZXJ9ICovXG4gICAgICAgIHRoaXMub3BhY2l0eSA9IG9wdHMub3BhY2l0eSAvLyAocix6KSA9PiAuLi5cblxuICAgICAgICAvKipcbiAgICAgICAgICogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIHNpemUgb2YgdGhlIGNlbGxzLCBpbiBnZW9ncmFwaGljYWwgdW5pdC4gQWxsIGNlbGxzIGhhdmUgdGhlIHNhbWUgc2l6ZS5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKG51bWJlcixudW1iZXIpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy5zaXplID0gb3B0cy5zaXplIC8vIChyZXNvbHV0aW9uLCB6KSA9PiAuLi5cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXQuanNcIikuQ2VsbD59IGNlbGxzXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhcy5qc1wiKS5HZW9DYW52YXN9IGdlb0NhbnZhc1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByZXNvbHV0aW9uXG4gICAgICovXG4gICAgZHJhdyhjZWxscywgZ2VvQ2FudmFzLCByZXNvbHV0aW9uKSB7XG4gICAgICAgIC8vZmlsdGVyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlcikgY2VsbHMgPSBjZWxscy5maWx0ZXIodGhpcy5maWx0ZXIpXG5cbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgeiA9IGdlb0NhbnZhcy52aWV3LnpcblxuICAgICAgICAvL2dldCB2aWV3IHNjYWxlXG4gICAgICAgIGNvbnN0IHZpZXdTY2FsZSA9IHRoaXMudmlld1NjYWxlID8gdGhpcy52aWV3U2NhbGUoY2VsbHMsIHJlc29sdXRpb24sIHopIDogdW5kZWZpbmVkXG5cbiAgICAgICAgLy9jcmVhdGUgY2FudmFzIGFuZCB3ZWJnbCByZW5kZXJlclxuICAgICAgICAvL2ZvciBvcGFjaXR5IGNvbnRyb2wsIHNlZTogaHR0cHM6Ly93ZWJnbGZ1bmRhbWVudGFscy5vcmcvd2ViZ2wvbGVzc29ucy93ZWJnbC1hbmQtYWxwaGEuaHRtbFxuICAgICAgICBjb25zdCBjdldHTCA9IG1ha2VXZWJHTENhbnZhcyhcbiAgICAgICAgICAgIGdlb0NhbnZhcy53ICsgJycsXG4gICAgICAgICAgICBnZW9DYW52YXMuaCArICcnLFxuICAgICAgICAgICAgdGhpcy5vcGFjaXR5ICE9IHVuZGVmaW5lZCA/IHsgcHJlbXVsdGlwbGllZEFscGhhOiBmYWxzZSB9IDogdW5kZWZpbmVkXG4gICAgICAgIClcbiAgICAgICAgaWYgKCFjdldHTCkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignTm8gd2ViR0wnKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICAvL2FkZCB2ZXJ0aWNlIGFuZCBmcmFnbWVudCBkYXRhXG4gICAgICAgIGNvbnN0IHIyID0gcmVzb2x1dGlvbiAvIDJcbiAgICAgICAgY29uc3QgdmVydGljZXNCdWZmZXIgPSBbXVxuICAgICAgICBjb25zdCB0QnVmZmVyID0gW11cbiAgICAgICAgZm9yIChsZXQgY2VsbCBvZiBjZWxscykge1xuICAgICAgICAgICAgY29uc3QgdCA9IHRoaXMudEZ1bihjZWxsLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpXG4gICAgICAgICAgICBpZiAodCA9PSBudWxsIHx8IHQgPT0gdW5kZWZpbmVkKSBjb250aW51ZVxuICAgICAgICAgICAgdmVydGljZXNCdWZmZXIucHVzaChjZWxsLnggKyByMiwgY2VsbC55ICsgcjIpXG4gICAgICAgICAgICB0QnVmZmVyLnB1c2godCA+IDEgPyAxIDogdCA8IDAgPyAwIDogdClcbiAgICAgICAgfVxuXG4gICAgICAgIC8vY29tcHV0ZSBwaXhlbCBzaXplXG4gICAgICAgIGNvbnN0IHNpemVHZW8gPSB0aGlzLnNpemUgPyB0aGlzLnNpemUocmVzb2x1dGlvbiwgeikgOiByZXNvbHV0aW9uICsgMC4yICogelxuXG4gICAgICAgIC8vY29tcHV0ZSBvcGFjaXR5XG4gICAgICAgIGNvbnN0IG9wID0gdGhpcy5vcGFjaXR5ID8gdGhpcy5vcGFjaXR5KHJlc29sdXRpb24sIHopIDogdW5kZWZpbmVkXG5cbiAgICAgICAgLy9cbiAgICAgICAgY29uc3Qgd2dwID0gbmV3IFdlYkdMU3F1YXJlQ29sb3JpbmdBZHZhbmNlZChjdldHTC5nbCwgdGhpcy5jb2xvcnMsIHRoaXMuc3RyZXRjaGluZywgc2l6ZUdlbyAvIHosIG9wKVxuXG4gICAgICAgIC8vZHJhd1xuICAgICAgICB3Z3AuZHJhdyh2ZXJ0aWNlc0J1ZmZlciwgdEJ1ZmZlciwgZ2VvQ2FudmFzLmdldFdlYkdMVHJhbnNmb3JtKCkpXG5cbiAgICAgICAgLy8gZHJhdyBpbiBjYW52YXMgZ2VvXG4gICAgICAgIC8vIE5PVEU6IGRyYXdpbmcgZWFjaCB0aWxlIHRoaXMgd2F5IGlzIHZlcnkgaW5lZmZpY2llbnQuIFdlYkdMIGlzIGJlc3QgdXNlZCB3aXRoIGZld2VyLCBoZWF2aWVyL2xhcmdlciBkcmF3IGNhbGxzLlxuICAgICAgICBnZW9DYW52YXMuaW5pdENhbnZhc1RyYW5zZm9ybSgpXG4gICAgICAgIGdlb0NhbnZhcy5vZmZzY3JlZW5DdHguZHJhd0ltYWdlKGN2V0dMLmNhbnZhcywgMCwgMClcblxuICAgICAgICAvL3VwZGF0ZSBsZWdlbmRzXG4gICAgICAgIHRoaXMudXBkYXRlTGVnZW5kcyh7IHN0eWxlOiB0aGlzLCByZXNvbHV0aW9uOiByZXNvbHV0aW9uLCB6OiB6LCB2aWV3U2NhbGU6IHZpZXdTY2FsZSB9KVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgU3R5bGUgfSBmcm9tICcuLi9jb3JlL1N0eWxlLmpzJ1xuXG4vKipcbiAqIEBtb2R1bGUgc3R5bGVcbiAqIEBhdXRob3IgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIFN0cm9rZVN0eWxlIGV4dGVuZHMgU3R5bGUge1xuICAgIC8qKiBAcGFyYW0ge29iamVjdH0gb3B0cyAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cylcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge31cblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIGNvbG9yIG9mIHRoZSBjZWxsLlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLG51bWJlcixudW1iZXIsb2JqZWN0KTpzdHJpbmd9ICovXG4gICAgICAgIHRoaXMuc3Ryb2tlQ29sb3IgPSBvcHRzLnN0cm9rZUNvbG9yIHx8ICgoKSA9PiAnIzY2NicpIC8vKGMscix6LHZzKSA9PiB7fVxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgc2l6ZSBvZiBhIGNlbGwgaW4gZ2VvZ3JhcGhpY2FsIHVuaXQuXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwsbnVtYmVyLG51bWJlcixvYmplY3QpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy5zaXplID0gb3B0cy5zaXplIHx8ICgoY2VsbCwgcmVzb2x1dGlvbikgPT4gcmVzb2x1dGlvbikgLy8oYyxyLHosdnMpID0+IHt9XG5cbiAgICAgICAgLyoqIFRoZSBzdHJva2UgbGluZSB3aWR0aCBpbiBnZW9ncmFwaGljYWwgdW5pdC5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbCxudW1iZXIsbnVtYmVyLG9iamVjdCk6bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLnN0cm9rZVdpZHRoID0gb3B0cy5zdHJva2VXaWR0aCB8fCAoKGNlbGwsIHJlc29sdXRpb24sIHopID0+IHogKiAxLjUpIC8vKGMscix6LHZzKSA9PiB7fVxuXG4gICAgICAgIC8qKiBBIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgc2hhcGUgb2YgYSBjZWxsLlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0LmpzXCIpLkNlbGwsbnVtYmVyLG51bWJlcixvYmplY3QpOmltcG9ydChcIi4uL2NvcmUvU3R5bGUuanNcIikuU2hhcGV9ICovXG4gICAgICAgIHRoaXMuc2hhcGUgPSBvcHRzLnNoYXBlIHx8ICgoKSA9PiAnc3F1YXJlJykgLy8oYyxyLHosdnMpID0+IHt9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRHJhdyBjZWxscyBhcyBzcXVhcmVzLCB3aXRoIHZhcmlvdXMgY29sb3JzIGFuZCBzaXplLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0XCIpLkNlbGw+fSBjZWxsc1xuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29yZS9HZW9DYW52YXNcIikuR2VvQ2FudmFzfSBnZW9DYW52YXNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVzb2x1dGlvblxuICAgICAqL1xuICAgIGRyYXcoY2VsbHMsIGdlb0NhbnZhcywgcmVzb2x1dGlvbikge1xuICAgICAgICAvL2ZpbHRlclxuICAgICAgICBpZiAodGhpcy5maWx0ZXIpIGNlbGxzID0gY2VsbHMuZmlsdGVyKHRoaXMuZmlsdGVyKVxuXG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IHogPSBnZW9DYW52YXMudmlldy56XG4gICAgICAgIGNvbnN0IGN0eCA9IGdlb0NhbnZhcy5vZmZzY3JlZW5DdHhcblxuICAgICAgICAvL2dldCB2aWV3IHNjYWxlXG4gICAgICAgIGNvbnN0IHZpZXdTY2FsZSA9IHRoaXMudmlld1NjYWxlID8gdGhpcy52aWV3U2NhbGUoY2VsbHMsIHJlc29sdXRpb24sIHopIDogdW5kZWZpbmVkXG5cbiAgICAgICAgY29uc3QgcjIgPSByZXNvbHV0aW9uICogMC41XG4gICAgICAgIGZvciAobGV0IGMgb2YgY2VsbHMpIHtcbiAgICAgICAgICAgIC8vY29sb3JcbiAgICAgICAgICAgIGNvbnN0IGNvbCA9IHRoaXMuc3Ryb2tlQ29sb3IgPyB0aGlzLnN0cm9rZUNvbG9yKGMsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgOiB1bmRlZmluZWRcbiAgICAgICAgICAgIGlmICghY29sIHx8IGNvbCA9PT0gJ25vbmUnKSBjb250aW51ZVxuICAgICAgICAgICAgY3R4LnN0cm9rZVN0eWxlID0gY29sXG5cbiAgICAgICAgICAgIC8vc2l6ZSAtIGluIGdlbyB1bml0XG4gICAgICAgICAgICBjb25zdCBzaXplID0gdGhpcy5zaXplID8gdGhpcy5zaXplKGMsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgOiByZXNvbHV0aW9uXG5cbiAgICAgICAgICAgIC8vd2lkdGhcbiAgICAgICAgICAgIGNvbnN0IHdpID0gdGhpcy5zdHJva2VXaWR0aCA/IHRoaXMuc3Ryb2tlV2lkdGgoYywgcmVzb2x1dGlvbiwgeiwgdmlld1NjYWxlKSA6IDEgKiB6XG4gICAgICAgICAgICBpZiAoIXdpIHx8IHdpIDw9IDApIGNvbnRpbnVlXG4gICAgICAgICAgICBjdHgubGluZVdpZHRoID0gd2lcblxuICAgICAgICAgICAgLy9zaGFwZVxuICAgICAgICAgICAgY29uc3Qgc2hhcGUgPSB0aGlzLnNoYXBlID8gdGhpcy5zaGFwZShjLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpIDogJ3NxdWFyZSdcbiAgICAgICAgICAgIGlmIChzaGFwZSA9PT0gJ25vbmUnKSBjb250aW51ZVxuXG4gICAgICAgICAgICAvL2dldCBvZmZzZXRcbiAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMub2Zmc2V0KGMsIHJlc29sdXRpb24sIHopXG5cbiAgICAgICAgICAgIGlmIChzaGFwZSA9PT0gJ3NxdWFyZScpIHtcbiAgICAgICAgICAgICAgICAvL2RyYXcgc3F1YXJlXG4gICAgICAgICAgICAgICAgY29uc3QgZCA9IHJlc29sdXRpb24gKiAoMSAtIHNpemUgLyByZXNvbHV0aW9uKSAqIDAuNVxuICAgICAgICAgICAgICAgIGN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgICAgIGN0eC5yZWN0KGMueCArIGQgKyBvZmZzZXQuZHgsIGMueSArIGQgKyBvZmZzZXQuZHksIHNpemUsIHNpemUpXG4gICAgICAgICAgICAgICAgY3R4LnN0cm9rZSgpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNoYXBlID09PSAnY2lyY2xlJykge1xuICAgICAgICAgICAgICAgIC8vZHJhdyBjaXJjbGVcbiAgICAgICAgICAgICAgICBjdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICBjdHguYXJjKGMueCArIHIyICsgb2Zmc2V0LmR4LCBjLnkgKyByMiArIG9mZnNldC5keSwgc2l6ZSAqIDAuNSwgMCwgMiAqIE1hdGguUEksIGZhbHNlKVxuICAgICAgICAgICAgICAgIGN0eC5zdHJva2UoKVxuICAgICAgICAgICAgfSBlbHNlIGlmIChzaGFwZSA9PT0gJ2RpYW1vbmQnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgczIgPSBzaXplICogMC41XG4gICAgICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICAgICAgICAgY3R4Lm1vdmVUbyhjLnggKyByMiAtIHMyLCBjLnkgKyByMilcbiAgICAgICAgICAgICAgICBjdHgubGluZVRvKGMueCArIHIyLCBjLnkgKyByMiArIHMyKVxuICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oYy54ICsgcjIgKyBzMiwgYy55ICsgcjIpXG4gICAgICAgICAgICAgICAgY3R4LmxpbmVUbyhjLnggKyByMiwgYy55ICsgcjIgLSBzMilcbiAgICAgICAgICAgICAgICBjdHgubGluZVRvKGMueCArIHIyIC0gczIsIGMueSArIHIyKVxuICAgICAgICAgICAgICAgIGN0eC5zdHJva2UoKVxuICAgICAgICAgICAgfSBlbHNlIGlmIChzaGFwZSA9PT0gJ2RvbnV0Jykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ05vdCBpbXBsZW1lbnRlZCcpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNoYXBlID09PSAndHJpYW5nbGVfdXAnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZHIyID0gKHNpemUgLSByZXNvbHV0aW9uKSAvIDJcbiAgICAgICAgICAgICAgICBjdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICBjdHgubW92ZVRvKGMueCAtIGRyMiwgYy55IC0gZHIyKVxuICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oYy54ICsgcjIsIGMueSArIHJlc29sdXRpb24gKyBkcjIpXG4gICAgICAgICAgICAgICAgY3R4LmxpbmVUbyhjLnggKyByZXNvbHV0aW9uICsgZHIyLCBjLnkgLSBkcjIpXG4gICAgICAgICAgICAgICAgY3R4LmNsb3NlUGF0aCgpXG4gICAgICAgICAgICAgICAgY3R4LnN0cm9rZSgpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNoYXBlID09PSAndHJpYW5nbGVfZG93bicpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkcjIgPSAoc2l6ZSAtIHJlc29sdXRpb24pIC8gMlxuICAgICAgICAgICAgICAgIGN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgICAgIGN0eC5tb3ZlVG8oYy54IC0gZHIyLCBjLnkgKyByZXNvbHV0aW9uICsgZHIyKVxuICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oYy54ICsgcjIsIGMueSAtIGRyMilcbiAgICAgICAgICAgICAgICBjdHgubGluZVRvKGMueCArIHJlc29sdXRpb24gKyBkcjIsIGMueSArIHJlc29sdXRpb24gKyBkcjIpXG4gICAgICAgICAgICAgICAgY3R4LmNsb3NlUGF0aCgpXG4gICAgICAgICAgICAgICAgY3R4LnN0cm9rZSgpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNoYXBlID09PSAndHJpYW5nbGVfbGVmdCcpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkcjIgPSAoc2l6ZSAtIHJlc29sdXRpb24pIC8gMlxuICAgICAgICAgICAgICAgIGN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgICAgIGN0eC5tb3ZlVG8oYy54ICsgcmVzb2x1dGlvbiArIGRyMiwgYy55ICsgcmVzb2x1dGlvbiArIGRyMilcbiAgICAgICAgICAgICAgICBjdHgubGluZVRvKGMueCAtIGRyMiwgYy55ICsgcjIpXG4gICAgICAgICAgICAgICAgY3R4LmxpbmVUbyhjLnggKyByZXNvbHV0aW9uICsgZHIyLCBjLnkgLSBkcjIpXG4gICAgICAgICAgICAgICAgY3R4LmNsb3NlUGF0aCgpXG4gICAgICAgICAgICAgICAgY3R4LnN0cm9rZSgpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNoYXBlID09PSAndHJpYW5nbGVfcmlnaHQnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZHIyID0gKHNpemUgLSByZXNvbHV0aW9uKSAvIDJcbiAgICAgICAgICAgICAgICBjdHguYmVnaW5QYXRoKClcbiAgICAgICAgICAgICAgICBjdHgubW92ZVRvKGMueCAtIGRyMiwgYy55IC0gZHIyKVxuICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oYy54ICsgcmVzb2x1dGlvbiArIGRyMiwgYy55ICsgcjIpXG4gICAgICAgICAgICAgICAgY3R4LmxpbmVUbyhjLnggLSBkcjIsIGMueSArIHJlc29sdXRpb24gKyBkcjIpXG4gICAgICAgICAgICAgICAgY3R4LmNsb3NlUGF0aCgpXG4gICAgICAgICAgICAgICAgY3R4LnN0cm9rZSgpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCBzaGFwZTonICsgc2hhcGUpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvL3VwZGF0ZSBsZWdlbmRzXG4gICAgICAgIHRoaXMudXBkYXRlTGVnZW5kcyh7IHN0eWxlOiB0aGlzLCByZXNvbHV0aW9uOiByZXNvbHV0aW9uLCB6OiB6LCB2aWV3U2NhbGU6IHZpZXdTY2FsZSB9KVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgU3R5bGUgfSBmcm9tICcuLi9jb3JlL1N0eWxlLmpzJ1xuXG4vKipcbiAqIEBtb2R1bGUgc3R5bGVcbiAqIEBhdXRob3IgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIFRleHRTdHlsZSBleHRlbmRzIFN0eWxlIHtcbiAgICAvKiogQHBhcmFtIHtvYmplY3R9IG9wdHMgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSB0ZXh0IG9mIGEgY2VsbC5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbCwgbnVtYmVyLCBudW1iZXIsIG9iamVjdCk6c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLnRleHQgPSBvcHRzLnRleHQgfHwgKCgpID0+ICdYJykgLy8oYyxyLHosdnMpID0+IHt9XG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBjb2xvciBvZiB0aGUgY2VsbC5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbCwgbnVtYmVyLCBudW1iZXIsIG9iamVjdCk6c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLmNvbG9yID0gb3B0cy5jb2xvciB8fCAoKCkgPT4gJ2JsYWNrJykgLy8oYyxyLHosdnMpID0+IHt9XG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBmb250IHNpemUgb2YgYSBjZWxsIGluIGdlbyB1bml0LlxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KCcuLi9jb3JlL0RhdGFzZXQuanMnKS5DZWxsLCBudW1iZXIsIG51bWJlcixvYmplY3QpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy5mb250U2l6ZSA9IG9wdHMuZm9udFNpemUgfHwgKChjZWxsLCByZXNvbHV0aW9uKSA9PiByZXNvbHV0aW9uKSAvLyhjLHIseix2cykgPT4ge31cblxuICAgICAgICAvKiogVGhlIHRleHQgZm9udCBmYW1pbHkuXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoJy4uL2NvcmUvRGF0YXNldC5qcycpLkNlbGwsIG51bWJlciwgbnVtYmVyLCBvYmplY3QpOnN0cmluZ30gKi9cbiAgICAgICAgdGhpcy5mb250RmFtaWx5ID0gb3B0cy5mb250RmFtaWx5IHx8ICgoKSA9PiAnQXJpYWwnKVxuXG4gICAgICAgIC8qKiBUaGUgdGV4dCBmb250IHdlaWdodC5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbCwgbnVtYmVyLCBudW1iZXIsIG9iamVjdCk6c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLmZvbnRXZWlnaHQgPSBvcHRzLmZvbnRXZWlnaHQgfHwgKCgpID0+ICdib2xkJylcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEcmF3IGNlbGxzIGFzIHRleHQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXRcIikuQ2VsbD59IGNlbGxzXG4gICAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb3JlL0dlb0NhbnZhc1wiKS5HZW9DYW52YXN9IGdlb0NhbnZhc1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByZXNvbHV0aW9uXG4gICAgICovXG4gICAgZHJhdyhjZWxscywgZ2VvQ2FudmFzLCByZXNvbHV0aW9uKSB7XG4gICAgICAgIC8vZmlsdGVyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlcikgY2VsbHMgPSBjZWxscy5maWx0ZXIodGhpcy5maWx0ZXIpXG5cbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgeiA9IGdlb0NhbnZhcy52aWV3LnpcbiAgICAgICAgY29uc3QgY3R4ID0gZ2VvQ2FudmFzLm9mZnNjcmVlbkN0eFxuICAgICAgICAvL2dldCB2aWV3IHNjYWxlXG4gICAgICAgIGNvbnN0IHZpZXdTY2FsZSA9IHRoaXMudmlld1NjYWxlID8gdGhpcy52aWV3U2NhbGUoY2VsbHMsIHJlc29sdXRpb24sIHopIDogdW5kZWZpbmVkXG5cbiAgICAgICAgLy9kcmF3IHdpdGggSFRNTCBjYW52YXNcbiAgICAgICAgLy9pbiBzY3JlZW4gY29vcmRpbmF0ZXNcbiAgICAgICAgZ2VvQ2FudmFzLmluaXRDYW52YXNUcmFuc2Zvcm0oKVxuXG4gICAgICAgIGZvciAobGV0IGNlbGwgb2YgY2VsbHMpIHtcbiAgICAgICAgICAgIC8vZ2V0IGNlbGwgdGV4dFxuICAgICAgICAgICAgY29uc3QgdGV4dCA9IHRoaXMudGV4dCA/IHRoaXMudGV4dChjZWxsLCByZXNvbHV0aW9uLCB6LCB2aWV3U2NhbGUpIDogdW5kZWZpbmVkXG4gICAgICAgICAgICBpZiAodGV4dCA9PSB1bmRlZmluZWQgfHwgdGV4dCA9PSBudWxsIHx8IHRleHQgKyAnJyA9PT0gJycpIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIC8vY29sb3JcbiAgICAgICAgICAgIGNvbnN0IGNvbCA9IHRoaXMuY29sb3IgPyB0aGlzLmNvbG9yKGNlbGwsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgOiB1bmRlZmluZWRcbiAgICAgICAgICAgIGlmICghY29sKSBjb250aW51ZVxuICAgICAgICAgICAgY3R4LmZpbGxTdHlsZSA9IGNvbFxuXG4gICAgICAgICAgICAvL2ZvbnQgc2l6ZVxuICAgICAgICAgICAgLy9zaXplIC0gaW4gcGl4ZWwgdW5pdFxuICAgICAgICAgICAgY29uc3QgZm9udFNpemVQaXggPSB0aGlzLmZvbnRTaXplKGNlbGwsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgLyB6XG4gICAgICAgICAgICBpZiAoIWZvbnRTaXplUGl4KSBjb250aW51ZVxuXG4gICAgICAgICAgICAvL3NldCBmb250XG4gICAgICAgICAgICBjb25zdCBmb250RmFtaWx5ID0gdGhpcy5mb250RmFtaWx5ID8gdGhpcy5mb250RmFtaWx5KGNlbGwsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgOiAnQXJpYWwnXG4gICAgICAgICAgICBjb25zdCBmb250V2VpZ2h0ID0gdGhpcy5mb250V2VpZ2h0ID8gdGhpcy5mb250V2VpZ2h0KGNlbGwsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgOiAnYm9sZCdcbiAgICAgICAgICAgIGN0eC5mb250ID0gZm9udFdlaWdodCArICcgJyArIGZvbnRTaXplUGl4ICsgJ3B4ICcgKyBmb250RmFtaWx5XG5cbiAgICAgICAgICAgIC8vZ2V0IG9mZnNldFxuICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5vZmZzZXQoY2VsbCwgcmVzb2x1dGlvbiwgeilcblxuICAgICAgICAgICAgLy90ZXh0IHBvc2l0aW9uXG4gICAgICAgICAgICBjdHgudGV4dEFsaWduID0gJ2NlbnRlcidcbiAgICAgICAgICAgIGNvbnN0IHR4ID0gZ2VvQ2FudmFzLmdlb1RvUGl4WChjZWxsLnggKyByZXNvbHV0aW9uICogMC41ICsgb2Zmc2V0LmR4KVxuICAgICAgICAgICAgY29uc3QgdHkgPSBnZW9DYW52YXMuZ2VvVG9QaXhZKGNlbGwueSArIHJlc29sdXRpb24gKiAwLjUgKyBvZmZzZXQuZHkpICsgZm9udFNpemVQaXggKiAwLjMgLy9pdCBzaG91bGQgYmUgMC41IGJ1dCAwLjMgc2VlbXMgdG8gd29yayBiZXR0ZXJcblxuICAgICAgICAgICAgLy9kcmF3IHRoZSB0ZXh0XG4gICAgICAgICAgICBjdHguZmlsbFRleHQodGV4dCwgdHgsIHR5KVxuICAgICAgICB9XG5cbiAgICAgICAgLy91cGRhdGUgbGVnZW5kc1xuICAgICAgICB0aGlzLnVwZGF0ZUxlZ2VuZHMoeyBzdHlsZTogdGhpcywgcmVzb2x1dGlvbjogcmVzb2x1dGlvbiwgejogeiwgdmlld1NjYWxlOiB2aWV3U2NhbGUgfSlcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBCdWlsZCBhIGZ1bmN0aW9uIFswLDFdLT5zdHJpbmcgZm9yIGNoYXJhY3RlcnMgbGVnZW5kXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxzdHJpbmc+fSBjaGFyc1xuICAgICAqIEBwYXJhbSB7KGZ1bmN0aW9uKG51bWJlcik6bnVtYmVyKXx1bmRlZmluZWR9IHNjYWxlXG4gICAgICogQHJldHVybnMge2Z1bmN0aW9uKG51bWJlcik6c3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyB0ZXh0U2NhbGUoY2hhcnMsIHNjYWxlID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IG5iID0gY2hhcnMubGVuZ3RoXG4gICAgICAgIHJldHVybiAodCkgPT4ge1xuICAgICAgICAgICAgaWYgKHNjYWxlKSB0ID0gc2NhbGUodClcbiAgICAgICAgICAgIGlmICh0ID09IDApIHJldHVybiAnJ1xuICAgICAgICAgICAgaWYgKHQgPj0gMSkgcmV0dXJuIGNoYXJzW25iIC0gMV1cbiAgICAgICAgICAgIHJldHVybiBjaGFyc1tNYXRoLmZsb29yKHQgKiBuYildXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IFN0eWxlIH0gZnJvbSAnLi4vY29yZS9TdHlsZS5qcydcblxuLyoqIEB0eXBlZGVmIHtcImZpcnN0XCJ8XCJib3R0b21cInxcImNlbnRlclwifFwidG9wXCJ8XCJsYXN0XCJ9IEFuY2hvck1vZGVZRW51bSAqL1xuXG4vKipcbiAqIFNob3cgY2VsbCBhcyB0aW1lc2VyaWVzIGNoYXJ0XG4gKiBDYW4gYmUgdXNlZCBmb3Igc3BhcmtsaW5lIG1hcCBvZiBodHRwczovL2RhdGFnaXN0aXBzLmh5cG90aGVzZXMub3JnLzQ4OFxuICpcbiAqIEBtb2R1bGUgc3R5bGVcbiAqIEBhdXRob3IgSnVsaWVuIEdhZmZ1cmlcbiAqL1xuZXhwb3J0IGNsYXNzIFRpbWVTZXJpZXNTdHlsZSBleHRlbmRzIFN0eWxlIHtcbiAgICAvKiogQHBhcmFtIHtvYmplY3R9IG9wdHMgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgICAgICAgLyoqIFRoZSBjb2x1bW5zIG9mIHRoZSB0aW1lIHNlcmllcywgb3JkZXJlZCBpbiBjaHJvbm9sb2dpY2FsIG9yZGVyLlxuICAgICAgICAgKiBAdHlwZSB7QXJyYXkuPHN0cmluZz59ICovXG4gICAgICAgIHRoaXMudHMgPSBvcHRzLnRzXG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gc3BlY2lmeWluZyB3aGVuIGEgdmFsdWUgc2hvdWxkIGJlIGNvbnNpZGVyZWQgYXMgXCJubyBkYXRhXCIgYW5kIHRodXMgbm90IGlnbm9yZWQuIFRoZSBsaW5lIHdpbGwgaGF2ZSBhIGJyZWFrIGF0IHRoZXNlIHZhbHVlcy5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKHN0cmluZyk6Ym9vbGVhbn0gKi9cbiAgICAgICAgdGhpcy5ub0RhdGEgPSBvcHRzLm5vRGF0YSB8fCAoKHYpID0+IHYgPT09IHVuZGVmaW5lZCB8fCB2ID09ICcnIHx8IHYgPT09IG51bGwgfHwgaXNOYU4oK3YpKVxuXG4gICAgICAgIC8veFxuICAgICAgICAvKiogaW4gZ2VvIHVuaXRcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydChcIi4uL2NvcmUvRGF0YXNldC5qc1wiKS5DZWxsLG51bWJlcixudW1iZXIpOm51bWJlcn0gKi9cbiAgICAgICAgdGhpcy5vZmZzZXRYID0gb3B0cy5vZmZzZXRYIHx8ICgoYywgciwgeikgPT4gMClcbiAgICAgICAgLyoqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXQuanNcIikuQ2VsbCxudW1iZXIsbnVtYmVyKTpudW1iZXJ9ICovXG4gICAgICAgIHRoaXMud2lkdGggPSBvcHRzLndpZHRoIHx8ICgoYywgciwgeikgPT4gcilcblxuICAgICAgICAvL3lcbiAgICAgICAgLyoqIGluIGdlbyB1bml0XG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXQuanNcIikuQ2VsbCxudW1iZXIsbnVtYmVyKTpudW1iZXJ9ICovXG4gICAgICAgIHRoaXMub2Zmc2V0WSA9IG9wdHMub2Zmc2V0WSB8fCAoKGMsIHIsIHopID0+IDApXG4gICAgICAgIC8qKiBAdHlwZSB7ZnVuY3Rpb24oaW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0LmpzXCIpLkNlbGwsbnVtYmVyLG51bWJlcik6bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLmhlaWdodCA9IG9wdHMuaGVpZ2h0IHx8ICgoYywgciwgeikgPT4gcilcbiAgICAgICAgLyoqIEB0eXBlIHtmdW5jdGlvbihpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXQuanNcIikuQ2VsbCxudW1iZXIsbnVtYmVyKTpBbmNob3JNb2RlWUVudW19ICovXG4gICAgICAgIHRoaXMuYW5jaG9yTW9kZVkgPSBvcHRzLmFuY2hvck1vZGVZIHx8ICgoYywgciwgeikgPT4gJ2NlbnRlcicpXG5cbiAgICAgICAgLyoqIEEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSB3aWR0aCBvZiB0aGUgbGluZSwgaW4gZ2VvIHVuaXRcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbCwgbnVtYmVyLCBudW1iZXIsIG9iamVjdCk6bnVtYmVyfSAqL1xuICAgICAgICB0aGlzLmxpbmVXaWR0aCA9IG9wdHMubGluZVdpZHRoIHx8ICgodiwgciwgcywgeikgPT4gMS41ICogeilcblxuICAgICAgICAvKiogQSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIGNvbG9yIG9mIHRoZSBjaGFydC5cbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9uKGltcG9ydCgnLi4vY29yZS9EYXRhc2V0LmpzJykuQ2VsbCwgbnVtYmVyLCBudW1iZXIsIG9iamVjdCk6c3RyaW5nfSAqL1xuICAgICAgICB0aGlzLmNvbG9yID0gb3B0cy5jb2xvciB8fCAoKCkgPT4gJ2JsYWNrJykgLy8oYyxyLHosdnMpID0+IHt9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRHJhdyBjZWxscyBhcyB0ZXh0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtBcnJheS48aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0LmpzXCIpLkNlbGw+fSBjZWxsc1xuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29yZS9HZW9DYW52YXMuanNcIikuR2VvQ2FudmFzfSBnZW9DYW52YXNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVzb2x1dGlvblxuICAgICAqL1xuICAgIGRyYXcoY2VsbHMsIGdlb0NhbnZhcywgcmVzb2x1dGlvbikge1xuICAgICAgICAvL2ZpbHRlclxuICAgICAgICBpZiAodGhpcy5maWx0ZXIpIGNlbGxzID0gY2VsbHMuZmlsdGVyKHRoaXMuZmlsdGVyKVxuXG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IHogPSBnZW9DYW52YXMudmlldy56XG4gICAgICAgIGNvbnN0IGN0eCA9IGdlb0NhbnZhcy5vZmZzY3JlZW5DdHhcblxuICAgICAgICAvL2dldCB2aWV3IHNjYWxlXG4gICAgICAgIGNvbnN0IHZpZXdTY2FsZSA9IHRoaXMudmlld1NjYWxlID8gdGhpcy52aWV3U2NhbGUoY2VsbHMsIHJlc29sdXRpb24sIHopIDogdW5kZWZpbmVkXG5cbiAgICAgICAgLy9jb21wdXRlIGNlbGwgYW1wbGl0dWRlXG4gICAgICAgIGNvbnN0IGdldEFtcGxpdHVkZSA9IChjKSA9PiB7XG4gICAgICAgICAgICBsZXQgbWluLCBtYXhcbiAgICAgICAgICAgIGZvciAobGV0IHQgb2YgdGhpcy50cykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IGNbdF1cbiAgICAgICAgICAgICAgICBpZiAodmFsID09IHVuZGVmaW5lZCkgY29udGludWVcbiAgICAgICAgICAgICAgICBpZiAobWluID09IHVuZGVmaW5lZCB8fCB2YWwgPCBtaW4pIG1pbiA9IHZhbFxuICAgICAgICAgICAgICAgIGlmIChtYXggPT0gdW5kZWZpbmVkIHx8IHZhbCA+IG1heCkgbWF4ID0gdmFsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWluID09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgICAgICAgcmV0dXJuIG1heCAtIG1pblxuICAgICAgICB9XG5cbiAgICAgICAgLy9jb21wdXRlIG1heCBhbXBsaXR1ZGVcbiAgICAgICAgbGV0IGFtcE1heFxuICAgICAgICBmb3IgKGxldCBjIG9mIGNlbGxzKSB7XG4gICAgICAgICAgICBjb25zdCBhbXAgPSBnZXRBbXBsaXR1ZGUoYylcbiAgICAgICAgICAgIGlmIChhbXAgPT0gdW5kZWZpbmVkKSBjb250aW51ZVxuICAgICAgICAgICAgaWYgKGFtcE1heCA9PSB1bmRlZmluZWQgfHwgYW1wID4gYW1wTWF4KSBhbXBNYXggPSBhbXBcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWFtcE1heCkgcmV0dXJuXG5cbiAgICAgICAgY29uc3QgbmIgPSB0aGlzLnRzLmxlbmd0aFxuXG4gICAgICAgIGN0eC5saW5lQ2FwID0gJ2J1dHQnXG4gICAgICAgIGZvciAobGV0IGMgb2YgY2VsbHMpIHtcbiAgICAgICAgICAgIC8vbGluZSB3aWR0aFxuICAgICAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ8dW5kZWZpbmVkfSAqL1xuICAgICAgICAgICAgY29uc3Qgd0cgPSB0aGlzLmxpbmVXaWR0aCA/IHRoaXMubGluZVdpZHRoKGMsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgOiB1bmRlZmluZWRcbiAgICAgICAgICAgIGlmICghd0cgfHwgd0cgPCAwKSBjb250aW51ZVxuXG4gICAgICAgICAgICAvL2xpbmUgY29sb3JcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfHVuZGVmaW5lZH0gKi9cbiAgICAgICAgICAgIGNvbnN0IGNvbCA9IHRoaXMuY29sb3IgPyB0aGlzLmNvbG9yKGMsIHJlc29sdXRpb24sIHosIHZpZXdTY2FsZSkgOiB1bmRlZmluZWRcbiAgICAgICAgICAgIGlmICghY29sKSBjb250aW51ZVxuXG4gICAgICAgICAgICAvL3hcbiAgICAgICAgICAgIGNvbnN0IG9mZlggPSB0aGlzLm9mZnNldFggPyB0aGlzLm9mZnNldFgoYywgcmVzb2x1dGlvbiwgeikgOiAwXG4gICAgICAgICAgICBpZiAob2ZmWCA9PSB1bmRlZmluZWQgfHwgaXNOYU4ob2ZmWCkpIGNvbnRpbnVlXG4gICAgICAgICAgICBjb25zdCB3ID0gdGhpcy53aWR0aCA/IHRoaXMud2lkdGgoYywgcmVzb2x1dGlvbiwgeikgOiByZXNvbHV0aW9uXG4gICAgICAgICAgICBpZiAodyA9PSB1bmRlZmluZWQgfHwgaXNOYU4odykpIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIC8veVxuICAgICAgICAgICAgY29uc3Qgb2ZmWSA9IHRoaXMub2Zmc2V0WSA/IHRoaXMub2Zmc2V0WShjLCByZXNvbHV0aW9uLCB6KSA6IDBcbiAgICAgICAgICAgIGlmIChvZmZZID09IHVuZGVmaW5lZCB8fCBpc05hTihvZmZZKSkgY29udGludWVcbiAgICAgICAgICAgIGNvbnN0IGggPSB0aGlzLmhlaWdodCA/IHRoaXMuaGVpZ2h0KGMsIHJlc29sdXRpb24sIHopIDogcmVzb2x1dGlvblxuICAgICAgICAgICAgaWYgKGggPT0gdW5kZWZpbmVkIHx8IGlzTmFOKGgpKSBjb250aW51ZVxuICAgICAgICAgICAgY29uc3QgYW5jaFkgPSB0aGlzLmFuY2hvck1vZGVZID8gdGhpcy5hbmNob3JNb2RlWShjLCByZXNvbHV0aW9uLCB6KSA6ICdjZW50ZXInXG4gICAgICAgICAgICBpZiAoIWFuY2hZKSBjb250aW51ZVxuXG4gICAgICAgICAgICBjdHgubGluZVdpZHRoID0gd0dcbiAgICAgICAgICAgIGN0eC5zdHJva2VTdHlsZSA9IGNvbFxuXG4gICAgICAgICAgICAvL2NvbXB1dGUgYW5jaG9yIFkgZmlndXJlc1xuICAgICAgICAgICAgbGV0IHZhbDAsIHkwXG4gICAgICAgICAgICBpZiAoYW5jaFkgPT09ICdmaXJzdCcpIHtcbiAgICAgICAgICAgICAgICAvL2dldCBmaXJzdCB2YWx1ZVxuICAgICAgICAgICAgICAgIHZhbDAgPSBjW3RoaXMudHNbMF1dXG4gICAgICAgICAgICAgICAgeTAgPSAwXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGFuY2hZID09PSAnbGFzdCcpIHtcbiAgICAgICAgICAgICAgICAvL2dldCBsYXN0IHZhbHVlXG4gICAgICAgICAgICAgICAgdmFsMCA9IGNbdGhpcy50c1t0aGlzLnRzLmxlbmd0aCAtIDFdXVxuICAgICAgICAgICAgICAgIHkwID0gMFxuICAgICAgICAgICAgfSBlbHNlIGlmIChhbmNoWSA9PT0gJ2JvdHRvbScpIHtcbiAgICAgICAgICAgICAgICAvL2dldCBtaW5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCB0IG9mIHRoaXMudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsID0gK2NbdF1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbCA9PSB1bmRlZmluZWQpIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWwwID09IHVuZGVmaW5lZCB8fCB2YWwgPCB2YWwwKSB2YWwwID0gdmFsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHkwID0gMFxuICAgICAgICAgICAgfSBlbHNlIGlmIChhbmNoWSA9PT0gJ3RvcCcpIHtcbiAgICAgICAgICAgICAgICAvL2dldCBtYXhcbiAgICAgICAgICAgICAgICBmb3IgKGxldCB0IG9mIHRoaXMudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsID0gK2NbdF1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbCA9PSB1bmRlZmluZWQpIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWwwID09IHVuZGVmaW5lZCB8fCB2YWwgPiB2YWwwKSB2YWwwID0gdmFsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHkwID0gcmVzb2x1dGlvblxuICAgICAgICAgICAgfSBlbHNlIGlmIChhbmNoWSA9PT0gJ2NlbnRlcicpIHtcbiAgICAgICAgICAgICAgICAvL2dldCBtaW4gYW5kIG1heFxuICAgICAgICAgICAgICAgIGxldCBtaW4sIG1heFxuICAgICAgICAgICAgICAgIGZvciAobGV0IHQgb2YgdGhpcy50cykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSBjW3RdXG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWwgPT0gdW5kZWZpbmVkKSBjb250aW51ZVxuICAgICAgICAgICAgICAgICAgICBpZiAobWluID09IHVuZGVmaW5lZCB8fCB2YWwgPCBtaW4pIG1pbiA9IHZhbFxuICAgICAgICAgICAgICAgICAgICBpZiAobWF4ID09IHVuZGVmaW5lZCB8fCB2YWwgPiBtYXgpIG1heCA9IHZhbFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YWwwID0gKCttYXggKyArbWluKSAqIDAuNVxuICAgICAgICAgICAgICAgIHkwID0gcmVzb2x1dGlvbiAvIDJcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1VuZXhwZWN0ZWQgYW5jaG9yTW9kZVk6ICcgKyBhbmNoWSlcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKi9kcmF3IGxpbmVcbiAgICAgICAgICAgIGlmICh2YWwwID09IHVuZGVmaW5lZCB8fCBpc05hTih2YWwwKSkgY29udGludWVcbiAgICAgICAgICAgIGNnLmN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgY29uc3Qgc1ggPSB3IC8gKG5iIC0gMSlcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmI7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IGNbdGhpcy50c1tpXV1cbiAgICAgICAgICAgICAgICBpZiAodmFsID09IHVuZGVmaW5lZCB8fCBpc05hTih2YWwpKSBicmVha1xuICAgICAgICAgICAgICAgIGlmIChpID09IDApXG4gICAgICAgICAgICAgICAgICAgIGNnLmN0eC5tb3ZlVG8oYy54ICsgaSAqIHNYICsgb2ZmWCwgYy55ICsgeTAgKyAodmFsIC0gdmFsMCkgKiBoIC8gYW1wTWF4ICsgb2ZmWSlcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIGNnLmN0eC5saW5lVG8oYy54ICsgaSAqIHNYICsgb2ZmWCwgYy55ICsgeTAgKyAodmFsIC0gdmFsMCkgKiBoIC8gYW1wTWF4ICsgb2ZmWSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNnLmN0eC5zdHJva2UoKSovXG5cbiAgICAgICAgICAgIC8vZHJhdyBsaW5lLCBzZWdtZW50IGJ5IHNlZ21lbnRcbiAgICAgICAgICAgIGNvbnN0IHNYID0gdyAvIChuYiAtIDEpXG5cbiAgICAgICAgICAgIC8vaGFuZGxlIGZpcnN0IHBvaW50XG4gICAgICAgICAgICBsZXQgdjAgPSBjW3RoaXMudHNbMF1dXG4gICAgICAgICAgICBpZiAoIXRoaXMubm9EYXRhKHYwKSkge1xuICAgICAgICAgICAgICAgIGN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgICAgIGN0eC5tb3ZlVG8oYy54ICsgb2ZmWCwgYy55ICsgeTAgKyAoKHYwIC0gdmFsMCkgKiBoKSAvIGFtcE1heCArIG9mZlkpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKHYwLCBpc05hTih2MCkpXG5cbiAgICAgICAgICAgIGxldCB2MVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBuYjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdjEgPSBjW3RoaXMudHNbaV1dXG5cbiAgICAgICAgICAgICAgICAvL2RyYXcgc2VnbWVudCBmcm9tIHYwIHRvIHYxXG5cbiAgICAgICAgICAgICAgICAvL2JvdGggcG9pbnRzICdubyBkYXRhJ1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm5vRGF0YSh2MCkgJiYgdGhpcy5ub0RhdGEodjEpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vc2Vjb25kIHBvaW50ICdubyBkYXRhJ1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMubm9EYXRhKHYwKSAmJiB0aGlzLm5vRGF0YSh2MSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4LnN0cm9rZSgpXG5cbiAgICAgICAgICAgICAgICAgICAgLy9maXJzdCBwb2ludCAnbm8gZGF0YSdcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMubm9EYXRhKHYwKSAmJiAhdGhpcy5ub0RhdGEodjEpKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eC5iZWdpblBhdGgoKVxuICAgICAgICAgICAgICAgICAgICBjdHgubW92ZVRvKGMueCArIGkgKiBzWCArIG9mZlgsIGMueSArIHkwICsgKCh2MSAtIHZhbDApICogaCkgLyBhbXBNYXggKyBvZmZZKVxuXG4gICAgICAgICAgICAgICAgICAgIC8vYm90aCBwb2ludHMgaGF2ZSBkYXRhOiB0cmFjZSBsaW5lXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4LmxpbmVUbyhjLnggKyBpICogc1ggKyBvZmZYLCBjLnkgKyB5MCArICgodjEgLSB2YWwwKSAqIGgpIC8gYW1wTWF4ICsgb2ZmWSlcbiAgICAgICAgICAgICAgICAgICAgLy9pZiBpdCBpcyB0aGUgbGFzdCBwb2ludCwgc3Ryb2tlXG4gICAgICAgICAgICAgICAgICAgIGlmIChpID09IG5iIC0gMSkgY3R4LnN0cm9rZSgpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHYwID0gdjFcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vdXBkYXRlIGxlZ2VuZCwgaWYgYW55XG4gICAgICAgIHRoaXMudXBkYXRlTGVnZW5kcyh7IHN0eWxlOiB0aGlzLCByZXNvbHV0aW9uOiByZXNvbHV0aW9uLCB6OiB6LCB2aWV3U2NhbGU6IHZpZXdTY2FsZSB9KVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgaW5pdFNoYWRlclByb2dyYW0sIGNyZWF0ZVNoYWRlciB9IGZyb20gJy4vd2ViR0xVdGlscy5qcydcbmltcG9ydCB7IGNvbG9yIH0gZnJvbSAnZDMtY29sb3InXG5cbi8qKlxuICogRXZlcnl0aGluZyB0byBlYXNpbHkgZHJhdyBjb2xvcmVkIHNxdWFyZXMgd2l0aCB3ZWJHTC5cbiAqIEFsbCB0aGUgc2FtZSBzaXplLCBidXQgZGlmZmVyZW50IGZpbGwgY29sb3IuXG4gKi9cbmV4cG9ydCBjbGFzcyBXZWJHTFNxdWFyZUNvbG9yaW5nIHtcbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7V2ViR0xSZW5kZXJpbmdDb250ZXh0fSBnbFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGdsLCBzaXplUGl4KSB7XG4gICAgICAgIHRoaXMuZ2wgPSBnbFxuICAgICAgICB0aGlzLnNpemVQaXggPSBzaXplUGl4IHx8IDEwLjBcblxuICAgICAgICB0aGlzLnByb2dyYW0gPSBpbml0U2hhZGVyUHJvZ3JhbShcbiAgICAgICAgICAgIGdsLFxuICAgICAgICAgICAgY3JlYXRlU2hhZGVyKFxuICAgICAgICAgICAgICAgIGdsLFxuICAgICAgICAgICAgICAgIGdsLlZFUlRFWF9TSEFERVIsXG4gICAgICAgICAgICAgICAgYFxuICAgICAgICAgICAgYXR0cmlidXRlIHZlYzIgcG9zO1xuICAgICAgICAgICAgdW5pZm9ybSBmbG9hdCBzaXplUGl4O1xuICAgICAgICAgICAgdW5pZm9ybSBtYXQzIG1hdDtcbiAgICAgICAgICAgIGF0dHJpYnV0ZSB2ZWM0IGNvbG9yO1xuICAgICAgICAgICAgdmFyeWluZyB2ZWM0IHZDb2xvcjtcbiAgICAgICAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgICAgICAgZ2xfUG9zaXRpb24gPSB2ZWM0KG1hdCAqIHZlYzMocG9zLCAxLjApLCAxLjApO1xuICAgICAgICAgICAgICBnbF9Qb2ludFNpemUgPSBzaXplUGl4O1xuICAgICAgICAgICAgICB2Q29sb3IgPSBjb2xvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBgXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgY3JlYXRlU2hhZGVyKFxuICAgICAgICAgICAgICAgIGdsLFxuICAgICAgICAgICAgICAgIGdsLkZSQUdNRU5UX1NIQURFUixcbiAgICAgICAgICAgICAgICBgXG4gICAgICAgICAgICBwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbiAgICAgICAgICAgIHZhcnlpbmcgdmVjNCB2Q29sb3I7XG4gICAgICAgICAgICB2b2lkIG1haW4odm9pZCkge1xuICAgICAgICAgICAgICAgIHZlYzQgdkNvbG9yXyA9IHZDb2xvciAvIDI1NS4wO1xuICAgICAgICAgICAgICAgIHZDb2xvcl9bM10gPSAyNTUuMCAqIHZDb2xvcl9bM107XG4gICAgICAgICAgICAgICAgZ2xfRnJhZ0NvbG9yID0gdkNvbG9yXztcbiAgICAgICAgICAgIH1gXG4gICAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgICAgZ2wudXNlUHJvZ3JhbSh0aGlzLnByb2dyYW0pXG5cbiAgICAgICAgLy9idWZmZXIgZGF0YVxuICAgICAgICB0aGlzLnZlcnRpY2VzQnVmZmVyID0gW11cbiAgICAgICAgdGhpcy5jb2xvcnNCdWZmZXIgPSBbXVxuICAgIH1cblxuICAgIC8qKiBBZGQgZGF0YSB0byB2ZXJ0aWNlcy9zaXplL2NvbG9yIGJ1ZmZlcnMgZm9yIGNvbG9yIHNxdWFyZXMgZHJhd2luZyAqL1xuICAgIGFkZFBvaW50RGF0YSh4QywgeUMsIGNvbCkge1xuICAgICAgICAvL2NvbnZlcnQgY29sb3JcbiAgICAgICAgY29uc3QgY2MgPSBjb2xvcihjb2wpXG4gICAgICAgIC8vY29uc3QgY2MgPSB7cjo0NSxnOjg3LGI6OTgsb3BhY2l0eTowLjl9XG4gICAgICAgIGlmICghY2MpIHJldHVyblxuXG4gICAgICAgIC8vdmVydGljZXNcbiAgICAgICAgdGhpcy52ZXJ0aWNlc0J1ZmZlci5wdXNoKHhDLCB5QylcbiAgICAgICAgLy9jb2xvclxuICAgICAgICB0aGlzLmNvbG9yc0J1ZmZlci5wdXNoKGNjLnIsIGNjLmcsIGNjLmIsIGNjLm9wYWNpdHkpXG4gICAgfVxuXG4gICAgYWRkUG9pbnREYXRhMih4QywgeUMsIHIsIGcsIGIsIG9wYWNpdHkpIHtcbiAgICAgICAgLy92ZXJ0aWNlc1xuICAgICAgICB0aGlzLnZlcnRpY2VzQnVmZmVyLnB1c2goeEMsIHlDKVxuICAgICAgICAvL2NvbG9yXG4gICAgICAgIHRoaXMuY29sb3JzQnVmZmVyLnB1c2gociwgZywgYiwgb3BhY2l0eSlcbiAgICB9XG5cbiAgICAvKiogICovXG4gICAgZHJhdyh0cmFuc2ZvTWF0KSB7XG4gICAgICAgIGNvbnN0IGdsID0gdGhpcy5nbFxuXG4gICAgICAgIC8vdmVydGljZSBkYXRhXG4gICAgICAgIGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCBnbC5jcmVhdGVCdWZmZXIoKSlcbiAgICAgICAgZ2wuYnVmZmVyRGF0YShnbC5BUlJBWV9CVUZGRVIsIG5ldyBGbG9hdDMyQXJyYXkodGhpcy52ZXJ0aWNlc0J1ZmZlciksIGdsLlNUQVRJQ19EUkFXKVxuICAgICAgICBjb25zdCBwb3NpdGlvbiA9IGdsLmdldEF0dHJpYkxvY2F0aW9uKHRoaXMucHJvZ3JhbSwgJ3BvcycpXG4gICAgICAgIGdsLnZlcnRleEF0dHJpYlBvaW50ZXIoXG4gICAgICAgICAgICBwb3NpdGlvbixcbiAgICAgICAgICAgIDIsIC8vbnVtQ29tcG9uZW50c1xuICAgICAgICAgICAgZ2wuRkxPQVQsIC8vdHlwZVxuICAgICAgICAgICAgZmFsc2UsIC8vbm9ybWFsaXNlXG4gICAgICAgICAgICAwLCAvL3N0cmlkZVxuICAgICAgICAgICAgMCAvL29mZnNldFxuICAgICAgICApXG4gICAgICAgIGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KHBvc2l0aW9uKVxuXG4gICAgICAgIC8vY29sb3IgZGF0YVxuICAgICAgICBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgZ2wuY3JlYXRlQnVmZmVyKCkpXG4gICAgICAgIGdsLmJ1ZmZlckRhdGEoZ2wuQVJSQVlfQlVGRkVSLCBuZXcgRmxvYXQzMkFycmF5KHRoaXMuY29sb3JzQnVmZmVyKSwgZ2wuU1RBVElDX0RSQVcpXG4gICAgICAgIHZhciBjb2xvciA9IGdsLmdldEF0dHJpYkxvY2F0aW9uKHRoaXMucHJvZ3JhbSwgJ2NvbG9yJylcbiAgICAgICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihjb2xvciwgNCwgZ2wuRkxPQVQsIGZhbHNlLCAwLCAwKVxuICAgICAgICBnbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShjb2xvcilcblxuICAgICAgICAvL3NpemVQaXhcbiAgICAgICAgZ2wudW5pZm9ybTFmKGdsLmdldFVuaWZvcm1Mb2NhdGlvbih0aGlzLnByb2dyYW0sICdzaXplUGl4JyksIDEuMCAqIHRoaXMuc2l6ZVBpeClcblxuICAgICAgICAvL3RyYW5zZm9ybWF0aW9uXG4gICAgICAgIGdsLnVuaWZvcm1NYXRyaXgzZnYoZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHRoaXMucHJvZ3JhbSwgJ21hdCcpLCBmYWxzZSwgbmV3IEZsb2F0MzJBcnJheSh0cmFuc2ZvTWF0KSlcblxuICAgICAgICAvLyBFbmFibGUgdGhlIGRlcHRoIHRlc3RcbiAgICAgICAgLy9nbC5lbmFibGUoZ2wuREVQVEhfVEVTVCk7XG4gICAgICAgIC8vIENsZWFyIHRoZSBjb2xvciBidWZmZXIgYml0XG4gICAgICAgIGdsLmNsZWFyKGdsLkNPTE9SX0JVRkZFUl9CSVQpXG4gICAgICAgIC8vIFNldCB0aGUgdmlldyBwb3J0XG4gICAgICAgIC8vZ2wudmlld3BvcnQoMCwgMCwgY2cudywgY2cuaCk7XG5cbiAgICAgICAgZ2wuZHJhd0FycmF5cyhnbC5QT0lOVFMsIDAsIHRoaXMudmVydGljZXNCdWZmZXIubGVuZ3RoIC8gMilcbiAgICB9XG59XG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IGluaXRTaGFkZXJQcm9ncmFtLCBjcmVhdGVTaGFkZXIgfSBmcm9tICcuL3dlYkdMVXRpbHMuanMnXG5pbXBvcnQgeyBjb2xvciB9IGZyb20gJ2QzLWNvbG9yJ1xuXG4vKipcbiAqIEV2ZXJ5dGhpbmcgdG8gZWFzaWx5IGRyYXcgY29sb3JlZCBzcXVhcmVzIHdpdGggd2ViR0wuXG4gKiBBbGwgdGhlIHNhbWUgc2l6ZSwgYnV0IGRpZmZlcmVudCBmaWxsIGNvbG9yLlxuICogVGhlIGNvbG9yIGludGVycG9sYXRpb24gaXMgY29tcHV0ZWQgaW4gdGhlIGZyYWdtZW50IHNoYWRlciBwcm9ncmFtLCBieSB0aGUgR1BVLCB0aHVzIGl0IGlzIGxlc3MgZmxleGlibGUgYnV0IGZhc3Rlci5cbiAqL1xuZXhwb3J0IGNsYXNzIFdlYkdMU3F1YXJlQ29sb3JpbmdBZHZhbmNlZCB7XG4gICAgLy9zZWU6XG4gICAgLy9odHRwczovL3dlYmdsZnVuZGFtZW50YWxzLm9yZy93ZWJnbC9sZXNzb25zL2ZyL3dlYmdsLXNoYWRlcnMtYW5kLWdsc2wuaHRtbCNsZXMtdW5pZm9ybXMtZGFucy1sZXMtc2hhZGVycy1kZS12ZXJ0ZXhcbiAgICAvL2h0dHBzOi8vdGhlYm9va29mc2hhZGVycy5jb20vZ2xvc3NhcnkvP3NlYXJjaD1taXhcbiAgICAvL2h0dHBzOi8vdGhlYm9va29mc2hhZGVycy5jb20vMDYvXG4gICAgLy9odHRwczovL3RoZWJvb2tvZnNoYWRlcnMuY29tL2dsb3NzYXJ5L1xuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0geyp9IGdsXG4gICAgICogQHBhcmFtIHtBcnJheS48U3RyaW5nPn0gY29sb3JzXG4gICAgICogQHBhcmFtIHt7ZnVuOnN0cmluZyxhbHBoYTpudW1iZXJ9fSBzdHJldGNoaW5nXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHNpemVQaXhcbiAgICAgKiBAcGFyYW0ge251bWJlcnx1bmRlZmluZWR9IGdsb2JhbE9wYWNpdHlcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihnbCwgY29sb3JzLCBzdHJldGNoaW5nLCBzaXplUGl4ID0gMTAsIGdsb2JhbE9wYWNpdHkgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgLyoqIEB0eXBlIHtXZWJHTFJlbmRlcmluZ0NvbnRleHR9ICovXG4gICAgICAgIHRoaXMuZ2wgPSBnbFxuICAgICAgICAvL2dsLnBpeGVsU3RvcmVpKGdsLlVOUEFDS19QUkVNVUxUSVBMWV9BTFBIQV9XRUJHTCwgdHJ1ZSk7XG4gICAgICAgIC8vZ2wuYmxlbmRGdW5jKGdsLlNSQ19BTFBIQSwgZ2wuT05FX01JTlVTX1NSQ19BTFBIQSk7XG4gICAgICAgIC8vZ2wuYmxlbmRGdW5jKGdsLk9ORSwgZ2wuT05FX01JTlVTX1NSQ19BTFBIQSk7XG5cbiAgICAgICAgLyoqIEB0eXBlIHtXZWJHTFNoYWRlcn0gKi9cbiAgICAgICAgY29uc3QgdlNoYWRlciA9IGNyZWF0ZVNoYWRlcihcbiAgICAgICAgICAgIGdsLFxuICAgICAgICAgICAgZ2wuVkVSVEVYX1NIQURFUixcbiAgICAgICAgICAgIGBcbiAgICAgICAgYXR0cmlidXRlIHZlYzIgcG9zO1xuICAgICAgICB1bmlmb3JtIGZsb2F0IHNpemVQaXg7XG4gICAgICAgIHVuaWZvcm0gbWF0MyBtYXQ7XG5cbiAgICAgICAgYXR0cmlidXRlIGZsb2F0IHQ7XG4gICAgICAgIHZhcnlpbmcgZmxvYXQgdnQ7XG5cbiAgICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAgIGdsX1Bvc2l0aW9uID0gdmVjNChtYXQgKiB2ZWMzKHBvcywgMS4wKSwgMS4wKTtcbiAgICAgICAgICBnbF9Qb2ludFNpemUgPSBzaXplUGl4O1xuICAgICAgICAgIHZ0ID0gdDtcbiAgICAgICAgfVxuICAgICAgYFxuICAgICAgICApXG5cbiAgICAgICAgLy9wcmVwYXJlIGZyYWdtZW50IHNoYWRlciBjb2RlXG4gICAgICAgIC8vZGVjbGFyZSB0aGUgdW5pZm9ybSBhbmQgb3RoZXIgdmFyaWFibGVzXG4gICAgICAgIGNvbnN0IGZzaEJ1ZmYgPSBbXVxuICAgICAgICBmc2hCdWZmLnB1c2goJ3ByZWNpc2lvbiBtZWRpdW1wIGZsb2F0OycpXG4gICAgICAgIGZzaEJ1ZmYucHVzaCgndmFyeWluZyBmbG9hdCB2dDsnKVxuICAgICAgICBmc2hCdWZmLnB1c2goJ3VuaWZvcm0gZmxvYXQgYWxwaGE7JylcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2xvcnMubGVuZ3RoOyBpKyspIGZzaEJ1ZmYucHVzaCgndW5pZm9ybSB2ZWM0IGMnICsgaSArICc7JylcbiAgICAgICAgLy9zdGFydCB0aGUgbWFpbiBmdW5jdGlvblxuICAgICAgICBmc2hCdWZmLnB1c2goJ3ZvaWQgbWFpbih2b2lkKSB7JylcblxuICAgICAgICAvLyBhcHBseSB0aGUgc3RyZXRjaGluZyBvZiB0XG4gICAgICAgIGlmIChzdHJldGNoaW5nKSB7XG4gICAgICAgICAgICBpZiAoc3RyZXRjaGluZy5mdW4gPT0gJ3BvdycpXG4gICAgICAgICAgICAgICAgLy9zUG93ID0gKHQsIGFscGhhID0gMykgPT4gTWF0aC5wb3codCwgYWxwaGEpO1xuICAgICAgICAgICAgICAgIGZzaEJ1ZmYucHVzaCgnICAgZmxvYXQgdCA9IHBvdyh2dCwgYWxwaGEpOycpXG4gICAgICAgICAgICBlbHNlIGlmIChzdHJldGNoaW5nLmZ1biA9PSAncG93SW52JylcbiAgICAgICAgICAgICAgICAvL3NQb3dSZXYgPSAodCwgYWxwaGEgPSAzKSA9PiAxIC0gTWF0aC5wb3coMSAtIHQsIDEgLyBhbHBoYSk7XG4gICAgICAgICAgICAgICAgZnNoQnVmZi5wdXNoKCcgICBmbG9hdCB0ID0gMS4wLXBvdygxLjAtdnQsIDEuMC9hbHBoYSk7JylcbiAgICAgICAgICAgIGVsc2UgaWYgKHN0cmV0Y2hpbmcuZnVuID09ICdleHAnKVxuICAgICAgICAgICAgICAgIC8vc0V4cCA9ICh0LCBhbHBoYSA9IDMpID0+IGFscGhhID09IDAgPyB0IDogKE1hdGguZXhwKHQgKiBhbHBoYSkgLSAxKSAvIChNYXRoLmV4cChhbHBoYSkgLSAxKTtcbiAgICAgICAgICAgICAgICBmc2hCdWZmLnB1c2goXG4gICAgICAgICAgICAgICAgICAgIHN0cmV0Y2hpbmcuYWxwaGEgPT0gMFxuICAgICAgICAgICAgICAgICAgICAgICAgPyBgZmxvYXQgdCA9IHZ0O2BcbiAgICAgICAgICAgICAgICAgICAgICAgIDogJyAgIGZsb2F0IHQgPSAoZXhwKHZ0ICogYWxwaGEpIC0gMS4wKSAvIChleHAoYWxwaGEpIC0gMS4wKTsnKVxuICAgICAgICAgICAgZWxzZSBpZiAoc3RyZXRjaGluZy5mdW4gPT0gJ2xvZycpXG4gICAgICAgICAgICAgICAgLy9zRXhwUmV2ID0gKHQsIGFscGhhID0gMykgPT4gYWxwaGEgPT0gMCA/IHQgOiAxIC0gKDEgLyBhbHBoYSkgKiBNYXRoLmxvZyhNYXRoLmV4cChhbHBoYSkgKiAoMSAtIHQpICsgdCk7XG4gICAgICAgICAgICAgICAgZnNoQnVmZi5wdXNoKFxuICAgICAgICAgICAgICAgICAgICBzdHJldGNoaW5nLmFscGhhID09IDBcbiAgICAgICAgICAgICAgICAgICAgICAgID8gYGZsb2F0IHQgPSB2dDtgXG4gICAgICAgICAgICAgICAgICAgICAgICA6ICcgICBmbG9hdCB0ID0gMS4wIC0gKDEuMCAvIGFscGhhKSAqIGxvZyhleHAoYWxwaGEpICogKDEuMCAtIHZ0KSArIHZ0KTsnKVxuICAgICAgICAgICAgZWxzZSBpZiAoc3RyZXRjaGluZy5mdW4gPT0gJ2NpcmNsZScpIHtcbiAgICAgICAgICAgICAgICBpZiAoc3RyZXRjaGluZy5hbHBoYSA9PSAwKVxuICAgICAgICAgICAgICAgICAgICAvL2lmIChhbHBoYSA9PSAwKSByZXR1cm4gdDtcbiAgICAgICAgICAgICAgICAgICAgZnNoQnVmZi5wdXNoKCcgICBmbG9hdCB0ID0gdnQ7JylcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChzdHJldGNoaW5nLmFscGhhID09IDEpXG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIChhbHBoYSA9PSAxKSByZXR1cm4gTWF0aC5zcXJ0KDIgKiB0IC0gdCAqIHQpO1xuICAgICAgICAgICAgICAgICAgICBmc2hCdWZmLnB1c2goJyAgIGZsb2F0IHQgPSBzcXJ0KHZ0ICogKDIuMCAtIHZ0KSk7JylcbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy9jb25zdCBhID0gYWxwaGEgLyAoMSAtIGFscGhhKTtcbiAgICAgICAgICAgICAgICAgICAgLy9yZXR1cm4gTWF0aC5zcXJ0KDEgLyAoYSAqIGEpICsgdCAqICgyIC8gYSArIDIgLSB0KSkgLSAxIC8gYTtcbiAgICAgICAgICAgICAgICAgICAgZnNoQnVmZi5wdXNoKCcgICBmbG9hdCBhID0gYWxwaGEgLyAoMS4wIC0gYWxwaGEpOycpXG4gICAgICAgICAgICAgICAgICAgIGZzaEJ1ZmYucHVzaCgnICAgZmxvYXQgdCA9IHNxcnQoMS4wIC8gKGEgKiBhKSArIHZ0ICogKCAyLjAvYSArIDIuMCAtIHZ0ICkpIC0gMS4wIC8gYTsnKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyZXRjaGluZy5mdW4gPT0gJ2NpcmNsZUludicpIHtcbiAgICAgICAgICAgICAgICAvLyAxIC0gc0NpcmNsZUxvdygxIC0gdCwgYWxwaGEpXG4gICAgICAgICAgICAgICAgaWYgKHN0cmV0Y2hpbmcuYWxwaGEgPT0gMClcbiAgICAgICAgICAgICAgICAgICAgLy9pZiAoYWxwaGEgPT0gMCkgcmV0dXJuIHQ7XG4gICAgICAgICAgICAgICAgICAgIGZzaEJ1ZmYucHVzaCgnICAgZmxvYXQgdCA9IHZ0OycpXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoc3RyZXRjaGluZy5hbHBoYSA9PSAxKVxuICAgICAgICAgICAgICAgICAgICAvLyBpZiAoYWxwaGEgPT0gMSkgcmV0dXJuIE1hdGguc3FydCgyICogdCAtIHQgKiB0KTtcbiAgICAgICAgICAgICAgICAgICAgZnNoQnVmZi5wdXNoKCcgICBmbG9hdCB0ID0gMS4wIC0gc3FydCgoMS4wIC0gdnQpICogKDEuMCArIHZ0KSk7JylcbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy9jb25zdCBhID0gYWxwaGEgLyAoMSAtIGFscGhhKTtcbiAgICAgICAgICAgICAgICAgICAgLy9yZXR1cm4gTWF0aC5zcXJ0KDEgLyAoYSAqIGEpICsgKDIgKiB0KSAvIGEgKyAyICogdCAtIHQgKiB0KSAtIDEgLyBhO1xuICAgICAgICAgICAgICAgICAgICBmc2hCdWZmLnB1c2goJyAgIGZsb2F0IGEgPSBhbHBoYSAvICgxLjAgLSBhbHBoYSk7JylcbiAgICAgICAgICAgICAgICAgICAgZnNoQnVmZi5wdXNoKCcgICBmbG9hdCB0ID0gMS4wIC0gc3FydCgxLjAgLyAoYSAqIGEpICsgKDEuMC12dCkgKiAoIDIuMC9hICsgMS4wICsgdnQgKSkgKyAxLjAgLyBhOycpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdVbmV4cGVjdGVkIHN0cmV0Y2hpbmcgZnVuY3Rpb24gY29kZTogJyArIHN0cmV0Y2hpbmcuZnVuKVxuICAgICAgICAgICAgICAgIGZzaEJ1ZmYucHVzaCgnICAgZmxvYXQgdCA9IHZ0OycpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmc2hCdWZmLnB1c2goJyAgIGZsb2F0IHQgPSB2dDsnKVxuICAgICAgICB9XG5cbiAgICAgICAgLy9jaG9vc2UgaW5pdGlhbCBhbmQgZmluYWwgY29sb3JzLCBhbmQgYWRqdXN0IHQgdmFsdWVcbiAgICAgICAgaWYgKGNvbG9ycy5sZW5ndGggPT0gMSkge1xuICAgICAgICAgICAgZnNoQnVmZi5wdXNoKCcgICB2ZWM0IGNJPWMwOycpXG4gICAgICAgICAgICBmc2hCdWZmLnB1c2goJyAgIHZlYzQgY0Y9YzA7JylcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjb2xvcnMubGVuZ3RoID09IDIpIHtcbiAgICAgICAgICAgIGZzaEJ1ZmYucHVzaCgnICAgdmVjNCBjST1jMDsnKVxuICAgICAgICAgICAgZnNoQnVmZi5wdXNoKCcgICB2ZWM0IGNGPWMxOycpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBuYiA9IGNvbG9ycy5sZW5ndGggLSAxXG4gICAgICAgICAgICBjb25zdCBuYnMgPSBuYiArICcuMCdcbiAgICAgICAgICAgIGZzaEJ1ZmYucHVzaCgnICAgdmVjNCBjSTsnKVxuICAgICAgICAgICAgZnNoQnVmZi5wdXNoKCcgICB2ZWM0IGNGOycpXG4gICAgICAgICAgICBmc2hCdWZmLnB1c2goJyAgIGlmKHQ8MS4wLycgKyBuYnMgKyAnKSB7IGNJPWMwOyBjRj1jMTsgdD10KicgKyBuYnMgKyAnOyB9JylcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAyOyBpIDwgbmI7IGkrKylcbiAgICAgICAgICAgICAgICBmc2hCdWZmLnB1c2goXG4gICAgICAgICAgICAgICAgICAgICcgICBlbHNlIGlmKHQ8JyArXG4gICAgICAgICAgICAgICAgICAgIGkgK1xuICAgICAgICAgICAgICAgICAgICAnLjAvJyArXG4gICAgICAgICAgICAgICAgICAgIG5icyArXG4gICAgICAgICAgICAgICAgICAgICcpIHsgY0k9YycgK1xuICAgICAgICAgICAgICAgICAgICAoaSAtIDEpICtcbiAgICAgICAgICAgICAgICAgICAgJzsgY0Y9YycgK1xuICAgICAgICAgICAgICAgICAgICBpICtcbiAgICAgICAgICAgICAgICAgICAgJzsgdD0nICtcbiAgICAgICAgICAgICAgICAgICAgbmJzICtcbiAgICAgICAgICAgICAgICAgICAgJyp0LScgK1xuICAgICAgICAgICAgICAgICAgICAoaSAtIDEpICtcbiAgICAgICAgICAgICAgICAgICAgJy4wOyB9JylcbiAgICAgICAgICAgIGZzaEJ1ZmYucHVzaCgnICAgZWxzZSB7IGNJPWMnICsgKG5iIC0gMSkgKyAnOyBjRj1jJyArIG5iICsgJzsgdD0nICsgbmJzICsgJyp0LScgKyAobmIgLSAxKSArICcuMDsgfScpXG4gICAgICAgIH1cblxuICAgICAgICAvL29uZSBzaW5nbGUgY29sb3JcbiAgICAgICAgaWYgKGNvbG9ycy5sZW5ndGggPT0gMSkgZnNoQnVmZi5wdXNoKCcgICBnbF9GcmFnQ29sb3IgPSB2ZWM0KGMwWzBdLCBjMFsxXSwgYzBbMl0sIGMwWzNdKTt9JylcbiAgICAgICAgLy9zZXQgaW50ZXJwb2xhdGVkIGNvbG9yLCBiZXR3ZWVuIGluaXRpYWwgYW5kIGZpbmFsIG9uZVxuICAgICAgICBlbHNlIGZzaEJ1ZmYucHVzaCgnICAgZ2xfRnJhZ0NvbG9yID0gbWl4KGNJLCBjRiwgdCk7fScpXG5cbiAgICAgICAgbGV0IGZzaFN0cmluZyA9IGZzaEJ1ZmYuam9pbihcIlwiKVxuICAgICAgICAvL2xldCBmc2hTdHJpbmcgPSBmc2hCdWZmLmpvaW4oXCJcXG5cIilcbiAgICAgICAgLy9jb25zb2xlLmxvZyhmc2hTdHJpbmcpXG5cbiAgICAgICAgLyoqIEB0eXBlIHtXZWJHTFNoYWRlcn0gKi9cbiAgICAgICAgY29uc3QgZlNoYWRlciA9IGNyZWF0ZVNoYWRlcihnbCwgZ2wuRlJBR01FTlRfU0hBREVSLCBmc2hTdHJpbmcpXG5cbiAgICAgICAgLyoqIEB0eXBlIHtXZWJHTFByb2dyYW19ICovXG4gICAgICAgIHRoaXMucHJvZ3JhbSA9IGluaXRTaGFkZXJQcm9ncmFtKGdsLCB2U2hhZGVyLCBmU2hhZGVyKVxuICAgICAgICBnbC51c2VQcm9ncmFtKHRoaXMucHJvZ3JhbSlcblxuICAgICAgICAvL3NldCB1bmlmb3Jtc1xuXG4gICAgICAgIC8vc2l6ZVBpeFxuICAgICAgICAvL1RPRE86IGJ1ZyBoZXJlLiBTZWVtcyB0byBiZSBsaW1pdGVkIHRvIHNvbWUgdGhyZXNob2xkIHZhbHVlIChhcm91bmQgMjUwKS5cbiAgICAgICAgZ2wudW5pZm9ybTFmKGdsLmdldFVuaWZvcm1Mb2NhdGlvbih0aGlzLnByb2dyYW0sICdzaXplUGl4JyksIDEuMCAqIHNpemVQaXgpXG5cbiAgICAgICAgLy9zdHJldGNoaW5nIGFscGhhIGZhY3RvclxuICAgICAgICBnbC51bmlmb3JtMWYoZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHRoaXMucHJvZ3JhbSwgJ2FscGhhJyksIHN0cmV0Y2hpbmcgPyAxLjAgKiBzdHJldGNoaW5nLmFscGhhIDogMC4wKVxuXG4gICAgICAgIC8vY29sb3JzXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29sb3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBjID0gY29sb3IoY29sb3JzW2ldKVxuXG4gICAgICAgICAgICBsZXQgb3BhY2l0eSA9IGMub3BhY2l0eVxuICAgICAgICAgICAgaWYgKGMub3BhY2l0eSA9PSAxICYmIGdsb2JhbE9wYWNpdHkgIT0gdW5kZWZpbmVkKSBvcGFjaXR5ID0gZ2xvYmFsT3BhY2l0eVxuXG4gICAgICAgICAgICBjb25zdCBjb2xEYXRhID0gWytjLnIgLyAyNTUuMCwgK2MuZyAvIDI1NS4wLCArYy5iIC8gMjU1LjAsICtvcGFjaXR5XVxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhpLCBjb2xvcnNbaV0sIGMsIGNvbERhdGEpXG4gICAgICAgICAgICBnbC51bmlmb3JtNGZ2KGdsLmdldFVuaWZvcm1Mb2NhdGlvbih0aGlzLnByb2dyYW0sICdjJyArIGkpLCBjb2xEYXRhKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqICAqL1xuICAgIGRyYXcodmVydGljZXNCdWZmZXIsIHRCdWZmZXIsIHRyYW5zZm9NYXQpIHtcbiAgICAgICAgY29uc3QgZ2wgPSB0aGlzLmdsXG4gICAgICAgIGNvbnN0IHByb2dyYW0gPSB0aGlzLnByb2dyYW1cblxuICAgICAgICAvL3ZlcnRpY2UgZGF0YVxuICAgICAgICBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgZ2wuY3JlYXRlQnVmZmVyKCkpXG4gICAgICAgIGdsLmJ1ZmZlckRhdGEoZ2wuQVJSQVlfQlVGRkVSLCBuZXcgRmxvYXQzMkFycmF5KHZlcnRpY2VzQnVmZmVyKSwgZ2wuU1RBVElDX0RSQVcpXG4gICAgICAgIGNvbnN0IHBvc2l0aW9uID0gZ2wuZ2V0QXR0cmliTG9jYXRpb24ocHJvZ3JhbSwgJ3BvcycpXG4gICAgICAgIGdsLnZlcnRleEF0dHJpYlBvaW50ZXIoXG4gICAgICAgICAgICBwb3NpdGlvbixcbiAgICAgICAgICAgIDIsIC8vbnVtQ29tcG9uZW50c1xuICAgICAgICAgICAgZ2wuRkxPQVQsIC8vdHlwZVxuICAgICAgICAgICAgZmFsc2UsIC8vbm9ybWFsaXNlXG4gICAgICAgICAgICAwLCAvL3N0cmlkZVxuICAgICAgICAgICAgMCAvL29mZnNldFxuICAgICAgICApXG4gICAgICAgIGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KHBvc2l0aW9uKVxuXG4gICAgICAgIC8vdCBkYXRhXG4gICAgICAgIGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCBnbC5jcmVhdGVCdWZmZXIoKSlcbiAgICAgICAgZ2wuYnVmZmVyRGF0YShnbC5BUlJBWV9CVUZGRVIsIG5ldyBGbG9hdDMyQXJyYXkodEJ1ZmZlciksIGdsLlNUQVRJQ19EUkFXKVxuICAgICAgICBjb25zdCB0ID0gZ2wuZ2V0QXR0cmliTG9jYXRpb24ocHJvZ3JhbSwgJ3QnKVxuICAgICAgICBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKHQsIDEsIGdsLkZMT0FULCBmYWxzZSwgMCwgMClcbiAgICAgICAgZ2wuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkodClcblxuICAgICAgICAvL3RyYW5zZm9ybWF0aW9uXG4gICAgICAgIGdsLnVuaWZvcm1NYXRyaXgzZnYoZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICdtYXQnKSwgZmFsc2UsIG5ldyBGbG9hdDMyQXJyYXkodHJhbnNmb01hdCkpXG5cbiAgICAgICAgLy8gRW5hYmxlIHRoZSBkZXB0aCB0ZXN0XG4gICAgICAgIC8vZ2wuZW5hYmxlKGdsLkRFUFRIX1RFU1QpO1xuICAgICAgICAvLyBDbGVhciB0aGUgY29sb3IgYnVmZmVyIGJpdFxuICAgICAgICBnbC5jbGVhcihnbC5DT0xPUl9CVUZGRVJfQklUKVxuICAgICAgICAvLyBTZXQgdGhlIHZpZXcgcG9ydFxuICAgICAgICAvL2dsLnZpZXdwb3J0KDAsIDAsIGNnLncsIGNnLmgpO1xuXG4gICAgICAgIGdsLmRyYXdBcnJheXMoZ2wuUE9JTlRTLCAwLCB2ZXJ0aWNlc0J1ZmZlci5sZW5ndGggLyAyKVxuICAgIH1cbn1cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgZXh0ZW50LCBtYXggfSBmcm9tICdkMy1hcnJheSdcbmltcG9ydCB7IHNjYWxlUXVhbnRpbGUgfSBmcm9tICdkMy1zY2FsZSdcblxuLyoqXG4gKiBBIHNjYWxlIGlzIHNpbXBseSBhIGZ1bmN0aW9uIHRoYXQgbWFwIGEgZG9tYWluIHRvIGEgcmFuZ2UuXG4gKiBAdHlwZWRlZiB7ZnVuY3Rpb24obnVtYmVyKTpudW1iZXJ9IFNjYWxlICovXG5cbi8qKlxuICogQSBzY2FsZSB3aG9zZSByYW5nZSBpcyBhIGNvbG9yIChzdHJpbmcpLlxuICogQHR5cGVkZWYge2Z1bmN0aW9uKG51bWJlcik6c3RyaW5nfSBDb2xvclNjYWxlICovXG5cbi8qKlxuICogQG1vZHVsZSB1dGlsc1xuICovXG5cbi8qKlxuICogR2VuZXJpYyBmdW5jdGlvbiBmb3IgdmlldyBzY2FsZSAtIGNvbnRpbnVvdXMgb3IgZGlzY3JldGVcbiAqXG4gKiBAcGFyYW0ge3sgdmFsdWVGdW5jdGlvbjpmdW5jdGlvbihpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXRcIikuQ2VsbCk6bnVtYmVyLCBtaW5WYWx1ZT86bnVtYmVyLCBtaW5TaXplUGl4PzpudW1iZXIsIG1heFNpemVGYWN0b3I/Om51bWJlciwgcmFuZ2U/OltudW1iZXIsIG51bWJlcl0sIGRvbWFpbj86W251bWJlciwgbnVtYmVyXSwgc3RyZXRjaGluZz86ZnVuY3Rpb24obnVtYmVyKTpudW1iZXIsIGNsYXNzTnVtYmVyPzpudW1iZXJ9fSBvcHRzXG4gKiBAcmV0dXJucyB7ZnVuY3Rpb24oQXJyYXkuPGltcG9ydChcIi4uL2NvcmUvRGF0YXNldFwiKS5DZWxsPik6U2NhbGV9XG4gKi9cbmV4cG9ydCBjb25zdCB2aWV3U2NhbGUgPSAob3B0cykgPT4ge1xuICAgIGNvbnN0IHZhbHVlRnVuY3Rpb24gPSBvcHRzLnZhbHVlRnVuY3Rpb25cbiAgICBjb25zdCBtaW5WYWx1ZSA9IG9wdHMubWluVmFsdWUgfHwgMFxuICAgIGNvbnN0IG1pblNpemVQaXggPSBvcHRzLm1pblNpemVQaXggfHwgMFxuICAgIGNvbnN0IG1heFNpemVGYWN0b3IgPSBvcHRzLm1heFNpemVGYWN0b3IgfHwgMVxuICAgIGNvbnN0IHN0cmV0Y2hpbmcgPSBvcHRzLnN0cmV0Y2hpbmdcbiAgICBjb25zdCByYW5nZV8gPSBvcHRzLnJhbmdlXG4gICAgY29uc3QgZG9tYWluXyA9IG9wdHMuZG9tYWluXG4gICAgY29uc3QgY2xhc3NOdW1iZXIgPSBvcHRzLmNsYXNzTnVtYmVyXG4gICAgcmV0dXJuIChjZWxscywgcmVzb2x1dGlvbiwgeikgPT4ge1xuICAgICAgICBjb25zdCBkb21haW4gPSBkb21haW5fIHx8IFttaW5WYWx1ZSwgbWF4KGNlbGxzLCB2YWx1ZUZ1bmN0aW9uKV1cbiAgICAgICAgY29uc3QgcmFuZ2UgPSByYW5nZV8gfHwgW21pblNpemVQaXggKiB6LCByZXNvbHV0aW9uICogbWF4U2l6ZUZhY3Rvcl1cbiAgICAgICAgY29uc3QgZG9tYWluU2l6ZSA9IGRvbWFpblsxXSAtIGRvbWFpblswXSxcbiAgICAgICAgICAgIGRvbWFpbk1pbiA9IGRvbWFpblswXVxuICAgICAgICBjb25zdCByYW5nZVNpemUgPSByYW5nZVsxXSAtIHJhbmdlWzBdLFxuICAgICAgICAgICAgcmFuZ2VNaW4gPSByYW5nZVswXVxuICAgICAgICByZXR1cm4gKHQpID0+IHtcbiAgICAgICAgICAgIC8vc2NhbGUgdG8gWzAsMV1cbiAgICAgICAgICAgIHQgPSAodCAtIGRvbWFpbk1pbikgLyBkb21haW5TaXplXG4gICAgICAgICAgICAvL3N0cmV0Y2hcbiAgICAgICAgICAgIGlmIChzdHJldGNoaW5nKSB0ID0gc3RyZXRjaGluZyh0KVxuICAgICAgICAgICAgLy9jbGFzc2lmeVxuICAgICAgICAgICAgaWYgKGNsYXNzTnVtYmVyKSB0ID0gdCA9PSAxID8gMSA6IE1hdGguZmxvb3IodCAqIGNsYXNzTnVtYmVyKSAvIChjbGFzc051bWJlciAtIDEpXG4gICAgICAgICAgICAvL3NjYWxlIHRvIHJhbmdlXG4gICAgICAgICAgICByZXR1cm4gcmFuZ2VNaW4gKyB0ICogcmFuZ2VTaXplXG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuICogR2VuZXJpYyBmdW5jdGlvbiBmb3IgdmlldyBzY2FsZSAtIHF1YW50aWxlXG4gKlxuICogQHBhcmFtIHt7IHZhbHVlRnVuY3Rpb246ZnVuY3Rpb24oaW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0XCIpLkNlbGwpOm51bWJlciwgY2xhc3NOdW1iZXI/Om51bWJlciwgbWluU2l6ZVBpeD86bnVtYmVyLCBtYXhTaXplRmFjdG9yPzpudW1iZXIgfX0gb3B0c1xuICogQHJldHVybnMge2Z1bmN0aW9uKEFycmF5LjxpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXRcIikuQ2VsbD4pOlNjYWxlfVxuICovXG5leHBvcnQgY29uc3Qgdmlld1NjYWxlUXVhbnRpbGUgPSAob3B0cykgPT4ge1xuICAgIGNvbnN0IHZhbHVlRnVuY3Rpb24gPSBvcHRzLnZhbHVlRnVuY3Rpb25cbiAgICBjb25zdCBjbGFzc051bWJlciA9IG9wdHMuY2xhc3NOdW1iZXIgfHwgMTJcbiAgICBjb25zdCBtaW5TaXplUGl4ID0gb3B0cy5taW5TaXplUGl4IHx8IDFcbiAgICBjb25zdCBtYXhTaXplRmFjdG9yID0gb3B0cy5tYXhTaXplRmFjdG9yIHx8IDFcbiAgICBjb25zdCBzY2FsZSA9IHNjYWxlUXVhbnRpbGUoKVxuICAgIHJldHVybiAoY2VsbHMsIHJlc29sdXRpb24sIHopID0+IHtcbiAgICAgICAgc2NhbGUuZG9tYWluKGNlbGxzLm1hcCh2YWx1ZUZ1bmN0aW9uKSlcbiAgICAgICAgY29uc3QgbWluU2l6ZUdlbyA9IG1pblNpemVQaXggKiB6LFxuICAgICAgICAgICAgbWF4U2l6ZUdlbyA9IHJlc29sdXRpb24gKiBtYXhTaXplRmFjdG9yXG4gICAgICAgIHNjYWxlLnJhbmdlKFxuICAgICAgICAgICAgQXJyYXkuZnJvbShcbiAgICAgICAgICAgICAgICB7IGxlbmd0aDogY2xhc3NOdW1iZXIgfSxcbiAgICAgICAgICAgICAgICAoXywgaSkgPT4gbWluU2l6ZUdlbyArIChpICogKG1heFNpemVHZW8gLSBtaW5TaXplR2VvKSkgLyAoY2xhc3NOdW1iZXIgLSAxKVxuICAgICAgICAgICAgKVxuICAgICAgICApXG4gICAgICAgIHNjYWxlLmJyZWFrcyA9IHNjYWxlLnF1YW50aWxlcygpXG4gICAgICAgIHNjYWxlLnZhbHVlcyA9IHNjYWxlLnJhbmdlKClcbiAgICAgICAgcmV0dXJuIHNjYWxlXG4gICAgfVxufVxuXG4vKipcbiAqIEdlbmVyaWMgZnVuY3Rpb24gZm9yIGNvbG9yIHZpZXcgc2NhbGUgLSBjb250aW51b3VzIG9yIGRpc2NyZXRlXG4gKlxuICogQHBhcmFtIHt7IHZhbHVlRnVuY3Rpb246ZnVuY3Rpb24oaW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0XCIpLkNlbGwpOm51bWJlciwgY29sb3JTY2FsZT86ZnVuY3Rpb24obnVtYmVyKTpzdHJpbmcsIGNvbG9ycz86QXJyYXkuPHN0cmluZz4sIHN0cmV0Y2hpbmc/OmZ1bmN0aW9uKG51bWJlcik6bnVtYmVyIH19IG9wdHNcbiAqIEByZXR1cm5zIHtmdW5jdGlvbihBcnJheS48aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0XCIpLkNlbGw+KTpDb2xvclNjYWxlfVxuICovXG5leHBvcnQgY29uc3Qgdmlld1NjYWxlQ29sb3IgPSAob3B0cykgPT4ge1xuICAgIGNvbnN0IHZhbHVlRnVuY3Rpb24gPSBvcHRzLnZhbHVlRnVuY3Rpb25cbiAgICBjb25zdCBzdHJldGNoaW5nID0gb3B0cy5zdHJldGNoaW5nXG4gICAgbGV0IGNvbG9yU2NhbGUgPSBvcHRzLmNvbG9yU2NhbGUgfHwgKCgpID0+ICdwdXJwbGUnKVxuXG4gICAgLy9kaXNjcmV0ZSBjb2xvcnMgY2FzZTogYnVpbGQgY29udGludW91cyBjb2xvciBzY2FsZSBmcm9tIGRpc2NyZXRlIG9uZXMuXG4gICAgY29uc3QgbmJDbGFzcyA9IG9wdHMuY29sb3JzPy5sZW5ndGhcbiAgICBpZiAob3B0cy5jb2xvcnMgJiYgbmJDbGFzcylcbiAgICAgICAgY29sb3JTY2FsZSA9ICh0KSA9PiBvcHRzLmNvbG9yc1t0ID09IDEgPyBuYkNsYXNzIC0gMSA6IE1hdGguZmxvb3IodCAqIG5iQ2xhc3MpXVxuXG4gICAgcmV0dXJuIChjZWxscykgPT4ge1xuICAgICAgICBpZiAoY2VsbHMubGVuZ3RoID09IDAgfHwgIWNlbGxzKSByZXR1cm5cbiAgICAgICAgLyoqIEB0eXBlIHtbdW5kZWZpbmVkLCB1bmRlZmluZWRdIHwgW251bWJlciwgbnVtYmVyXX0gKi9cbiAgICAgICAgY29uc3QgZG9tYWluID0gZXh0ZW50KGNlbGxzLCB2YWx1ZUZ1bmN0aW9uKVxuICAgICAgICBpZiAoZG9tYWluWzBdID09IHVuZGVmaW5lZCkgcmV0dXJuXG4gICAgICAgIGNvbnN0IGRvbWFpblNpemUgPSBkb21haW5bMV0gLSBkb21haW5bMF1cbiAgICAgICAgY29uc3Qgc2NhbGUgPSAodCkgPT4ge1xuICAgICAgICAgICAgLy9zY2FsZSB0byBbMCwxXVxuICAgICAgICAgICAgdCA9ICh0IC0gZG9tYWluWzBdKSAvIGRvbWFpblNpemVcbiAgICAgICAgICAgIC8vc3RyZXRjaFxuICAgICAgICAgICAgaWYgKHN0cmV0Y2hpbmcpIHQgPSBzdHJldGNoaW5nKHQpXG4gICAgICAgICAgICByZXR1cm4gY29sb3JTY2FsZSh0KVxuICAgICAgICB9XG4gICAgICAgIC8vZnVuY3Rpb24gdGhhdCByZXR1cm4gdGhlIGRvbWFpbiB2YWx1ZSBmcm9tIHRoZSBbMCwxXSByYW5nZS5cbiAgICAgICAgc2NhbGUuaW52ZXJ0ID0gKHQpID0+IHtcbiAgICAgICAgICAgIGlmIChzdHJldGNoaW5nKSB0ID0gc3RyZXRjaGluZy5pbnZlcnQodClcbiAgICAgICAgICAgIHJldHVybiBkb21haW5bMF0gKyB0ICogZG9tYWluU2l6ZVxuICAgICAgICB9XG4gICAgICAgIC8vZGlzY3JldGUgY29sb3JzOiByZXR1cm4gdGhlIGJyZWFrc1xuICAgICAgICBpZiAob3B0cy5jb2xvcnMgJiYgbmJDbGFzcykge1xuICAgICAgICAgICAgc2NhbGUuYnJlYWtzID0gW11cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgbmJDbGFzczsgaSsrKSBzY2FsZS5icmVha3MucHVzaChzY2FsZS5pbnZlcnQoaSAvIG5iQ2xhc3MpKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHNjYWxlXG4gICAgfVxufVxuXG4vKipcbiAqIEdlbmVyaWMgZnVuY3Rpb24gZm9yIGNvbG9yIHZpZXcgc2NhbGUgLSBxdWFudGlsZVxuICpcbiAqIEBwYXJhbSB7eyB2YWx1ZUZ1bmN0aW9uOmZ1bmN0aW9uKGltcG9ydChcIi4uL2NvcmUvRGF0YXNldFwiKS5DZWxsKTpudW1iZXIsIGNsYXNzTnVtYmVyPzpudW1iZXIsIGNvbG9ycz86QXJyYXkuPHN0cmluZz4sIGNvbG9yU2NhbGU/OmZ1bmN0aW9uKG51bWJlcik6c3RyaW5nIH19IG9wdHNcbiAqIEByZXR1cm5zIHtmdW5jdGlvbihBcnJheS48aW1wb3J0KFwiLi4vY29yZS9EYXRhc2V0XCIpLkNlbGw+KTpDb2xvclNjYWxlfVxuICovXG5leHBvcnQgY29uc3Qgdmlld1NjYWxlQ29sb3JRdWFudGlsZSA9IChvcHRzKSA9PiB7XG4gICAgY29uc3QgdmFsdWVGdW5jdGlvbiA9IG9wdHMudmFsdWVGdW5jdGlvblxuICAgIGNvbnN0IGNsYXNzTnVtYmVyID0gb3B0cy5jbGFzc051bWJlciB8fCAxMlxuXG4gICAgbGV0IGNvbG9ycyA9IG9wdHMuY29sb3JzXG4gICAgaWYgKG9wdHMuY29sb3JTY2FsZSkgY29sb3JzID0gZGlzY3JldGVDb2xvcnMob3B0cy5jb2xvclNjYWxlLCBjbGFzc051bWJlcilcbiAgICBjb2xvcnMgPVxuICAgICAgICBjb2xvcnMgfHxcbiAgICAgICAgQXJyYXkuZnJvbShcbiAgICAgICAgICAgIHsgbGVuZ3RoOiBjbGFzc051bWJlciB9LFxuICAgICAgICAgICAgKF8sIGkpID0+ICdyZ2IoJyArIE1hdGguZmxvb3IoKDI1NSAqIGkpIC8gKGNsYXNzTnVtYmVyIC0gMSkpICsgJywxNTAsMTUwKSdcbiAgICAgICAgKVxuXG4gICAgY29uc3Qgc2NhbGUgPSBzY2FsZVF1YW50aWxlKCkucmFuZ2UoY29sb3JzKVxuICAgIHJldHVybiAoY2VsbHMpID0+IHtcbiAgICAgICAgc2NhbGUuZG9tYWluKGNlbGxzLm1hcCh2YWx1ZUZ1bmN0aW9uKSlcbiAgICAgICAgc2NhbGUuYnJlYWtzID0gc2NhbGUucXVhbnRpbGVzKClcbiAgICAgICAgc2NhbGUuY29sb3JzID0gY29sb3JzXG4gICAgICAgIHJldHVybiBzY2FsZVxuICAgIH1cbn1cblxuXG4vKipcbiAqIEdlbmVyaWMgZnVuY3Rpb24gZm9yIHZpZXcgc2NhbGUgcXVhbnRpbGUgY2xhc3NpZmllclxuICpcbiAqIEBwYXJhbSB7eyB2YWx1ZUZ1bmN0aW9uOmZ1bmN0aW9uKGltcG9ydChcIi4uL2NvcmUvRGF0YXNldFwiKS5DZWxsKTpudW1iZXIsIGNsYXNzTnVtYmVyPzpudW1iZXIgfX0gb3B0c1xuICogQHJldHVybnMge2Z1bmN0aW9uKEFycmF5LjxpbXBvcnQoXCIuLi9jb3JlL0RhdGFzZXRcIikuQ2VsbD4pOkNvbG9yU2NhbGV9XG4gKi9cbmV4cG9ydCBjb25zdCB2aWV3U2NhbGVRdWFudGlsZUNsYXNzaWZlciA9IChvcHRzKSA9PiB7XG4gICAgY29uc3QgdmFsdWVGdW5jdGlvbiA9IG9wdHMudmFsdWVGdW5jdGlvbiAvLyB0aGUgZnVuY3Rpb24gdGhhdCByZXR1cm4gdGhlIGNlbGwgdmFsdWUgZnJvbSBhIGNlbGxcbiAgICBjb25zdCBjbGFzc051bWJlciA9IG9wdHMuY2xhc3NOdW1iZXIgfHwgMTIgLy8gdGhlIGNsYXNzIG51bWJlclxuXG4gICAgY29uc3Qgc2NhbGUgPSBzY2FsZVF1YW50aWxlKCkucmFuZ2UoQXJyYXkuZnJvbSggeyBsZW5ndGg6IGNsYXNzTnVtYmVyIH0sIChfLCBpKSA9PiBpICkpXG4gICAgcmV0dXJuIChjZWxscykgPT4ge1xuICAgICAgICBzY2FsZS5kb21haW4oY2VsbHMubWFwKHZhbHVlRnVuY3Rpb24pKVxuICAgICAgICBzY2FsZS5icmVha3MgPSBzY2FsZS5xdWFudGlsZXMoKVxuICAgICAgICByZXR1cm4gc2NhbGVcbiAgICB9XG59XG5cblxuXG5cbi8qKlxuICogQ29tYmluZSB2aWV3IHNjYWxlIGZ1bmN0aW9uc1xuICpcbiAqIEBwYXJhbSB7Kn0gb2JqXG4gKiBAcmV0dXJucyB7ZnVuY3Rpb259XG4gKi9cbmV4cG9ydCBjb25zdCB2aWV3U2NhbGVDb21iaW5hdGlvbiA9IChvYmopID0+IHtcbiAgICAvL29iajogcHJvcCBhbmQgYSBmdW5jdGlvbiB0byBjYWxsXG4gICAgcmV0dXJuIChjZWxscywgcmVzb2x1dGlvbiwgeikgPT4ge1xuICAgICAgICBjb25zdCBvdXQgPSB7fVxuICAgICAgICBmb3IgKGNvbnN0IHAgaW4gb2JqKSB7XG4gICAgICAgICAgICBvdXRbcF0gPSBvYmpbcF0oY2VsbHMsIHJlc29sdXRpb24sIHopXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dFxuICAgIH1cbn1cblxuXG4vKipcbiAqIFJldHVybiBhIGNsYXNzaWZpZXIgZnVuY3Rpb24gZnJvbSBicmVhayB2YWx1ZXMuXG4gKiBUaGUgY2xhc3NpZmllciBmdW5jdGlvbiByZXR1cm5zIHRoZSBjbGFzcyBpZCAoZnJvbSAwIHRvIGJyZWFrcy5sZW5ndGgpIGZyb20gYSB2YWx1ZSB0byBjbGFzc2lmaXkuXG4gKiBAcGFyYW0ge0FycmF5LjxudW1iZXI+fSBicmVha3MgdGhlIGJyZWFrc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY2xhc3NpZmllcihicmVha3MpIHtcbiAgICBjb25zdCBibCA9IGJyZWFrcy5sZW5ndGhcbiAgICBjb25zdCBjbGFzc2lmaWVyID0gKHZhbHVlKSA9PiB7XG4gICAgICAgIGxldCBpID0gMFxuICAgICAgICB3aGlsZSAoaSA8IGJsKSB7XG4gICAgICAgICAgICBjb25zdCBicmVha18gPSBicmVha3NbaV1cbiAgICAgICAgICAgIGlmICh2YWx1ZSA8PSBicmVha18pIHJldHVybiBpXG4gICAgICAgICAgICBpKytcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaVxuICAgIH1cbiAgICBjbGFzc2lmaWVyLmJyZWFrcyA9IGJyZWFrc1xuICAgIHJldHVybiBjbGFzc2lmaWVyXG59XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IG1pblxuICogQHBhcmFtIHtudW1iZXJ9IG1heFxuICogQHBhcmFtIHtudW1iZXJ9IG5iQ2xhc3NcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsYXNzaWZpZXJNaW5NYXgobWluLCBtYXgsIG5iQ2xhc3MpIHtcbiAgICBjb25zdCBicmVha3MgPSBbXVxuICAgIGNvbnN0IHN0ZXAgPSAobWF4IC0gbWluKSAvIG5iQ2xhc3NcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IG5iQ2xhc3M7IGkrKykgYnJlYWtzLnB1c2gobWluICsgaSAqIHN0ZXApXG4gICAgcmV0dXJuIGNsYXNzaWZpZXIoYnJlYWtzKVxufVxuXG5cblxuLyoqXG4gKiBSZXR1cm4gYSBjb2xvciBjbGFzc2lmaWVyIGZ1bmN0aW9uIGZyb20gYnJlYWsgdmFsdWVzLlxuICogVGhlIGNsYXNzaWZpZXIgZnVuY3Rpb24gcmV0dXJucyB0aGUgY29sb3IgZnJvbSBhIHZhbHVlIHRvIGNsYXNzaWZpeS5cbiAqIFRoZXJlIHNob3VsZCBiZSBvbmUgY29sb3IgbW9yZSB0aGFuIGJyZWFrIHZhbHVlcy5cbiAqIEBwYXJhbSB7QXJyYXkuPG51bWJlcj59IGJyZWFrcyB0aGUgYnJlYWtzXG4gKiBAcGFyYW0ge0FycmF5LjxzdHJpbmc+fSBjb2xvcnMgdGhlIGNvbG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY29sb3JDbGFzc2lmaWVyKGJyZWFrcywgY29sb3JzKSB7XG4gICAgY29uc3QgY2xhc3NpZmllcl8gPSBjbGFzc2lmaWVyKGJyZWFrcylcbiAgICBjb25zdCBjb2xvckNsYXNzaWZpZXIgPSAodmFsdWUpID0+IGNvbG9yc1tjbGFzc2lmaWVyXyh2YWx1ZSldXG4gICAgY29sb3JDbGFzc2lmaWVyLmJyZWFrcyA9IGJyZWFrc1xuICAgIGNvbG9yQ2xhc3NpZmllci5jb2xvcnMgPSBjb2xvcnNcbiAgICByZXR1cm4gY29sb3JDbGFzc2lmaWVyXG59XG5cbi8qKlxuICogTWFrZSBhcnJheSBvZiBjb2xvcnMgZnJvbSBhIGNvbG9yU2NhbGUuXG4gKiBJdCBpcyBhIGtpbmQgb2Ygc2FtcGxpbmcsIG9yIHVuLWludGVycG9sYXRpb25cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKG51bWJlcik6c3RyaW5nfSBjb2xvclNjYWxlXG4gKiBAcGFyYW0ge251bWJlcn0gbmJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpc2NyZXRlQ29sb3JzKGNvbG9yU2NhbGUsIG5iKSB7XG4gICAgaWYgKG5iID09IDEpIHJldHVybiBbY29sb3JTY2FsZSgwLjUpXVxuICAgIGNvbnN0IG91dCA9IFtdXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYjsgaSsrKSBvdXQucHVzaChjb2xvclNjYWxlKGkgLyAobmIgLSAxKSkpXG4gICAgcmV0dXJuIG91dFxufVxuIiwiLy9AdHMtY2hlY2tcbid1c2Ugc3RyaWN0J1xuXG4vKipcbiAqIEBtb2R1bGUgdXRpbHNcbiAqL1xuXG4vL1RPRE8gaW52ZXJ0IGZvciBjaXJjdWxhclxuLy9UT0RPIHVzZSBNYXRoLnNxcnRcbi8vVE9ETyB2YWxpZGF0ZVxuXG4vKipcbiAqIFNvbWUgZnVuY3Rpb24gWzAsMV0tPlswLDFdIHRvIHN0cmV0Y2ggcmFuZ2Ugb2YgdmFsdWVzLlxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vZXVyb3N0YXQvZ3JpZHZpei9ibG9iL21hc3Rlci9kb2NzL3JlZmVyZW5jZS5tZCNzdHJldGNoaW5nXG4gKiBAc2VlIGh0dHBzOi8vb2JzZXJ2YWJsZWhxLmNvbS9AamdhZmZ1cmkvc3RyZXRjaGluZ1xuICovXG5cbi8vaWRlbnRpdHkgZnVuY3Rpb25cbmNvbnN0IGlkZW50aXR5ID0gKHQpID0+IHRcbmlkZW50aXR5LmludmVydCA9IGlkZW50aXR5XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IGJhc2VcbiAqIEByZXR1cm5zIHtmdW5jdGlvbihudW1iZXIpOm51bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IGV4cG9uZW50aWFsU2NhbGUgPSAoYmFzZSA9IDMpID0+IHtcbiAgICBpZiAoYmFzZSA9PSAwKSByZXR1cm4gaWRlbnRpdHlcbiAgICBjb25zdCBhID0gTWF0aC5leHAoYmFzZSkgLSAxXG4gICAgY29uc3QgZiA9ICh0KSA9PiAoTWF0aC5leHAodCAqIGJhc2UpIC0gMSkgLyBhXG4gICAgZi5pbnZlcnQgPSAodCkgPT4gTWF0aC5sb2coYSAqIHQgKyAxKSAvIGJhc2VcbiAgICByZXR1cm4gZlxufVxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSBiYXNlXG4gKiBAcmV0dXJucyB7ZnVuY3Rpb24obnVtYmVyKTpudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBsb2dhcml0aG1pY1NjYWxlID0gKGJhc2UgPSAzKSA9PiB7XG4gICAgaWYgKGJhc2UgPT0gMCkgcmV0dXJuIGlkZW50aXR5XG4gICAgY29uc3QgYSA9IE1hdGguZXhwKGJhc2UpLFxuICAgICAgICBiID0gMSAtIGFcbiAgICBjb25zdCBmID0gKHQpID0+IDEgLSBNYXRoLmxvZyhhICsgdCAqIGIpIC8gYmFzZVxuICAgIGYuaW52ZXJ0ID0gKHQpID0+IChNYXRoLmV4cCgoMSAtIHQpICogYmFzZSkgLSBhKSAvIGJcbiAgICByZXR1cm4gZlxufVxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSBleHBvbmVudFxuICogQHJldHVybnMge2Z1bmN0aW9uKG51bWJlcik6bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgcG93ZXJTY2FsZSA9IChleHBvbmVudCA9IDMpID0+IHtcbiAgICBpZiAoZXhwb25lbnQgPT0gMSkgcmV0dXJuIGlkZW50aXR5XG4gICAgLy9UT0RPIGlmIChleHBvbmVudCA9PSAwLjUpIHJldHVybiBNYXRoLnNxcnRcbiAgICBjb25zdCBmID0gKHQpID0+IE1hdGgucG93KHQsIGV4cG9uZW50KVxuICAgIGNvbnN0IGEgPSAxIC8gZXhwb25lbnRcbiAgICBmLmludmVydCA9ICh0KSA9PiBNYXRoLnBvdyh0LCBhKVxuICAgIHJldHVybiBmXG59XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IGV4cG9uZW50XG4gKiBAcmV0dXJucyB7ZnVuY3Rpb24obnVtYmVyKTpudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBwb3dlckludmVyc2VTY2FsZSA9IChleHBvbmVudCA9IDMpID0+IHtcbiAgICBpZiAoZXhwb25lbnQgPT0gMSkgcmV0dXJuIGlkZW50aXR5XG4gICAgLy9UT0RPIGlmIChleHBvbmVudCA9PSAyKSByZXR1cm4gdCA9PiAxIC0gTWF0aC5zcXJ0KDEgLSB0KVxuICAgIGNvbnN0IGEgPSAxIC8gZXhwb25lbnRcbiAgICBjb25zdCBmID0gKHQpID0+IDEgLSBNYXRoLnBvdygxIC0gdCwgYSlcbiAgICBmLmludmVydCA9ICh0KSA9PiAxIC0gTWF0aC5wb3coMSAtIHQsIGV4cG9uZW50KVxuICAgIHJldHVybiBmXG59XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IGNpcmN1bGFyaXR5XG4gKiBAcmV0dXJucyB7ZnVuY3Rpb24obnVtYmVyKTpudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBjaXJjdWxhclNjYWxlID0gKGNpcmN1bGFyaXR5ID0gMC44KSA9PiB7XG4gICAgaWYgKGNpcmN1bGFyaXR5ID09IDApIHJldHVybiBpZGVudGl0eVxuICAgIGlmIChjaXJjdWxhcml0eSA9PSAxKSByZXR1cm4gKHQpID0+IE1hdGguc3FydCh0ICogKDIgLSB0KSlcbiAgICBlbHNlIHtcbiAgICAgICAgY29uc3QgYSA9IGNpcmN1bGFyaXR5IC8gKDEgLSBjaXJjdWxhcml0eSlcbiAgICAgICAgcmV0dXJuICh0KSA9PiBNYXRoLnNxcnQoMSAvIChhICogYSkgKyB0ICogKDIgLyBhICsgMiAtIHQpKSAtIDEgLyBhXG4gICAgfVxufVxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSBjaXJjdWxhcml0eVxuICogQHJldHVybnMge2Z1bmN0aW9uKG51bWJlcik6bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgY2lyY3VsYXJJbnZlcnNlU2NhbGUgPSAoY2lyY3VsYXJpdHkgPSAwLjgpID0+IHtcbiAgICBpZiAoY2lyY3VsYXJpdHkgPT0gMCkgcmV0dXJuIGlkZW50aXR5XG4gICAgY29uc3QgZiA9IGNpcmN1bGFyU2NhbGUoY2lyY3VsYXJpdHkpXG4gICAgcmV0dXJuICh0KSA9PiAxIC0gZigxIC0gdClcbn1cblxuLy90ZXN0XG4vKlxuY29uc3QgdGVzdCA9IChmLCBmdW4sIGEsIGVyciA9IDFlLTEyKSA9PiB7XG4gICAgZm9yIChsZXQgdCA9IDA7IHQgPD0gMTsgdCArPSAxIC8gNTApIHtcbiAgICAgICAgY29uc3QgZXIgPSB0IC0gZi5pbnZlcnQoZih0KSlcbiAgICAgICAgaWYgKE1hdGguYWJzKGVyKSA8IGVycikgY29udGludWVcbiAgICAgICAgY29uc29sZS5sb2coZnVuLCBhLCBlcilcbiAgICB9XG59XG5cbmZvciAobGV0IGZ1biBvZiBbcG93ZXJTY2FsZSwgcG93ZXJJbnZlcnNlU2NhbGVdKVxuICAgIGZvciAobGV0IGV4cCA9IC0zMDsgZXhwIDw9IDUwOyBleHAgKz0gMSkge1xuICAgICAgICBpZiAoZXhwID09IDApIGNvbnRpbnVlXG4gICAgICAgIGNvbnN0IGYgPSBmdW4oZXhwKVxuICAgICAgICB0ZXN0KGYsIGZ1biwgZXhwKVxuICAgIH1cblxuXG5mb3IgKGxldCBmdW4gb2YgW2V4cG9uZW50aWFsU2NhbGUsIGxvZ2FyaXRobWljU2NhbGVdKVxuICAgIGZvciAobGV0IGJhc2UgPSAtMjA7IGJhc2UgPD0gMjA7IGJhc2UgKz0gMSkge1xuICAgICAgICAvL2lmIChleHAgPT0gMCkgY29udGludWVcbiAgICAgICAgY29uc3QgZiA9IGZ1bihiYXNlKVxuICAgICAgICB0ZXN0KGYsIGZ1biwgYmFzZSwgMWUtMTApXG4gICAgfVxuKi9cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgaW50ZXJwb2xhdGVMYWIgfSBmcm9tICdkMy1pbnRlcnBvbGF0ZSdcblxuZXhwb3J0IGNvbnN0IHRlcm5hcnlDbGFzc2lmaWVyID0gKHByb3BlcnRpZXMsIHRvdGFsRnVuY3Rpb24sIG9wdHMgPSB7fSkgPT4ge1xuICAgIC8vdGhlIHRocmVlIHByb3BlcnRpZXNcbiAgICBjb25zdCBwMCA9IHByb3BlcnRpZXNbMF0sXG4gICAgICAgIHAxID0gcHJvcGVydGllc1sxXSxcbiAgICAgICAgcDIgPSBwcm9wZXJ0aWVzWzJdXG5cbiAgICAvL3RoZSBjbGFzc2lmaWVyIGNlbnRlciBwb2ludC4gc3VtIG11c3QgYmUgZXF1YWwgdG8gMVxuICAgIGNvbnN0IFtjMCwgYzEsIGMyXSA9IG9wdHMuY2VudGVyIHx8IFsxIC8gMywgMSAvIDMsIDEgLyAzXVxuXG4gICAgLy9wYXJhbWV0ZXIgdG8gZGVjaWRlIHdldGhlciB0byB1c2UgbWl4ZWQgY2xhc3NlcyBtMCwgbTEsIG0yLlxuICAgIGNvbnN0IHdpdGhNaXhlZENsYXNzZXMgPSBvcHRzLndpdGhNaXhlZENsYXNzZXMgIT0gdW5kZWZpbmVkID8gb3B0cy53aXRoTWl4ZWRDbGFzc2VzIDogdHJ1ZVxuXG4gICAgLy9wYXJhbWV0ZXIgdG8gZGVjaWRlIHdldGhlciB0byB1c2UgYSBjZW50cmFsIGNsYXNzLCBhbmQgdGhlIHNpemUgb2YgdGhpcyBjZW50cmFsIGNsYXNzLlxuICAgIC8vc2V0IHRvIDAgb3IgdW5kZWZpbmVkIGZvciBub3Qgc2hvd2luZyBhbnkgY2VudHJhbCBjbGFzcy4gU2V0IHRvIDEgZm9yIGEgY2VudHJhbCBjbGFzcyB0aGF0IGNvbnRhaW5zIHRoZSBtaXggY2xhc3Nlc1xuICAgIGNvbnN0IGNjID0gb3B0cy5jZW50ZXJDb2VmZmljaWVudCA/IDEgLSBvcHRzLmNlbnRlckNvZWZmaWNpZW50IDogdW5kZWZpbmVkXG5cbiAgICAvL3RoZSBvdXRwdXQgY2xhc3NpZmllciBtZXRob2RcbiAgICBjb25zdCBmdW4gPSAoYykgPT4ge1xuICAgICAgICAvL2dldCB0b3RhbFxuICAgICAgICBjb25zdCB0b3QgPSB0b3RhbEZ1bmN0aW9uKGMpXG4gICAgICAgIGlmICghdG90KSByZXR1cm4gdW5kZWZpbmVkXG4gICAgICAgIC8vY29tcHV0ZSBzaGFyZXNcbiAgICAgICAgY29uc3QgW3MwLCBzMSwgczJdID0gWytjW3AwXSAvIHRvdCwgK2NbcDFdIC8gdG90LCArY1twMl0gLyB0b3RdXG5cbiAgICAgICAgLy9jbGFzcyAwXG4gICAgICAgIGlmIChzMCA+PSBjMCAmJiBzMSA8PSBjMSAmJiBzMiA8PSBjMikge1xuICAgICAgICAgICAgLy9jZW50cmFsIGNsYXNzIG5lYXIgY2xhc3MgMFxuICAgICAgICAgICAgaWYgKGNjICE9IHVuZGVmaW5lZCAmJiAoczIgLSBjMikgKiAoYzEgLSBjYyAqIGMxKSA+PSAoczEgLSBjYyAqIGMxKSAqIChjYyAqIGMyIC0gYzIpKVxuICAgICAgICAgICAgICAgIHJldHVybiAnY2VudGVyJ1xuICAgICAgICAgICAgcmV0dXJuICcwJ1xuICAgICAgICB9XG4gICAgICAgIC8vY2xhc3MgMVxuICAgICAgICBpZiAoczAgPD0gYzAgJiYgczEgPj0gYzEgJiYgczIgPD0gYzIpIHtcbiAgICAgICAgICAgIC8vY2VudHJhbCBjbGFzcyBuZWFyIGNsYXNzIDFcbiAgICAgICAgICAgIGlmIChjYyAhPSB1bmRlZmluZWQgJiYgKHMyIC0gYzIpICogKGMwIC0gY2MgKiBjMCkgPj0gKHMwIC0gY2MgKiBjMCkgKiAoY2MgKiBjMiAtIGMyKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2NlbnRlcidcbiAgICAgICAgICAgIHJldHVybiAnMSdcbiAgICAgICAgfVxuICAgICAgICAvL2NsYXNzIDJcbiAgICAgICAgaWYgKHMwIDw9IGMwICYmIHMxIDw9IGMxICYmIHMyID49IGMyKSB7XG4gICAgICAgICAgICAvL2NlbnRyYWwgY2xhc3MgbmVhciBjbGFzcyAyXG4gICAgICAgICAgICBpZiAoY2MgIT0gdW5kZWZpbmVkICYmIChzMSAtIGMxKSAqIChjMCAtIGNjICogYzApID49IChzMCAtIGNjICogYzApICogKGNjICogYzEgLSBjMSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuICdjZW50ZXInXG4gICAgICAgICAgICByZXR1cm4gJzInXG4gICAgICAgIH1cbiAgICAgICAgLy9taWRkbGUgY2xhc3MgMCAtIGludGVyc2VjdGlvbiBjbGFzcyAxIGFuZCAyXG4gICAgICAgIGlmIChzMCA8PSBjMCAmJiBzMSA+PSBjMSAmJiBzMiA+PSBjMikge1xuICAgICAgICAgICAgLy9jZW50cmFsIGNsYXNzXG4gICAgICAgICAgICBpZiAoY2MgIT0gdW5kZWZpbmVkICYmIHMwID4gY2MgKiBjMCkgcmV0dXJuICdjZW50ZXInXG4gICAgICAgICAgICBpZiAod2l0aE1peGVkQ2xhc3NlcykgcmV0dXJuICdtMTInXG4gICAgICAgICAgICByZXR1cm4gczEgPiBzMiA/ICcxJyA6ICcyJ1xuICAgICAgICB9XG4gICAgICAgIC8vbWlkZGxlIGNsYXNzIDEgLSBpbnRlcnNlY3Rpb24gY2xhc3MgMCBhbmQgMVxuICAgICAgICBpZiAoczAgPj0gYzAgJiYgczEgPD0gYzEgJiYgczIgPj0gYzIpIHtcbiAgICAgICAgICAgIC8vY2VudHJhbCBjbGFzc1xuICAgICAgICAgICAgaWYgKGNjICE9IHVuZGVmaW5lZCAmJiBzMSA+IGNjICogYzEpIHJldHVybiAnY2VudGVyJ1xuICAgICAgICAgICAgaWYgKHdpdGhNaXhlZENsYXNzZXMpIHJldHVybiAnbTAyJ1xuICAgICAgICAgICAgcmV0dXJuIHMwID4gczIgPyAnMCcgOiAnMidcbiAgICAgICAgfVxuICAgICAgICAvL21pZGRsZSBjbGFzcyAyIC0gaW50ZXJzZWN0aW9uIGNsYXNzIDAgYW5kIDFcbiAgICAgICAgaWYgKHMwID49IGMwICYmIHMxID49IGMxICYmIHMyIDw9IGMyKSB7XG4gICAgICAgICAgICAvL2NlbnRyYWwgY2xhc3NcbiAgICAgICAgICAgIGlmIChjYyAhPSB1bmRlZmluZWQgJiYgczIgPiBjYyAqIGMyKSByZXR1cm4gJ2NlbnRlcidcbiAgICAgICAgICAgIGlmICh3aXRoTWl4ZWRDbGFzc2VzKSByZXR1cm4gJ20wMSdcbiAgICAgICAgICAgIHJldHVybiBzMSA+IHMwID8gJzEnIDogJzAnXG4gICAgICAgIH1cbiAgICAgICAgLy9zaG91bGQgbm90IGhhcHBlblxuICAgICAgICByZXR1cm4gJ3Vua25vd24nXG4gICAgfVxuXG4gICAgLy9hdHRhY2ggaW5mb3JtYXRpb24gdG8gb3V0cHV0IGZ1bmN0aW9uXG4gICAgZnVuLmNlbnRlciA9IFtjMCwgYzEsIGMyXVxuICAgIGZ1bi5jZW50ZXJDb2VmZmljaWVudCA9IG9wdHMuY2VudGVyQ29lZmZpY2llbnRcblxuICAgIHJldHVybiBmdW5cbn1cblxuZXhwb3J0IGNvbnN0IHRlcm5hcnlDb2xvckNsYXNzaWZpZXIgPSAocHJvcGVydGllcywgdG90YWxGdW5jdGlvbiwgY29sb3JzLCBvcHRzID0ge30pID0+IHtcbiAgICAvL3RoZSB0aHJlZSBjb2xvcnNcbiAgICBjb25zdCBbY29sb3IwLCBjb2xvcjEsIGNvbG9yMl0gPSBjb2xvcnMgfHwgWydyZWQnLCAnZ3JlZW4nLCAnYmx1ZSddXG5cbiAgICAvL3RoZSBjb2xvciBpbnRlcnBvbGF0aW9uIGZ1bmN0aW9uXG4gICAgY29uc3QgY29sb3JJbnRlcnBvbGF0aW9uID0gb3B0cy5jb2xvckludGVycG9sYXRpb24gfHwgaW50ZXJwb2xhdGVMYWJcblxuICAgIC8vcGFyYW1ldGVyIHRvIGRlY2lkZSB3ZXRoZXIgdG8gdXNlIG1peGVkIGNsYXNzZXMuXG4gICAgY29uc3Qgd2l0aE1peGVkQ2xhc3NlcyA9IG9wdHMud2l0aE1peGVkQ2xhc3NlcyAhPSB1bmRlZmluZWQgPyBvcHRzLndpdGhNaXhlZENsYXNzZXMgOiB0cnVlXG4gICAgLy9odHRwczovL2QzanMub3JnL2QzLWludGVycG9sYXRlL2NvbG9yXG4gICAgY29uc3QgbWl4Q29sb3JGdW5jdGlvbiA9IChjb2xvcjEsIGNvbG9yMikgPT4gY29sb3JJbnRlcnBvbGF0aW9uKGNvbG9yMSwgY29sb3IyKSgwLjUpXG4gICAgLy90aGUgY29sb3JzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1peGVkIGNsYXNzZXNcbiAgICBjb25zdCBbbWl4Q29sb3IwLCBtaXhDb2xvcjEsIG1peENvbG9yMl0gPVxuICAgICAgICBvcHRzLm1peGVkQ29sb3JzIHx8IHdpdGhNaXhlZENsYXNzZXNcbiAgICAgICAgICAgID8gW1xuICAgICAgICAgICAgICAgICAgbWl4Q29sb3JGdW5jdGlvbihjb2xvcjEsIGNvbG9yMiksXG4gICAgICAgICAgICAgICAgICBtaXhDb2xvckZ1bmN0aW9uKGNvbG9yMCwgY29sb3IyKSxcbiAgICAgICAgICAgICAgICAgIG1peENvbG9yRnVuY3Rpb24oY29sb3IwLCBjb2xvcjEpLFxuICAgICAgICAgICAgICBdXG4gICAgICAgICAgICA6IFtdXG5cbiAgICAvL3RoZSBjZW50cmFsIGNvbG9yLCB1c2VkIGZvciB0aGUgY2VudHJhbCBjbGFzcywgaWYgYW55LiBUaGUgY2VudHJhbCBjbGFzcyBpcyB0aGUgY2xhc3Mgb2YgcmVsYXRpdmVseSBiYWxhbmNlZCB2YWx1ZXMsIGFyb3VuZCB0aGUgY2VudGVyIHBvaW50XG4gICAgY29uc3QgY2VudGVyQ29sb3IgPVxuICAgICAgICBvcHRzLmNlbnRlckNvbG9yIHx8IGNvbG9ySW50ZXJwb2xhdGlvbihtaXhDb2xvckZ1bmN0aW9uKGNvbG9yMCwgY29sb3IxKSwgY29sb3IyKSgwLjMzMylcblxuICAgIC8vbWFrZSBjbGFzc2lmaWVyXG4gICAgY29uc3QgY2xhc3NpZmllciA9IHRlcm5hcnlDbGFzc2lmaWVyKHByb3BlcnRpZXMsIHRvdGFsRnVuY3Rpb24sIG9wdHMpXG5cbiAgICAvL3RoZSBvdXRwdXQgY29sb3IgY2xhc3NpZmllciBtZXRob2RcbiAgICBjb25zdCBmdW4gPSAoYykgPT4ge1xuICAgICAgICBjb25zdCBjbGEgPSBjbGFzc2lmaWVyKGMpXG4gICAgICAgIGlmIChjbGEgPT0gJzAnKSByZXR1cm4gY29sb3IwXG4gICAgICAgIGlmIChjbGEgPT0gJzEnKSByZXR1cm4gY29sb3IxXG4gICAgICAgIGlmIChjbGEgPT0gJzInKSByZXR1cm4gY29sb3IyXG4gICAgICAgIGlmIChjbGEgPT0gJ20xMicpIHJldHVybiBtaXhDb2xvcjBcbiAgICAgICAgaWYgKGNsYSA9PSAnbTAyJykgcmV0dXJuIG1peENvbG9yMVxuICAgICAgICBpZiAoY2xhID09ICdtMDEnKSByZXR1cm4gbWl4Q29sb3IyXG4gICAgICAgIGlmIChjbGEgPT0gJ2NlbnRlcicpIHJldHVybiBjZW50ZXJDb2xvclxuICAgICAgICByZXR1cm4gb3B0cy5kZWZhdWx0Q29sb3IgfHwgJ2JsYWNrJ1xuICAgIH1cbiAgICBmdW4uY2VudGVyID0gY2xhc3NpZmllci5jZW50ZXJcbiAgICBmdW4uY2VudGVyQ29lZmZpY2llbnQgPSBvcHRzLmNlbnRlckNvZWZmaWNpZW50XG4gICAgZnVuLmNvbG9ycyA9IFtjb2xvcjAsIGNvbG9yMSwgY29sb3IyXVxuICAgIGZ1bi5taXhDb2xvcnMgPSBbbWl4Q29sb3IwLCBtaXhDb2xvcjEsIG1peENvbG9yMl1cbiAgICBmdW4uY2VudGVyQ29sb3IgPSBjZW50ZXJDb2xvclxuICAgIGZ1bi5jbGFzc2lmaWVyID0gY2xhc3NpZmllclxuXG4gICAgcmV0dXJuIGZ1blxufVxuXG5cblxuXG4vLyBPTEQgVkVSU0lPTlNcblxuLypcbmNvbnN0IG9yZGVyZWRJbmRleGVzRGVjID0gYXJyID0+IFsuLi5hcnIua2V5cygpXS5zb3J0KChhLCBiKSA9PiBhcnJbYl0gLSBhcnJbYV0pO1xuY29uc3Qgb3JkZXJlZEluZGV4ZXNJbmMgPSBhcnIgPT4gWy4uLmFyci5rZXlzKCldLnNvcnQoKGEsIGIpID0+IGFyclthXSAtIGFycltiXSk7XG5cbmV4cG9ydCBjb25zdCB0ZXJuYXJ5Q2xhc3NpZmllciA9IChwcm9wZXJ0aWVzLCB0b3RhbEZ1bmN0aW9uLCBvcHRzID0ge30pID0+IHtcbiAgICBjb25zdCBsb3dUaHJlc2hvbGQgPSBvcHRzLmxvd1RocmVzaG9sZCB8fCBbMSAvIDMsIDEgLyAzLCAxIC8gM11cbiAgICBjb25zdCBoaWdoVGhyZXNob2xkID0gb3B0cy5oaWdoVGhyZXNob2xkIHx8IFsyIC8gMywgMiAvIDMsIDIgLyAzXVxuICAgIGNvbnN0IGNvbG9ycyA9IG9wdHMuY29sb3JzIHx8IFtcInJlZFwiLCBcImdyZWVuXCIsIFwiYmx1ZVwiXVxuICAgIGNvbnN0IGNvbG9ySW50ZXJwb2xhdGlvbiA9IG9wdHMuY29sb3JJbnRlcnBvbGF0aW9uIHx8IGludGVycG9sYXRlTGFiXG5cbiAgICAvL2h0dHBzOi8vZDNqcy5vcmcvZDMtaW50ZXJwb2xhdGUvY29sb3JcbiAgICBjb25zdCBtaWRkbGVDb2xvckZ1bmN0aW9uID0gKGNvbG9yMSwgY29sb3IyKSA9PiBjb2xvckludGVycG9sYXRpb24oY29sb3IxLCBjb2xvcjIpKDAuNSlcbiAgICBjb25zdCBtaWRkbGVDb2xvcnMgPSBvcHRzLm1pZGRsZUNvbG9ycyB8fCBbbWlkZGxlQ29sb3JGdW5jdGlvbihjb2xvcnNbMV0sIGNvbG9yc1syXSksIG1pZGRsZUNvbG9yRnVuY3Rpb24oY29sb3JzWzBdLCBjb2xvcnNbMl0pLCBtaWRkbGVDb2xvckZ1bmN0aW9uKGNvbG9yc1swXSwgY29sb3JzWzFdKV1cbiAgICBjb25zdCBjZW50ZXJDb2xvciA9IG9wdHMuY2VudGVyQ29sb3IgfHwgY29sb3JJbnRlcnBvbGF0aW9uKG1pZGRsZUNvbG9yc1syXSwgY29sb3JzWzJdKSgwLjMzMylcblxuICAgIGNvbnN0IGhpZ2hfID0gb3JkZXJlZEluZGV4ZXNEZWMoaGlnaFRocmVzaG9sZClcbiAgICBjb25zdCBsb3dfID0gb3JkZXJlZEluZGV4ZXNJbmMobG93VGhyZXNob2xkKVxuXG4gICAgY29uc3QgcDAgPSBwcm9wZXJ0aWVzWzBdLCBwMSA9IHByb3BlcnRpZXNbMV0sIHAyID0gcHJvcGVydGllc1syXVxuICAgIGNvbnN0IGZ1biA9IGMgPT4ge1xuICAgICAgICAvL2dldCB0b3RhbFxuICAgICAgICBjb25zdCB0b3QgPSB0b3RhbEZ1bmN0aW9uKGMpXG4gICAgICAgIGlmICghdG90KSByZXR1cm4gdW5kZWZpbmVkXG4gICAgICAgIC8vY29tcHV0ZSBzaGFyZXNcbiAgICAgICAgY29uc3Qgc2hhcmVzID0gWytjW3AwXSAvIHRvdCwgK2NbcDFdIC8gdG90LCArY1twMl0gLyB0b3RdXG4gICAgICAgIC8vcmV0dXJuIGNvbG9yc1xuICAgICAgICAvL3N0YXJ0IGZpcnN0IHdpdGggdGhlIGV4dHJlbWUgaGlnaCAodHJpYW5nbGVzKTogZnJvbSB0aGUgbGFyZ2VyIHZhbHVlIChzbWFsbCB0cmlhbmdsZSkgdG8gdGhlIGxvd2VyIHZhbHVlIChsYXJnZSB0cmlhbmdsZSlcbiAgICAgICAgZm9yIChsZXQgaSBvZiBoaWdoXykgaWYgKHNoYXJlc1tpXSA+IGhpZ2hUaHJlc2hvbGRbaV0pIHJldHVybiBjb2xvcnNbaV1cbiAgICAgICAgLy90aGVuIGRyYXcgdGhlIGV4dHJlbWUgbG93ICh0cmFwZXppdW1zKTogZnJvbSB0aGUgbG93ZXIgdmFsdWUgKHNtYWxsIHRyYXBleml1bXMpIHRvIHRoZSBsYXJnZXIgdmFsdWVzIChsYXJnZSB0cmFwZXppdW0pXG4gICAgICAgIGZvciAobGV0IGkgb2YgbG93XykgaWYgKHNoYXJlc1tpXSA8IGxvd1RocmVzaG9sZFtpXSkgcmV0dXJuIG1pZGRsZUNvbG9yc1tpXVxuICAgICAgICAvL2Vsc2UgY2VudHJhbCBjb2xvclxuICAgICAgICByZXR1cm4gY2VudGVyQ29sb3JcbiAgICB9XG4gICAgZnVuLmxvd1RocmVzaG9sZCA9IGxvd1RocmVzaG9sZFxuICAgIGZ1bi5oaWdoVGhyZXNob2xkID0gaGlnaFRocmVzaG9sZFxuICAgIGZ1bi5jb2xvcnMgPSBjb2xvcnNcbiAgICBmdW4ubWlkZGxlQ29sb3JzID0gbWlkZGxlQ29sb3JzXG4gICAgZnVuLmNlbnRlckNvbG9yID0gY2VudGVyQ29sb3JcbiAgICBmdW4ubG93SW5kZXggPSBsb3dfXG4gICAgZnVuLmhpZ2hJbmRleCA9IGhpZ2hfXG4gICAgcmV0dXJuIGZ1blxufVxuKi9cblxuLypcbmV4cG9ydCBjb25zdCB0ZXJuYXJ5Q2xhc3NpZmllcjMgPSAocHJvcGVydGllcywgdG90YWxGdW5jdGlvbiwgb3B0cyA9IHt9KSA9PiB7XG4gICAgY29uc3QgW2EwMSwgYTEyLCBhMjBdID0gb3B0cy50aHJlc2hvbGRzIHx8IFsxLzMsIDEvMywgMS8zXVxuICAgIGNvbnN0IFtjMCwgYzEsIGMyXSA9IG9wdHMuY29sb3JzIHx8IFtcInJlZFwiLCBcImdyZWVuXCIsIFwiYmx1ZVwiXVxuICAgIGNvbnN0IGNlbnRlckNvbG9yID0gb3B0cy5jZW50ZXJDb2xvciB8fCBcImdyYXlcIlxuXG4gICAgY29uc3QgZmZmID0gYSA9PiBhID09IDEgPyBJbmZpbml0eSA6IGEgLyAoMSAtIGEpXG4gICAgY29uc3QgYzAxID0gZmZmKGEwMSksIGMxMiA9IGZmZihhMTIpLCBjMjAgPSBmZmYoYTIwKVxuXG4gICAgY29uc3QgcDAgPSBwcm9wZXJ0aWVzWzBdLCBwMSA9IHByb3BlcnRpZXNbMV0sIHAyID0gcHJvcGVydGllc1syXVxuICAgIGNvbnN0IGZ1biA9IGMgPT4ge1xuICAgICAgICAvL2dldCB0b3RhbFxuICAgICAgICBjb25zdCB0b3QgPSB0b3RhbEZ1bmN0aW9uKGMpXG4gICAgICAgIGlmICghdG90KSByZXR1cm4gdW5kZWZpbmVkXG4gICAgICAgIC8vY29tcHV0ZSBzaGFyZXNcbiAgICAgICAgY29uc3QgW3MwLCBzMSwgczJdID0gWytjW3AwXSAvIHRvdCwgK2NbcDFdIC8gdG90LCArY1twMl0gLyB0b3RdXG4gICAgICAgIC8vcmV0dXJuIGNvbG9yc1xuICAgICAgICBpZiAoczAgKiBjMDEgPiBzMSAmJiBzMCA+IHMyICogYzIwKSByZXR1cm4gYzBcbiAgICAgICAgZWxzZSBpZiAoczEgPiBzMCAqIGMwMSAmJiBzMSAqIGMxMiA+IHMyKSByZXR1cm4gYzFcbiAgICAgICAgZWxzZSBpZiAoczIgKiBjMjAgPiBzMCAmJiBzMiA+IHMxICogYzEyKSByZXR1cm4gYzJcbiAgICAgICAgZWxzZSByZXR1cm4gY2VudGVyQ29sb3JcbiAgICB9XG4gICAgZnVuLmNvbG9ycyA9IFtjMCwgYzEsIGMyXVxuICAgIGZ1bi5jZW50ZXJDb2xvciA9IGNlbnRlckNvbG9yXG4gICAgcmV0dXJuIGZ1blxufVxuKi9cbiIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuLyoqXG4gKiBHZXQgdGhlIGNsYXNzIGlkIGZyb20gYSB2YWx1ZSBhbmQgY2xhc3MgYnJlYWsgdmFsdWVzXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IHYgdGhlIHZhbHVlXG4gKiBAcGFyYW0ge0FycmF5LjxudW1iZXI+fSBicmVha3MgdGhlIGJyZWFrc1xuICogQHJldHVybnMgVGhlIGNsYXNzIGlkLCBmcm9tIDAgdG8gYnJlYWtzLmxlbmd0aFxuICogQGRlcHJlY2F0ZWQgdXNlIGdldENsYXNzaWZpZXIgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENsYXNzKHYsIGJyZWFrcykge1xuICAgIGlmICghYnJlYWtzKSByZXR1cm5cbiAgICBpZiAoYnJlYWtzLmxlbmd0aCA9PSAwKSByZXR1cm4gMFxuICAgIGlmICh2IDw9IGJyZWFrc1swXSkgcmV0dXJuIDBcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IGJyZWFrcy5sZW5ndGg7IGkrKykgaWYgKGJyZWFrc1tpIC0gMV0gPCB2ICYmIHYgPD0gYnJlYWtzW2ldKSByZXR1cm4gaVxuICAgIHJldHVybiBicmVha3MubGVuZ3RoXG59XG5cbi8vdGFrZSAnbmljZScgdmFsdWUgKHBvd2VyIG9mIHRlbiwgb3IgbXVsdGlwbGUpXG5leHBvcnQgZnVuY3Rpb24gbmljZSh2LCBtdWx0aXBsZXMgPSBbOCwgNiwgNSwgNCwgMi41LCAyXSkge1xuICAgIC8vY29tcHV0ZSBiaWdnZXIgcG93ZXIgb2YgdGVuIGJlbG93XG4gICAgY29uc3Qgdl8gPSBNYXRoLnBvdygxMCwgTWF0aC5mbG9vcihNYXRoLmxvZzEwKHYpKSlcbiAgICBmb3IgKGxldCBtdWx0aXBsZSBvZiBtdWx0aXBsZXMpIGlmICh2XyAqIG11bHRpcGxlIDw9IHYpIHJldHVybiB2XyAqIG11bHRpcGxlXG4gICAgcmV0dXJuIHZfXG59XG5cbi8qXG4vL25vIGxvbmdlciB1c2VkXG5leHBvcnQgZnVuY3Rpb24gbG9hZEltYWdlKHNyYykge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IGltZyA9IG5ldyBJbWFnZSgpO1xuICAgICAgICBpbWcub25sb2FkID0gZnVuY3Rpb24gKCkgeyByZXNvbHZlKGltZyk7IH07XG4gICAgICAgIGltZy5vbmVycm9yID0gZnVuY3Rpb24gKCkgeyByZWplY3QobmV3IEVycm9yKCdFcnJvciBsb2FkaW5nIGltYWdlJykpOyB9O1xuICAgICAgICBpbWcuc3JjID0gc3JjO1xuICAgIH0pO1xufVxuKi9cblxuLypcbmV4cG9ydCBsZXQgbW9uaXRvciA9IGZhbHNlXG5cbmxldCBwcmV2aW91c0RhdGVcbmV4cG9ydCBmdW5jdGlvbiBtb25pdG9yRHVyYXRpb24obWVzc2FnZSkge1xuICAgIGNvbnN0IG5vd0RhdGUgPSBEYXRlLm5vdygpXG5cbiAgICAvL2ZpcnN0IGNhbGxcbiAgICBpZiAoIXByZXZpb3VzRGF0ZSkge1xuICAgICAgICBwcmV2aW91c0RhdGUgPSBub3dEYXRlXG4gICAgICAgIGNvbnNvbGUubG9nKHByZXZpb3VzRGF0ZSwgbWVzc2FnZSlcbiAgICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgZCA9IG5vd0RhdGUgLSBwcmV2aW91c0RhdGVcbiAgICBwcmV2aW91c0RhdGUgPSBub3dEYXRlXG4gICAgY29uc29sZS5sb2coZCwgbWVzc2FnZSlcbn1cbiovXG4iLCIvL0B0cy1jaGVja1xuJ3VzZSBzdHJpY3QnXG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHdpZHRoXG4gKiBAcGFyYW0ge3N0cmluZ30gaGVpZ2h0XG4gKiBAcGFyYW0ge29iamVjdH0gb3B0c1xuICogQHJldHVybnMge3tjYW52YXM6SFRNTENhbnZhc0VsZW1lbnQsIGdsOldlYkdMUmVuZGVyaW5nQ29udGV4dCwgd2lkdGg6bnVtYmVyLCBoZWlnaHQ6bnVtYmVyIH19XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYWtlV2ViR0xDYW52YXMod2lkdGgsIGhlaWdodCwgb3B0cyA9IHt9KSB7XG4gICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJylcbiAgICBjYW52YXMuc2V0QXR0cmlidXRlKCd3aWR0aCcsIHdpZHRoKVxuICAgIGNhbnZhcy5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsIGhlaWdodClcbiAgICBjb25zdCB2ZXJzaW9uMiA9IChvcHRzICYmICtvcHRzLnZlcnNpb249PTIpPyBcIjJcIiA6IFwiXCJcbiAgICAvKiogQHR5cGUge1dlYkdMUmVuZGVyaW5nQ29udGV4dH0gKi9cbiAgICBjb25zdCBnbCA9IGNhbnZhcy5nZXRDb250ZXh0KCd3ZWJnbCcgKyB2ZXJzaW9uMiwgb3B0cylcbiAgICBpZiAoIWdsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGluaXRpYWxpemUgV2ViR0wnK3ZlcnNpb24yKycuIFlvdXIgYnJvd3NlciBvciBtYWNoaW5lIG1heSBub3Qgc3VwcG9ydCBpdC4nKVxuICAgIH1cbiAgICByZXR1cm4geyBjYW52YXM6IGNhbnZhcywgZ2w6IGdsLCB3aWR0aDogd2lkdGgsIGhlaWdodDogaGVpZ2h0IH1cbn1cblxuLyoqXG4gKiBJbml0aWFsaXplIGEgc2hhZGVyIHByb2dyYW0sIHNvIFdlYkdMIGtub3dzIGhvdyB0byBkcmF3IG91ciBkYXRhXG4gKlxuICogQHBhcmFtIHtXZWJHTFJlbmRlcmluZ0NvbnRleHR9IGdsXG4gKiBAcGFyYW0gIHsuLi5XZWJHTFNoYWRlcn0gc2hhZGVyc1xuICogQHJldHVybnMge1dlYkdMUHJvZ3JhbX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluaXRTaGFkZXJQcm9ncmFtKGdsLCAuLi5zaGFkZXJzKSB7XG4gICAgLyoqIEB0eXBlIHtXZWJHTFByb2dyYW18bnVsbH0gKi9cbiAgICBjb25zdCBwcm9ncmFtID0gZ2wuY3JlYXRlUHJvZ3JhbSgpXG4gICAgaWYgKHByb2dyYW0gPT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY3JlYXRlIHdlYkdMIHByb2dyYW0nKVxuICAgIGZvciAoY29uc3Qgc2hhZGVyIG9mIHNoYWRlcnMpIGdsLmF0dGFjaFNoYWRlcihwcm9ncmFtLCBzaGFkZXIpXG4gICAgZ2wubGlua1Byb2dyYW0ocHJvZ3JhbSlcbiAgICBpZiAoZ2wuZ2V0UHJvZ3JhbVBhcmFtZXRlcihwcm9ncmFtLCBnbC5MSU5LX1NUQVRVUykpIHJldHVybiBwcm9ncmFtXG4gICAgdGhyb3cgbmV3IEVycm9yKGdsLmdldFByb2dyYW1JbmZvTG9nKHByb2dyYW0pIHx8ICdDYW5ub3QgY3JlYXRlIHdlYkdMIHByb2dyYW0gKDIpJylcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgc2hhZGVyIG9mIHRoZSBnaXZlbiB0eXBlLCB1cGxvYWRzIHRoZSBzb3VyY2UgYW5kIGNvbXBpbGVzIGl0LlxuICpcbiAqIEBwYXJhbSB7V2ViR0xSZW5kZXJpbmdDb250ZXh0fSBnbFxuICogQHBhcmFtIHtudW1iZXJ9IHR5cGVcbiAqIEBwYXJhbSAgey4uLnN0cmluZ30gc291cmNlc1xuICogQHJldHVybnMge1dlYkdMU2hhZGVyfVxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU2hhZGVyKGdsLCB0eXBlLCAuLi5zb3VyY2VzKSB7XG4gICAgLyoqIEB0eXBlIHtXZWJHTFNoYWRlcnxudWxsfSAqL1xuICAgIGNvbnN0IHNoYWRlciA9IGdsLmNyZWF0ZVNoYWRlcih0eXBlKVxuICAgIGlmIChzaGFkZXIgPT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY3JlYXRlIHdlYkdMIHNoYWRlcicpXG4gICAgZ2wuc2hhZGVyU291cmNlKHNoYWRlciwgc291cmNlcy5qb2luKCdcXG4nKSlcbiAgICBnbC5jb21waWxlU2hhZGVyKHNoYWRlcilcbiAgICBpZiAoZ2wuZ2V0U2hhZGVyUGFyYW1ldGVyKHNoYWRlciwgZ2wuQ09NUElMRV9TVEFUVVMpKSByZXR1cm4gc2hhZGVyXG4gICAgdGhyb3cgbmV3IEVycm9yKGdsLmdldFNoYWRlckluZm9Mb2coc2hhZGVyKSB8fCAnQ2Fubm90IGNyZWF0ZSB3ZWJHTCBzaGFkZXIgKDIpJylcbn1cblxuLyoqXG4gKiBDaGVjayBpZiB3ZWJHTCBpcyBzdXBwb3J0ZWRcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrV2ViR0xTdXBwb3J0KCkge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpXG4gICAgICAgIHJldHVybiAhIShcbiAgICAgICAgICAgICEhd2luZG93LldlYkdMUmVuZGVyaW5nQ29udGV4dCAmJlxuICAgICAgICAgICAgKGNhbnZhcy5nZXRDb250ZXh0KCd3ZWJnbCcpIHx8IGNhbnZhcy5nZXRDb250ZXh0KCdleHBlcmltZW50YWwtd2ViZ2wnKSlcbiAgICAgICAgKVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG59XG4iLCIvLyBUaGUgbW9kdWxlIGNhY2hlXG52YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHR2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuXHRcdC8vIG5vIG1vZHVsZS5pZCBuZWVkZWRcblx0XHQvLyBubyBtb2R1bGUubG9hZGVkIG5lZWRlZFxuXHRcdGV4cG9ydHM6IHt9XG5cdH07XG5cblx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdKG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG5cdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuIiwiLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gKGV4cG9ydHMsIGRlZmluaXRpb24pID0+IHtcblx0Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcblx0XHR9XG5cdH1cbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gKG9iaiwgcHJvcCkgPT4gKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKSIsIi8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uciA9IChleHBvcnRzKSA9PiB7XG5cdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuXHR9XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG59OyIsIi8vQHRzLWNoZWNrXG4ndXNlIHN0cmljdCdcblxuLy8gdGhlIGFwcGxpY2F0aW9uXG5leHBvcnQgeyBNYXAgfSBmcm9tICcuL2NvcmUvTWFwLmpzJ1xuZXhwb3J0IHsgR2VvQ2FudmFzIH0gZnJvbSAnLi9jb3JlL0dlb0NhbnZhcy5qcydcbmV4cG9ydCB7IFN0eWxlIH0gZnJvbSAnLi9jb3JlL1N0eWxlLmpzJ1xuZXhwb3J0IHsgTGF5ZXIgfSBmcm9tICcuL2NvcmUvTGF5ZXIuanMnXG5leHBvcnQgeyBEYXRhc2V0IH0gZnJvbSAnLi9jb3JlL0RhdGFzZXQuanMnXG5leHBvcnQgeyBNdWx0aVJlc29sdXRpb25EYXRhc2V0IH0gZnJvbSAnLi9jb3JlL011bHRpUmVzb2x1dGlvbkRhdGFzZXQuanMnXG5cbi8vIGV4cG9ydCBkYXRhc2V0IHR5cGVzXG5leHBvcnQgeyBUaWxlZEdyaWQgfSBmcm9tICcuL2RhdGFzZXQvVGlsZWRHcmlkLmpzJ1xuZXhwb3J0IHsgQ1NWR3JpZCB9IGZyb20gJy4vZGF0YXNldC9DU1ZHcmlkLmpzJ1xuZXhwb3J0IHsgSlNHcmlkIH0gZnJvbSAnLi9kYXRhc2V0L0pTR3JpZC5qcydcblxuLy8gZXhwb3J0IHN0eWxlc1xuZXhwb3J0IHsgU2hhcGVDb2xvclNpemVTdHlsZSB9IGZyb20gJy4vc3R5bGUvU2hhcGVDb2xvclNpemVTdHlsZS5qcydcbmV4cG9ydCB7IFN0cm9rZVN0eWxlIH0gZnJvbSAnLi9zdHlsZS9TdHJva2VTdHlsZS5qcydcbmV4cG9ydCB7IEpveVBsb3RTdHlsZSB9IGZyb20gJy4vc3R5bGUvSm95UGxvdFN0eWxlLmpzJ1xuZXhwb3J0IHsgQ29tcG9zaXRpb25TdHlsZSB9IGZyb20gJy4vc3R5bGUvQ29tcG9zaXRpb25TdHlsZS5qcydcbmV4cG9ydCB7IFNlZ21lbnRTdHlsZSB9IGZyb20gJy4vc3R5bGUvU2VnbWVudFN0eWxlLmpzJ1xuZXhwb3J0IHsgVGV4dFN0eWxlIH0gZnJvbSAnLi9zdHlsZS9UZXh0U3R5bGUuanMnXG5leHBvcnQgeyBQaWxsYXJTdHlsZSB9IGZyb20gJy4vc3R5bGUvUGlsbGFyU3R5bGUuanMnXG5leHBvcnQgeyBTaWRlU3R5bGUgfSBmcm9tICcuL3N0eWxlL1NpZGVTdHlsZS5qcydcbmV4cG9ydCB7IFNoYWRpbmdTdHlsZSB9IGZyb20gJy4vc3R5bGUvU2hhZGluZ1N0eWxlLmpzJ1xuZXhwb3J0IHsgU2lkZUNhdGVnb3J5U3R5bGUgfSBmcm9tICcuL3N0eWxlL1NpZGVDYXRlZ29yeVN0eWxlLmpzJ1xuZXhwb3J0IHsgRG90RGVuc2l0eVN0eWxlIH0gZnJvbSAnLi9zdHlsZS9Eb3REZW5zaXR5U3R5bGUuanMnXG5leHBvcnQgeyBTaWRlVGFuYWthU3R5bGUgfSBmcm9tICcuL3N0eWxlL1NpZGVUYW5ha2FTdHlsZS5qcydcbmV4cG9ydCB7IExlZ29TdHlsZSB9IGZyb20gJy4vc3R5bGUvTGVnb1N0eWxlLmpzJ1xuZXhwb3J0IHsgU3F1YXJlQ29sb3JXZWJHTFN0eWxlIH0gZnJvbSAnLi9zdHlsZS9TcXVhcmVDb2xvcldlYkdMU3R5bGUuanMnXG5leHBvcnQgeyBTcXVhcmVDb2xvckNhdGVnb3J5V2ViR0xTdHlsZSB9IGZyb20gJy4vc3R5bGUvU3F1YXJlQ29sb3JDYXRlZ29yeVdlYkdMU3R5bGUuanMnXG5leHBvcnQgeyBNb3NhaWNTdHlsZSB9IGZyb20gJy4vc3R5bGUvTW9zYWljU3R5bGUuanMnXG5leHBvcnQgeyBOaW5qYVN0YXJTdHlsZSB9IGZyb20gJy4vc3R5bGUvTmluamFTdGFyU3R5bGUuanMnXG5leHBvcnQgeyBUaW1lU2VyaWVzU3R5bGUgfSBmcm9tICcuL3N0eWxlL1RpbWVTZXJpZXNTdHlsZS5qcydcbmV4cG9ydCB7IElzb0ZlbmNlU3R5bGUgfSBmcm9tICcuL3N0eWxlL0lzb0ZlbmNlU3R5bGUuanMnXG5leHBvcnQgeyBJbWFnZVN0eWxlIH0gZnJvbSAnLi9zdHlsZS9JbWFnZVN0eWxlLmpzJ1xuXG4vLyBleHBvcnQgYWRkaXRpb25hbCBsYXllcnNcbmV4cG9ydCB7IEdyaWRMYXllciB9IGZyb20gJy4vbGF5ZXIvR3JpZExheWVyLmpzJ1xuZXhwb3J0IHsgQmFja2dyb3VuZExheWVyIH0gZnJvbSAnLi9sYXllci9CYWNrZ3JvdW5kTGF5ZXIuanMnXG5leHBvcnQgeyBCYWNrZ3JvdW5kTGF5ZXJXTVMgfSBmcm9tICcuL2xheWVyL0JhY2tncm91bmRMYXllcldNUy5qcydcbmV4cG9ydCB7IEJhY2tncm91bmRMYXllckltYWdlIH0gZnJvbSAnLi9sYXllci9CYWNrZ3JvdW5kTGF5ZXJJbWFnZS5qcydcbmV4cG9ydCB7IExhYmVsTGF5ZXIgfSBmcm9tICcuL2xheWVyL0xhYmVsTGF5ZXIuanMnXG5leHBvcnQgeyBHZW9KU09OTGF5ZXIgfSBmcm9tICcuL2xheWVyL0dlb0pTT05MYXllci5qcydcblxuLy8gZXhwb3J0IGxlZ2VuZHNcbmV4cG9ydCB7IENvbG9yTGVnZW5kIH0gZnJvbSAnLi9sZWdlbmQvQ29sb3JMZWdlbmQuanMnXG5leHBvcnQgeyBDb2xvckRpc2NyZXRlTGVnZW5kIH0gZnJvbSAnLi9sZWdlbmQvQ29sb3JEaXNjcmV0ZUxlZ2VuZC5qcydcbmV4cG9ydCB7IENvbG9yQ2F0ZWdvcnlMZWdlbmQgfSBmcm9tICcuL2xlZ2VuZC9Db2xvckNhdGVnb3J5TGVnZW5kLmpzJ1xuZXhwb3J0IHtcbiAgICBTaXplTGVnZW5kLFxuICAgIHNpemVMZWdlbmQsXG4gICAgc2l6ZUxlZ2VuZFZpZXdTY2FsZSxcbiAgICBzaXplRGlzY3JldGVMZWdlbmQsXG4gICAgc2l6ZURpc2NyZXRlVmlld1NjYWxlTGVnZW5kLFxufSBmcm9tICcuL2xlZ2VuZC9TaXplTGVnZW5kLmpzJ1xuZXhwb3J0IHsgT3JpZW50YXRpb25MZWdlbmQsIG9yaWVudGF0aW9uTGVnZW5kIH0gZnJvbSAnLi9sZWdlbmQvT3JpZW50YXRpb25MZWdlbmQuanMnXG5leHBvcnQgeyBUZXJuYXJ5TGVnZW5kIH0gZnJvbSAnLi9sZWdlbmQvVGVybmFyeUxlZ2VuZC5qcydcblxuLy8gZXhwb3J0IHsgZ29Ub1N0cmFpZ2h0LCB6b29tVG8gfSBmcm9tIFwiLi91dGlscy96b29tVXRpbHNcIlxuZXhwb3J0ICogZnJvbSAnLi91dGlscy9zdHJldGNoaW5nLmpzJ1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9zY2FsZS5qcydcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvdGVybmFyeS5qcydcbmV4cG9ydCB7IG5pY2UgfSBmcm9tICcuL3V0aWxzL3V0aWxzLmpzJ1xuXG5pbXBvcnQgeyBHZW9DYW52YXMgfSBmcm9tICcuL2NvcmUvR2VvQ2FudmFzLmpzJ1xuZXhwb3J0IGNvbnN0IGdldFBhcmFtZXRlckJ5TmFtZSA9IEdlb0NhbnZhcy5nZXRQYXJhbWV0ZXJCeU5hbWVcblxuLy8gc2V0IGRlZmF1bHQgZDMgbG9jYWxlXG5pbXBvcnQgeyBmb3JtYXREZWZhdWx0TG9jYWxlIH0gZnJvbSAnZDMtZm9ybWF0J1xuZm9ybWF0RGVmYXVsdExvY2FsZSh7XG4gICAgZGVjaW1hbDogJy4nLFxuICAgIHRob3VzYW5kczogJyAnLFxuICAgIGdyb3VwaW5nOiBbM10sXG4gICAgY3VycmVuY3k6IFsnJywgJ+KCrCddLFxufSlcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==