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
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
 
                (function() {
                    var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
                    var __module = nodeEnv ? module : {exports:{}};
                    var __filename = 'preview-scripts/assets/Scripts/mod/mainui/mainui_controller.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, '37f9boahqlPopfky8EPYSid', 'mainui_controller');
// Scripts/mod/mainui/mainui_controller.js
 
"use strict";
 
function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
 
// --------------------------------------------------------------------
// @author: xxx@syg.com(必填, 创建模块的人员)
// @description:
//      这里填写详细说明,主要填写该模块的功能简要
// <br/>Create: 2018-11-27 17:07:15
// --------------------------------------------------------------------
var MainuiConst = require("mainui_const");
 
var BattleDramaController = require("battle_drama_controller");
 
var MainuiEvent = require("mainui_event"); // var FunctionIconVo = require("function_icon_vo");
 
 
var ActionConst = require("action_const");
 
var RoleController = require("role_controller");
 
var BattleEvent = require("battle_event");
 
var SceneConst = require("scene_const");
 
var BattleConst = require("battle_const");
 
var ArenaConst = require("arena_const"); // var WelfareController = require("welfare_controller");
 
 
var OrderactionConst = require("orderaction_const");
 
var MainUiController = cc.Class({
  "extends": BaseController,
  ctor: function ctor() {
    this.ui_fight_type = MainuiConst.ui_fight_type.main_scene;
  },
  // 初始化配置数据
  initConfig: function initConfig() {
    var MainUiModel = require("mainui_model");
 
    this.model = new MainUiModel();
    this.model.initConfig();
    this.relevance_ui_last_type = 0; // 上一个ui战斗类型
 
    this.relevance_battle_type = 0; // 当前请求的战斗类型
 
    this.relevance_ui_fight_type = 0; // 当前战斗类型想匹配的yu战斗类型
 
    this.relevance_params = 0; // 附带参数
 
    this.function_list = {}; //当前已经激活的图标,包含客户端自己的以及服务端的
 
    this.cache_tips_list = {}; //当前缓存的图标状态
 
    this.cache_wait_create_list = {}; //缓存待创建的图标,可能是等级不足,可能是关卡数不对
 
    this.cachesBtnRed = []; //因为主界面没创建先缓存红点信息
    // var MainuiNoticeView = require("mainui_notice_view");
    // this.notice_view = new MainuiNoticeView();
    // this.notice_view.open();
 
    this.cachesAwardList = []; //缓存奖励信息
  },
  // 返回当前的model
  getModel: function getModel() {
    return this.model;
  },
  // 注册监听事件
  registerEvents: function registerEvents() {
    //请求进入竞技场之前,需要告诉服务器,我要进去了,有没有真是战斗,快点告诉我
    if (this.combat_type_back_event == null) {
      this.combat_type_back_event = gcore.GlobalEvent.bind(BattleEvent.COMBAT_TYPE_BACK, function (combat_type, type) {
        if (type == 0) //不存在战斗
          this.openRelevanceWindowAtOnce(combat_type);
      }, this);
    } // 退出战斗需要打开进入战斗之前的一些窗体
 
 
    if (!this.battle_exit_event) {
      this.battle_exit_event = gcore.GlobalEvent.bind(EventId.EXIT_FIGHT, function (combat_type) {
        this.openRelevanceWindowAtOnce(combat_type);
      }.bind(this));
    }
 
    if (!this.update_drama_max_event) {
      this.update_drama_max_event = gcore.GlobalEvent.bind(require("battle_drama_event").BattleDrama_Update_Max_Id, function (max_id) {
        this.updateMainBtnStatus(max_id);
      }.bind(this));
    }
 
    if (this.init_main_event == null) {
      this.init_main_event = gcore.GlobalEvent.bind(EventId.EVT_ROLE_CREATE_SUCCESS, function () {
        gcore.GlobalEvent.unbind(this.init_main_event);
        this.init_main_event = null;
 
        if (this.role_change_event == null) {
          this.role_vo = RoleController.getInstance().getRoleVo();
 
          if (this.role_vo != null) {
            this.role_change_event = this.role_vo.bind(EventId.UPDATE_ROLE_ATTRIBUTE, function (key, value) {
              if (key == "lev") {
                this.checkFunctionByRoleLev(value);
 
                if (IS_SUBMIT) {
                  SDK.sdkSubmitUserData(4);
                } // World_bossController:getInstance():send20500()
 
              }
            }, this);
          }
        }
      }, this);
    }
  },
  // 注册协议接受事件
  registerProtocals: function registerProtocals() {
    this.RegisterProtocal(12742, this.on12742); // 通用获取物品奖励
  },
  // 打开主界面
  openMainUI: function openMainUI(status) {
    if (status == true) {
      if (this.mainui == null) {
        var MainUIView = require("mainui_view");
 
        this.mainui = new MainUIView();
        this.checkFunctionByRoleLev();
      }
 
      if (!this.mainui.getHideContainerStatus()) {
        this.mainui.open();
      }
 
      if (this.function_list) {
        for (var i in this.function_list) {
          var function_vo = this.function_list[i];
 
          if (function_vo) {
            this.mainui.addIcon(function_vo);
          }
        }
      } // 处理下方开启
      // if (this.max_dun_id) {
      //     this.mainui.checkUnLockStatus(this.max_dun_id);
      //     this.max_dun_id = null;
      // }
 
    } else {
      if (this.mainui) {
        this.mainui.close();
      }
    }
  },
  // 获取当前的面板
  getUIFightType: function getUIFightType() {
    return this.ui_fight_type;
  },
  // 设置当前面板数据
  setUIFightType: function setUIFightType(value) {
    this.ui_fight_type = value;
  },
  // 是否在剧情副本界面
  checkIsInDramaUIFight: function checkIsInDramaUIFight() {
    return this.ui_fight_type == MainuiConst.ui_fight_type.drama_scene;
  },
  // 切换主城状态,或者一些跳转也是要到这里来的
  changeMainUIStatus: function changeMainUIStatus(index, sub_type, data) {
    if (this.mainui) {
      // 这里需要判断某一些是否开启了
      if (sub_type == MainuiConst.sub_type.adventure) {
        var config = Config.city_data.data_base[SceneConst.CenterSceneBuild.adventure];
 
        if (config) {
          if (this.checkIsOpenByActivate(config.activate) == false) {
            message(config.desc);
            return;
          }
        }
      }
 
      this.mainui.changeMainUiStatus(index, sub_type, data);
    }
  },
  // 请求打开战斗相关的窗体,同时也包含了剧情副本的
  requestOpenBattleRelevanceWindow: function requestOpenBattleRelevanceWindow(battle_type, params) {
    var BattleController = require("battle_controller");
 
    var BattleConst = require("battle_const");
 
    this.relevance_ui_last_type = this.ui_fight_type;
    this.relevance_battle_type = battle_type;
    this.relevance_params = params;
    this.relevance_ui_fight_type = BattleConst.getUIFightByFightType(battle_type);
    this.setUIFightType(this.relevance_ui_fight_type);
    BattleController.getInstance().send20060(battle_type);
  },
  // 还原之前的ui战斗类型,因为可能几个带战斗类型的面板互相调用
  resetUIFightType: function resetUIFightType() {
    if (this.relevance_ui_last_type) {
      this.ui_fight_type = this.relevance_ui_last_type;
      this.relevance_ui_last_type = MainuiConst.ui_fight_type.normal;
    }
  },
  //打开关联窗体,这里针对世界boss又需要重新判断调整
  openRelevanceWindowAtOnce: function openRelevanceWindowAtOnce(combat_type) {
    var BattleConst = require("battle_const");
 
    if (combat_type == BattleConst.Fight_Type.WorldBoss || combat_type == BattleConst.Fight_Type.SingleBoss) {
      if (this.relevance_battle_type != BattleConst.Fight_Type.WorldBoss && self.relevance_battle_type != BattleConst.Fight_Type.SingleBoss) return;
    } else {
      if (this.relevance_battle_type != combat_type) return;
    }
 
    if (combat_type == BattleConst.Fight_Type.GuildDun) {
      require("guildboss_controller").getInstance().openMainWindow(true);
    } else if (combat_type == BattleConst.Fight_Type.StarTower) {
      require("startower_controller").getInstance().openMainView(true);
    } else if (combat_type == BattleConst.Fight_Type.Arena) {
      require("arena_controller").getInstance().openArenaLoopMathWindow(true);
    } else if (combat_type == BattleConst.Fight_Type.Endless) {
      require("endless_trail_controller").getInstance().openEndlessMainWindow(true);
    } else if (combat_type == BattleConst.Fight_Type.ExpeditFight) {
      require("heroexpedit_controller").getInstance().openHeroExpeditView(true);
    } else if (combat_type == BattleConst.Fight_Type.PrimusWar) {
      //荣耀神殿
      require("primus_controller").getInstance().openPrimusMainWindow(true);
    } else if (combat_type == BattleConst.Fight_Type.DungeonStone) {
      require("stone_dungeon_controller").getInstance().openStoneDungeonView(true);
    } else if (combat_type == BattleConst.Fight_Type.GuildWar) {
      require("guildwar_controller").getInstance().openMainWindow(true);
    } else if (combat_type == BattleConst.Fight_Type.Adventrue) {
      require("adventure_controller").getInstance().openAdventureMainWindow(true);
    } else if (combat_type == BattleConst.Fight_Type.LimitExercise) {
      require("limitexercise_controller").getInstance().openLimitExerciseChangeView(true);
    } else if (combat_type == BattleConst.Fight_Type.ElementWar) {
      require("element_controller").getInstance().openElementMainWindow(true);
    }
  },
  //处理主界面下面的5个红点, 如果data是nil则表示清空红点数据
  setBtnRedPoint: function setBtnRedPoint(id, data) {
    if (typeof id != "number") return;
 
    if (this.mainui) {
      this.mainui.updateBtnTipsPoint(id, data);
    } else {
      this.cachesBtnRed.push([id, data]);
    }
  },
  resetCachesRetData: function resetCachesRetData() {
    this.cachesBtnRed = [];
  },
  getCachesBtnRed: function getCachesBtnRed() {
    return this.cachesBtnRed;
  },
  // 返回当前所处的主界面标签
  getMainUIIndex: function getMainUIIndex() {
    if (this.mainui) {
      return this.mainui.getMainUIIndex();
    }
 
    return MainuiConst.btn_index.main_scene;
  },
  // 通用获取物品奖励
  on12742: function on12742(data) {
    if (data.asset_list.length == 0) return;
    this.openGetItemView(true, data.asset_list, data.source);
  },
  // 通用打开获取物品界面
  openGetItemView: function openGetItemView(status, list, source, extend, open_type) {
    if (!status) {
      if (this.exhibition_view) {
        if (this.cachesAwardList.length > 0) {
          var data = this.cachesAwardList[0];
          this.cachesAwardList.splice(0, 1);
          this.exhibition_view.open({
            list: data.list,
            source: data.source,
            extend: data.extend,
            open_type: open_type
          });
        } else {
          this.exhibition_view.close();
          this.exhibition_view = null;
        }
      }
    } else {
      if (list && list instanceof Array && list.length > 0) {
        if (this.exhibition_view) {
          this.cachesAwardList.push({
            list: list,
            source: source,
            extend: extend,
            open_type: open_type
          });
          return;
        }
 
        if (!this.exhibition_view) {
          this.exhibition_view = Utils.createClass("item_exhibition_window");
        }
 
        this.exhibition_view.open({
          list: list,
          source: source,
          extend: extend,
          open_type: open_type
        });
      }
    }
  },
  // 通用玩法规则面板
  openCommonExplainView: function openCommonExplainView(status, config, title_str) {
    if (status == false) {
      if (this.common_explain != null) {
        this.common_explain.close();
        this.common_explain = null;
      }
    } else {
      if (config == null || Utils.next(config) == null) return;
 
      if (this.common_explain == null) {
        this.common_explain = Utils.createClass("common_explain_window", this);
      }
 
      if (this.common_explain && this.common_explain.isOpen() == false) {
        this.common_explain.open([config, title_str]);
      }
    }
  },
  //点击活动图标
  iconClickHandle: function iconClickHandle(id, action_id) {
    if (id == null) return;
 
    if (id == MainuiConst.icon.welfare) {
      require("welfare_controller").getInstance().openMainWindow(true);
    } else if (id == MainuiConst.icon.mail) {
      require("mail_controller").getInstance().openMailUI(true);
    } else if (id == MainuiConst.icon.daily) {
      require("task_controller").getInstance().openTaskMainWindow(true);
    } else if (id == MainuiConst.icon.friend) {
      require("friend_controller").getInstance().openFriendWindow(true);
    } else if (id == MainuiConst.icon.rank) {
      require("rank_controller").getInstance().openMainView(true);
    } else if (id == MainuiConst.icon.charge) {
      require("vip_controller").getInstance().openVipMainWindow(true, VIPTABCONST.CHARGE);
    } else if (id == MainuiConst.icon.fund) {
      //超值基金
      require("welfare_controller").getInstance().openMainWindow(true, MainuiConst.icon.fund);
    } else if (id == MainuiConst.icon.first_charge_new || id == MainuiConst.icon.first_charge_new1) {
      require("newfirstcharge_controller").getInstance().openNewFirstChargeView(true);
    } else if (id == MainuiConst.icon.seven_login) {
      require("action_controller").getInstance().openSevenLoginWin(true);
    } else if (id == MainuiConst.icon.action || id == MainuiConst.icon.festival) {
      //限时活动,节日活动,竞猜活动
      require("action_controller").getInstance().openActionMainPanel(true, id);
    } else if (id == MainuiConst.icon.day_charge) {
      require("action_controller").getInstance().openActionMainPanel(true, null, 91005);
    } else if (id == MainuiConst.icon.godpartner) {
      require("action_controller").getInstance().openActionMainPanel(true, null, 93006);
    } else if (id == MainuiConst.icon.seven_goal || id == MainuiConst.icon.seven_goal1 || id == MainuiConst.icon.seven_goal2 || id == MainuiConst.icon.seven_goal3) {
      require("action_controller").getInstance().openSevenGoalView(true);
    } else if (id == MainuiConst.icon.lucky_treasure) {
      require("action_controller").getInstance().openLuckyTreasureWin(true);
    } else if (id == MainuiConst.icon.limit_gift_entry) {
      //限时礼包
      require("action_controller").getInstance().openActionLimitGiftMainWindow(true);
    } else if (id == MainuiConst.icon.day_first_charge) {
      //每日首充
      require("daycharge_controller").getInstance().openDayFirstChargeView(true);
    } else if (id == MainuiConst.icon.vedio) {
      //录像馆
      require("vedio_controller").getInstance().openVedioMainWindow(true);
    } else if (id == MainuiConst.icon.guildwar) {
      //公会战
      this.requestOpenBattleRelevanceWindow(BattleConst.Fight_Type.GuildWar);
    } else if (id == MainuiConst.icon.champion) {
      //冠军赛
      require("mainscene_controller").getInstance().openBuild(SceneConst.CenterSceneBuild.arena, ArenaConst.arena_type.rank);
    } else if (id == MainuiConst.icon.limit_recruit) {
      //限时招募
      require("recruithero_controller").getInstance().openRecruitHeroWindow(true);
    } else if (id == MainuiConst.icon.shrh_share) {
      //深海融合分享
      require("welfare_controller").getInstance().openMainWindow(true, 8007);
    } else if (id == MainuiConst.icon.shrh_sub) {
      //深海融合关注
      require("welfare_controller").getInstance().openMainWindow(true, 8014);
    } else if (id == MainuiConst.icon.shrh_realname) {
      //深海融合实名
      if (PLATFORM_TYPR == "SH_RH") {
        SDK.realname({
          apiType: "askShow"
        });
      }
    } else if (id == OrderactionConst.OrderActionEntranceID.entrance_id) {
      //战令活动
      require("orderaction_controller").getInstance().openOrderActionMainView(true);
    } else if (id == MainuiConst.icon.give_vip) {
      //免费vip活动
      require("vip_controller").getInstance().openVipAwardWindow(true);
    } else if (id == MainuiConst.icon.trigger_gift) {
      //触发礼包
      require("action_controller").getInstance().openTriggerGiftWindow(true);
 
      if (this.getFunctionIconById(MainuiConst.icon.trigger_gift)) {
        var redStatus = this.getFunctionIconById(MainuiConst.icon.trigger_gift).getTipsStatus();
 
        if (redStatus) {
          this.setFunctionTipsStatus(MainuiConst.icon.trigger_gift, !redStatus);
        }
      }
    } else if (id == MainuiConst.icon.privilege_shop) {
      //特权商城
      require("vip_controller").getInstance().openVipMainWindow(true, VIPTABCONST.PRIVILEGE);
 
      if (this.getFunctionIconById(MainuiConst.icon.privilege_shop)) {
        var _redStatus = this.getFunctionIconById(MainuiConst.icon.privilege_shop).getTipsStatus();
 
        if (_redStatus) {
          this.setFunctionTipsStatus(MainuiConst.icon.privilege_shop, !_redStatus);
        }
      }
    } else if (id == MainuiConst.icon.open_server_recharge) {
      //开服小额充值
      var ActionController = require("action_controller");
 
      ActionController.getInstance().openActionOpenServerGiftWindow(true, ActionConst.ActionRankCommonType.open_server);
    } else if (id == MainuiConst.icon.shwx_share) {
      //深海小程序分享
      require("welfare_controller").getInstance().openMainWindow(true, 8101);
    } else if (id == MainuiConst.icon.shwx_sub) {
      //深海小程序关注
      require("welfare_controller").getInstance().openMainWindow(true, 8102);
    } else if (id == MainuiConst.icon.shwx_collect) {
      //深海小程序收藏
      require("welfare_controller").getInstance().openMainWindow(true, 8103);
    } else if (id == MainuiConst.icon.one_gift) {
      //一元礼包
      this.setFunctionTipsStatus(MainuiConst.icon.one_gift, false);
 
      require("vip_controller").getInstance().openVipMainWindow(true, VIPTABCONST.DAILY_GIFT);
    } else if (id == MainuiConst.icon.skin) {
      var ActionController = require("action_controller");
 
      ActionController.getInstance().openBuySkinWindow(true);
    }
  },
 
  /*
  监测主UI的功能图标开启情况
  type:是主界面下面的6个+充值,还是其他比如排行榜之类的
  */
  checkMainFunctionOpenStatus: function checkMainFunctionOpenStatus(id, type, un_show_desc) {
    type = type || MainuiConst.function_type.main;
    id = id || 0;
    var config = null;
 
    if (type == MainuiConst.function_type.mian) {
      config = Config.function_data.data_base[id];
    } else {
      config = Config.function_data.data_info[id];
    }
 
    var str = "";
    var is_open = false;
 
    if (config == null || config.activate == null) {
      str = Utils.TI18N("配置数据异常");
      is_open = false;
    } else {
      str = config.desc;
      is_open = this.checkIsOpenByActivate(config.activate);
    }
 
    if (!un_show_desc && is_open == false) {
      message(str);
    }
 
    return is_open;
  },
  //根据id获取指定的图标数据
  getFunctionIconById: function getFunctionIconById(id) {
    return this.function_list[id];
  },
  //设置功能图标的红点状态,主要是function_data_info的数据
  setFunctionTipsStatus: function setFunctionTipsStatus(id, data) {
    id = Number(id);
    if (typeof id != "number") return;
    var vo = this.getFunctionIconById(id);
 
    if (vo) {
      vo.setTipsStatus(data);
    } else {
      if (this.cache_tips_list == null) {
        this.cache_tips_list = {};
      }
 
      if (_typeof(data) == "object") {
        if (data.bid == null || typeof data.bid != "number") return;
 
        if (this.cache_tips_list[id] == null) {
          this.cache_tips_list[id] = {};
        }
 
        if (data.bid != null) {
          this.cache_tips_list[id][data.bid] = data;
        }
      } else {
        this.cache_tips_list[id] = data;
      }
    } //检查红点状态
 
 
    this.checkMainSceneIconStatus();
  },
  //判断主城图标的红点状态,需要检查主城建筑以及功能红点
  checkMainSceneIconStatus: function checkMainSceneIconStatus() {
    //首先判断图标红点吧
    var main_scene_btn_status = false;
 
    for (var k in this.function_list) {
      if (this.function_list[k] && this.function_list[k].getTipsStatus() == true) {
        main_scene_btn_status = true;
        break;
      }
    } //如果有红点的话,直接跳过了
 
 
    if (main_scene_btn_status == true) {
      if (this.main_scene_btn_status == false) {
        this.main_scene_btn_status = true; // this.setBtnRedPoint(MainuiConst.btn_index.main_scene, false);
 
        this.setBtnRedPoint(MainuiConst.btn_index.main_scene, this.main_scene_btn_status);
      }
 
      return;
    }
 
    var build_list = require("mainscene_controller").getInstance().getBuildVoList();
 
    if (build_list) {
      for (var k in build_list) {
        if (build_list[k].getTipsStatus() == true) {
          main_scene_btn_status = true;
          break;
        }
      }
    }
 
    if (main_scene_btn_status != this.main_scene_btn_status) {
      this.main_scene_btn_status = main_scene_btn_status; // this.setBtnRedPoint(MainuiConst.btn_index.main_scene, false);
 
      this.setBtnRedPoint(MainuiConst.btn_index.main_scene, this.main_scene_btn_status);
    }
  },
  // 剧情章节变化的时候判断客户端自己的图标开启状态
  updateMainBtnStatus: function updateMainBtnStatus(max_dun) {
    if (this.mainui) {
      this.mainui.checkUnLockStatus(max_dun);
    } else {
      this.max_dun_id = max_dun;
    }
 
    this.checkFunctionByDrama(max_dun);
  },
  //初始化图标,找出是客户端创建并且达到等级的
  checkFunctionByRoleLev: function checkFunctionByRoleLev(lev) {
    if (this.mainui == null) return; //登录上线有升级的时候,这个时候会先于openui过来,所以没必要创建
 
    var role_vo = RoleController.getInstance().getRoleVo();
    if (role_vo == null) return;
    lev = lev || role_vo.lev;
    var add_list = [];
 
    for (var k in Config.function_data.data_info) {
      var config = Config.function_data.data_info[k];
 
      if (this.function_list[config.id] == null) {
        if (IS_SHOW_CHARGE == true || IS_SHOW_CHARGE == false && config.is_verifyios == 1) {
          if (config.open_type == 1 && config.activate) {
            var activate = config.activate[0]; //开启条件
 
            if (activate && activate[0] && activate[1]) {
              var activate_condition = activate[0];
              var activate_value = activate[1];
 
              if (activate_condition == "lev" && lev >= activate_value) {
                var function_vo = this.createFunctionVo(config);
 
                if (function_vo != null) {
                  this.function_list[config.id] = function_vo;
                  add_list.push(function_vo);
                  gcore.GlobalEvent.fire(MainuiEvent.UPDATE_FUNCTION_STATUS, config.id, true);
                }
              } else if (lev >= activate_value) {
                if (activate_condition == "shrh_lev" && PLATFORM_TYPR == "SH_RH") {
                  // if (config.id == MainuiConst.icon.shrh_sub && window.SH_RH_IS_SUBSCRIBE == true) continue
                  // if (config.id == MainuiConst.icon.shrh_share && require("welfare_controller").getInstance().getModel().getShareAwardStatus() == 1) continue
                  // if (config.id == MainuiConst.icon.shrh_realname && window.SH_RH_IS_REALNAME == true) continue
                  // if (config.id == MainuiConst.icon.shrh_sub && window.SH_RH_IS_SUBSCRIBE == true || SH_RH_IS_SHOW_SUBSCRIBE == false) continue
                  // if (config.id == MainuiConst.icon.shrh_share && require("welfare_controller").getInstance().getModel().getShareAwardStatus() == 1 || SH_RH_IS_SHOW_SHARE == false) continue
                  // if (config.id == MainuiConst.icon.shrh_realname && window.SH_RH_IS_REALNAME == true || SH_RH_IS_SHOW_REALNAME == false) continue
                  if (config.id == MainuiConst.icon.shrh_sub) {
                    if (window.SH_RH_IS_SUBSCRIBE == true || SH_RH_IS_SHOW_SUBSCRIBE == false) continue;
                  }
 
                  if (config.id == MainuiConst.icon.shrh_share) {
                    if (SH_RH_IS_SHOW_SHARE == false || require("welfare_controller").getInstance().getModel().getShareAwardStatus() == 1) continue;
                  }
 
                  if (config.id == MainuiConst.icon.shrh_realname) {
                    if (window.SH_RH_IS_REALNAME == true || SH_RH_IS_SHOW_REALNAME == false) {
                      continue;
                    }
                  }
 
                  var function_vo = this.createFunctionVo(config);
 
                  if (function_vo != null) {
                    this.function_list[config.id] = function_vo;
                    add_list.push(function_vo);
                    gcore.GlobalEvent.fire(MainuiEvent.UPDATE_FUNCTION_STATUS, config.id, true);
                  }
                } else if (activate_condition == "shwx_lev" && PLATFORM_TYPR == "SH_SDK") {
                  if (config.id == MainuiConst.icon.shwx_sub && window.SH_SDK_FOLLOW == true) continue;
                  if (config.id == MainuiConst.icon.shwx_share && require("welfare_controller").getInstance().getModel().getShareAwardStatus() == 1) continue;
                  if (config.id == MainuiConst.icon.shwx_collect && require("welfare_controller").getInstance().getModel().getCollectAwardStatus() == 1) continue;
                  var function_vo = this.createFunctionVo(config);
 
                  if (function_vo != null) {
                    this.function_list[config.id] = function_vo;
                    add_list.push(function_vo);
                    gcore.GlobalEvent.fire(MainuiEvent.UPDATE_FUNCTION_STATUS, config.id, true);
                  }
                }
              }
            }
          }
        }
      }
    }
 
    if (Utils.next(add_list)) {
      if (this.mainui) {
        this.mainui.addIconList(add_list);
      }
    } //监测是否有带创建的图标
 
 
    this.checkCacheWaitFunction();
  },
  //根据副本进度创建图标
  checkFunctionByDrama: function checkFunctionByDrama(max_dun_id) {
    var add_list = [];
 
    for (var k in Config.function_data.data_info) {
      var config = Config.function_data.data_info[k];
 
      if (this.function_list[config.id] == null) {
        if (IS_SHOW_CHARGE == true || IS_SHOW_CHARGE == false && config.is_verifyios == 1) {
          if (config.open_type == 1 && config.activate) {
            var activate = config.activate[0]; //开启条件
 
            if (activate && activate[0] && activate[1]) {
              var activate_condition = activate[0];
              var activate_value = activate[1];
 
              if (activate_condition == "dun" && max_dun_id >= activate_value) {
                var function_vo = this.createFunctionVo(config);
 
                if (function_vo != null) {
                  this.function_list[config.id] = function_vo;
                  add_list.push(function_vo);
                  gcore.GlobalEvent.fire(MainuiEvent.UPDATE_FUNCTION_STATUS, config.id, true);
                }
              }
            }
          }
        }
      }
    }
 
    if (Utils.next(add_list)) {
      if (this.mainui) {
        this.mainui.addIconList(add_list);
      }
    } // 监测是否有待创建的图标
 
 
    this.checkCacheWaitFunction();
  },
  //监测是否有要求创建时候不满足情况的图标
  checkCacheWaitFunction: function checkCacheWaitFunction() {
    if (this.cache_wait_create_list == null || Utils.getArrLen(this.cache_wait_create_list) == 0) return;
    var role_vo = RoleController.getInstance().getRoleVo();
    var drama_data = BattleDramaController.getInstance().getModel().getDramaData();
 
    for (var k in this.cache_wait_create_list) {
      var v = this.cache_wait_create_list[k];
      var config = gdata("function_data", "data_info", [k]);
 
      if (config == null || config.activate == null) {
        v = null;
      } else {
        var activate = config.activate[0];
 
        if (activate[0] == null || activate[1] == null) {
          v == null;
        } else {
          var activate_condition = activate[0];
          var activate_value = activate[1];
 
          if (activate_condition == "lev" && role_vo && role_vo.lev >= activate_value || activate_condition == "dun" && drama_data && drama_data.max_dun_id >= activate_value) {
            var function_vo = this.createFunctionVo(config);
 
            if (function_vo != null) {
              var params = v;
              function_vo.update(params);
              this.function_list[k] = function_vo;
 
              if (this.mainui) {
                this.mainui.addIcon(function_vo);
              }
 
              v = null; //缓存图标创建成功之后
 
              gcore.GlobalEvent.fire(MainuiEvent.UPDATE_FUNCTION_STATUS, k, true);
            }
          } else if (role_vo && role_vo.lev >= activate_value) {
            if (activate_condition == "shrh_lev" && PLATFORM_TYPR == "SH_RH") {
              // if (config.id == MainuiConst.icon.shrh_sub && window.SH_RH_IS_SUBSCRIBE == true) continue
              // if (config.id == MainuiConst.icon.shrh_share) continue
              // if (config.id == MainuiConst.icon.shrh_realname && window.SH_RH_IS_REALNAME == true) continue
              if (config.id == MainuiConst.icon.shrh_sub) {
                if (window.SH_RH_IS_SUBSCRIBE == true || SH_RH_IS_SHOW_SUBSCRIBE == false) continue;
              }
 
              if (config.id == MainuiConst.icon.shrh_share) {
                if (SH_RH_IS_SHOW_SHARE == false || require("welfare_controller").getInstance().getModel().getShareAwardStatus() == 1) continue;
              }
 
              if (config.id == MainuiConst.icon.shrh_realname) {
                if (window.SH_RH_IS_REALNAME == true || SH_RH_IS_SHOW_REALNAME == false) {
                  continue;
                }
              }
 
              var function_vo = this.createFunctionVo(config);
 
              if (function_vo != null) {
                var params = v;
                function_vo.update(params);
                this.function_list[k] = function_vo;
 
                if (this.mainui) {
                  this.mainui.addIcon(function_vo);
                }
 
                v = null; //缓存图标创建成功之后
 
                gcore.GlobalEvent.fire(MainuiEvent.UPDATE_FUNCTION_STATUS, k, true);
              }
            } else if (activate_condition == "shwx_lev" && PLATFORM_TYPR == "SH_SDK") {
              if (config.id == MainuiConst.icon.shwx_sub && window.SH_SDK_FOLLOW == true) continue;
              if (config.id == MainuiConst.icon.shwx_share && require("welfare_controller").getInstance().getModel().getShareAwardStatus() == 1) continue;
              if (config.id == MainuiConst.icon.shwx_collect && require("welfare_controller").getInstance().getModel().getCollectAwardStatus() == 1) continue;
              var function_vo = this.createFunctionVo(config);
 
              if (function_vo != null) {
                var params = v;
                function_vo.update(params);
                this.function_list[k] = function_vo;
 
                if (this.mainui) {
                  this.mainui.addIcon(function_vo);
                }
 
                v = null; //缓存图标创建成功之后
 
                gcore.GlobalEvent.fire(MainuiEvent.UPDATE_FUNCTION_STATUS, k, true);
              }
            }
          }
        }
      }
    }
  },
  getFucntionIconVoById: function getFucntionIconVoById(id) {
    if (this.function_list && Utils.next(this.function_list || {}) != null && this.function_list[id]) return this.function_list[id];
  },
  //创建一个图标数据
  createFunctionVo: function createFunctionVo(config) {
    if (config == null) return;
 
    if (config.id == MainuiConst.icon.action || config.id == MainuiConst.icon.festival) {
      var ActionController = require("action_controller");
 
      var can_add = ActionController.getInstance().checkCanAddWonderful(config.id);
      if (can_add == false) return;
    }
 
    var function_vo = this.function_list[config.id];
 
    if (function_vo == null) {
      function_vo = Utils.createClass("function_icon_vo", config);
    }
 
    if (this.cache_wait_create_list[config.id] != null) {
      function_vo.update(this.cache_wait_create_list[config.id]); // this.cache_wait_create_list[config.id] = null;
 
      delete this.cache_wait_create_list[config.id];
    }
 
    if (this.cache_tips_list[config.id] != null) {
      function_vo.setTipsStatus(this.cache_tips_list[config.id]);
      this.cache_tips_list[config.id] = null;
    } // if (config.id == MainuiConst.icon.action) {
    //     require("action_controller").getInstance().requestActionAwardStatus(ActionConst.ActionType.Wonderful);
    // } else if (config.id == MainuiConst.icon.combine) {
    //     require("action_controller").getInstance().requestActionAwardStatus(ActionConst.ActionType.Combine);
    // }
 
 
    return function_vo;
  },
  //添加图标
  addFunctionIconById: function addFunctionIconById(id) {
    if (id == null) return;
    var function_vo = this.function_list[id];
    var params = [];
 
    if (arguments.length > 1) {
      for (var i = 1; i < arguments.length; ++i) {
        params.push(arguments[i]);
      }
    }
 
    if (function_vo) {
      function_vo.update(params);
      return;
    }
 
    var config = Config.function_data.data_info[id];
    if (config == null || config.activate == null) return;
    if (IS_SHOW_CHARGE == false && config.is_verifyios == 0) return;
    var activate = config.activate[0];
    if (activate == null || activate[0] == null || activate[1] == null) return;
    var activate_condition = activate[0];
    var activate_value = activate[1];
    var role_vo = RoleController.getInstance().getRoleVo();
    var drama_data = BattleDramaController.getInstance().getModel().getDramaData();
 
    if (activate_condition == "lev" && role_vo && role_vo.lev >= activate_value || activate_condition == "dun" && drama_data && drama_data.max_dun_id >= activate_value) {
      function_vo = this.createFunctionVo(config); // 创建
 
      if (function_vo) {
        function_vo.update(params);
        this.function_list[id] = function_vo;
 
        if (this.mainui) {
          this.mainui.addIcon(function_vo);
        } // 通知添加一个图标
 
 
        gcore.GlobalEvent.fire(MainuiEvent.UPDATE_FUNCTION_STATUS, id, true);
      }
    } else if (activate_condition == "shrh_lev" && role_vo && role_vo.lev >= activate_value) {
      if (PLATFORM_TYPR == "SH_RH") {
        // if (config.id == MainuiConst.icon.shrh_sub && window.SH_RH_IS_SUBSCRIBE == true) return
        // if (config.id == MainuiConst.icon.shrh_share && window.SH_RH_IS_SHARE == true) return
        // if (config.id == MainuiConst.icon.shrh_realname && window.SH_RH_IS_REALNAME == true) return
        // if (config.id == MainuiConst.icon.shrh_sub && window.SH_RH_IS_SUBSCRIBE == true || SH_RH_IS_SHOW_SUBSCRIBE == false) return
        // if (config.id == MainuiConst.icon.shrh_share && window.SH_RH_IS_SHARE == true || SH_RH_IS_SHOW_SHARE == false) return
        // if (config.id == MainuiConst.icon.shrh_realname && window.SH_RH_IS_REALNAME == true || SH_RH_IS_SHOW_REALNAME == false) return
        if (config.id == MainuiConst.icon.shrh_sub) {
          if (window.SH_RH_IS_SUBSCRIBE == true || SH_RH_IS_SHOW_SUBSCRIBE == false) return;
        }
 
        if (config.id == MainuiConst.icon.shrh_share) {
          if (SH_RH_IS_SHOW_SHARE == false || window.SH_RH_IS_SHARE == true) return;
        }
 
        if (config.id == MainuiConst.icon.shrh_realname) {
          if (window.SH_RH_IS_REALNAME == true || SH_RH_IS_SHOW_REALNAME == false) {
            return;
          }
        }
 
        function_vo = this.createFunctionVo(config); // 创建
 
        if (function_vo) {
          function_vo.update(params);
          this.function_list[id] = function_vo;
 
          if (this.mainui) {
            this.mainui.addIcon(function_vo);
          } // 通知添加一个图标
 
 
          gcore.GlobalEvent.fire(MainuiEvent.UPDATE_FUNCTION_STATUS, id, true);
        }
      }
    } else if (activate_condition == "shwx_lev" && role_vo && role_vo.lev >= activate_value) {
      if (PLATFORM_TYPR == "SH_SDK") {
        if (config.id == MainuiConst.icon.shwx_sub && window.SH_SDK_FOLLOW == true) return;
        if (config.id == MainuiConst.icon.shwx_share && require("welfare_controller").getInstance().getModel().getShareAwardStatus() == 1) return;
        if (config.id == MainuiConst.icon.shwx_collect && require("welfare_controller").getInstance().getModel().getCollectAwardStatus() == 1) return;
        function_vo = this.createFunctionVo(config); // 创建
 
        if (function_vo) {
          function_vo.update(params);
          this.function_list[id] = function_vo;
 
          if (this.mainui) {
            this.mainui.addIcon(function_vo);
          } // 通知添加一个图标
 
 
          gcore.GlobalEvent.fire(MainuiEvent.UPDATE_FUNCTION_STATUS, id, true);
        }
      }
    } else {
      this.cache_wait_create_list[id] = params; // 缓存他们的数据
    }
  },
  //移除一个服务端图标
  removeFunctionIconById: function removeFunctionIconById(id) {
    if (!id) return;
    var function_vo = this.function_list[id];
 
    if (function_vo) {
      if (this.mainui) {
        this.mainui.removeIcon(id);
      }
 
      this.function_list[id] = null; // this.cache_wait_create_list[id] = null;
 
      delete this.cache_wait_create_list[id]; // 通知添加一个图标
 
      gcore.GlobalEvent.fire(MainuiEvent.UPDATE_FUNCTION_STATUS, id, false);
    }
  },
  // 根据开启条件判断该条件是否开启,包括了等级,剧情章节id,开服天数,和Vip等级
  checkIsOpenByActivate: function checkIsOpenByActivate(activate) {
    if (activate == null || Utils.next(activate) == null) {
      return false;
    }
 
    var role_vo = require("role_controller").getInstance().getRoleVo();
 
    var drama_data = require("battle_drama_controller").getInstance().getModel().getDramaData();
 
    for (var index = 0; index < activate.length; index++) {
      var element = activate[index];
 
      if (element) {
        var condition_type = element[0];
        var condition_value = element[1];
        var max_val = 0;
 
        if (condition_type == "lev" && role_vo) {
          max_val = role_vo.lev;
        } else if (condition_type == "open_day" && role_vo) {
          max_val = role_vo.open_day;
        } else if (condition_type == "vip_lev" && role_vo) {
          max_val = role_vo.vip_lev;
        } else if (condition_type == "dun" && drama_data) {
          max_val = drama_data.max_dun_id;
        }
 
        if (condition_value > max_val) {
          return false;
        }
      }
    }
 
    return true;
  },
  // 是否处于无尽试炼战斗的ui战斗下
  checkIsInEndlessUIFight: function checkIsInEndlessUIFight() {
    return this.ui_fight_type == MainuiConst.ui_fight_type.endless;
  },
  setMainUIBottomStatus: function setMainUIBottomStatus(status) {
    if (this.mainui) this.mainui.setBottomStatus(status);
  },
  setMainUITopStatus: function setMainUITopStatus(status) {
    if (this.mainui) this.mainui.setTopStatus(status);
  },
  getMainUiRoot: function getMainUiRoot(root_cb) {
    if (root_cb) {
      if (this.mainui) {
        this.mainui.getRootWnd(root_cb);
      } else {
        root_cb(null);
      }
    } else {
      if (this.mainui) return this.mainui.root_wnd;
    }
  },
  getHideContainerStatus: function getHideContainerStatus() {
    if (this.mainui && this.mainui.getHideContainerStatus) {
      return this.mainui.getHideContainerStatus();
    }
  },
  getItemExhibtionRoot: function getItemExhibtionRoot() {
    if (this.exhibition_view) return this.exhibition_view.root_wnd;
  },
  showPower: function showPower(power_add, last_power) {
    if (this.mainui) this.mainui.showPower(power_add, last_power);
  },
  changeHeroStatus: function changeHeroStatus(is_hero) {
    if (this.mainui) this.mainui.changeHeroStatus(is_hero);
  },
  showChatBtn: function showChatBtn(status) {
    if (this.mainui) {
      this.mainui.showChatBtn(status);
    }
  },
  setMainUIChatBubbleStatus: function setMainUIChatBubbleStatus(status) {
    if (this.mainui) {
      this.mainui.setMainUIChatBubbleStatus(status);
    }
  },
  getTaskTipsPanel: function getTaskTipsPanel() {
    if (this.mainui) {
      return this.mainui.getTaskTipsPanel();
    }
  },
  //主界面系统提示跳转
  onClickPromptTipsItem: function onClickPromptTipsItem(data) {
    var PromptTypeConst = require("prompt_type_const");
 
    if (data.type == PromptTypeConst.Private_chat) {
      //私聊
      var temp_data = {};
 
      for (var k = 0; k < data.list[0].data.arg_uint32.length; ++k) {
        var v = data.list[0].data.arg_uint32[k];
 
        if (v.key == 1) {
          temp_data.rid = v.value;
        }
      }
 
      for (var _k = 0; _k < data.list[0].data.arg_str.length; ++_k) {
        var _v = data.list[0].data.arg_str[_k];
 
        if (_v.key == 1) {
          temp_data.srv_id = _v.value;
        }
      }
 
      if (Utils.next(temp_data) != null) {
        var ChatController = require("chat_controller");
 
        var ChatConst = require("chat_const");
 
        ChatController.getInstance().openChatPanel(ChatConst.Channel.Friend, "friend", temp_data);
      }
    } else if (data.type == PromptTypeConst.At_notice) {
      var channel = null;
 
      for (var _k2 = 0; _k2 < data.list[0].data.arg_uint32.length; ++_k2) {
        var _v2 = data.list[0].data.arg_uint32[_k2];
 
        if (_v2.key == 2) {
          channel = _v2.value;
        }
      }
 
      var ChatController = require("chat_controller");
 
      ChatController.getInstance().openChatPanel(null, channel, null);
    } else if (data.type == PromptTypeConst.Endless_trail) {
      //无尽试炼
      var Endless_trailController = require("endless_trail_controller");
 
      Endless_trailController.getInstance().openEndlessBuffView(true);
    }
  }
});
module.exports = MainUiController;
 
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxtYWludWlcXG1haW51aV9jb250cm9sbGVyLmpzIl0sIm5hbWVzIjpbIk1haW51aUNvbnN0IiwicmVxdWlyZSIsIkJhdHRsZURyYW1hQ29udHJvbGxlciIsIk1haW51aUV2ZW50IiwiQWN0aW9uQ29uc3QiLCJSb2xlQ29udHJvbGxlciIsIkJhdHRsZUV2ZW50IiwiU2NlbmVDb25zdCIsIkJhdHRsZUNvbnN0IiwiQXJlbmFDb25zdCIsIk9yZGVyYWN0aW9uQ29uc3QiLCJNYWluVWlDb250cm9sbGVyIiwiY2MiLCJDbGFzcyIsIkJhc2VDb250cm9sbGVyIiwiY3RvciIsInVpX2ZpZ2h0X3R5cGUiLCJtYWluX3NjZW5lIiwiaW5pdENvbmZpZyIsIk1haW5VaU1vZGVsIiwibW9kZWwiLCJyZWxldmFuY2VfdWlfbGFzdF90eXBlIiwicmVsZXZhbmNlX2JhdHRsZV90eXBlIiwicmVsZXZhbmNlX3VpX2ZpZ2h0X3R5cGUiLCJyZWxldmFuY2VfcGFyYW1zIiwiZnVuY3Rpb25fbGlzdCIsImNhY2hlX3RpcHNfbGlzdCIsImNhY2hlX3dhaXRfY3JlYXRlX2xpc3QiLCJjYWNoZXNCdG5SZWQiLCJjYWNoZXNBd2FyZExpc3QiLCJnZXRNb2RlbCIsInJlZ2lzdGVyRXZlbnRzIiwiY29tYmF0X3R5cGVfYmFja19ldmVudCIsImdjb3JlIiwiR2xvYmFsRXZlbnQiLCJiaW5kIiwiQ09NQkFUX1RZUEVfQkFDSyIsImNvbWJhdF90eXBlIiwidHlwZSIsIm9wZW5SZWxldmFuY2VXaW5kb3dBdE9uY2UiLCJiYXR0bGVfZXhpdF9ldmVudCIsIkV2ZW50SWQiLCJFWElUX0ZJR0hUIiwidXBkYXRlX2RyYW1hX21heF9ldmVudCIsIkJhdHRsZURyYW1hX1VwZGF0ZV9NYXhfSWQiLCJtYXhfaWQiLCJ1cGRhdGVNYWluQnRuU3RhdHVzIiwiaW5pdF9tYWluX2V2ZW50IiwiRVZUX1JPTEVfQ1JFQVRFX1NVQ0NFU1MiLCJ1bmJpbmQiLCJyb2xlX2NoYW5nZV9ldmVudCIsInJvbGVfdm8iLCJnZXRJbnN0YW5jZSIsImdldFJvbGVWbyIsIlVQREFURV9ST0xFX0FUVFJJQlVURSIsImtleSIsInZhbHVlIiwiY2hlY2tGdW5jdGlvbkJ5Um9sZUxldiIsIklTX1NVQk1JVCIsIlNESyIsInNka1N1Ym1pdFVzZXJEYXRhIiwicmVnaXN0ZXJQcm90b2NhbHMiLCJSZWdpc3RlclByb3RvY2FsIiwib24xMjc0MiIsIm9wZW5NYWluVUkiLCJzdGF0dXMiLCJtYWludWkiLCJNYWluVUlWaWV3IiwiZ2V0SGlkZUNvbnRhaW5lclN0YXR1cyIsIm9wZW4iLCJpIiwiZnVuY3Rpb25fdm8iLCJhZGRJY29uIiwiY2xvc2UiLCJnZXRVSUZpZ2h0VHlwZSIsInNldFVJRmlnaHRUeXBlIiwiY2hlY2tJc0luRHJhbWFVSUZpZ2h0IiwiZHJhbWFfc2NlbmUiLCJjaGFuZ2VNYWluVUlTdGF0dXMiLCJpbmRleCIsInN1Yl90eXBlIiwiZGF0YSIsImFkdmVudHVyZSIsImNvbmZpZyIsIkNvbmZpZyIsImNpdHlfZGF0YSIsImRhdGFfYmFzZSIsIkNlbnRlclNjZW5lQnVpbGQiLCJjaGVja0lzT3BlbkJ5QWN0aXZhdGUiLCJhY3RpdmF0ZSIsIm1lc3NhZ2UiLCJkZXNjIiwiY2hhbmdlTWFpblVpU3RhdHVzIiwicmVxdWVzdE9wZW5CYXR0bGVSZWxldmFuY2VXaW5kb3ciLCJiYXR0bGVfdHlwZSIsInBhcmFtcyIsIkJhdHRsZUNvbnRyb2xsZXIiLCJnZXRVSUZpZ2h0QnlGaWdodFR5cGUiLCJzZW5kMjAwNjAiLCJyZXNldFVJRmlnaHRUeXBlIiwibm9ybWFsIiwiRmlnaHRfVHlwZSIsIldvcmxkQm9zcyIsIlNpbmdsZUJvc3MiLCJzZWxmIiwiR3VpbGREdW4iLCJvcGVuTWFpbldpbmRvdyIsIlN0YXJUb3dlciIsIm9wZW5NYWluVmlldyIsIkFyZW5hIiwib3BlbkFyZW5hTG9vcE1hdGhXaW5kb3ciLCJFbmRsZXNzIiwib3BlbkVuZGxlc3NNYWluV2luZG93IiwiRXhwZWRpdEZpZ2h0Iiwib3Blbkhlcm9FeHBlZGl0VmlldyIsIlByaW11c1dhciIsIm9wZW5QcmltdXNNYWluV2luZG93IiwiRHVuZ2VvblN0b25lIiwib3BlblN0b25lRHVuZ2VvblZpZXciLCJHdWlsZFdhciIsIkFkdmVudHJ1ZSIsIm9wZW5BZHZlbnR1cmVNYWluV2luZG93IiwiTGltaXRFeGVyY2lzZSIsIm9wZW5MaW1pdEV4ZXJjaXNlQ2hhbmdlVmlldyIsIkVsZW1lbnRXYXIiLCJvcGVuRWxlbWVudE1haW5XaW5kb3ciLCJzZXRCdG5SZWRQb2ludCIsImlkIiwidXBkYXRlQnRuVGlwc1BvaW50IiwicHVzaCIsInJlc2V0Q2FjaGVzUmV0RGF0YSIsImdldENhY2hlc0J0blJlZCIsImdldE1haW5VSUluZGV4IiwiYnRuX2luZGV4IiwiYXNzZXRfbGlzdCIsImxlbmd0aCIsIm9wZW5HZXRJdGVtVmlldyIsInNvdXJjZSIsImxpc3QiLCJleHRlbmQiLCJvcGVuX3R5cGUiLCJleGhpYml0aW9uX3ZpZXciLCJzcGxpY2UiLCJBcnJheSIsIlV0aWxzIiwiY3JlYXRlQ2xhc3MiLCJvcGVuQ29tbW9uRXhwbGFpblZpZXciLCJ0aXRsZV9zdHIiLCJjb21tb25fZXhwbGFpbiIsIm5leHQiLCJpc09wZW4iLCJpY29uQ2xpY2tIYW5kbGUiLCJhY3Rpb25faWQiLCJpY29uIiwid2VsZmFyZSIsIm1haWwiLCJvcGVuTWFpbFVJIiwiZGFpbHkiLCJvcGVuVGFza01haW5XaW5kb3ciLCJmcmllbmQiLCJvcGVuRnJpZW5kV2luZG93IiwicmFuayIsImNoYXJnZSIsIm9wZW5WaXBNYWluV2luZG93IiwiVklQVEFCQ09OU1QiLCJDSEFSR0UiLCJmdW5kIiwiZmlyc3RfY2hhcmdlX25ldyIsImZpcnN0X2NoYXJnZV9uZXcxIiwib3Blbk5ld0ZpcnN0Q2hhcmdlVmlldyIsInNldmVuX2xvZ2luIiwib3BlblNldmVuTG9naW5XaW4iLCJhY3Rpb24iLCJmZXN0aXZhbCIsIm9wZW5BY3Rpb25NYWluUGFuZWwiLCJkYXlfY2hhcmdlIiwiZ29kcGFydG5lciIsInNldmVuX2dvYWwiLCJzZXZlbl9nb2FsMSIsInNldmVuX2dvYWwyIiwic2V2ZW5fZ29hbDMiLCJvcGVuU2V2ZW5Hb2FsVmlldyIsImx1Y2t5X3RyZWFzdXJlIiwib3Blbkx1Y2t5VHJlYXN1cmVXaW4iLCJsaW1pdF9naWZ0X2VudHJ5Iiwib3BlbkFjdGlvbkxpbWl0R2lmdE1haW5XaW5kb3ciLCJkYXlfZmlyc3RfY2hhcmdlIiwib3BlbkRheUZpcnN0Q2hhcmdlVmlldyIsInZlZGlvIiwib3BlblZlZGlvTWFpbldpbmRvdyIsImd1aWxkd2FyIiwiY2hhbXBpb24iLCJvcGVuQnVpbGQiLCJhcmVuYSIsImFyZW5hX3R5cGUiLCJsaW1pdF9yZWNydWl0Iiwib3BlblJlY3J1aXRIZXJvV2luZG93Iiwic2hyaF9zaGFyZSIsInNocmhfc3ViIiwic2hyaF9yZWFsbmFtZSIsIlBMQVRGT1JNX1RZUFIiLCJyZWFsbmFtZSIsImFwaVR5cGUiLCJPcmRlckFjdGlvbkVudHJhbmNlSUQiLCJlbnRyYW5jZV9pZCIsIm9wZW5PcmRlckFjdGlvbk1haW5WaWV3IiwiZ2l2ZV92aXAiLCJvcGVuVmlwQXdhcmRXaW5kb3ciLCJ0cmlnZ2VyX2dpZnQiLCJvcGVuVHJpZ2dlckdpZnRXaW5kb3ciLCJnZXRGdW5jdGlvbkljb25CeUlkIiwicmVkU3RhdHVzIiwiZ2V0VGlwc1N0YXR1cyIsInNldEZ1bmN0aW9uVGlwc1N0YXR1cyIsInByaXZpbGVnZV9zaG9wIiwiUFJJVklMRUdFIiwib3Blbl9zZXJ2ZXJfcmVjaGFyZ2UiLCJBY3Rpb25Db250cm9sbGVyIiwib3BlbkFjdGlvbk9wZW5TZXJ2ZXJHaWZ0V2luZG93IiwiQWN0aW9uUmFua0NvbW1vblR5cGUiLCJvcGVuX3NlcnZlciIsInNod3hfc2hhcmUiLCJzaHd4X3N1YiIsInNod3hfY29sbGVjdCIsIm9uZV9naWZ0IiwiREFJTFlfR0lGVCIsInNraW4iLCJvcGVuQnV5U2tpbldpbmRvdyIsImNoZWNrTWFpbkZ1bmN0aW9uT3BlblN0YXR1cyIsInVuX3Nob3dfZGVzYyIsImZ1bmN0aW9uX3R5cGUiLCJtYWluIiwibWlhbiIsImZ1bmN0aW9uX2RhdGEiLCJkYXRhX2luZm8iLCJzdHIiLCJpc19vcGVuIiwiVEkxOE4iLCJOdW1iZXIiLCJ2byIsInNldFRpcHNTdGF0dXMiLCJiaWQiLCJjaGVja01haW5TY2VuZUljb25TdGF0dXMiLCJtYWluX3NjZW5lX2J0bl9zdGF0dXMiLCJrIiwiYnVpbGRfbGlzdCIsImdldEJ1aWxkVm9MaXN0IiwibWF4X2R1biIsImNoZWNrVW5Mb2NrU3RhdHVzIiwibWF4X2R1bl9pZCIsImNoZWNrRnVuY3Rpb25CeURyYW1hIiwibGV2IiwiYWRkX2xpc3QiLCJJU19TSE9XX0NIQVJHRSIsImlzX3ZlcmlmeWlvcyIsImFjdGl2YXRlX2NvbmRpdGlvbiIsImFjdGl2YXRlX3ZhbHVlIiwiY3JlYXRlRnVuY3Rpb25WbyIsImZpcmUiLCJVUERBVEVfRlVOQ1RJT05fU1RBVFVTIiwid2luZG93IiwiU0hfUkhfSVNfU1VCU0NSSUJFIiwiU0hfUkhfSVNfU0hPV19TVUJTQ1JJQkUiLCJTSF9SSF9JU19TSE9XX1NIQVJFIiwiZ2V0U2hhcmVBd2FyZFN0YXR1cyIsIlNIX1JIX0lTX1JFQUxOQU1FIiwiU0hfUkhfSVNfU0hPV19SRUFMTkFNRSIsIlNIX1NES19GT0xMT1ciLCJnZXRDb2xsZWN0QXdhcmRTdGF0dXMiLCJhZGRJY29uTGlzdCIsImNoZWNrQ2FjaGVXYWl0RnVuY3Rpb24iLCJnZXRBcnJMZW4iLCJkcmFtYV9kYXRhIiwiZ2V0RHJhbWFEYXRhIiwidiIsImdkYXRhIiwidXBkYXRlIiwiZ2V0RnVjbnRpb25JY29uVm9CeUlkIiwiY2FuX2FkZCIsImNoZWNrQ2FuQWRkV29uZGVyZnVsIiwiYWRkRnVuY3Rpb25JY29uQnlJZCIsImFyZ3VtZW50cyIsIlNIX1JIX0lTX1NIQVJFIiwicmVtb3ZlRnVuY3Rpb25JY29uQnlJZCIsInJlbW92ZUljb24iLCJlbGVtZW50IiwiY29uZGl0aW9uX3R5cGUiLCJjb25kaXRpb25fdmFsdWUiLCJtYXhfdmFsIiwib3Blbl9kYXkiLCJ2aXBfbGV2IiwiY2hlY2tJc0luRW5kbGVzc1VJRmlnaHQiLCJlbmRsZXNzIiwic2V0TWFpblVJQm90dG9tU3RhdHVzIiwic2V0Qm90dG9tU3RhdHVzIiwic2V0TWFpblVJVG9wU3RhdHVzIiwic2V0VG9wU3RhdHVzIiwiZ2V0TWFpblVpUm9vdCIsInJvb3RfY2IiLCJnZXRSb290V25kIiwicm9vdF93bmQiLCJnZXRJdGVtRXhoaWJ0aW9uUm9vdCIsInNob3dQb3dlciIsInBvd2VyX2FkZCIsImxhc3RfcG93ZXIiLCJjaGFuZ2VIZXJvU3RhdHVzIiwiaXNfaGVybyIsInNob3dDaGF0QnRuIiwic2V0TWFpblVJQ2hhdEJ1YmJsZVN0YXR1cyIsImdldFRhc2tUaXBzUGFuZWwiLCJvbkNsaWNrUHJvbXB0VGlwc0l0ZW0iLCJQcm9tcHRUeXBlQ29uc3QiLCJQcml2YXRlX2NoYXQiLCJ0ZW1wX2RhdGEiLCJhcmdfdWludDMyIiwicmlkIiwiYXJnX3N0ciIsInNydl9pZCIsIkNoYXRDb250cm9sbGVyIiwiQ2hhdENvbnN0Iiwib3BlbkNoYXRQYW5lbCIsIkNoYW5uZWwiLCJGcmllbmQiLCJBdF9ub3RpY2UiLCJjaGFubmVsIiwiRW5kbGVzc190cmFpbCIsIkVuZGxlc3NfdHJhaWxDb250cm9sbGVyIiwib3BlbkVuZGxlc3NCdWZmVmlldyIsIm1vZHVsZSIsImV4cG9ydHMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJQSxXQUFXLEdBQUdDLE9BQU8sQ0FBQyxjQUFELENBQXpCOztBQUNBLElBQUlDLHFCQUFxQixHQUFHRCxPQUFPLENBQUMseUJBQUQsQ0FBbkM7O0FBQ0EsSUFBSUUsV0FBVyxHQUFHRixPQUFPLENBQUMsY0FBRCxDQUF6QixFQUNBOzs7QUFDQSxJQUFJRyxXQUFXLEdBQUdILE9BQU8sQ0FBQyxjQUFELENBQXpCOztBQUNBLElBQUlJLGNBQWMsR0FBR0osT0FBTyxDQUFDLGlCQUFELENBQTVCOztBQUNBLElB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LENBQTZCdEUsR0FBN0IsQ0FBUjs7QUFDQSxZQUFJOEIsR0FBQyxDQUFDM04sR0FBRixJQUFTLENBQWIsRUFBZ0I7QUFDWjZRLFVBQUFBLE9BQU8sR0FBR2xELEdBQUMsQ0FBQzFOLEtBQVo7QUFDSDtBQUNKOztBQUNELFVBQUlzUSxjQUFjLEdBQUc3VCxPQUFPLENBQUMsaUJBQUQsQ0FBNUI7O0FBQ0E2VCxNQUFBQSxjQUFjLENBQUMxUSxXQUFmLEdBQTZCNFEsYUFBN0IsQ0FBMkMsSUFBM0MsRUFBZ0RJLE9BQWhELEVBQXdELElBQXhEO0FBQ0gsS0FWTSxNQVVBLElBQUluUCxJQUFJLENBQUMzQyxJQUFMLElBQWFpUixlQUFlLENBQUNjLGFBQWpDLEVBQWdEO0FBQUU7QUFDckQsVUFBSUMsdUJBQXVCLEdBQUdyVSxPQUFPLENBQUMsMEJBQUQsQ0FBckM7O0FBQ0FxVSxNQUFBQSx1QkFBdUIsQ0FBQ2xSLFdBQXhCLEdBQXNDbVIsbUJBQXRDLENBQTBELElBQTFEO0FBQ0g7QUFDSjtBQS83QjJCLENBQVQsQ0FBdkI7QUFrOEJBQyxNQUFNLENBQUNDLE9BQVAsR0FBaUI5VCxnQkFBakIiLCJzb3VyY2VSb290IjoiLyIsInNvdXJjZXNDb250ZW50IjpbIi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBAYXV0aG9yOiB4eHhAc3lnLmNvbSjlv4XloassIOWIm+W7uuaooeWdl+eahOS6uuWRmClcbi8vIEBkZXNjcmlwdGlvbjpcbi8vICAgICAg6L+Z6YeM5aGr5YaZ6K+m57uG6K+05piOLOS4u+imgeWhq+WGmeivpeaooeWdl+eahOWKn+iDveeugOimgVxuLy8gPGJyLz5DcmVhdGU6IDIwMTgtMTEtMjcgMTc6MDc6MTVcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG52YXIgTWFpbnVpQ29uc3QgPSByZXF1aXJlKFwibWFpbnVpX2NvbnN0XCIpO1xudmFyIEJhdHRsZURyYW1hQ29udHJvbGxlciA9IHJlcXVpcmUoXCJiYXR0bGVfZHJhbWFfY29udHJvbGxlclwiKTtcbnZhciBNYWludWlFdmVudCA9IHJlcXVpcmUoXCJtYWludWlfZXZlbnRcIik7XG4vLyB2YXIgRnVuY3Rpb25JY29uVm8gPSByZXF1aXJlKFwiZnVuY3Rpb25faWNvbl92b1wiKTtcbnZhciBBY3Rpb25Db25zdCA9IHJlcXVpcmUoXCJhY3Rpb25fY29uc3RcIik7XG52YXIgUm9sZUNvbnRyb2xsZXIgPSByZXF1aXJlKFwicm9sZV9jb250cm9sbGVyXCIpO1xudmFyIEJhdHRsZUV2ZW50ID0gcmVxdWlyZShcImJhdHRsZV9ldmVudFwiKTtcbnZhciBTY2VuZUNvbnN0ID0gcmVxdWlyZShcInNjZW5lX2NvbnN0XCIpO1xudmFyIEJhdHRsZUNvbnN0ID0gcmVxdWlyZShcImJhdHRsZV9jb25zdFwiKTtcbnZhciBBcmVuYUNvbnN0ID0gcmVxdWlyZShcImFyZW5hX2NvbnN0XCIpO1xuLy8gdmFyIFdlbGZhcmVDb250cm9sbGVyID0gcmVxdWlyZShcIndlbGZhcmVfY29udHJvbGxlclwiKTtcbnZhciBPcmRlcmFjdGlvbkNvbnN0ID0gcmVxdWlyZShcIm9yZGVyYWN0aW9uX2NvbnN0XCIpO1xuXG52YXIgTWFpblVpQ29udHJvbGxlciA9IGNjLkNsYXNzKHtcbiAgICBleHRlbmRzOiBCYXNlQ29udHJvbGxlcixcbiAgICBjdG9yOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMudWlfZmlnaHRfdHlwZSA9IE1haW51aUNvbnN0LnVpX2ZpZ2h0X3R5cGUubWFpbl9zY2VuZTtcbiAgICB9LFxuXG4gICAgLy8g5Yid5aeL5YyW6YWN572u5pWw5o2uXG4gICAgaW5pdENvbmZpZzogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgTWFpblVpTW9kZWwgPSByZXF1aXJlKFwibWFpbnVpX21vZGVsXCIpO1xuICAgICAgICB0aGlzLm1vZGVsID0gbmV3IE1haW5VaU1vZGVsKCk7XG4gICAgICAgIHRoaXMubW9kZWwuaW5pdENvbmZpZygpO1xuXG4gICAgICAgIHRoaXMucmVsZXZhbmNlX3VpX2xhc3RfdHlwZSA9IDA7ICAgICAgICAgICAgLy8g5LiK5LiA5LiqdWnmiJjmlpfnsbvlnotcbiAgICAgICAgdGhpcy5yZWxldmFuY2VfYmF0dGxlX3R5cGUgPSAwICAgICAgICAgICAgICAvLyDlvZPliY3or7fmsYLnmoTmiJjmlpfnsbvlnotcbiAgICAgICAgdGhpcy5yZWxldmFuY2VfdWlfZmlnaHRfdHlwZSA9IDAgICAgICAgICAgICAvLyDlvZPliY3miJjmlpfnsbvlnovmg7PljLnphY3nmoR5deaImOaWl+exu+Wei1xuICAgICAgICB0aGlzLnJlbGV2YW5jZV9wYXJhbXMgPSAwICAgICAgICAgICAgICAgICAgIC8vIOmZhOW4puWPguaVsFxuXG4gICAgICAgIHRoaXMuZnVuY3Rpb25fbGlzdCA9IHt9OyAgICAgICAgICAgICAgICAgICAgLy/lvZPliY3lt7Lnu4/mv4DmtLvnmoTlm77moIcs5YyF5ZCr5a6i5oi356uv6Ieq5bex55qE5Lul5Y+K5pyN5Yqh56uv55qEXG4gICAgICAgIHRoaXMuY2FjaGVfdGlwc19saXN0ID0ge307ICAgICAgICAgICAgICAgICAgLy/lvZPliY3nvJPlrZjnmoTlm77moIfnirbmgIFcbiAgICAgICAgdGhpcy5jYWNoZV93YWl0X2NyZWF0ZV9saXN0ID0ge307ICAgICAgICAgICAvL+e8k+WtmOW+heWIm+W7uueahOWbvuaghyzlj6/og73mmK/nrYnnuqfkuI3otrMs5Y+v6IO95piv5YWz5Y2h5pWw5LiN5a+5XG5cbiAgICAgICAgdGhpcy5jYWNoZXNCdG5SZWQgPSBbXSAvL+WboOS4uuS4u+eVjOmdouayoeWIm+W7uuWFiOe8k+WtmOe6oueCueS/oeaBr1xuICAgICAgICAvLyB2YXIgTWFpbnVpTm90aWNlVmlldyA9IHJlcXVpcmUoXCJtYWludWlfbm90aWNlX3ZpZXdcIik7XG4gICAgICAgIC8vIHRoaXMubm90aWNlX3ZpZXcgPSBuZXcgTWFpbnVpTm90aWNlVmlldygpO1xuICAgICAgICAvLyB0aGlzLm5vdGljZV92aWV3Lm9wZW4oKTtcblxuICAgICAgICB0aGlzLmNhY2hlc0F3YXJkTGlzdCA9IFtdIC8v57yT5a2Y5aWW5Yqx5L+h5oGvXG4gICAgfSxcblxuICAgIC8vIOi/lOWbnuW9k+WJjeeahG1vZGVsXG4gICAgZ2V0TW9kZWw6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubW9kZWw7XG4gICAgfSxcblxuICAgIC8vIOazqOWGjOebkeWQrOS6i+S7tlxuICAgIHJlZ2lzdGVyRXZlbnRzOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8v6K+35rGC6L+b5YWl56ue5oqA5Zy65LmL5YmN77yM6ZyA6KaB5ZGK6K+J5pyN5Yqh5Zmo77yM5oiR6KaB6L+b5Y675LqG77yM5pyJ5rKh5pyJ55yf5piv5oiY5paX77yM5b+r54K55ZGK6K+J5oiRXG4gICAgICAgIGlmICh0aGlzLmNvbWJhdF90eXBlX2JhY2tfZXZlbnQgPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5jb21iYXRfdHlwZV9iYWNrX2V2ZW50ID0gZ2NvcmUuR2xvYmFsRXZlbnQuYmluZChCYXR0bGVFdmVudC5DT01CQVRfVFlQRV9CQUNLLCBmdW5jdGlvbiAoY29tYmF0X3R5cGUsIHR5cGUpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSAwKSAvL+S4jeWtmOWcqOaImOaWl1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9wZW5SZWxldmFuY2VXaW5kb3dBdE9uY2UoY29tYmF0X3R5cGUpXG4gICAgICAgICAgICB9LCB0aGlzKVxuICAgICAgICB9XG5cbiAgICAgICAgLy8g6YCA5Ye65oiY5paX6ZyA6KaB5omT5byA6L+b5YWl5oiY5paX5LmL5YmN55qE5LiA5Lqb56qX5L2TXG4gICAgICAgIGlmICghdGhpcy5iYXR0bGVfZXhpdF9ldmVudCkge1xuICAgICAgICAgICAgdGhpcy5iYXR0bGVfZXhpdF9ldmVudCA9IGdjb3JlLkdsb2JhbEV2ZW50LmJpbmQoRXZlbnRJZC5FWElUX0ZJR0hULCBmdW5jdGlvbiAoY29tYmF0X3R5cGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9wZW5SZWxldmFuY2VXaW5kb3dBdE9uY2UoY29tYmF0X3R5cGUpXG4gICAgICAgICAgICB9LmJpbmQodGhpcykpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMudXBkYXRlX2RyYW1hX21heF9ldmVudCkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVfZHJhbWFfbWF4X2V2ZW50ID0gZ2NvcmUuR2xvYmFsRXZlbnQuYmluZChyZXF1aXJlKFwiYmF0dGxlX2RyYW1hX2V2ZW50XCIpLkJhdHRsZURyYW1hX1VwZGF0ZV9NYXhfSWQsIGZ1bmN0aW9uIChtYXhfaWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZU1haW5CdG5TdGF0dXMobWF4X2lkKTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKSlcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmluaXRfbWFpbl9ldmVudCA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmluaXRfbWFpbl9ldmVudCA9IGdjb3JlLkdsb2JhbEV2ZW50LmJpbmQoRXZlbnRJZC5FVlRfUk9MRV9DUkVBVEVfU1VDQ0VTUywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LnVuYmluZCh0aGlzLmluaXRfbWFpbl9ldmVudCk7XG4gICAgICAgICAgICAgICAgdGhpcy5pbml0X21haW5fZXZlbnQgPSBudWxsO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJvbGVfY2hhbmdlX2V2ZW50ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yb2xlX3ZvID0gUm9sZUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRSb2xlVm8oKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucm9sZV92byAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJvbGVfY2hhbmdlX2V2ZW50ID0gdGhpcy5yb2xlX3ZvLmJpbmQoRXZlbnRJZC5VUERBVEVfUk9MRV9BVFRSSUJVVEUsIGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGtleSA9PSBcImxldlwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tGdW5jdGlvbkJ5Um9sZUxldih2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChJU19TVUJNSVQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNESy5zZGtTdWJtaXRVc2VyRGF0YSg0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdvcmxkX2Jvc3NDb250cm9sbGVyOmdldEluc3RhbmNlKCk6c2VuZDIwNTAwKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgdGhpcylcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyDms6jlhozljY/orq7mjqXlj5fkuovku7ZcbiAgICByZWdpc3RlclByb3RvY2FsczogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMTI3NDIsIHRoaXMub24xMjc0Mik7ICAgICAgICAgICAgICAgICAgICAgLy8g6YCa55So6I635Y+W54mp5ZOB5aWW5YqxXG4gICAgfSxcblxuICAgIC8vIOaJk+W8gOS4u+eVjOmdolxuICAgIG9wZW5NYWluVUk6IGZ1bmN0aW9uIChzdGF0dXMpIHtcbiAgICAgICAgaWYgKHN0YXR1cyA9PSB0cnVlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5tYWludWkgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHZhciBNYWluVUlWaWV3ID0gcmVxdWlyZShcIm1haW51aV92aWV3XCIpO1xuICAgICAgICAgICAgICAgIHRoaXMubWFpbnVpID0gbmV3IE1haW5VSVZpZXcoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrRnVuY3Rpb25CeVJvbGVMZXYoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdGhpcy5tYWludWkuZ2V0SGlkZUNvbnRhaW5lclN0YXR1cygpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tYWludWkub3BlbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuZnVuY3Rpb25fbGlzdCkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgaW4gdGhpcy5mdW5jdGlvbl9saXN0KSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBmdW5jdGlvbl92byA9IHRoaXMuZnVuY3Rpb25fbGlzdFtpXVxuICAgICAgICAgICAgICAgICAgICBpZiAoZnVuY3Rpb25fdm8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWFpbnVpLmFkZEljb24oZnVuY3Rpb25fdm8pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8g5aSE55CG5LiL5pa55byA5ZCvXG4gICAgICAgICAgICAvLyBpZiAodGhpcy5tYXhfZHVuX2lkKSB7XG4gICAgICAgICAgICAvLyAgICAgdGhpcy5tYWludWkuY2hlY2tVbkxvY2tTdGF0dXModGhpcy5tYXhfZHVuX2lkKTtcbiAgICAgICAgICAgIC8vICAgICB0aGlzLm1heF9kdW5faWQgPSBudWxsO1xuICAgICAgICAgICAgLy8gfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMubWFpbnVpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tYWludWkuY2xvc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyDojrflj5blvZPliY3nmoTpnaLmnb9cbiAgICBnZXRVSUZpZ2h0VHlwZTogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy51aV9maWdodF90eXBlO1xuICAgIH0sXG5cbiAgICAvLyDorr7nva7lvZPliY3pnaLmnb/mlbDmja5cbiAgICBzZXRVSUZpZ2h0VHlwZTogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHRoaXMudWlfZmlnaHRfdHlwZSA9IHZhbHVlXG4gICAgfSxcblxuICAgIC8vIOaYr+WQpuWcqOWJp+aDheWJr+acrOeVjOmdolxuICAgIGNoZWNrSXNJbkRyYW1hVUlGaWdodDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy51aV9maWdodF90eXBlID09IE1haW51aUNvbnN0LnVpX2ZpZ2h0X3R5cGUuZHJhbWFfc2NlbmU7XG4gICAgfSxcblxuICAgIC8vIOWIh+aNouS4u+WfjueKtuaAgSzmiJbogIXkuIDkupvot7PovazkuZ/mmK/opoHliLDov5nph4zmnaXnmoRcbiAgICBjaGFuZ2VNYWluVUlTdGF0dXM6IGZ1bmN0aW9uIChpbmRleCwgc3ViX3R5cGUsIGRhdGEpIHtcbiAgICAgICAgaWYgKHRoaXMubWFpbnVpKSB7XG4gICAgICAgICAgICAvLyDov5nph4zpnIDopoHliKTmlq3mn5DkuIDkupvmmK/lkKblvIDlkK/kuoZcbiAgICAgICAgICAgIGlmIChzdWJfdHlwZSA9PSBNYWludWlDb25zdC5zdWJfdHlwZS5hZHZlbnR1cmUpIHtcbiAgICAgICAgICAgICAgICB2YXIgY29uZmlnID0gQ29uZmlnLmNpdHlfZGF0YS5kYXRhX2Jhc2VbU2NlbmVDb25zdC5DZW50ZXJTY2VuZUJ1aWxkLmFkdmVudHVyZV07XG4gICAgICAgICAgICAgICAgaWYgKGNvbmZpZykge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jaGVja0lzT3BlbkJ5QWN0aXZhdGUoY29uZmlnLmFjdGl2YXRlKSA9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZShjb25maWcuZGVzYyk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMubWFpbnVpLmNoYW5nZU1haW5VaVN0YXR1cyhpbmRleCwgc3ViX3R5cGUsIGRhdGEpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIOivt+axguaJk+W8gOaImOaWl+ebuOWFs+eahOeql+S9kyzlkIzml7bkuZ/ljIXlkKvkuobliafmg4Xlia/mnKznmoRcbiAgICByZXF1ZXN0T3BlbkJhdHRsZVJlbGV2YW5jZVdpbmRvdzogZnVuY3Rpb24gKGJhdHRsZV90eXBlLCBwYXJhbXMpIHtcbiAgICAgICAgdmFyIEJhdHRsZUNvbnRyb2xsZXIgPSByZXF1aXJlKFwiYmF0dGxlX2NvbnRyb2xsZXJcIik7XG4gICAgICAgIHZhciBCYXR0bGVDb25zdCA9IHJlcXVpcmUoXCJiYXR0bGVfY29uc3RcIik7XG5cbiAgICAgICAgdGhpcy5yZWxldmFuY2VfdWlfbGFzdF90eXBlID0gdGhpcy51aV9maWdodF90eXBlO1xuICAgICAgICB0aGlzLnJlbGV2YW5jZV9iYXR0bGVfdHlwZSA9IGJhdHRsZV90eXBlO1xuICAgICAgICB0aGlzLnJlbGV2YW5jZV9wYXJhbXMgPSBwYXJhbXM7XG4gICAgICAgIHRoaXMucmVsZXZhbmNlX3VpX2ZpZ2h0X3R5cGUgPSBCYXR0bGVDb25zdC5nZXRVSUZpZ2h0QnlGaWdodFR5cGUoYmF0dGxlX3R5cGUpO1xuICAgICAgICB0aGlzLnNldFVJRmlnaHRUeXBlKHRoaXMucmVsZXZhbmNlX3VpX2ZpZ2h0X3R5cGUpO1xuICAgICAgICBCYXR0bGVDb250cm9sbGVyLmdldEluc3RhbmNlKCkuc2VuZDIwMDYwKGJhdHRsZV90eXBlKTtcbiAgICB9LFxuXG4gICAgLy8g6L+Y5Y6f5LmL5YmN55qEdWnmiJjmlpfnsbvlnoss5Zug5Li65Y+v6IO95Yeg5Liq5bim5oiY5paX57G75Z6L55qE6Z2i5p2/5LqS55u46LCD55SoXG4gICAgcmVzZXRVSUZpZ2h0VHlwZTogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5yZWxldmFuY2VfdWlfbGFzdF90eXBlKSB7XG4gICAgICAgICAgICB0aGlzLnVpX2ZpZ2h0X3R5cGUgPSB0aGlzLnJlbGV2YW5jZV91aV9sYXN0X3R5cGU7XG4gICAgICAgICAgICB0aGlzLnJlbGV2YW5jZV91aV9sYXN0X3R5cGUgPSBNYWludWlDb25zdC51aV9maWdodF90eXBlLm5vcm1hbDtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvL+aJk+W8gOWFs+iBlOeql+S9kyzov5nph4zpkojlr7nkuJbnlYxib3Nz5Y+I6ZyA6KaB6YeN5paw5Yik5pat6LCD5pW0XG4gICAgb3BlblJlbGV2YW5jZVdpbmRvd0F0T25jZTogZnVuY3Rpb24gKGNvbWJhdF90eXBlKSB7XG4gICAgICAgIHZhciBCYXR0bGVDb25zdCA9IHJlcXVpcmUoXCJiYXR0bGVfY29uc3RcIik7XG4gICAgICAgIGlmIChjb21iYXRfdHlwZSA9PSBCYXR0bGVDb25zdC5GaWdodF9UeXBlLldvcmxkQm9zcyB8fCBjb21iYXRfdHlwZSA9PSBCYXR0bGVDb25zdC5GaWdodF9UeXBlLlNpbmdsZUJvc3MpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnJlbGV2YW5jZV9iYXR0bGVfdHlwZSAhPSBCYXR0bGVDb25zdC5GaWdodF9UeXBlLldvcmxkQm9zcyAmJiBzZWxmLnJlbGV2YW5jZV9iYXR0bGVfdHlwZSAhPSBCYXR0bGVDb25zdC5GaWdodF9UeXBlLlNpbmdsZUJvc3MpIHJldHVyblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMucmVsZXZhbmNlX2JhdHRsZV90eXBlICE9IGNvbWJhdF90eXBlKSByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAoY29tYmF0X3R5cGUgPT0gQmF0dGxlQ29uc3QuRmlnaHRfVHlwZS5HdWlsZER1bikge1xuICAgICAgICAgICAgcmVxdWlyZShcImd1aWxkYm9zc19jb250cm9sbGVyXCIpLmdldEluc3RhbmNlKCkub3Blbk1haW5XaW5kb3codHJ1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoY29tYmF0X3R5cGUgPT0gQmF0dGxlQ29uc3QuRmlnaHRfVHlwZS5TdGFyVG93ZXIpIHtcbiAgICAgICAgICAgIHJlcXVpcmUoXCJzdGFydG93ZXJfY29udHJvbGxlclwiKS5nZXRJbnN0YW5jZSgpLm9wZW5NYWluVmlldyh0cnVlKTtcbiAgICAgICAgfSBlbHNlIGlmIChjb21iYXRfdHlwZSA9PSBCYXR0bGVDb25zdC5GaWdodF9UeXBlLkFyZW5hKSB7XG4gICAgICAgICAgICByZXF1aXJlKFwiYXJlbmFfY29udHJvbGxlclwiKS5nZXRJbnN0YW5jZSgpLm9wZW5BcmVuYUxvb3BNYXRoV2luZG93KHRydWUpO1xuICAgICAgICB9IGVsc2UgaWYgKGNvbWJhdF90eXBlID09IEJhdHRsZUNvbnN0LkZpZ2h0X1R5cGUuRW5kbGVzcykge1xuICAgICAgICAgICAgcmVxdWlyZShcImVuZGxlc3NfdHJhaWxfY29udHJvbGxlclwiKS5nZXRJbnN0YW5jZSgpLm9wZW5FbmRsZXNzTWFpbldpbmRvdyh0cnVlKVxuICAgICAgICB9IGVsc2UgaWYgKGNvbWJhdF90eXBlID09IEJhdHRsZUNvbnN0LkZpZ2h0X1R5cGUuRXhwZWRpdEZpZ2h0KSB7XG4gICAgICAgICAgICByZXF1aXJlKFwiaGVyb2V4cGVkaXRfY29udHJvbGxlclwiKS5nZXRJbnN0YW5jZSgpLm9wZW5IZXJvRXhwZWRpdFZpZXcodHJ1ZSlcbiAgICAgICAgfSBlbHNlIGlmIChjb21iYXRfdHlwZSA9PSBCYXR0bGVDb25zdC5GaWdodF9UeXBlLlByaW11c1dhcikgey8v6I2j6ICA56We5q6/XG4gICAgICAgICAgICByZXF1aXJlKFwicHJpbXVzX2NvbnRyb2xsZXJcIikuZ2V0SW5zdGFuY2UoKS5vcGVuUHJpbXVzTWFpbldpbmRvdyh0cnVlKVxuICAgICAgICB9IGVsc2UgaWYgKGNvbWJhdF90eXBlID09IEJhdHRsZUNvbnN0LkZpZ2h0X1R5cGUuRHVuZ2VvblN0b25lKSB7XG4gICAgICAgICAgICByZXF1aXJlKFwic3RvbmVfZHVuZ2Vvbl9jb250cm9sbGVyXCIpLmdldEluc3RhbmNlKCkub3BlblN0b25lRHVuZ2VvblZpZXcodHJ1ZSlcbiAgICAgICAgfSBlbHNlIGlmIChjb21iYXRfdHlwZSA9PSBCYXR0bGVDb25zdC5GaWdodF9UeXBlLkd1aWxkV2FyKSB7XG4gICAgICAgICAgICByZXF1aXJlKFwiZ3VpbGR3YXJfY29udHJvbGxlclwiKS5nZXRJbnN0YW5jZSgpLm9wZW5NYWluV2luZG93KHRydWUpXG4gICAgICAgIH0gZWxzZSBpZiAoY29tYmF0X3R5cGUgPT0gQmF0dGxlQ29uc3QuRmlnaHRfVHlwZS5BZHZlbnRydWUpIHtcbiAgICAgICAgICAgIHJlcXVpcmUoXCJhZHZlbnR1cmVfY29udHJvbGxlclwiKS5nZXRJbnN0YW5jZSgpLm9wZW5BZHZlbnR1cmVNYWluV2luZG93KHRydWUpXG4gICAgICAgIH0gZWxzZSBpZiAoY29tYmF0X3R5cGUgPT0gQmF0dGxlQ29uc3QuRmlnaHRfVHlwZS5MaW1pdEV4ZXJjaXNlKSB7XG4gICAgICAgICAgICByZXF1aXJlKFwibGltaXRleGVyY2lzZV9jb250cm9sbGVyXCIpLmdldEluc3RhbmNlKCkub3BlbkxpbWl0RXhlcmNpc2VDaGFuZ2VWaWV3KHRydWUpXG4gICAgICAgIH0gZWxzZSBpZihjb21iYXRfdHlwZSA9PSBCYXR0bGVDb25zdC5GaWdodF9UeXBlLkVsZW1lbnRXYXIpe1xuICAgICAgICAgICAgcmVxdWlyZShcImVsZW1lbnRfY29udHJvbGxlclwiKS5nZXRJbnN0YW5jZSgpLm9wZW5FbGVtZW50TWFpbldpbmRvdyh0cnVlKVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8v5aSE55CG5Li755WM6Z2i5LiL6Z2i55qENeS4que6oueCuSwg5aaC5p6cZGF0YeaYr25pbOWImeihqOekuua4heepuue6oueCueaVsOaNrlxuICAgIHNldEJ0blJlZFBvaW50OiBmdW5jdGlvbiAoaWQsIGRhdGEpIHtcbiAgICAgICAgaWYgKHR5cGVvZiAoaWQpICE9IFwibnVtYmVyXCIpIHJldHVybjtcbiAgICAgICAgaWYgKHRoaXMubWFpbnVpKSB7XG4gICAgICAgICAgICB0aGlzLm1haW51aS51cGRhdGVCdG5UaXBzUG9pbnQoaWQsIGRhdGEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jYWNoZXNCdG5SZWQucHVzaChbaWQsIGRhdGFdKVxuICAgICAgICB9XG4gICAgfSxcbiAgICByZXNldENhY2hlc1JldERhdGEoKSB7XG4gICAgICAgIHRoaXMuY2FjaGVzQnRuUmVkID0gW11cbiAgICB9LFxuICAgIGdldENhY2hlc0J0blJlZDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jYWNoZXNCdG5SZWRcbiAgICB9LFxuICAgIC8vIOi/lOWbnuW9k+WJjeaJgOWkhOeahOS4u+eVjOmdouagh+etvlxuICAgIGdldE1haW5VSUluZGV4OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLm1haW51aSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubWFpbnVpLmdldE1haW5VSUluZGV4KCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIE1haW51aUNvbnN0LmJ0bl9pbmRleC5tYWluX3NjZW5lO1xuICAgIH0sXG5cbiAgICAvLyDpgJrnlKjojrflj5bnianlk4HlpZblirFcbiAgICBvbjEyNzQyOiBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICBpZiAoZGF0YS5hc3NldF9saXN0Lmxlbmd0aCA9PSAwKSByZXR1cm47XG4gICAgICAgIHRoaXMub3BlbkdldEl0ZW1WaWV3KHRydWUsIGRhdGEuYXNzZXRfbGlzdCwgZGF0YS5zb3VyY2UpO1xuICAgIH0sXG5cbiAgICAvLyDpgJrnlKjmiZPlvIDojrflj5bnianlk4HnlYzpnaJcbiAgICBvcGVuR2V0SXRlbVZpZXc6IGZ1bmN0aW9uIChzdGF0dXMsIGxpc3QsIHNvdXJjZSwgZXh0ZW5kLCBvcGVuX3R5cGUpIHtcbiAgICAgICAgaWYgKCFzdGF0dXMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmV4aGliaXRpb25fdmlldykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNhY2hlc0F3YXJkTGlzdC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkYXRhID0gdGhpcy5jYWNoZXNBd2FyZExpc3RbMF1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWNoZXNBd2FyZExpc3Quc3BsaWNlKDAsIDEpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXhoaWJpdGlvbl92aWV3Lm9wZW4oeyBsaXN0OiBkYXRhLmxpc3QsIHNvdXJjZTogZGF0YS5zb3VyY2UsIGV4dGVuZDogZGF0YS5leHRlbmQsIG9wZW5fdHlwZTogb3Blbl90eXBlIH0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXhoaWJpdGlvbl92aWV3LmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXhoaWJpdGlvbl92aWV3ID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChsaXN0ICYmIChsaXN0IGluc3RhbmNlb2YgQXJyYXkpICYmIGxpc3QubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmV4aGliaXRpb25fdmlldykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhY2hlc0F3YXJkTGlzdC5wdXNoKHsgbGlzdDogbGlzdCwgc291cmNlOiBzb3VyY2UsIGV4dGVuZDogZXh0ZW5kLCBvcGVuX3R5cGU6IG9wZW5fdHlwZSB9KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmV4aGliaXRpb25fdmlldykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmV4aGliaXRpb25fdmlldyA9IFV0aWxzLmNyZWF0ZUNsYXNzKFwiaXRlbV9leGhpYml0aW9uX3dpbmRvd1wiKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuZXhoaWJpdGlvbl92aWV3Lm9wZW4oeyBsaXN0OiBsaXN0LCBzb3VyY2U6IHNvdXJjZSwgZXh0ZW5kOiBleHRlbmQsIG9wZW5fdHlwZTogb3Blbl90eXBlIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIOmAmueUqOeOqeazleinhOWImemdouadv1xuICAgIG9wZW5Db21tb25FeHBsYWluVmlldzogZnVuY3Rpb24gKHN0YXR1cywgY29uZmlnLCB0aXRsZV9zdHIpIHtcbiAgICAgICAgaWYgKHN0YXR1cyA9PSBmYWxzZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuY29tbW9uX2V4cGxhaW4gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29tbW9uX2V4cGxhaW4uY2xvc2UoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbW1vbl9leHBsYWluID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChjb25maWcgPT0gbnVsbCB8fCBVdGlscy5uZXh0KGNvbmZpZykgPT0gbnVsbCkgcmV0dXJuO1xuICAgICAgICAgICAgaWYgKHRoaXMuY29tbW9uX2V4cGxhaW4gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29tbW9uX2V4cGxhaW4gPSBVdGlscy5jcmVhdGVDbGFzcyhcImNvbW1vbl9leHBsYWluX3dpbmRvd1wiLCB0aGlzKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuY29tbW9uX2V4cGxhaW4gJiYgdGhpcy5jb21tb25fZXhwbGFpbi5pc09wZW4oKSA9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29tbW9uX2V4cGxhaW4ub3BlbihbY29uZmlnLCB0aXRsZV9zdHJdKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcbiAgICAvL+eCueWHu+a0u+WKqOWbvuagh1xuICAgIGljb25DbGlja0hhbmRsZTogZnVuY3Rpb24gKGlkLCBhY3Rpb25faWQpIHtcbiAgICAgICAgaWYgKGlkID09IG51bGwpIHJldHVyblxuICAgICAgICBpZiAoaWQgPT0gTWFpbnVpQ29uc3QuaWNvbi53ZWxmYXJlKSB7XG4gICAgICAgICAgICByZXF1aXJlKFwid2VsZmFyZV9jb250cm9sbGVyXCIpLmdldEluc3RhbmNlKCkub3Blbk1haW5XaW5kb3codHJ1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaWQgPT0gTWFpbnVpQ29uc3QuaWNvbi5tYWlsKSB7XG4gICAgICAgICAgICByZXF1aXJlKFwibWFpbF9jb250cm9sbGVyXCIpLmdldEluc3RhbmNlKCkub3Blbk1haWxVSSh0cnVlKTtcbiAgICAgICAgfSBlbHNlIGlmIChpZCA9PSBNYWludWlDb25zdC5pY29uLmRhaWx5KSB7XG4gICAgICAgICAgICByZXF1aXJlKFwidGFza19jb250cm9sbGVyXCIpLmdldEluc3RhbmNlKCkub3BlblRhc2tNYWluV2luZG93KHRydWUpO1xuICAgICAgICB9IGVsc2UgaWYgKGlkID09IE1haW51aUNvbnN0Lmljb24uZnJpZW5kKSB7XG4gICAgICAgICAgICByZXF1aXJlKFwiZnJpZW5kX2NvbnRyb2xsZXJcIikuZ2V0SW5zdGFuY2UoKS5vcGVuRnJpZW5kV2luZG93KHRydWUpO1xuICAgICAgICB9IGVsc2UgaWYgKGlkID09IE1haW51aUNvbnN0Lmljb24ucmFuaykge1xuICAgICAgICAgICAgcmVxdWlyZShcInJhbmtfY29udHJvbGxlclwiKS5nZXRJbnN0YW5jZSgpLm9wZW5NYWluVmlldyh0cnVlKTtcbiAgICAgICAgfSBlbHNlIGlmIChpZCA9PSBNYWludWlDb25zdC5pY29uLmNoYXJnZSkge1xuICAgICAgICAgICAgcmVxdWlyZShcInZpcF9jb250cm9sbGVyXCIpLmdldEluc3RhbmNlKCkub3BlblZpcE1haW5XaW5kb3codHJ1ZSwgVklQVEFCQ09OU1QuQ0hBUkdFKTtcbiAgICAgICAgfSBlbHNlIGlmIChpZCA9PSBNYWludWlDb25zdC5pY29uLmZ1bmQpIHtcbiAgICAgICAgICAgIC8v6LaF5YC85Z+66YeRXG4gICAgICAgICAgICByZXF1aXJlKFwid2VsZmFyZV9jb250cm9sbGVyXCIpLmdldEluc3RhbmNlKCkub3Blbk1haW5XaW5kb3codHJ1ZSwgTWFpbnVpQ29uc3QuaWNvbi5mdW5kKTtcbiAgICAgICAgfSBlbHNlIGlmIChpZCA9PSBNYWludWlDb25zdC5pY29uLmZpcnN0X2NoYXJnZV9uZXcgfHwgaWQgPT0gTWFpbnVpQ29uc3QuaWNvbi5maXJzdF9jaGFyZ2VfbmV3MSkge1xuICAgICAgICAgICAgcmVxdWlyZShcIm5ld2ZpcnN0Y2hhcmdlX2NvbnRyb2xsZXJcIikuZ2V0SW5zdGFuY2UoKS5vcGVuTmV3Rmlyc3RDaGFyZ2VWaWV3KHRydWUpO1xuICAgICAgICB9IGVsc2UgaWYgKGlkID09IE1haW51aUNvbnN0Lmljb24uc2V2ZW5fbG9naW4pIHtcbiAgICAgICAgICAgIHJlcXVpcmUoXCJhY3Rpb25fY29udHJvbGxlclwiKS5nZXRJbnN0YW5jZSgpLm9wZW5TZXZlbkxvZ2luV2luKHRydWUpO1xuICAgICAgICB9IGVsc2UgaWYgKGlkID09IE1haW51aUNvbnN0Lmljb24uYWN0aW9uIHx8IGlkID09IE1haW51aUNvbnN0Lmljb24uZmVzdGl2YWwpIHtcbiAgICAgICAgICAgIC8v6ZmQ5pe25rS75YqoLOiKguaXpea0u+WKqCznq57njJzmtLvliqhcbiAgICAgICAgICAgIHJlcXVpcmUoXCJhY3Rpb25fY29udHJvbGxlclwiKS5nZXRJbnN0YW5jZSgpLm9wZW5BY3Rpb25NYWluUGFuZWwodHJ1ZSwgaWQpXG4gICAgICAgIH0gZWxzZSBpZiAoaWQgPT0gTWFpbnVpQ29uc3QuaWNvbi5kYXlfY2hhcmdlKSB7XG4gICAgICAgICAgICByZXF1aXJlKFwiYWN0aW9uX2NvbnRyb2xsZXJcIikuZ2V0SW5zdGFuY2UoKS5vcGVuQWN0aW9uTWFpblBhbmVsKHRydWUsIG51bGwsIDkxMDA1KVxuICAgICAgICB9IGVsc2UgaWYgKGlkID09IE1haW51aUNvbnN0Lmljb24uZ29kcGFydG5lcikge1xuICAgICAgICAgICAgcmVxdWlyZShcImFjdGlvbl9jb250cm9sbGVyXCIpLmdldEluc3RhbmNlKCkub3BlbkFjdGlvbk1haW5QYW5lbCh0cnVlLCBudWxsLCA5MzAwNilcbiAgICAgICAgfSBlbHNlIGlmIChpZCA9PSBNYWludWlDb25zdC5pY29uLnNldmVuX2dvYWwgfHwgaWQgPT0gTWFpbnVpQ29uc3QuaWNvbi5zZXZlbl9nb2FsMSB8fCBpZCA9PSBNYWludWlDb25zdC5pY29uLnNldmVuX2dvYWwyIHx8IGlkID09IE1haW51aUNvbnN0Lmljb24uc2V2ZW5fZ29hbDMpIHtcbiAgICAgICAgICAgIHJlcXVpcmUoXCJhY3Rpb25fY29udHJvbGxlclwiKS5nZXRJbnN0YW5jZSgpLm9wZW5TZXZlbkdvYWxWaWV3KHRydWUpO1xuICAgICAgICB9IGVsc2UgaWYgKGlkID09IE1haW51aUNvbnN0Lmljb24ubHVja3lfdHJlYXN1cmUpIHtcbiAgICAgICAgICAgIHJlcXVpcmUoXCJhY3Rpb25fY29udHJvbGxlclwiKS5nZXRJbnN0YW5jZSgpLm9wZW5MdWNreVRyZWFzdXJlV2luKHRydWUpO1xuICAgICAgICB9IGVsc2UgaWYgKGlkID09IE1haW51aUNvbnN0Lmljb24ubGltaXRfZ2lmdF9lbnRyeSkge1xuICAgICAgICAgICAgLy/pmZDml7bnpLzljIVcbiAgICAgICAgICAgIHJlcXVpcmUoXCJhY3Rpb25fY29udHJvbGxlclwiKS5nZXRJbnN0YW5jZSgpLm9wZW5BY3Rpb25MaW1pdEdpZnRNYWluV2luZG93KHRydWUpO1xuICAgICAgICB9IGVsc2UgaWYgKGlkID09IE1haW51aUNvbnN0Lmljb24uZGF5X2ZpcnN0X2NoYXJnZSkgey8v5q+P5pel6aaW5YWFXG4gICAgICAgICAgICByZXF1aXJlKFwiZGF5Y2hhcmdlX2NvbnRyb2xsZXJcIikuZ2V0SW5zdGFuY2UoKS5vcGVuRGF5Rmlyc3RDaGFyZ2VWaWV3KHRydWUpO1xuICAgICAgICB9IGVsc2UgaWYgKGlkID09IE1haW51aUNvbnN0Lmljb24udmVkaW8pIHtcbiAgICAgICAgICAgIC8v5b2V5YOP6aaGXG4gICAgICAgICAgICByZXF1aXJlKFwidmVkaW9fY29udHJvbGxlclwiKS5nZXRJbnN0YW5jZSgpLm9wZW5WZWRpb01haW5XaW5kb3codHJ1ZSlcbiAgICAgICAgfSBlbHNlIGlmIChpZCA9PSBNYWludWlDb25zdC5pY29uLmd1aWxkd2FyKSB7XG4gICAgICAgICAgICAvL+WFrOS8muaImFxuICAgICAgICAgICAgdGhpcy5yZXF1ZXN0T3BlbkJhdHRsZVJlbGV2YW5jZVdpbmRvdyhCYXR0bGVDb25zdC5GaWdodF9UeXBlLkd1aWxkV2FyKTtcbiAgICAgICAgfSBlbHNlIGlmIChpZCA9PSBNYWludWlDb25zdC5pY29uLmNoYW1waW9uKSB7XG4gICAgICAgICAgICAvL+WGoOWGm+i1m1xuICAgICAgICAgICAgcmVxdWlyZShcIm1haW5zY2VuZV9jb250cm9sbGVyXCIpLmdldEluc3RhbmNlKCkub3BlbkJ1aWxkKFNjZW5lQ29uc3QuQ2VudGVyU2NlbmVCdWlsZC5hcmVuYSwgQXJlbmFDb25zdC5hcmVuYV90eXBlLnJhbmspO1xuICAgICAgICB9IGVsc2UgaWYgKGlkID09IE1haW51aUNvbnN0Lmljb24ubGltaXRfcmVjcnVpdCkge1xuICAgICAgICAgICAgLy/pmZDml7bmi5vli59cbiAgICAgICAgICAgIHJlcXVpcmUoXCJyZWNydWl0aGVyb19jb250cm9sbGVyXCIpLmdldEluc3RhbmNlKCkub3BlblJlY3J1aXRIZXJvV2luZG93KHRydWUpO1xuICAgICAgICB9IGVsc2UgaWYgKGlkID09IE1haW51aUNvbnN0Lmljb24uc2hyaF9zaGFyZSkge1xuICAgICAgICAgICAgLy/mt7Hmtbfono3lkIjliIbkuqtcbiAgICAgICAgICAgIHJlcXVpcmUoXCJ3ZWxmYXJlX2NvbnRyb2xsZXJcIikuZ2V0SW5zdGFuY2UoKS5vcGVuTWFpbldpbmRvdyh0cnVlLCA4MDA3KTtcbiAgICAgICAgfSBlbHNlIGlmIChpZCA9PSBNYWludWlDb25zdC5pY29uLnNocmhfc3ViKSB7XG4gICAgICAgICAgICAvL+a3sea1t+iejeWQiOWFs+azqFxuICAgICAgICAgICAgcmVxdWlyZShcIndlbGZhcmVfY29udHJvbGxlclwiKS5nZXRJbnN0YW5jZSgpLm9wZW5NYWluV2luZG93KHRydWUsIDgwMTQpO1xuICAgICAgICB9IGVsc2UgaWYgKGlkID09IE1haW51aUNvbnN0Lmljb24uc2hyaF9yZWFsbmFtZSkge1xuICAgICAgICAgICAgLy/mt7Hmtbfono3lkIjlrp7lkI1cbiAgICAgICAgICAgIGlmIChQTEFURk9STV9UWVBSID09IFwiU0hfUkhcIikge1xuICAgICAgICAgICAgICAgIFNESy5yZWFsbmFtZSh7IGFwaVR5cGU6IFwiYXNrU2hvd1wiIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoaWQgPT0gT3JkZXJhY3Rpb25Db25zdC5PcmRlckFjdGlvbkVudHJhbmNlSUQuZW50cmFuY2VfaWQpIHsvL+aImOS7pOa0u+WKqFxuICAgICAgICAgICAgcmVxdWlyZShcIm9yZGVyYWN0aW9uX2NvbnRyb2xsZXJcIikuZ2V0SW5zdGFuY2UoKS5vcGVuT3JkZXJBY3Rpb25NYWluVmlldyh0cnVlKVxuICAgICAgICB9IGVsc2UgaWYgKGlkID09IE1haW51aUNvbnN0Lmljb24uZ2l2ZV92aXApIHsvL+WFjei0uXZpcOa0u+WKqFxuICAgICAgICAgICAgcmVxdWlyZShcInZpcF9jb250cm9sbGVyXCIpLmdldEluc3RhbmNlKCkub3BlblZpcEF3YXJkV2luZG93KHRydWUpXG4gICAgICAgIH0gZWxzZSBpZiAoaWQgPT0gTWFpbnVpQ29uc3QuaWNvbi50cmlnZ2VyX2dpZnQpIHtcbiAgICAgICAgICAgIC8v6Kem5Y+R56S85YyFXG4gICAgICAgICAgICByZXF1aXJlKFwiYWN0aW9uX2NvbnRyb2xsZXJcIikuZ2V0SW5zdGFuY2UoKS5vcGVuVHJpZ2dlckdpZnRXaW5kb3codHJ1ZSlcbiAgICAgICAgICAgIGlmICh0aGlzLmdldEZ1bmN0aW9uSWNvbkJ5SWQoTWFpbnVpQ29uc3QuaWNvbi50cmlnZ2VyX2dpZnQpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJlZFN0YXR1cyA9IHRoaXMuZ2V0RnVuY3Rpb25JY29uQnlJZChNYWludWlDb25zdC5pY29uLnRyaWdnZXJfZ2lmdCkuZ2V0VGlwc1N0YXR1cygpXG4gICAgICAgICAgICAgICAgaWYgKHJlZFN0YXR1cykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEZ1bmN0aW9uVGlwc1N0YXR1cyhNYWludWlDb25zdC5pY29uLnRyaWdnZXJfZ2lmdCwgIXJlZFN0YXR1cylcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoaWQgPT0gTWFpbnVpQ29uc3QuaWNvbi5wcml2aWxlZ2Vfc2hvcCkge1xuICAgICAgICAgICAgLy/nibnmnYPllYbln45cbiAgICAgICAgICAgIHJlcXVpcmUoXCJ2aXBfY29udHJvbGxlclwiKS5nZXRJbnN0YW5jZSgpLm9wZW5WaXBNYWluV2luZG93KHRydWUsIFZJUFRBQkNPTlNULlBSSVZJTEVHRSk7XG4gICAgICAgICAgICBpZiAodGhpcy5nZXRGdW5jdGlvbkljb25CeUlkKE1haW51aUNvbnN0Lmljb24ucHJpdmlsZWdlX3Nob3ApKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJlZFN0YXR1cyA9IHRoaXMuZ2V0RnVuY3Rpb25JY29uQnlJZChNYWludWlDb25zdC5pY29uLnByaXZpbGVnZV9zaG9wKS5nZXRUaXBzU3RhdHVzKClcbiAgICAgICAgICAgICAgICBpZiAocmVkU3RhdHVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0RnVuY3Rpb25UaXBzU3RhdHVzKE1haW51aUNvbnN0Lmljb24ucHJpdmlsZWdlX3Nob3AsICFyZWRTdGF0dXMpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGlkID09IE1haW51aUNvbnN0Lmljb24ub3Blbl9zZXJ2ZXJfcmVjaGFyZ2UpIHtcbiAgICAgICAgICAgIC8v5byA5pyN5bCP6aKd5YWF5YC8XG4gICAgICAgICAgICB2YXIgQWN0aW9uQ29udHJvbGxlciA9IHJlcXVpcmUoXCJhY3Rpb25fY29udHJvbGxlclwiKTtcbiAgICAgICAgICAgIEFjdGlvbkNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5vcGVuQWN0aW9uT3BlblNlcnZlckdpZnRXaW5kb3codHJ1ZSwgQWN0aW9uQ29uc3QuQWN0aW9uUmFua0NvbW1vblR5cGUub3Blbl9zZXJ2ZXIpXG5cbiAgICAgICAgfSBlbHNlIGlmIChpZCA9PSBNYWludWlDb25zdC5pY29uLnNod3hfc2hhcmUpIHtcbiAgICAgICAgICAgIC8v5rex5rW35bCP56iL5bqP5YiG5LqrXG4gICAgICAgICAgICByZXF1aXJlKFwid2VsZmFyZV9jb250cm9sbGVyXCIpLmdldEluc3RhbmNlKCkub3Blbk1haW5XaW5kb3codHJ1ZSwgODEwMSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaWQgPT0gTWFpbnVpQ29uc3QuaWNvbi5zaHd4X3N1Yikge1xuICAgICAgICAgICAgLy/mt7HmtbflsI/nqIvluo/lhbPms6hcbiAgICAgICAgICAgIHJlcXVpcmUoXCJ3ZWxmYXJlX2NvbnRyb2xsZXJcIikuZ2V0SW5zdGFuY2UoKS5vcGVuTWFpbldpbmRvdyh0cnVlLCA4MTAyKTtcbiAgICAgICAgfSBlbHNlIGlmIChpZCA9PSBNYWludWlDb25zdC5pY29uLnNod3hfY29sbGVjdCkge1xuICAgICAgICAgICAgLy/mt7HmtbflsI/nqIvluo/mlLbol49cbiAgICAgICAgICAgIHJlcXVpcmUoXCJ3ZWxmYXJlX2NvbnRyb2xsZXJcIikuZ2V0SW5zdGFuY2UoKS5vcGVuTWFpbldpbmRvdyh0cnVlLCA4MTAzKTtcbiAgICAgICAgfSBlbHNlIGlmIChpZCA9PSBNYWludWlDb25zdC5pY29uLm9uZV9naWZ0KSB7XG4gICAgICAgICAgICAvL+S4gOWFg+ekvOWMhVxuICAgICAgICAgICAgdGhpcy5zZXRGdW5jdGlvblRpcHNTdGF0dXMoTWFpbnVpQ29uc3QuaWNvbi5vbmVfZ2lmdCwgZmFsc2UpXG4gICAgICAgICAgICByZXF1aXJlKFwidmlwX2NvbnRyb2xsZXJcIikuZ2V0SW5zdGFuY2UoKS5vcGVuVmlwTWFpbldpbmRvdyh0cnVlLCBWSVBUQUJDT05TVC5EQUlMWV9HSUZUKTtcbiAgICAgICAgfSBlbHNlIGlmKGlkID09IE1haW51aUNvbnN0Lmljb24uc2tpbil7XG4gICAgICAgICAgICB2YXIgQWN0aW9uQ29udHJvbGxlciA9IHJlcXVpcmUoXCJhY3Rpb25fY29udHJvbGxlclwiKTtcbiAgICAgICAgICAgIEFjdGlvbkNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5vcGVuQnV5U2tpbldpbmRvdyh0cnVlKVxuICAgICAgICB9XG5cblxuICAgIH0sXG5cbiAgICAvKlxuICAgIOebkea1i+S4u1VJ55qE5Yqf6IO95Zu+5qCH5byA5ZCv5oOF5Ya1XG4gICAgdHlwZTrmmK/kuLvnlYzpnaLkuIvpnaLnmoQ25LiqK+WFheWAvCzov5jmmK/lhbbku5bmr5TlpoLmjpLooYzmppzkuYvnsbvnmoRcbiAgICAqL1xuICAgIGNoZWNrTWFpbkZ1bmN0aW9uT3BlblN0YXR1czogZnVuY3Rpb24gKGlkLCB0eXBlLCB1bl9zaG93X2Rlc2MpIHtcbiAgICAgICAgdHlwZSA9IHR5cGUgfHwgTWFpbnVpQ29uc3QuZnVuY3Rpb25fdHlwZS5tYWluO1xuICAgICAgICBpZCA9IGlkIHx8IDA7XG4gICAgICAgIHZhciBjb25maWcgPSBudWxsO1xuICAgICAgICBpZiAodHlwZSA9PSBNYWludWlDb25zdC5mdW5jdGlvbl90eXBlLm1pYW4pIHtcbiAgICAgICAgICAgIGNvbmZpZyA9IENvbmZpZy5mdW5jdGlvbl9kYXRhLmRhdGFfYmFzZVtpZF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25maWcgPSBDb25maWcuZnVuY3Rpb25fZGF0YS5kYXRhX2luZm9baWRdO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHN0ciA9IFwiXCI7XG4gICAgICAgIHZhciBpc19vcGVuID0gZmFsc2U7XG4gICAgICAgIGlmIChjb25maWcgPT0gbnVsbCB8fCBjb25maWcuYWN0aXZhdGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgc3RyID0gVXRpbHMuVEkxOE4oXCLphY3nva7mlbDmja7lvILluLhcIilcbiAgICAgICAgICAgIGlzX29wZW4gPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0ciA9IGNvbmZpZy5kZXNjO1xuICAgICAgICAgICAgaXNfb3BlbiA9IHRoaXMuY2hlY2tJc09wZW5CeUFjdGl2YXRlKGNvbmZpZy5hY3RpdmF0ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF1bl9zaG93X2Rlc2MgJiYgaXNfb3BlbiA9PSBmYWxzZSkge1xuICAgICAgICAgICAgbWVzc2FnZShzdHIpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlzX29wZW5cbiAgICB9LFxuXG4gICAgLy/moLnmja5pZOiOt+WPluaMh+WumueahOWbvuagh+aVsOaNrlxuICAgIGdldEZ1bmN0aW9uSWNvbkJ5SWQ6IGZ1bmN0aW9uIChpZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5mdW5jdGlvbl9saXN0W2lkXTtcbiAgICB9LFxuXG4gICAgLy/orr7nva7lip/og73lm77moIfnmoTnuqLngrnnirbmgIEs5Li76KaB5pivZnVuY3Rpb25fZGF0YV9pbmZv55qE5pWw5o2uXG4gICAgc2V0RnVuY3Rpb25UaXBzU3RhdHVzOiBmdW5jdGlvbiAoaWQsIGRhdGEpIHtcbiAgICAgICAgaWQgPSBOdW1iZXIoaWQpO1xuICAgICAgICBpZiAodHlwZW9mIChpZCkgIT0gXCJudW1iZXJcIikgcmV0dXJuXG4gICAgICAgIHZhciB2byA9IHRoaXMuZ2V0RnVuY3Rpb25JY29uQnlJZChpZCk7XG4gICAgICAgIGlmICh2bykge1xuICAgICAgICAgICAgdm8uc2V0VGlwc1N0YXR1cyhkYXRhKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNhY2hlX3RpcHNfbGlzdCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jYWNoZV90aXBzX2xpc3QgPSB7fVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiAoZGF0YSkgPT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgICAgIGlmIChkYXRhLmJpZCA9PSBudWxsIHx8IHR5cGVvZiAoZGF0YS5iaWQpICE9IFwibnVtYmVyXCIpIHJldHVyblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNhY2hlX3RpcHNfbGlzdFtpZF0gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhY2hlX3RpcHNfbGlzdFtpZF0gPSB7fVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZGF0YS5iaWQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhY2hlX3RpcHNfbGlzdFtpZF1bZGF0YS5iaWRdID0gZGF0YTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuY2FjaGVfdGlwc19saXN0W2lkXSA9IGRhdGFcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvL+ajgOafpee6oueCueeKtuaAgVxuICAgICAgICB0aGlzLmNoZWNrTWFpblNjZW5lSWNvblN0YXR1cygpXG4gICAgfSxcblxuICAgIC8v5Yik5pat5Li75Z+O5Zu+5qCH55qE57qi54K554q25oCBLOmcgOimgeajgOafpeS4u+WfjuW7uuetkeS7peWPiuWKn+iDvee6oueCuVxuICAgIGNoZWNrTWFpblNjZW5lSWNvblN0YXR1czogZnVuY3Rpb24gKCkge1xuICAgICAgICAvL+mmluWFiOWIpOaWreWbvuagh+e6oueCueWQp1xuICAgICAgICB2YXIgbWFpbl9zY2VuZV9idG5fc3RhdHVzID0gZmFsc2U7XG4gICAgICAgIGZvciAodmFyIGsgaW4gdGhpcy5mdW5jdGlvbl9saXN0KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5mdW5jdGlvbl9saXN0W2tdICYmIHRoaXMuZnVuY3Rpb25fbGlzdFtrXS5nZXRUaXBzU3RhdHVzKCkgPT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIG1haW5fc2NlbmVfYnRuX3N0YXR1cyA9IHRydWU7XG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvL+WmguaenOaciee6oueCueeahOivnSznm7TmjqXot7Pov4fkuoZcbiAgICAgICAgaWYgKG1haW5fc2NlbmVfYnRuX3N0YXR1cyA9PSB0cnVlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5tYWluX3NjZW5lX2J0bl9zdGF0dXMgPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1haW5fc2NlbmVfYnRuX3N0YXR1cyA9IHRydWU7XG4gICAgICAgICAgICAgICAgLy8gdGhpcy5zZXRCdG5SZWRQb2ludChNYWludWlDb25zdC5idG5faW5kZXgubWFpbl9zY2VuZSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0QnRuUmVkUG9pbnQoTWFpbnVpQ29uc3QuYnRuX2luZGV4Lm1haW5fc2NlbmUsIHRoaXMubWFpbl9zY2VuZV9idG5fc3RhdHVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGJ1aWxkX2xpc3QgPSByZXF1aXJlKFwibWFpbnNjZW5lX2NvbnRyb2xsZXJcIikuZ2V0SW5zdGFuY2UoKS5nZXRCdWlsZFZvTGlzdCgpO1xuICAgICAgICBpZiAoYnVpbGRfbGlzdCkge1xuICAgICAgICAgICAgZm9yICh2YXIgayBpbiBidWlsZF9saXN0KSB7XG4gICAgICAgICAgICAgICAgaWYgKGJ1aWxkX2xpc3Rba10uZ2V0VGlwc1N0YXR1cygpID09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgbWFpbl9zY2VuZV9idG5fc3RhdHVzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1haW5fc2NlbmVfYnRuX3N0YXR1cyAhPSB0aGlzLm1haW5fc2NlbmVfYnRuX3N0YXR1cykge1xuICAgICAgICAgICAgdGhpcy5tYWluX3NjZW5lX2J0bl9zdGF0dXMgPSBtYWluX3NjZW5lX2J0bl9zdGF0dXM7XG4gICAgICAgICAgICAvLyB0aGlzLnNldEJ0blJlZFBvaW50KE1haW51aUNvbnN0LmJ0bl9pbmRleC5tYWluX3NjZW5lLCBmYWxzZSk7XG4gICAgICAgICAgICB0aGlzLnNldEJ0blJlZFBvaW50KE1haW51aUNvbnN0LmJ0bl9pbmRleC5tYWluX3NjZW5lLCB0aGlzLm1haW5fc2NlbmVfYnRuX3N0YXR1cyk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8g5Ymn5oOF56ug6IqC5Y+Y5YyW55qE5pe25YCZ5Yik5pat5a6i5oi356uv6Ieq5bex55qE5Zu+5qCH5byA5ZCv54q25oCBXG4gICAgdXBkYXRlTWFpbkJ0blN0YXR1czogZnVuY3Rpb24gKG1heF9kdW4pIHtcbiAgICAgICAgaWYgKHRoaXMubWFpbnVpKSB7XG4gICAgICAgICAgICB0aGlzLm1haW51aS5jaGVja1VuTG9ja1N0YXR1cyhtYXhfZHVuKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubWF4X2R1bl9pZCA9IG1heF9kdW47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNoZWNrRnVuY3Rpb25CeURyYW1hKG1heF9kdW4pO1xuICAgIH0sXG5cbiAgICAvL+WIneWni+WMluWbvuaghyzmib7lh7rmmK/lrqLmiLfnq6/liJvlu7rlubbkuJTovr7liLDnrYnnuqfnmoRcbiAgICBjaGVja0Z1bmN0aW9uQnlSb2xlTGV2OiBmdW5jdGlvbiAobGV2KSB7XG4gICAgICAgIGlmICh0aGlzLm1haW51aSA9PSBudWxsKSByZXR1cm4gLy/nmbvlvZXkuIrnur/mnInljYfnuqfnmoTml7blgJks6L+Z5Liq5pe25YCZ5Lya5YWI5LqOb3BlbnVp6L+H5p2lLOaJgOS7peayoeW/heimgeWIm+W7ulxuICAgICAgICB2YXIgcm9sZV92byA9IFJvbGVDb250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0Um9sZVZvKCk7XG4gICAgICAgIGlmIChyb2xlX3ZvID09IG51bGwpIHJldHVyblxuICAgICAgICBsZXYgPSBsZXYgfHwgcm9sZV92by5sZXY7XG4gICAgICAgIHZhciBhZGRfbGlzdCA9IFtdO1xuICAgICAgICBmb3IgKHZhciBrIGluIENvbmZpZy5mdW5jdGlvbl9kYXRhLmRhdGFfaW5mbykge1xuICAgICAgICAgICAgdmFyIGNvbmZpZyA9IENvbmZpZy5mdW5jdGlvbl9kYXRhLmRhdGFfaW5mb1trXTtcbiAgICAgICAgICAgIGlmICh0aGlzLmZ1bmN0aW9uX2xpc3RbY29uZmlnLmlkXSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKElTX1NIT1dfQ0hBUkdFID09IHRydWUgfHwgKElTX1NIT1dfQ0hBUkdFID09IGZhbHNlICYmIGNvbmZpZy5pc192ZXJpZnlpb3MgPT0gMSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5vcGVuX3R5cGUgPT0gMSAmJiBjb25maWcuYWN0aXZhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhY3RpdmF0ZSA9IGNvbmZpZy5hY3RpdmF0ZVswXSAvL+W8gOWQr+adoeS7tlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGl2YXRlICYmIGFjdGl2YXRlWzBdICYmIGFjdGl2YXRlWzFdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFjdGl2YXRlX2NvbmRpdGlvbiA9IGFjdGl2YXRlWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhY3RpdmF0ZV92YWx1ZSA9IGFjdGl2YXRlWzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhY3RpdmF0ZV9jb25kaXRpb24gPT0gXCJsZXZcIiAmJiBsZXYgPj0gYWN0aXZhdGVfdmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZ1bmN0aW9uX3ZvID0gdGhpcy5jcmVhdGVGdW5jdGlvblZvKGNvbmZpZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmdW5jdGlvbl92byAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZ1bmN0aW9uX2xpc3RbY29uZmlnLmlkXSA9IGZ1bmN0aW9uX3ZvO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkX2xpc3QucHVzaChmdW5jdGlvbl92byk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY29yZS5HbG9iYWxFdmVudC5maXJlKE1haW51aUV2ZW50LlVQREFURV9GVU5DVElPTl9TVEFUVVMsIGNvbmZpZy5pZCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxldiA+PSBhY3RpdmF0ZV92YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aXZhdGVfY29uZGl0aW9uID09IFwic2hyaF9sZXZcIiAmJiBQTEFURk9STV9UWVBSID09IFwiU0hfUkhcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgKGNvbmZpZy5pZCA9PSBNYWludWlDb25zdC5pY29uLnNocmhfc3ViICYmIHdpbmRvdy5TSF9SSF9JU19TVUJTQ1JJQkUgPT0gdHJ1ZSkgY29udGludWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIChjb25maWcuaWQgPT0gTWFpbnVpQ29uc3QuaWNvbi5zaHJoX3NoYXJlICYmIHJlcXVpcmUoXCJ3ZWxmYXJlX2NvbnRyb2xsZXJcIikuZ2V0SW5zdGFuY2UoKS5nZXRNb2RlbCgpLmdldFNoYXJlQXdhcmRTdGF0dXMoKSA9PSAxKSBjb250aW51ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgKGNvbmZpZy5pZCA9PSBNYWludWlDb25zdC5pY29uLnNocmhfcmVhbG5hbWUgJiYgd2luZG93LlNIX1JIX0lTX1JFQUxOQU1FID09IHRydWUpIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiAoY29uZmlnLmlkID09IE1haW51aUNvbnN0Lmljb24uc2hyaF9zdWIgJiYgd2luZG93LlNIX1JIX0lTX1NVQlNDUklCRSA9PSB0cnVlIHx8IFNIX1JIX0lTX1NIT1dfU1VCU0NSSUJFID09IGZhbHNlKSBjb250aW51ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgKGNvbmZpZy5pZCA9PSBNYWludWlDb25zdC5pY29uLnNocmhfc2hhcmUgJiYgcmVxdWlyZShcIndlbGZhcmVfY29udHJvbGxlclwiKS5nZXRJbnN0YW5jZSgpLmdldE1vZGVsKCkuZ2V0U2hhcmVBd2FyZFN0YXR1cygpID09IDEgfHwgU0hfUkhfSVNfU0hPV19TSEFSRSA9PSBmYWxzZSkgY29udGludWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIChjb25maWcuaWQgPT0gTWFpbnVpQ29uc3QuaWNvbi5zaHJoX3JlYWxuYW1lICYmIHdpbmRvdy5TSF9SSF9JU19SRUFMTkFNRSA9PSB0cnVlIHx8IFNIX1JIX0lTX1NIT1dfUkVBTE5BTUUgPT0gZmFsc2UpIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLmlkID09IE1haW51aUNvbnN0Lmljb24uc2hyaF9zdWIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAod2luZG93LlNIX1JIX0lTX1NVQlNDUklCRSA9PSB0cnVlIHx8IFNIX1JIX0lTX1NIT1dfU1VCU0NSSUJFID09IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5pZCA9PSBNYWludWlDb25zdC5pY29uLnNocmhfc2hhcmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoU0hfUkhfSVNfU0hPV19TSEFSRSA9PSBmYWxzZSB8fCByZXF1aXJlKFwid2VsZmFyZV9jb250cm9sbGVyXCIpLmdldEluc3RhbmNlKCkuZ2V0TW9kZWwoKS5nZXRTaGFyZUF3YXJkU3RhdHVzKCkgPT0gMSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcuaWQgPT0gTWFpbnVpQ29uc3QuaWNvbi5zaHJoX3JlYWxuYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdpbmRvdy5TSF9SSF9JU19SRUFMTkFNRSA9PSB0cnVlIHx8IFNIX1JIX0lTX1NIT1dfUkVBTE5BTUUgPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZnVuY3Rpb25fdm8gPSB0aGlzLmNyZWF0ZUZ1bmN0aW9uVm8oY29uZmlnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmdW5jdGlvbl92byAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mdW5jdGlvbl9saXN0W2NvbmZpZy5pZF0gPSBmdW5jdGlvbl92bztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRfbGlzdC5wdXNoKGZ1bmN0aW9uX3ZvKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY29yZS5HbG9iYWxFdmVudC5maXJlKE1haW51aUV2ZW50LlVQREFURV9GVU5DVElPTl9TVEFUVVMsIGNvbmZpZy5pZCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aXZhdGVfY29uZGl0aW9uID09IFwic2h3eF9sZXZcIiAmJiBQTEFURk9STV9UWVBSID09IFwiU0hfU0RLXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcuaWQgPT0gTWFpbnVpQ29uc3QuaWNvbi5zaHd4X3N1YiAmJiB3aW5kb3cuU0hfU0RLX0ZPTExPVyA9PSB0cnVlKSBjb250aW51ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5pZCA9PSBNYWludWlDb25zdC5pY29uLnNod3hfc2hhcmUgJiYgcmVxdWlyZShcIndlbGZhcmVfY29udHJvbGxlclwiKS5nZXRJbnN0YW5jZSgpLmdldE1vZGVsKCkuZ2V0U2hhcmVBd2FyZFN0YXR1cygpID09IDEpIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLmlkID09IE1haW51aUNvbnN0Lmljb24uc2h3eF9jb2xsZWN0ICYmIHJlcXVpcmUoXCJ3ZWxmYXJlX2NvbnRyb2xsZXJcIikuZ2V0SW5zdGFuY2UoKS5nZXRNb2RlbCgpLmdldENvbGxlY3RBd2FyZFN0YXR1cygpID09IDEpIGNvbnRpbnVlXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmdW5jdGlvbl92byA9IHRoaXMuY3JlYXRlRnVuY3Rpb25Wbyhjb25maWcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bmN0aW9uX3ZvICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZ1bmN0aW9uX2xpc3RbY29uZmlnLmlkXSA9IGZ1bmN0aW9uX3ZvO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZF9saXN0LnB1c2goZnVuY3Rpb25fdm8pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LmZpcmUoTWFpbnVpRXZlbnQuVVBEQVRFX0ZVTkNUSU9OX1NUQVRVUywgY29uZmlnLmlkLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChVdGlscy5uZXh0KGFkZF9saXN0KSkge1xuICAgICAgICAgICAgaWYgKHRoaXMubWFpbnVpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tYWludWkuYWRkSWNvbkxpc3QoYWRkX2xpc3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8v55uR5rWL5piv5ZCm5pyJ5bim5Yib5bu655qE5Zu+5qCHXG4gICAgICAgIHRoaXMuY2hlY2tDYWNoZVdhaXRGdW5jdGlvbigpO1xuICAgIH0sXG5cbiAgICAvL+agueaNruWJr+acrOi/m+W6puWIm+W7uuWbvuagh1xuICAgIGNoZWNrRnVuY3Rpb25CeURyYW1hOiBmdW5jdGlvbiAobWF4X2R1bl9pZCkge1xuICAgICAgICB2YXIgYWRkX2xpc3QgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgayBpbiBDb25maWcuZnVuY3Rpb25fZGF0YS5kYXRhX2luZm8pIHtcbiAgICAgICAgICAgIHZhciBjb25maWcgPSBDb25maWcuZnVuY3Rpb25fZGF0YS5kYXRhX2luZm9ba107XG4gICAgICAgICAgICBpZiAodGhpcy5mdW5jdGlvbl9saXN0W2NvbmZpZy5pZF0gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlmIChJU19TSE9XX0NIQVJHRSA9PSB0cnVlIHx8IChJU19TSE9XX0NIQVJHRSA9PSBmYWxzZSAmJiBjb25maWcuaXNfdmVyaWZ5aW9zID09IDEpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcub3Blbl90eXBlID09IDEgJiYgY29uZmlnLmFjdGl2YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgYWN0aXZhdGUgPSBjb25maWcuYWN0aXZhdGVbMF0gLy/lvIDlkK/mnaHku7ZcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhY3RpdmF0ZSAmJiBhY3RpdmF0ZVswXSAmJiBhY3RpdmF0ZVsxXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhY3RpdmF0ZV9jb25kaXRpb24gPSBhY3RpdmF0ZVswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYWN0aXZhdGVfdmFsdWUgPSBhY3RpdmF0ZVsxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aXZhdGVfY29uZGl0aW9uID09IFwiZHVuXCIgJiYgbWF4X2R1bl9pZCA+PSBhY3RpdmF0ZV92YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZnVuY3Rpb25fdm8gPSB0aGlzLmNyZWF0ZUZ1bmN0aW9uVm8oY29uZmlnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bmN0aW9uX3ZvICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZnVuY3Rpb25fbGlzdFtjb25maWcuaWRdID0gZnVuY3Rpb25fdm87XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRfbGlzdC5wdXNoKGZ1bmN0aW9uX3ZvKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LmZpcmUoTWFpbnVpRXZlbnQuVVBEQVRFX0ZVTkNUSU9OX1NUQVRVUywgY29uZmlnLmlkLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoVXRpbHMubmV4dChhZGRfbGlzdCkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm1haW51aSkge1xuICAgICAgICAgICAgICAgIHRoaXMubWFpbnVpLmFkZEljb25MaXN0KGFkZF9saXN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyDnm5HmtYvmmK/lkKbmnInlvoXliJvlu7rnmoTlm77moIdcbiAgICAgICAgdGhpcy5jaGVja0NhY2hlV2FpdEZ1bmN0aW9uKCk7XG4gICAgfSxcblxuXG4gICAgLy/nm5HmtYvmmK/lkKbmnInopoHmsYLliJvlu7rml7blgJnkuI3mu6HotrPmg4XlhrXnmoTlm77moIdcbiAgICBjaGVja0NhY2hlV2FpdEZ1bmN0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmNhY2hlX3dhaXRfY3JlYXRlX2xpc3QgPT0gbnVsbCB8fCBVdGlscy5nZXRBcnJMZW4odGhpcy5jYWNoZV93YWl0X2NyZWF0ZV9saXN0KSA9PSAwKSByZXR1cm5cbiAgICAgICAgdmFyIHJvbGVfdm8gPSBSb2xlQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldFJvbGVWbygpO1xuICAgICAgICB2YXIgZHJhbWFfZGF0YSA9IEJhdHRsZURyYW1hQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldE1vZGVsKCkuZ2V0RHJhbWFEYXRhKCk7XG4gICAgICAgIGZvciAodmFyIGsgaW4gdGhpcy5jYWNoZV93YWl0X2NyZWF0ZV9saXN0KSB7XG4gICAgICAgICAgICB2YXIgdiA9IHRoaXMuY2FjaGVfd2FpdF9jcmVhdGVfbGlzdFtrXTtcbiAgICAgICAgICAgIHZhciBjb25maWcgPSBnZGF0YShcImZ1bmN0aW9uX2RhdGFcIiwgXCJkYXRhX2luZm9cIiwgW2tdKTtcbiAgICAgICAgICAgIGlmIChjb25maWcgPT0gbnVsbCB8fCBjb25maWcuYWN0aXZhdGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHYgPSBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgYWN0aXZhdGUgPSBjb25maWcuYWN0aXZhdGVbMF07XG4gICAgICAgICAgICAgICAgaWYgKGFjdGl2YXRlWzBdID09IG51bGwgfHwgYWN0aXZhdGVbMV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB2ID09IG51bGw7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFjdGl2YXRlX2NvbmRpdGlvbiA9IGFjdGl2YXRlWzBdO1xuICAgICAgICAgICAgICAgICAgICB2YXIgYWN0aXZhdGVfdmFsdWUgPSBhY3RpdmF0ZVsxXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKChhY3RpdmF0ZV9jb25kaXRpb24gPT0gXCJsZXZcIiAmJiByb2xlX3ZvICYmIHJvbGVfdm8ubGV2ID49IGFjdGl2YXRlX3ZhbHVlKSB8fCAoYWN0aXZhdGVfY29uZGl0aW9uID09IFwiZHVuXCIgJiYgZHJhbWFfZGF0YSAmJiBkcmFtYV9kYXRhLm1heF9kdW5faWQgPj0gYWN0aXZhdGVfdmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZnVuY3Rpb25fdm8gPSB0aGlzLmNyZWF0ZUZ1bmN0aW9uVm8oY29uZmlnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmdW5jdGlvbl92byAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBhcmFtcyA9IHY7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25fdm8udXBkYXRlKHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mdW5jdGlvbl9saXN0W2tdID0gZnVuY3Rpb25fdm87XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubWFpbnVpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWFpbnVpLmFkZEljb24oZnVuY3Rpb25fdm8pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ID0gbnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8v57yT5a2Y5Zu+5qCH5Yib5bu65oiQ5Yqf5LmL5ZCOXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQuZmlyZShNYWludWlFdmVudC5VUERBVEVfRlVOQ1RJT05fU1RBVFVTLCBrLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyb2xlX3ZvICYmIHJvbGVfdm8ubGV2ID49IGFjdGl2YXRlX3ZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aXZhdGVfY29uZGl0aW9uID09IFwic2hyaF9sZXZcIiAmJiBQTEFURk9STV9UWVBSID09IFwiU0hfUkhcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIChjb25maWcuaWQgPT0gTWFpbnVpQ29uc3QuaWNvbi5zaHJoX3N1YiAmJiB3aW5kb3cuU0hfUkhfSVNfU1VCU0NSSUJFID09IHRydWUpIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgKGNvbmZpZy5pZCA9PSBNYWludWlDb25zdC5pY29uLnNocmhfc2hhcmUpIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgKGNvbmZpZy5pZCA9PSBNYWludWlDb25zdC5pY29uLnNocmhfcmVhbG5hbWUgJiYgd2luZG93LlNIX1JIX0lTX1JFQUxOQU1FID09IHRydWUpIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5pZCA9PSBNYWludWlDb25zdC5pY29uLnNocmhfc3ViKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3aW5kb3cuU0hfUkhfSVNfU1VCU0NSSUJFID09IHRydWUgfHwgU0hfUkhfSVNfU0hPV19TVUJTQ1JJQkUgPT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLmlkID09IE1haW51aUNvbnN0Lmljb24uc2hyaF9zaGFyZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoU0hfUkhfSVNfU0hPV19TSEFSRSA9PSBmYWxzZSB8fCByZXF1aXJlKFwid2VsZmFyZV9jb250cm9sbGVyXCIpLmdldEluc3RhbmNlKCkuZ2V0TW9kZWwoKS5nZXRTaGFyZUF3YXJkU3RhdHVzKCkgPT0gMSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcuaWQgPT0gTWFpbnVpQ29uc3QuaWNvbi5zaHJoX3JlYWxuYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3aW5kb3cuU0hfUkhfSVNfUkVBTE5BTUUgPT0gdHJ1ZSB8fCBTSF9SSF9JU19TSE9XX1JFQUxOQU1FID09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmdW5jdGlvbl92byA9IHRoaXMuY3JlYXRlRnVuY3Rpb25Wbyhjb25maWcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmdW5jdGlvbl92byAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwYXJhbXMgPSB2O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbl92by51cGRhdGUocGFyYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mdW5jdGlvbl9saXN0W2tdID0gZnVuY3Rpb25fdm87XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm1haW51aSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYWludWkuYWRkSWNvbihmdW5jdGlvbl92byk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9IG51bGxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy/nvJPlrZjlm77moIfliJvlu7rmiJDlip/kuYvlkI5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQuZmlyZShNYWludWlFdmVudC5VUERBVEVfRlVOQ1RJT05fU1RBVFVTLCBrLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGl2YXRlX2NvbmRpdGlvbiA9PSBcInNod3hfbGV2XCIgJiYgUExBVEZPUk1fVFlQUiA9PSBcIlNIX1NES1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5pZCA9PSBNYWludWlDb25zdC5pY29uLnNod3hfc3ViICYmIHdpbmRvdy5TSF9TREtfRk9MTE9XID09IHRydWUpIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5pZCA9PSBNYWludWlDb25zdC5pY29uLnNod3hfc2hhcmUgJiYgcmVxdWlyZShcIndlbGZhcmVfY29udHJvbGxlclwiKS5nZXRJbnN0YW5jZSgpLmdldE1vZGVsKCkuZ2V0U2hhcmVBd2FyZFN0YXR1cygpID09IDEpIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5pZCA9PSBNYWludWlDb25zdC5pY29uLnNod3hfY29sbGVjdCAmJiByZXF1aXJlKFwid2VsZmFyZV9jb250cm9sbGVyXCIpLmdldEluc3RhbmNlKCkuZ2V0TW9kZWwoKS5nZXRDb2xsZWN0QXdhcmRTdGF0dXMoKSA9PSAxKSBjb250aW51ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmdW5jdGlvbl92byA9IHRoaXMuY3JlYXRlRnVuY3Rpb25Wbyhjb25maWcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmdW5jdGlvbl92byAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwYXJhbXMgPSB2O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbl92by51cGRhdGUocGFyYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mdW5jdGlvbl9saXN0W2tdID0gZnVuY3Rpb25fdm87XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm1haW51aSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYWludWkuYWRkSWNvbihmdW5jdGlvbl92byk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9IG51bGxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy/nvJPlrZjlm77moIfliJvlu7rmiJDlip/kuYvlkI5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQuZmlyZShNYWludWlFdmVudC5VUERBVEVfRlVOQ1RJT05fU1RBVFVTLCBrLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgZ2V0RnVjbnRpb25JY29uVm9CeUlkOiBmdW5jdGlvbiAoaWQpIHtcbiAgICAgICAgaWYgKHRoaXMuZnVuY3Rpb25fbGlzdCAmJiBVdGlscy5uZXh0KHRoaXMuZnVuY3Rpb25fbGlzdCB8fCB7fSkgIT0gbnVsbCAmJiB0aGlzLmZ1bmN0aW9uX2xpc3RbaWRdKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZnVuY3Rpb25fbGlzdFtpZF1cbiAgICB9LFxuXG4gICAgLy/liJvlu7rkuIDkuKrlm77moIfmlbDmja5cbiAgICBjcmVhdGVGdW5jdGlvblZvOiBmdW5jdGlvbiAoY29uZmlnKSB7XG4gICAgICAgIGlmIChjb25maWcgPT0gbnVsbCkgcmV0dXJuXG4gICAgICAgIGlmIChjb25maWcuaWQgPT0gTWFpbnVpQ29uc3QuaWNvbi5hY3Rpb24gfHwgY29uZmlnLmlkID09IE1haW51aUNvbnN0Lmljb24uZmVzdGl2YWwpIHtcbiAgICAgICAgICAgIHZhciBBY3Rpb25Db250cm9sbGVyID0gcmVxdWlyZShcImFjdGlvbl9jb250cm9sbGVyXCIpO1xuICAgICAgICAgICAgdmFyIGNhbl9hZGQgPSBBY3Rpb25Db250cm9sbGVyLmdldEluc3RhbmNlKCkuY2hlY2tDYW5BZGRXb25kZXJmdWwoY29uZmlnLmlkKTtcbiAgICAgICAgICAgIGlmIChjYW5fYWRkID09IGZhbHNlKSByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICB2YXIgZnVuY3Rpb25fdm8gPSB0aGlzLmZ1bmN0aW9uX2xpc3RbY29uZmlnLmlkXTtcbiAgICAgICAgaWYgKGZ1bmN0aW9uX3ZvID09IG51bGwpIHtcbiAgICAgICAgICAgIGZ1bmN0aW9uX3ZvID0gVXRpbHMuY3JlYXRlQ2xhc3MoXCJmdW5jdGlvbl9pY29uX3ZvXCIsIGNvbmZpZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY2FjaGVfd2FpdF9jcmVhdGVfbGlzdFtjb25maWcuaWRdICE9IG51bGwpIHtcbiAgICAgICAgICAgIGZ1bmN0aW9uX3ZvLnVwZGF0ZSh0aGlzLmNhY2hlX3dhaXRfY3JlYXRlX2xpc3RbY29uZmlnLmlkXSk7XG4gICAgICAgICAgICAvLyB0aGlzLmNhY2hlX3dhaXRfY3JlYXRlX2xpc3RbY29uZmlnLmlkXSA9IG51bGw7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5jYWNoZV93YWl0X2NyZWF0ZV9saXN0W2NvbmZpZy5pZF1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jYWNoZV90aXBzX2xpc3RbY29uZmlnLmlkXSAhPSBudWxsKSB7XG4gICAgICAgICAgICBmdW5jdGlvbl92by5zZXRUaXBzU3RhdHVzKHRoaXMuY2FjaGVfdGlwc19saXN0W2NvbmZpZy5pZF0pO1xuICAgICAgICAgICAgdGhpcy5jYWNoZV90aXBzX2xpc3RbY29uZmlnLmlkXSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYgKGNvbmZpZy5pZCA9PSBNYWludWlDb25zdC5pY29uLmFjdGlvbikge1xuICAgICAgICAvLyAgICAgcmVxdWlyZShcImFjdGlvbl9jb250cm9sbGVyXCIpLmdldEluc3RhbmNlKCkucmVxdWVzdEFjdGlvbkF3YXJkU3RhdHVzKEFjdGlvbkNvbnN0LkFjdGlvblR5cGUuV29uZGVyZnVsKTtcbiAgICAgICAgLy8gfSBlbHNlIGlmIChjb25maWcuaWQgPT0gTWFpbnVpQ29uc3QuaWNvbi5jb21iaW5lKSB7XG4gICAgICAgIC8vICAgICByZXF1aXJlKFwiYWN0aW9uX2NvbnRyb2xsZXJcIikuZ2V0SW5zdGFuY2UoKS5yZXF1ZXN0QWN0aW9uQXdhcmRTdGF0dXMoQWN0aW9uQ29uc3QuQWN0aW9uVHlwZS5Db21iaW5lKTtcbiAgICAgICAgLy8gfVxuICAgICAgICByZXR1cm4gZnVuY3Rpb25fdm9cbiAgICB9LFxuXG4gICAgLy/mt7vliqDlm77moIdcbiAgICBhZGRGdW5jdGlvbkljb25CeUlkOiBmdW5jdGlvbiAoaWQpIHtcbiAgICAgICAgaWYgKGlkID09IG51bGwpIHJldHVybjtcbiAgICAgICAgdmFyIGZ1bmN0aW9uX3ZvID0gdGhpcy5mdW5jdGlvbl9saXN0W2lkXTtcbiAgICAgICAgbGV0IHBhcmFtcyA9IFtdXG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICBwYXJhbXMucHVzaChhcmd1bWVudHNbaV0pXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZ1bmN0aW9uX3ZvKSB7XG4gICAgICAgICAgICBmdW5jdGlvbl92by51cGRhdGUocGFyYW1zKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY29uZmlnID0gQ29uZmlnLmZ1bmN0aW9uX2RhdGEuZGF0YV9pbmZvW2lkXTtcbiAgICAgICAgaWYgKGNvbmZpZyA9PSBudWxsIHx8IGNvbmZpZy5hY3RpdmF0ZSA9PSBudWxsKSByZXR1cm47XG4gICAgICAgIGlmIChJU19TSE9XX0NIQVJHRSA9PSBmYWxzZSAmJiBjb25maWcuaXNfdmVyaWZ5aW9zID09IDApIHJldHVybjtcbiAgICAgICAgdmFyIGFjdGl2YXRlID0gY29uZmlnLmFjdGl2YXRlWzBdO1xuICAgICAgICBpZiAoYWN0aXZhdGUgPT0gbnVsbCB8fCBhY3RpdmF0ZVswXSA9PSBudWxsIHx8IGFjdGl2YXRlWzFdID09IG51bGwpIHJldHVyblxuICAgICAgICB2YXIgYWN0aXZhdGVfY29uZGl0aW9uID0gYWN0aXZhdGVbMF07XG4gICAgICAgIHZhciBhY3RpdmF0ZV92YWx1ZSA9IGFjdGl2YXRlWzFdO1xuICAgICAgICB2YXIgcm9sZV92byA9IFJvbGVDb250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0Um9sZVZvKCk7XG4gICAgICAgIHZhciBkcmFtYV9kYXRhID0gQmF0dGxlRHJhbWFDb250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0TW9kZWwoKS5nZXREcmFtYURhdGEoKTtcbiAgICAgICAgaWYgKChhY3RpdmF0ZV9jb25kaXRpb24gPT0gXCJsZXZcIiAmJiByb2xlX3ZvICYmIHJvbGVfdm8ubGV2ID49IGFjdGl2YXRlX3ZhbHVlKSB8fCAoYWN0aXZhdGVfY29uZGl0aW9uID09IFwiZHVuXCIgJiYgZHJhbWFfZGF0YSAmJiBkcmFtYV9kYXRhLm1heF9kdW5faWQgPj0gYWN0aXZhdGVfdmFsdWUpKSB7XG4gICAgICAgICAgICBmdW5jdGlvbl92byA9IHRoaXMuY3JlYXRlRnVuY3Rpb25Wbyhjb25maWcpOyAgICAvLyDliJvlu7pcbiAgICAgICAgICAgIGlmIChmdW5jdGlvbl92bykge1xuICAgICAgICAgICAgICAgIGZ1bmN0aW9uX3ZvLnVwZGF0ZShwYXJhbXMpO1xuICAgICAgICAgICAgICAgIHRoaXMuZnVuY3Rpb25fbGlzdFtpZF0gPSBmdW5jdGlvbl92bztcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5tYWludWkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYWludWkuYWRkSWNvbihmdW5jdGlvbl92byk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIOmAmuefpea3u+WKoOS4gOS4quWbvuagh1xuICAgICAgICAgICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LmZpcmUoTWFpbnVpRXZlbnQuVVBEQVRFX0ZVTkNUSU9OX1NUQVRVUywgaWQsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGFjdGl2YXRlX2NvbmRpdGlvbiA9PSBcInNocmhfbGV2XCIgJiYgcm9sZV92byAmJiByb2xlX3ZvLmxldiA+PSBhY3RpdmF0ZV92YWx1ZSkge1xuICAgICAgICAgICAgaWYgKFBMQVRGT1JNX1RZUFIgPT0gXCJTSF9SSFwiKSB7XG4gICAgICAgICAgICAgICAgLy8gaWYgKGNvbmZpZy5pZCA9PSBNYWludWlDb25zdC5pY29uLnNocmhfc3ViICYmIHdpbmRvdy5TSF9SSF9JU19TVUJTQ1JJQkUgPT0gdHJ1ZSkgcmV0dXJuXG4gICAgICAgICAgICAgICAgLy8gaWYgKGNvbmZpZy5pZCA9PSBNYWludWlDb25zdC5pY29uLnNocmhfc2hhcmUgJiYgd2luZG93LlNIX1JIX0lTX1NIQVJFID09IHRydWUpIHJldHVyblxuICAgICAgICAgICAgICAgIC8vIGlmIChjb25maWcuaWQgPT0gTWFpbnVpQ29uc3QuaWNvbi5zaHJoX3JlYWxuYW1lICYmIHdpbmRvdy5TSF9SSF9JU19SRUFMTkFNRSA9PSB0cnVlKSByZXR1cm5cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyBpZiAoY29uZmlnLmlkID09IE1haW51aUNvbnN0Lmljb24uc2hyaF9zdWIgJiYgd2luZG93LlNIX1JIX0lTX1NVQlNDUklCRSA9PSB0cnVlIHx8IFNIX1JIX0lTX1NIT1dfU1VCU0NSSUJFID09IGZhbHNlKSByZXR1cm5cbiAgICAgICAgICAgICAgICAvLyBpZiAoY29uZmlnLmlkID09IE1haW51aUNvbnN0Lmljb24uc2hyaF9zaGFyZSAmJiB3aW5kb3cuU0hfUkhfSVNfU0hBUkUgPT0gdHJ1ZSB8fCBTSF9SSF9JU19TSE9XX1NIQVJFID09IGZhbHNlKSByZXR1cm5cbiAgICAgICAgICAgICAgICAvLyBpZiAoY29uZmlnLmlkID09IE1haW51aUNvbnN0Lmljb24uc2hyaF9yZWFsbmFtZSAmJiB3aW5kb3cuU0hfUkhfSVNfUkVBTE5BTUUgPT0gdHJ1ZSB8fCBTSF9SSF9JU19TSE9XX1JFQUxOQU1FID09IGZhbHNlKSByZXR1cm5cbiAgICAgICAgICAgICAgICBpZiAoY29uZmlnLmlkID09IE1haW51aUNvbnN0Lmljb24uc2hyaF9zdWIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHdpbmRvdy5TSF9SSF9JU19TVUJTQ1JJQkUgPT0gdHJ1ZSB8fCBTSF9SSF9JU19TSE9XX1NVQlNDUklCRSA9PSBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY29uZmlnLmlkID09IE1haW51aUNvbnN0Lmljb24uc2hyaF9zaGFyZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoU0hfUkhfSVNfU0hPV19TSEFSRSA9PSBmYWxzZSB8fCB3aW5kb3cuU0hfUkhfSVNfU0hBUkUgPT0gdHJ1ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY29uZmlnLmlkID09IE1haW51aUNvbnN0Lmljb24uc2hyaF9yZWFsbmFtZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAod2luZG93LlNIX1JIX0lTX1JFQUxOQU1FID09IHRydWUgfHwgU0hfUkhfSVNfU0hPV19SRUFMTkFNRSA9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZnVuY3Rpb25fdm8gPSB0aGlzLmNyZWF0ZUZ1bmN0aW9uVm8oY29uZmlnKTsgICAgLy8g5Yib5bu6XG4gICAgICAgICAgICAgICAgaWYgKGZ1bmN0aW9uX3ZvKSB7XG4gICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uX3ZvLnVwZGF0ZShwYXJhbXMpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZ1bmN0aW9uX2xpc3RbaWRdID0gZnVuY3Rpb25fdm87XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm1haW51aSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYWludWkuYWRkSWNvbihmdW5jdGlvbl92byk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8g6YCa55+l5re75Yqg5LiA5Liq5Zu+5qCHXG4gICAgICAgICAgICAgICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LmZpcmUoTWFpbnVpRXZlbnQuVVBEQVRFX0ZVTkNUSU9OX1NUQVRVUywgaWQsIHRydWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChhY3RpdmF0ZV9jb25kaXRpb24gPT0gXCJzaHd4X2xldlwiICYmIHJvbGVfdm8gJiYgcm9sZV92by5sZXYgPj0gYWN0aXZhdGVfdmFsdWUpIHtcbiAgICAgICAgICAgIGlmIChQTEFURk9STV9UWVBSID09IFwiU0hfU0RLXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoY29uZmlnLmlkID09IE1haW51aUNvbnN0Lmljb24uc2h3eF9zdWIgJiYgd2luZG93LlNIX1NES19GT0xMT1cgPT0gdHJ1ZSkgcmV0dXJuXG4gICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5pZCA9PSBNYWludWlDb25zdC5pY29uLnNod3hfc2hhcmUgJiYgcmVxdWlyZShcIndlbGZhcmVfY29udHJvbGxlclwiKS5nZXRJbnN0YW5jZSgpLmdldE1vZGVsKCkuZ2V0U2hhcmVBd2FyZFN0YXR1cygpID09IDEpIHJldHVyblxuICAgICAgICAgICAgICAgIGlmIChjb25maWcuaWQgPT0gTWFpbnVpQ29uc3QuaWNvbi5zaHd4X2NvbGxlY3QgJiYgcmVxdWlyZShcIndlbGZhcmVfY29udHJvbGxlclwiKS5nZXRJbnN0YW5jZSgpLmdldE1vZGVsKCkuZ2V0Q29sbGVjdEF3YXJkU3RhdHVzKCkgPT0gMSkgcmV0dXJuXG4gICAgICAgICAgICAgICAgZnVuY3Rpb25fdm8gPSB0aGlzLmNyZWF0ZUZ1bmN0aW9uVm8oY29uZmlnKTsgICAgLy8g5Yib5bu6XG4gICAgICAgICAgICAgICAgaWYgKGZ1bmN0aW9uX3ZvKSB7XG4gICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uX3ZvLnVwZGF0ZShwYXJhbXMpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZ1bmN0aW9uX2xpc3RbaWRdID0gZnVuY3Rpb25fdm87XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm1haW51aSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYWludWkuYWRkSWNvbihmdW5jdGlvbl92byk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8g6YCa55+l5re75Yqg5LiA5Liq5Zu+5qCHXG4gICAgICAgICAgICAgICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LmZpcmUoTWFpbnVpRXZlbnQuVVBEQVRFX0ZVTkNUSU9OX1NUQVRVUywgaWQsIHRydWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY2FjaGVfd2FpdF9jcmVhdGVfbGlzdFtpZF0gPSBwYXJhbXM7ICAgICAgIC8vIOe8k+WtmOS7luS7rOeahOaVsOaNrlxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8v56e76Zmk5LiA5Liq5pyN5Yqh56uv5Zu+5qCHXG4gICAgcmVtb3ZlRnVuY3Rpb25JY29uQnlJZDogZnVuY3Rpb24gKGlkKSB7XG4gICAgICAgIGlmICghaWQpIHJldHVybjtcbiAgICAgICAgdmFyIGZ1bmN0aW9uX3ZvID0gdGhpcy5mdW5jdGlvbl9saXN0W2lkXTtcbiAgICAgICAgaWYgKGZ1bmN0aW9uX3ZvKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5tYWludWkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1haW51aS5yZW1vdmVJY29uKGlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZnVuY3Rpb25fbGlzdFtpZF0gPSBudWxsO1xuICAgICAgICAgICAgLy8gdGhpcy5jYWNoZV93YWl0X2NyZWF0ZV9saXN0W2lkXSA9IG51bGw7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5jYWNoZV93YWl0X2NyZWF0ZV9saXN0W2lkXVxuICAgICAgICAgICAgLy8g6YCa55+l5re75Yqg5LiA5Liq5Zu+5qCHXG4gICAgICAgICAgICBnY29yZS5HbG9iYWxFdmVudC5maXJlKE1haW51aUV2ZW50LlVQREFURV9GVU5DVElPTl9TVEFUVVMsIGlkLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8g5qC55o2u5byA5ZCv5p2h5Lu25Yik5pat6K+l5p2h5Lu25piv5ZCm5byA5ZCvLOWMheaLrOS6huetiee6pyzliafmg4Xnq6DoioJpZCzlvIDmnI3lpKnmlbAs5ZKMVmlw562J57qnXG4gICAgY2hlY2tJc09wZW5CeUFjdGl2YXRlOiBmdW5jdGlvbiAoYWN0aXZhdGUpIHtcbiAgICAgICAgaWYgKGFjdGl2YXRlID09IG51bGwgfHwgVXRpbHMubmV4dChhY3RpdmF0ZSkgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHZhciByb2xlX3ZvID0gcmVxdWlyZShcInJvbGVfY29udHJvbGxlclwiKS5nZXRJbnN0YW5jZSgpLmdldFJvbGVWbygpO1xuICAgICAgICB2YXIgZHJhbWFfZGF0YSA9IHJlcXVpcmUoXCJiYXR0bGVfZHJhbWFfY29udHJvbGxlclwiKS5nZXRJbnN0YW5jZSgpLmdldE1vZGVsKCkuZ2V0RHJhbWFEYXRhKCk7XG5cbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGFjdGl2YXRlLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IGFjdGl2YXRlW2luZGV4XTtcbiAgICAgICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgdmFyIGNvbmRpdGlvbl90eXBlID0gZWxlbWVudFswXTtcbiAgICAgICAgICAgICAgICB2YXIgY29uZGl0aW9uX3ZhbHVlID0gZWxlbWVudFsxXTtcbiAgICAgICAgICAgICAgICB2YXIgbWF4X3ZhbCA9IDA7XG4gICAgICAgICAgICAgICAgaWYgKGNvbmRpdGlvbl90eXBlID09IFwibGV2XCIgJiYgcm9sZV92bykge1xuICAgICAgICAgICAgICAgICAgICBtYXhfdmFsID0gcm9sZV92by5sZXY7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb25kaXRpb25fdHlwZSA9PSBcIm9wZW5fZGF5XCIgJiYgcm9sZV92bykge1xuICAgICAgICAgICAgICAgICAgICBtYXhfdmFsID0gcm9sZV92by5vcGVuX2RheTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbmRpdGlvbl90eXBlID09IFwidmlwX2xldlwiICYmIHJvbGVfdm8pIHtcbiAgICAgICAgICAgICAgICAgICAgbWF4X3ZhbCA9IHJvbGVfdm8udmlwX2xldjtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbmRpdGlvbl90eXBlID09IFwiZHVuXCIgJiYgZHJhbWFfZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICBtYXhfdmFsID0gZHJhbWFfZGF0YS5tYXhfZHVuX2lkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY29uZGl0aW9uX3ZhbHVlID4gbWF4X3ZhbCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG5cbiAgICAvLyDmmK/lkKblpITkuo7ml6DlsL3or5XngrzmiJjmlpfnmoR1aeaImOaWl+S4i1xuICAgIGNoZWNrSXNJbkVuZGxlc3NVSUZpZ2h0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnVpX2ZpZ2h0X3R5cGUgPT0gTWFpbnVpQ29uc3QudWlfZmlnaHRfdHlwZS5lbmRsZXNzO1xuICAgIH0sXG5cbiAgICBzZXRNYWluVUlCb3R0b21TdGF0dXM6IGZ1bmN0aW9uIChzdGF0dXMpIHtcbiAgICAgICAgaWYgKHRoaXMubWFpbnVpKVxuICAgICAgICAgICAgdGhpcy5tYWludWkuc2V0Qm90dG9tU3RhdHVzKHN0YXR1cyk7XG4gICAgfSxcblxuICAgIHNldE1haW5VSVRvcFN0YXR1czogZnVuY3Rpb24gKHN0YXR1cykge1xuICAgICAgICBpZiAodGhpcy5tYWludWkpXG4gICAgICAgICAgICB0aGlzLm1haW51aS5zZXRUb3BTdGF0dXMoc3RhdHVzKTtcbiAgICB9LFxuXG4gICAgZ2V0TWFpblVpUm9vdDogZnVuY3Rpb24gKHJvb3RfY2IpIHtcbiAgICAgICAgaWYgKHJvb3RfY2IpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm1haW51aSkge1xuICAgICAgICAgICAgICAgIHRoaXMubWFpbnVpLmdldFJvb3RXbmQocm9vdF9jYilcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcm9vdF9jYihudWxsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm1haW51aSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5tYWludWkucm9vdF93bmRcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBnZXRIaWRlQ29udGFpbmVyU3RhdHVzOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLm1haW51aSAmJiB0aGlzLm1haW51aS5nZXRIaWRlQ29udGFpbmVyU3RhdHVzKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5tYWludWkuZ2V0SGlkZUNvbnRhaW5lclN0YXR1cygpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGdldEl0ZW1FeGhpYnRpb25Sb290OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmV4aGliaXRpb25fdmlldylcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmV4aGliaXRpb25fdmlldy5yb290X3duZDtcbiAgICB9LFxuXG4gICAgc2hvd1Bvd2VyOiBmdW5jdGlvbiAocG93ZXJfYWRkLCBsYXN0X3Bvd2VyKSB7XG4gICAgICAgIGlmICh0aGlzLm1haW51aSlcbiAgICAgICAgICAgIHRoaXMubWFpbnVpLnNob3dQb3dlcihwb3dlcl9hZGQsIGxhc3RfcG93ZXIpO1xuICAgIH0sXG5cbiAgICBjaGFuZ2VIZXJvU3RhdHVzOiBmdW5jdGlvbiAoaXNfaGVybykge1xuICAgICAgICBpZiAodGhpcy5tYWludWkpXG4gICAgICAgICAgICB0aGlzLm1haW51aS5jaGFuZ2VIZXJvU3RhdHVzKGlzX2hlcm8pO1xuICAgIH0sXG4gICAgc2hvd0NoYXRCdG4oc3RhdHVzKSB7XG4gICAgICAgIGlmICh0aGlzLm1haW51aSkge1xuICAgICAgICAgICAgdGhpcy5tYWludWkuc2hvd0NoYXRCdG4oc3RhdHVzKVxuICAgICAgICB9XG4gICAgfSxcbiAgICBzZXRNYWluVUlDaGF0QnViYmxlU3RhdHVzKHN0YXR1cykge1xuICAgICAgICBpZiAodGhpcy5tYWludWkpIHtcbiAgICAgICAgICAgIHRoaXMubWFpbnVpLnNldE1haW5VSUNoYXRCdWJibGVTdGF0dXMoc3RhdHVzKVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIGdldFRhc2tUaXBzUGFuZWw6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMubWFpbnVpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5tYWludWkuZ2V0VGFza1RpcHNQYW5lbCgpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICAvL+S4u+eVjOmdouezu+e7n+aPkOekuui3s+i9rFxuICAgIG9uQ2xpY2tQcm9tcHRUaXBzSXRlbShkYXRhKSB7XG4gICAgICAgIHZhciBQcm9tcHRUeXBlQ29uc3QgPSByZXF1aXJlKFwicHJvbXB0X3R5cGVfY29uc3RcIilcbiAgICAgICAgaWYgKGRhdGEudHlwZSA9PSBQcm9tcHRUeXBlQ29uc3QuUHJpdmF0ZV9jaGF0KSB7ICAvL+engeiBilxuICAgICAgICAgICAgbGV0IHRlbXBfZGF0YSA9IHt9XG4gICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IGRhdGEubGlzdFswXS5kYXRhLmFyZ191aW50MzIubGVuZ3RoOyArK2spIHtcbiAgICAgICAgICAgICAgICBsZXQgdiA9IGRhdGEubGlzdFswXS5kYXRhLmFyZ191aW50MzJba11cbiAgICAgICAgICAgICAgICBpZiAodi5rZXkgPT0gMSkge1xuICAgICAgICAgICAgICAgICAgICB0ZW1wX2RhdGEucmlkID0gdi52YWx1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgZGF0YS5saXN0WzBdLmRhdGEuYXJnX3N0ci5sZW5ndGg7ICsraykge1xuICAgICAgICAgICAgICAgIGxldCB2ID0gZGF0YS5saXN0WzBdLmRhdGEuYXJnX3N0cltrXVxuICAgICAgICAgICAgICAgIGlmICh2LmtleSA9PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHRlbXBfZGF0YS5zcnZfaWQgPSB2LnZhbHVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKFV0aWxzLm5leHQodGVtcF9kYXRhKSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdmFyIENoYXRDb250cm9sbGVyID0gcmVxdWlyZShcImNoYXRfY29udHJvbGxlclwiKVxuICAgICAgICAgICAgICAgIHZhciBDaGF0Q29uc3QgPSByZXF1aXJlKFwiY2hhdF9jb25zdFwiKVxuICAgICAgICAgICAgICAgIENoYXRDb250cm9sbGVyLmdldEluc3RhbmNlKCkub3BlbkNoYXRQYW5lbChDaGF0Q29uc3QuQ2hhbm5lbC5GcmllbmQsIFwiZnJpZW5kXCIsIHRlbXBfZGF0YSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChkYXRhLnR5cGUgPT0gUHJvbXB0VHlwZUNvbnN0LkF0X25vdGljZSkge1xuICAgICAgICAgICAgdmFyIGNoYW5uZWwgPSBudWxsO1xuICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBkYXRhLmxpc3RbMF0uZGF0YS5hcmdfdWludDMyLmxlbmd0aDsgKytrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHYgPSBkYXRhLmxpc3RbMF0uZGF0YS5hcmdfdWludDMyW2tdXG4gICAgICAgICAgICAgICAgaWYgKHYua2V5ID09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgY2hhbm5lbCA9IHYudmFsdWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgQ2hhdENvbnRyb2xsZXIgPSByZXF1aXJlKFwiY2hhdF9jb250cm9sbGVyXCIpXG4gICAgICAgICAgICBDaGF0Q29udHJvbGxlci5nZXRJbnN0YW5jZSgpLm9wZW5DaGF0UGFuZWwobnVsbCxjaGFubmVsLG51bGwpXG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YS50eXBlID09IFByb21wdFR5cGVDb25zdC5FbmRsZXNzX3RyYWlsKSB7IC8v5peg5bC96K+V54K8XG4gICAgICAgICAgICB2YXIgRW5kbGVzc190cmFpbENvbnRyb2xsZXIgPSByZXF1aXJlKFwiZW5kbGVzc190cmFpbF9jb250cm9sbGVyXCIpO1xuICAgICAgICAgICAgRW5kbGVzc190cmFpbENvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5vcGVuRW5kbGVzc0J1ZmZWaWV3KHRydWUpXG4gICAgICAgIH1cbiAgICB9LFxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gTWFpblVpQ29udHJvbGxlcjtcbiJdfQ==