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
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
 
                (function() {
                    var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
                    var __module = nodeEnv ? module : {exports:{}};
                    var __filename = 'preview-scripts/assets/Scripts/common/common_scrollview.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, '33e04WhYdJMibSyfyrdHE6F', 'common_scrollview');
// Scripts/common/common_scrollview.js
 
"use strict";
 
// --------------------------------------------------------------------
// @author: shiraho@syg.com(必填, 创建模块的人员)
// @description:
//      无线滚动容器,子对象必须是锚点0.5,0.5, 而且一定要继承 basepanel
// <br/>Create: new Date().toISOString()
// --------------------------------------------------------------------
var LoaderManager = require("loadermanager");
 
var PathTool = require("pathtool");
 
var CommonScrollView = 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.cache_item_list = []; // 当前显示的对象
 
    this.cache_item_pool = []; // 缓存中是剩余的对象
 
    this.item_click_callback = null;
    this.extend = null; //扩展参数
 
    this.cur_item_class = null; //当前显示的对象
 
    this.is_radian = false;
    this.is_scrolling = false;
    this.cur_min_index = 0;
    this.bounceEnabled = true; //是否回弹
 
    this.clickEnabled = true; //是否可点击
  },
 
  /**
   * 创建
   * @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) {
      if (this.parent == null || this.parent && this.parent.isValid) {
        this.root_wnd = res_object;
        this.createRootWnd(this.root_wnd);
      }
    }.bind(this));
  },
  // 初始化创建对象
  createRootWnd: function createRootWnd(scroll) {
    if (this.root_wnd == null) return;
    this.root_wnd = scroll;
    this.scroll_view = scroll.getChildByName("ScrollView");
    this.scroll_view_mask = this.scroll_view.getChildByName("view");
    this.container = this.scroll_view_mask.getChildByName("content");
    this.mask = this.scroll_view.getChildByName("mask");
    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.container.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;
    }
 
    if (this.scroll_state != null) {
      this.setScrollState(this.scroll_state);
    }
 
    if (this.parent) {
      this.parent.addChild(scroll);
    }
 
    this.setBounceEnabled(this.bounceEnabled);
    this.setClickEnabled(this.clickEnabled); // 监听事件
 
    this.setInnerContainer();
    this.registerEvent();
  },
  registerEvent: function registerEvent() {
    if (this.need_dynamic == true) {
      if (this.dir == ScrollViewDir.vertical) {
        this.scroll_view_compend.node.on('scrolling', this.checkRectIntersectsRect, this);
      }
    }
  },
  //移动的过程中盘点是否不再可视范围,不再的时候移除掉,放到对象池,并且准备下一次创建
  checkRectIntersectsRect: function checkRectIntersectsRect(event) {
    if (this.need_dynamic == false) {
      return;
    }
 
    if (this.dir == ScrollViewDir.vertical) {
      this.checkOverShowByVertical();
    }
  },
  //竖直方向的监测判断
  checkOverShowByVertical: function checkOverShowByVertical() {
    if (this.cur_item_class == null) {
      return;
    }
 
    if (this.data_list == null || Utils.next(this.data_list) == null) {
      return;
    }
 
    var item_list = this.cache_item_list;
    var pool_list = this.cache_item_pool;
 
    if (item_list == null) {
      return;
    }
 
    var container_y = this.container.y;
 
    if (this.last_pos_y == null) {
      this.last_pos_y = container_y;
    }
 
    var item = null;
    var container_y_abs = Math.abs(container_y); //先移除不在可视的
 
    for (var index = item_list.length - 1; index >= 0; index--) {
      var _item = item_list[index];
 
      if (_item.y == null) {
        Log.error(_item);
      }
 
      var item_y = _item.y;
      var need_clear = false;
 
      if (container_y > 0) {
        if (item_y > this.size.height - container_y + this.item_height) {
          need_clear = true;
        }
      } else {
        if (item_y < container_y_abs - this.item_height) {
          need_clear = true;
        } else if (item_y > container_y_abs + this.size.height + this.item_height) {
          need_clear = true;
        }
      }
 
      if (need_clear == true) {
        if (_item && _item.suspendAllActions != null) {
          _item.suspendAllActions();
 
          _item.cur_visible = false;
 
          _item.setVisible(false, this.dir);
        }
 
        pool_list.push(_item);
        item_list.splice(index, 1);
      }
    }
 
    this.supplementItemList(item_list, this.last_pos_y, container_y);
    this.last_pos_y = container_y;
  },
  //补充需要创建的
  supplementItemList: function supplementItemList(item_list, last_y, cur_y) {
    if (item_list == null || item_list.length == 0) {
      return;
    }
 
    var cur_table_num = item_list.length;
 
    if (cur_table_num < this.max_sum) {
      var min_index = item_list[0].tmp_index;
      var max_index = item_list[0].tmp_index;
 
      for (var index = 0; index < item_list.length; index++) {
        var item = item_list[index];
 
        if (min_index >= item.tmp_index) {
          min_index = Number(item.tmp_index);
        }
 
        if (max_index <= item.tmp_index) {
          max_index = Number(item.tmp_index);
        }
      }
 
      if (cur_y > last_y) {
        //向上,那么就创建到下面
        for (var _index = 0; _index < this.max_sum - cur_table_num; _index++) {
          this.createList(this.data_list[max_index + _index + 1]);
        }
      } else {
        for (var _index2 = 0; _index2 < this.max_sum - cur_table_num; _index2++) {
          if (min_index - _index2 > 0) {
            this.createList(this.data_list[min_index - _index2 - 1]);
          }
        }
      }
    }
  },
  setSwallowTouches: function setSwallowTouches(status) {
    this.scroll_view.setSwallowTouches(status);
  },
  setBounceEnabled: function setBounceEnabled(status) {
    this.bounceEnabled = status;
    if (!this.scroll_view_compend) return;
    this.scroll_view_compend.elastic = status;
  },
  // 设置 scrollview 是否可点
  setClickEnabled: function setClickEnabled(status) {
    this.clickEnabled = status;
    if (!this.scroll_view_compend) return;
 
    if (status) {
      this.scroll_view_compend.node.on(cc.Node.EventType.TOUCH_START, this.scroll_view_compend._onTouchBegan, this.scroll_view_compend, true);
      this.scroll_view_compend.node.on(cc.Node.EventType.TOUCH_MOVE, this.scroll_view_compend._onTouchMoved, this.scroll_view_compend, true);
      this.scroll_view_compend.node.on(cc.Node.EventType.TOUCH_END, this.scroll_view_compend._onTouchEnded, this.scroll_view_compend, true);
      this.scroll_view_compend.node.on(cc.Node.EventType.TOUCH_CANCEL, this.scroll_view_compend._onTouchCancelled, this.scroll_view_compend, true);
    } else {
      this.scroll_view_compend.node.off(cc.Node.EventType.TOUCH_START, this.scroll_view_compend._onTouchBegan, this.scroll_view_compend, true);
      this.scroll_view_compend.node.off(cc.Node.EventType.TOUCH_MOVE, this.scroll_view_compend._onTouchMoved, this.scroll_view_compend, true);
      this.scroll_view_compend.node.off(cc.Node.EventType.TOUCH_END, this.scroll_view_compend._onTouchEnded, this.scroll_view_compend, true);
      this.scroll_view_compend.node.off(cc.Node.EventType.TOUCH_CANCEL, this.scroll_view_compend._onTouchCancelled, this.scroll_view_compend, true);
    }
  },
  //滚动容器移动到指定位置
  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) {
    var target_pos = this.checkPosition(pos.x, pos.y);
    time = time == null ? 1 : time;
    var move_to = cc.moveTo(time, cc.v2(target_pos.x, target_pos.y));
    this.container.runAction(cc.sequence(move_to, cc.callFunc(function () {
      if (callback) {
        callback();
      }
    }))); //该方法在滚动的时候并不能触发scroll自己的监听,来更新数据,注释掉
  },
  jumpToMove_2: function jumpToMove_2(pos, time, callback) {
    var target_pos = this.checkPosition(pos.x, pos.y);
    time = time == null ? 1 : time;
    var move_to = cc.moveTo(time, cc.v2(target_pos.x, target_pos.y));
    this.container.runAction(cc.sequence(move_to, cc.callFunc(function () {
      if (callback) {
        callback();
      }
    }))); //该方法在滚动的时候并不能触发scroll自己的监听,来更新数据,注释掉
    // var size = this.container.getContentSize();
    // this.scroll_view_compend.scrollTo(cc.v2(target_pos.x / size.width, target_pos.y / size.height), time);
    // this.container.runAction(cc.sequence(cc.delayTime(0),cc.callFunc(function () {
    //     if (callback) {
    //         callback();
    //     }
    // })))
  },
  getCurContainerPosY: function getCurContainerPosY() {
    if (this.container) {
      return this.container.y;
    }
  },
  getCurContainerPosX: function getCurContainerPosX() {
    if (this.container) {
      return this.container.x;
    }
  },
  //监测目标点位置
  checkPosition: function checkPosition(x, y) {
    if (this.root_wnd == null) {
      return cc.v2(0, 0);
    }
 
    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);
  },
  //设置滚动容器的大小
  setInnerContainer: function setInnerContainer() {
    var size = 0;
 
    if (this.data_list) {
      size = this.data_list.length;
    }
 
    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);
 
      if (!this.is_change) {
        container_height = num * this.item_height + 2 * this.start_y + (num - 1) * this.space_y;
      } else {
        container_height = num * this.item_height + 2 * this.start_y + num * 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.container) {
      this.container.setContentSize(this.container_size.width, this.container_size.height + this.bottom);
    }
 
    if (this.scroll_view_compend) {
      this.scroll_view_compend.stopAutoScroll();
 
      if (this.dir == ScrollViewDir.vertical) {
        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);
        }
      } else if (this.dir == ScrollViewDir.horizontal) {
        if (this.start_pos == ScrollViewStartPos.top) {
          this.scroll_view_compend.scrollToLeft(0);
        } else if (this.start_pos == ScrollViewStartPos.bottom) {
          this.scroll_view_compend.scrollToRight(0);
        }
      }
    }
  },
  //设置数据
  setData: function setData(data_list, click_callback, extend) {
    this.clearCacheList();
 
    if (data_list == null || Utils.next(data_list) == null) {
      return;
    } // 转换一下存储,保证不改变原数据
 
 
    var switchList = [];
 
    for (var _index3 = 0; _index3 < data_list.length; _index3++) {
      var element = data_list[_index3];
      switchList.push({
        data: element,
        index: _index3
      });
    }
 
    this.item_click_callback = click_callback;
    this.data_list = switchList;
    this.extend = extend;
    this.cur_item_class = this.item_class; //设置内部滚动容器的尺寸
 
    this.setInnerContainer();
    var index = 0;
    var once_num = this.once_num || 1; //如果需要动态创建的话
 
    var size = this.data_list.length;
 
    if (this.need_dynamic == true) {
      size = this.max_sum - 1; //因为js从0开始,实际个数单位减少1
    } //判断这边是否已经创建过的,如果创建过的就不需要分帧创建了,直接add吧
 
 
    if (this.cur_item_class && this.cache_item_pool.length > 0) {
      for (var i = 0; i < size; i++) {
        var data = this.data_list[i];
 
        if (data != null) {
          this.createList(data);
        }
 
        if (i == size - 1) {
          if (this.end_callBack) {
            this.end_callBack();
          }
        }
      }
    } else {
      if (this.time_ticket == null && Utils.next(this.data_list || {}) != null) {
        this.time_ticket = gcore.Timer.set(function () {
          if (this.container) {
            if (this.data_list == null) {
              if (this.end_callBack) {
                this.end_callBack();
              }
 
              this.clearTimeTicket();
            } else {
              for (var i = index; i < index + once_num; i++) {
                var switch_data = this.data_list[i];
 
                if (switch_data != null) {
                  this.createList(switch_data);
                }
              }
 
              index = index + once_num;
 
              if (index > size) {
                if (this.end_callBack) {
                  this.end_callBack();
                }
 
                this.clearTimeTicket();
              }
            }
          } else {}
        }.bind(this), this.delay * 10, -1);
      }
    }
  },
  updateItemData: function updateItemData(index, new_data) {
    var new_item_data = {
      data: new_data,
      index: index
    };
    this.data_list[index] = new_item_data;
    var item = this.getItem(index);
 
    if (item) {
      item.setData(new_data);
    }
  },
  setStartX: function setStartX(x) {
    this.start_x = x;
  },
  setSpaceY: function setSpaceY(space_y, is_change) {
    this.space_y = space_y;
    this.is_change = is_change;
  },
  clearTimeTicket: function clearTimeTicket() {
    if (this.time_ticket != null) {
      gcore.Timer.del(this.time_ticket);
      this.time_ticket = null;
    }
  },
  //重设滚动区域大小
  resetSize: function resetSize(size, pos) {
    if (size == null) return;
    if (size.width == this.size.width && size.height == this.size.height) return;
    this.size = size;
    if (this.root_wnd) this.root_wnd.setContentSize(size);
    if (this.scroll_view) this.scroll_view.setContentSize(size);
    if (this.scroll_view_mask) this.scroll_view_mask.setContentSize(size);
    if (this.root_wnd && pos) this.root_wnd.setPosition(pos);
    this.calculationMaxSum();
  },
 
  /**
   * 暂停计时器,以及回收掉之前创建的对象
   */
  clearCacheList: function clearCacheList() {
    this.clearTimeTicket();
 
    for (var index = 0; index < this.cache_item_list.length; index++) {
      var element = this.cache_item_list[index];
 
      if (element && element.suspendAllActions) {
        element.suspendAllActions();
      }
 
      this.cache_item_pool.push(element);
    }
 
    for (var _index4 = 0; _index4 < this.cache_item_pool.length; _index4++) {
      var _element = this.cache_item_pool[_index4];
 
      if (_element && _element.setVisible) {
        _element.cur_visible = false;
 
        _element.setVisible(false, this.dir); // element.setPosVisible();
 
      }
    }
 
    this.cache_item_list = [];
  },
  addEndCallBack: function addEndCallBack(call_back) {
    this.end_callBack = call_back;
  },
 
  /**
   * 创建具体事例
   * @param {*} data 这个数据是转换之后的数据,因为为了不改变数据结构,所以转换了 包含 data 和 index,其中data才是真实数据
   */
  createList: function createList(switch_data) {
    if (switch_data == null || switch_data.data == null || switch_data.index == null) return;
    if (this.cur_item_class == null) return; // if (this.cache_item_list[switch_data.index]) {
    //     var item = this.cache_item_list[switch_data.index]
    //     item.setVisible(true)
    //     return
    // }
 
    var item = null;
 
    if (this.cache_item_pool.length == 0) {
      if (typeof this.item_class == "string") {
        item = ItemsPool.getInstance().getItem(this.item_class);
      } else {
        item = new this.item_class(this.item_obj);
      }
 
      item.setParent(this.container);
      if (item.show) item.show();
 
      if (item.setScale) {
        item.setScale(this.scale);
      }
 
      if (this.isZIndex) {
        if (this.isZIndex == 1) {
          if (item.setZIndex) {
            item.setZIndex(switch_data.index);
          }
        } else if (this.isZIndex == 2) {
          if (item.setZIndex && this.data_list) {
            item.setZIndex(this.data_list.length - switch_data.index);
          }
        }
      }
    } else {
      item = this.cache_item_pool.shift();
 
      if (item.setVisible) {
        item.setVisible(true, this.dir);
      } else {
        Log.error("没有设置显示接口啊!!!");
      }
    } //临时使用
 
 
    item.tmp_index = switch_data.index;
    this.cache_item_list.push(item); //由于array数组的性质,有empty数据也算作一个长度,所以用push方法
    //拓展参数
 
    if (this.extend != null && item.setExtendData) {
      item.setExtendData(this.extend);
    } // 设置位置
 
 
    this.setItemPosition(item, switch_data.index); // 回调方法
 
    if (this.item_click_callback != null) {
      if (item.addCallBack) {
        item.addCallBack(this.item_click_callback);
      }
    }
 
    item.setData(switch_data.data, this.is_hide_effect);
    this.cur_min_index = switch_data.index;
  },
  //设置当前对象的位置,根据数据的临时_index去确定
  setItemPosition: function setItemPosition(item, index) {
    var cur_item_index = Number(index);
    var anchor_point = {};
    anchor_point.x = 0.5;
    anchor_point.y = 0.5;
    var _x = 0;
    var _y = 0; //父容器的相对锚点为(0,1)
 
    if (this.dir == ScrollViewDir.horizontal) {
      _x = this.start_x + this.item_width * anchor_point.x + (this.item_width + this.space_x) * Math.floor(cur_item_index / this.row);
      _y = this.container_size.height - (this.start_y + this.item_height * (1 - anchor_point.y) + cur_item_index % this.row * (this.item_height + this.space_y));
    } else {
      if (this.start_pos == ScrollViewStartPos.top) {
        _x = this.start_x + this.item_width * anchor_point.x + (this.item_width + this.space_x) * (cur_item_index % this.col);
        _y = this.container_size.height - (this.start_y + this.item_height * (1 - anchor_point.y) + Math.floor(cur_item_index / this.col) * (this.item_height + this.space_y));
      } else {
        _x = this.start_x + this.item_width * anchor_point.x + (this.item_width + this.space_x) * (cur_item_index % this.col);
        _y = this.start_y + this.item_height * anchor_point.y + Math.floor(cur_item_index / this.col) * (this.item_height + this.space_y);
      }
    }
 
    item.setPosition(_x, _y + this.bottom);
  },
  resetCurrentItems: function resetCurrentItems() {
    for (var index = 0; index < this.cache_item_list.length; index++) {
      if (this.cache_item_list[index] && this.cache_item_list[index].setData) {
        var cur_data = this.data_list[this.cache_item_list[index].tmp_index];
        this.cache_item_list[index].setData(cur_data.data);
      }
    }
  },
  //获取已创建的全部对象
  getItemList: function getItemList() {
    var item_list = [];
 
    for (var index = 0; index < this.cache_item_list.length; index++) {
      var element = this.cache_item_list[index];
      item_list.push(element);
    }
 
    return item_list;
  },
  getItem: function getItem(tmp_index) {
    for (var item_i in this.cache_item_list) {
      var item = this.cache_item_list[item_i];
 
      if (item.tmp_index == tmp_index) {
        return item;
      }
    }
 
    return null;
  },
  setRootVisible: function setRootVisible(bool) {
    if (this.root_wnd) {
      this.root_wnd.active = bool;
    }
  },
  //用于增减的时候操作,需要传去最新的List
  resetAddPosition: function resetAddPosition(list, sort_fun) {
    if (list == null || Utils.next(list) == null) return;
 
    if (sort_fun != null) {
      list.sort(sort_fun);
    }
 
    var swich_list = [];
 
    for (var index = 0; index < list.length; index++) {
      var element = list[index];
      swich_list.push({
        data: element,
        index: index
      });
    }
 
    this.data_list = swich_list;
    if (this.cache_item_list == null || Utils.next(this.cache_item_list) == null) return;
 
    for (var _index5 = 0; _index5 < this.cache_item_list.length; _index5++) {
      var item = this.cache_item_list[_index5]; // 对象
 
      var switch_data = swich_list[item.tmp_index]; // 数据对象
 
      if (switch_data && item.setData && switch_data.data) {
        item.setData(switch_data.data);
        item.setVisible(true, this.dir);
        item.tmp_index = switch_data.index;
      } else {
        item.cur_visible = false;
        item.setVisible(false, this.dir);
        this.cache_item_pool.push(item); // 移除掉
 
        this.cache_item_list.splice(_index5, 1);
      }
    }
  },
  //对当前创建对象做排序,同时对缓存数据做排序
  resetPosition: function resetPosition(sort_fun, is_clear) {
    if (this.data_list == null || Utils.next(this.data_list) == null) return;
 
    if (sort_fun != null) {
      this.data_list.sort(sort_fun);
    }
 
    for (var index = 0; index < this.data_list.length; index++) {
      var element = this.data_list[index];
      element.index = index;
    }
 
    if (this.cache_item_list == null || Utils.next(this.cache_item_list) == null) return;
 
    for (var _index6 = 0; _index6 < this.cache_item_list.length; _index6++) {
      var item = this.cache_item_list[_index6];
 
      if (item.tmp_index) {
        var switch_data = this.data_list[item.tmp_index];
 
        if (switch_data && item.setData && switch_data.data) {
          item.setData(switch_data.data);
          item.setVisible(true, this.dir);
          item.tmp_index = switch_data.index;
        }
      }
    }
  },
  //解析数据
  analysisSetting: function analysisSetting(setting) {
    this.setting = setting || {};
    this.item_class = this.setting.item_class;
    this.start_x = this.setting.start_x || 0; //第一个单元的起点X
 
    this.space_x = this.setting.space_x || 3; // 横向间隔空间
 
    this.start_y = this.setting.start_y || 0; // 第一个单元的起点Y
 
    this.space_y = this.setting.space_y || 3; // 竖向间隔空间
 
    this.item_width = this.setting.item_width || 115; // 单元的宽度
 
    this.item_height = this.setting.item_height || 115; // 单元的高度
 
    this.is_radian = this.setting.is_radian || false; //是否要弧度
 
    this.row = this.setting.row || 5; // 行数,作用于水平方向的滚动
 
    this.col = this.setting.col || 5; // 列数,作用于垂直方向的滚动
 
    this.delay = this.setting.delay || 1; // 创建延迟时间
 
    this.once_num = this.setting.once_num || 1; // 每次创建的数量
 
    this.scale = this.setting.scale || 1; //缩放值
 
    this.need_dynamic = this.setting.need_dynamic || false; // 是否需要动态创建的 
 
    this.is_hide_effect = this.setting.is_hide_effect || false;
    this.item_obj = this.setting.item_obj; //给item_class传入默认参数
 
    this.bottom = this.setting.bottom || 0; //底部间距
 
    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.max_sum = max_sum;
  },
  getMaxSize: function getMaxSize() {
    return this.container_size;
  },
  getContainer: function getContainer() {
    return this.container;
  },
  deleteMe: function deleteMe() {
    this.DeleteMe();
  },
  //设置滚动状态,false取消滚动,true恢复原来的滚动方向
  setScrollState: function setScrollState(bool) {
    if (this.scroll_view_compend) {
      if (!bool) {
        this.scroll_view_compend.vertical = false;
        this.scroll_view_compend.horizontal = false;
      } else {
        if (this.dir == ScrollViewDir.vertical) {
          this.scroll_view_compend.vertical = true;
        } else {
          this.scroll_view_compend.horizontal = true;
        }
      }
    } else {
      this.scroll_state = bool;
    }
  },
  setVisible: function setVisible(bool) {
    if (this.root_wnd && bool != null) {
      this.root_wnd.active = bool;
    }
  },
 
  /**
   * 是否设置item层次排序
   * type:   1:正向  2:反向
   */
  setItemZIndexByType: function setItemZIndexByType(type) {
    this.isZIndex = type;
  },
  //移除对象
  DeleteMe: function DeleteMe() {
    // doStopAllActions(self.container);    //不清楚H5还需不需要安全判断,先注释掉
    this.clearTimeTicket();
    this.setClickEnabled(false);
 
    for (var index = 0; index < this.cache_item_list.length; index++) {
      var element = this.cache_item_list[index];
 
      if (element.deleteMe) {
        element.deleteMe();
        element = null;
      }
    }
 
    for (var _index7 = 0; _index7 < this.cache_item_pool.length; _index7++) {
      var element = this.cache_item_pool[_index7];
 
      if (element.deleteMe) {
        element.deleteMe();
        element = null;
      }
    }
 
    this.cache_item_list = null;
    this.cache_item_pool = null;
 
    if (this.root_wnd) {
      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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcY29tbW9uXFxjb21tb25fc2Nyb2xsdmlldy5qcyJdLCJuYW1lcyI6WyJMb2FkZXJNYW5hZ2VyIiwicmVxdWlyZSIsIlBhdGhUb29sIiwiQ29tbW9uU2Nyb2xsVmlldyIsImNjIiwiQ2xhc3MiLCJCYXNlQ2xhc3MiLCJjdG9yIiwiaW5pdENvbmZpZyIsInBhcmVudCIsInByZWZhYlBhdGgiLCJnZXRQcmVmYWJQYXRoIiwicG9zIiwidjIiLCJkaXIiLCJTY3JvbGxWaWV3RGlyIiwidmVydGljYWwiLCJzdGFydF9wb3MiLCJTY3JvbGxWaWV3U3RhcnRQb3MiLCJ0b3AiLCJzaXplIiwiYXAiLCJjYWNoZV9pdGVtX2xpc3QiLCJjYWNoZV9pdGVtX3Bvb2wiLCJpdGVtX2NsaWNrX2NhbGxiYWNrIiwiZXh0ZW5kIiwiY3VyX2l0ZW1fY2xhc3MiLCJpc19yYWRpYW4iLCJpc19zY3JvbGxpbmciLCJjdXJfbWluX2luZGV4IiwiYm91bmNlRW5hYmxlZCIsImNsaWNrRW5hYmxlZCIsImNyZWF0ZVNjcm9sbCIsInNldHRpbmciLCJhbmFseXNpc1NldHRpbmciLCJnZXRJbnN0YW5jZSIsImxvYWRSZXMiLCJyZXNfb2JqZWN0IiwiaXNWYWxpZCIsInJvb3Rfd25kIiwiY3JlYXRlUm9vdFduZCIsImJpbmQiLCJzY3JvbGwiLCJzY3JvbGxfdmlldyIsImdldENoaWxkQnlOYW1lIiwic2Nyb2xsX3ZpZXdfbWFzayIsImNvbnRhaW5lciIsIm1hc2siLCJzZXRDb250ZW50U2l6ZSIsInNldEFuY2hvclBvaW50IiwieCIsInkiLCJzZXRQb3NpdGlvbiIsInNjcm9sbF92aWV3X2NvbXBlbmQiLCJnZXRDb21wb25lbnQiLCJTY3JvbGxWaWV3IiwiaG9yaXpvbnRhbCIsInNjcm9sbF9zdGF0ZSIsInNldFNjcm9sbFN0YXRlIiwiYWRkQ2hpbGQiLCJzZXRCb3VuY2VFbmFibGVkIiwic2V0Q2xpY2tFbmFibGVkIiwic2V0SW5uZXJDb250YWluZXIiLCJyZWdpc3RlckV2ZW50IiwibmVlZF9keW5hbWljIiwibm9kZSIsIm9uIiwiY2hlY2tSZWN0SW50ZXJzZWN0c1JlY3QiLCJldmVudCIsImNoZWNrT3ZlclNob3dCeVZlcnRpY2FsIiwiZGF0YV9saXN0IiwiVXRpbHMiLCJuZXh0IiwiaXRlbV9saXN0IiwicG9vbF9saXN0IiwiY29udGFpbmVyX3kiLCJsYXN0X3Bvc195IiwiaXRlbSIsImNvbnRhaW5lcl95X2FicyIsIk1hdGgiLCJhYnMiLCJpbmRleCIsImxlbmd0aCIsIkxvZyIsImVycm9yIiwiaXRlbV95IiwibmVlZF9jbGVhciIsImhlaWdodCIsIml0ZW1faGVpZ2h0Iiwic3VzcGVuZEFsbEFjdGlvbnMiLCJjdXJfdmlzaWJsZSIsInNldFZpc2libGUiLCJwdXNoIiwic3BsaWNlIiwic3VwcGxlbWVudEl0ZW1MaXN0IiwibGFzdF95IiwiY3VyX3kiLCJjdXJfdGFibGVfbnVtIiwibWF4X3N1bSIsIm1pbl9pbmRleCIsInRtcF9pbmRleCIsIm1heF9pbmRleCIsIk51bWJlciIsImNyZWF0ZUxpc3QiLCJzZXRTd2FsbG93VG91Y2hlcyIsInN0YXR1cyIsImVsYXN0aWMiLCJOb2RlIiwiRXZlbnRUeXBlIiwiVE9VQ0hfU1RBUlQiLCJfb25Ub3VjaEJlZ2FuIiwiVE9VQ0hfTU9WRSIsIl9vblRvdWNoTW92ZWQiLCJUT1VDSF9FTkQiLCJfb25Ub3VjaEVuZGVkIiwiVE9VQ0hfQ0FOQ0VMIiwiX29uVG91Y2hDYW5jZWxsZWQiLCJvZmYiLCJ1cGRhdGVNb3ZlIiwidGFyZ2V0X3BvcyIsImNoZWNrUG9zaXRpb24iLCJtb3ZlX3RvIiwibW92ZVRvIiwiZWFzaW5nIiwiZWFzZUJhY2tPdXQiLCJydW5BY3Rpb24iLCJqdW1wVG9Nb3ZlIiwidGltZSIsImNhbGxiYWNrIiwic2VxdWVuY2UiLCJjYWxsRnVuYyIsImp1bXBUb01vdmVfMiIsImdldEN1ckNvbnRhaW5lclBvc1kiLCJnZXRDdXJDb250YWluZXJQb3NYIiwiX3giLCJfeSIsIndpZHRoIiwiY29udGFpbmVyX3NpemUiLCJjb250YWluZXJfd2lkdGgiLCJjb250YWluZXJfaGVpZ2h0IiwibnVtIiwiY2VpbCIsInJvdyIsIml0ZW1fd2lkdGgiLCJzdGFydF94Iiwic3BhY2VfeCIsImNvbCIsImlzX2NoYW5nZSIsInN0YXJ0X3kiLCJzcGFjZV95IiwibWF4IiwiYm90dG9tIiwic3RvcEF1dG9TY3JvbGwiLCJzY3JvbGxUb1RvcCIsInNjcm9sbFRvQm90dG9tIiwic2Nyb2xsVG9MZWZ0Iiwic2Nyb2xsVG9SaWdodCIsInNldERhdGEiLCJjbGlja19jYWxsYmFjayIsImNsZWFyQ2FjaGVMaXN0Iiwic3dpdGNoTGlzdCIsImVsZW1lbnQiLCJkYXRhIiwiaXRlbV9jbGFzcyIsIm9uY2VfbnVtIiwiaSIsImVuZF9jYWxsQmFjayIsInRpbWVfdGlja2V0IiwiZ2NvcmUiLCJUaW1lciIsInNldCIsImNsZWFyVGltZVRpY2tldCIsInN3aXRjaF9kYXRhIiwiZGVsYXkiLCJ1cGRhdGVJdGVtRGF0YSIsIm5ld19kYXRhIiwibmV3X2l0ZW1fZGF0YSIsImdldEl0ZW0iLCJzZXRTdGFydFgiLCJzZXRTcGFjZVkiLCJkZWwiLCJyZXNldFNpemUiLCJjYWxjdWxhdGlvbk1heFN1bSIsImFkZEVuZENhbGxCYWNrIiwiY2FsbF9iYWNrIiwiSXRlbXNQb29sIiwiaXRlbV9vYmoiLCJzZXRQYXJlbnQiLCJzaG93Iiwic2V0U2NhbGUiLCJzY2FsZSIsImlzWkluZGV4Iiwic2V0WkluZGV4Iiwic2hpZnQiLCJzZXRFeHRlbmREYXRhIiwic2V0SXRlbVBvc2l0aW9uIiwiYWRkQ2FsbEJhY2siLCJpc19oaWRlX2VmZmVjdCIsImN1cl9pdGVtX2luZGV4IiwiYW5jaG9yX3BvaW50IiwiZmxvb3IiLCJyZXNldEN1cnJlbnRJdGVtcyIsImN1cl9kYXRhIiwiZ2V0SXRlbUxpc3QiLCJpdGVtX2kiLCJzZXRSb290VmlzaWJsZSIsImJvb2wiLCJhY3RpdmUiLCJyZXNldEFkZFBvc2l0aW9uIiwibGlzdCIsInNvcnRfZnVuIiwic29ydCIsInN3aWNoX2xpc3QiLCJyZXNldFBvc2l0aW9uIiwiaXNfY2xlYXIiLCJnZXRNYXhTaXplIiwiZ2V0Q29udGFpbmVyIiwiZGVsZXRlTWUiLCJEZWxldGVNZSIsInNldEl0ZW1aSW5kZXhCeVR5cGUiLCJ0eXBlIiwiZGVzdHJveSIsInJlbGVhc2VQcmVmYWIiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUEsSUFBSUEsYUFBYSxHQUFHQyxPQUFPLENBQUMsZUFBRCxDQUEzQjs7QUFDQSxJQUFJQyxRQUFRLEdBQUdELE9BQU8sQ0FBQyxVQUFELENBQXRCOztBQUVBLElBQUlFLGdCQUFnQixHQUFHQyxFQUFFLENBQUNDLEtBQUgsQ0FBUztBQUM1QixhQUFTQyxTQURtQjtBQUU1QkMsRUFBQUEsSUFBSSxFQUFFLGdCQUFZO0FBQ2QsU0FBS0MsVUFBTDtBQUNILEdBSjJCO0FBTTVCQSxFQUFBQSxVQUFVLEVBQUUsc0JBQVk7QUFDcEIsU0FBS0MsTUFBTCxHQUFjLElBQWQ7QUFDQSxTQUFLQyxVQUFMLEdBQWtCUixRQUFRLENBQUNTLGFBQVQsQ0FBdUIsUUFBdkIsRUFBaUMsb0JBQWpDLENBQWxCO0FBQ0EsU0FBS0MsR0FBTCxHQUFXUixFQUFFLENBQUNTLEVBQUgsQ0FBTSxDQUFOLEVBQVMsQ0FBVCxDQUFYO0FBQ0EsU0FBS0MsR0FBTCxHQUFXQyxhQUFhLENBQUNDLFFBQXpCO0FBQ0EsU0FBS0MsU0FBTCxHQUFpQkMsa0JBQWtCLENBQUNDLEdBQXBDO0FBQ0EsU0FBS0MsSUFBTCxHQUFZaEIsRUFBRSxDQUFDZ0IsSUFBSCxDQUFRLEdBQVIsRUFBYSxHQUFiLENBQVo7QUFDQSxTQUFLQyxFQUFMLEdBQVVqQixFQUFFLENBQUNTLEVBQUgsQ0FBTSxDQUFOLEVBQVMsQ0FBVCxDQUFWO0FBQ0EsU0FBS1MsZUFBTCxHQUF1QixFQUF2QixDQVJvQixDQVE0Qjs7QUFDaEQsU0FBS0MsZUFBTCxHQUF1QixFQUF2QixDQVRvQixDQVM0Qjs7QUFFaEQsU0FBS0MsbUJB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QUEsT0FBTyxHQUFHLElBQVY7QUFDSDtBQUNKOztBQUVELFNBQUssSUFBSWhGLE9BQUssR0FBRyxDQUFqQixFQUFvQkEsT0FBSyxHQUFHLEtBQUsxRCxlQUFMLENBQXFCMkQsTUFBakQsRUFBeURELE9BQUssRUFBOUQsRUFBa0U7QUFDOUQsVUFBSWdGLE9BQU8sR0FBRyxLQUFLMUksZUFBTCxDQUFxQjBELE9BQXJCLENBQWQ7O0FBQ0EsVUFBSWdGLE9BQU8sQ0FBQ3dELFFBQVosRUFBc0I7QUFDbEJ4RCxRQUFBQSxPQUFPLENBQUN3RCxRQUFSO0FBQ0F4RCxRQUFBQSxPQUFPLEdBQUcsSUFBVjtBQUNIO0FBQ0o7O0FBQ0QsU0FBSzNJLGVBQUwsR0FBdUIsSUFBdkI7QUFDQSxTQUFLQyxlQUFMLEdBQXVCLElBQXZCOztBQUNBLFFBQUcsS0FBS2dCLFFBQVIsRUFBaUI7QUFDYixXQUFLQSxRQUFMLENBQWNzTCxPQUFkO0FBQ0EsV0FBS3RMLFFBQUwsR0FBZ0IsSUFBaEI7QUFDSDs7QUFDRHZDLElBQUFBLGFBQWEsQ0FBQ21DLFdBQWQsR0FBNEIyTCxhQUE1QixDQUEwQyxLQUFLcE4sVUFBL0M7QUFDSDtBQXp4QjJCLENBQVQsQ0FBdkIiLCJzb3VyY2VSb290IjoiLyIsInNvdXJjZXNDb250ZW50IjpbIi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbi8vIEBhdXRob3I6IHNoaXJhaG9Ac3lnLmNvbSjlv4XloassIOWIm+W7uuaooeWdl+eahOS6uuWRmClcclxuLy8gQGRlc2NyaXB0aW9uOlxyXG4vLyAgICAgIOaXoOe6v+a7muWKqOWuueWZqCzlrZDlr7nosaHlv4XpobvmmK/plJrngrkwLjUsMC41LCDogIzkuJTkuIDlrpropoHnu6fmib8gYmFzZXBhbmVsXHJcbi8vIDxici8+Q3JlYXRlOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKClcclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbnZhciBMb2FkZXJNYW5hZ2VyID0gcmVxdWlyZShcImxvYWRlcm1hbmFnZXJcIik7XHJcbnZhciBQYXRoVG9vbCA9IHJlcXVpcmUoXCJwYXRodG9vbFwiKVxyXG5cclxudmFyIENvbW1vblNjcm9sbFZpZXcgPSBjYy5DbGFzcyh7XHJcbiAgICBleHRlbmRzOiBCYXNlQ2xhc3MsXHJcbiAgICBjdG9yOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdGhpcy5pbml0Q29uZmlnKClcclxuICAgIH0sXHJcblxyXG4gICAgaW5pdENvbmZpZzogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHRoaXMucGFyZW50ID0gbnVsbDtcclxuICAgICAgICB0aGlzLnByZWZhYlBhdGggPSBQYXRoVG9vbC5nZXRQcmVmYWJQYXRoKFwiY29tbW9uXCIsIFwiY29tbW9uX3Njcm9sbF92aWV3XCIpO1xyXG4gICAgICAgIHRoaXMucG9zID0gY2MudjIoMCwgMCk7XHJcbiAgICAgICAgdGhpcy5kaXIgPSBTY3JvbGxWaWV3RGlyLnZlcnRpY2FsO1xyXG4gICAgICAgIHRoaXMuc3RhcnRfcG9zID0gU2Nyb2xsVmlld1N0YXJ0UG9zLnRvcDtcclxuICAgICAgICB0aGlzLnNpemUgPSBjYy5zaXplKDEwMCwgMTAwKTtcclxuICAgICAgICB0aGlzLmFwID0gY2MudjIoMCwgMCk7XHJcbiAgICAgICAgdGhpcy5jYWNoZV9pdGVtX2xpc3QgPSBbXTsgICAgICAgICAgICAgICAgICAgICAgLy8g5b2T5YmN5pi+56S655qE5a+56LGhXHJcbiAgICAgICAgdGhpcy5jYWNoZV9pdGVtX3Bvb2wgPSBbXTsgICAgICAgICAgICAgICAgICAgICAgLy8g57yT5a2Y5Lit5piv5Ymp5L2Z55qE5a+56LGhXHJcblxyXG4gICAgICAgIHRoaXMuaXRlbV9jbGlja19jYWxsYmFjayA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5leHRlbmQgPSBudWxsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy/mianlsZXlj4LmlbBcclxuICAgICAgICB0aGlzLmN1cl9pdGVtX2NsYXNzID0gbnVsbDsgICAgICAgICAgICAgICAgICAgICAvL+W9k+WJjeaYvuekuueahOWvueixoVxyXG4gICAgICAgIHRoaXMuaXNfcmFkaWFuID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5pc19zY3JvbGxpbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmN1cl9taW5faW5kZXggPSAwO1xyXG4gICAgICAgIHRoaXMuYm91bmNlRW5hYmxlZCA9IHRydWU7ICAgICAgICAgICAgICAgICAgICAgICAgIC8v5piv5ZCm5Zue5by5XHJcbiAgICAgICAgdGhpcy5jbGlja0VuYWJsZWQgPSB0cnVlOyAgICAgICAgICAgICAgICAgICAgICAgIC8v5piv5ZCm5Y+v54K55Ye7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5Yib5bu6XHJcbiAgICAgKiBAcGFyYW0geyp9IHBhcmVudCDmiYDlnKjniLboioLngrlcclxuICAgICAqIEBwYXJhbSB7Kn0gcG9zIOa7keWKqOe7hOS7tuS9jee9rlxyXG4gICAgICogQHBhcmFtIHsqfSBkaXIg5ruR5Yqo5a+56b2Q5pa55byPXHJcbiAgICAgKiBAcGFyYW0geyp9IHN0YXJ0X3BvcyDmu5HliqjliJfooajlvIDlp4vkvY3nva5cclxuICAgICAqIEBwYXJhbSB7Kn0gc2l6ZSDmu5HliqjmoYblpKflsI9cclxuICAgICAqIEBwYXJhbSB7Kn0gc2V0dGluZyDorr7nva7kv6Hmga9cclxuICAgICAqIEBwYXJhbSB7Kn0gYXAg6ZSa54K5XHJcbiAgICAgKi9cclxuICAgIGNyZWF0ZVNjcm9sbDogZnVuY3Rpb24gKHBhcmVudCwgcG9zLCBkaXIsIHN0YXJ0X3Bvcywgc2l6ZSwgc2V0dGluZywgYXApIHtcclxuICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDtcclxuICAgICAgICB0aGlzLnBvcyA9IHBvcyB8fCBjYy52MigwLCAwKTtcclxuICAgICAgICB0aGlzLmRpciA9IGRpciB8fCBTY3JvbGxWaWV3RGlyLnZlcnRpY2FsO1xyXG4gICAgICAgIHRoaXMuc3RhcnRfcG9zID0gc3RhcnRfcG9zIHx8IFNjcm9sbFZpZXdTdGFydFBvcy50b3A7XHJcbiAgICAgICAgdGhpcy5zaXplID0gc2l6ZSB8fCBjYy5zaXplKDEwMCwgMTAwKTtcclxuICAgICAgICB0aGlzLmFwID0gYXAgfHwgY2MudjIoMCwgMCk7XHJcblxyXG4gICAgICAgIHRoaXMuYW5hbHlzaXNTZXR0aW5nKHNldHRpbmcpO1xyXG5cclxuICAgICAgICBMb2FkZXJNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9hZFJlcyh0aGlzLnByZWZhYlBhdGgsIChmdW5jdGlvbiAocmVzX29iamVjdCkge1xyXG4gICAgICAgICAgICBpZih0aGlzLnBhcmVudCA9PSBudWxsIHx8ICh0aGlzLnBhcmVudCAmJiB0aGlzLnBhcmVudC5pc1ZhbGlkKSl7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJvb3Rfd25kID0gcmVzX29iamVjdDtcclxuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlUm9vdFduZCh0aGlzLnJvb3Rfd25kKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pLmJpbmQodGhpcykpXHJcbiAgICB9LFxyXG5cclxuICAgIC8vIOWIneWni+WMluWIm+W7uuWvueixoVxyXG4gICAgY3JlYXRlUm9vdFduZDogZnVuY3Rpb24gKHNjcm9sbCkge1xyXG4gICAgICAgIGlmKHRoaXMucm9vdF93bmQgPT0gbnVsbClyZXR1cm5cclxuICAgICAgICB0aGlzLnJvb3Rfd25kID0gc2Nyb2xsO1xyXG4gICAgICAgIHRoaXMuc2Nyb2xsX3ZpZXcgPSBzY3JvbGwuZ2V0Q2hpbGRCeU5hbWUoXCJTY3JvbGxWaWV3XCIpO1xyXG4gICAgICAgIHRoaXMuc2Nyb2xsX3ZpZXdfbWFzayA9IHRoaXMuc2Nyb2xsX3ZpZXcuZ2V0Q2hpbGRCeU5hbWUoXCJ2aWV3XCIpO1xyXG4gICAgICAgIHRoaXMuY29udGFpbmVyID0gdGhpcy5zY3JvbGxfdmlld19tYXNrLmdldENoaWxkQnlOYW1lKFwiY29udGVudFwiKTtcclxuICAgICAgICB0aGlzLm1hc2sgPSB0aGlzLnNjcm9sbF92aWV3LmdldENoaWxkQnlOYW1lKFwibWFza1wiKVxyXG4gICAgICAgIHRoaXMucm9vdF93bmQuc2V0Q29udGVudFNpemUodGhpcy5zaXplKTtcclxuICAgICAgICB0aGlzLnJvb3Rfd25kLnNldEFuY2hvclBvaW50KHRoaXMuYXAueCwgdGhpcy5hcC55KTtcclxuICAgICAgICB0aGlzLnJvb3Rfd25kLnNldFBvc2l0aW9uKHRoaXMucG9zKTtcclxuIFxyXG4gICAgICAgIHRoaXMuc2Nyb2xsX3ZpZXcuc2V0Q29udGVudFNpemUodGhpcy5zaXplKTtcclxuICAgICAgICB0aGlzLnNjcm9sbF92aWV3X21hc2suc2V0Q29udGVudFNpemUodGhpcy5zaXplKTtcclxuICAgICAgICB0aGlzLmNvbnRhaW5lci5zZXRDb250ZW50U2l6ZSh0aGlzLnNpemUpO1xyXG4gICAgICAgIC8vIOa7muWKqOe7hOW7ulxyXG4gICAgICAgIHRoaXMuc2Nyb2xsX3ZpZXdfY29tcGVuZCA9IHRoaXMuc2Nyb2xsX3ZpZXcuZ2V0Q29tcG9uZW50KGNjLlNjcm9sbFZpZXcpXHJcbiAgICAgICAgaWYgKHRoaXMuZGlyID09IFNjcm9sbFZpZXdEaXIudmVydGljYWwpIHtcclxuICAgICAgICAgICAgdGhpcy5zY3JvbGxfdmlld19jb21wZW5kLnZlcnRpY2FsID0gdHJ1ZVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsX3ZpZXdfY29tcGVuZC5ob3Jpem9udGFsID0gdHJ1ZVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc2Nyb2xsX3N0YXRlICE9IG51bGwpIHtcclxuICAgICAgICAgICAgdGhpcy5zZXRTY3JvbGxTdGF0ZSh0aGlzLnNjcm9sbF9zdGF0ZSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnBhcmVudCkge1xyXG4gICAgICAgICAgICB0aGlzLnBhcmVudC5hZGRDaGlsZChzY3JvbGwpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5zZXRCb3VuY2VFbmFibGVkKHRoaXMuYm91bmNlRW5hYmxlZCk7XHJcbiAgICAgICAgdGhpcy5zZXRDbGlja0VuYWJsZWQodGhpcy5jbGlja0VuYWJsZWQpO1xyXG4gICAgICAgIC8vIOebkeWQrOS6i+S7tlxyXG4gICAgICAgIHRoaXMuc2V0SW5uZXJDb250YWluZXIoKVxyXG4gICAgICAgIHRoaXMucmVnaXN0ZXJFdmVudCgpO1xyXG4gICAgfSxcclxuXHJcbiAgICByZWdpc3RlckV2ZW50OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMubmVlZF9keW5hbWljID09IHRydWUpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZGlyID09IFNjcm9sbFZpZXdEaXIudmVydGljYWwpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsX3ZpZXdfY29tcGVuZC5ub2RlLm9uKCdzY3JvbGxpbmcnLCB0aGlzLmNoZWNrUmVjdEludGVyc2VjdHNSZWN0LCB0aGlzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLy/np7vliqjnmoTov4fnqIvkuK3nm5jngrnmmK/lkKbkuI3lho3lj6/op4bojIPlm7Qs5LiN5YaN55qE5pe25YCZ56e76Zmk5o6JLOaUvuWIsOWvueixoeaxoCzlubbkuJTlh4blpIfkuIvkuIDmrKHliJvlu7pcclxuICAgIGNoZWNrUmVjdEludGVyc2VjdHNSZWN0OiBmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgICAgICBpZiAodGhpcy5uZWVkX2R5bmFtaWMgPT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmRpciA9PSBTY3JvbGxWaWV3RGlyLnZlcnRpY2FsKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2hlY2tPdmVyU2hvd0J5VmVydGljYWwoKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8v56uW55u05pa55ZCR55qE55uR5rWL5Yik5patXHJcbiAgICBjaGVja092ZXJTaG93QnlWZXJ0aWNhbDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmN1cl9pdGVtX2NsYXNzID09IG51bGwpIHtcclxuICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmRhdGFfbGlzdCA9PSBudWxsIHx8IFV0aWxzLm5leHQodGhpcy5kYXRhX2xpc3QpID09IG51bGwpIHtcclxuICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBpdGVtX2xpc3QgPSB0aGlzLmNhY2hlX2l0ZW1fbGlzdFxyXG4gICAgICAgIHZhciBwb29sX2xpc3QgPSB0aGlzLmNhY2hlX2l0ZW1fcG9vbFxyXG4gICAgICAgIGlmIChpdGVtX2xpc3QgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICByZXR1cm5cclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIGNvbnRhaW5lcl95ID0gdGhpcy5jb250YWluZXIueTtcclxuICAgICAgICBpZiAodGhpcy5sYXN0X3Bvc195ID09IG51bGwpIHtcclxuICAgICAgICAgICAgdGhpcy5sYXN0X3Bvc195ID0gY29udGFpbmVyX3k7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBpdGVtID0gbnVsbDtcclxuICAgICAgICB2YXIgY29udGFpbmVyX3lfYWJzID0gTWF0aC5hYnMoY29udGFpbmVyX3kpO1xyXG4gICAgICAgIC8v5YWI56e76Zmk5LiN5Zyo5Y+v6KeG55qEXHJcbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSBpdGVtX2xpc3QubGVuZ3RoIC0gMTsgaW5kZXggPj0gMDsgaW5kZXgtLSkge1xyXG4gICAgICAgICAgICBjb25zdCBpdGVtID0gaXRlbV9saXN0W2luZGV4XTtcclxuICAgICAgICAgICAgaWYoaXRlbS55ID09IG51bGwpe1xyXG4gICAgICAgICAgICAgICAgTG9nLmVycm9yKGl0ZW0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHZhciBpdGVtX3kgPSBpdGVtLnlcclxuICAgICAgICAgICAgdmFyIG5lZWRfY2xlYXIgPSBmYWxzZVxyXG4gICAgICAgICAgICBpZiAoY29udGFpbmVyX3kgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXRlbV95ID4gKHRoaXMuc2l6ZS5oZWlnaHQgLSBjb250YWluZXJfeSArIHRoaXMuaXRlbV9oZWlnaHQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbmVlZF9jbGVhciA9IHRydWVcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmIChpdGVtX3kgPCAoY29udGFpbmVyX3lfYWJzIC0gdGhpcy5pdGVtX2hlaWdodCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBuZWVkX2NsZWFyID0gdHJ1ZVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpdGVtX3kgPiAoY29udGFpbmVyX3lfYWJzICsgdGhpcy5zaXplLmhlaWdodCArIHRoaXMuaXRlbV9oZWlnaHQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbmVlZF9jbGVhciA9IHRydWVcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAobmVlZF9jbGVhciA9PSB0cnVlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXRlbSAmJiBpdGVtLnN1c3BlbmRBbGxBY3Rpb25zICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICBpdGVtLnN1c3BlbmRBbGxBY3Rpb25zKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5jdXJfdmlzaWJsZSA9IGZhbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5zZXRWaXNpYmxlKGZhbHNlLHRoaXMuZGlyKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHBvb2xfbGlzdC5wdXNoKGl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgaXRlbV9saXN0LnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5zdXBwbGVtZW50SXRlbUxpc3QoaXRlbV9saXN0LCB0aGlzLmxhc3RfcG9zX3ksIGNvbnRhaW5lcl95KTtcclxuICAgICAgICB0aGlzLmxhc3RfcG9zX3kgPSBjb250YWluZXJfeTtcclxuICAgIH0sXHJcblxyXG4gICAgLy/ooaXlhYXpnIDopoHliJvlu7rnmoRcclxuICAgIHN1cHBsZW1lbnRJdGVtTGlzdDogZnVuY3Rpb24gKGl0ZW1fbGlzdCwgbGFzdF95LCBjdXJfeSkge1xyXG4gICAgICAgIGlmIChpdGVtX2xpc3QgPT0gbnVsbCB8fCBpdGVtX2xpc3QubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBjdXJfdGFibGVfbnVtID0gaXRlbV9saXN0Lmxlbmd0aDtcclxuICAgICAgICBpZiAoY3VyX3RhYmxlX251bSA8IHRoaXMubWF4X3N1bSkge1xyXG4gICAgICAgICAgICB2YXIgbWluX2luZGV4ID0gaXRlbV9saXN0WzBdLnRtcF9pbmRleDtcclxuICAgICAgICAgICAgdmFyIG1heF9pbmRleCA9IGl0ZW1fbGlzdFswXS50bXBfaW5kZXg7XHJcblxyXG4gICAgICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgaXRlbV9saXN0Lmxlbmd0aDsgaW5kZXgrKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IGl0ZW1fbGlzdFtpbmRleF07XHJcbiAgICAgICAgICAgICAgICBpZiAobWluX2luZGV4ID49IGl0ZW0udG1wX2luZGV4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbWluX2luZGV4ID0gTnVtYmVyKGl0ZW0udG1wX2luZGV4KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChtYXhfaW5kZXggPD0gaXRlbS50bXBfaW5kZXgpIHtcclxuICAgICAgICAgICAgICAgICAgICBtYXhfaW5kZXggPSBOdW1iZXIoaXRlbS50bXBfaW5kZXgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChjdXJfeSA+IGxhc3RfeSkgeyAgLy/lkJHkuIos6YKj5LmI5bCx5Yib5bu65Yiw5LiL6Z2iXHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgKHRoaXMubWF4X3N1bSAtIGN1cl90YWJsZV9udW0pOyBpbmRleCsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVMaXN0KHRoaXMuZGF0YV9saXN0W21heF9pbmRleCArIGluZGV4ICsgMV0pXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgKHRoaXMubWF4X3N1bSAtIGN1cl90YWJsZV9udW0pOyBpbmRleCsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKChtaW5faW5kZXggLSBpbmRleCkgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlTGlzdCh0aGlzLmRhdGFfbGlzdFttaW5faW5kZXggLSBpbmRleCAtIDFdKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgc2V0U3dhbGxvd1RvdWNoZXM6IGZ1bmN0aW9uIChzdGF0dXMpIHtcclxuICAgICAgICB0aGlzLnNjcm9sbF92aWV3LnNldFN3YWxsb3dUb3VjaGVzKHN0YXR1cyk7XHJcbiAgICB9LFxyXG5cclxuICAgIHNldEJvdW5jZUVuYWJsZWQ6IGZ1bmN0aW9uIChzdGF0dXMpIHtcclxuICAgICAgICB0aGlzLmJvdW5jZUVuYWJsZWQgPSBzdGF0dXM7XHJcbiAgICAgICAgaWYgKCF0aGlzLnNjcm9sbF92aWV3X2NvbXBlbmQpIHJldHVybjtcclxuICAgICAgICB0aGlzLnNjcm9sbF92aWV3X2NvbXBlbmQuZWxhc3RpYyA9IHN0YXR1cztcclxuICAgIH0sXHJcblxyXG4gICAgLy8g6K6+572uIHNjcm9sbHZpZXcg5piv5ZCm5Y+v54K5XHJcbiAgICBzZXRDbGlja0VuYWJsZWQ6IGZ1bmN0aW9uIChzdGF0dXMpIHtcclxuICAgICAgICB0aGlzLmNsaWNrRW5hYmxlZCA9IHN0YXR1cztcclxuICAgICAgICBpZiAoIXRoaXMuc2Nyb2xsX3ZpZXdfY29tcGVuZCkgcmV0dXJuO1xyXG4gICAgICAgIGlmIChzdGF0dXMpIHtcclxuICAgICAgICAgICAgdGhpcy5zY3JvbGxfdmlld19jb21wZW5kLm5vZGUub24oY2MuTm9kZS5FdmVudFR5cGUuVE9VQ0hfU1RBUlQsIHRoaXMuc2Nyb2xsX3ZpZXdfY29tcGVuZC5fb25Ub3VjaEJlZ2FuLCB0aGlzLnNjcm9sbF92aWV3X2NvbXBlbmQsIHRydWUpO1xyXG4gICAgICAgICAgICB0aGlzLnNjcm9sbF92aWV3X2NvbXBlbmQubm9kZS5vbihjYy5Ob2RlLkV2ZW50VHlwZS5UT1VDSF9NT1ZFLCB0aGlzLnNjcm9sbF92aWV3X2NvbXBlbmQuX29uVG91Y2hNb3ZlZCwgdGhpcy5zY3JvbGxfdmlld19jb21wZW5kLCB0cnVlKTtcclxuICAgICAgICAgICAgdGhpcy5zY3JvbGxfdmlld19jb21wZW5kLm5vZGUub24oY2MuTm9kZS5FdmVudFR5cGUuVE9VQ0hfRU5ELCB0aGlzLnNjcm9sbF92aWV3X2NvbXBlbmQuX29uVG91Y2hFbmRlZCwgdGhpcy5zY3JvbGxfdmlld19jb21wZW5kLCB0cnVlKTtcclxuICAgICAgICAgICAgdGhpcy5zY3JvbGxfdmlld19jb21wZW5kLm5vZGUub24oY2MuTm9kZS5FdmVudFR5cGUuVE9VQ0hfQ0FOQ0VMLCB0aGlzLnNjcm9sbF92aWV3X2NvbXBlbmQuX29uVG91Y2hDYW5jZWxsZWQsIHRoaXMuc2Nyb2xsX3ZpZXdfY29tcGVuZCwgdHJ1ZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5zY3JvbGxfdmlld19jb21wZW5kLm5vZGUub2ZmKGNjLk5vZGUuRXZlbnRUeXBlLlRPVUNIX1NUQVJULCB0aGlzLnNjcm9sbF92aWV3X2NvbXBlbmQuX29uVG91Y2hCZWdhbiwgdGhpcy5zY3JvbGxfdmlld19jb21wZW5kLCB0cnVlKTtcclxuICAgICAgICAgICAgdGhpcy5zY3JvbGxfdmlld19jb21wZW5kLm5vZGUub2ZmKGNjLk5vZGUuRXZlbnRUeXBlLlRPVUNIX01PVkUsIHRoaXMuc2Nyb2xsX3ZpZXdfY29tcGVuZC5fb25Ub3VjaE1vdmVkLCB0aGlzLnNjcm9sbF92aWV3X2NvbXBlbmQsIHRydWUpO1xyXG4gICAgICAgICAgICB0aGlzLnNjcm9sbF92aWV3X2NvbXBlbmQubm9kZS5vZmYoY2MuTm9kZS5FdmVudFR5cGUuVE9VQ0hfRU5ELCB0aGlzLnNjcm9sbF92aWV3X2NvbXBlbmQuX29uVG91Y2hFbmRlZCwgdGhpcy5zY3JvbGxfdmlld19jb21wZW5kLCB0cnVlKTtcclxuICAgICAgICAgICAgdGhpcy5zY3JvbGxfdmlld19jb21wZW5kLm5vZGUub2ZmKGNjLk5vZGUuRXZlbnRUeXBlLlRPVUNIX0NBTkNFTCwgdGhpcy5zY3JvbGxfdmlld19jb21wZW5kLl9vblRvdWNoQ2FuY2VsbGVkLCB0aGlzLnNjcm9sbF92aWV3X2NvbXBlbmQsIHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLy/mu5rliqjlrrnlmajnp7vliqjliLDmjIflrprkvY3nva5cclxuICAgIHVwZGF0ZU1vdmU6IGZ1bmN0aW9uIChwb3MpIHtcclxuICAgICAgICB2YXIgdGFyZ2V0X3BvcyA9IHRoaXMuY2hlY2tQb3NpdGlvbihwb3MueCwgcG9zLnkpO1xyXG4gICAgICAgIHZhciBtb3ZlX3RvID0gY2MubW92ZVRvKDAuMSwgdGFyZ2V0X3Bvcy54LCB0YXJnZXRfcG9zLnkpLmVhc2luZyhjYy5lYXNlQmFja091dCgpKTtcclxuICAgICAgICB0aGlzLmNvbnRhaW5lci5ydW5BY3Rpb24obW92ZV90byk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8v6Lez6L2s5oyH5a6a5L2N572uXHJcbiAgICBqdW1wVG9Nb3ZlOiBmdW5jdGlvbiAocG9zLCB0aW1lLCBjYWxsYmFjaykge1xyXG4gICAgICAgIHZhciB0YXJnZXRfcG9zID0gdGhpcy5jaGVja1Bvc2l0aW9uKHBvcy54LCBwb3MueSk7XHJcbiAgICAgICAgdGltZSA9IHRpbWUgPT0gbnVsbD8gMSA6IHRpbWU7XHJcbiAgICAgICAgdmFyIG1vdmVfdG8gPSBjYy5tb3ZlVG8odGltZSwgY2MudjIodGFyZ2V0X3Bvcy54LCB0YXJnZXRfcG9zLnkpKTtcclxuICAgICAgICB0aGlzLmNvbnRhaW5lci5ydW5BY3Rpb24oY2Muc2VxdWVuY2UobW92ZV90bywgY2MuY2FsbEZ1bmMoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAoY2FsbGJhY2spIHtcclxuICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KSkpICAgICAgICAgLy/or6Xmlrnms5XlnKjmu5rliqjnmoTml7blgJnlubbkuI3og73op6blj5FzY3JvbGzoh6rlt7HnmoTnm5HlkKzvvIzmnaXmm7TmlrDmlbDmja4s5rOo6YeK5o6JXHJcbiAgICB9LFxyXG5cclxuICAgIGp1bXBUb01vdmVfMjpmdW5jdGlvbihwb3MsIHRpbWUsIGNhbGxiYWNrKXtcclxuICAgICAgICB2YXIgdGFyZ2V0X3BvcyA9IHRoaXMuY2hlY2tQb3NpdGlvbihwb3MueCwgcG9zLnkpO1xyXG4gICAgICAgIHRpbWUgPSB0aW1lID09IG51bGw/IDEgOiB0aW1lO1xyXG4gICAgICAgIHZhciBtb3ZlX3RvID0gY2MubW92ZVRvKHRpbWUsIGNjLnYyKHRhcmdldF9wb3MueCwgdGFyZ2V0X3Bvcy55KSk7XHJcbiAgICAgICAgdGhpcy5jb250YWluZXIucnVuQWN0aW9uKGNjLnNlcXVlbmNlKG1vdmVfdG8sIGNjLmNhbGxGdW5jKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7XHJcbiAgICAgICAgICAgICAgICBjYWxsYmFjaygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSkpKSAgICAgICAgIC8v6K+l5pa55rOV5Zyo5rua5Yqo55qE5pe25YCZ5bm25LiN6IO96Kem5Y+Rc2Nyb2xs6Ieq5bex55qE55uR5ZCs77yM5p2l5pu05paw5pWw5o2uLOazqOmHiuaOiVxyXG4gICAgICAgIC8vIHZhciBzaXplID0gdGhpcy5jb250YWluZXIuZ2V0Q29udGVudFNpemUoKTtcclxuICAgICAgICAvLyB0aGlzLnNjcm9sbF92aWV3X2NvbXBlbmQuc2Nyb2xsVG8oY2MudjIodGFyZ2V0X3Bvcy54IC8gc2l6ZS53aWR0aCwgdGFyZ2V0X3Bvcy55IC8gc2l6ZS5oZWlnaHQpLCB0aW1lKTtcclxuICAgICAgICAvLyB0aGlzLmNvbnRhaW5lci5ydW5BY3Rpb24oY2Muc2VxdWVuY2UoY2MuZGVsYXlUaW1lKDApLGNjLmNhbGxGdW5jKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAvLyAgICAgaWYgKGNhbGxiYWNrKSB7XHJcbiAgICAgICAgLy8gICAgICAgICBjYWxsYmFjaygpO1xyXG4gICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgLy8gfSkpKVxyXG4gICAgfSxcclxuXHJcbiAgICBnZXRDdXJDb250YWluZXJQb3NZOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuY29udGFpbmVyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnRhaW5lci55O1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgZ2V0Q3VyQ29udGFpbmVyUG9zWDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmNvbnRhaW5lcikge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb250YWluZXIueDtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8v55uR5rWL55uu5qCH54K55L2N572uXHJcbiAgICBjaGVja1Bvc2l0aW9uOiBmdW5jdGlvbiAoeCwgeSkge1xyXG4gICAgICAgIGlmKHRoaXMucm9vdF93bmQgPT0gbnVsbCl7XHJcbiAgICAgICAgICAgIHJldHVybiBjYy52MigwLCAwKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIF94ID0gdGhpcy5jb250YWluZXIueDtcclxuICAgICAgICB2YXIgX3kgPSB0aGlzLmNvbnRhaW5lci55O1xyXG4gICAgICAgIGlmICh0aGlzLmRpciA9PSBTY3JvbGxWaWV3RGlyLmhvcml6b250YWwpIHtcclxuICAgICAgICAgICAgX3ggPSBfeCArIHg7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmRpciA9PSBTY3JvbGxWaWV3RGlyLnZlcnRpY2FsKSB7XHJcbiAgICAgICAgICAgIF95ID0gX3kgKyB5O1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoX3ggPiAwKSB7XHJcbiAgICAgICAgICAgIF94ID0gMDtcclxuICAgICAgICB9IGVsc2UgaWYgKF94IDwgdGhpcy5zaXplLndpZHRoIC0gdGhpcy5jb250YWluZXJfc2l6ZS53aWR0aCkge1xyXG4gICAgICAgICAgICBfeCA9IHRoaXMuc2l6ZS53aWR0aCAtIHRoaXMuY29udGFpbmVyX3NpemUud2lkdGg7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChfeSA+IDApIHtcclxuICAgICAgICAgICAgX3kgPSAwO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoX3kgPCB0aGlzLnNpemUuaGVpZ2h0IC0gdGhpcy5jb250YWluZXJfc2l6ZS5oZWlnaHQpIHtcclxuICAgICAgICAgICAgX3kgPSB0aGlzLnNpemUuaGVpZ2h0IC0gdGhpcy5jb250YWluZXJfc2l6ZS5oZWlnaHQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjYy52MihfeCwgX3kpXHJcbiAgICB9LFxyXG5cclxuICAgIC8v6K6+572u5rua5Yqo5a655Zmo55qE5aSn5bCPXHJcbiAgICBzZXRJbm5lckNvbnRhaW5lcjogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHZhciBzaXplID0gMDtcclxuICAgICAgICBpZiAodGhpcy5kYXRhX2xpc3QpIHtcclxuICAgICAgICAgICAgc2l6ZSA9IHRoaXMuZGF0YV9saXN0Lmxlbmd0aDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIGNvbnRhaW5lcl93aWR0aCA9IHRoaXMuc2l6ZS53aWR0aDtcclxuICAgICAgICB2YXIgY29udGFpbmVyX2hlaWdodCA9IHRoaXMuc2l6ZS5oZWlnaHQ7XHJcbiAgICAgICAgdmFyIG51bSA9IDA7XHJcbiAgICAgICAgaWYgKHRoaXMuZGlyID09IFNjcm9sbFZpZXdEaXIuaG9yaXpvbnRhbCkge1xyXG4gICAgICAgICAgICBudW0gPSBNYXRoLmNlaWwoc2l6ZSAvIHRoaXMucm93KTtcclxuICAgICAgICAgICAgY29udGFpbmVyX3dpZHRoID0gbnVtICogdGhpcy5pdGVtX3dpZHRoICsgMiAqIHRoaXMuc3RhcnRfeCArIChudW0gLSAxKSAqIHRoaXMuc3BhY2VfeDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBudW0gPSBNYXRoLmNlaWwoc2l6ZSAvIHRoaXMuY29sKTtcclxuICAgICAgICAgICAgaWYoIXRoaXMuaXNfY2hhbmdlKXtcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lcl9oZWlnaHQgPSBudW0gKiB0aGlzLml0ZW1faGVpZ2h0ICsgMiAqIHRoaXMuc3RhcnRfeSArIChudW0gLSAxKSAqIHRoaXMuc3BhY2VfeTtcclxuICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICBjb250YWluZXJfaGVpZ2h0ID0gbnVtICogdGhpcy5pdGVtX2hlaWdodCArIDIgKiB0aGlzLnN0YXJ0X3kgKyBudW0gKiB0aGlzLnNwYWNlX3k7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnRhaW5lcl93aWR0aCA9IE1hdGgubWF4KGNvbnRhaW5lcl93aWR0aCwgdGhpcy5zaXplLndpZHRoKTtcclxuICAgICAgICBjb250YWluZXJfaGVpZ2h0ID0gTWF0aC5tYXgoY29udGFpbmVyX2hlaWdodCwgdGhpcy5zaXplLmhlaWdodCk7XHJcbiAgICAgICAgdGhpcy5jb250YWluZXJfc2l6ZSA9IGNjLnNpemUoY29udGFpbmVyX3dpZHRoLCBjb250YWluZXJfaGVpZ2h0KTtcclxuICAgICAgICBpZiAodGhpcy5jb250YWluZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5jb250YWluZXIuc2V0Q29udGVudFNpemUodGhpcy5jb250YWluZXJfc2l6ZS53aWR0aCx0aGlzLmNvbnRhaW5lcl9zaXplLmhlaWdodCArIHRoaXMuYm90dG9tKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc2Nyb2xsX3ZpZXdfY29tcGVuZCkge1xyXG4gICAgICAgICAgICB0aGlzLnNjcm9sbF92aWV3X2NvbXBlbmQuc3RvcEF1dG9TY3JvbGwoKVxyXG4gICAgICAgICAgICBpZih0aGlzLmRpciA9PSBTY3JvbGxWaWV3RGlyLnZlcnRpY2FsKXtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnN0YXJ0X3BvcyA9PSBTY3JvbGxWaWV3U3RhcnRQb3MudG9wKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxfdmlld19jb21wZW5kLnNjcm9sbFRvVG9wKDApO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnN0YXJ0X3BvcyA9PSBTY3JvbGxWaWV3U3RhcnRQb3MuYm90dG9tKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxfdmlld19jb21wZW5kLnNjcm9sbFRvQm90dG9tKDApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9ZWxzZSBpZih0aGlzLmRpciA9PSBTY3JvbGxWaWV3RGlyLmhvcml6b250YWwpe1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhcnRfcG9zID09IFNjcm9sbFZpZXdTdGFydFBvcy50b3ApIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbF92aWV3X2NvbXBlbmQuc2Nyb2xsVG9MZWZ0KDApO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnN0YXJ0X3BvcyA9PSBTY3JvbGxWaWV3U3RhcnRQb3MuYm90dG9tKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxfdmlld19jb21wZW5kLnNjcm9sbFRvUmlnaHQgKDApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLy/orr7nva7mlbDmja5cclxuICAgIHNldERhdGE6IGZ1bmN0aW9uIChkYXRhX2xpc3QsIGNsaWNrX2NhbGxiYWNrLCBleHRlbmQpIHtcclxuICAgICAgICB0aGlzLmNsZWFyQ2FjaGVMaXN0KCk7XHJcbiAgICAgICAgaWYgKGRhdGFfbGlzdCA9PSBudWxsIHx8IFV0aWxzLm5leHQoZGF0YV9saXN0KSA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8g6L2s5o2i5LiA5LiL5a2Y5YKoLOS/neivgeS4jeaUueWPmOWOn+aVsOaNrlxyXG4gICAgICAgIHZhciBzd2l0Y2hMaXN0ID0gW11cclxuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgZGF0YV9saXN0Lmxlbmd0aDsgaW5kZXgrKykge1xyXG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gZGF0YV9saXN0W2luZGV4XTtcclxuICAgICAgICAgICAgc3dpdGNoTGlzdC5wdXNoKHsgZGF0YTogZWxlbWVudCwgaW5kZXg6IGluZGV4IH0pXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLml0ZW1fY2xpY2tfY2FsbGJhY2sgPSBjbGlja19jYWxsYmFjaztcclxuICAgICAgICB0aGlzLmRhdGFfbGlzdCA9IHN3aXRjaExpc3Q7XHJcbiAgICAgICAgdGhpcy5leHRlbmQgPSBleHRlbmQ7XHJcbiAgICAgICAgdGhpcy5jdXJfaXRlbV9jbGFzcyA9IHRoaXMuaXRlbV9jbGFzcztcclxuXHJcbiAgICAgICAgLy/orr7nva7lhoXpg6jmu5rliqjlrrnlmajnmoTlsLrlr7hcclxuICAgICAgICB0aGlzLnNldElubmVyQ29udGFpbmVyKCk7XHJcblxyXG4gICAgICAgIHZhciBpbmRleCA9IDA7XHJcbiAgICAgICAgdmFyIG9uY2VfbnVtID0gdGhpcy5vbmNlX251bSB8fCAxO1xyXG4gICAgICAgIC8v5aaC5p6c6ZyA6KaB5Yqo5oCB5Yib5bu655qE6K+dXHJcbiAgICAgICAgdmFyIHNpemUgPSB0aGlzLmRhdGFfbGlzdC5sZW5ndGg7XHJcbiAgICAgICAgaWYgKHRoaXMubmVlZF9keW5hbWljID09IHRydWUpIHtcclxuICAgICAgICAgICAgc2l6ZSA9IHRoaXMubWF4X3N1bSAtIDE7IC8v5Zug5Li6anPku44w5byA5aeL77yM5a6e6ZmF5Liq5pWw5Y2V5L2N5YeP5bCRMVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy/liKTmlq3ov5novrnmmK/lkKblt7Lnu4/liJvlu7rov4fnmoQs5aaC5p6c5Yib5bu66L+H55qE5bCx5LiN6ZyA6KaB5YiG5bin5Yib5bu65LqGLOebtOaOpWFkZOWQp1xyXG4gICAgICAgIGlmICh0aGlzLmN1cl9pdGVtX2NsYXNzICYmIHRoaXMuY2FjaGVfaXRlbV9wb29sLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaXplOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHZhciBkYXRhID0gdGhpcy5kYXRhX2xpc3RbaV07XHJcbiAgICAgICAgICAgICAgICBpZiAoZGF0YSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVMaXN0KGRhdGEpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGkgPT0gc2l6ZSAtIDEpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5lbmRfY2FsbEJhY2spIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbmRfY2FsbEJhY2soKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAodGhpcy50aW1lX3RpY2tldCA9PSBudWxsICYmIFV0aWxzLm5leHQodGhpcy5kYXRhX2xpc3QgfHwge30pICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudGltZV90aWNrZXQgPSBnY29yZS5UaW1lci5zZXQoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jb250YWluZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGF0YV9saXN0ID09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmVuZF9jYWxsQmFjaykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZW5kX2NhbGxCYWNrKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNsZWFyVGltZVRpY2tldCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IGluZGV4OyBpIDwgaW5kZXggKyBvbmNlX251bTsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN3aXRjaF9kYXRhID0gdGhpcy5kYXRhX2xpc3RbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN3aXRjaF9kYXRhICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVMaXN0KHN3aXRjaF9kYXRhKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCA9IGluZGV4ICsgb25jZV9udW07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPiBzaXplKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZW5kX2NhbGxCYWNrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZW5kX2NhbGxCYWNrKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJUaW1lVGlja2V0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pLmJpbmQodGhpcyksIHRoaXMuZGVsYXkgKiAxMCwgLTEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICB1cGRhdGVJdGVtRGF0YTogZnVuY3Rpb24gKGluZGV4LCBuZXdfZGF0YSkge1xyXG4gICAgICAgIHZhciBuZXdfaXRlbV9kYXRhID0geyBkYXRhOiBuZXdfZGF0YSwgaW5kZXg6IGluZGV4IH1cclxuICAgICAgICB0aGlzLmRhdGFfbGlzdFtpbmRleF0gPSBuZXdfaXRlbV9kYXRhO1xyXG5cclxuICAgICAgICB2YXIgaXRlbSA9IHRoaXMuZ2V0SXRlbShpbmRleCk7XHJcbiAgICAgICAgaWYgKGl0ZW0pIHtcclxuICAgICAgICAgICAgaXRlbS5zZXREYXRhKG5ld19kYXRhKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIHNldFN0YXJ0WDogZnVuY3Rpb24gKHgpIHtcclxuICAgICAgICB0aGlzLnN0YXJ0X3ggPSB4XHJcbiAgICB9LFxyXG5cclxuICAgIHNldFNwYWNlWTogZnVuY3Rpb24gKHNwYWNlX3ksaXNfY2hhbmdlKSB7XHJcbiAgICAgICAgdGhpcy5zcGFjZV95ID0gc3BhY2VfeTtcclxuICAgICAgICB0aGlzLmlzX2NoYW5nZSA9IGlzX2NoYW5nZTtcclxuICAgIH0sXHJcblxyXG4gICAgY2xlYXJUaW1lVGlja2V0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMudGltZV90aWNrZXQgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBnY29yZS5UaW1lci5kZWwodGhpcy50aW1lX3RpY2tldCk7XHJcbiAgICAgICAgICAgIHRoaXMudGltZV90aWNrZXQgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLy/ph43orr7mu5rliqjljLrln5/lpKflsI9cclxuICAgIHJlc2V0U2l6ZTogZnVuY3Rpb24gKHNpemUsIHBvcykge1xyXG4gICAgICAgIGlmIChzaXplID09IG51bGwpXHJcbiAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgIGlmIChzaXplLndpZHRoID09IHRoaXMuc2l6ZS53aWR0aCAmJiBzaXplLmhlaWdodCA9PSB0aGlzLnNpemUuaGVpZ2h0KVxyXG4gICAgICAgICAgICByZXR1cm5cclxuICAgICAgICB0aGlzLnNpemUgPSBzaXplO1xyXG4gICAgICAgIGlmICh0aGlzLnJvb3Rfd25kKVxyXG4gICAgICAgICAgICB0aGlzLnJvb3Rfd25kLnNldENvbnRlbnRTaXplKHNpemUpO1xyXG4gICAgICAgIGlmICh0aGlzLnNjcm9sbF92aWV3KVxyXG4gICAgICAgICAgICB0aGlzLnNjcm9sbF92aWV3LnNldENvbnRlbnRTaXplKHNpemUpO1xyXG4gICAgICAgIGlmICh0aGlzLnNjcm9sbF92aWV3X21hc2spXHJcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsX3ZpZXdfbWFzay5zZXRDb250ZW50U2l6ZShzaXplKTtcclxuICAgICAgICBpZiAodGhpcy5yb290X3duZCAmJiBwb3MpXHJcbiAgICAgICAgICAgIHRoaXMucm9vdF93bmQuc2V0UG9zaXRpb24ocG9zKTtcclxuICAgICAgICB0aGlzLmNhbGN1bGF0aW9uTWF4U3VtKCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5pqC5YGc6K6h5pe25ZmoLOS7peWPiuWbnuaUtuaOieS5i+WJjeWIm+W7uueahOWvueixoVxyXG4gICAgICovXHJcbiAgICBjbGVhckNhY2hlTGlzdDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHRoaXMuY2xlYXJUaW1lVGlja2V0KCk7XHJcblxyXG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLmNhY2hlX2l0ZW1fbGlzdC5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuY2FjaGVfaXRlbV9saXN0W2luZGV4XTtcclxuICAgICAgICAgICAgaWYgKGVsZW1lbnQgJiYgZWxlbWVudC5zdXNwZW5kQWxsQWN0aW9ucykge1xyXG4gICAgICAgICAgICAgICAgZWxlbWVudC5zdXNwZW5kQWxsQWN0aW9ucygpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5jYWNoZV9pdGVtX3Bvb2wucHVzaChlbGVtZW50KVxyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5jYWNoZV9pdGVtX3Bvb2wubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmNhY2hlX2l0ZW1fcG9vbFtpbmRleF07XHJcbiAgICAgICAgICAgIGlmIChlbGVtZW50ICYmIGVsZW1lbnQuc2V0VmlzaWJsZSkge1xyXG4gICAgICAgICAgICAgICAgZWxlbWVudC5jdXJfdmlzaWJsZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgZWxlbWVudC5zZXRWaXNpYmxlKGZhbHNlLHRoaXMuZGlyKVxyXG4gICAgICAgICAgICAgICAgLy8gZWxlbWVudC5zZXRQb3NWaXNpYmxlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5jYWNoZV9pdGVtX2xpc3QgPSBbXTtcclxuICAgIH0sXHJcblxyXG4gICAgYWRkRW5kQ2FsbEJhY2s6IGZ1bmN0aW9uIChjYWxsX2JhY2spIHtcclxuICAgICAgICB0aGlzLmVuZF9jYWxsQmFjayA9IGNhbGxfYmFjaztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDliJvlu7rlhbfkvZPkuovkvotcclxuICAgICAqIEBwYXJhbSB7Kn0gZGF0YSDov5nkuKrmlbDmja7mmK/ovazmjaLkuYvlkI7nmoTmlbDmja4s5Zug5Li65Li65LqG5LiN5pS55Y+Y5pWw5o2u57uT5p6ELOaJgOS7pei9rOaNouS6hiDljIXlkKsgZGF0YSDlkowgaW5kZXgs5YW25LitZGF0YeaJjeaYr+ecn+WunuaVsOaNrlxyXG4gICAgICovXHJcbiAgICBjcmVhdGVMaXN0OiBmdW5jdGlvbiAoc3dpdGNoX2RhdGEpIHtcclxuICAgICAgICBpZiAoc3dpdGNoX2RhdGEgPT0gbnVsbCB8fCBzd2l0Y2hfZGF0YS5kYXRhID09IG51bGwgfHwgc3dpdGNoX2RhdGEuaW5kZXggPT0gbnVsbClcclxuICAgICAgICAgICAgcmV0dXJuXHJcblxyXG4gICAgICAgIGlmICh0aGlzLmN1cl9pdGVtX2NsYXNzID09IG51bGwpXHJcbiAgICAgICAgICAgIHJldHVyblxyXG5cclxuICAgICAgICAvLyBpZiAodGhpcy5jYWNoZV9pdGVtX2xpc3Rbc3dpdGNoX2RhdGEuaW5kZXhdKSB7XHJcbiAgICAgICAgLy8gICAgIHZhciBpdGVtID0gdGhpcy5jYWNoZV9pdGVtX2xpc3Rbc3dpdGNoX2RhdGEuaW5kZXhdXHJcbiAgICAgICAgLy8gICAgIGl0ZW0uc2V0VmlzaWJsZSh0cnVlKVxyXG4gICAgICAgIC8vICAgICByZXR1cm5cclxuICAgICAgICAvLyB9XHJcblxyXG4gICAgICAgIHZhciBpdGVtID0gbnVsbDtcclxuICAgICAgICBpZiAodGhpcy5jYWNoZV9pdGVtX3Bvb2wubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgaWYodHlwZW9mKHRoaXMuaXRlbV9jbGFzcykgPT0gXCJzdHJpbmdcIil7XHJcbiAgICAgICAgICAgICAgICBpdGVtID0gSXRlbXNQb29sLmdldEluc3RhbmNlKCkuZ2V0SXRlbSh0aGlzLml0ZW1fY2xhc3MpO1xyXG4gICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgIGl0ZW0gPSBuZXcgdGhpcy5pdGVtX2NsYXNzKHRoaXMuaXRlbV9vYmopO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGl0ZW0uc2V0UGFyZW50KHRoaXMuY29udGFpbmVyKTtcclxuICAgICAgICAgICAgaWYgKGl0ZW0uc2hvdylcclxuICAgICAgICAgICAgICAgIGl0ZW0uc2hvdygpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGl0ZW0uc2V0U2NhbGUpIHtcclxuICAgICAgICAgICAgICAgIGl0ZW0uc2V0U2NhbGUodGhpcy5zY2FsZSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmKHRoaXMuaXNaSW5kZXgpe1xyXG4gICAgICAgICAgICAgICAgaWYodGhpcy5pc1pJbmRleCA9PSAxKXtcclxuICAgICAgICAgICAgICAgICAgICBpZihpdGVtLnNldFpJbmRleCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uc2V0WkluZGV4KHN3aXRjaF9kYXRhLmluZGV4KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9ZWxzZSBpZih0aGlzLmlzWkluZGV4ID09IDIpe1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKGl0ZW0uc2V0WkluZGV4ICYmIHRoaXMuZGF0YV9saXN0KXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5zZXRaSW5kZXgodGhpcy5kYXRhX2xpc3QubGVuZ3RoLXN3aXRjaF9kYXRhLmluZGV4KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaXRlbSA9IHRoaXMuY2FjaGVfaXRlbV9wb29sLnNoaWZ0KClcclxuICAgICAgICAgICAgaWYgKGl0ZW0uc2V0VmlzaWJsZSkge1xyXG4gICAgICAgICAgICAgICAgaXRlbS5zZXRWaXNpYmxlKHRydWUsdGhpcy5kaXIpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgTG9nLmVycm9yKFwi5rKh5pyJ6K6+572u5pi+56S65o6l5Y+j5ZWKISEhXCIpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy/kuLTml7bkvb/nlKhcclxuICAgICAgICBpdGVtLnRtcF9pbmRleCA9IHN3aXRjaF9kYXRhLmluZGV4O1xyXG4gICAgICAgIHRoaXMuY2FjaGVfaXRlbV9saXN0LnB1c2goaXRlbSk7ICAgIC8v55Sx5LqOYXJyYXnmlbDnu4TnmoTmgKfotKjvvIzmnIllbXB0eeaVsOaNruS5n+eul+S9nOS4gOS4qumVv+W6pu+8jOaJgOS7peeUqHB1c2jmlrnms5VcclxuXHJcbiAgICAgICAgLy/mi5PlsZXlj4LmlbBcclxuICAgICAgICBpZiAodGhpcy5leHRlbmQgIT0gbnVsbCAmJiBpdGVtLnNldEV4dGVuZERhdGEpIHtcclxuICAgICAgICAgICAgaXRlbS5zZXRFeHRlbmREYXRhKHRoaXMuZXh0ZW5kKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8g6K6+572u5L2N572uXHJcbiAgICAgICAgdGhpcy5zZXRJdGVtUG9zaXRpb24oaXRlbSwgc3dpdGNoX2RhdGEuaW5kZXgpO1xyXG5cclxuICAgICAgICAvLyDlm57osIPmlrnms5VcclxuICAgICAgICBpZiAodGhpcy5pdGVtX2NsaWNrX2NhbGxiYWNrICE9IG51bGwpIHtcclxuICAgICAgICAgICAgaWYgKGl0ZW0uYWRkQ2FsbEJhY2spIHtcclxuICAgICAgICAgICAgICAgIGl0ZW0uYWRkQ2FsbEJhY2sodGhpcy5pdGVtX2NsaWNrX2NhbGxiYWNrKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpdGVtLnNldERhdGEoc3dpdGNoX2RhdGEuZGF0YSwgdGhpcy5pc19oaWRlX2VmZmVjdCk7XHJcbiAgICAgICAgdGhpcy5jdXJfbWluX2luZGV4ID0gc3dpdGNoX2RhdGEuaW5kZXg7XHJcbiAgICB9LFxyXG5cclxuICAgIC8v6K6+572u5b2T5YmN5a+56LGh55qE5L2N572uLOagueaNruaVsOaNrueahOS4tOaXtl9pbmRleOWOu+ehruWumlxyXG4gICAgc2V0SXRlbVBvc2l0aW9uOiBmdW5jdGlvbiAoaXRlbSwgaW5kZXgpIHtcclxuICAgICAgICB2YXIgY3VyX2l0ZW1faW5kZXggPSBOdW1iZXIoaW5kZXgpO1xyXG4gICAgICAgIHZhciBhbmNob3JfcG9pbnQgPSB7fTtcclxuICAgICAgICBhbmNob3JfcG9pbnQueCA9IDAuNTtcclxuICAgICAgICBhbmNob3JfcG9pbnQueSA9IDAuNTtcclxuICAgICAgICB2YXIgX3ggPSAwO1xyXG4gICAgICAgIHZhciBfeSA9IDA7XHJcbiAgICAgICAgLy/niLblrrnlmajnmoTnm7jlr7nplJrngrnkuLrvvIgwLDHvvIlcclxuICAgICAgICBpZiAodGhpcy5kaXIgPT0gU2Nyb2xsVmlld0Rpci5ob3Jpem9udGFsKSB7XHJcbiAgICAgICAgICAgIF94ID0gdGhpcy5zdGFydF94ICsgdGhpcy5pdGVtX3dpZHRoICogYW5jaG9yX3BvaW50LnggKyAodGhpcy5pdGVtX3dpZHRoICsgdGhpcy5zcGFjZV94KSAqIChNYXRoLmZsb29yKGN1cl9pdGVtX2luZGV4IC8gdGhpcy5yb3cpKTtcclxuICAgICAgICAgICAgX3kgPSB0aGlzLmNvbnRhaW5lcl9zaXplLmhlaWdodCAtICh0aGlzLnN0YXJ0X3kgKyB0aGlzLml0ZW1faGVpZ2h0ICogKDEgLSBhbmNob3JfcG9pbnQueSkgKyAoY3VyX2l0ZW1faW5kZXggJSB0aGlzLnJvdykgKiAodGhpcy5pdGVtX2hlaWdodCArIHRoaXMuc3BhY2VfeSkpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnN0YXJ0X3BvcyA9PSBTY3JvbGxWaWV3U3RhcnRQb3MudG9wKSB7XHJcbiAgICAgICAgICAgICAgICBfeCA9IHRoaXMuc3RhcnRfeCArIHRoaXMuaXRlbV93aWR0aCAqIGFuY2hvcl9wb2ludC54ICsgKHRoaXMuaXRlbV93aWR0aCArIHRoaXMuc3BhY2VfeCkgKiAoY3VyX2l0ZW1faW5kZXggJSB0aGlzLmNvbCk7XHJcbiAgICAgICAgICAgICAgICBfeSA9IHRoaXMuY29udGFpbmVyX3NpemUuaGVpZ2h0IC0gKHRoaXMuc3RhcnRfeSArIHRoaXMuaXRlbV9oZWlnaHQgKiAoMSAtIGFuY2hvcl9wb2ludC55KSArIChNYXRoLmZsb29yKGN1cl9pdGVtX2luZGV4IC8gdGhpcy5jb2wpKSAqICh0aGlzLml0ZW1faGVpZ2h0ICsgdGhpcy5zcGFjZV95KSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBfeCA9IHRoaXMuc3RhcnRfeCArIHRoaXMuaXRlbV93aWR0aCAqIGFuY2hvcl9wb2ludC54ICsgKHRoaXMuaXRlbV93aWR0aCArIHRoaXMuc3BhY2VfeCkgKiAoY3VyX2l0ZW1faW5kZXggJSB0aGlzLmNvbClcclxuICAgICAgICAgICAgICAgIF95ID0gdGhpcy5zdGFydF95ICsgdGhpcy5pdGVtX2hlaWdodCAqIGFuY2hvcl9wb2ludC55ICsgKE1hdGguZmxvb3IoY3VyX2l0ZW1faW5kZXggLyB0aGlzLmNvbCkpICogKHRoaXMuaXRlbV9oZWlnaHQgKyB0aGlzLnNwYWNlX3kpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaXRlbS5zZXRQb3NpdGlvbihfeCwgX3krdGhpcy5ib3R0b20pXHJcbiAgICB9LFxyXG5cclxuICAgIHJlc2V0Q3VycmVudEl0ZW1zOiBmdW5jdGlvbigpIHtcclxuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5jYWNoZV9pdGVtX2xpc3QubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmNhY2hlX2l0ZW1fbGlzdFtpbmRleF0gJiYgdGhpcy5jYWNoZV9pdGVtX2xpc3RbaW5kZXhdLnNldERhdGEpIHtcclxuICAgICAgICAgICAgICAgIHZhciBjdXJfZGF0YSA9IHRoaXMuZGF0YV9saXN0W3RoaXMuY2FjaGVfaXRlbV9saXN0W2luZGV4XS50bXBfaW5kZXhdO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jYWNoZV9pdGVtX2xpc3RbaW5kZXhdLnNldERhdGEoY3VyX2RhdGEuZGF0YSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8v6I635Y+W5bey5Yib5bu655qE5YWo6YOo5a+56LGhXHJcbiAgICBnZXRJdGVtTGlzdDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHZhciBpdGVtX2xpc3QgPSBbXTtcclxuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5jYWNoZV9pdGVtX2xpc3QubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmNhY2hlX2l0ZW1fbGlzdFtpbmRleF07XHJcbiAgICAgICAgICAgIGl0ZW1fbGlzdC5wdXNoKGVsZW1lbnQpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBpdGVtX2xpc3RcclxuICAgIH0sXHJcblxyXG4gICAgZ2V0SXRlbTogZnVuY3Rpb24gKHRtcF9pbmRleCkge1xyXG4gICAgICAgIGZvciAodmFyIGl0ZW1faSBpbiB0aGlzLmNhY2hlX2l0ZW1fbGlzdCkge1xyXG4gICAgICAgICAgICB2YXIgaXRlbSA9IHRoaXMuY2FjaGVfaXRlbV9saXN0W2l0ZW1faV07XHJcbiAgICAgICAgICAgIGlmIChpdGVtLnRtcF9pbmRleCA9PSB0bXBfaW5kZXgpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpdGVtXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfSxcclxuXHJcbiAgICBzZXRSb290VmlzaWJsZTogZnVuY3Rpb24gKGJvb2wpIHtcclxuICAgICAgICBpZiAodGhpcy5yb290X3duZCkge1xyXG4gICAgICAgICAgICB0aGlzLnJvb3Rfd25kLmFjdGl2ZSA9IGJvb2w7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcblxyXG4gICAgLy/nlKjkuo7lop7lh4/nmoTml7blgJnmk43kvZws6ZyA6KaB5Lyg5Y675pyA5paw55qETGlzdFxyXG4gICAgcmVzZXRBZGRQb3NpdGlvbjogZnVuY3Rpb24gKGxpc3QsIHNvcnRfZnVuKSB7XHJcbiAgICAgICAgaWYgKGxpc3QgPT0gbnVsbCB8fCBVdGlscy5uZXh0KGxpc3QpID09IG51bGwpXHJcbiAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgIGlmIChzb3J0X2Z1biAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIGxpc3Quc29ydChzb3J0X2Z1bilcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIHN3aWNoX2xpc3QgPSBbXVxyXG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBsaXN0Lmxlbmd0aDsgaW5kZXgrKykge1xyXG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gbGlzdFtpbmRleF07XHJcbiAgICAgICAgICAgIHN3aWNoX2xpc3QucHVzaCh7IGRhdGE6IGVsZW1lbnQsIGluZGV4OiBpbmRleCB9KVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmRhdGFfbGlzdCA9IHN3aWNoX2xpc3Q7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmNhY2hlX2l0ZW1fbGlzdCA9PSBudWxsIHx8IFV0aWxzLm5leHQodGhpcy5jYWNoZV9pdGVtX2xpc3QpID09IG51bGwpXHJcbiAgICAgICAgICAgIHJldHVyblxyXG5cclxuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5jYWNoZV9pdGVtX2xpc3QubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgICAgICAgIHZhciBpdGVtID0gdGhpcy5jYWNoZV9pdGVtX2xpc3RbaW5kZXhdOyAgICAgICAgICAgLy8g5a+56LGhXHJcbiAgICAgICAgICAgIHZhciBzd2l0Y2hfZGF0YSA9IHN3aWNoX2xpc3RbaXRlbS50bXBfaW5kZXhdOyAgICAgICAvLyDmlbDmja7lr7nosaFcclxuXHJcbiAgICAgICAgICAgIGlmIChzd2l0Y2hfZGF0YSAmJiBpdGVtLnNldERhdGEgJiYgc3dpdGNoX2RhdGEuZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgaXRlbS5zZXREYXRhKHN3aXRjaF9kYXRhLmRhdGEpO1xyXG4gICAgICAgICAgICAgICAgaXRlbS5zZXRWaXNpYmxlKHRydWUsdGhpcy5kaXIpO1xyXG4gICAgICAgICAgICAgICAgaXRlbS50bXBfaW5kZXggPSBzd2l0Y2hfZGF0YS5pbmRleDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGl0ZW0uY3VyX3Zpc2libGUgPSBmYWxzZVxyXG4gICAgICAgICAgICAgICAgaXRlbS5zZXRWaXNpYmxlKGZhbHNlLHRoaXMuZGlyKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2FjaGVfaXRlbV9wb29sLnB1c2goaXRlbSlcclxuXHJcbiAgICAgICAgICAgICAgICAvLyDnp7vpmaTmjolcclxuICAgICAgICAgICAgICAgIHRoaXMuY2FjaGVfaXRlbV9saXN0LnNwbGljZShpbmRleCwgMSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLy/lr7nlvZPliY3liJvlu7rlr7nosaHlgZrmjpLluo8s5ZCM5pe25a+557yT5a2Y5pWw5o2u5YGa5o6S5bqPXHJcbiAgICByZXNldFBvc2l0aW9uOiBmdW5jdGlvbiAoc29ydF9mdW4sIGlzX2NsZWFyKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZGF0YV9saXN0ID09IG51bGwgfHwgVXRpbHMubmV4dCh0aGlzLmRhdGFfbGlzdCkgPT0gbnVsbClcclxuICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgaWYgKHNvcnRfZnVuICE9IG51bGwpIHtcclxuICAgICAgICAgICAgdGhpcy5kYXRhX2xpc3Quc29ydChzb3J0X2Z1bik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLmRhdGFfbGlzdC5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSB0aGlzLmRhdGFfbGlzdFtpbmRleF07XHJcbiAgICAgICAgICAgIGVsZW1lbnQuaW5kZXggPSBpbmRleFxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5jYWNoZV9pdGVtX2xpc3QgPT0gbnVsbCB8fCBVdGlscy5uZXh0KHRoaXMuY2FjaGVfaXRlbV9saXN0KSA9PSBudWxsKVxyXG4gICAgICAgICAgICByZXR1cm5cclxuXHJcbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMuY2FjaGVfaXRlbV9saXN0Lmxlbmd0aDsgaW5kZXgrKykge1xyXG4gICAgICAgICAgICB2YXIgaXRlbSA9IHRoaXMuY2FjaGVfaXRlbV9saXN0W2luZGV4XTtcclxuICAgICAgICAgICAgaWYgKGl0ZW0udG1wX2luZGV4KSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgc3dpdGNoX2RhdGEgPSB0aGlzLmRhdGFfbGlzdFtpdGVtLnRtcF9pbmRleF07XHJcbiAgICAgICAgICAgICAgICBpZiAoc3dpdGNoX2RhdGEgJiYgaXRlbS5zZXREYXRhICYmIHN3aXRjaF9kYXRhLmRhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICBpdGVtLnNldERhdGEoc3dpdGNoX2RhdGEuZGF0YSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5zZXRWaXNpYmxlKHRydWUsdGhpcy5kaXIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGl0ZW0udG1wX2luZGV4ID0gc3dpdGNoX2RhdGEuaW5kZXg7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8v6Kej5p6Q5pWw5o2uXHJcbiAgICBhbmFseXNpc1NldHRpbmc6IGZ1bmN0aW9uIChzZXR0aW5nKSB7XHJcbiAgICAgICAgdGhpcy5zZXR0aW5nID0gc2V0dGluZyB8fCB7fTtcclxuICAgICAgICB0aGlzLml0ZW1fY2xhc3MgPSB0aGlzLnNldHRpbmcuaXRlbV9jbGFzcztcclxuICAgICAgICB0aGlzLnN0YXJ0X3ggPSB0aGlzLnNldHRpbmcuc3RhcnRfeCB8fCAwICAgICAgICAgICAgICAgICAgICAgICAgLy/nrKzkuIDkuKrljZXlhYPnmoTotbfngrlYXHJcbiAgICAgICAgdGhpcy5zcGFjZV94ID0gdGhpcy5zZXR0aW5nLnNwYWNlX3ggfHwgMyAgICAgICAgICAgICAgICAgICAgICAgIC8vIOaoquWQkemXtOmalOepuumXtFxyXG4gICAgICAgIHRoaXMuc3RhcnRfeSA9IHRoaXMuc2V0dGluZy5zdGFydF95IHx8IDAgICAgICAgICAgICAgICAgICAgICAgICAvLyDnrKzkuIDkuKrljZXlhYPnmoTotbfngrlZXHJcbiAgICAgICAgdGhpcy5zcGFjZV95ID0gdGhpcy5zZXR0aW5nLnNwYWNlX3kgfHwgMyAgICAgICAgICAgICAgICAgICAgICAgIC8vIOerluWQkemXtOmalOepuumXtFxyXG4gICAgICAgIHRoaXMuaXRlbV93aWR0aCA9IHRoaXMuc2V0dGluZy5pdGVtX3dpZHRoIHx8IDExNSAgICAgICAgICAgICAgICAvLyDljZXlhYPnmoTlrr3luqZcclxuICAgICAgICB0aGlzLml0ZW1faGVpZ2h0ID0gdGhpcy5zZXR0aW5nLml0ZW1faGVpZ2h0IHx8IDExNSAgICAgICAgICAgICAgLy8g5Y2V5YWD55qE6auY5bqmXHJcbiAgICAgICAgdGhpcy5pc19yYWRpYW4gPSB0aGlzLnNldHRpbmcuaXNfcmFkaWFuIHx8IGZhbHNlICAgICAgICAgICAgICAgIC8v5piv5ZCm6KaB5byn5bqmXHJcbiAgICAgICAgdGhpcy5yb3cgPSB0aGlzLnNldHRpbmcucm93IHx8IDUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOihjOaVsCzkvZznlKjkuo7msLTlubPmlrnlkJHnmoTmu5rliqhcclxuICAgICAgICB0aGlzLmNvbCA9IHRoaXMuc2V0dGluZy5jb2wgfHwgNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g5YiX5pWwLOS9nOeUqOS6juWeguebtOaWueWQkeeahOa7muWKqFxyXG4gICAgICAgIHRoaXMuZGVsYXkgPSB0aGlzLnNldHRpbmcuZGVsYXkgfHwgMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDliJvlu7rlu7bov5/ml7bpl7RcclxuICAgICAgICB0aGlzLm9uY2VfbnVtID0gdGhpcy5zZXR0aW5nLm9uY2VfbnVtIHx8IDEgICAgICAgICAgICAgICAgICAgICAgLy8g5q+P5qyh5Yib5bu655qE5pWw6YePXHJcbiAgICAgICAgdGhpcy5zY2FsZSA9IHRoaXMuc2V0dGluZy5zY2FsZSB8fCAxICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8v57yp5pS+5YC8XHJcbiAgICAgICAgdGhpcy5uZWVkX2R5bmFtaWMgPSB0aGlzLnNldHRpbmcubmVlZF9keW5hbWljIHx8IGZhbHNlICAgICAgICAgIC8vIOaYr+WQpumcgOimgeWKqOaAgeWIm+W7uueahCBcclxuICAgICAgICB0aGlzLmlzX2hpZGVfZWZmZWN0ID0gdGhpcy5zZXR0aW5nLmlzX2hpZGVfZWZmZWN0IHx8IGZhbHNlXHJcbiAgICAgICAgdGhpcy5pdGVtX29iaiA9IHRoaXMuc2V0dGluZy5pdGVtX29iajsgICAgICAgICAgICAgICAgICAgICAgICAgIC8v57uZaXRlbV9jbGFzc+S8oOWFpem7mOiupOWPguaVsFxyXG4gICAgICAgIHRoaXMuYm90dG9tID0gdGhpcy5zZXR0aW5nLmJvdHRvbSB8fCAwICAgICAgICAgICAgICAgICAgICAgICAgLy/lupXpg6jpl7Tot51cclxuICAgICAgICB0aGlzLmNhbGN1bGF0aW9uTWF4U3VtKCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8v6K6h566X5LiA5LiL5LiA5bGP5pyA5aSa5Yib5bu655qE5Liq5pWwXHJcbiAgICBjYWxjdWxhdGlvbk1heFN1bTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHZhciBtYXhfc3VtO1xyXG4gICAgICAgIGlmICh0aGlzLmRpciA9PSBTY3JvbGxWaWV3RGlyLmhvcml6b250YWwpIHtcclxuICAgICAgICAgICAgbWF4X3N1bSA9IChNYXRoLmNlaWwodGhpcy5zaXplLndpZHRoIC8gKHRoaXMuaXRlbV93aWR0aCArIHRoaXMuc3BhY2VfeCkpICsgMSkgKiB0aGlzLnJvdztcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBtYXhfc3VtID0gKE1hdGguY2VpbCh0aGlzLnNpemUuaGVpZ2h0IC8gKHRoaXMuaXRlbV9oZWlnaHQgKyB0aGlzLnNwYWNlX3kpKSArIDEpICogdGhpcy5jb2w7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubWF4X3N1bSA9IG1heF9zdW07XHJcbiAgICB9LFxyXG5cclxuICAgIGdldE1heFNpemU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb250YWluZXJfc2l6ZVxyXG4gICAgfSxcclxuXHJcbiAgICBnZXRDb250YWluZXI6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb250YWluZXJcclxuICAgIH0sXHJcblxyXG4gICAgZGVsZXRlTWU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB0aGlzLkRlbGV0ZU1lKCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8v6K6+572u5rua5Yqo54q25oCB77yMZmFsc2Xlj5bmtojmu5rliqgsdHJ1ZeaBouWkjeWOn+adpeeahOa7muWKqOaWueWQkVxyXG4gICAgc2V0U2Nyb2xsU3RhdGU6IGZ1bmN0aW9uIChib29sKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2Nyb2xsX3ZpZXdfY29tcGVuZCkge1xyXG4gICAgICAgICAgICBpZiAoIWJvb2wpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsX3ZpZXdfY29tcGVuZC52ZXJ0aWNhbCA9IGZhbHNlXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbF92aWV3X2NvbXBlbmQuaG9yaXpvbnRhbCA9IGZhbHNlXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5kaXIgPT0gU2Nyb2xsVmlld0Rpci52ZXJ0aWNhbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsX3ZpZXdfY29tcGVuZC52ZXJ0aWNhbCA9IHRydWVcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxfdmlld19jb21wZW5kLmhvcml6b250YWwgPSB0cnVlXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnNjcm9sbF9zdGF0ZSA9IGJvb2w7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH0sXHJcblxyXG4gICAgc2V0VmlzaWJsZTpmdW5jdGlvbihib29sKXtcclxuICAgICAgICBpZih0aGlzLnJvb3Rfd25kICYmIGJvb2wgIT0gbnVsbCl7XHJcbiAgICAgICAgICAgIHRoaXMucm9vdF93bmQuYWN0aXZlID0gYm9vbDtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5piv5ZCm6K6+572uaXRlbeWxguasoeaOkuW6j1xyXG4gICAgICogdHlwZTogICAxOuato+WQkSAgMjrlj43lkJFcclxuICAgICAqL1xyXG4gICAgc2V0SXRlbVpJbmRleEJ5VHlwZTpmdW5jdGlvbih0eXBlKXtcclxuICAgICAgICB0aGlzLmlzWkluZGV4ID0gdHlwZTtcclxuICAgIH0sXHJcblxyXG4gICAgLy/np7vpmaTlr7nosaFcclxuICAgIERlbGV0ZU1lOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgLy8gZG9TdG9wQWxsQWN0aW9ucyhzZWxmLmNvbnRhaW5lcik7ICAgIC8v5LiN5riF5qWaSDXov5jpnIDkuI3pnIDopoHlronlhajliKTmlq3vvIzlhYjms6jph4rmjolcclxuICAgICAgICB0aGlzLmNsZWFyVGltZVRpY2tldCgpO1xyXG4gICAgICAgIHRoaXMuc2V0Q2xpY2tFbmFibGVkKGZhbHNlKVxyXG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLmNhY2hlX2l0ZW1fbGlzdC5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSB0aGlzLmNhY2hlX2l0ZW1fbGlzdFtpbmRleF07XHJcbiAgICAgICAgICAgIGlmIChlbGVtZW50LmRlbGV0ZU1lKSB7XHJcbiAgICAgICAgICAgICAgICBlbGVtZW50LmRlbGV0ZU1lKClcclxuICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBudWxsXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLmNhY2hlX2l0ZW1fcG9vbC5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSB0aGlzLmNhY2hlX2l0ZW1fcG9vbFtpbmRleF07XHJcbiAgICAgICAgICAgIGlmIChlbGVtZW50LmRlbGV0ZU1lKSB7XHJcbiAgICAgICAgICAgICAgICBlbGVtZW50LmRlbGV0ZU1lKClcclxuICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBudWxsXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5jYWNoZV9pdGVtX2xpc3QgPSBudWxsXHJcbiAgICAgICAgdGhpcy5jYWNoZV9pdGVtX3Bvb2wgPSBudWxsXHJcbiAgICAgICAgaWYodGhpcy5yb290X3duZCl7XHJcbiAgICAgICAgICAgIHRoaXMucm9vdF93bmQuZGVzdHJveSgpO1xyXG4gICAgICAgICAgICB0aGlzLnJvb3Rfd25kID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgTG9hZGVyTWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlbGVhc2VQcmVmYWIodGhpcy5wcmVmYWJQYXRoKTtcclxuICAgIH0sXHJcbn0pOyJdfQ==