difenduandada
2024-12-31 34abe6963b344c882358274957f4b992456fee40
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
 
                (function() {
                    var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
                    var __module = nodeEnv ? module : {exports:{}};
                    var __filename = 'preview-scripts/assets/Scripts/common/common_scrollview_single.js';
                    var __require = nodeEnv ? function (request) {
                        return cc.require(request);
                    } : function (request) {
                        return __quick_compile_project__.require(request, __filename);
                    };
                    function __define (exports, require, module) {
                        if (!nodeEnv) {__quick_compile_project__.registerModule(__filename, module);}"use strict";
cc._RF.push(module, '214a9FAXt5FTpkEEnLj0wMq', 'common_scrollview_single');
// Scripts/common/common_scrollview_single.js
 
"use strict";
 
// --------------------------------------------------------------------
// @author: shiraho@syg.com(必填, 创建模块的人员)
// @description:
//      新版本无限循环列表容器, cellitem 需要继承basepanel
// <br/>Create: new Date().toISOString()
// --------------------------------------------------------------------
var CommonScrollViewSingle = cc.Class({
  "extends": BaseClass,
  ctor: function ctor() {
    this.initConfig();
  },
  initConfig: function initConfig() {
    this.parent = null;
    this.prefabPath = PathTool.getPrefabPath("common", "common_scroll_view");
    this.pos = cc.v2(0, 0);
    this.dir = ScrollViewDir.vertical;
    this.start_pos = ScrollViewStartPos.top;
    this.size = cc.size(100, 100);
    this.ap = cc.v2(0, 0); //存放所有格子结构体
 
    this.cellList = []; //缓存Cell所用到的对象
 
    this.cacheList = {}; //记录活跃得格子ID
 
    this.activeCellIdx = {}; //当前选择物品的索引
 
    this.selectCellIndex = 1; //回调方法
 
    this.handler = {}; //到时间显示的索引
 
    this.time_show_index = 0; //是否初始化
 
    this.is_first_init = true; //最大条目
 
    this.cacheMaxSize = 1;
  },
 
  /**
   * 创建
   * @param {*} parent 所在父节点
   * @param {*} pos 滑动组件位置
   * @param {*} dir 滑动对齐方式
   * @param {*} start_pos 滑动列表开始位置
   * @param {*} size 滑动框大小
   * @param {*} setting 设置信息
   * @param {*} ap 锚点
   */
  createScroll: function createScroll(parent, pos, dir, start_pos, size, setting, ap) {
    this.parent = parent;
    this.pos = pos || cc.v2(0, 0);
    this.dir = dir || ScrollViewDir.vertical;
    this.start_pos = start_pos || ScrollViewStartPos.top;
    this.size = size || cc.size(100, 100);
    this.ap = ap || cc.v2(0, 0);
    this.analysisSetting(setting);
    LoaderManager.getInstance().loadRes(this.prefabPath, function (res_object) {
      var scroll = res_object;
      this.createRootWnd(scroll);
    }.bind(this));
  },
  //解析数据
  analysisSetting: function analysisSetting(setting) {
    this.setting = setting || {};
    this.start_x = this.setting.start_x || 0; //第一个单元的起点X
 
    this.space_x = this.setting.space_x || 0; // 横向间隔空间
 
    this.start_y = this.setting.start_y || 0; // 第一个单元的起点Y
 
    this.space_y = this.setting.space_y || 0; // 竖向间隔空间
 
    this.item_width = this.setting.item_width || 115; // 单元的宽度
 
    this.item_height = this.setting.item_height || 115; // 单元的高度
 
    this.row = this.setting.row || 5; // 行数,作用于水平方向的滚动
 
    this.col = this.setting.col || 5; // 列数,作用于垂直方向的滚动
 
    this.delay = this.setting.delay || 4; // 创建延迟时间
 
    this.once_num = this.setting.once_num || 1; // 每次创建的数量
 
    this.need_dynamic = this.setting.need_dynamic || true; // 是否需要动态创建的 
    //横向的只支持一行的..
 
    if (this.dir == ScrollViewDir.horizontal) {
      this.row = 1;
    }
 
    this.calculationMaxSum();
  },
  //计算一下一屏最多创建的个数
  calculationMaxSum: function calculationMaxSum() {
    var max_sum;
 
    if (this.dir == ScrollViewDir.horizontal) {
      max_sum = (Math.ceil(this.size.width / (this.item_width + this.space_x)) + 1) * this.row;
    } else {
      max_sum = (Math.ceil(this.size.height / (this.item_height + this.space_y)) + 1) * this.col;
    }
 
    this.cacheMaxSize = max_sum;
  },
  // 初始化创建对象
  createRootWnd: function createRootWnd(scroll) {
    this.root_wnd = scroll;
    this.scroll_view = scroll.getChildByName("ScrollView");
    this.scroll_view_mask = this.scroll_view.getChildByName("view");
    this.scroll_view_con = this.scroll_view_mask.getChildByName("content");
    this.root_wnd.setContentSize(this.size);
    this.root_wnd.setAnchorPoint(this.ap.x, this.ap.y);
    this.root_wnd.setPosition(this.pos);
    this.scroll_view.setContentSize(this.size);
    this.scroll_view_mask.setContentSize(this.size);
    this.scroll_view_con.setContentSize(this.size); // 滚动组建
 
    this.scroll_view_compend = this.scroll_view.getComponent(cc.ScrollView);
 
    if (this.dir == ScrollViewDir.vertical) {
      this.scroll_view_compend.vertical = true;
    } else {
      this.scroll_view_compend.horizontal = true;
    }
 
    this.container = this.scroll_view_con;
 
    if (this.parent) {
      this.parent.addChild(scroll);
    } // 监听事件
 
 
    this.setInnerContainer();
    this.registerEvent(); // if (this.select_index != null) {
 
    this.reloadData(this.select_index, this.setting); // }
  },
  // 滚动设置
  registerEvent: function registerEvent() {
    if (this.need_dynamic == true) {
      this.scroll_view_compend.node.on('scrolling', this.checkRectIntersectsRect, this); // this.scroll_view_compend.node.on('bounce-bottom', this.scrollToBottom_callback, this);
    }
  },
  // 滚动到底部的时候回调
  addScrollToBottomCallBack: function addScrollToBottomCallBack(callback) {
    this.scrollToBottom_callback = callback;
  },
  // 注册事件
  registerScriptHandlerSingle: function registerScriptHandlerSingle(func, handlerId) {
    this.handler[handlerId] = func;
  },
  //获取cell数量
  numberOfCells: function numberOfCells() {
    if (this.handler[ScrollViewFuncType.NumberOfCells]) {
      return this.handler[ScrollViewFuncType.NumberOfCells]();
    }
  },
  // 刷新每一个cell
  updateCellByIndex: function updateCellByIndex(cell, index) {
    if (this.handler[ScrollViewFuncType.UpdateCellByIndex]) {
      this.handler[ScrollViewFuncType.UpdateCellByIndex](cell, index);
    }
  },
  // 创建一个显示对象
  createNewCell: function createNewCell() {
    if (this.handler[ScrollViewFuncType.CreateNewCell]) {
      return this.handler[ScrollViewFuncType.CreateNewCell](this.item_width, this.item_height);
    }
  },
  // 点击单个
  onCellTouched: function onCellTouched(cell, index) {
    if (this.handler[ScrollViewFuncType.OnCellTouched]) {
      this.handler[ScrollViewFuncType.OnCellTouched](cell, index);
    }
  },
  // 设置是否可点击
  setClickEnabled: function setClickEnabled(status) {},
  // 设置是否吞噬点击
  setSwallowTouches: function setSwallowTouches(status) {},
  // 移动过程中是否不再可是范围,不再的时候移除,放到对象池,准备下一次创建
  checkRectIntersectsRect: function checkRectIntersectsRect() {
    if (this.dir == ScrollViewDir.vertical) {
      this.checkOverShowByVertical();
    } else {
      this.checkOverShowByHorizontal();
    }
  },
  // 竖直方向的监测判断
  checkOverShowByVertical: function checkOverShowByVertical() {
    if (this.cellList == null) return;
    var sum = this.cellList.length;
    if (sum == 0) return;
    var container_y = this.container.y;
    var bot = -container_y;
    var top = this.size.height + bot;
    var col_count = Math.ceil(sum / this.col); // 活跃cell开始行数
 
    var activeCellStartRow = 0;
 
    for (var i = 0; i < col_count; i++) {
      var index = i * this.col;
      var cell = this.cellList[index];
      activeCellStartRow = i;
 
      if (cell && cell.y - this.item_height * 0.5 <= top) {
        break;
      }
    } // 活跃cell结束行数
 
 
    var activeCellEndRow = col_count;
 
    if (bot > 0) {
      for (var _i = activeCellStartRow; _i < col_count; _i++) {
        var index = _i * this.col;
        var cell = this.cellList[index];
 
        if (cell && cell.y + this.item_height * 0.5 < bot) {
          activeCellEndRow = _i - 1;
          break;
        }
      }
    } // 重复使用
 
 
    var max_count = this.numberOfCells();
 
    for (var _i2 = 0; _i2 < col_count; _i2++) {
      if (_i2 >= activeCellStartRow && _i2 <= activeCellEndRow) {
        for (var m = 0; m < this.col; m++) {
          var index = _i2 * this.col + m;
 
          if (!this.activeCellIdx[index]) {
            if (index <= max_count) {
              this.updateCellAtIndex(index);
              this.activeCellIdx[index] = true;
            }
          }
        }
      } else {
        for (var _m = 0; _m < this.col; _m++) {
          var index = _i2 * this.col + _m;
 
          if (index <= max_count) {
            this.activeCellIdx[index] = false;
          }
        }
      }
    }
  },
  // 竖直方向的监测判断
  checkOverShowByVerticalBottom: function checkOverShowByVerticalBottom() {
    if (this.cellList == null) return;
    var sum = this.cellList.length;
    if (sum == 0) return;
    var container_y = this.container.y;
    var bot = -container_y;
    var top = this.size.height + bot;
    var col_count = Math.ceil(sum / this.col); // 活跃cell开始行数
 
    var activeCellStartRow = col_count;
 
    for (var i = col_count - 1; i >= 0; i--) {
      var index = i * this.col;
      var cell = this.cellList[index];
      activeCellStartRow = i;
 
      if (cell && cell.y - this.item_height * 0.5 <= top) {
        break;
      }
    } // 活跃cell结束行数
 
 
    var activeCellEndRow = 0;
 
    if (bot > 0) {
      for (var _i3 = activeCellStartRow - 1; _i3 >= 0; _i3--) {
        var index = _i3 * this.col;
        var cell = this.cellList[index];
 
        if (cell && cell.y + this.item_height * 0.5 < bot) {
          activeCellEndRow = _i3 + 1;
          break;
        }
      }
    } // 重复使用
 
 
    var max_count = this.numberOfCells();
 
    for (var _i4 = 0; _i4 < col_count; _i4++) {
      if (_i4 <= activeCellStartRow && _i4 >= activeCellEndRow) {
        for (var m = 0; m < this.col; m++) {
          var index = _i4 * this.col + m;
 
          if (!this.activeCellIdx[index]) {
            if (index <= max_count) {
              this.updateCellAtIndex(index);
              this.activeCellIdx[index] = true;
            }
          }
        }
      } else {
        for (var _m2 = 0; _m2 < this.col; _m2++) {
          var index = _i4 * this.col + _m2;
 
          if (index <= max_count) {
            this.activeCellIdx[index] = false;
          }
        }
      }
    }
  },
  // 水平方向的监测
  checkOverShowByHorizontal: function checkOverShowByHorizontal() {
    if (this.cellList == null) return;
    var row_count = this.cellList.length;
    if (row_count == 0) return;
    var container_x = this.container.x;
    var top = -container_x;
    var bot = top + this.size.width; // 活跃cell开始列数
 
    var activeCellStartRow = 0;
 
    if (top > 0) {
      for (var i = 0; i < row_count; i++) {
        var cell = this.cellList[i];
        activeCellStartRow = i;
 
        if (cell && cell.x + this.item_width * 0.5 >= top) {
          break;
        }
      }
    } // 活跃cell结束行数
 
 
    var activeCellEndRow = row_count;
 
    for (var index = activeCellStartRow; index < row_count; index++) {
      var cell = this.cellList[index];
 
      if (cell && cell.x - this.item_width * 0.5 > bot) {
        activeCellEndRow = index;
        break;
      }
    }
 
    var max_count = this.numberOfCells();
 
    for (var _index = 0; _index < row_count; _index++) {
      if (_index >= activeCellStartRow && _index <= activeCellEndRow) {
        if (!this.activeCellIdx[_index]) {
          if (_index <= max_count) {
            this.updateCellAtIndex(_index);
            this.activeCellIdx[_index] = true;
          }
        }
      } else {
        if (_index <= max_count) {
          this.activeCellIdx[_index] = false;
        }
      }
    }
  },
  // 移动到具体位置,暂时不用了
  updateMove: function updateMove(pos) {// var target_pos = this.checkPosition(pos.x, pos.y);
    // var move_to = cc.moveTo(0.1, target_pos.x, target_pos.y).easing(cc.easeBackOut());
    // this.container.runAction(move_to);
  },
  // 跳转到指定位置,暂时不用了
  jumpToMove: function jumpToMove(pos, time, callback) {},
  // 监测位置,暂时也不用了
  checkPosition: function checkPosition() {// var _x = this.container.x;
    // var _y = this.container.y;
    // if (this.dir == ScrollViewDir.horizontal) {
    //     _x = _x + x;
    // } else if (this.dir == ScrollViewDir.vertical) {
    //     _y = _y + y;
    // }
    // if (_x > 0) {
    //     _x = 0;
    // } else if (_x < this.size.width - this.container_size.width) {
    //     _x = this.size.width - this.container_size.width;
    // }
    // if (_y > 0) {
    //     _y = 0;
    // } else if (_y < this.size.height - this.container_size.height) {
    //     _y = this.size.height - this.container_size.height;
    // }
    // return cc.v2(_x, _y)
  },
  // 获取当前容器的坐标,暂时不用
  getCurContainerPosY: function getCurContainerPosY() {},
  // 当前容器的坐标 位置
  getCurContainerPosX: function getCurContainerPosX() {},
  //设置滚动容器的大小
  setInnerContainer: function setInnerContainer() {
    var size = this.numberOfCells();
    var container_width = this.size.width;
    var container_height = this.size.height;
    var num = 0;
 
    if (this.dir == ScrollViewDir.horizontal) {
      num = Math.ceil(size / this.row);
      container_width = num * this.item_width + 2 * this.start_x + (num - 1) * this.space_x;
    } else {
      num = Math.ceil(size / this.col);
      container_height = num * this.item_height + 2 * this.start_y + (num - 1) * this.space_y;
    }
 
    container_width = Math.max(container_width, this.size.width);
    container_height = Math.max(container_height, this.size.height);
    this.container_size = cc.size(container_width, container_height);
 
    if (this.scroll_view_con) {
      this.scroll_view_con.setContentSize(this.container_size);
    }
 
    if (this.scroll_view_compend) {
      this.scroll_view_compend.stopAutoScroll();
 
      if (this.start_pos == ScrollViewStartPos.top) {
        this.scroll_view_compend.scrollToTop(0);
      } else if (this.start_pos == ScrollViewStartPos.bottom) {
        this.scroll_view_compend.scrollToBottom(0);
      }
    }
  },
  // 刷新当前显示item数据(不改变任何位置的)
  resetCurrentItems: function resetCurrentItems() {
    for (var key in this.activeCellIdx) {
      if (this.activeCellIdx[key] == true) {
        this.updateCellAtIndex(key);
      }
    }
  },
  // 根据index刷新对应的索引,如果在可视范围以内
  resetItemByIndex: function resetItemByIndex(index) {
    if (this.activeCellIdx[index] == true) {
      this.updateCellAtIndex(index);
    }
  },
  // 获取所有活跃的cell对象
  getActiveCellList: function getActiveCellList() {
    var list = [];
 
    for (var key in this.activeCellIdx) {
      if (this.activeCellIdx[key] == true) {
        if (this.cellList[key] && this.cellList[key].cell) {
          list.push(this.cellList[key].cell);
        }
      }
    }
 
    return list;
  },
  // 根据下表获取对应的cell,不管是否活跃
  getCellByIndex: function getCellByIndex(index) {
    if (this.cellList[index] && this.cellList[index].cell) {
      return this.cellList[index].cell;
    }
  },
  // 根据下表获取对应的cell的XY位置,先预留
  getCellXYByIndex: function getCellXYByIndex(index) {},
  // 设置数据
  reloadData: function reloadData(select_index, setting) {
    if (this.root_wnd == null) {
      this.select_index = select_index;
      this.setting = setting;
      return;
    }
 
    if (setting) {
      this.analysisSetting(setting);
    }
 
    this.cellList = [];
    this.activeCellIdx = {};
 
    for (var key in this.cacheList) {
      var _cell = this.cacheList[key];
 
      _cell.setPosition(-10000, 0);
    }
 
    this.setInnerContainer();
    var number = this.numberOfCells();
    if (number == 0) return;
 
    for (var i = 0; i < number; i++) {
      var cell = null;
 
      if (i <= this.time_show_index) {
        cell = this.getCacheCellByIndex(i);
      }
 
      var row_count = this.cellList.length;
      var xy = this.getCellPosition(row_count); //row_cont + 1
 
      var cellData = {
        cell: cell,
        x: xy.x,
        y: xy.y
      };
      this.cellList.push(cellData);
    }
 
    if (this.is_first_init) {
      this.startTimeTicket();
    } else {
      //如果时间显示索引小于总数 应该显示继续当前定时器 让下面的能显示出来
      if (this.time_show_index <= number) {
        this.startTimeTicket();
      }
    }
 
    if (select_index == null) {
      var maxRefreshNum = 0;
 
      if (this.dir == ScrollViewDir.horizontal) {
        maxRefreshNum = this.cacheMaxSize - this.row;
      } else {
        maxRefreshNum = this.cacheMaxSize - this.col;
      }
 
      var refreshNum = number < maxRefreshNum ? number : maxRefreshNum;
 
      for (var _i5 = 0; _i5 < refreshNum; _i5++) {
        if (_i5 < this.time_show_index) {
          //i<=
          this.updateCellAtIndex(_i5);
        }
 
        this.activeCellIdx[_i5] = true;
      }
    } else {
      this.selectCellByIndex(select_index);
    }
  },
  // 选中index索引对象(如果列表允许 会排序在开始第一位)
  selectCellByIndex: function selectCellByIndex(index) {
    var maxRefreshNum = 0;
 
    if (this.dir == ScrollViewDir.horizontal) {
      maxRefreshNum = this.cacheMaxSize - this.row;
    } else {
      maxRefreshNum = this.cacheMaxSize - this.col;
    }
 
    var number = this.numberOfCells();
 
    if (number < maxRefreshNum) {
      // 不够现实一屏幕
      for (var i = 0; i < number; i++) {
        if (i < this.time_show_index) {
          //i<=
          this.updateCellAtIndex(i);
        }
 
        this.activeCellIdx[i] = true;
      }
    } else {
      if (this.dir == ScrollViewDir.horizontal) {
        var container_x = 0;
 
        if (index == 0) {
          container_x = 0;
        } else {
          container_x = -(this.cellList[index].x - (this.item_width + this.space_x) * 0.5);
        } // 容器X方向最大位置
 
 
        var max_contariner_x = -(this.container_size.width - this.size.width);
 
        if (container_x < max_contariner_x) {
          container_x = max_contariner_x;
        }
 
        var show_index = Math.floor(Math.abs(container_x) / this.item_width); //+1
 
        if (this.time_show_index < show_index) {
          this.time_show_index = show_index;
        }
 
        this.container.x = container_x;
        this.checkOverShowByHorizontal();
      } else {
        var container_y = 0;
 
        if (index == 0) {
          container_y = this.start_y + this.cellList[index].y + this.item_height * 0.5 - this.size.height;
        } else {
          container_y = this.cellList[index].y + (this.item_height + this.space_y) * 0.5 - this.size.height;
        }
 
        if (container_y < 0) {
          container_y = 0;
        }
 
        var index_1 = Math.floor((this.container_size.height - (container_y + this.size.height)) / this.item_height) + 1;
        var show_index = (index_1 - 1) * this.col; //+1
 
        if (this.time_show_index < show_index) {
          this.time_show_index = show_index;
        }
 
        this.container.y = -container_y;
        this.checkOverShowByVertical();
      }
    }
 
    if (index >= 0 && index < this.numberOfCells()) {
      //index>0 and index <=
      var cell = this.getCacheCellByIndex(index);
      cell.index = index;
      this.cellList[index].cell = cell;
      this.onCellTouched(cell, index);
    }
  },
  // 定时器创建
  startTimeTicket: function startTimeTicket() {
    if (this.time_tichet == null) {
      if (this.cellList.length == 0) return; // 到时间现实索引
 
      var once_num = this.once_num || 1;
 
      var _callback = function () {
        if (this.container == null) return;
        var count = this.time_show_index + once_num;
        var index = this.time_show_index; // if(index == 0){
        //     index = 1;
        // }
 
        var size = this.cellList.length;
        this.time_show_index = this.time_show_index + once_num;
 
        for (var i = index; i < count; i++) {
          if (i > size) break;
          var cellData = this.cellList[i];
 
          if (cellData && cellData.cell == null) {
            cellData.cell = this.getCacheCellByIndex(i);
          }
 
          if (this.activeCellIdx[i]) {
            this.updateCellAtIndex(i);
          }
        }
 
        if (this.time_show_index >= size) {
          this.clearTimeTicket();
          this.is_first_init = false;
        }
      }.bind(this);
 
      this.time_tichet = gcore.Timer.set(function () {
        _callback();
      }.bind(this), this.delay / 60, -1);
    }
  },
  // 清除掉定时器
  clearTimeTicket: function clearTimeTicket() {
    if (this.time_tichet) {
      gcore.Timer.del(this.time_tichet);
      this.time_tichet = null;
    }
  },
  // 获取index的对应位置
  getCellPosition: function getCellPosition(index) {
    var ap_x = 0.5;
    var ap_y = 0.5;
    var _x = 0;
    var _y = 0;
 
    if (this.dir == ScrollViewDir.horizontal) {
      _x = this.start_x + this.item_width * ap_x + (this.item_width + this.space_x) * Math.floor(index / this.row);
      _y = this.container_size.height - (this.start_y + this.item_height * ap_y + index % this.row * (this.item_height + this.space_y));
    } else {
      if (this.start_pos == ScrollViewStartPos.top) {
        _x = this.start_x + this.item_width * ap_x + (this.item_width + this.space_x) * (index % this.col);
        _y = this.container_size.height - (this.start_y + this.item_height * ap_y + Math.floor(index / this.col) * (this.item_height + this.space_y));
      } else {
        _x = this.start_x + this.item_width * ap_x + (this.item_width + this.space_x) * (index % this.col);
        _y = this.start_y + this.item_height * ap_y + Math.floor(index / this.col) * (this.item_height + this.space_y);
      }
    }
 
    return {
      x: _x,
      y: _y
    };
  },
  // 获取格子下表对应的缓存itemcell
  getCacheCellByIndex: function getCacheCellByIndex(index) {
    var cacheIndex = index % this.cacheMaxSize;
 
    if (this.cacheList[cacheIndex] == null) {
      var newCell = this.createNewCell();
 
      if (newCell) {
        // newCell.setAnchorPoint(0.5, 0.5;)
        newCell.setPosition(-10000, 0);
        this.cacheList[cacheIndex] = newCell;
        newCell.setParent(this.container);
      }
 
      return newCell;
    } else {
      return this.cacheList[cacheIndex];
    }
  },
  // 更新格子,并标记活跃
  updateCellAtIndex: function updateCellAtIndex(index) {
    if (index > this.time_show_index) return;
    if (this.cellList[index] == null) return;
    var cellData = this.cellList[index];
 
    if (cellData.cell == null) {
      cellData.cell = this.getCacheCellByIndex(index);
    }
 
    cellData.cell.setPosition(cellData.x, cellData.y);
    this.updateCellByIndex(cellData.cell, index);
  },
  // 
  getMaxSize: function getMaxSize() {
    return this.container_size;
  },
  getContainer: function getContainer() {
    return this.container;
  },
  deleteMe: function deleteMe() {
    this.DeleteMe();
  },
  setVisible: function setVisible(bool) {
    if (this.root_wnd && bool != null) {
      this.root_wnd.active = bool;
    }
  },
  DeleteMe: function DeleteMe() {
    this.clearTimeTicket();
 
    for (var key in this.cacheList) {
      var item = this.cacheList[key];
 
      if (item && item.deleteMe) {
        item.deleteMe();
      }
 
      item = null;
    }
 
    this.cellList = null;
    this.cacheList = null;
    this.activeCellIdx = null;
    this.root_wnd.destroy();
    this.root_wnd = null;
    LoaderManager.getInstance().releasePrefab(this.prefabPath);
  }
});
 
cc._RF.pop();
                    }
                    if (nodeEnv) {
                        __define(__module.exports, __require, __module);
                    }
                    else {
                        __quick_compile_project__.registerModuleFunc(__filename, function () {
                            __define(__module.exports, __require, __module);
                        });
                    }
                })();
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcY29tbW9uXFxjb21tb25fc2Nyb2xsdmlld19zaW5nbGUuanMiXSwibmFtZXMiOlsiQ29tbW9uU2Nyb2xsVmlld1NpbmdsZSIsImNjIiwiQ2xhc3MiLCJCYXNlQ2xhc3MiLCJjdG9yIiwiaW5pdENvbmZpZyIsInBhcmVudCIsInByZWZhYlBhdGgiLCJQYXRoVG9vbCIsImdldFByZWZhYlBhdGgiLCJwb3MiLCJ2MiIsImRpciIsIlNjcm9sbFZpZXdEaXIiLCJ2ZXJ0aWNhbCIsInN0YXJ0X3BvcyIsIlNjcm9sbFZpZXdTdGFydFBvcyIsInRvcCIsInNpemUiLCJhcCIsImNlbGxMaXN0IiwiY2FjaGVMaXN0IiwiYWN0aXZlQ2VsbElkeCIsInNlbGVjdENlbGxJbmRleCIsImhhbmRsZXIiLCJ0aW1lX3Nob3dfaW5kZXgiLCJpc19maXJzdF9pbml0IiwiY2FjaGVNYXhTaXplIiwiY3JlYXRlU2Nyb2xsIiwic2V0dGluZyIsImFuYWx5c2lzU2V0dGluZyIsIkxvYWRlck1hbmFnZXIiLCJnZXRJbnN0YW5jZSIsImxvYWRSZXMiLCJyZXNfb2JqZWN0Iiwic2Nyb2xsIiwiY3JlYXRlUm9vdFduZCIsImJpbmQiLCJzdGFydF94Iiwic3BhY2VfeCIsInN0YXJ0X3kiLCJzcGFjZV95IiwiaXRlbV93aWR0aCIsIml0ZW1faGVpZ2h0Iiwicm93IiwiY29sIiwiZGVsYXkiLCJvbmNlX251bSIsIm5lZWRfZHluYW1pYyIsImhvcml6b250YWwiLCJjYWxjdWxhdGlvbk1heFN1bSIsIm1heF9zdW0iLCJNYXRoIiwiY2VpbCIsIndpZHRoIiwiaGVpZ2h0Iiwicm9vdF93bmQiLCJzY3JvbGxfdmlldyIsImdldENoaWxkQnlOYW1lIiwic2Nyb2xsX3ZpZXdfbWFzayIsInNjcm9sbF92aWV3X2NvbiIsInNldENvbnRlbnRTaXplIiwic2V0QW5jaG9yUG9pbnQiLCJ4IiwieSIsInNldFBvc2l0aW9uIiwic2Nyb2xsX3ZpZXdfY29tcGVuZCIsImdldENvbXBvbmVudCIsIlNjcm9sbFZpZXciLCJjb250YWluZXIiLCJhZGRDaGlsZCIsInNldElubmVyQ29udGFpbmVyIiwicmVnaXN0ZXJFdmVudCIsInJlbG9hZERhdGEiLCJzZWxlY3RfaW5kZXgiLCJub2RlIiwib24iLCJjaGVja1JlY3RJbnRlcnNlY3RzUmVjdCIsImFkZFNjcm9sbFRvQm90dG9tQ2FsbEJhY2siLCJjYWxsYmFjayIsInNjcm9sbFRvQm90dG9tX2NhbGxiYWNrIiwicmVnaXN0ZXJTY3JpcHRIYW5kbGVyU2luZ2xlIiwiZnVuYyIsImhhbmRsZXJJZCIsIm51bWJlck9mQ2VsbHMiLCJTY3JvbGxWaWV3RnVuY1R5cGUiLCJOdW1iZXJPZkNlbGxzIiwidXBkYXRlQ2VsbEJ5SW5kZXgiLCJjZWxsIiwiaW5kZXgiLCJVcGRhdGVDZWxsQnlJbmRleCIsImNyZWF0ZU5ld0NlbGwiLCJDcmVhdGVOZXdDZWxsIiwib25DZWxsVG91Y2hlZCIsIk9uQ2VsbFRvdWNoZWQiLCJzZXRDbGlja0VuYWJsZWQiLCJzdGF0dXMiLCJzZXRTd2FsbG93VG91Y2hlcyIsImNoZWNrT3ZlclNob3dCeVZlcnRpY2FsIiwiY2hlY2tPdmVyU2hvd0J5SG9yaXpvbnRhbCIsInN1bSIsImxlbmd0aCIsImNvbnRhaW5lcl95IiwiYm90IiwiY29sX2NvdW50IiwiYWN0aXZlQ2VsbFN0YXJ0Um93IiwiaSIsImFjdGl2ZUNlbGxFbmRSb3ciLCJtYXhfY291bnQiLCJtIiwidXBkYXRlQ2VsbEF0SW5kZXgiLCJjaGVja092ZXJTaG93QnlWZXJ0aWNhbEJvdHRvbSIsInJvd19jb3VudCIsImNvbnRhaW5lcl94IiwidXBkYXRlTW92ZSIsImp1bXBUb01vdmUiLCJ0aW1lIiwiY2hlY2tQb3NpdGlvbiIsImdldEN1ckNvbnRhaW5lclBvc1kiLCJnZXRDdXJDb250YWluZXJQb3NYIiwiY29udGFpbmVyX3dpZHRoIiwiY29udGFpbmVyX2hlaWdodCIsIm51bSIsIm1heCIsImNvbnRhaW5lcl9zaXplIiwic3RvcEF1dG9TY3JvbGwiLCJzY3JvbGxUb1RvcCIsImJvdHRvbSIsInNjcm9sbFRvQm90dG9tIiwicmVzZXRDdXJyZW50SXRlbXMiLCJrZXkiLCJyZXNldEl0ZW1CeUluZGV4IiwiZ2V0QWN0aXZlQ2VsbExpc3QiLCJsaXN0IiwicHVzaCIsImdldENlbGxCeUluZGV4IiwiZ2V0Q2VsbFhZQnlJbmRleCIsIm51bWJlciIsImdldENhY2hlQ2VsbEJ5SW5kZXgiLCJ4eSIsImdldENlbGxQb3NpdGlvbiIsImNlbGxEYXRhIiwic3RhcnRUaW1lVGlja2V0IiwibWF4UmVmcmVzaE51bSIsInJlZnJlc2hOdW0iLCJzZWxlY3RDZWxsQnlJbmRleCIsIm1heF9jb250YXJpbmVyX3giLCJzaG93X2luZGV4IiwiZmxvb3IiLCJhYnMiLCJpbmRleF8xIiwidGltZV90aWNoZXQiLCJfY2FsbGJhY2siLCJjb3VudCIsImNsZWFyVGltZVRpY2tldCIsImdjb3JlIiwiVGltZXIiLCJzZXQiLCJkZWwiLCJhcF94IiwiYXBfeSIsIl94IiwiX3kiLCJjYWNoZUluZGV4IiwibmV3Q2VsbCIsInNldFBhcmVudCIsImdldE1heFNpemUiLCJnZXRDb250YWluZXIiLCJkZWxldGVNZSIsIkRlbGV0ZU1lIiwic2V0VmlzaWJsZSIsImJvb2wiLCJhY3RpdmUiLCJpdGVtIiwiZGVzdHJveSIsInJlbGVhc2VQcmVmYWIiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUEsSUFBSUEsc0JBQXNCLEdBQUdDLEVBQUUsQ0FBQ0MsS0FBSCxDQUFTO0FBQ2xDLGFBQVNDLFNBRHlCO0FBRWxDQyxFQUFBQSxJQUFJLEVBQUUsZ0JBQVk7QUFDZCxTQUFLQyxVQUFMO0FBQ0gsR0FKaUM7QUFNbENBLEVBQUFBLFVBQVUsRUFBRSxzQkFBWTtBQUNwQixTQUFLQyxNQUFMLEdBQWMsSUFBZDtBQUNBLFNBQUtDLFVBQUwsR0FBa0JDLFFBQVEsQ0FBQ0MsYUFBVCxDQUF1QixRQUF2QixFQUFpQyxvQkFBakMsQ0FBbEI7QUFDQSxTQUFL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QUEsUUFBUSxFQUFFLG9CQUFZO0FBQ2xCLFNBQUtmLGVBQUw7O0FBQ0EsU0FBSyxJQUFJeEIsR0FBVCxJQUFnQixLQUFLN0csU0FBckIsRUFBZ0M7QUFDNUIsVUFBSXdKLElBQUksR0FBRyxLQUFLeEosU0FBTCxDQUFlNkcsR0FBZixDQUFYOztBQUNBLFVBQUkyQyxJQUFJLElBQUlBLElBQUksQ0FBQ0wsUUFBakIsRUFBMkI7QUFDdkJLLFFBQUFBLElBQUksQ0FBQ0wsUUFBTDtBQUNIOztBQUNESyxNQUFBQSxJQUFJLEdBQUcsSUFBUDtBQUNIOztBQUNELFNBQUt6SixRQUFMLEdBQWdCLElBQWhCO0FBQ0EsU0FBS0MsU0FBTCxHQUFpQixJQUFqQjtBQUNBLFNBQUtDLGFBQUwsR0FBcUIsSUFBckI7QUFFQSxTQUFLa0MsUUFBTCxDQUFjc0gsT0FBZDtBQUNBLFNBQUt0SCxRQUFMLEdBQWdCLElBQWhCO0FBQ0F6QixJQUFBQSxhQUFhLENBQUNDLFdBQWQsR0FBNEIrSSxhQUE1QixDQUEwQyxLQUFLeEssVUFBL0M7QUFDSDtBQTlzQmlDLENBQVQsQ0FBN0IiLCJzb3VyY2VSb290IjoiLyIsInNvdXJjZXNDb250ZW50IjpbIi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBAYXV0aG9yOiBzaGlyYWhvQHN5Zy5jb20o5b+F5aGrLCDliJvlu7rmqKHlnZfnmoTkurrlkZgpXG4vLyBAZGVzY3JpcHRpb246XG4vLyAgICAgIOaWsOeJiOacrOaXoOmZkOW+queOr+WIl+ihqOWuueWZqCwgY2VsbGl0ZW0g6ZyA6KaB57un5om/YmFzZXBhbmVsXG4vLyA8YnIvPkNyZWF0ZTogbmV3IERhdGUoKS50b0lTT1N0cmluZygpXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG52YXIgQ29tbW9uU2Nyb2xsVmlld1NpbmdsZSA9IGNjLkNsYXNzKHtcbiAgICBleHRlbmRzOiBCYXNlQ2xhc3MsXG4gICAgY3RvcjogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmluaXRDb25maWcoKVxuICAgIH0sXG5cbiAgICBpbml0Q29uZmlnOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMucGFyZW50ID0gbnVsbDtcbiAgICAgICAgdGhpcy5wcmVmYWJQYXRoID0gUGF0aFRvb2wuZ2V0UHJlZmFiUGF0aChcImNvbW1vblwiLCBcImNvbW1vbl9zY3JvbGxfdmlld1wiKTtcbiAgICAgICAgdGhpcy5wb3MgPSBjYy52MigwLCAwKTtcbiAgICAgICAgdGhpcy5kaXIgPSBTY3JvbGxWaWV3RGlyLnZlcnRpY2FsO1xuICAgICAgICB0aGlzLnN0YXJ0X3BvcyA9IFNjcm9sbFZpZXdTdGFydFBvcy50b3A7XG4gICAgICAgIHRoaXMuc2l6ZSA9IGNjLnNpemUoMTAwLCAxMDApO1xuICAgICAgICB0aGlzLmFwID0gY2MudjIoMCwgMCk7XG5cbiAgICAgICAgLy/lrZjmlL7miYDmnInmoLzlrZDnu5PmnoTkvZNcbiAgICAgICAgdGhpcy5jZWxsTGlzdCA9IFtdO1xuICAgICAgICAvL+e8k+WtmENlbGzmiYDnlKjliLDnmoTlr7nosaFcbiAgICAgICAgdGhpcy5jYWNoZUxpc3QgPSB7fTtcbiAgICAgICAgLy/orrDlvZXmtLvot4PlvpfmoLzlrZBJRFxuICAgICAgICB0aGlzLmFjdGl2ZUNlbGxJZHggPSB7fTtcbiAgICAgICAgLy/lvZPliY3pgInmi6nnianlk4HnmoTntKLlvJVcbiAgICAgICAgdGhpcy5zZWxlY3RDZWxsSW5kZXggPSAxO1xuICAgICAgICAvL+Wbnuiwg+aWueazlVxuICAgICAgICB0aGlzLmhhbmRsZXIgPSB7fTtcbiAgICAgICAgLy/liLDml7bpl7TmmL7npLrnmoTntKLlvJVcbiAgICAgICAgdGhpcy50aW1lX3Nob3dfaW5kZXggPSAwO1xuICAgICAgICAvL+aYr+WQpuWIneWni+WMllxuICAgICAgICB0aGlzLmlzX2ZpcnN0X2luaXQgPSB0cnVlO1xuICAgICAgICAvL+acgOWkp+adoeebrlxuICAgICAgICB0aGlzLmNhY2hlTWF4U2l6ZSA9IDE7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIOWIm+W7ulxuICAgICAqIEBwYXJhbSB7Kn0gcGFyZW50IOaJgOWcqOeItuiKgueCuVxuICAgICAqIEBwYXJhbSB7Kn0gcG9zIOa7keWKqOe7hOS7tuS9jee9rlxuICAgICAqIEBwYXJhbSB7Kn0gZGlyIOa7keWKqOWvuem9kOaWueW8j1xuICAgICAqIEBwYXJhbSB7Kn0gc3RhcnRfcG9zIOa7keWKqOWIl+ihqOW8gOWni+S9jee9rlxuICAgICAqIEBwYXJhbSB7Kn0gc2l6ZSDmu5HliqjmoYblpKflsI9cbiAgICAgKiBAcGFyYW0geyp9IHNldHRpbmcg6K6+572u5L+h5oGvXG4gICAgICogQHBhcmFtIHsqfSBhcCDplJrngrlcbiAgICAgKi9cbiAgICBjcmVhdGVTY3JvbGw6IGZ1bmN0aW9uIChwYXJlbnQsIHBvcywgZGlyLCBzdGFydF9wb3MsIHNpemUsIHNldHRpbmcsIGFwKSB7XG4gICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuICAgICAgICB0aGlzLnBvcyA9IHBvcyB8fCBjYy52MigwLCAwKTtcbiAgICAgICAgdGhpcy5kaXIgPSBkaXIgfHwgU2Nyb2xsVmlld0Rpci52ZXJ0aWNhbDtcbiAgICAgICAgdGhpcy5zdGFydF9wb3MgPSBzdGFydF9wb3MgfHwgU2Nyb2xsVmlld1N0YXJ0UG9zLnRvcDtcbiAgICAgICAgdGhpcy5zaXplID0gc2l6ZSB8fCBjYy5zaXplKDEwMCwgMTAwKTtcbiAgICAgICAgdGhpcy5hcCA9IGFwIHx8IGNjLnYyKDAsIDApO1xuXG4gICAgICAgIHRoaXMuYW5hbHlzaXNTZXR0aW5nKHNldHRpbmcpO1xuXG4gICAgICAgIExvYWRlck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2FkUmVzKHRoaXMucHJlZmFiUGF0aCwgKGZ1bmN0aW9uIChyZXNfb2JqZWN0KSB7XG4gICAgICAgICAgICB2YXIgc2Nyb2xsID0gcmVzX29iamVjdDtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlUm9vdFduZChzY3JvbGwpO1xuICAgICAgICB9KS5iaW5kKHRoaXMpKVxuICAgIH0sXG5cbiAgICAvL+ino+aekOaVsOaNrlxuICAgIGFuYWx5c2lzU2V0dGluZzogZnVuY3Rpb24gKHNldHRpbmcpIHtcbiAgICAgICAgdGhpcy5zZXR0aW5nID0gc2V0dGluZyB8fCB7fTtcbiAgICAgICAgdGhpcy5zdGFydF94ID0gdGhpcy5zZXR0aW5nLnN0YXJ0X3ggfHwgMCAgICAgICAgICAgICAgICAgICAgICAgIC8v56ys5LiA5Liq5Y2V5YWD55qE6LW354K5WFxuICAgICAgICB0aGlzLnNwYWNlX3ggPSB0aGlzLnNldHRpbmcuc3BhY2VfeCB8fCAwICAgICAgICAgICAgICAgICAgICAgICAgLy8g5qiq5ZCR6Ze06ZqU56m66Ze0XG4gICAgICAgIHRoaXMuc3RhcnRfeSA9IHRoaXMuc2V0dGluZy5zdGFydF95IHx8IDAgICAgICAgICAgICAgICAgICAgICAgICAvLyDnrKzkuIDkuKrljZXlhYPnmoTotbfngrlZXG4gICAgICAgIHRoaXMuc3BhY2VfeSA9IHRoaXMuc2V0dGluZy5zcGFjZV95IHx8IDAgICAgICAgICAgICAgICAgICAgICAgICAvLyDnq5blkJHpl7TpmpTnqbrpl7RcbiAgICAgICAgdGhpcy5pdGVtX3dpZHRoID0gdGhpcy5zZXR0aW5nLml0ZW1fd2lkdGggfHwgMTE1ICAgICAgICAgICAgICAgIC8vIOWNleWFg+eahOWuveW6plxuICAgICAgICB0aGlzLml0ZW1faGVpZ2h0ID0gdGhpcy5zZXR0aW5nLml0ZW1faGVpZ2h0IHx8IDExNSAgICAgICAgICAgICAgLy8g5Y2V5YWD55qE6auY5bqmXG4gICAgICAgIHRoaXMucm93ID0gdGhpcy5zZXR0aW5nLnJvdyB8fCA1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDooYzmlbAs5L2c55So5LqO5rC05bmz5pa55ZCR55qE5rua5YqoXG4gICAgICAgIHRoaXMuY29sID0gdGhpcy5zZXR0aW5nLmNvbCB8fCA1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDliJfmlbAs5L2c55So5LqO5Z6C55u05pa55ZCR55qE5rua5YqoXG4gICAgICAgIHRoaXMuZGVsYXkgPSB0aGlzLnNldHRpbmcuZGVsYXkgfHwgNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDliJvlu7rlu7bov5/ml7bpl7RcbiAgICAgICAgdGhpcy5vbmNlX251bSA9IHRoaXMuc2V0dGluZy5vbmNlX251bSB8fCAxICAgICAgICAgICAgICAgICAgICAgIC8vIOavj+asoeWIm+W7uueahOaVsOmHj1xuICAgICAgICB0aGlzLm5lZWRfZHluYW1pYyA9IHRoaXMuc2V0dGluZy5uZWVkX2R5bmFtaWMgfHwgdHJ1ZSAgICAgICAgICAvLyDmmK/lkKbpnIDopoHliqjmgIHliJvlu7rnmoQgXG4gICAgICAgIC8v5qiq5ZCR55qE5Y+q5pSv5oyB5LiA6KGM55qELi5cbiAgICAgICAgaWYgKHRoaXMuZGlyID09IFNjcm9sbFZpZXdEaXIuaG9yaXpvbnRhbCkge1xuICAgICAgICAgICAgdGhpcy5yb3cgPSAxXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jYWxjdWxhdGlvbk1heFN1bSgpO1xuICAgIH0sXG5cbiAgICAvL+iuoeeul+S4gOS4i+S4gOWxj+acgOWkmuWIm+W7uueahOS4quaVsFxuICAgIGNhbGN1bGF0aW9uTWF4U3VtOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBtYXhfc3VtO1xuICAgICAgICBpZiAodGhpcy5kaXIgPT0gU2Nyb2xsVmlld0Rpci5ob3Jpem9udGFsKSB7XG4gICAgICAgICAgICBtYXhfc3VtID0gKE1hdGguY2VpbCh0aGlzLnNpemUud2lkdGggLyAodGhpcy5pdGVtX3dpZHRoICsgdGhpcy5zcGFjZV94KSkgKyAxKSAqIHRoaXMucm93O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbWF4X3N1bSA9IChNYXRoLmNlaWwodGhpcy5zaXplLmhlaWdodCAvICh0aGlzLml0ZW1faGVpZ2h0ICsgdGhpcy5zcGFjZV95KSkgKyAxKSAqIHRoaXMuY29sO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2FjaGVNYXhTaXplID0gbWF4X3N1bTtcbiAgICB9LFxuXG4gICAgLy8g5Yid5aeL5YyW5Yib5bu65a+56LGhXG4gICAgY3JlYXRlUm9vdFduZDogZnVuY3Rpb24gKHNjcm9sbCkge1xuICAgICAgICB0aGlzLnJvb3Rfd25kID0gc2Nyb2xsO1xuICAgICAgICB0aGlzLnNjcm9sbF92aWV3ID0gc2Nyb2xsLmdldENoaWxkQnlOYW1lKFwiU2Nyb2xsVmlld1wiKTtcbiAgICAgICAgdGhpcy5zY3JvbGxfdmlld19tYXNrID0gdGhpcy5zY3JvbGxfdmlldy5nZXRDaGlsZEJ5TmFtZShcInZpZXdcIik7XG4gICAgICAgIHRoaXMuc2Nyb2xsX3ZpZXdfY29uID0gdGhpcy5zY3JvbGxfdmlld19tYXNrLmdldENoaWxkQnlOYW1lKFwiY29udGVudFwiKTtcblxuICAgICAgICB0aGlzLnJvb3Rfd25kLnNldENvbnRlbnRTaXplKHRoaXMuc2l6ZSk7XG4gICAgICAgIHRoaXMucm9vdF93bmQuc2V0QW5jaG9yUG9pbnQodGhpcy5hcC54LCB0aGlzLmFwLnkpO1xuICAgICAgICB0aGlzLnJvb3Rfd25kLnNldFBvc2l0aW9uKHRoaXMucG9zKTtcblxuICAgICAgICB0aGlzLnNjcm9sbF92aWV3LnNldENvbnRlbnRTaXplKHRoaXMuc2l6ZSk7XG4gICAgICAgIHRoaXMuc2Nyb2xsX3ZpZXdfbWFzay5zZXRDb250ZW50U2l6ZSh0aGlzLnNpemUpO1xuICAgICAgICB0aGlzLnNjcm9sbF92aWV3X2Nvbi5zZXRDb250ZW50U2l6ZSh0aGlzLnNpemUpO1xuXG4gICAgICAgIC8vIOa7muWKqOe7hOW7ulxuICAgICAgICB0aGlzLnNjcm9sbF92aWV3X2NvbXBlbmQgPSB0aGlzLnNjcm9sbF92aWV3LmdldENvbXBvbmVudChjYy5TY3JvbGxWaWV3KVxuICAgICAgICBpZiAodGhpcy5kaXIgPT0gU2Nyb2xsVmlld0Rpci52ZXJ0aWNhbCkge1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxfdmlld19jb21wZW5kLnZlcnRpY2FsID0gdHJ1ZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxfdmlld19jb21wZW5kLmhvcml6b250YWwgPSB0cnVlXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbnRhaW5lciA9IHRoaXMuc2Nyb2xsX3ZpZXdfY29uO1xuXG4gICAgICAgIGlmICh0aGlzLnBhcmVudCkge1xuICAgICAgICAgICAgdGhpcy5wYXJlbnQuYWRkQ2hpbGQoc2Nyb2xsKTtcbiAgICAgICAgfVxuICAgICAgICAvLyDnm5HlkKzkuovku7ZcbiAgICAgICAgdGhpcy5zZXRJbm5lckNvbnRhaW5lcigpXG4gICAgICAgIHRoaXMucmVnaXN0ZXJFdmVudCgpO1xuXG4gICAgICAgIC8vIGlmICh0aGlzLnNlbGVjdF9pbmRleCAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnJlbG9hZERhdGEodGhpcy5zZWxlY3RfaW5kZXgsIHRoaXMuc2V0dGluZylcbiAgICAgICAgLy8gfVxuICAgIH0sXG5cbiAgICAvLyDmu5rliqjorr7nva5cbiAgICByZWdpc3RlckV2ZW50OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLm5lZWRfZHluYW1pYyA9PSB0cnVlKSB7XG4gICAgICAgICAgICB0aGlzLnNjcm9sbF92aWV3X2NvbXBlbmQubm9kZS5vbignc2Nyb2xsaW5nJywgdGhpcy5jaGVja1JlY3RJbnRlcnNlY3RzUmVjdCwgdGhpcyk7XG5cbiAgICAgICAgICAgIC8vIHRoaXMuc2Nyb2xsX3ZpZXdfY29tcGVuZC5ub2RlLm9uKCdib3VuY2UtYm90dG9tJywgdGhpcy5zY3JvbGxUb0JvdHRvbV9jYWxsYmFjaywgdGhpcyk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8g5rua5Yqo5Yiw5bqV6YOo55qE5pe25YCZ5Zue6LCDXG4gICAgYWRkU2Nyb2xsVG9Cb3R0b21DYWxsQmFjazogZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMuc2Nyb2xsVG9Cb3R0b21fY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICB9LFxuXG4gICAgLy8g5rOo5YaM5LqL5Lu2XG4gICAgcmVnaXN0ZXJTY3JpcHRIYW5kbGVyU2luZ2xlOiBmdW5jdGlvbiAoZnVuYywgaGFuZGxlcklkKSB7XG4gICAgICAgIHRoaXMuaGFuZGxlcltoYW5kbGVySWRdID0gZnVuYztcbiAgICB9LFxuXG4gICAgLy/ojrflj5ZjZWxs5pWw6YePXG4gICAgbnVtYmVyT2ZDZWxsczogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5oYW5kbGVyW1Njcm9sbFZpZXdGdW5jVHlwZS5OdW1iZXJPZkNlbGxzXSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlcltTY3JvbGxWaWV3RnVuY1R5cGUuTnVtYmVyT2ZDZWxsc10oKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyDliLfmlrDmr4/kuIDkuKpjZWxsXG4gICAgdXBkYXRlQ2VsbEJ5SW5kZXg6IGZ1bmN0aW9uIChjZWxsLCBpbmRleCkge1xuICAgICAgICBpZiAodGhpcy5oYW5kbGVyW1Njcm9sbFZpZXdGdW5jVHlwZS5VcGRhdGVDZWxsQnlJbmRleF0pIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlcltTY3JvbGxWaWV3RnVuY1R5cGUuVXBkYXRlQ2VsbEJ5SW5kZXhdKGNlbGwsIGluZGV4KTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyDliJvlu7rkuIDkuKrmmL7npLrlr7nosaFcbiAgICBjcmVhdGVOZXdDZWxsOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmhhbmRsZXJbU2Nyb2xsVmlld0Z1bmNUeXBlLkNyZWF0ZU5ld0NlbGxdKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVyW1Njcm9sbFZpZXdGdW5jVHlwZS5DcmVhdGVOZXdDZWxsXSh0aGlzLml0ZW1fd2lkdGgsIHRoaXMuaXRlbV9oZWlnaHQpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIOeCueWHu+WNleS4qlxuICAgIG9uQ2VsbFRvdWNoZWQ6IGZ1bmN0aW9uIChjZWxsLCBpbmRleCkge1xuICAgICAgICBpZiAodGhpcy5oYW5kbGVyW1Njcm9sbFZpZXdGdW5jVHlwZS5PbkNlbGxUb3VjaGVkXSkge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVyW1Njcm9sbFZpZXdGdW5jVHlwZS5PbkNlbGxUb3VjaGVkXShjZWxsLCBpbmRleCk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8g6K6+572u5piv5ZCm5Y+v54K55Ye7XG4gICAgc2V0Q2xpY2tFbmFibGVkOiBmdW5jdGlvbiAoc3RhdHVzKSB7XG5cbiAgICB9LFxuXG4gICAgLy8g6K6+572u5piv5ZCm5ZCe5Zms54K55Ye7XG4gICAgc2V0U3dhbGxvd1RvdWNoZXM6IGZ1bmN0aW9uIChzdGF0dXMpIHtcblxuICAgIH0sXG5cbiAgICAvLyDnp7vliqjov4fnqIvkuK3mmK/lkKbkuI3lho3lj6/mmK/ojIPlm7Qs5LiN5YaN55qE5pe25YCZ56e76ZmkLOaUvuWIsOWvueixoeaxoCzlh4blpIfkuIvkuIDmrKHliJvlu7pcbiAgICBjaGVja1JlY3RJbnRlcnNlY3RzUmVjdDogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5kaXIgPT0gU2Nyb2xsVmlld0Rpci52ZXJ0aWNhbCkge1xuICAgICAgICAgICAgdGhpcy5jaGVja092ZXJTaG93QnlWZXJ0aWNhbCgpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmNoZWNrT3ZlclNob3dCeUhvcml6b250YWwoKVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIOerluebtOaWueWQkeeahOebkea1i+WIpOaWrVxuICAgIGNoZWNrT3ZlclNob3dCeVZlcnRpY2FsOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmNlbGxMaXN0ID09IG51bGwpIHJldHVybjtcbiAgICAgICAgdmFyIHN1bSA9IHRoaXMuY2VsbExpc3QubGVuZ3RoO1xuXG4gICAgICAgIGlmIChzdW0gPT0gMCkgcmV0dXJuO1xuICAgICAgICB2YXIgY29udGFpbmVyX3kgPSB0aGlzLmNvbnRhaW5lci55O1xuICAgICAgICB2YXIgYm90ID0gLWNvbnRhaW5lcl95O1xuICAgICAgICB2YXIgdG9wID0gdGhpcy5zaXplLmhlaWdodCArIGJvdDtcbiAgICAgICAgdmFyIGNvbF9jb3VudCA9IE1hdGguY2VpbChzdW0gLyB0aGlzLmNvbCk7XG4gICAgICAgIC8vIOa0u+i3g2NlbGzlvIDlp4vooYzmlbBcbiAgICAgICAgdmFyIGFjdGl2ZUNlbGxTdGFydFJvdyA9IDA7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29sX2NvdW50OyBpKyspIHtcbiAgICAgICAgICAgIHZhciBpbmRleCA9IGkgKiB0aGlzLmNvbDtcbiAgICAgICAgICAgIHZhciBjZWxsID0gdGhpcy5jZWxsTGlzdFtpbmRleF07XG4gICAgICAgICAgICBhY3RpdmVDZWxsU3RhcnRSb3cgPSBpO1xuICAgICAgICAgICAgaWYgKGNlbGwgJiYgKGNlbGwueSAtIHRoaXMuaXRlbV9oZWlnaHQgKiAwLjUgPD0gdG9wKSkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIOa0u+i3g2NlbGznu5PmnZ/ooYzmlbBcbiAgICAgICAgdmFyIGFjdGl2ZUNlbGxFbmRSb3cgPSBjb2xfY291bnQ7XG4gICAgICAgIGlmIChib3QgPiAwKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gYWN0aXZlQ2VsbFN0YXJ0Um93OyBpIDwgY29sX2NvdW50OyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSBpICogdGhpcy5jb2w7XG4gICAgICAgICAgICAgICAgdmFyIGNlbGwgPSB0aGlzLmNlbGxMaXN0W2luZGV4XTtcbiAgICAgICAgICAgICAgICBpZiAoY2VsbCAmJiAoY2VsbC55ICsgdGhpcy5pdGVtX2hlaWdodCAqIDAuNSA8IGJvdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgYWN0aXZlQ2VsbEVuZFJvdyA9IGktMTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIOmHjeWkjeS9v+eUqFxuICAgICAgICB2YXIgbWF4X2NvdW50ID0gdGhpcy5udW1iZXJPZkNlbGxzKCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29sX2NvdW50OyBpKyspIHtcbiAgICAgICAgICAgIGlmIChpID49IGFjdGl2ZUNlbGxTdGFydFJvdyAmJiBpIDw9IGFjdGl2ZUNlbGxFbmRSb3cpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBtID0gMDsgbSA8IHRoaXMuY29sOyBtKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gaSAqIHRoaXMuY29sICsgbTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodGhpcy5hY3RpdmVDZWxsSWR4W2luZGV4XSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA8PSBtYXhfY291bnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUNlbGxBdEluZGV4KGluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZUNlbGxJZHhbaW5kZXhdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgbSA9IDA7IG0gPCB0aGlzLmNvbDsgbSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IGkgKiB0aGlzLmNvbCArIG07XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA8PSBtYXhfY291bnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlQ2VsbElkeFtpbmRleF0gPSBmYWxzZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIOerluebtOaWueWQkeeahOebkea1i+WIpOaWrVxuICAgIGNoZWNrT3ZlclNob3dCeVZlcnRpY2FsQm90dG9tOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmNlbGxMaXN0ID09IG51bGwpIHJldHVybjtcbiAgICAgICAgdmFyIHN1bSA9IHRoaXMuY2VsbExpc3QubGVuZ3RoO1xuXG4gICAgICAgIGlmIChzdW0gPT0gMCkgcmV0dXJuO1xuICAgICAgICB2YXIgY29udGFpbmVyX3kgPSB0aGlzLmNvbnRhaW5lci55O1xuICAgICAgICB2YXIgYm90ID0gLWNvbnRhaW5lcl95O1xuICAgICAgICB2YXIgdG9wID0gdGhpcy5zaXplLmhlaWdodCArIGJvdDtcbiAgICAgICAgdmFyIGNvbF9jb3VudCA9IE1hdGguY2VpbChzdW0gLyB0aGlzLmNvbCk7XG4gICAgICAgIC8vIOa0u+i3g2NlbGzlvIDlp4vooYzmlbBcbiAgICAgICAgdmFyIGFjdGl2ZUNlbGxTdGFydFJvdyA9IGNvbF9jb3VudDtcbiAgICAgICAgZm9yIChsZXQgaSA9IGNvbF9jb3VudC0xOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgdmFyIGluZGV4ID0gaSAqIHRoaXMuY29sO1xuICAgICAgICAgICAgdmFyIGNlbGwgPSB0aGlzLmNlbGxMaXN0W2luZGV4XTtcbiAgICAgICAgICAgIGFjdGl2ZUNlbGxTdGFydFJvdyA9IGk7XG4gICAgICAgICAgICBpZiAoY2VsbCAmJiAoY2VsbC55IC0gdGhpcy5pdGVtX2hlaWdodCAqIDAuNSA8PSB0b3ApKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8g5rS76LeDY2VsbOe7k+adn+ihjOaVsFxuICAgICAgICB2YXIgYWN0aXZlQ2VsbEVuZFJvdyA9IDA7XG4gICAgICAgIGlmIChib3QgPiAwKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gYWN0aXZlQ2VsbFN0YXJ0Um93LTE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gaSAqIHRoaXMuY29sO1xuICAgICAgICAgICAgICAgIHZhciBjZWxsID0gdGhpcy5jZWxsTGlzdFtpbmRleF07XG4gICAgICAgICAgICAgICAgaWYgKGNlbGwgJiYgKGNlbGwueSArIHRoaXMuaXRlbV9oZWlnaHQgKiAwLjUgPCBib3QpKSB7XG4gICAgICAgICAgICAgICAgICAgIGFjdGl2ZUNlbGxFbmRSb3cgPSBpKzE7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyDph43lpI3kvb/nlKhcbiAgICAgICAgdmFyIG1heF9jb3VudCA9IHRoaXMubnVtYmVyT2ZDZWxscygpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbF9jb3VudDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoaSA8PSBhY3RpdmVDZWxsU3RhcnRSb3cgJiYgaSA+PSBhY3RpdmVDZWxsRW5kUm93KSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgbSA9IDA7IG0gPCB0aGlzLmNvbDsgbSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IGkgKiB0aGlzLmNvbCArIG07XG4gICAgICAgICAgICAgICAgICAgIGlmICghKHRoaXMuYWN0aXZlQ2VsbElkeFtpbmRleF0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPD0gbWF4X2NvdW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVDZWxsQXRJbmRleChpbmRleCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVDZWxsSWR4W2luZGV4XSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IG0gPSAwOyBtIDwgdGhpcy5jb2w7IG0rKykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSBpICogdGhpcy5jb2wgKyBtO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPD0gbWF4X2NvdW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZUNlbGxJZHhbaW5kZXhdID0gZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgXG5cbiAgICAvLyDmsLTlubPmlrnlkJHnmoTnm5HmtYtcbiAgICBjaGVja092ZXJTaG93QnlIb3Jpem9udGFsOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmNlbGxMaXN0ID09IG51bGwpIHJldHVybjtcbiAgICAgICAgdmFyIHJvd19jb3VudCA9IHRoaXMuY2VsbExpc3QubGVuZ3RoO1xuICAgICAgICBpZiAocm93X2NvdW50ID09IDApIHJldHVybjtcbiAgICAgICAgdmFyIGNvbnRhaW5lcl94ID0gdGhpcy5jb250YWluZXIueDtcbiAgICAgICAgdmFyIHRvcCA9IC1jb250YWluZXJfeDtcbiAgICAgICAgdmFyIGJvdCA9IHRvcCArIHRoaXMuc2l6ZS53aWR0aDtcbiAgICAgICAgLy8g5rS76LeDY2VsbOW8gOWni+WIl+aVsFxuICAgICAgICB2YXIgYWN0aXZlQ2VsbFN0YXJ0Um93ID0gMDtcbiAgICAgICAgaWYgKHRvcCA+IDApIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm93X2NvdW50OyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgY2VsbCA9IHRoaXMuY2VsbExpc3RbaV07XG4gICAgICAgICAgICAgICAgYWN0aXZlQ2VsbFN0YXJ0Um93ID0gaTtcbiAgICAgICAgICAgICAgICBpZiAoY2VsbCAmJiAoY2VsbC54ICsgdGhpcy5pdGVtX3dpZHRoICogMC41KSA+PSB0b3ApIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIOa0u+i3g2NlbGznu5PmnZ/ooYzmlbBcbiAgICAgICAgdmFyIGFjdGl2ZUNlbGxFbmRSb3cgPSByb3dfY291bnQ7XG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gYWN0aXZlQ2VsbFN0YXJ0Um93OyBpbmRleCA8IHJvd19jb3VudDsgaW5kZXgrKykge1xuICAgICAgICAgICAgdmFyIGNlbGwgPSB0aGlzLmNlbGxMaXN0W2luZGV4XTtcbiAgICAgICAgICAgIGlmIChjZWxsICYmIChjZWxsLnggLSB0aGlzLml0ZW1fd2lkdGggKiAwLjUgPiBib3QpKSB7XG4gICAgICAgICAgICAgICAgYWN0aXZlQ2VsbEVuZFJvdyA9IGluZGV4O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIG1heF9jb3VudCA9IHRoaXMubnVtYmVyT2ZDZWxscygpO1xuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgcm93X2NvdW50OyBpbmRleCsrKSB7XG4gICAgICAgICAgICBpZiAoaW5kZXggPj0gYWN0aXZlQ2VsbFN0YXJ0Um93ICYmIGluZGV4IDw9IGFjdGl2ZUNlbGxFbmRSb3cpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuYWN0aXZlQ2VsbElkeFtpbmRleF0pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4IDw9IG1heF9jb3VudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVDZWxsQXRJbmRleChpbmRleCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZUNlbGxJZHhbaW5kZXhdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4IDw9IG1heF9jb3VudCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZUNlbGxJZHhbaW5kZXhdID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIOenu+WKqOWIsOWFt+S9k+S9jee9rizmmoLml7bkuI3nlKjkuoZcbiAgICB1cGRhdGVNb3ZlOiBmdW5jdGlvbiAocG9zKSB7XG4gICAgICAgIC8vIHZhciB0YXJnZXRfcG9zID0gdGhpcy5jaGVja1Bvc2l0aW9uKHBvcy54LCBwb3MueSk7XG4gICAgICAgIC8vIHZhciBtb3ZlX3RvID0gY2MubW92ZVRvKDAuMSwgdGFyZ2V0X3Bvcy54LCB0YXJnZXRfcG9zLnkpLmVhc2luZyhjYy5lYXNlQmFja091dCgpKTtcbiAgICAgICAgLy8gdGhpcy5jb250YWluZXIucnVuQWN0aW9uKG1vdmVfdG8pO1xuICAgIH0sXG5cbiAgICAvLyDot7PovazliLDmjIflrprkvY3nva4s5pqC5pe25LiN55So5LqGXG4gICAganVtcFRvTW92ZTogZnVuY3Rpb24gKHBvcywgdGltZSwgY2FsbGJhY2spIHtcblxuICAgIH0sXG5cbiAgICAvLyDnm5HmtYvkvY3nva4s5pqC5pe25Lmf5LiN55So5LqGXG4gICAgY2hlY2tQb3NpdGlvbjogZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyB2YXIgX3ggPSB0aGlzLmNvbnRhaW5lci54O1xuICAgICAgICAvLyB2YXIgX3kgPSB0aGlzLmNvbnRhaW5lci55O1xuICAgICAgICAvLyBpZiAodGhpcy5kaXIgPT0gU2Nyb2xsVmlld0Rpci5ob3Jpem9udGFsKSB7XG4gICAgICAgIC8vICAgICBfeCA9IF94ICsgeDtcbiAgICAgICAgLy8gfSBlbHNlIGlmICh0aGlzLmRpciA9PSBTY3JvbGxWaWV3RGlyLnZlcnRpY2FsKSB7XG4gICAgICAgIC8vICAgICBfeSA9IF95ICsgeTtcbiAgICAgICAgLy8gfVxuICAgICAgICAvLyBpZiAoX3ggPiAwKSB7XG4gICAgICAgIC8vICAgICBfeCA9IDA7XG4gICAgICAgIC8vIH0gZWxzZSBpZiAoX3ggPCB0aGlzLnNpemUud2lkdGggLSB0aGlzLmNvbnRhaW5lcl9zaXplLndpZHRoKSB7XG4gICAgICAgIC8vICAgICBfeCA9IHRoaXMuc2l6ZS53aWR0aCAtIHRoaXMuY29udGFpbmVyX3NpemUud2lkdGg7XG4gICAgICAgIC8vIH1cbiAgICAgICAgLy8gaWYgKF95ID4gMCkge1xuICAgICAgICAvLyAgICAgX3kgPSAwO1xuICAgICAgICAvLyB9IGVsc2UgaWYgKF95IDwgdGhpcy5zaXplLmhlaWdodCAtIHRoaXMuY29udGFpbmVyX3NpemUuaGVpZ2h0KSB7XG4gICAgICAgIC8vICAgICBfeSA9IHRoaXMuc2l6ZS5oZWlnaHQgLSB0aGlzLmNvbnRhaW5lcl9zaXplLmhlaWdodDtcbiAgICAgICAgLy8gfVxuICAgICAgICAvLyByZXR1cm4gY2MudjIoX3gsIF95KVxuICAgIH0sXG5cbiAgICAvLyDojrflj5blvZPliY3lrrnlmajnmoTlnZDmoIcs5pqC5pe25LiN55SoXG4gICAgZ2V0Q3VyQ29udGFpbmVyUG9zWTogZnVuY3Rpb24gKCkge1xuXG4gICAgfSxcblxuICAgIC8vIOW9k+WJjeWuueWZqOeahOWdkOaghyDkvY3nva5cbiAgICBnZXRDdXJDb250YWluZXJQb3NYOiBmdW5jdGlvbiAoKSB7XG5cbiAgICB9LFxuXG4gICAgLy/orr7nva7mu5rliqjlrrnlmajnmoTlpKflsI9cbiAgICBzZXRJbm5lckNvbnRhaW5lcjogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgc2l6ZSA9IHRoaXMubnVtYmVyT2ZDZWxscygpO1xuICAgICAgICB2YXIgY29udGFpbmVyX3dpZHRoID0gdGhpcy5zaXplLndpZHRoO1xuICAgICAgICB2YXIgY29udGFpbmVyX2hlaWdodCA9IHRoaXMuc2l6ZS5oZWlnaHQ7XG4gICAgICAgIHZhciBudW0gPSAwO1xuICAgICAgICBpZiAodGhpcy5kaXIgPT0gU2Nyb2xsVmlld0Rpci5ob3Jpem9udGFsKSB7XG4gICAgICAgICAgICBudW0gPSBNYXRoLmNlaWwoc2l6ZSAvIHRoaXMucm93KTtcbiAgICAgICAgICAgIGNvbnRhaW5lcl93aWR0aCA9IG51bSAqIHRoaXMuaXRlbV93aWR0aCArIDIgKiB0aGlzLnN0YXJ0X3ggKyAobnVtIC0gMSkgKiB0aGlzLnNwYWNlX3g7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBudW0gPSBNYXRoLmNlaWwoc2l6ZSAvIHRoaXMuY29sKTtcbiAgICAgICAgICAgIGNvbnRhaW5lcl9oZWlnaHQgPSBudW0gKiB0aGlzLml0ZW1faGVpZ2h0ICsgMiAqIHRoaXMuc3RhcnRfeSArIChudW0gLSAxKSAqIHRoaXMuc3BhY2VfeTtcbiAgICAgICAgfVxuICAgICAgICBjb250YWluZXJfd2lkdGggPSBNYXRoLm1heChjb250YWluZXJfd2lkdGgsIHRoaXMuc2l6ZS53aWR0aCk7XG4gICAgICAgIGNvbnRhaW5lcl9oZWlnaHQgPSBNYXRoLm1heChjb250YWluZXJfaGVpZ2h0LCB0aGlzLnNpemUuaGVpZ2h0KTtcbiAgICAgICAgdGhpcy5jb250YWluZXJfc2l6ZSA9IGNjLnNpemUoY29udGFpbmVyX3dpZHRoLCBjb250YWluZXJfaGVpZ2h0KTtcbiAgICAgICAgaWYgKHRoaXMuc2Nyb2xsX3ZpZXdfY29uKSB7XG4gICAgICAgICAgICB0aGlzLnNjcm9sbF92aWV3X2Nvbi5zZXRDb250ZW50U2l6ZSh0aGlzLmNvbnRhaW5lcl9zaXplKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuc2Nyb2xsX3ZpZXdfY29tcGVuZCkge1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxfdmlld19jb21wZW5kLnN0b3BBdXRvU2Nyb2xsKClcbiAgICAgICAgICAgIGlmICh0aGlzLnN0YXJ0X3BvcyA9PSBTY3JvbGxWaWV3U3RhcnRQb3MudG9wKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxfdmlld19jb21wZW5kLnNjcm9sbFRvVG9wKDApO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnN0YXJ0X3BvcyA9PSBTY3JvbGxWaWV3U3RhcnRQb3MuYm90dG9tKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxfdmlld19jb21wZW5kLnNjcm9sbFRvQm90dG9tKDApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIOWIt+aWsOW9k+WJjeaYvuekuml0ZW3mlbDmja4o5LiN5pS55Y+Y5Lu75L2V5L2N572u55qEKVxuICAgIHJlc2V0Q3VycmVudEl0ZW1zOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZvciAodmFyIGtleSBpbiB0aGlzLmFjdGl2ZUNlbGxJZHgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmFjdGl2ZUNlbGxJZHhba2V5XSA9PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVDZWxsQXRJbmRleChrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIOagueaNrmluZGV45Yi35paw5a+55bqU55qE57Si5byVLOWmguaenOWcqOWPr+inhuiMg+WbtOS7peWGhVxuICAgIHJlc2V0SXRlbUJ5SW5kZXg6IGZ1bmN0aW9uIChpbmRleCkge1xuICAgICAgICBpZiAodGhpcy5hY3RpdmVDZWxsSWR4W2luZGV4XSA9PSB0cnVlKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNlbGxBdEluZGV4KGluZGV4KTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyDojrflj5bmiYDmnInmtLvot4PnmoRjZWxs5a+56LGhXG4gICAgZ2V0QWN0aXZlQ2VsbExpc3Q6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGxpc3QgPSBbXTtcbiAgICAgICAgZm9yICh2YXIga2V5IGluIHRoaXMuYWN0aXZlQ2VsbElkeCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuYWN0aXZlQ2VsbElkeFtrZXldID09IHRydWUpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jZWxsTGlzdFtrZXldICYmIHRoaXMuY2VsbExpc3Rba2V5XS5jZWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGxpc3QucHVzaCh0aGlzLmNlbGxMaXN0W2tleV0uY2VsbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsaXN0O1xuICAgIH0sXG5cbiAgICAvLyDmoLnmja7kuIvooajojrflj5blr7nlupTnmoRjZWxsLOS4jeeuoeaYr+WQpua0u+i3g1xuICAgIGdldENlbGxCeUluZGV4OiBmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICAgICAgaWYgKHRoaXMuY2VsbExpc3RbaW5kZXhdICYmIHRoaXMuY2VsbExpc3RbaW5kZXhdLmNlbGwpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNlbGxMaXN0W2luZGV4XS5jZWxsO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIOagueaNruS4i+ihqOiOt+WPluWvueW6lOeahGNlbGznmoRYWeS9jee9rizlhYjpooTnlZlcbiAgICBnZXRDZWxsWFlCeUluZGV4OiBmdW5jdGlvbiAoaW5kZXgpIHtcblxuICAgIH0sXG5cbiAgICAvLyDorr7nva7mlbDmja5cbiAgICByZWxvYWREYXRhOiBmdW5jdGlvbiAoc2VsZWN0X2luZGV4LCBzZXR0aW5nKSB7XG4gICAgICAgIGlmICh0aGlzLnJvb3Rfd25kID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0X2luZGV4ID0gc2VsZWN0X2luZGV4O1xuICAgICAgICAgICAgdGhpcy5zZXR0aW5nID0gc2V0dGluZ1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNldHRpbmcpIHtcbiAgICAgICAgICAgIHRoaXMuYW5hbHlzaXNTZXR0aW5nKHNldHRpbmcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2VsbExpc3QgPSBbXTtcbiAgICAgICAgdGhpcy5hY3RpdmVDZWxsSWR4ID0ge307XG4gICAgICAgIGZvciAodmFyIGtleSBpbiB0aGlzLmNhY2hlTGlzdCkge1xuICAgICAgICAgICAgY29uc3QgY2VsbCA9IHRoaXMuY2FjaGVMaXN0W2tleV07XG4gICAgICAgICAgICBjZWxsLnNldFBvc2l0aW9uKC0xMDAwMCwwKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldElubmVyQ29udGFpbmVyKCk7XG4gICAgICAgIHZhciBudW1iZXIgPSB0aGlzLm51bWJlck9mQ2VsbHMoKTtcbiAgICAgICAgaWYgKG51bWJlciA9PSAwKSByZXR1cm47XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykge1xuICAgICAgICAgICAgdmFyIGNlbGwgPSBudWxsO1xuICAgICAgICAgICAgaWYgKGkgPD0gdGhpcy50aW1lX3Nob3dfaW5kZXgpIHtcbiAgICAgICAgICAgICAgICBjZWxsID0gdGhpcy5nZXRDYWNoZUNlbGxCeUluZGV4KGkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHJvd19jb3VudCA9IHRoaXMuY2VsbExpc3QubGVuZ3RoO1xuICAgICAgICAgICAgdmFyIHh5ID0gdGhpcy5nZXRDZWxsUG9zaXRpb24ocm93X2NvdW50KS8vcm93X2NvbnQgKyAxXG4gICAgICAgICAgICB2YXIgY2VsbERhdGEgPSB7IGNlbGw6IGNlbGwsIHg6IHh5LngsIHk6IHh5LnkgfTtcbiAgICAgICAgICAgIHRoaXMuY2VsbExpc3QucHVzaChjZWxsRGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaXNfZmlyc3RfaW5pdCkge1xuICAgICAgICAgICAgdGhpcy5zdGFydFRpbWVUaWNrZXQoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8v5aaC5p6c5pe26Ze05pi+56S657Si5byV5bCP5LqO5oC75pWwIOW6lOivpeaYvuekuue7p+e7reW9k+WJjeWumuaXtuWZqCDorqnkuIvpnaLnmoTog73mmL7npLrlh7rmnaVcbiAgICAgICAgICAgIGlmICh0aGlzLnRpbWVfc2hvd19pbmRleCA8PSBudW1iZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0VGltZVRpY2tldCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzZWxlY3RfaW5kZXggPT0gbnVsbCkge1xuICAgICAgICAgICAgdmFyIG1heFJlZnJlc2hOdW0gPSAwXG4gICAgICAgICAgICBpZiAodGhpcy5kaXIgPT0gU2Nyb2xsVmlld0Rpci5ob3Jpem9udGFsKSB7XG4gICAgICAgICAgICAgICAgbWF4UmVmcmVzaE51bSA9IHRoaXMuY2FjaGVNYXhTaXplIC0gdGhpcy5yb3c7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG1heFJlZnJlc2hOdW0gPSB0aGlzLmNhY2hlTWF4U2l6ZSAtIHRoaXMuY29sO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHJlZnJlc2hOdW0gPSAobnVtYmVyIDwgbWF4UmVmcmVzaE51bSkgPyBudW1iZXIgOiBtYXhSZWZyZXNoTnVtO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZWZyZXNoTnVtOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoaSA8IHRoaXMudGltZV9zaG93X2luZGV4KSB7IC8vaTw9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlQ2VsbEF0SW5kZXgoaSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVDZWxsSWR4W2ldID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0Q2VsbEJ5SW5kZXgoc2VsZWN0X2luZGV4KTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyDpgInkuK1pbmRleOe0ouW8leWvueixoSjlpoLmnpzliJfooajlhYHorrgg5Lya5o6S5bqP5Zyo5byA5aeL56ys5LiA5L2NKVxuICAgIHNlbGVjdENlbGxCeUluZGV4OiBmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICAgICAgdmFyIG1heFJlZnJlc2hOdW0gPSAwO1xuICAgICAgICBpZiAodGhpcy5kaXIgPT0gU2Nyb2xsVmlld0Rpci5ob3Jpem9udGFsKSB7XG4gICAgICAgICAgICBtYXhSZWZyZXNoTnVtID0gdGhpcy5jYWNoZU1heFNpemUgLSB0aGlzLnJvdztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG1heFJlZnJlc2hOdW0gPSB0aGlzLmNhY2hlTWF4U2l6ZSAtIHRoaXMuY29sO1xuICAgICAgICB9XG4gICAgICAgIHZhciBudW1iZXIgPSB0aGlzLm51bWJlck9mQ2VsbHMoKTtcbiAgICAgICAgaWYgKG51bWJlciA8IG1heFJlZnJlc2hOdW0pIHtcbiAgICAgICAgICAgIC8vIOS4jeWkn+eOsOWunuS4gOWxj+W5lVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChpIDwgdGhpcy50aW1lX3Nob3dfaW5kZXgpIHsgLy9pPD1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVDZWxsQXRJbmRleChpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVDZWxsSWR4W2ldID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRpciA9PSBTY3JvbGxWaWV3RGlyLmhvcml6b250YWwpIHtcbiAgICAgICAgICAgICAgICB2YXIgY29udGFpbmVyX3ggPSAwO1xuICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcl94ID0gMFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcl94ID0gLSh0aGlzLmNlbGxMaXN0W2luZGV4XS54IC0gKHRoaXMuaXRlbV93aWR0aCArIHRoaXMuc3BhY2VfeCkgKiAwLjUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyDlrrnlmahY5pa55ZCR5pyA5aSn5L2N572uXG4gICAgICAgICAgICAgICAgdmFyIG1heF9jb250YXJpbmVyX3ggPSAtKHRoaXMuY29udGFpbmVyX3NpemUud2lkdGggLSB0aGlzLnNpemUud2lkdGgpO1xuICAgICAgICAgICAgICAgIGlmIChjb250YWluZXJfeCA8IG1heF9jb250YXJpbmVyX3gpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyX3ggPSBtYXhfY29udGFyaW5lcl94O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgc2hvd19pbmRleCA9IE1hdGguZmxvb3IoTWF0aC5hYnMoY29udGFpbmVyX3gpIC8gdGhpcy5pdGVtX3dpZHRoKSAvLysxXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMudGltZV9zaG93X2luZGV4IDwgc2hvd19pbmRleCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRpbWVfc2hvd19pbmRleCA9IHNob3dfaW5kZXg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLnggPSBjb250YWluZXJfeDtcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrT3ZlclNob3dCeUhvcml6b250YWwoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIGNvbnRhaW5lcl95ID0gMFxuICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcl95ID0gdGhpcy5zdGFydF95ICsgdGhpcy5jZWxsTGlzdFtpbmRleF0ueSArIHRoaXMuaXRlbV9oZWlnaHQgKiAwLjUgLSB0aGlzLnNpemUuaGVpZ2h0O1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcl95ID0gdGhpcy5jZWxsTGlzdFtpbmRleF0ueSArICh0aGlzLml0ZW1faGVpZ2h0ICsgdGhpcy5zcGFjZV95KSAqIDAuNSAtIHRoaXMuc2l6ZS5oZWlnaHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjb250YWluZXJfeSA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyX3kgPSAwXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBpbmRleF8xID0gTWF0aC5mbG9vcigodGhpcy5jb250YWluZXJfc2l6ZS5oZWlnaHQgLSAoY29udGFpbmVyX3kgKyB0aGlzLnNpemUuaGVpZ2h0KSkgLyB0aGlzLml0ZW1faGVpZ2h0KSArIDE7XG4gICAgICAgICAgICAgICAgdmFyIHNob3dfaW5kZXggPSAoaW5kZXhfMSAtIDEpICogdGhpcy5jb2w7Ly8rMVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnRpbWVfc2hvd19pbmRleCA8IHNob3dfaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lX3Nob3dfaW5kZXggPSBzaG93X2luZGV4O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRhaW5lci55ID0gLWNvbnRhaW5lcl95O1xuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tPdmVyU2hvd0J5VmVydGljYWwoKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpbmRleCA+PSAwICYmIGluZGV4IDwgdGhpcy5udW1iZXJPZkNlbGxzKCkpIHsgLy9pbmRleD4wIGFuZCBpbmRleCA8PVxuICAgICAgICAgICAgdmFyIGNlbGwgPSB0aGlzLmdldENhY2hlQ2VsbEJ5SW5kZXgoaW5kZXgpO1xuICAgICAgICAgICAgY2VsbC5pbmRleCA9IGluZGV4O1xuICAgICAgICAgICAgdGhpcy5jZWxsTGlzdFtpbmRleF0uY2VsbCA9IGNlbGw7XG4gICAgICAgICAgICB0aGlzLm9uQ2VsbFRvdWNoZWQoY2VsbCwgaW5kZXgpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIOWumuaXtuWZqOWIm+W7ulxuICAgIHN0YXJ0VGltZVRpY2tldDogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy50aW1lX3RpY2hldCA9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jZWxsTGlzdC5sZW5ndGggPT0gMCkgcmV0dXJuO1xuXG4gICAgICAgICAgICAvLyDliLDml7bpl7TnjrDlrp7ntKLlvJVcbiAgICAgICAgICAgIHZhciBvbmNlX251bSA9IHRoaXMub25jZV9udW0gfHwgMTtcbiAgICAgICAgICAgIHZhciBfY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY29udGFpbmVyID09IG51bGwpIHJldHVybjtcbiAgICAgICAgICAgICAgICB2YXIgY291bnQgPSB0aGlzLnRpbWVfc2hvd19pbmRleCArIG9uY2VfbnVtO1xuICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IHRoaXMudGltZV9zaG93X2luZGV4O1xuICAgICAgICAgICAgICAgIC8vIGlmKGluZGV4ID09IDApe1xuICAgICAgICAgICAgICAgIC8vICAgICBpbmRleCA9IDE7XG4gICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgICAgIHZhciBzaXplID0gdGhpcy5jZWxsTGlzdC5sZW5ndGg7XG4gICAgICAgICAgICAgICAgdGhpcy50aW1lX3Nob3dfaW5kZXggPSB0aGlzLnRpbWVfc2hvd19pbmRleCArIG9uY2VfbnVtO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSBpbmRleDsgaSA8IGNvdW50OyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiBzaXplKSBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNlbGxEYXRhID0gdGhpcy5jZWxsTGlzdFtpXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNlbGxEYXRhICYmIGNlbGxEYXRhLmNlbGwgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2VsbERhdGEuY2VsbCA9IHRoaXMuZ2V0Q2FjaGVDZWxsQnlJbmRleChpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5hY3RpdmVDZWxsSWR4W2ldKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUNlbGxBdEluZGV4KGkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnRpbWVfc2hvd19pbmRleCA+PSBzaXplKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJUaW1lVGlja2V0KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNfZmlyc3RfaW5pdCA9IGZhbHNlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfS5iaW5kKHRoaXMpO1xuXG4gICAgICAgICAgICB0aGlzLnRpbWVfdGljaGV0ID0gZ2NvcmUuVGltZXIuc2V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBfY2FsbGJhY2soKVxuICAgICAgICAgICAgfS5iaW5kKHRoaXMpLCB0aGlzLmRlbGF5IC8gNjAsIC0xKVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIOa4hemZpOaOieWumuaXtuWZqFxuICAgIGNsZWFyVGltZVRpY2tldDogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy50aW1lX3RpY2hldCkge1xuICAgICAgICAgICAgZ2NvcmUuVGltZXIuZGVsKHRoaXMudGltZV90aWNoZXQpO1xuICAgICAgICAgICAgdGhpcy50aW1lX3RpY2hldCA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8g6I635Y+WaW5kZXjnmoTlr7nlupTkvY3nva5cbiAgICBnZXRDZWxsUG9zaXRpb246IGZ1bmN0aW9uIChpbmRleCkge1xuICAgICAgICB2YXIgYXBfeCA9IDAuNTtcbiAgICAgICAgdmFyIGFwX3kgPSAwLjU7XG4gICAgICAgIHZhciBfeCA9IDA7XG4gICAgICAgIHZhciBfeSA9IDA7XG4gICAgICAgIGlmICh0aGlzLmRpciA9PSBTY3JvbGxWaWV3RGlyLmhvcml6b250YWwpIHtcbiAgICAgICAgICAgIF94ID0gdGhpcy5zdGFydF94ICsgdGhpcy5pdGVtX3dpZHRoICogYXBfeCArICh0aGlzLml0ZW1fd2lkdGggKyB0aGlzLnNwYWNlX3gpICogKE1hdGguZmxvb3IoaW5kZXggLyB0aGlzLnJvdykpO1xuICAgICAgICAgICAgX3kgPSB0aGlzLmNvbnRhaW5lcl9zaXplLmhlaWdodCAtICh0aGlzLnN0YXJ0X3kgKyB0aGlzLml0ZW1faGVpZ2h0ICogYXBfeSArIChpbmRleCAlIHRoaXMucm93KSAqICh0aGlzLml0ZW1faGVpZ2h0ICsgdGhpcy5zcGFjZV95KSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zdGFydF9wb3MgPT0gU2Nyb2xsVmlld1N0YXJ0UG9zLnRvcCkge1xuICAgICAgICAgICAgICAgIF94ID0gdGhpcy5zdGFydF94ICsgdGhpcy5pdGVtX3dpZHRoICogYXBfeCArICh0aGlzLml0ZW1fd2lkdGggKyB0aGlzLnNwYWNlX3gpICogKGluZGV4ICUgdGhpcy5jb2wpO1xuICAgICAgICAgICAgICAgIF95ID0gdGhpcy5jb250YWluZXJfc2l6ZS5oZWlnaHQgLSAodGhpcy5zdGFydF95ICsgdGhpcy5pdGVtX2hlaWdodCAqIGFwX3kgKyAoTWF0aC5mbG9vcihpbmRleCAvIHRoaXMuY29sKSkgKiAodGhpcy5pdGVtX2hlaWdodCArIHRoaXMuc3BhY2VfeSkpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIF94ID0gdGhpcy5zdGFydF94ICsgdGhpcy5pdGVtX3dpZHRoICogYXBfeCArICh0aGlzLml0ZW1fd2lkdGggKyB0aGlzLnNwYWNlX3gpICogKGluZGV4ICUgdGhpcy5jb2wpO1xuICAgICAgICAgICAgICAgIF95ID0gdGhpcy5zdGFydF95ICsgdGhpcy5pdGVtX2hlaWdodCAqIGFwX3kgKyBNYXRoLmZsb29yKGluZGV4IC8gdGhpcy5jb2wpICogKHRoaXMuaXRlbV9oZWlnaHQgKyB0aGlzLnNwYWNlX3kpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgeDogX3gsIHk6IF95IH07XG4gICAgfSxcblxuICAgIC8vIOiOt+WPluagvOWtkOS4i+ihqOWvueW6lOeahOe8k+WtmGl0ZW1jZWxsXG4gICAgZ2V0Q2FjaGVDZWxsQnlJbmRleDogZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICAgIHZhciBjYWNoZUluZGV4ID0gKGluZGV4ICUgdGhpcy5jYWNoZU1heFNpemUpO1xuICAgICAgICBpZiAodGhpcy5jYWNoZUxpc3RbY2FjaGVJbmRleF0gPT0gbnVsbCkge1xuICAgICAgICAgICAgdmFyIG5ld0NlbGwgPSB0aGlzLmNyZWF0ZU5ld0NlbGwoKTtcbiAgICAgICAgICAgIGlmIChuZXdDZWxsKSB7XG4gICAgICAgICAgICAgICAgLy8gbmV3Q2VsbC5zZXRBbmNob3JQb2ludCgwLjUsIDAuNTspXG4gICAgICAgICAgICAgICAgbmV3Q2VsbC5zZXRQb3NpdGlvbigtMTAwMDAsMCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jYWNoZUxpc3RbY2FjaGVJbmRleF0gPSBuZXdDZWxsO1xuICAgICAgICAgICAgICAgIG5ld0NlbGwuc2V0UGFyZW50KHRoaXMuY29udGFpbmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuZXdDZWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGVMaXN0W2NhY2hlSW5kZXhdO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIOabtOaWsOagvOWtkCzlubbmoIforrDmtLvot4NcbiAgICB1cGRhdGVDZWxsQXRJbmRleDogZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICAgIGlmIChpbmRleCA+IHRoaXMudGltZV9zaG93X2luZGV4KSByZXR1cm47XG4gICAgICAgIGlmICh0aGlzLmNlbGxMaXN0W2luZGV4XSA9PSBudWxsKSByZXR1cm47XG4gICAgICAgIHZhciBjZWxsRGF0YSA9IHRoaXMuY2VsbExpc3RbaW5kZXhdO1xuICAgICAgICBpZiAoY2VsbERhdGEuY2VsbCA9PSBudWxsKSB7XG4gICAgICAgICAgICBjZWxsRGF0YS5jZWxsID0gdGhpcy5nZXRDYWNoZUNlbGxCeUluZGV4KGluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICBjZWxsRGF0YS5jZWxsLnNldFBvc2l0aW9uKGNlbGxEYXRhLngsIGNlbGxEYXRhLnkpO1xuICAgICAgICB0aGlzLnVwZGF0ZUNlbGxCeUluZGV4KGNlbGxEYXRhLmNlbGwsIGluZGV4KTtcbiAgICB9LFxuXG4gICAgLy8gXG4gICAgZ2V0TWF4U2l6ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250YWluZXJfc2l6ZTtcbiAgICB9LFxuXG4gICAgZ2V0Q29udGFpbmVyOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcbiAgICB9LFxuXG4gICAgZGVsZXRlTWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5EZWxldGVNZSgpO1xuICAgIH0sXG4gICAgc2V0VmlzaWJsZTpmdW5jdGlvbihib29sKXtcbiAgICAgICAgaWYodGhpcy5yb290X3duZCAmJiBib29sICE9IG51bGwpe1xuICAgICAgICAgICAgdGhpcy5yb290X3duZC5hY3RpdmUgPSBib29sO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBEZWxldGVNZTogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmNsZWFyVGltZVRpY2tldCgpO1xuICAgICAgICBmb3IgKHZhciBrZXkgaW4gdGhpcy5jYWNoZUxpc3QpIHtcbiAgICAgICAgICAgIHZhciBpdGVtID0gdGhpcy5jYWNoZUxpc3Rba2V5XTtcbiAgICAgICAgICAgIGlmIChpdGVtICYmIGl0ZW0uZGVsZXRlTWUpIHtcbiAgICAgICAgICAgICAgICBpdGVtLmRlbGV0ZU1lKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGl0ZW0gPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2VsbExpc3QgPSBudWxsO1xuICAgICAgICB0aGlzLmNhY2hlTGlzdCA9IG51bGw7XG4gICAgICAgIHRoaXMuYWN0aXZlQ2VsbElkeCA9IG51bGw7XG5cbiAgICAgICAgdGhpcy5yb290X3duZC5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMucm9vdF93bmQgPSBudWxsO1xuICAgICAgICBMb2FkZXJNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVsZWFzZVByZWZhYih0aGlzLnByZWZhYlBhdGgpO1xuICAgIH0sXG59KSJdfQ==