sonamu 0.8.13 → 0.8.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. package/dist/api/sonamu.d.ts.map +1 -1
  2. package/dist/api/sonamu.js +2 -3
  3. package/dist/auth/auth-generator.d.ts +8 -0
  4. package/dist/auth/auth-generator.d.ts.map +1 -1
  5. package/dist/auth/auth-generator.js +33 -1
  6. package/dist/auth/better-auth-entities.d.ts.map +1 -1
  7. package/dist/auth/better-auth-entities.js +12 -2
  8. package/dist/bin/cli.js +18 -3
  9. package/dist/cone/cone-generator.js +10 -4
  10. package/dist/database/knex.d.ts.map +1 -1
  11. package/dist/database/knex.js +64 -2
  12. package/dist/database/puri.d.ts +9 -1
  13. package/dist/database/puri.d.ts.map +1 -1
  14. package/dist/database/puri.js +42 -1
  15. package/dist/database/puri.types.d.ts +2 -0
  16. package/dist/database/puri.types.d.ts.map +1 -1
  17. package/dist/database/puri.types.js +6 -2
  18. package/dist/entity/entity-manager.d.ts +149 -1
  19. package/dist/entity/entity-manager.d.ts.map +1 -1
  20. package/dist/entity/entity-manager.js +68 -4
  21. package/dist/migration/__tests__/code-generation.search-text.test.js +435 -0
  22. package/dist/migration/code-generation.d.ts.map +1 -1
  23. package/dist/migration/code-generation.js +696 -32
  24. package/dist/migration/migration-set.js +3 -1
  25. package/dist/migration/postgresql-schema-reader.d.ts +16 -2
  26. package/dist/migration/postgresql-schema-reader.d.ts.map +1 -1
  27. package/dist/migration/postgresql-schema-reader.js +281 -7
  28. package/dist/stream/sse.js +5 -3
  29. package/dist/template/__tests__/generated.template.search-text.test.js +99 -0
  30. package/dist/template/generated.template.test-d.js +24 -0
  31. package/dist/template/implementations/generated.template.d.ts.map +1 -1
  32. package/dist/template/implementations/generated.template.js +2 -2
  33. package/dist/template/implementations/init_types.template.d.ts.map +1 -1
  34. package/dist/template/implementations/init_types.template.js +11 -3
  35. package/dist/template/zod-converter.d.ts.map +1 -1
  36. package/dist/template/zod-converter.js +6 -2
  37. package/dist/testing/dev-test-routes.d.ts.map +1 -1
  38. package/dist/testing/dev-test-routes.js +5 -3
  39. package/dist/testing/fixture-generator.d.ts +13 -0
  40. package/dist/testing/fixture-generator.d.ts.map +1 -1
  41. package/dist/testing/fixture-generator.js +105 -8
  42. package/dist/testing/fixture-manager.d.ts.map +1 -1
  43. package/dist/testing/fixture-manager.js +19 -2
  44. package/dist/types/__tests__/entity-json-schema-search-text.test.js +256 -0
  45. package/dist/types/types.d.ts +494 -1
  46. package/dist/types/types.d.ts.map +1 -1
  47. package/dist/types/types.js +117 -13
  48. package/dist/ui/api.d.ts.map +1 -1
  49. package/dist/ui/api.js +14 -2
  50. package/dist/ui/cdd-service.d.ts +16 -14
  51. package/dist/ui/cdd-service.d.ts.map +1 -1
  52. package/dist/ui/cdd-service.js +145 -37
  53. package/dist/ui/cdd-types.d.ts +60 -0
  54. package/dist/ui/cdd-types.d.ts.map +1 -0
  55. package/dist/ui/cdd-types.js +3 -0
  56. package/dist/ui-web/assets/index-D4XFBV-f.css +1 -0
  57. package/dist/ui-web/assets/{index-CQ_S40bD.js → index-D_19-Pi4.js} +87 -87
  58. package/dist/ui-web/index.html +2 -2
  59. package/package.json +7 -3
  60. package/src/api/sonamu.ts +1 -2
  61. package/src/auth/auth-generator.ts +38 -0
  62. package/src/auth/better-auth-entities.ts +18 -1
  63. package/src/bin/cli.ts +15 -1
  64. package/src/cone/cone-generator.ts +9 -3
  65. package/src/database/knex.ts +62 -4
  66. package/src/database/puri.ts +71 -0
  67. package/src/database/puri.types.ts +2 -0
  68. package/src/entity/entity-manager.ts +95 -3
  69. package/src/migration/__tests__/code-generation.search-text.test.ts +390 -0
  70. package/src/migration/code-generation.ts +848 -34
  71. package/src/migration/migration-set.ts +2 -0
  72. package/src/migration/postgresql-schema-reader.ts +366 -9
  73. package/src/skills/sonamu/auth-migration.md +80 -0
  74. package/src/skills/sonamu/cdd.md +148 -28
  75. package/src/skills/sonamu/cone.md +16 -0
  76. package/src/skills/sonamu/entity-relations.md +1 -1
  77. package/src/skills/sonamu/fixture-cli.md +4 -0
  78. package/src/skills/sonamu/frontend.md +65 -0
  79. package/src/skills/sonamu/migration.md +3 -1
  80. package/src/skills/sonamu/model.md +28 -0
  81. package/src/skills/sonamu/workflow.md +12 -5
  82. package/src/stream/sse.ts +4 -2
  83. package/src/template/__tests__/generated.template.search-text.test.ts +89 -0
  84. package/src/template/generated.template.test-d.ts +46 -0
  85. package/src/template/implementations/generated.template.ts +4 -1
  86. package/src/template/implementations/init_types.template.ts +20 -5
  87. package/src/template/zod-converter.ts +5 -0
  88. package/src/testing/dev-test-routes.ts +4 -2
  89. package/src/testing/fixture-generator.ts +157 -9
  90. package/src/testing/fixture-manager.ts +15 -1
  91. package/src/types/__tests__/entity-json-schema-search-text.test.ts +179 -0
  92. package/src/types/types.ts +168 -12
  93. package/src/ui/api.ts +24 -1
  94. package/src/ui/cdd-service.ts +195 -55
  95. package/src/ui/cdd-types.ts +73 -0
  96. package/dist/ui-web/assets/index-egkMxKos.css +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"fixture-manager.d.ts","sourceRoot":"","sources":["../../src/testing/fixture-manager.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAKjC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAGrD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EAIL,KAAK,mBAAmB,EACxB,KAAK,aAAa,EAClB,KAAK,oBAAoB,EAS1B,MAAM,gBAAgB,CAAC;AAIxB,sCAAsC;AACtC,MAAM,WAAW,qBAAqB;IACpC,OAAO,CAAC,EAAE;QACR,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;KAC9B,CAAC;CACH;AAED,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,IAAI,CAAqB;IACjC,IAAI,GAAG,CAAC,GAAG,EAAE,IAAI,EAEhB;IACD,IAAI,GAAG,IAAI,IAAI,CAKd;IAED,OAAO,CAAC,IAAI,CAAqB;IACjC,IAAI,GAAG,CAAC,GAAG,EAAE,IAAI,EAEhB;IACD,IAAI,GAAG,IAAI,IAAI,CAKd;IACD,gBAAgB,EAAE,MAAM,EAAE,GAAG,IAAI,CAAQ;IAEzC,OAAO,CAAC,aAAa,CAAuB;IAG5C,OAAO,CAAC,OAAO,CAAsC;IACrD,OAAO,CAAC,aAAa,CAAiC;IACtD,OAAO,CAAC,eAAe,CACX;IAEZ,IAAI;IAuBJ;;;MAGE;IACI,IAAI;IAyCV;;;OAGG;YACW,cAAc;IAyC5B,OAAO,CAAC,cAAc,CAAqB;IACrC,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE;IAoB7C,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAyEhF,OAAO;IAYP,WAAW,CACf,YAAY,EAAE,MAAM,cAAc,EAClC,YAAY,EAAE,MAAM,cAAc,EAClC,aAAa,EAAE,oBAAoB,EACnC,cAAc,CAAC,EAAE,qBAAqB;IAkFlC,mBAAmB,CACvB,MAAM,EAAE,MAAM,EACd,GAAG,EAAE;QACH,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;QACpB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;KACjD,EACD,OAAO,CAAC,EAAE;QACR,YAAY,CAAC,EAAE,OAAO,CAAC;QACvB,GAAG,CAAC,EAAE,IAAI,CAAC;KACZ,GACA,OAAO,CAAC,aAAa,EAAE,CAAC;IAwF3B;;;;;;;;;OASG;IACG,cAAc,CAClB,MAAM,EAAE,MAAM,cAAc,EAC5B,SAAS,EAAE,aAAa,EAAE,GACzB,OAAO,CAAC,mBAAmB,EAAE,CAAC;IA6NjC;;;OAGG;IACH,OAAO,CAAC,eAAe;IA+FvB;;OAEG;IACH,OAAO,CAAC,kBAAkB;YAqBZ,0BAA0B;IAiFxC;;;;;;;;;OASG;IACH,OAAO,CAAC,oBAAoB;YA+Dd,oBAAoB;YA6CpB,uBAAuB;IA8B/B,gBAAgB,CAAC,IAAI,EAAE,MAAM;CAepC;AAED,eAAO,MAAM,cAAc,qBAA4B,CAAC"}
1
+ {"version":3,"file":"fixture-manager.d.ts","sourceRoot":"","sources":["../../src/testing/fixture-manager.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAKjC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAGrD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EAIL,KAAK,mBAAmB,EACxB,KAAK,aAAa,EAClB,KAAK,oBAAoB,EAS1B,MAAM,gBAAgB,CAAC;AAIxB,sCAAsC;AACtC,MAAM,WAAW,qBAAqB;IACpC,OAAO,CAAC,EAAE;QACR,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;KAC9B,CAAC;CACH;AAED,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,IAAI,CAAqB;IACjC,IAAI,GAAG,CAAC,GAAG,EAAE,IAAI,EAEhB;IACD,IAAI,GAAG,IAAI,IAAI,CAKd;IAED,OAAO,CAAC,IAAI,CAAqB;IACjC,IAAI,GAAG,CAAC,GAAG,EAAE,IAAI,EAEhB;IACD,IAAI,GAAG,IAAI,IAAI,CAKd;IACD,gBAAgB,EAAE,MAAM,EAAE,GAAG,IAAI,CAAQ;IAEzC,OAAO,CAAC,aAAa,CAAuB;IAG5C,OAAO,CAAC,OAAO,CAAsC;IACrD,OAAO,CAAC,aAAa,CAAiC;IACtD,OAAO,CAAC,eAAe,CACX;IAEZ,IAAI;IAuBJ;;;MAGE;IACI,IAAI;IAyCV;;;OAGG;YACW,cAAc;IAyC5B,OAAO,CAAC,cAAc,CAAqB;IACrC,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE;IAoB7C,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAyEhF,OAAO;IAYP,WAAW,CACf,YAAY,EAAE,MAAM,cAAc,EAClC,YAAY,EAAE,MAAM,cAAc,EAClC,aAAa,EAAE,oBAAoB,EACnC,cAAc,CAAC,EAAE,qBAAqB;IAkFlC,mBAAmB,CACvB,MAAM,EAAE,MAAM,EACd,GAAG,EAAE;QACH,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;QACpB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;KACjD,EACD,OAAO,CAAC,EAAE;QACR,YAAY,CAAC,EAAE,OAAO,CAAC;QACvB,GAAG,CAAC,EAAE,IAAI,CAAC;KACZ,GACA,OAAO,CAAC,aAAa,EAAE,CAAC;IAwF3B;;;;;;;;;OASG;IACG,cAAc,CAClB,MAAM,EAAE,MAAM,cAAc,EAC5B,SAAS,EAAE,aAAa,EAAE,GACzB,OAAO,CAAC,mBAAmB,EAAE,CAAC;IA2OjC;;;OAGG;IACH,OAAO,CAAC,eAAe;IA+FvB;;OAEG;IACH,OAAO,CAAC,kBAAkB;YAqBZ,0BAA0B;IAiFxC;;;;;;;;;OASG;IACH,OAAO,CAAC,oBAAoB;YA+Dd,oBAAoB;YA6CpB,uBAAuB;IA8B/B,gBAAgB,CAAC,IAAI,EAAE,MAAM;CAepC;AAED,eAAO,MAAM,cAAc,qBAA4B,CAAC"}
@@ -361,7 +361,24 @@ export class FixtureManagerClass {
361
361
  this.builder = new UpsertBuilder();
362
362
  this.fixtureRefMap = new Map();
363
363
  this.skippedFixtures = new Map();
364
- const db = createKnexInstance(Sonamu.dbConfig[dbName]);
364
+ // 병렬 테스트 모드에서는 worker별 DB에 저장
365
+ const dbConfig = process.env.SONAMU_WORKER_DB === "true" && process.env.VITEST_POOL_ID ? (()=>{
366
+ const workerId = parseInt(process.env.VITEST_POOL_ID ?? "1", 10);
367
+ const baseConfig = Sonamu.dbConfig[dbName];
368
+ const connection = baseConfig.connection;
369
+ return {
370
+ ...baseConfig,
371
+ connection: {
372
+ ...connection,
373
+ database: `${connection.database}_${workerId}`
374
+ },
375
+ pool: {
376
+ min: 1,
377
+ max: 1
378
+ }
379
+ };
380
+ })() : Sonamu.dbConfig[dbName];
381
+ const db = createKnexInstance(dbConfig);
365
382
  const results = [];
366
383
  try {
367
384
  // 1. RelationGraph로 fixture 단위 삽입 순서 계산
@@ -770,4 +787,4 @@ export class FixtureManagerClass {
770
787
  }
771
788
  export const FixtureManager = new FixtureManagerClass();
772
789
 
773
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0aW5nL2ZpeHR1cmUtbWFuYWdlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gXCJhc3NlcnRcIjtcbmltcG9ydCBjaGFsayBmcm9tIFwiY2hhbGtcIjtcbmltcG9ydCB7IGV4ZWNTeW5jIH0gZnJvbSBcImNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCB7IHJlYWRGaWxlU3luYywgd3JpdGVGaWxlU3luYyB9IGZyb20gXCJmc1wiO1xuaW1wb3J0IGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIjtcbmltcG9ydCB0eXBlIHsgS25leCB9IGZyb20gXCJrbmV4XCI7XG5pbXBvcnQgeyB1bmlxdWUgfSBmcm9tIFwicmFkYXNoaVwiO1xuaW1wb3J0IHsgaW5zcGVjdCB9IGZyb20gXCJ1dGlsXCI7XG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpXCI7XG5pbXBvcnQgeyBCYXNlTW9kZWwgfSBmcm9tIFwiLi4vZGF0YWJhc2UvYmFzZS1tb2RlbFwiO1xuaW1wb3J0IHR5cGUgeyBTb25hbXVEQkNvbmZpZyB9IGZyb20gXCIuLi9kYXRhYmFzZS9kYlwiO1xuaW1wb3J0IHsgY3JlYXRlS25leEluc3RhbmNlIH0gZnJvbSBcIi4uL2RhdGFiYXNlL2tuZXhcIjtcbmltcG9ydCB7IHR5cGUgVUJSZWYsIFVwc2VydEJ1aWxkZXIgfSBmcm9tIFwiLi4vZGF0YWJhc2UvdXBzZXJ0LWJ1aWxkZXJcIjtcbmltcG9ydCB0eXBlIHsgRW50aXR5IH0gZnJvbSBcIi4uL2VudGl0eS9lbnRpdHlcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQge1xuICB0eXBlIEJlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcCxcbiAgdHlwZSBEYXRhYmFzZVNjaGVtYUV4dGVuZCxcbiAgdHlwZSBFbnRpdHlQcm9wLFxuICB0eXBlIEZpeHR1cmVJbXBvcnRSZXN1bHQsXG4gIHR5cGUgRml4dHVyZVJlY29yZCxcbiAgdHlwZSBGaXh0dXJlU2VhcmNoT3B0aW9ucyxcbiAgaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AsXG4gIGlzSGFzTWFueVJlbGF0aW9uUHJvcCxcbiAgaXNNYW55VG9NYW55UmVsYXRpb25Qcm9wLFxuICBpc09uZVRvT25lUmVsYXRpb25Qcm9wLFxuICBpc1JlbGF0aW9uUHJvcCxcbiAgaXNWaXJ0dWFsUHJvcCxcbiAgdHlwZSBNYW55VG9NYW55UmVsYXRpb25Qcm9wLFxuICB0eXBlIE9uZVRvT25lUmVsYXRpb25Qcm9wLFxufSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IGlzVGVzdCB9IGZyb20gXCIuLi91dGlscy9jb250cm9sbGVyXCI7XG5pbXBvcnQgeyBSZWxhdGlvbkdyYXBoIH0gZnJvbSBcIi4vX3JlbGF0aW9uLWdyYXBoXCI7XG5cbi8qKiDsgqzsmqnsnpAg7KeA7KCVIOykkeuztSDtmZXsnbgg7Lus65+8IChlbnRpdHlJZOuzhOuhnCDsp4DsoJUpICovXG5leHBvcnQgaW50ZXJmYWNlIER1cGxpY2F0ZUNoZWNrT3B0aW9ucyB7XG4gIGNvbHVtbnM/OiB7XG4gICAgW2VudGl0eUlkOiBzdHJpbmddOiBzdHJpbmdbXTtcbiAgfTtcbn1cblxuZXhwb3J0IGNsYXNzIEZpeHR1cmVNYW5hZ2VyQ2xhc3Mge1xuICBwcml2YXRlIF90ZGI6IEtuZXggfCBudWxsID0gbnVsbDtcbiAgc2V0IHRkYih0ZGI6IEtuZXgpIHtcbiAgICB0aGlzLl90ZGIgPSB0ZGI7XG4gIH1cbiAgZ2V0IHRkYigpOiBLbmV4IHtcbiAgICBpZiAodGhpcy5fdGRiID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGaXh0dXJlTWFuYWdlciBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWRcIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl90ZGI7XG4gIH1cblxuICBwcml2YXRlIF9mZGI6IEtuZXggfCBudWxsID0gbnVsbDtcbiAgc2V0IGZkYihmZGI6IEtuZXgpIHtcbiAgICB0aGlzLl9mZGIgPSBmZGI7XG4gIH1cbiAgZ2V0IGZkYigpOiBLbmV4IHtcbiAgICBpZiAodGhpcy5fZmRiID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGaXh0dXJlTWFuYWdlciBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWRcIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9mZGI7XG4gIH1cbiAgY2FjaGVkVGFibGVOYW1lczogc3RyaW5nW10gfCBudWxsID0gbnVsbDtcblxuICBwcml2YXRlIHJlbGF0aW9uR3JhcGggPSBuZXcgUmVsYXRpb25HcmFwaCgpO1xuXG4gIC8vIFVwc2VydEJ1aWxkZXIg6riw67CYIGltcG9ydOulvCDsnITtlZwg7IOB7YOcXG4gIHByaXZhdGUgYnVpbGRlcjogVXBzZXJ0QnVpbGRlciA9IG5ldyBVcHNlcnRCdWlsZGVyKCk7XG4gIHByaXZhdGUgZml4dHVyZVJlZk1hcDogTWFwPHN0cmluZywgVUJSZWY+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIHNraXBwZWRGaXh0dXJlczogTWFwPHN0cmluZywgeyBlbnRpdHlJZDogc3RyaW5nOyBleGlzdGluZ0lkOiBudW1iZXIgfCBzdHJpbmcgfT4gPVxuICAgIG5ldyBNYXAoKTtcblxuICBpbml0KCkge1xuICAgIGlmICh0aGlzLl90ZGIgIT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKFNvbmFtdS5kYkNvbmZpZy50ZXN0ICYmIFNvbmFtdS5kYkNvbmZpZy5wcm9kdWN0aW9uX21hc3Rlcikge1xuICAgICAgY29uc3QgdENvbm4gPSBTb25hbXUuZGJDb25maWcudGVzdC5jb25uZWN0aW9uIGFzIEtuZXguQ29ubmVjdGlvbkNvbmZpZyAmIHtcbiAgICAgICAgcG9ydD86IG51bWJlcjtcbiAgICAgIH07XG4gICAgICBjb25zdCBwQ29ubiA9IFNvbmFtdS5kYkNvbmZpZy5wcm9kdWN0aW9uX21hc3Rlci5jb25uZWN0aW9uIGFzIEtuZXguQ29ubmVjdGlvbkNvbmZpZyAmIHtcbiAgICAgICAgcG9ydD86IG51bWJlcjtcbiAgICAgIH07XG4gICAgICBpZiAoXG4gICAgICAgIGAke3RDb25uLmhvc3QgPz8gXCJsb2NhbGhvc3RcIn06JHt0Q29ubi5wb3J0ID8/IDU0MzJ9LyR7dENvbm4uZGF0YWJhc2V9YCA9PT1cbiAgICAgICAgYCR7cENvbm4uaG9zdCA/PyBcImxvY2FsaG9zdFwifToke3BDb25uLnBvcnQgPz8gNTQzMn0vJHtwQ29ubi5kYXRhYmFzZX1gXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGDthYzsiqTtirhEQuyZgCDtlITroZzrjZXshZhEQuyXkCDrj5nsnbztlZwg642w7J207YSw67Kg7J207Iqk6rCAIOyCrOyaqeuQmOyXiOyKteuLiOuLpC5gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnRkYiA9IGNyZWF0ZUtuZXhJbnN0YW5jZShTb25hbXUuZGJDb25maWcudGVzdCk7XG4gICAgdGhpcy5mZGIgPSBjcmVhdGVLbmV4SW5zdGFuY2UoU29uYW11LmRiQ29uZmlnLmZpeHR1cmUpO1xuICB9XG5cbiAgLyoqXG4gICAg7JuQ6rKpIGZpeHR1cmUgRELrpbwg66Gc7LusIHRlc3QgRELroZwg67O17IKs7ZWp64uI64ukLlxuICAgIHBnX2R1bXDroZwg7JuQ6rKpIERC66W8IOuNpO2UhO2VmOqzoCwgcGdfcmVzdG9yZeuhnCDroZzsu6zsl5Ag67O17JuQ7ZWp64uI64ukLlxuICAqL1xuICBhc3luYyBzeW5jKCkge1xuICAgIGNvbnN0IGZpeHR1cmVDb25uID0gU29uYW11LmRiQ29uZmlnLmZpeHR1cmUuY29ubmVjdGlvbiBhcyBLbmV4LlBnQ29ubmVjdGlvbkNvbmZpZztcbiAgICBjb25zdCB0ZXN0Q29ubiA9IFNvbmFtdS5kYkNvbmZpZy50ZXN0LmNvbm5lY3Rpb24gYXMgS25leC5QZ0Nvbm5lY3Rpb25Db25maWc7XG5cbiAgICAvLyAxLiDroZzsu6wgdGVzdCBEQiDsl7DqsrAg7KKF66OMIOuwjyDsnqzsg53shLFcbiAgICBjb25zdCB0ZXN0UGdFbnYgPSB7IFBHUEFTU1dPUkQ6IHRlc3RDb25uLnBhc3N3b3JkIHx8IFwiXCIgfTtcbiAgICBleGVjU3luYyhcbiAgICAgIGBwc3FsIC1oICR7dGVzdENvbm4uaG9zdH0gLXAgJHt0ZXN0Q29ubi5wb3J0ID8/IDU0MzJ9IC1VICR7dGVzdENvbm4udXNlcn0gLWQgcG9zdGdyZXMgLWMgXCJcbiAgICAgICAgU0VMRUNUIHBnX3Rlcm1pbmF0ZV9iYWNrZW5kKHBnX3N0YXRfYWN0aXZpdHkucGlkKVxuICAgICAgICBGUk9NIHBnX3N0YXRfYWN0aXZpdHlcbiAgICAgICAgV0hFUkUgZGF0bmFtZSA9ICcke3Rlc3RDb25uLmRhdGFiYXNlfSdcbiAgICAgICAgICBBTkQgcGlkIDw+IHBnX2JhY2tlbmRfcGlkKCk7XG4gICAgICBcImAsXG4gICAgICB7IHN0ZGlvOiBcImluaGVyaXRcIiwgZW52OiB7IC4uLnByb2Nlc3MuZW52LCAuLi50ZXN0UGdFbnYgfSBhcyBOb2RlSlMuUHJvY2Vzc0VudiB9LFxuICAgICk7XG5cbiAgICBleGVjU3luYyhcbiAgICAgIGBwc3FsIC1oICR7dGVzdENvbm4uaG9zdH0gLXAgJHt0ZXN0Q29ubi5wb3J0ID8/IDU0MzJ9IC1VICR7dGVzdENvbm4udXNlcn0gLWQgcG9zdGdyZXMgLWMgXCJEUk9QIERBVEFCQVNFIElGIEVYSVNUUyBcXFxcXCIke3Rlc3RDb25uLmRhdGFiYXNlfVxcXFxcIlwiYCxcbiAgICAgIHsgc3RkaW86IFwiaW5oZXJpdFwiLCBlbnY6IHsgLi4ucHJvY2Vzcy5lbnYsIC4uLnRlc3RQZ0VudiB9IGFzIE5vZGVKUy5Qcm9jZXNzRW52IH0sXG4gICAgKTtcblxuICAgIGV4ZWNTeW5jKFxuICAgICAgYHBzcWwgLWggJHt0ZXN0Q29ubi5ob3N0fSAtcCAke3Rlc3RDb25uLnBvcnQgPz8gNTQzMn0gLVUgJHt0ZXN0Q29ubi51c2VyfSAtZCBwb3N0Z3JlcyAtYyBcIkNSRUFURSBEQVRBQkFTRSBcXFxcXCIke3Rlc3RDb25uLmRhdGFiYXNlfVxcXFxcIlwiYCxcbiAgICAgIHsgc3RkaW86IFwiaW5oZXJpdFwiLCBlbnY6IHsgLi4ucHJvY2Vzcy5lbnYsIC4uLnRlc3RQZ0VudiB9IGFzIE5vZGVKUy5Qcm9jZXNzRW52IH0sXG4gICAgKTtcblxuICAgIC8vIDIuIOybkOqyqSBmaXh0dXJlIERCIOKGkiDroZzsu6wgdGVzdCBEQuuhnCDrs7XsgqwgKHBnX2R1bXAgfCBwZ19yZXN0b3JlKVxuICAgIGNvbnN0IGZpeHR1cmVQZ0VudiA9IHsgUEdQQVNTV09SRDogZml4dHVyZUNvbm4ucGFzc3dvcmQgfHwgXCJcIiB9O1xuICAgIGNvbnN0IGR1bXBDbWQgPSBgcGdfZHVtcCAtaCAke2ZpeHR1cmVDb25uLmhvc3R9IC1wICR7Zml4dHVyZUNvbm4ucG9ydCA/PyA1NDMyfSAtVSAke2ZpeHR1cmVDb25uLnVzZXJ9IC1kICR7Zml4dHVyZUNvbm4uZGF0YWJhc2V9IC1GY2A7XG4gICAgY29uc3QgcmVzdG9yZUNtZCA9IGBwZ19yZXN0b3JlIC1oICR7dGVzdENvbm4uaG9zdH0gLXAgJHt0ZXN0Q29ubi5wb3J0ID8/IDU0MzJ9IC1VICR7dGVzdENvbm4udXNlcn0gLWQgJHt0ZXN0Q29ubi5kYXRhYmFzZX0gLS1uby1vd25lciAtLW5vLWFjbGA7XG5cbiAgICBleGVjU3luYyhgJHtkdW1wQ21kfSB8IFBHUEFTU1dPUkQ9XCIke3Rlc3RDb25uLnBhc3N3b3JkIHx8IFwiXCJ9XCIgJHtyZXN0b3JlQ21kfWAsIHtcbiAgICAgIHN0ZGlvOiBcImluaGVyaXRcIixcbiAgICAgIGVudjogeyAuLi5wcm9jZXNzLmVudiwgLi4uZml4dHVyZVBnRW52IH0gYXMgTm9kZUpTLlByb2Nlc3NFbnYsXG4gICAgICBzaGVsbDogXCIvYmluL2Jhc2hcIixcbiAgICB9KTtcblxuICAgIC8vIDMuIOyLnO2AgOyKpCDrpqzshYsgKOuNsOydtO2EsCDrs7Xsgqwg7ZuEIOyLnO2AgOyKpOulvCBNQVgoaWQp66GcIOygleugrClcbiAgICBhd2FpdCB0aGlzLnJlc2V0U2VxdWVuY2VzKFNvbmFtdS5kYkNvbmZpZy50ZXN0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDrqqjrk6Ag7YWM7J2067iU7J2YIOyLnO2AgOyKpOulvCDtmITsnqwgTUFYKGlkKeuhnCDrpqzshYvtlanri4jri6QuXG4gICAqIGZpeHR1cmUgc3luYyDtm4Qg7Iuc7YCA7Iqk6rCAIOyLpOygnCDrjbDsnbTthLDsmYAg66ee7KeAIOyViuuKlCDrrLjsoJzrpbwg7ZW06rKw7ZWp64uI64ukLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZXNldFNlcXVlbmNlcyhkYkNvbmZpZzogU29uYW11REJDb25maWdbXCJ0ZXN0XCJdKSB7XG4gICAgY29uc3QgdGVzdERiID0gY3JlYXRlS25leEluc3RhbmNlKGRiQ29uZmlnKTtcbiAgICBjb25zdCBlbnRpdGllcyA9IEVudGl0eU1hbmFnZXIuZ2V0QWxsRW50aXRpZXMoKTtcblxuICAgIHRyeSB7XG4gICAgICBmb3IgKGNvbnN0IGVudGl0eSBvZiBlbnRpdGllcykge1xuICAgICAgICBjb25zdCB0YWJsZU5hbWUgPSBlbnRpdHkudGFibGUgfHwgZW50aXR5LmlkLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgLy8gaWQg7ZWE65Oc7J2YIO2DgOyeheydhCDtmZXsnbjtlanri4jri6RcbiAgICAgICAgY29uc3QgaWRQcm9wID0gZW50aXR5LnByb3BzLmZpbmQoKHApID0+IHAubmFtZSA9PT0gXCJpZFwiKTtcbiAgICAgICAgY29uc3QgaWRUeXBlID0gaWRQcm9wPy50eXBlO1xuXG4gICAgICAgIC8vIGludGVnZXIvYmlnSW50ZWdlcuydtOqxsOuCmCwgc3RyaW5n7J207KeA66eMIGZpeHR1cmVTdHJhdGVneT1zZXF1ZW5jZeyduCDqsr3smrDsl5Drp4wg66as7IWL7ZWp64uI64ukXG4gICAgICAgIGNvbnN0IHVzZXNTZXF1ZW5jZSA9XG4gICAgICAgICAgaWRUeXBlID09PSBcImludGVnZXJcIiB8fFxuICAgICAgICAgIGlkVHlwZSA9PT0gXCJiaWdJbnRlZ2VyXCIgfHxcbiAgICAgICAgICBpZFByb3A/LmNvbmU/LmZpeHR1cmVTdHJhdGVneSA9PT0gXCJzZXF1ZW5jZVwiO1xuXG4gICAgICAgIGlmICghdXNlc1NlcXVlbmNlKSB7XG4gICAgICAgICAgIWlzVGVzdCgpICYmXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgYFNraXBwaW5nIHNlcXVlbmNlIHJlc2V0IGZvciAke3RhYmxlTmFtZX0gKGlkIHR5cGU6ICR7aWRUeXBlIHx8IFwidW5rbm93blwifSlgLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFBvc3RncmVTUUwg7Iuc7YCA7Iqk66W8IO2YhOyerCDthYzsnbTruJTsnZggTUFYKGlkKeuhnCDrpqzshYvtlanri4jri6QuXG4gICAgICAgIC8vIHN0cmluZyDtg4DsnoXsnZgg6rK97JqwIOyIq+yekCDsupDsiqTtjIXsnbQg7ZWE7JqU7ZWp64uI64ukLlxuICAgICAgICBjb25zdCBtYXhFeHByID0gaWRUeXBlID09PSBcInN0cmluZ1wiID8gXCJNQVgoaWQ6OmJpZ2ludClcIiA6IFwiTUFYKGlkKVwiO1xuICAgICAgICBhd2FpdCB0ZXN0RGIucmF3KGBcbiAgICAgICAgICBTRUxFQ1Qgc2V0dmFsKFxuICAgICAgICAgICAgcGdfZ2V0X3NlcmlhbF9zZXF1ZW5jZSgncHVibGljLiR7dGFibGVOYW1lfScsICdpZCcpLFxuICAgICAgICAgICAgQ09BTEVTQ0UoKFNFTEVDVCAke21heEV4cHJ9IEZST00gJHt0YWJsZU5hbWV9KSwgMSlcbiAgICAgICAgICApXG4gICAgICAgIGApO1xuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCB0ZXN0RGIuZGVzdHJveSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdmlzaXRlZFJlY29yZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgYXN5bmMgaW1wb3J0Rml4dHVyZShlbnRpdHlJZDogc3RyaW5nLCBpZHM6IG51bWJlcltdKSB7XG4gICAgLy8g67Cp66y4IOq4sOuhnSDstIjquLDtmZQgKOyDiOuhnOyatCBpbXBvcnQg7J6R7JeFIOyLnOyekSlcbiAgICB0aGlzLnZpc2l0ZWRSZWNvcmRzLmNsZWFyKCk7XG5cbiAgICBjb25zdCBxdWVyaWVzID0gdW5pcXVlKFxuICAgICAgKFxuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICBpZHMubWFwKGFzeW5jIChpZCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0SW1wb3J0UXVlcmllcyhlbnRpdHlJZCwgXCJpZFwiLCBpZCk7XG4gICAgICAgICAgfSksXG4gICAgICAgIClcbiAgICAgICkuZmxhdCgpLFxuICAgICk7XG5cbiAgICBjb25zdCB3ZGIgPSBCYXNlTW9kZWwuZ2V0REIoXCJ3XCIpO1xuICAgIGZvciAoY29uc3QgcXVlcnkgb2YgcXVlcmllcykge1xuICAgICAgYXdhaXQgd2RiLnJhdyhxdWVyeSk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZ2V0SW1wb3J0UXVlcmllcyhlbnRpdHlJZDogc3RyaW5nLCBmaWVsZDogc3RyaW5nLCBpZDogbnVtYmVyKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIGNvbnN0IHJlY29yZEtleSA9IGAke2VudGl0eUlkfSMke2ZpZWxkfSMke2lkfWA7XG5cbiAgICAvLyDsiJztmZgg7LC47KGwIOuwqeyngDog7J2066+4IOuwqeusuO2VnCDroIjsvZTrk5zripQg7Iqk7YK1XG4gICAgaWYgKHRoaXMudmlzaXRlZFJlY29yZHMuaGFzKHJlY29yZEtleSkpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgdGhpcy52aXNpdGVkUmVjb3Jkcy5hZGQocmVjb3JkS2V5KTtcblxuICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKTtcbiAgICBjb25zdCB3ZGIgPSBCYXNlTW9kZWwuZ2V0REIoXCJ3XCIpO1xuXG4gICAgLy8g7Jes6riw7IScIOyLpERC7J2YIHJvdyDqsIDsoLjsmLRcbiAgICBjb25zdCBbcm93XSA9IGF3YWl0IHdkYihlbnRpdHkudGFibGUpLndoZXJlKGZpZWxkLCBpZCkubGltaXQoMSk7XG4gICAgaWYgKHJvdyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZW50aXR5SWR9IyR7aWR9IHJvd+ulvCDssL7snYQg7IiYIOyXhuyKteuLiOuLpC5gKTtcbiAgICB9XG5cbiAgICAvLyDtlL3siqTss5BEQiwg7IukREJcbiAgICBjb25zdCBmaXh0dXJlRGF0YWJhc2UgPSAoU29uYW11LmRiQ29uZmlnLmZpeHR1cmUuY29ubmVjdGlvbiBhcyBLbmV4LkNvbm5lY3Rpb25Db25maWcpLmRhdGFiYXNlO1xuICAgIGNvbnN0IHJlYWxEYXRhYmFzZSA9IChTb25hbXUuZGJDb25maWcucHJvZHVjdGlvbl9tYXN0ZXIuY29ubmVjdGlvbiBhcyBLbmV4LkNvbm5lY3Rpb25Db25maWcpXG4gICAgICAuZGF0YWJhc2U7XG5cbiAgICBjb25zdCBzZWxmUXVlcnkgPSBgSU5TRVJUIElHTk9SRSBJTlRPIFxcYCR7Zml4dHVyZURhdGFiYXNlfVxcYC5cXGAke2VudGl0eS50YWJsZX1cXGAgKFNFTEVDVCAqIEZST00gXFxgJHtyZWFsRGF0YWJhc2V9XFxgLlxcYCR7ZW50aXR5LnRhYmxlfVxcYCBXSEVSRSBcXGBpZFxcYCA9ICR7aWR9KWA7XG5cbiAgICBjb25zdCBhcmdzID0gT2JqZWN0LmVudHJpZXMoZW50aXR5LnJlbGF0aW9ucylcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgIChbLCByZWxhdGlvbl0pID0+XG4gICAgICAgICAgaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AocmVsYXRpb24pIHx8XG4gICAgICAgICAgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocmVsYXRpb24pICYmIHJlbGF0aW9uLmN1c3RvbUpvaW5DbGF1c2UgPT09IHVuZGVmaW5lZCksXG4gICAgICApXG4gICAgICAubWFwKChbLCByZWxhdGlvbl0pID0+IHtcbiAgICAgICAgLypcbiAgICAgICAgQmVsb25nc1RvT25l7J24IOqyveyasFxuICAgICAgICAgIENhdGVnb3J5IC8gJ2lkJyAvIHJvd1tjYXRlZ29yeV9pZF0g7Zi47LacXG4gICAgICAgIE9uZVRvT25l7JeQIGpvaW5Db2x1bW4gPT09IHRydWUg7J24IOqyveyasFxuICAgICAgICAgIFByb2ZpbGUgLyAnaWQnIC8gcm93W3Byb2ZpbGVfaWRdIO2YuOy2nFxuICAgICAgICBPbmVUb09uZeyXkCBqb2luQ29sdW1uID09PSBmYWxzZSDsnbgg6rK97JqwXG4gICAgICAgICAgUHJvZmlsZSAvICdwcm9maWxlX2lkJyAvIHJvd1snaWQnXSDtmLjstpxcbiAgICAgICAgKi9cbiAgICAgICAgbGV0IGZpZWxkOiBzdHJpbmc7XG4gICAgICAgIGxldCBpZDogbnVtYmVyO1xuICAgICAgICBpZiAoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChyZWxhdGlvbikgJiYgIXJlbGF0aW9uLmhhc0pvaW5Db2x1bW4pIHtcbiAgICAgICAgICBjb25zdCByZWxhdGVkRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocmVsYXRpb24ud2l0aCk7XG4gICAgICAgICAgY29uc3QgcmVsYXRlZElkQ29sdW1uTmFtZSA9IHJlbGF0ZWRFbnRpdHkucHJvcHMuZmluZChcbiAgICAgICAgICAgIChwKSA9PiBpc1JlbGF0aW9uUHJvcChwKSAmJiBwLndpdGggPT09IGVudGl0eS5pZCxcbiAgICAgICAgICApPy5uYW1lO1xuICAgICAgICAgIGlmICghcmVsYXRlZElkQ29sdW1uTmFtZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3JlbGF0ZWRFbnRpdHkuaWR97J2YICR7ZW50aXR5LmlkfSDqtIDqs4Qg7ZSE66Gt7J2EIOywvuydhCDsiJgg7JeG7Iq164uI64ukLmApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmaWVsZCA9IGAke3JlbGF0ZWRJZENvbHVtbk5hbWV9X2lkYDtcbiAgICAgICAgICBpZCA9IHJvdy5pZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmaWVsZCA9IFwiaWRcIjtcbiAgICAgICAgICBpZCA9IHJvd1tgJHtyZWxhdGlvbi5uYW1lfV9pZGBdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZW50aXR5SWQ6IHJlbGF0aW9uLndpdGgsXG4gICAgICAgICAgZmllbGQsXG4gICAgICAgICAgaWQsXG4gICAgICAgIH07XG4gICAgICB9KVxuICAgICAgLmZpbHRlcigoYXJnKSA9PiBhcmcuaWQgIT09IG51bGwpO1xuXG4gICAgY29uc3QgcmVsUXVlcmllcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgYXJncy5tYXAoYXN5bmMgKGFyZ3MpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0SW1wb3J0UXVlcmllcyhhcmdzLmVudGl0eUlkLCBhcmdzLmZpZWxkLCBhcmdzLmlkKTtcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICByZXR1cm4gWy4uLnVuaXF1ZShyZWxRdWVyaWVzLnJldmVyc2UoKS5mbGF0KCkpLCBzZWxmUXVlcnldO1xuICB9XG5cbiAgYXN5bmMgZGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5fdGRiKSB7XG4gICAgICBhd2FpdCB0aGlzLl90ZGIuZGVzdHJveSgpO1xuICAgICAgdGhpcy5fdGRiID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2ZkYikge1xuICAgICAgYXdhaXQgdGhpcy5fZmRiLmRlc3Ryb3koKTtcbiAgICAgIHRoaXMuX2ZkYiA9IG51bGw7XG4gICAgfVxuICAgIGF3YWl0IEJhc2VNb2RlbC5kZXN0cm95KCk7XG4gIH1cblxuICBhc3luYyBnZXRGaXh0dXJlcyhcbiAgICBzb3VyY2VEQk5hbWU6IGtleW9mIFNvbmFtdURCQ29uZmlnLFxuICAgIHRhcmdldERCTmFtZToga2V5b2YgU29uYW11REJDb25maWcsXG4gICAgc2VhcmNoT3B0aW9uczogRml4dHVyZVNlYXJjaE9wdGlvbnMsXG4gICAgZHVwbGljYXRlQ2hlY2s/OiBEdXBsaWNhdGVDaGVja09wdGlvbnMsXG4gICkge1xuICAgIGNvbnN0IHNvdXJjZURCID0gY3JlYXRlS25leEluc3RhbmNlKFNvbmFtdS5kYkNvbmZpZ1tzb3VyY2VEQk5hbWVdKTtcbiAgICBjb25zdCB0YXJnZXREQiA9IGNyZWF0ZUtuZXhJbnN0YW5jZShTb25hbXUuZGJDb25maWdbdGFyZ2V0REJOYW1lXSk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBlbnRpdHlJZCwgZmllbGQsIHZhbHVlLCBzZWFyY2hUeXBlIH0gPSBzZWFyY2hPcHRpb25zO1xuXG4gICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG4gICAgICBjb25zdCBjb2x1bW4gPVxuICAgICAgICBlbnRpdHkucHJvcHMuZmluZCgocHJvcCkgPT4gcHJvcC5uYW1lID09PSBmaWVsZCk/LnR5cGUgPT09IFwicmVsYXRpb25cIlxuICAgICAgICAgID8gYCR7ZmllbGR9X2lkYFxuICAgICAgICAgIDogZmllbGQ7XG5cbiAgICAgIGxldCBxdWVyeSA9IHNvdXJjZURCKGVudGl0eS50YWJsZSk7XG4gICAgICBpZiAoc2VhcmNoVHlwZSA9PT0gXCJlcXVhbHNcIikge1xuICAgICAgICBxdWVyeSA9IHF1ZXJ5LndoZXJlKGNvbHVtbiwgdmFsdWUpO1xuICAgICAgfSBlbHNlIGlmIChzZWFyY2hUeXBlID09PSBcImxpa2VcIikge1xuICAgICAgICBxdWVyeSA9IHF1ZXJ5LndoZXJlKGNvbHVtbiwgXCJsaWtlXCIsIGAlJHt2YWx1ZX0lYCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJvd3MgPSBhd2FpdCBxdWVyeTtcbiAgICAgIGlmIChyb3dzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyByZWNvcmRzIGZvdW5kXCIpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmaXh0dXJlczogRml4dHVyZVJlY29yZFtdID0gW107XG4gICAgICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7XG4gICAgICAgIGNvbnN0IGluaXRpYWxSZWNvcmRzTGVuZ3RoID0gZml4dHVyZXMubGVuZ3RoO1xuICAgICAgICBjb25zdCBuZXdSZWNvcmRzID0gYXdhaXQgdGhpcy5jcmVhdGVGaXh0dXJlUmVjb3JkKGVudGl0eSwgcm93LCB7XG4gICAgICAgICAgX2RiOiBzb3VyY2VEQixcbiAgICAgICAgfSk7XG4gICAgICAgIGZpeHR1cmVzLnB1c2goLi4ubmV3UmVjb3Jkcyk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRGaXh0dXJlUmVjb3JkID0gZml4dHVyZXMuZmluZCgocikgPT4gci5maXh0dXJlSWQgPT09IGAke2VudGl0eUlkfSMke3Jvdy5pZH1gKTtcblxuICAgICAgICBpZiAoY3VycmVudEZpeHR1cmVSZWNvcmQpIHtcbiAgICAgICAgICAvLyDtmITsnqwgZml4dHVyZeuhnOu2gO2EsCDsg53shLHrkJwgZmV0Y2hlZFJlY29yZHMg7ISk7KCVXG4gICAgICAgICAgY3VycmVudEZpeHR1cmVSZWNvcmQuZmV0Y2hlZFJlY29yZHMgPSBmaXh0dXJlc1xuICAgICAgICAgICAgLmZpbHRlcigocikgPT4gci5maXh0dXJlSWQgIT09IGN1cnJlbnRGaXh0dXJlUmVjb3JkLmZpeHR1cmVJZClcbiAgICAgICAgICAgIC5zbGljZShpbml0aWFsUmVjb3Jkc0xlbmd0aClcbiAgICAgICAgICAgIC5tYXAoKHIpID0+IHIuZml4dHVyZUlkKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmb3IgYXdhaXQgKGNvbnN0IGZpeHR1cmUgb2YgZml4dHVyZXMpIHtcbiAgICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZml4dHVyZS5lbnRpdHlJZCk7XG5cbiAgICAgICAgLy8g7IKs7Jqp7J6QIOyngOyglSDsu6zrn7wg6riw7KSAIOykkeuztSDtmZXsnbgg4oaSIHRhcmdldFxuICAgICAgICBjb25zdCBjdXN0b21Db2x1bW5zID0gZHVwbGljYXRlQ2hlY2s/LmNvbHVtbnM/LltmaXh0dXJlLmVudGl0eUlkXTtcbiAgICAgICAgaWYgKGN1c3RvbUNvbHVtbnMgJiYgY3VzdG9tQ29sdW1ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3QgY3VzdG9tRHVwbGljYXRlUm93ID0gYXdhaXQgdGhpcy5jaGVja0R1cGxpY2F0ZUJ5Q29sdW1ucyhcbiAgICAgICAgICAgIHRhcmdldERCLFxuICAgICAgICAgICAgZW50aXR5LFxuICAgICAgICAgICAgZml4dHVyZSxcbiAgICAgICAgICAgIGN1c3RvbUNvbHVtbnMsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoY3VzdG9tRHVwbGljYXRlUm93KSB7XG4gICAgICAgICAgICBjb25zdCBbcmVjb3JkXSA9IGF3YWl0IHRoaXMuY3JlYXRlRml4dHVyZVJlY29yZChlbnRpdHksIGN1c3RvbUR1cGxpY2F0ZVJvdywge1xuICAgICAgICAgICAgICBzaW5nbGVSZWNvcmQ6IHRydWUsXG4gICAgICAgICAgICAgIF9kYjogdGFyZ2V0REIsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGZpeHR1cmUudGFyZ2V0ID0gcmVjb3JkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVuaXF1ZSBpbmRleCDquLDspIAg7KSR67O1IO2ZleyduCDihpIgZml4dHVyZS51bmlxdWVcbiAgICAgICAgY29uc3QgdW5pcXVlUm93ID0gYXdhaXQgdGhpcy5jaGVja1VuaXF1ZVZpb2xhdGlvbih0YXJnZXREQiwgZW50aXR5LCBmaXh0dXJlKTtcbiAgICAgICAgaWYgKHVuaXF1ZVJvdykge1xuICAgICAgICAgIGNvbnN0IFtyZWNvcmRdID0gYXdhaXQgdGhpcy5jcmVhdGVGaXh0dXJlUmVjb3JkKGVudGl0eSwgdW5pcXVlUm93LCB7XG4gICAgICAgICAgICBzaW5nbGVSZWNvcmQ6IHRydWUsXG4gICAgICAgICAgICBfZGI6IHRhcmdldERCLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGZpeHR1cmUudW5pcXVlID0gcmVjb3JkO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB1bmlxdWUoZml4dHVyZXMsIChmKSA9PiBmLmZpeHR1cmVJZCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChbdGFyZ2V0REIuZGVzdHJveSgpLCBzb3VyY2VEQi5kZXN0cm95KCldKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBjcmVhdGVGaXh0dXJlUmVjb3JkKFxuICAgIGVudGl0eTogRW50aXR5LFxuICAgIHJvdzoge1xuICAgICAgaWQ6IG51bWJlciB8IHN0cmluZztcbiAgICAgIFtrZXk6IHN0cmluZ106IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBudWxsO1xuICAgIH0sXG4gICAgb3B0aW9ucz86IHtcbiAgICAgIHNpbmdsZVJlY29yZD86IGJvb2xlYW47XG4gICAgICBfZGI/OiBLbmV4O1xuICAgIH0sXG4gICk6IFByb21pc2U8Rml4dHVyZVJlY29yZFtdPiB7XG4gICAgY29uc3QgcmVjb3JkczogRml4dHVyZVJlY29yZFtdID0gW107XG4gICAgY29uc3QgdmlzaXRlZEVudGl0aWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICBjb25zdCBjcmVhdGUgPSBhc3luYyAoXG4gICAgICBlbnRpdHk6IEVudGl0eSxcbiAgICAgIHJvdzoge1xuICAgICAgICBpZDogbnVtYmVyIHwgc3RyaW5nO1xuICAgICAgICBba2V5OiBzdHJpbmddOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgbnVsbDtcbiAgICAgIH0sXG4gICAgKSA9PiB7XG4gICAgICBjb25zdCBmaXh0dXJlSWQgPSBgJHtlbnRpdHkuaWR9IyR7cm93LmlkfWA7XG4gICAgICBpZiAodmlzaXRlZEVudGl0aWVzLmhhcyhmaXh0dXJlSWQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHZpc2l0ZWRFbnRpdGllcy5hZGQoZml4dHVyZUlkKTtcblxuICAgICAgY29uc3QgcmVjb3JkOiBGaXh0dXJlUmVjb3JkID0ge1xuICAgICAgICBmaXh0dXJlSWQsXG4gICAgICAgIGVudGl0eUlkOiBlbnRpdHkuaWQsXG4gICAgICAgIGlkOiByb3cuaWQsXG4gICAgICAgIGNvbHVtbnM6IHt9LFxuICAgICAgICBmZXRjaGVkUmVjb3JkczogW10sXG4gICAgICAgIGJlbG9uZ3NSZWNvcmRzOiBbXSxcbiAgICAgIH07XG5cbiAgICAgIGZvciAoY29uc3QgcHJvcCBvZiBlbnRpdHkucHJvcHMpIHtcbiAgICAgICAgaWYgKGlzVmlydHVhbFByb3AocHJvcCkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlY29yZC5jb2x1bW5zW3Byb3AubmFtZV0gPSB7XG4gICAgICAgICAgcHJvcDogcHJvcCxcbiAgICAgICAgICB2YWx1ZTogcm93W3Byb3AubmFtZV0sXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgZGIgPSBvcHRpb25zPy5fZGIgPz8gQmFzZU1vZGVsLmdldERCKFwid1wiKTtcbiAgICAgICAgaWYgKGlzTWFueVRvTWFueVJlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgICAgICAgIGNvbnN0IHJlbGF0ZWRFbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChwcm9wLndpdGgpO1xuICAgICAgICAgIGNvbnN0IHRocm91Z2hUYWJsZSA9IHByb3Auam9pblRhYmxlO1xuICAgICAgICAgIGNvbnN0IGZyb21Db2x1bW4gPSBgJHtpbmZsZWN0aW9uLnNpbmd1bGFyaXplKGVudGl0eS50YWJsZSl9X2lkYDtcbiAgICAgICAgICBjb25zdCB0b0NvbHVtbiA9IGAke2luZmxlY3Rpb24uc2luZ3VsYXJpemUocmVsYXRlZEVudGl0eS50YWJsZSl9X2lkYDtcblxuICAgICAgICAgIGNvbnN0IHJlbGF0ZWRJZHMgPSBhd2FpdCBkYih0aHJvdWdoVGFibGUpLndoZXJlKGZyb21Db2x1bW4sIHJvdy5pZCkucGx1Y2sodG9Db2x1bW4pO1xuICAgICAgICAgIHJlY29yZC5jb2x1bW5zW3Byb3AubmFtZV0udmFsdWUgPSByZWxhdGVkSWRzO1xuICAgICAgICB9IGVsc2UgaWYgKGlzSGFzTWFueVJlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgICAgICAgIGNvbnN0IHJlbGF0ZWRFbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChwcm9wLndpdGgpO1xuICAgICAgICAgIGNvbnN0IHJlbGF0ZWRJZHMgPSBhd2FpdCBkYihyZWxhdGVkRW50aXR5LnRhYmxlKVxuICAgICAgICAgICAgLndoZXJlKHByb3Auam9pbkNvbHVtbiwgcm93LmlkKVxuICAgICAgICAgICAgLnBsdWNrKFwiaWRcIik7XG4gICAgICAgICAgcmVjb3JkLmNvbHVtbnNbcHJvcC5uYW1lXS52YWx1ZSA9IHJlbGF0ZWRJZHM7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChwcm9wKSAmJiAhcHJvcC5oYXNKb2luQ29sdW1uKSB7XG4gICAgICAgICAgLy8g7Jet67Cp7ZalIE9uZVRvT25lOiBGS+ulvCDqsIDsp4Qg6rSA66CoIOyXlO2LsO2LsOulvCDssL7sirXri4jri6RcbiAgICAgICAgICAvLyDsmIjsi5w6IFVzZXIgT25lVG9PbmUgRW1wbG95ZWUgKEVtcGxveWVl6rCAIHVzZXJfaWQgRkvrpbwg6rCA7KeQKVxuICAgICAgICAgIGNvbnN0IHJlbGF0ZWRFbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChwcm9wLndpdGgpO1xuICAgICAgICAgIGNvbnN0IHJlbGF0ZWRQcm9wID0gcmVsYXRlZEVudGl0eS5wcm9wcy5maW5kKFxuICAgICAgICAgICAgKHApID0+IGlzUmVsYXRpb25Qcm9wKHApICYmIHAud2l0aCA9PT0gZW50aXR5LmlkLFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKHJlbGF0ZWRQcm9wICYmIGlzUmVsYXRpb25Qcm9wKHJlbGF0ZWRQcm9wKSkge1xuICAgICAgICAgICAgLy8g6rSA66CoIOyXlO2LsO2LsOyXkOyEnCBGSyDsu6zrn7zsnLzroZwg7L+866as7ZWp64uI64ukIChpZOqwgCDslYTri5gpXG4gICAgICAgICAgICBjb25zdCBma0NvbHVtbiA9IGAke3JlbGF0ZWRQcm9wLm5hbWV9X2lkYDtcbiAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRSb3cgPSBhd2FpdCBkYihyZWxhdGVkRW50aXR5LnRhYmxlKS53aGVyZShma0NvbHVtbiwgcm93LmlkKS5maXJzdCgpO1xuICAgICAgICAgICAgcmVjb3JkLmNvbHVtbnNbcHJvcC5uYW1lXS52YWx1ZSA9IHJlbGF0ZWRSb3c/LmlkO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChpc1JlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgICAgICAgIGNvbnN0IHJlbGF0ZWRJZCA9IHJvd1tgJHtwcm9wLm5hbWV9X2lkYF07XG4gICAgICAgICAgcmVjb3JkLmNvbHVtbnNbcHJvcC5uYW1lXS52YWx1ZSA9IHJlbGF0ZWRJZDtcbiAgICAgICAgICBpZiAocmVsYXRlZElkKSB7XG4gICAgICAgICAgICByZWNvcmQuYmVsb25nc1JlY29yZHMucHVzaChgJHtwcm9wLndpdGh9IyR7cmVsYXRlZElkfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIW9wdGlvbnM/LnNpbmdsZVJlY29yZCAmJiByZWxhdGVkSWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRFbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChwcm9wLndpdGgpO1xuICAgICAgICAgICAgY29uc3QgcmVsYXRlZFJvdyA9IGF3YWl0IGRiKHJlbGF0ZWRFbnRpdHkudGFibGUpLndoZXJlKFwiaWRcIiwgcmVsYXRlZElkKS5maXJzdCgpO1xuICAgICAgICAgICAgaWYgKHJlbGF0ZWRSb3cpIHtcbiAgICAgICAgICAgICAgYXdhaXQgY3JlYXRlKHJlbGF0ZWRFbnRpdHksIHJlbGF0ZWRSb3cpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZWNvcmRzLnB1c2gocmVjb3JkKTtcbiAgICB9O1xuXG4gICAgYXdhaXQgY3JlYXRlKGVudGl0eSwgcm93KTtcblxuICAgIHJldHVybiByZWNvcmRzO1xuICB9XG5cbiAgLyoqXG4gICAqIDEuIFJlbGF0aW9uR3JhcGjroZwgZml4dHVyZSDri6jsnIQg7IK97J6FIOyInOyEnCDqs4TsgrAgKHNlbGYtcmVmZXJlbmNlIO2PrO2VqClcbiAgICogMi4g7YWM7J2067iU67OEIOugiOuyqOuzhOuhnCBVcHNlcnRCdWlsZGVy7JeQIOuTseuhnSDrsI8gdXBzZXJ0IOyLpO2WiVxuICAgKiAzLiDsiJzshJwg6riw67CYIHV1aWTihpJpZCDrp6TtlZEgKFVwc2VydEJ1aWxkZXLqsIAgdXVpZOulvCBEQuyXkCDsoIDsnqXtlZjsp4Ag7JWK7Jy866+A66GcKVxuICAgKlxuICAgKiBVcHNlcnRCdWlsZGVy64qUIHNlbGYtcmVmZXJlbmNl6rCAIOyeiOycvOuptCBidWlsZEluc2VydExldmVscygp66GcIOyerOygleugrO2VmOyXrFxuICAgKiDrk7HroZ0g7Iic7ISc7JmAIOuwmO2ZmCDsiJzshJzqsIAg64us65287KeIIOyImCDsnojsirXri4jri6QuIOydtOulvCDrsKnsp4DtlZjquLAg7JyE7ZW0XG4gICAqIEZpeHR1cmVNYW5hZ2Vy6rCAIOugiOuyqOuzhOuhnCDrgpjriKDshJwg7LKY66as7ZWY7JesIOqwgSB1cHNlcnQg7Zi47Lac7JeQ7ISc64qUXG4gICAqIHNlbGYtcmVmZXJlbmNl6rCAIOyXhuuPhOuhnSDtlanri4jri6QuXG4gICAqL1xuICBhc3luYyBpbnNlcnRGaXh0dXJlcyhcbiAgICBkYk5hbWU6IGtleW9mIFNvbmFtdURCQ29uZmlnLFxuICAgIF9maXh0dXJlczogRml4dHVyZVJlY29yZFtdLFxuICApOiBQcm9taXNlPEZpeHR1cmVJbXBvcnRSZXN1bHRbXT4ge1xuICAgIGNvbnN0IGZpeHR1cmVzID0gdW5pcXVlKF9maXh0dXJlcywgKGYpID0+IGYuZml4dHVyZUlkKTtcblxuICAgIC8vIOy0iOq4sO2ZlFxuICAgIHRoaXMuYnVpbGRlciA9IG5ldyBVcHNlcnRCdWlsZGVyKCk7XG4gICAgdGhpcy5maXh0dXJlUmVmTWFwID0gbmV3IE1hcCgpO1xuICAgIHRoaXMuc2tpcHBlZEZpeHR1cmVzID0gbmV3IE1hcCgpO1xuXG4gICAgY29uc3QgZGIgPSBjcmVhdGVLbmV4SW5zdGFuY2UoU29uYW11LmRiQ29uZmlnW2RiTmFtZV0pO1xuICAgIGNvbnN0IHJlc3VsdHM6IEZpeHR1cmVJbXBvcnRSZXN1bHRbXSA9IFtdO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIDEuIFJlbGF0aW9uR3JhcGjroZwgZml4dHVyZSDri6jsnIQg7IK97J6FIOyInOyEnCDqs4TsgrBcbiAgICAgIHRoaXMucmVsYXRpb25HcmFwaC5idWlsZEdyYXBoKGZpeHR1cmVzKTtcbiAgICAgIGNvbnN0IGluc2VydGlvbk9yZGVyID0gdGhpcy5yZWxhdGlvbkdyYXBoLmdldEluc2VydGlvbk9yZGVyKCk7XG5cbiAgICAgIC8vIDIuIOyKpO2Cte2VoCBmaXh0dXJlIOuovOyggCDsspjrpqwgKG92ZXJyaWRlIOyytO2BrClcbiAgICAgIGZvciAoY29uc3QgZml4dHVyZUlkIG9mIGluc2VydGlvbk9yZGVyKSB7XG4gICAgICAgIGNvbnN0IGZpeHR1cmUgPSBmaXh0dXJlcy5maW5kKChmKSA9PiBmLmZpeHR1cmVJZCA9PT0gZml4dHVyZUlkKTtcbiAgICAgICAgaWYgKCFmaXh0dXJlKSBjb250aW51ZTtcblxuICAgICAgICBjb25zdCBoYXNUYXJnZXQgPSAhIWZpeHR1cmUudGFyZ2V0O1xuICAgICAgICBjb25zdCBoYXNVbmlxdWUgPSAhIWZpeHR1cmUudW5pcXVlO1xuICAgICAgICBjb25zdCBoYXNEdXBsaWNhdGUgPSBoYXNUYXJnZXQgfHwgaGFzVW5pcXVlO1xuXG4gICAgICAgIC8vIOykkeuzteydtCDsnojqs6Agb3ZlcnJpZGU9ZmFsc2Xsnbgg6rK97JqwOiDsiqTtgrVcbiAgICAgICAgaWYgKGhhc0R1cGxpY2F0ZSAmJiAhZml4dHVyZS5vdmVycmlkZSkge1xuICAgICAgICAgIC8vIOq4sOyhtCDroIjsvZTrk5wgSUQg7KCA7J6lICh1bmlxdWUg7Jqw7ISgLCDsl4bsnLzrqbQgdGFyZ2V0KVxuICAgICAgICAgIGNvbnN0IGV4aXN0aW5nSWQgPSBmaXh0dXJlLnVuaXF1ZT8uaWQgPz8gZml4dHVyZS50YXJnZXQ/LmlkO1xuICAgICAgICAgIGFzc2VydChleGlzdGluZ0lkKTtcbiAgICAgICAgICB0aGlzLnNraXBwZWRGaXh0dXJlcy5zZXQoZml4dHVyZUlkLCB7XG4gICAgICAgICAgICBlbnRpdHlJZDogZml4dHVyZS5lbnRpdHlJZCxcbiAgICAgICAgICAgIGV4aXN0aW5nSWQsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICBjaGFsay55ZWxsb3coXG4gICAgICAgICAgICAgICAgYFNraXBwZWQgJHtmaXh0dXJlLmVudGl0eUlkfSMke2ZpeHR1cmUuaWR9IChleGlzdGluZzogIyR7ZXhpc3RpbmdJZH0sIG92ZXJyaWRlOiBmYWxzZSlgLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyAzLiDthYzsnbTruJTrs4QgZml4dHVyZSDqt7jro7ntmZQgKGluc2VydGlvbk9yZGVyIOyInOyEnCDquLDrsJgpXG4gICAgICBjb25zdCBmaXh0dXJlc0J5VGFibGUgPSBuZXcgTWFwPHN0cmluZywgRml4dHVyZVJlY29yZFtdPigpO1xuICAgICAgY29uc3QgdGFibGVPcmRlcjogc3RyaW5nW10gPSBbXTtcblxuICAgICAgZm9yIChjb25zdCBmaXh0dXJlSWQgb2YgaW5zZXJ0aW9uT3JkZXIpIHtcbiAgICAgICAgLy8g7Iqk7YK165CcIGZpeHR1cmUg7KCc7Jm4XG4gICAgICAgIGlmICh0aGlzLnNraXBwZWRGaXh0dXJlcy5oYXMoZml4dHVyZUlkKSkgY29udGludWU7XG5cbiAgICAgICAgY29uc3QgZml4dHVyZSA9IGZpeHR1cmVzLmZpbmQoKGYpID0+IGYuZml4dHVyZUlkID09PSBmaXh0dXJlSWQpO1xuICAgICAgICBpZiAoIWZpeHR1cmUpIGNvbnRpbnVlO1xuXG4gICAgICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGZpeHR1cmUuZW50aXR5SWQpO1xuICAgICAgICBjb25zdCB0YWJsZU5hbWUgPSBlbnRpdHkudGFibGU7XG5cbiAgICAgICAgaWYgKCFmaXh0dXJlc0J5VGFibGUuaGFzKHRhYmxlTmFtZSkpIHtcbiAgICAgICAgICBmaXh0dXJlc0J5VGFibGUuc2V0KHRhYmxlTmFtZSwgW10pO1xuICAgICAgICAgIHRhYmxlT3JkZXIucHVzaCh0YWJsZU5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGZpeHR1cmVzQnlUYWJsZS5nZXQodGFibGVOYW1lKT8ucHVzaChmaXh0dXJlKTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgZGIudHJhbnNhY3Rpb24oYXN5bmMgKHRyeCkgPT4ge1xuICAgICAgICBjb25zdCBpbnNlcnRlZElkc0J5VGFibGUgPSBuZXcgTWFwPHN0cmluZywgTWFwPHN0cmluZywgbnVtYmVyIHwgc3RyaW5nPj4oKTtcblxuICAgICAgICAvLyA0LiDthYzsnbTruJTrs4Qg66CI67Ko67OEIOyymOumrFxuICAgICAgICBmb3IgKGNvbnN0IHRhYmxlTmFtZSBvZiB0YWJsZU9yZGVyKSB7XG4gICAgICAgICAgY29uc3QgdGFibGVGaXh0dXJlcyA9IGZpeHR1cmVzQnlUYWJsZS5nZXQodGFibGVOYW1lKSA/PyBbXTtcbiAgICAgICAgICBjb25zdCBsZXZlbHMgPSB0aGlzLmdyb3VwRml4dHVyZXNCeUxldmVsKHRhYmxlRml4dHVyZXMpO1xuXG4gICAgICAgICAgZm9yIChjb25zdCBsZXZlbEZpeHR1cmVzIG9mIGxldmVscykge1xuICAgICAgICAgICAgLy8g7ZW064u5IOugiOuyqOydmCBmaXh0dXJl65OkIHJlZ2lzdGVyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGZpeHR1cmUgb2YgbGV2ZWxGaXh0dXJlcykge1xuICAgICAgICAgICAgICB0aGlzLnJlZ2lzdGVyRml4dHVyZShmaXh0dXJlLCBpbnNlcnRlZElkc0J5VGFibGUpO1xuICAgICAgICAgICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICAgIGNoYWxrLmJsdWUoXG4gICAgICAgICAgICAgICAgICAgIGBSZWdpc3RlcmVkICR7Zml4dHVyZS5lbnRpdHlJZH0jJHtmaXh0dXJlLmlkfSR7Zml4dHVyZS5vdmVycmlkZSA/IGAgKG92ZXJyaWRlKWAgOiBcIlwifWAsXG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIHVwc2VydCDsi6Ttlokg7KCEIHV1aWQg66qp66GdIOyggOyepVxuICAgICAgICAgICAgY29uc3QgdGFibGUgPSB0aGlzLmJ1aWxkZXIuZ2V0VGFibGUodGFibGVOYW1lKTtcbiAgICAgICAgICAgIGNvbnN0IHV1aWRzID0gdGFibGUucm93cy5tYXAoKHJvdykgPT4gcm93LnV1aWQgYXMgc3RyaW5nKTtcblxuICAgICAgICAgICAgIWlzVGVzdCgpICYmXG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgIGNoYWxrLmJsdWUoXG4gICAgICAgICAgICAgICAgICBgVXBzZXJ0aW5nICR7dGFibGVOYW1lfSB3aXRoICR7dXVpZHMubGVuZ3RofSByb3dzIChsZXZlbCAke2xldmVscy5pbmRleE9mKGxldmVsRml4dHVyZXMpICsgMX0vJHtsZXZlbHMubGVuZ3RofSlgLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCBpZHMgPSAoYXdhaXQgdGhpcy5idWlsZGVyLnVwc2VydChcbiAgICAgICAgICAgICAgdHJ4LFxuICAgICAgICAgICAgICB0YWJsZU5hbWUgYXMga2V5b2YgRGF0YWJhc2VTY2hlbWFFeHRlbmQsXG4gICAgICAgICAgICApKSBhcyAobnVtYmVyIHwgc3RyaW5nKVtdO1xuXG4gICAgICAgICAgICAvLyDsiJzshJwg6riw67CYIHV1aWQgLT4gaWQg66ek7ZWRXG4gICAgICAgICAgICAvLyBzZWxmLXJlZmVyZW5jZeqwgCDsl4bsnLzrr4DroZwg65Ox66GdIOyInOyEnCA9IOuwmO2ZmCDsiJzshJwg67O07J6lXG4gICAgICAgICAgICBpZiAodXVpZHMubGVuZ3RoID4gMCAmJiB1dWlkcy5sZW5ndGggPT09IGlkcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgY29uc3QgZXhpc3RpbmdNYXAgPVxuICAgICAgICAgICAgICAgIGluc2VydGVkSWRzQnlUYWJsZS5nZXQodGFibGVOYW1lKSA/PyBuZXcgTWFwPHN0cmluZywgbnVtYmVyIHwgc3RyaW5nPigpO1xuICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHV1aWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgZXhpc3RpbmdNYXAuc2V0KHV1aWRzW2ldLCBpZHNbaV0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGluc2VydGVkSWRzQnlUYWJsZS5zZXQodGFibGVOYW1lLCBleGlzdGluZ01hcCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHV1aWRzLmxlbmd0aCAhPT0gaWRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgICAgY2hhbGsueWVsbG93KFxuICAgICAgICAgICAgICAgICAgYFdhcm5pbmc6IHV1aWQgY291bnQgKCR7dXVpZHMubGVuZ3RofSkgIT0gaWQgY291bnQgKCR7aWRzLmxlbmd0aH0pIGZvciAke3RhYmxlTmFtZX1gLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gNS4gTWFueVRvTWFueSDqtIDqs4Qg7LKY66asXG4gICAgICAgIGF3YWl0IHRoaXMucHJvY2Vzc01hbnlUb01hbnlSZWxhdGlvbnModHJ4LCBmaXh0dXJlcywgaW5zZXJ0ZWRJZHNCeVRhYmxlKTtcblxuICAgICAgICAvLyA2LiBQb3N0Z3JlU1FMIOyLnO2AgOyKpCDrpqzshYtcbiAgICAgICAgLy8gRml4dHVyZSDsgr3snoUg7ZuEIOqwgSDthYzsnbTruJTsnZggSUQg7Iuc7YCA7Iqk66W8IOy1nOuMgCBJRCDqsJLsnLzroZwg7JeF642w7J207Yq47ZWp64uI64ukLlxuICAgICAgICAvLyDsnbTroIfqsowg7ZWY7KeAIOyViuycvOuptCDri6TsnYwgSU5TRVJUIOyLnCBJROqwgCAyMDAw67KI64yA66GcIOyDneyEseuQoCDsiJgg7J6I7Iq164uI64ukLlxuICAgICAgICAhaXNUZXN0KCkgJiYgY29uc29sZS5sb2coY2hhbGsuYmx1ZShcIlJlc2V0dGluZyBzZXF1ZW5jZXMuLi5cIikpO1xuICAgICAgICBmb3IgKGNvbnN0IHRhYmxlTmFtZSBvZiB0YWJsZU9yZGVyKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIEVudGl0eeulvCDssL7slYTshJwgaWQg7YOA7J6FIO2ZleyduFxuICAgICAgICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXRBbGxFbnRpdGllcygpLmZpbmQoXG4gICAgICAgICAgICAgIChlKSA9PiBlLnRhYmxlID09PSB0YWJsZU5hbWUgfHwgZS5pZC50b0xvd2VyQ2FzZSgpID09PSB0YWJsZU5hbWUsXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBpZiAoZW50aXR5KSB7XG4gICAgICAgICAgICAgIGNvbnN0IGlkUHJvcCA9IGVudGl0eS5wcm9wcy5maW5kKChwKSA9PiBwLm5hbWUgPT09IFwiaWRcIik7XG4gICAgICAgICAgICAgIGNvbnN0IGlkVHlwZSA9IGlkUHJvcD8udHlwZTtcblxuICAgICAgICAgICAgICAvLyBpbnRlZ2VyL2JpZ0ludGVnZXLsnbTqsbDrgpgsIHN0cmluZ+ydtOyngOunjCBmaXh0dXJlU3RyYXRlZ3k9c2VxdWVuY2Xsnbgg6rK97Jqw7JeQ66eMIOumrOyFi+2VqeuLiOuLpFxuICAgICAgICAgICAgICBjb25zdCB1c2VzU2VxdWVuY2UgPVxuICAgICAgICAgICAgICAgIGlkVHlwZSA9PT0gXCJpbnRlZ2VyXCIgfHxcbiAgICAgICAgICAgICAgICBpZFR5cGUgPT09IFwiYmlnSW50ZWdlclwiIHx8XG4gICAgICAgICAgICAgICAgaWRQcm9wPy5jb25lPy5maXh0dXJlU3RyYXRlZ3kgPT09IFwic2VxdWVuY2VcIjtcblxuICAgICAgICAgICAgICBpZiAoIXVzZXNTZXF1ZW5jZSkge1xuICAgICAgICAgICAgICAgICFpc1Rlc3QoKSAmJlxuICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgICAgIGNoYWxrLmdyYXkoXG4gICAgICAgICAgICAgICAgICAgICAgYFNraXBwZWQgc2VxdWVuY2UgcmVzZXQgZm9yICR7dGFibGVOYW1lfSAoaWQgdHlwZTogJHtpZFR5cGUgfHwgXCJ1bmtub3duXCJ9KWAsXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIO2FjOydtOu4lOydmCDstZzrjIAgSUQg7KGw7ZqMIChzdHJpbmcg7YOA7J6F7J2AIOyIq+yekCDsupDsiqTtjIUg7ZWE7JqUKVxuICAgICAgICAgICAgY29uc3QgZW50aXR5MiA9IEVudGl0eU1hbmFnZXIuZ2V0QWxsRW50aXRpZXMoKS5maW5kKFxuICAgICAgICAgICAgICAoZSkgPT4gZS50YWJsZSA9PT0gdGFibGVOYW1lIHx8IGUuaWQudG9Mb3dlckNhc2UoKSA9PT0gdGFibGVOYW1lLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IGlkVHlwZTIgPSBlbnRpdHkyPy5wcm9wcy5maW5kKChwKSA9PiBwLm5hbWUgPT09IFwiaWRcIik/LnR5cGU7XG4gICAgICAgICAgICBjb25zdCBtYXhJZFJlc3VsdCA9XG4gICAgICAgICAgICAgIGlkVHlwZTIgPT09IFwic3RyaW5nXCJcbiAgICAgICAgICAgICAgICA/IGF3YWl0IHRyeFxuICAgICAgICAgICAgICAgICAgICAucmF3KGBTRUxFQ1QgTUFYKGlkOjpiaWdpbnQpIGFzIG1heF9pZCBGUk9NIFwiJHt0YWJsZU5hbWV9XCJgKVxuICAgICAgICAgICAgICAgICAgICAudGhlbigocikgPT4gci5yb3dzWzBdKVxuICAgICAgICAgICAgICAgIDogYXdhaXQgdHJ4KHRhYmxlTmFtZSkubWF4KFwiaWQgYXMgbWF4X2lkXCIpLmZpcnN0KCk7XG4gICAgICAgICAgICBjb25zdCBtYXhJZCA9IG1heElkUmVzdWx0Py5tYXhfaWQ7XG5cbiAgICAgICAgICAgIGlmIChtYXhJZCAhPT0gbnVsbCAmJiBtYXhJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIC8vIOyLnO2AgOyKpOuqheydhCBwZ19nZXRfc2VyaWFsX3NlcXVlbmNl66GcIOyViOyghO2VmOqyjCDsobDtmoxcbiAgICAgICAgICAgICAgYXdhaXQgdHJ4LnJhdyhgU0VMRUNUIHNldHZhbChwZ19nZXRfc2VyaWFsX3NlcXVlbmNlKD8sICdpZCcpLCA/KWAsIFtcbiAgICAgICAgICAgICAgICB0YWJsZU5hbWUsXG4gICAgICAgICAgICAgICAgbWF4SWQsXG4gICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICAhaXNUZXN0KCkgJiYgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oYFJlc2V0IHNlcXVlbmNlIGZvciAke3RhYmxlTmFtZX06ICR7bWF4SWR9YCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKF9lcnIpIHtcbiAgICAgICAgICAgIC8vIOyLnO2AgOyKpOqwgCDsl4bripQg7YWM7J2067iUKGpvaW4gdGFibGUg65OxKeydgCDrrLTsi5xcbiAgICAgICAgICAgICFpc1Rlc3QoKSAmJiBjb25zb2xlLmxvZyhjaGFsay5ncmF5KGBTa2lwcGVkIHNlcXVlbmNlIHJlc2V0IGZvciAke3RhYmxlTmFtZX1gKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gNy4g6rKw6rO8IOyImOynkVxuICAgICAgICBmb3IgKGNvbnN0IGZpeHR1cmUgb2YgZml4dHVyZXMpIHtcbiAgICAgICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChmaXh0dXJlLmVudGl0eUlkKTtcblxuICAgICAgICAgIC8vIOyKpO2CteuQnCBmaXh0dXJl64qUIOq4sOyhtCDroIjsvZTrk5wg7KCV67O066GcIOqysOqzvCDstpTqsIBcbiAgICAgICAgICBjb25zdCBza2lwcGVkID0gdGhpcy5za2lwcGVkRml4dHVyZXMuZ2V0KGZpeHR1cmUuZml4dHVyZUlkKTtcbiAgICAgICAgICBpZiAoc2tpcHBlZCkge1xuICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHtcbiAgICAgICAgICAgICAgZW50aXR5SWQ6IGZpeHR1cmUuZW50aXR5SWQsXG4gICAgICAgICAgICAgIGRhdGE6IGF3YWl0IHRyeChlbnRpdHkudGFibGUpLndoZXJlKFwiaWRcIiwgc2tpcHBlZC5leGlzdGluZ0lkKS5maXJzdCgpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCByZWYgPSB0aGlzLmZpeHR1cmVSZWZNYXAuZ2V0KGZpeHR1cmUuZml4dHVyZUlkKTtcbiAgICAgICAgICBpZiAocmVmKSB7XG4gICAgICAgICAgICBjb25zdCB1dWlkVG9JZCA9IGluc2VydGVkSWRzQnlUYWJsZS5nZXQoZW50aXR5LnRhYmxlKTtcbiAgICAgICAgICAgIGNvbnN0IGluc2VydGVkSWQgPSB1dWlkVG9JZD8uZ2V0KHJlZi51dWlkKTtcblxuICAgICAgICAgICAgaWYgKGluc2VydGVkSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICByZXN1bHRzLnB1c2goe1xuICAgICAgICAgICAgICAgIGVudGl0eUlkOiBmaXh0dXJlLmVudGl0eUlkLFxuICAgICAgICAgICAgICAgIGRhdGE6IGF3YWl0IHRyeChlbnRpdHkudGFibGUpLndoZXJlKFwiaWRcIiwgaW5zZXJ0ZWRJZCkuZmlyc3QoKSxcbiAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgIWlzVGVzdCgpICYmXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgICBjaGFsay5ncmVlbihgSW5zZXJ0ZWQgaW50byAke2VudGl0eS50YWJsZX06ICMke2ZpeHR1cmUuaWR9IC0+ICMke2luc2VydGVkSWR9YCksXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCBkYi5kZXN0cm95KCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuaXF1ZShyZXN1bHRzLCAocikgPT4gYCR7ci5lbnRpdHlJZH0jJHtyLmRhdGEuaWR9YCk7XG4gIH1cblxuICAvKipcbiAgICogRml4dHVyZVJlY29yZOulvCBVcHNlcnRCdWlsZGVy7JeQIOuTseuhnVxuICAgKiBAcGFyYW0gaW5zZXJ0ZWRJZHNCeVRhYmxlIOydtOuvuCB1cHNlcnTrkJwg7YWM7J2067iU7J2YIHV1aWTihpJpZCDrp6TtlZEgKOugiOuyqOuzhCDsspjrpqwg7IucIOyCrOyaqSlcbiAgICovXG4gIHByaXZhdGUgcmVnaXN0ZXJGaXh0dXJlKFxuICAgIGZpeHR1cmU6IEZpeHR1cmVSZWNvcmQsXG4gICAgaW5zZXJ0ZWRJZHNCeVRhYmxlPzogTWFwPHN0cmluZywgTWFwPHN0cmluZywgbnVtYmVyIHwgc3RyaW5nPj4sXG4gICk6IFVCUmVmIHtcbiAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChmaXh0dXJlLmVudGl0eUlkKTtcbiAgICBjb25zdCByb3c6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG5cbiAgICAvLyBPdmVycmlkZSDrqqjrk5wg7YyQ64uoOiB0YXJnZXQg65iQ64qUIHVuaXF1ZeqwgCDsnojqs6Agb3ZlcnJpZGU9dHJ1ZeyduCDqsr3smrBcbiAgICBjb25zdCBleGlzdGluZ1JlY29yZCA9IGZpeHR1cmUudGFyZ2V0ID8/IGZpeHR1cmUudW5pcXVlO1xuICAgIGNvbnN0IGlzT3ZlcnJpZGVNb2RlID0gZml4dHVyZS5vdmVycmlkZSAmJiBleGlzdGluZ1JlY29yZDtcblxuICAgIGZvciAoY29uc3QgW3Byb3BOYW1lLCBjb2x1bW5dIG9mIE9iamVjdC5lbnRyaWVzKGZpeHR1cmUuY29sdW1ucykpIHtcbiAgICAgIGNvbnN0IHByb3AgPSBjb2x1bW4ucHJvcDtcblxuICAgICAgaWYgKGlzVmlydHVhbFByb3AocHJvcCkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIEdlbmVyYXRlZCBjb2x1bW7snYAgSU5TRVJU7JeQ7IScIOygnOyZuCAoRELqsIAg7J6Q64+ZIOyDneyEsSlcbiAgICAgIGlmIChcImdlbmVyYXRlZFwiIGluIHByb3AgJiYgcHJvcC5nZW5lcmF0ZWQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIGlkIOyymOumrFxuICAgICAgaWYgKHByb3BOYW1lID09PSBcImlkXCIpIHtcbiAgICAgICAgY29uc3QgaWRQcm9wID0gZW50aXR5LnByb3BzLmZpbmQoKHApID0+IHAubmFtZSA9PT0gXCJpZFwiKTtcbiAgICAgICAgY29uc3QgdXNlc1NlcXVlbmNlID1cbiAgICAgICAgICBpZFByb3A/LnR5cGUgPT09IFwiaW50ZWdlclwiIHx8XG4gICAgICAgICAgaWRQcm9wPy50eXBlID09PSBcImJpZ0ludGVnZXJcIiB8fFxuICAgICAgICAgIGlkUHJvcD8uY29uZT8uZml4dHVyZVN0cmF0ZWd5ID09PSBcInNlcXVlbmNlXCI7XG5cbiAgICAgICAgaWYgKGlzT3ZlcnJpZGVNb2RlICYmIGV4aXN0aW5nUmVjb3JkKSB7XG4gICAgICAgICAgLy8gT3ZlcnJpZGU6IOq4sOyhtCDroIjsvZTrk5zsnZgg6rCSIOyCrOyaqSDihpIgVVBEQVRFXG4gICAgICAgICAgcm93W3Byb3BOYW1lXSA9IGV4aXN0aW5nUmVjb3JkLmNvbHVtbnNbcHJvcE5hbWVdPy52YWx1ZTtcbiAgICAgICAgfSBlbHNlIGlmICghdXNlc1NlcXVlbmNlKSB7XG4gICAgICAgICAgLy8gc3RyaW5nIFBLOiDsg53shLHrkJwgaWQg6rCS7J2EIElOU0VSVOyXkCDtj6ztlaggKERCIERFRkFVTFQg7JeG7J2MKVxuICAgICAgICAgIHJvd1twcm9wTmFtZV0gPSBjb2x1bW4udmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gaW50ZWdlci9iaWdJbnRlZ2VyIFBLOiBEQiDsi5ztgIDsiqTsl5Ag66eh6rmAICjqsJIg7KCc7Jm4KVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzUmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChwcm9wKSB8fFxuICAgICAgICAgIChpc09uZVRvT25lUmVsYXRpb25Qcm9wKHByb3ApICYmIHByb3AuaGFzSm9pbkNvbHVtbilcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgcmVsYXRlZElkID0gY29sdW1uLnZhbHVlIGFzIG51bWJlciB8IG51bGw7XG4gICAgICAgICAgaWYgKHJlbGF0ZWRJZCAhPT0gbnVsbCAmJiByZWxhdGVkSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgcmVsYXRlZEZpeHR1cmVJZCA9IGAke3Byb3Aud2l0aH0jJHtyZWxhdGVkSWR9YDtcblxuICAgICAgICAgICAgLy8g66i87KCAIHNraXDrkJwgZml4dHVyZeyduOyngCDtmZXsnbhcbiAgICAgICAgICAgIGNvbnN0IHNraXBwZWRFeGlzdGluZ0lkID0gdGhpcy5za2lwcGVkRml4dHVyZXMuZ2V0KHJlbGF0ZWRGaXh0dXJlSWQpPy5leGlzdGluZ0lkO1xuICAgICAgICAgICAgaWYgKHNraXBwZWRFeGlzdGluZ0lkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgLy8gc2tpcOuQnCBmaXh0dXJlIOKGkiB0YXJnZXQgRELsnZgg6riw7KG0IOugiOy9lOuTnCBpZCDsgqzsmqlcbiAgICAgICAgICAgICAgcm93W2Ake3Byb3BOYW1lfV9pZGBdID0gc2tpcHBlZEV4aXN0aW5nSWQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjb25zdCByZWxhdGVkUmVmID0gdGhpcy5maXh0dXJlUmVmTWFwLmdldChyZWxhdGVkRml4dHVyZUlkKTtcbiAgICAgICAgICAgICAgaWYgKHJlbGF0ZWRSZWYpIHtcbiAgICAgICAgICAgICAgICAvLyDsnbTrr7ggdXBzZXJ065CcIOqwmeydgCDthYzsnbTruJQgZml4dHVyZSDtmZXsnbhcbiAgICAgICAgICAgICAgICBjb25zdCByZWxhdGVkRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocHJvcC53aXRoKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZWxhdGVkSW5zZXJ0ZWRJZHMgPSBpbnNlcnRlZElkc0J5VGFibGU/LmdldChyZWxhdGVkRW50aXR5LnRhYmxlKTtcbiAgICAgICAgICAgICAgICBjb25zdCBhY3R1YWxJZCA9IHJlbGF0ZWRJbnNlcnRlZElkcz8uZ2V0KHJlbGF0ZWRSZWYudXVpZCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoYWN0dWFsSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgLy8g7J2066+4IHVwc2VydOuQqCDihpIg7Iuk7KCcIElEIOyCrOyaqVxuICAgICAgICAgICAgICAgICAgcm93W2Ake3Byb3BOYW1lfV9pZGBdID0gYWN0dWFsSWQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIC8vIOyVhOyngSB1cHNlcnQg7JWI65CoIOKGkiBVQlJlZiDsgqzsmqlcbiAgICAgICAgICAgICAgICAgIHJvd1tgJHtwcm9wTmFtZX1faWRgXSA9IHJlbGF0ZWRSZWY7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGZpeHR1cmVz7JeQIO2PrO2VqOuQmOyngCDslYrsnYAg66CI7L2U65OcIOKGkiBJRCDqt7jrjIDroZwg7IKs7JqpXG4gICAgICAgICAgICAgICAgcm93W2Ake3Byb3BOYW1lfV9pZGBdID0gcmVsYXRlZElkO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJvd1tgJHtwcm9wTmFtZX1faWRgXSA9IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEhhc01hbnksIE1hbnlUb01hbnnripQg67OE64+EIOyymOumrFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8g7J2867CYIOy7rOufvFxuICAgICAgICByb3dbcHJvcE5hbWVdID0gdGhpcy5jb252ZXJ0Q29sdW1uVmFsdWUocHJvcCBhcyBFbnRpdHlQcm9wLCBjb2x1bW4udmFsdWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgICFpc1Rlc3QoKSAmJlxuICAgICAgY29uc29sZS5sb2coY2hhbGsuYmx1ZShgUmVnaXN0ZXJpbmcgJHtlbnRpdHkudGFibGV9IC0gJHtpbnNwZWN0KHJvdywgZmFsc2UsIG51bGwsIHRydWUpfWApKTtcbiAgICBjb25zdCByZWYgPSB0aGlzLmJ1aWxkZXIucmVnaXN0ZXIoZW50aXR5LnRhYmxlLCByb3cpO1xuICAgIHRoaXMuZml4dHVyZVJlZk1hcC5zZXQoZml4dHVyZS5maXh0dXJlSWQsIHJlZik7XG5cbiAgICByZXR1cm4gcmVmO1xuICB9XG5cbiAgLyoqXG4gICAqIOy7rOufvCDqsJIg67OA7ZmYXG4gICAqL1xuICBwcml2YXRlIGNvbnZlcnRDb2x1bW5WYWx1ZShwcm9wOiBFbnRpdHlQcm9wLCB2YWx1ZTogdW5rbm93bik6IHVua25vd24ge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHByb3AudHlwZSkge1xuICAgICAgY2FzZSBcImpzb25cIjpcbiAgICAgICAgLy8gVXBzZXJ0QnVpbGRlci5yZWdpc3RlcuyXkOyEnCBKU09OLnN0cmluZ2lmeSDsspjrpqztlZjrr4DroZwgb2JqZWN0IOq3uOuMgOuhnCDsoITri6xcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuXG4gICAgICBjYXNlIFwiZGF0ZVwiOlxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgIHJldHVybiBuZXcgRGF0ZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBwcm9jZXNzTWFueVRvTWFueVJlbGF0aW9ucyhcbiAgICB0cng6IEtuZXguVHJhbnNhY3Rpb24sXG4gICAgZml4dHVyZXM6IEZpeHR1cmVSZWNvcmRbXSxcbiAgICBpbnNlcnRlZElkc0J5VGFibGU6IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIG51bWJlciB8IHN0cmluZz4+LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBmb3IgKGNvbnN0IGZpeHR1cmUgb2YgZml4dHVyZXMpIHtcbiAgICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGZpeHR1cmUuZW50aXR5SWQpO1xuICAgICAgY29uc3Qgc291cmNlUmVmID0gdGhpcy5maXh0dXJlUmVmTWFwLmdldChmaXh0dXJlLmZpeHR1cmVJZCk7XG5cbiAgICAgIGlmICghc291cmNlUmVmKSBjb250aW51ZTtcblxuICAgICAgY29uc3Qgc291cmNlVXVpZFRvSWQgPSBpbnNlcnRlZElkc0J5VGFibGUuZ2V0KGVudGl0eS50YWJsZSk7XG4gICAgICBjb25zdCBzb3VyY2VJZCA9IHNvdXJjZVV1aWRUb0lkPy5nZXQoc291cmNlUmVmLnV1aWQpO1xuXG4gICAgICBpZiAoc291cmNlSWQgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG5cbiAgICAgIGZvciAoY29uc3QgWywgY29sdW1uXSBvZiBPYmplY3QuZW50cmllcyhmaXh0dXJlLmNvbHVtbnMpKSB7XG4gICAgICAgIGNvbnN0IHByb3AgPSBjb2x1bW4ucHJvcDtcblxuICAgICAgICBpZiAoaXNNYW55VG9NYW55UmVsYXRpb25Qcm9wKHByb3ApICYmIEFycmF5LmlzQXJyYXkoY29sdW1uLnZhbHVlKSkge1xuICAgICAgICAgIC8vIOyEoO2DneuQmOyngCDslYrsnYAgTWFueVRvTWFueSDqtIDqs4TripQg7KCA7J6l7ZWY7KeAIOyViuydjFxuICAgICAgICAgIGNvbnN0IHRhcmdldFRhYmxlID0gRW50aXR5TWFuYWdlci5nZXQocHJvcC53aXRoKTtcbiAgICAgICAgICBpZiAodGhpcy5idWlsZGVyLmhhc1RhYmxlKHRhcmdldFRhYmxlLnRhYmxlKSA9PT0gZmFsc2UpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgY29uc3QgcmVsYXRlZElkcyA9IGNvbHVtbi52YWx1ZSBhcyBudW1iZXJbXTtcbiAgICAgICAgICBpZiAocmVsYXRlZElkcy5sZW5ndGggPT09IDApIGNvbnRpbnVlO1xuXG4gICAgICAgICAgY29uc3Qgam9pblRhYmxlID0gKHByb3AgYXMgTWFueVRvTWFueVJlbGF0aW9uUHJvcCkuam9pblRhYmxlO1xuICAgICAgICAgIGNvbnN0IHJlbGF0ZWRFbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChwcm9wLndpdGgpO1xuXG4gICAgICAgICAgY29uc3Qgc291cmNlQ29sdW1uID0gYCR7aW5mbGVjdGlvbi5zaW5ndWxhcml6ZShlbnRpdHkudGFibGUpfV9pZGA7XG4gICAgICAgICAgY29uc3QgdGFyZ2V0Q29sdW1uID0gYCR7aW5mbGVjdGlvbi5zaW5ndWxhcml6ZShyZWxhdGVkRW50aXR5LnRhYmxlKX1faWRgO1xuXG4gICAgICAgICAgZm9yIChjb25zdCByZWxhdGVkSWQgb2YgcmVsYXRlZElkcykge1xuICAgICAgICAgICAgY29uc3QgcmVsYXRlZEZpeHR1cmVJZCA9IGAke3Byb3Aud2l0aH0jJHtyZWxhdGVkSWR9YDtcbiAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRSZWYgPSB0aGlzLmZpeHR1cmVSZWZNYXAuZ2V0KHJlbGF0ZWRGaXh0dXJlSWQpO1xuXG4gICAgICAgICAgICBsZXQgdGFyZ2V0SWQ6IG51bWJlciB8IHN0cmluZztcblxuICAgICAgICAgICAgaWYgKHJlbGF0ZWRSZWYpIHtcbiAgICAgICAgICAgICAgY29uc3QgcmVsYXRlZFV1aWRUb0lkID0gaW5zZXJ0ZWRJZHNCeVRhYmxlLmdldChyZWxhdGVkRW50aXR5LnRhYmxlKTtcbiAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWRJZCA9IHJlbGF0ZWRVdWlkVG9JZD8uZ2V0KHJlbGF0ZWRSZWYudXVpZCk7XG5cbiAgICAgICAgICAgICAgaWYgKHJlc29sdmVkSWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgICAgIGBSZWxhdGVkIGZpeHR1cmUgJHtyZWxhdGVkRml4dHVyZUlkfSBub3QgZm91bmQgaW4gaW5zZXJ0ZWRJZHMsIHNraXBwaW5nYCxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHRhcmdldElkID0gcmVzb2x2ZWRJZDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRhcmdldElkID0gcmVsYXRlZElkO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBKb2luVGFibGXsl5Ag7IK97J6FXG4gICAgICAgICAgICBjb25zdCBbZm91bmRdID0gYXdhaXQgdHJ4KGpvaW5UYWJsZSlcbiAgICAgICAgICAgICAgLndoZXJlKHtcbiAgICAgICAgICAgICAgICBbc291cmNlQ29sdW1uXTogc291cmNlSWQsXG4gICAgICAgICAgICAgICAgW3RhcmdldENvbHVtbl06IHRhcmdldElkLFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAubGltaXQoMSk7XG5cbiAgICAgICAgICAgIGlmICghZm91bmQpIHtcbiAgICAgICAgICAgICAgYXdhaXQgdHJ4KGpvaW5UYWJsZSkuaW5zZXJ0KHtcbiAgICAgICAgICAgICAgICBbc291cmNlQ29sdW1uXTogc291cmNlSWQsXG4gICAgICAgICAgICAgICAgW3RhcmdldENvbHVtbl06IHRhcmdldElkLFxuICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICAgIGNoYWxrLmdyZWVuKFxuICAgICAgICAgICAgICAgICAgICBgSW5zZXJ0ZWQgaW50byAke2pvaW5UYWJsZX06ICR7ZW50aXR5LnRhYmxlfSgke3NvdXJjZUlkfSkgLSAke3JlbGF0ZWRFbnRpdHkudGFibGV9KCR7dGFyZ2V0SWR9KWAsXG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOqwmeydgCDthYzsnbTruJQg64K0IGZpeHR1cmXrk6TsnYQgc2VsZi1yZWZlcmVuY2Ug66CI67Ko67OE66GcIOu2hO2VoFxuICAgKiAtIHNlbGYtcmVmZXJlbmNl6rCAIOyXhuuKlCBmaXh0dXJl65OkOiBMZXZlbCAwXG4gICAqIC0gTGV2ZWwgMOydhCDssLjsobDtlZjripQgZml4dHVyZeuTpDogTGV2ZWwgMVxuICAgKiAtIOuwmOuztVxuICAgKlxuICAgKiBVcHNlcnRCdWlsZGVy6rCAIHNlbGYtcmVmZXJlbmNl6rCAIOyeiOycvOuptCBidWlsZEluc2VydExldmVscygp66GcIOyerOygleugrO2VmOyXrFxuICAgKiDrk7HroZ0g7Iic7ISc7JmAIOuwmO2ZmCDsiJzshJzqsIAg64us65287KeIIOyImCDsnojsirXri4jri6QuXG4gICAqIOydtOulvCDrsKnsp4DtlZjquLAg7JyE7ZW0IEZpeHR1cmVNYW5hZ2Vy6rCAIOugiOuyqOuzhOuhnCDrgpjriKDshJwg7LKY66as7ZWp64uI64ukLlxuICAgKi9cbiAgcHJpdmF0ZSBncm91cEZpeHR1cmVzQnlMZXZlbChmaXh0dXJlczogRml4dHVyZVJlY29yZFtdKTogRml4dHVyZVJlY29yZFtdW10ge1xuICAgIGlmIChmaXh0dXJlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChmaXh0dXJlc1swXS5lbnRpdHlJZCk7XG5cbiAgICAvLyBzZWxmLXJlZmVyZW5jZSByZWxhdGlvbiBwcm9wIOywvuq4sFxuICAgIGNvbnN0IHNlbGZSZWZQcm9wcyA9IGVudGl0eS5wcm9wcy5maWx0ZXIoXG4gICAgICAocCk6IHAgaXMgQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wIHwgT25lVG9PbmVSZWxhdGlvblByb3AgPT5cbiAgICAgICAgaXNSZWxhdGlvblByb3AocCkgJiZcbiAgICAgICAgKGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wKHApIHx8IChpc09uZVRvT25lUmVsYXRpb25Qcm9wKHApICYmIHAuaGFzSm9pbkNvbHVtbikpICYmXG4gICAgICAgIHAud2l0aCA9PT0gZW50aXR5LmlkLFxuICAgICk7XG5cbiAgICBpZiAoc2VsZlJlZlByb3BzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgLy8gc2VsZi1yZWZlcmVuY2Ug7JeG7J2MIOKGkiDri6jsnbwg66CI67KoXG4gICAgICByZXR1cm4gW2ZpeHR1cmVzXTtcbiAgICB9XG5cbiAgICAvLyDroIjrsqjrs4Qg67aE7ZWgICh0b3BvbG9naWNhbCBzb3J0KVxuICAgIGNvbnN0IGxldmVsczogRml4dHVyZVJlY29yZFtdW10gPSBbXTtcbiAgICBjb25zdCByZW1haW5pbmcgPSBuZXcgU2V0KGZpeHR1cmVzLm1hcCgoZikgPT4gZi5maXh0dXJlSWQpKTtcbiAgICBjb25zdCBwcm9jZXNzZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgIHdoaWxlIChyZW1haW5pbmcuc2l6ZSA+IDApIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRMZXZlbDogRml4dHVyZVJlY29yZFtdID0gW107XG5cbiAgICAgIGZvciAoY29uc3QgZml4dHVyZSBvZiBmaXh0dXJlcykge1xuICAgICAgICBpZiAoIXJlbWFpbmluZy5oYXMoZml4dHVyZS5maXh0dXJlSWQpKSBjb250aW51ZTtcblxuICAgICAgICAvLyBzZWxmLXJlZmVyZW5jZeqwgCDrqqjrkZAg7J2066+4IOyymOumrOuQkOqxsOuCmCBudWxs7J24IOqyveyasFxuICAgICAgICBjb25zdCBjYW5Qcm9jZXNzID0gc2VsZlJlZlByb3BzLmV2ZXJ5KChwcm9wKSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVmSWQgPSBmaXh0dXJlLmNvbHVtbnNbcHJvcC5uYW1lXT8udmFsdWUgYXMgbnVtYmVyIHwgbnVsbDtcbiAgICAgICAgICBpZiAocmVmSWQgPT09IG51bGwgfHwgcmVmSWQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRydWU7XG4gICAgICAgICAgY29uc3QgcmVmRml4dHVyZUlkID0gYCR7cHJvcC53aXRofSMke3JlZklkfWA7XG4gICAgICAgICAgLy8g7J2066+4IOyymOumrOuQkOqxsOuCmCwg7ZiE7J6sIGZpeHR1cmVz7JeQIO2PrO2VqOuQmOyngCDslYrsnYAg6rK97JqwICjsmbjrtoAg7LC47KGwKVxuICAgICAgICAgIHJldHVybiBwcm9jZXNzZWQuaGFzKHJlZkZpeHR1cmVJZCkgfHwgIXJlbWFpbmluZy5oYXMocmVmRml4dHVyZUlkKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGNhblByb2Nlc3MpIHtcbiAgICAgICAgICBjdXJyZW50TGV2ZWwucHVzaChmaXh0dXJlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoY3VycmVudExldmVsLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBjb25zdCByZW1haW5pbmdJZHMgPSBBcnJheS5mcm9tKHJlbWFpbmluZykuam9pbihcIiwgXCIpO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYENpcmN1bGFyIHNlbGYtcmVmZXJlbmNlIGRldGVjdGVkIGluICR7ZW50aXR5LnRhYmxlfS4gUmVtYWluaW5nIGZpeHR1cmVzOiAke3JlbWFpbmluZ0lkc31gLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IGZpeHR1cmUgb2YgY3VycmVudExldmVsKSB7XG4gICAgICAgIHJlbWFpbmluZy5kZWxldGUoZml4dHVyZS5maXh0dXJlSWQpO1xuICAgICAgICBwcm9jZXNzZWQuYWRkKGZpeHR1cmUuZml4dHVyZUlkKTtcbiAgICAgIH1cblxuICAgICAgbGV2ZWxzLnB1c2goY3VycmVudExldmVsKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbGV2ZWxzO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjaGVja1VuaXF1ZVZpb2xhdGlvbihkYjogS25leCwgZW50aXR5OiBFbnRpdHksIGZpeHR1cmU6IEZpeHR1cmVSZWNvcmQpIHtcbiAgICBjb25zdCBfdW5pcXVlSW5kZXhlcyA9IGVudGl0eS5pbmRleGVzPy5maWx0ZXIoKGkpID0+IGkudHlwZSA9PT0gXCJ1bmlxdWVcIikgPz8gW107XG5cbiAgICBjb25zdCB1bmlxdWVJbmRleGVzID0gX3VuaXF1ZUluZGV4ZXMuZmlsdGVyKChpbmRleCkgPT5cbiAgICAgIGluZGV4LmNvbHVtbnMuZXZlcnkoKGNvbHVtbikgPT4gIWNvbHVtbi5uYW1lLnN0YXJ0c1dpdGgoYCR7ZW50aXR5LnRhYmxlfV9fYCkpLFxuICAgICk7XG4gICAgaWYgKHVuaXF1ZUluZGV4ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBsZXQgdW5pcXVlUXVlcnkgPSBkYihlbnRpdHkudGFibGUpO1xuICAgIGxldCBoYXNDb25kaXRpb24gPSBmYWxzZTtcblxuICAgIGZvciAoY29uc3QgaW5kZXggb2YgdW5pcXVlSW5kZXhlcykge1xuICAgICAgLy8g7Lus65+8IOykkSDtlZjrgpjrnbzrj4QgbnVsbOydtOuptCDsnKDri4jtgawg7KCc7JW97J2EIOychOuwmO2VmOyngCDslYrquLAg65WM66y47JeQIO2VtOuLuSDsnbjrjbHsiqTripQg66y07IucXG4gICAgICBjb25zdCBjb250YWluc051bGwgPSBpbmRleC5jb2x1bW5zLnNvbWUoKGNvbHVtbikgPT4ge1xuICAgICAgICBjb25zdCBmaWVsZCA9IGNvbHVtbi5uYW1lLnJlcGxhY2UoL19pZCQvLCBcIlwiKTtcbiAgICAgICAgcmV0dXJuIGZpeHR1cmUuY29sdW1uc1tmaWVsZF0/LnZhbHVlID09PSBudWxsO1xuICAgICAgfSk7XG4gICAgICBpZiAoY29udGFpbnNOdWxsKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB1bmlxdWVRdWVyeSA9IHVuaXF1ZVF1ZXJ5Lm9yV2hlcmUoKHFiKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgY29sdW1uIG9mIGluZGV4LmNvbHVtbnMpIHtcbiAgICAgICAgICBjb25zdCBmaWVsZCA9IGNvbHVtbi5uYW1lLnJlcGxhY2UoL19pZCQvLCBcIlwiKTtcblxuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGZpeHR1cmUuY29sdW1uc1tmaWVsZF0/LnZhbHVlKSkge1xuICAgICAgICAgICAgcWIud2hlcmVJbihjb2x1bW4ubmFtZSwgZml4dHVyZS5jb2x1bW5zW2ZpZWxkXS52YWx1ZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHFiLmFuZFdoZXJlKGNvbHVtbi5uYW1lLCBmaXh0dXJlLmNvbHVtbnNbZmllbGRdPy52YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGhhc0NvbmRpdGlvbiA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKCFoYXNDb25kaXRpb24pIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IFt1bmlxdWVGb3VuZF0gPSBhd2FpdCB1bmlxdWVRdWVyeTtcbiAgICByZXR1cm4gdW5pcXVlRm91bmQ7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNoZWNrRHVwbGljYXRlQnlDb2x1bW5zKFxuICAgIGRiOiBLbmV4LFxuICAgIGVudGl0eTogRW50aXR5LFxuICAgIGZpeHR1cmU6IEZpeHR1cmVSZWNvcmQsXG4gICAgY29sdW1uczogc3RyaW5nW10sXG4gICkge1xuICAgIGlmIChjb2x1bW5zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3Qgd2hlcmVDbGF1c2U6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG5cbiAgICBmb3IgKGNvbnN0IGNvbHVtbiBvZiBjb2x1bW5zKSB7XG4gICAgICAvLyByZWxhdGlvbiDtlYTrk5zsnbgg6rK97JqwIF9pZCDrtpnsnbTquLBcbiAgICAgIGNvbnN0IHByb3AgPSBlbnRpdHkucHJvcHMuZmluZCgocCkgPT4gcC5uYW1lID09PSBjb2x1bW4pO1xuICAgICAgY29uc3QgZGJDb2x1bW4gPSBwcm9wICYmIGlzUmVsYXRpb25Qcm9wKHByb3ApID8gYCR7Y29sdW1ufV9pZGAgOiBjb2x1bW47XG4gICAgICBjb25zdCB2YWx1ZSA9IGZpeHR1cmUuY29sdW1uc1tjb2x1bW5dPy52YWx1ZTtcblxuICAgICAgLy8gbnVsbCDqsJLsnbQg7Y+s7ZWo65CcIOqyveyasCDspJHrs7Ug7ZmV7J24IOyKpO2CtVxuICAgICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIHdoZXJlQ2xhdXNlW2RiQ29sdW1uXSA9IHZhbHVlO1xuICAgIH1cblxuICAgIGNvbnN0IFtmb3VuZF0gPSBhd2FpdCBkYihlbnRpdHkudGFibGUpLndoZXJlKHdoZXJlQ2xhdXNlKS5saW1pdCgxKTtcbiAgICByZXR1cm4gZm91bmQ7XG4gIH1cblxuICBhc3luYyBhZGRGaXh0dXJlTG9hZGVyKGNvZGU6IHN0cmluZykge1xuICAgIGNvbnN0IHBhdGggPSBgJHtTb25hbXUuYXBpUm9vdFBhdGh9L3NyYy90ZXN0aW5nL2ZpeHR1cmUudHNgO1xuICAgIGNvbnN0IGNvbnRlbnQgPSByZWFkRmlsZVN5bmMocGF0aCkudG9TdHJpbmcoKTtcblxuICAgIGNvbnN0IGZpeHR1cmVMb2FkZXJTdGFydCA9IGNvbnRlbnQuaW5kZXhPZihcImNvbnN0IGZpeHR1cmVMb2FkZXIgPSB7XCIpO1xuICAgIGNvbnN0IGZpeHR1cmVMb2FkZXJFbmQgPSBjb250ZW50LmluZGV4T2YoXCJ9O1wiLCBmaXh0dXJlTG9hZGVyU3RhcnQpO1xuXG4gICAgaWYgKGZpeHR1cmVMb2FkZXJTdGFydCAhPT0gLTEgJiYgZml4dHVyZUxvYWRlckVuZCAhPT0gLTEpIHtcbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBgJHtjb250ZW50LnNsaWNlKDAsIGZpeHR1cmVMb2FkZXJFbmQpfSAgJHtjb2RlfVxcbiR7Y29udGVudC5zbGljZShmaXh0dXJlTG9hZGVyRW5kKX1gO1xuXG4gICAgICB3cml0ZUZpbGVTeW5jKHBhdGgsIG5ld0NvbnRlbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGYWlsZWQgdG8gZmluZCBmaXh0dXJlTG9hZGVyIGluIGZpeHR1cmUudHNcIik7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBGaXh0dXJlTWFuYWdlciA9IG5ldyBGaXh0dXJlTWFuYWdlckNsYXNzKCk7XG4iXSwibmFtZXMiOlsiYXNzZXJ0IiwiY2hhbGsiLCJleGVjU3luYyIsInJlYWRGaWxlU3luYyIsIndyaXRlRmlsZVN5bmMiLCJpbmZsZWN0aW9uIiwidW5pcXVlIiwiaW5zcGVjdCIsIlNvbmFtdSIsIkJhc2VNb2RlbCIsImNyZWF0ZUtuZXhJbnN0YW5jZSIsIlVwc2VydEJ1aWxkZXIiLCJFbnRpdHlNYW5hZ2VyIiwiaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AiLCJpc0hhc01hbnlSZWxhdGlvblByb3AiLCJpc01hbnlUb01hbnlSZWxhdGlvblByb3AiLCJpc09uZVRvT25lUmVsYXRpb25Qcm9wIiwiaXNSZWxhdGlvblByb3AiLCJpc1ZpcnR1YWxQcm9wIiwiaXNUZXN0IiwiUmVsYXRpb25HcmFwaCIsIkZpeHR1cmVNYW5hZ2VyQ2xhc3MiLCJfdGRiIiwidGRiIiwiRXJyb3IiLCJfZmRiIiwiZmRiIiwiY2FjaGVkVGFibGVOYW1lcyIsInJlbGF0aW9uR3JhcGgiLCJidWlsZGVyIiwiZml4dHVyZVJlZk1hcCIsIk1hcCIsInNraXBwZWRGaXh0dXJlcyIsImluaXQiLCJkYkNvbmZpZyIsInRlc3QiLCJwcm9kdWN0aW9uX21hc3RlciIsInRDb25uIiwiY29ubmVjdGlvbiIsInBDb25uIiwiaG9zdCIsInBvcnQiLCJkYXRhYmFzZSIsImZpeHR1cmUiLCJzeW5jIiwiZml4dHVyZUNvbm4iLCJ0ZXN0Q29ubiIsInRlc3RQZ0VudiIsIlBHUEFTU1dPUkQiLCJwYXNzd29yZCIsInVzZXIiLCJzdGRpbyIsImVudiIsInByb2Nlc3MiLCJmaXh0dXJlUGdFbnYiLCJkdW1wQ21kIiwicmVzdG9yZUNtZCIsInNoZWxsIiwicmVzZXRTZXF1ZW5jZXMiLCJ0ZXN0RGIiLCJlbnRpdGllcyIsImdldEFsbEVudGl0aWVzIiwiZW50aXR5IiwidGFibGVOYW1lIiwidGFibGUiLCJpZCIsInRvTG93ZXJDYXNlIiwiaWRQcm9wIiwicHJvcHMiLCJmaW5kIiwicCIsIm5hbWUiLCJpZFR5cGUiLCJ0eXBlIiwidXNlc1NlcXVlbmNlIiwiY29uZSIsImZpeHR1cmVTdHJhdGVneSIsImNvbnNvbGUiLCJsb2ciLCJtYXhFeHByIiwicmF3IiwiZGVzdHJveSIsInZpc2l0ZWRSZWNvcmRzIiwiU2V0IiwiaW1wb3J0Rml4dHVyZSIsImVudGl0eUlkIiwiaWRzIiwiY2xlYXIiLCJxdWVyaWVzIiwiUHJvbWlzZSIsImFsbCIsIm1hcCIsImdldEltcG9ydFF1ZXJpZXMiLCJmbGF0Iiwid2RiIiwiZ2V0REIiLCJxdWVyeSIsImZpZWxkIiwicmVjb3JkS2V5IiwiaGFzIiwiYWRkIiwiZ2V0Iiwicm93Iiwid2hlcmUiLCJsaW1pdCIsInVuZGVmaW5lZCIsImZpeHR1cmVEYXRhYmFzZSIsInJlYWxEYXRhYmFzZSIsInNlbGZRdWVyeSIsImFyZ3MiLCJPYmplY3QiLCJlbnRyaWVzIiwicmVsYXRpb25zIiwiZmlsdGVyIiwicmVsYXRpb24iLCJjdXN0b21Kb2luQ2xhdXNlIiwiaGFzSm9pbkNvbHVtbiIsInJlbGF0ZWRFbnRpdHkiLCJ3aXRoIiwicmVsYXRlZElkQ29sdW1uTmFtZSIsImFyZyIsInJlbFF1ZXJpZXMiLCJyZXZlcnNlIiwiZ2V0Rml4dHVyZXMiLCJzb3VyY2VEQk5hbWUiLCJ0YXJnZXREQk5hbWUiLCJzZWFyY2hPcHRpb25zIiwiZHVwbGljYXRlQ2hlY2siLCJzb3VyY2VEQiIsInRhcmdldERCIiwidmFsdWUiLCJzZWFyY2hUeXBlIiwiY29sdW1uIiwicHJvcCIsInJvd3MiLCJsZW5ndGgiLCJmaXh0dXJlcyIsImluaXRpYWxSZWNvcmRzTGVuZ3RoIiwibmV3UmVjb3JkcyIsImNyZWF0ZUZpeHR1cmVSZWNvcmQiLCJfZGIiLCJwdXNoIiwiY3VycmVudEZpeHR1cmVSZWNvcmQiLCJyIiwiZml4dHVyZUlkIiwiZmV0Y2hlZFJlY29yZHMiLCJzbGljZSIsImN1c3RvbUNvbHVtbnMiLCJjb2x1bW5zIiwiY3VzdG9tRHVwbGljYXRlUm93IiwiY2hlY2tEdXBsaWNhdGVCeUNvbHVtbnMiLCJyZWNvcmQiLCJzaW5nbGVSZWNvcmQiLCJ0YXJnZXQiLCJ1bmlxdWVSb3ciLCJjaGVja1VuaXF1ZVZpb2xhdGlvbiIsImYiLCJhbGxTZXR0bGVkIiwib3B0aW9ucyIsInJlY29yZHMiLCJ2aXNpdGVkRW50aXRpZXMiLCJjcmVhdGUiLCJiZWxvbmdzUmVjb3JkcyIsImRiIiwidGhyb3VnaFRhYmxlIiwiam9pblRhYmxlIiwiZnJvbUNvbHVtbiIsInNpbmd1bGFyaXplIiwidG9Db2x1bW4iLCJyZWxhdGVkSWRzIiwicGx1Y2siLCJqb2luQ29sdW1uIiwicmVsYXRlZFByb3AiLCJma0NvbHVtbiIsInJlbGF0ZWRSb3ciLCJmaXJzdCIsInJlbGF0ZWRJZCIsImluc2VydEZpeHR1cmVzIiwiZGJOYW1lIiwiX2ZpeHR1cmVzIiwicmVzdWx0cyIsImJ1aWxkR3JhcGgiLCJpbnNlcnRpb25PcmRlciIsImdldEluc2VydGlvbk9yZGVyIiwiaGFzVGFyZ2V0IiwiaGFzVW5pcXVlIiwiaGFzRHVwbGljYXRlIiwib3ZlcnJpZGUiLCJleGlzdGluZ0lkIiwic2V0IiwieWVsbG93IiwiZml4dHVyZXNCeVRhYmxlIiwidGFibGVPcmRlciIsInRyYW5zYWN0aW9uIiwidHJ4IiwiaW5zZXJ0ZWRJZHNCeVRhYmxlIiwidGFibGVGaXh0dXJlcyIsImxldmVscyIsImdyb3VwRml4dHVyZXNCeUxldmVsIiwibGV2ZWxGaXh0dXJlcyIsInJlZ2lzdGVyRml4dHVyZSIsImJsdWUiLCJnZXRUYWJsZSIsInV1aWRzIiwidXVpZCIsImluZGV4T2YiLCJ1cHNlcnQiLCJleGlzdGluZ01hcCIsImkiLCJ3YXJuIiwicHJvY2Vzc01hbnlUb01hbnlSZWxhdGlvbnMiLCJlIiwiZ3JheSIsImVudGl0eTIiLCJpZFR5cGUyIiwibWF4SWRSZXN1bHQiLCJ0aGVuIiwibWF4IiwibWF4SWQiLCJtYXhfaWQiLCJncmVlbiIsIl9lcnIiLCJza2lwcGVkIiwiZGF0YSIsInJlZiIsInV1aWRUb0lkIiwiaW5zZXJ0ZWRJZCIsImV4aXN0aW5nUmVjb3JkIiwiaXNPdmVycmlkZU1vZGUiLCJwcm9wTmFtZSIsImdlbmVyYXRlZCIsInJlbGF0ZWRGaXh0dXJlSWQiLCJza2lwcGVkRXhpc3RpbmdJZCIsInJlbGF0ZWRSZWYiLCJyZWxhdGVkSW5zZXJ0ZWRJZHMiLCJhY3R1YWxJZCIsImNvbnZlcnRDb2x1bW5WYWx1ZSIsInJlZ2lzdGVyIiwiRGF0ZSIsInNvdXJjZVJlZiIsInNvdXJjZVV1aWRUb0lkIiwic291cmNlSWQiLCJBcnJheSIsImlzQXJyYXkiLCJ0YXJnZXRUYWJsZSIsImhhc1RhYmxlIiwic291cmNlQ29sdW1uIiwidGFyZ2V0Q29sdW1uIiwidGFyZ2V0SWQiLCJyZWxhdGVkVXVpZFRvSWQiLCJyZXNvbHZlZElkIiwiZm91bmQiLCJpbnNlcnQiLCJzZWxmUmVmUHJvcHMiLCJyZW1haW5pbmciLCJwcm9jZXNzZWQiLCJzaXplIiwiY3VycmVudExldmVsIiwiY2FuUHJvY2VzcyIsImV2ZXJ5IiwicmVmSWQiLCJyZWZGaXh0dXJlSWQiLCJyZW1haW5pbmdJZHMiLCJmcm9tIiwiam9pbiIsImRlbGV0ZSIsIl91bmlxdWVJbmRleGVzIiwiaW5kZXhlcyIsInVuaXF1ZUluZGV4ZXMiLCJpbmRleCIsInN0YXJ0c1dpdGgiLCJ1bmlxdWVRdWVyeSIsImhhc0NvbmRpdGlvbiIsImNvbnRhaW5zTnVsbCIsInNvbWUiLCJyZXBsYWNlIiwib3JXaGVyZSIsInFiIiwid2hlcmVJbiIsImFuZFdoZXJlIiwidW5pcXVlRm91bmQiLCJ3aGVyZUNsYXVzZSIsImRiQ29sdW1uIiwiYWRkRml4dHVyZUxvYWRlciIsImNvZGUiLCJwYXRoIiwiYXBpUm9vdFBhdGgiLCJjb250ZW50IiwidG9TdHJpbmciLCJmaXh0dXJlTG9hZGVyU3RhcnQiLCJmaXh0dXJlTG9hZGVyRW5kIiwibmV3Q29udGVudCIsIkZpeHR1cmVNYW5hZ2VyIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxZQUFZLFNBQVM7QUFDNUIsT0FBT0MsV0FBVyxRQUFRO0FBQzFCLFNBQVNDLFFBQVEsUUFBUSxnQkFBZ0I7QUFDekMsU0FBU0MsWUFBWSxFQUFFQyxhQUFhLFFBQVEsS0FBSztBQUNqRCxPQUFPQyxnQkFBZ0IsYUFBYTtBQUVwQyxTQUFTQyxNQUFNLFFBQVEsVUFBVTtBQUNqQyxTQUFTQyxPQUFPLFFBQVEsT0FBTztBQUMvQixTQUFTQyxNQUFNLFFBQVEsa0JBQVM7QUFDaEMsU0FBU0MsU0FBUyxRQUFRLDRCQUF5QjtBQUVuRCxTQUFTQyxrQkFBa0IsUUFBUSxzQkFBbUI7QUFDdEQsU0FBcUJDLGFBQWEsUUFBUSxnQ0FBNkI7QUFFdkUsU0FBU0MsYUFBYSxRQUFRLDhCQUEyQjtBQUN6RCxTQU9FQywwQkFBMEIsRUFDMUJDLHFCQUFxQixFQUNyQkMsd0JBQXdCLEVBQ3hCQyxzQkFBc0IsRUFDdEJDLGNBQWMsRUFDZEMsYUFBYSxRQUdSLG9CQUFpQjtBQUN4QixTQUFTQyxNQUFNLFFBQVEseUJBQXNCO0FBQzdDLFNBQVNDLGFBQWEsUUFBUSx1QkFBb0I7QUFTbEQsT0FBTyxNQUFNQztJQUNIQyxPQUFvQixLQUFLO0lBQ2pDLElBQUlDLElBQUlBLEdBQVMsRUFBRTtRQUNqQixJQUFJLENBQUNELElBQUksR0FBR0M7SUFDZDtJQUNBLElBQUlBLE1BQVk7UUFDZCxJQUFJLElBQUksQ0FBQ0QsSUFBSSxLQUFLLE1BQU07WUFDdEIsTUFBTSxJQUFJRSxNQUFNO1FBQ2xCO1FBQ0EsT0FBTyxJQUFJLENBQUNGLElBQUk7SUFDbEI7SUFFUUcsT0FBb0IsS0FBSztJQUNqQyxJQUFJQyxJQUFJQSxHQUFTLEVBQUU7UUFDakIsSUFBSSxDQUFDRCxJQUFJLEdBQUdDO0lBQ2Q7SUFDQSxJQUFJQSxNQUFZO1FBQ2QsSUFBSSxJQUFJLENBQUNELElBQUksS0FBSyxNQUFNO1lBQ3RCLE1BQU0sSUFBSUQsTUFBTTtRQUNsQjtRQUNBLE9BQU8sSUFBSSxDQUFDQyxJQUFJO0lBQ2xCO0lBQ0FFLG1CQUFvQyxLQUFLO0lBRWpDQyxnQkFBZ0IsSUFBSVIsZ0JBQWdCO0lBRTVDLGlDQUFpQztJQUN6QlMsVUFBeUIsSUFBSWxCLGdCQUFnQjtJQUM3Q21CLGdCQUFvQyxJQUFJQyxNQUFNO0lBQzlDQyxrQkFDTixJQUFJRCxNQUFNO0lBRVpFLE9BQU87UUFDTCxJQUFJLElBQUksQ0FBQ1gsSUFBSSxLQUFLLE1BQU07WUFDdEI7UUFDRjtRQUNBLElBQUlkLE9BQU8wQixRQUFRLENBQUNDLElBQUksSUFBSTNCLE9BQU8wQixRQUFRLENBQUNFLGlCQUFpQixFQUFFO1lBQzdELE1BQU1DLFFBQVE3QixPQUFPMEIsUUFBUSxDQUFDQyxJQUFJLENBQUNHLFVBQVU7WUFHN0MsTUFBTUMsUUFBUS9CLE9BQU8wQixRQUFRLENBQUNFLGlCQUFpQixDQUFDRSxVQUFVO1lBRzFELElBQ0UsR0FBR0QsTUFBTUcsSUFBSSxJQUFJLFlBQVksQ0FBQyxFQUFFSCxNQUFNSSxJQUFJLElBQUksS0FBSyxDQUFDLEVBQUVKLE1BQU1LLFFBQVEsRUFBRSxLQUN0RSxHQUFHSCxNQUFNQyxJQUFJLElBQUksWUFBWSxDQUFDLEVBQUVELE1BQU1FLElBQUksSUFBSSxLQUFLLENBQUMsRUFBRUYsTUFBTUcsUUFBUSxFQUFFLEVBQ3RFO2dCQUNBLE1BQU0sSUFBSWxCLE1BQU0sQ0FBQyxtQ0FBbUMsQ0FBQztZQUN2RDtRQUNGO1FBRUEsSUFBSSxDQUFDRCxHQUFHLEdBQUdiLG1CQUFtQkYsT0FBTzBCLFFBQVEsQ0FBQ0MsSUFBSTtRQUNsRCxJQUFJLENBQUNULEdBQUcsR0FBR2hCLG1CQUFtQkYsT0FBTzBCLFFBQVEsQ0FBQ1MsT0FBTztJQUN2RDtJQUVBOzs7RUFHQSxHQUNBLE1BQU1DLE9BQU87UUFDWCxNQUFNQyxjQUFjckMsT0FBTzBCLFFBQVEsQ0FBQ1MsT0FBTyxDQUFDTCxVQUFVO1FBQ3RELE1BQU1RLFdBQVd0QyxPQUFPMEIsUUFBUSxDQUFDQyxJQUFJLENBQUNHLFVBQVU7UUFFaEQsNEJBQTRCO1FBQzVCLE1BQU1TLFlBQVk7WUFBRUMsWUFBWUYsU0FBU0csUUFBUSxJQUFJO1FBQUc7UUFDeEQvQyxTQUNFLENBQUMsUUFBUSxFQUFFNEMsU0FBU04sSUFBSSxDQUFDLElBQUksRUFBRU0sU0FBU0wsSUFBSSxJQUFJLEtBQUssSUFBSSxFQUFFSyxTQUFTSSxJQUFJLENBQUM7Ozt5QkFHdEQsRUFBRUosU0FBU0osUUFBUSxDQUFDOztPQUV0QyxDQUFDLEVBQ0Y7WUFBRVMsT0FBTztZQUFXQyxLQUFLO2dCQUFFLEdBQUdDLFFBQVFELEdBQUc7Z0JBQUUsR0FBR0wsU0FBUztZQUFDO1FBQXVCO1FBR2pGN0MsU0FDRSxDQUFDLFFBQVEsRUFBRTRDLFNBQVNOLElBQUksQ0FBQyxJQUFJLEVBQUVNLFNBQVNMLElBQUksSUFBSSxLQUFLLElBQUksRUFBRUssU0FBU0ksSUFBSSxDQUFDLDRDQUE0QyxFQUFFSixTQUFTSixRQUFRLENBQUMsSUFBSSxDQUFDLEVBQzlJO1lBQUVTLE9BQU87WUFBV0MsS0FBSztnQkFBRSxHQUFHQyxRQUFRRCxHQUFHO2dCQUFFLEdBQUdMLFNBQVM7WUFBQztRQUF1QjtRQUdqRjdDLFNBQ0UsQ0FBQyxRQUFRLEVBQUU0QyxTQUFTTixJQUFJLENBQUMsSUFBSSxFQUFFTSxTQUFTTCxJQUFJLElBQUksS0FBSyxJQUFJLEVBQUVLLFNBQVNJLElBQUksQ0FBQyxvQ0FBb0MsRUFBRUosU0FBU0osUUFBUSxDQUFDLElBQUksQ0FBQyxFQUN0STtZQUFFUyxPQUFPO1lBQVdDLEtBQUs7Z0JBQUUsR0FBR0MsUUFBUUQsR0FBRztnQkFBRSxHQUFHTCxTQUFTO1lBQUM7UUFBdUI7UUFHakYsMkRBQTJEO1FBQzNELE1BQU1PLGVBQWU7WUFBRU4sWUFBWUgsWUFBWUksUUFBUSxJQUFJO1FBQUc7UUFDOUQsTUFBTU0sVUFBVSxDQUFDLFdBQVcsRUFBRVYsWUFBWUwsSUFBSSxDQUFDLElBQUksRUFBRUssWUFBWUosSUFBSSxJQUFJLEtBQUssSUFBSSxFQUFFSSxZQUFZSyxJQUFJLENBQUMsSUFBSSxFQUFFTCxZQUFZSCxRQUFRLENBQUMsSUFBSSxDQUFDO1FBQ3JJLE1BQU1jLGFBQWEsQ0FBQyxjQUFjLEVBQUVWLFNBQVNOLElBQUksQ0FBQyxJQUFJLEVBQUVNLFNBQVNMLElBQUksSUFBSSxLQUFLLElBQUksRUFBRUssU0FBU0ksSUFBSSxDQUFDLElBQUksRUFBRUosU0FBU0osUUFBUSxDQUFDLG9CQUFvQixDQUFDO1FBRS9JeEMsU0FBUyxHQUFHcUQsUUFBUSxlQUFlLEVBQUVULFNBQVNHLFFBQVEsSUFBSSxHQUFHLEVBQUUsRUFBRU8sWUFBWSxFQUFFO1lBQzdFTCxPQUFPO1lBQ1BDLEtBQUs7Z0JBQUUsR0FBR0MsUUFBUUQsR0FBRztnQkFBRSxHQUFHRSxZQUFZO1lBQUM7WUFDdkNHLE9BQU87UUFDVDtRQUVBLHdDQUF3QztRQUN4QyxNQUFNLElBQUksQ0FBQ0MsY0FBYyxDQUFDbEQsT0FBTzBCLFFBQVEsQ0FBQ0MsSUFBSTtJQUNoRDtJQUVBOzs7R0FHQyxHQUNELE1BQWN1QixlQUFleEIsUUFBZ0MsRUFBRTtRQUM3RCxNQUFNeUIsU0FBU2pELG1CQUFtQndCO1FBQ2xDLE1BQU0wQixXQUFXaEQsY0FBY2lELGNBQWM7UUFFN0MsSUFBSTtZQUNGLEtBQUssTUFBTUMsVUFBVUYsU0FBVTtnQkFDN0IsTUFBTUcsWUFBWUQsT0FBT0UsS0FBSyxJQUFJRixPQUFPRyxFQUFFLENBQUNDLFdBQVc7Z0JBRXZELG1CQUFtQjtnQkFDbkIsTUFBTUMsU0FBU0wsT0FBT00sS0FBSyxDQUFDQyxJQUFJLENBQUMsQ0FBQ0MsSUFBTUEsRUFBRUMsSUFBSSxLQUFLO2dCQUNuRCxNQUFNQyxTQUFTTCxRQUFRTTtnQkFFdkIsd0VBQXdFO2dCQUN4RSxNQUFNQyxlQUNKRixXQUFXLGFBQ1hBLFdBQVcsZ0JBQ1hMLFFBQVFRLE1BQU1DLG9CQUFvQjtnQkFFcEMsSUFBSSxDQUFDRixjQUFjO29CQUNqQixDQUFDdkQsWUFDQzBELFFBQVFDLEdBQUcsQ0FDVCxDQUFDLDRCQUE0QixFQUFFZixVQUFVLFdBQVcsRUFBRVMsVUFBVSxVQUFVLENBQUMsQ0FBQztvQkFFaEY7Z0JBQ0Y7Z0JBRUEsMENBQTBDO2dCQUMxQywrQkFBK0I7Z0JBQy9CLE1BQU1PLFVBQVVQLFdBQVcsV0FBVyxvQkFBb0I7Z0JBQzFELE1BQU1iLE9BQU9xQixHQUFHLENBQUMsQ0FBQzs7MkNBRWlCLEVBQUVqQixVQUFVOzZCQUMxQixFQUFFZ0IsUUFBUSxNQUFNLEVBQUVoQixVQUFVOztRQUVqRCxDQUFDO1lBQ0g7UUFDRixTQUFVO1lBQ1IsTUFBTUosT0FBT3NCLE9BQU87UUFDdEI7SUFDRjtJQUVRQyxpQkFBaUIsSUFBSUMsTUFBYztJQUMzQyxNQUFNQyxjQUFjQyxRQUFnQixFQUFFQyxHQUFhLEVBQUU7UUFDbkQsK0JBQStCO1FBQy9CLElBQUksQ0FBQ0osY0FBYyxDQUFDSyxLQUFLO1FBRXpCLE1BQU1DLFVBQVVsRixPQUNkLEFBQ0UsQ0FBQSxNQUFNbUYsUUFBUUMsR0FBRyxDQUNmSixJQUFJSyxHQUFHLENBQUMsT0FBTzFCO1lBQ2IsT0FBTyxNQUFNLElBQUksQ0FBQzJCLGdCQUFnQixDQUFDUCxVQUFVLE1BQU1wQjtRQUNyRCxHQUNGLEVBQ0E0QixJQUFJO1FBR1IsTUFBTUMsTUFBTXJGLFVBQVVzRixLQUFLLENBQUM7UUFDNUIsS0FBSyxNQUFNQyxTQUFTUixRQUFTO1lBQzNCLE1BQU1NLElBQUlkLEdBQUcsQ0FBQ2dCO1FBQ2hCO0lBQ0Y7SUFFQSxNQUFNSixpQkFBaUJQLFFBQWdCLEVBQUVZLEtBQWEsRUFBRWhDLEVBQVUsRUFBcUI7UUFDckYsTUFBTWlDLFlBQVksR0FBR2IsU0FBUyxDQUFDLEVBQUVZLE1BQU0sQ0FBQyxFQUFFaEMsSUFBSTtRQUU5QywyQkFBMkI7UUFDM0IsSUFBSSxJQUFJLENBQUNpQixjQUFjLENBQUNpQixHQUFHLENBQUNELFlBQVk7WUFDdEMsT0FBTyxFQUFFO1FBQ1g7UUFDQSxJQUFJLENBQUNoQixjQUFjLENBQUNrQixHQUFHLENBQUNGO1FBRXhCLE1BQU1wQyxTQUFTbEQsY0FBY3lGLEdBQUcsQ0FBQ2hCO1FBQ2pDLE1BQU1TLE1BQU1yRixVQUFVc0YsS0FBSyxDQUFDO1FBRTVCLG1CQUFtQjtRQUNuQixNQUFNLENBQUNPLElBQUksR0FBRyxNQUFNUixJQUFJaEMsT0FBT0UsS0FBSyxFQUFFdUMsS0FBSyxDQUFDTixPQUFPaEMsSUFBSXVDLEtBQUssQ0FBQztRQUM3RCxJQUFJRixRQUFRRyxXQUFXO1lBQ3JCLE1BQU0sSUFBSWpGLE1BQU0sR0FBRzZELFNBQVMsQ0FBQyxFQUFFcEIsR0FBRyxnQkFBZ0IsQ0FBQztRQUNyRDtRQUVBLGFBQWE7UUFDYixNQUFNeUMsa0JBQWtCLEFBQUNsRyxPQUFPMEIsUUFBUSxDQUFDUyxPQUFPLENBQUNMLFVBQVUsQ0FBMkJJLFFBQVE7UUFDOUYsTUFBTWlFLGVBQWUsQUFBQ25HLE9BQU8wQixRQUFRLENBQUNFLGlCQUFpQixDQUFDRSxVQUFVLENBQy9ESSxRQUFRO1FBRVgsTUFBTWtFLFlBQVksQ0FBQyxxQkFBcUIsRUFBRUYsZ0JBQWdCLEtBQUssRUFBRTVDLE9BQU9FLEtBQUssQ0FBQyxvQkFBb0IsRUFBRTJDLGFBQWEsS0FBSyxFQUFFN0MsT0FBT0UsS0FBSyxDQUFDLGtCQUFrQixFQUFFQyxHQUFHLENBQUMsQ0FBQztRQUU5SixNQUFNNEMsT0FBT0MsT0FBT0MsT0FBTyxDQUFDakQsT0FBT2tELFNBQVMsRUFDekNDLE1BQU0sQ0FDTCxDQUFDLEdBQUdDLFNBQVMsR0FDWHJHLDJCQUEyQnFHLGFBQzFCbEcsdUJBQXVCa0csYUFBYUEsU0FBU0MsZ0JBQWdCLEtBQUtWLFdBRXRFZCxHQUFHLENBQUMsQ0FBQyxHQUFHdUIsU0FBUztZQUNoQjs7Ozs7OztRQU9BLEdBQ0EsSUFBSWpCO1lBQ0osSUFBSWhDO1lBQ0osSUFBSWpELHVCQUF1QmtHLGFBQWEsQ0FBQ0EsU0FBU0UsYUFBYSxFQUFFO2dCQUMvRCxNQUFNQyxnQkFBZ0J6RyxjQUFjeUYsR0FBRyxDQUFDYSxTQUFTSSxJQUFJO2dCQUNyRCxNQUFNQyxzQkFBc0JGLGNBQWNqRCxLQUFLLENBQUNDLElBQUksQ0FDbEQsQ0FBQ0MsSUFBTXJELGVBQWVxRCxNQUFNQSxFQUFFZ0QsSUFBSSxLQUFLeEQsT0FBT0csRUFBRSxHQUMvQ007Z0JBQ0gsSUFBSSxDQUFDZ0QscUJBQXFCO29CQUN4QixNQUFNLElBQUkvRixNQUFNLEdBQUc2RixjQUFjcEQsRUFBRSxDQUFDLEVBQUUsRUFBRUgsT0FBT0csRUFBRSxDQUFDLGtCQUFrQixDQUFDO2dCQUN2RTtnQkFDQWdDLFFBQVEsR0FBR3NCLG9CQUFvQixHQUFHLENBQUM7Z0JBQ25DdEQsS0FBS3FDLElBQUlyQyxFQUFFO1lBQ2IsT0FBTztnQkFDTGdDLFFBQVE7Z0JBQ1JoQyxLQUFLcUMsR0FBRyxDQUFDLEdBQUdZLFNBQVMzQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDakM7WUFDQSxPQUFPO2dCQUNMYyxVQUFVNkIsU0FBU0ksSUFBSTtnQkFDdkJyQjtnQkFDQWhDO1lBQ0Y7UUFDRixHQUNDZ0QsTUFBTSxDQUFDLENBQUNPLE1BQVFBLElBQUl2RCxFQUFFLEtBQUs7UUFFOUIsTUFBTXdELGFBQWEsTUFBTWhDLFFBQVFDLEdBQUcsQ0FDbENtQixLQUFLbEIsR0FBRyxDQUFDLE9BQU9rQjtZQUNkLE9BQU8sSUFBSSxDQUFDakIsZ0JBQWdCLENBQUNpQixLQUFLeEIsUUFBUSxFQUFFd0IsS0FBS1osS0FBSyxFQUFFWSxLQUFLNUMsRUFBRTtRQUNqRTtRQUdGLE9BQU87ZUFBSTNELE9BQU9tSCxXQUFXQyxPQUFPLEdBQUc3QixJQUFJO1lBQUtlO1NBQVU7SUFDNUQ7SUFFQSxNQUFNM0IsVUFBVTtRQUNkLElBQUksSUFBSSxDQUFDM0QsSUFBSSxFQUFFO1lBQ2IsTUFBTSxJQUFJLENBQUNBLElBQUksQ0FBQzJELE9BQU87WUFDdkIsSUFBSSxDQUFDM0QsSUFBSSxHQUFHO1FBQ2Q7UUFDQSxJQUFJLElBQUksQ0FBQ0csSUFBSSxFQUFFO1lBQ2IsTUFBTSxJQUFJLENBQUNBLElBQUksQ0FBQ3dELE9BQU87WUFDdkIsSUFBSSxDQUFDeEQsSUFBSSxHQUFHO1FBQ2Q7UUFDQSxNQUFNaEIsVUFBVXdFLE9BQU87SUFDekI7SUFFQSxNQUFNMEMsWUFDSkMsWUFBa0MsRUFDbENDLFlBQWtDLEVBQ2xDQyxhQUFtQyxFQUNuQ0MsY0FBc0MsRUFDdEM7UUFDQSxNQUFNQyxXQUFXdEgsbUJBQW1CRixPQUFPMEIsUUFBUSxDQUFDMEYsYUFBYTtRQUNqRSxNQUFNSyxXQUFXdkgsbUJBQW1CRixPQUFPMEIsUUFBUSxDQUFDMkYsYUFBYTtRQUVqRSxJQUFJO1lBQ0YsTUFBTSxFQUFFeEMsUUFBUSxFQUFFWSxLQUFLLEVBQUVpQyxLQUFLLEVBQUVDLFVBQVUsRUFBRSxHQUFHTDtZQUUvQyxNQUFNaEUsU0FBU2xELGNBQWN5RixHQUFHLENBQUNoQjtZQUNqQyxNQUFNK0MsU0FDSnRFLE9BQU9NLEtBQUssQ0FBQ0MsSUFBSSxDQUFDLENBQUNnRSxPQUFTQSxLQUFLOUQsSUFBSSxLQUFLMEIsUUFBUXhCLFNBQVMsYUFDdkQsR0FBR3dCLE1BQU0sR0FBRyxDQUFDLEdBQ2JBO1lBRU4sSUFBSUQsUUFBUWdDLFNBQVNsRSxPQUFPRSxLQUFLO1lBQ2pDLElBQUltRSxlQUFlLFVBQVU7Z0JBQzNCbkMsUUFBUUEsTUFBTU8sS0FBSyxDQUFDNkIsUUFBUUY7WUFDOUIsT0FBTyxJQUFJQyxlQUFlLFFBQVE7Z0JBQ2hDbkMsUUFBUUEsTUFBTU8sS0FBSyxDQUFDNkIsUUFBUSxRQUFRLENBQUMsQ0FBQyxFQUFFRixNQUFNLENBQUMsQ0FBQztZQUNsRDtZQUVBLE1BQU1JLE9BQU8sTUFBTXRDO1lBQ25CLElBQUlzQyxLQUFLQyxNQUFNLEtBQUssR0FBRztnQkFDckIsTUFBTSxJQUFJL0csTUFBTTtZQUNsQjtZQUVBLE1BQU1nSCxXQUE0QixFQUFFO1lBQ3BDLEtBQUssTUFBTWxDLE9BQU9nQyxLQUFNO2dCQUN0QixNQUFNRyx1QkFBdUJELFNBQVNELE1BQU07Z0JBQzVDLE1BQU1HLGFBQWEsTUFBTSxJQUFJLENBQUNDLG1CQUFtQixDQUFDN0UsUUFBUXdDLEtBQUs7b0JBQzdEc0MsS0FBS1o7Z0JBQ1A7Z0JBQ0FRLFNBQVNLLElBQUksSUFBSUg7Z0JBQ2pCLE1BQU1JLHVCQUF1Qk4sU0FBU25FLElBQUksQ0FBQyxDQUFDMEUsSUFBTUEsRUFBRUMsU0FBUyxLQUFLLEdBQUczRCxTQUFTLENBQUMsRUFBRWlCLElBQUlyQyxFQUFFLEVBQUU7Z0JBRXpGLElBQUk2RSxzQkFBc0I7b0JBQ3hCLHNDQUFzQztvQkFDdENBLHFCQUFxQkcsY0FBYyxHQUFHVCxTQUNuQ3ZCLE1BQU0sQ0FBQyxDQUFDOEIsSUFBTUEsRUFBRUMsU0FBUyxLQUFLRixxQkFBcUJFLFNBQVMsRUFDNURFLEtBQUssQ0FBQ1Qsc0JBQ045QyxHQUFHLENBQUMsQ0FBQ29ELElBQU1BLEVBQUVDLFNBQVM7Z0JBQzNCO1lBQ0Y7WUFFQSxXQUFXLE1BQU1yRyxXQUFXNkYsU0FBVTtnQkFDcEMsTUFBTTFFLFNBQVNsRCxjQUFjeUYsR0FBRyxDQUFDMUQsUUFBUTBDLFFBQVE7Z0JBRWpELDhCQUE4QjtnQkFDOUIsTUFBTThELGdCQUFnQnBCLGdCQUFnQnFCLFNBQVMsQ0FBQ3pHLFFBQVEwQyxRQUFRLENBQUM7Z0JBQ2pFLElBQUk4RCxpQkFBaUJBLGNBQWNaLE1BQU0sR0FBRyxHQUFHO29CQUM3QyxNQUFNYyxxQkFBcUIsTUFBTSxJQUFJLENBQUNDLHVCQUF1QixDQUMzRHJCLFVBQ0FuRSxRQUNBbkIsU0FDQXdHO29CQUVGLElBQUlFLG9CQUFvQjt3QkFDdEIsTUFBTSxDQUFDRSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUNaLG1CQUFtQixDQUFDN0UsUUFBUXVGLG9CQUFvQjs0QkFDMUVHLGNBQWM7NEJBQ2RaLEtBQUtYO3dCQUNQO3dCQUNBdEYsUUFBUThHLE1BQU0sR0FBR0Y7b0JBQ25CO2dCQUNGO2dCQUVBLHlDQUF5QztnQkFDekMsTUFBTUcsWUFBWSxNQUFNLElBQUksQ0FBQ0Msb0JBQW9CLENBQUMxQixVQUFVbkUsUUFBUW5CO2dCQUNwRSxJQUFJK0csV0FBVztvQkFDYixNQUFNLENBQUNILE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQ1osbUJBQW1CLENBQUM3RSxRQUFRNEYsV0FBVzt3QkFDakVGLGNBQWM7d0JBQ2RaLEtBQUtYO29CQUNQO29CQUNBdEYsUUFBUXJDLE1BQU0sR0FBR2lKO2dCQUNuQjtZQUNGO1lBRUEsT0FBT2pKLE9BQU9rSSxVQUFVLENBQUNvQixJQUFNQSxFQUFFWixTQUFTO1FBQzVDLFNBQVU7WUFDUixNQUFNdkQsUUFBUW9FLFVBQVUsQ0FBQztnQkFBQzVCLFNBQVNoRCxPQUFPO2dCQUFJK0MsU0FBUy9DLE9BQU87YUFBRztRQUNuRTtJQUNGO0lBRUEsTUFBTTBELG9CQUNKN0UsTUFBYyxFQUNkd0MsR0FHQyxFQUNEd0QsT0FHQyxFQUN5QjtRQUMxQixNQUFNQyxVQUEyQixFQUFFO1FBQ25DLE1BQU1DLGtCQUFrQixJQUFJN0U7UUFFNUIsTUFBTThFLFNBQVMsT0FDYm5HLFFBQ0F3QztZQUtBLE1BQU0wQyxZQUFZLEdBQUdsRixPQUFPRyxFQUFFLENBQUMsQ0FBQyxFQUFFcUMsSUFBSXJDLEVBQUUsRUFBRTtZQUMxQyxJQUFJK0YsZ0JBQWdCN0QsR0FBRyxDQUFDNkMsWUFBWTtnQkFDbEM7WUFDRjtZQUNBZ0IsZ0JBQWdCNUQsR0FBRyxDQUFDNEM7WUFFcEIsTUFBTU8sU0FBd0I7Z0JBQzVCUDtnQkFDQTNELFVBQVV2QixPQUFPRyxFQUFFO2dCQUNuQkEsSUFBSXFDLElBQUlyQyxFQUFFO2dCQUNWbUYsU0FBUyxDQUFDO2dCQUNWSCxnQkFBZ0IsRUFBRTtnQkFDbEJpQixnQkFBZ0IsRUFBRTtZQUNwQjtZQUVBLEtBQUssTUFBTTdCLFFBQVF2RSxPQUFPTSxLQUFLLENBQUU7Z0JBQy9CLElBQUlsRCxjQUFjbUgsT0FBTztvQkFDdkI7Z0JBQ0Y7Z0JBRUFrQixPQUFPSCxPQUFPLENBQUNmLEtBQUs5RCxJQUFJLENBQUMsR0FBRztvQkFDMUI4RCxNQUFNQTtvQkFDTkgsT0FBTzVCLEdBQUcsQ0FBQytCLEtBQUs5RCxJQUFJLENBQUM7Z0JBQ3ZCO2dCQUVBLE1BQU00RixLQUFLTCxTQUFTbEIsT0FBT25JLFVBQVVzRixLQUFLLENBQUM7Z0JBQzNDLElBQUloRix5QkFBeUJzSCxPQUFPO29CQUNsQyxNQUFNaEIsZ0JBQWdCekcsY0FBY3lGLEdBQUcsQ0FBQ2dDLEtBQUtmLElBQUk7b0JBQ2pELE1BQU04QyxlQUFlL0IsS0FBS2dDLFNBQVM7b0JBQ25DLE1BQU1DLGFBQWEsR0FBR2pLLFdBQVdrSyxXQUFXLENBQUN6RyxPQUFPRSxLQUFLLEVBQUUsR0FBRyxDQUFDO29CQUMvRCxNQUFNd0csV0FBVyxHQUFHbkssV0FBV2tLLFdBQVcsQ0FBQ2xELGNBQWNyRCxLQUFLLEVBQUUsR0FBRyxDQUFDO29CQUVwRSxNQUFNeUcsYUFBYSxNQUFNTixHQUFHQyxjQUFjN0QsS0FBSyxDQUFDK0QsWUFBWWhFLElBQUlyQyxFQUFFLEVBQUV5RyxLQUFLLENBQUNGO29CQUMxRWpCLE9BQU9ILE9BQU8sQ0FBQ2YsS0FBSzlELElBQUksQ0FBQyxDQUFDMkQsS0FBSyxHQUFHdUM7Z0JBQ3BDLE9BQU8sSUFBSTNKLHNCQUFzQnVILE9BQU87b0JBQ3RDLE1BQU1oQixnQkFBZ0J6RyxjQUFjeUYsR0FBRyxDQUFDZ0MsS0FBS2YsSUFBSTtvQkFDakQsTUFBTW1ELGFBQWEsTUFBTU4sR0FBRzlDLGNBQWNyRCxLQUFLLEVBQzVDdUMsS0FBSyxDQUFDOEIsS0FBS3NDLFVBQVUsRUFBRXJFLElBQUlyQyxFQUFFLEVBQzdCeUcsS0FBSyxDQUFDO29CQUNUbkIsT0FBT0gsT0FBTyxDQUFDZixLQUFLOUQsSUFBSSxDQUFDLENBQUMyRCxLQUFLLEdBQUd1QztnQkFDcEMsT0FBTyxJQUFJekosdUJBQXVCcUgsU0FBUyxDQUFDQSxLQUFLakIsYUFBYSxFQUFFO29CQUM5RCxvQ0FBb0M7b0JBQ3BDLHdEQUF3RDtvQkFDeEQsTUFBTUMsZ0JBQWdCekcsY0FBY3lGLEdBQUcsQ0FBQ2dDLEtBQUtmLElBQUk7b0JBQ2pELE1BQU1zRCxjQUFjdkQsY0FBY2pELEtBQUssQ0FBQ0MsSUFBSSxDQUMxQyxDQUFDQyxJQUFNckQsZUFBZXFELE1BQU1BLEVBQUVnRCxJQUFJLEtBQUt4RCxPQUFPRyxFQUFFO29CQUVsRCxJQUFJMkcsZUFBZTNKLGVBQWUySixjQUFjO3dCQUM5QyxrQ0FBa0M7d0JBQ2xDLE1BQU1DLFdBQVcsR0FBR0QsWUFBWXJHLElBQUksQ0FBQyxHQUFHLENBQUM7d0JBQ3pDLE1BQU11RyxhQUFhLE1BQU1YLEdBQUc5QyxjQUFjckQsS0FBSyxFQUFFdUMsS0FBSyxDQUFDc0UsVUFBVXZFLElBQUlyQyxFQUFFLEVBQUU4RyxLQUFLO3dCQUM5RXhCLE9BQU9ILE9BQU8sQ0FBQ2YsS0FBSzlELElBQUksQ0FBQyxDQUFDMkQsS0FBSyxHQUFHNEMsWUFBWTdHO29CQUNoRDtnQkFDRixPQUFPLElBQUloRCxlQUFlb0gsT0FBTztvQkFDL0IsTUFBTTJDLFlBQVkxRSxHQUFHLENBQUMsR0FBRytCLEtBQUs5RCxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ3hDZ0YsT0FBT0gsT0FBTyxDQUFDZixLQUFLOUQsSUFBSSxDQUFDLENBQUMyRCxLQUFLLEdBQUc4QztvQkFDbEMsSUFBSUEsV0FBVzt3QkFDYnpCLE9BQU9XLGNBQWMsQ0FBQ3JCLElBQUksQ0FBQyxHQUFHUixLQUFLZixJQUFJLENBQUMsQ0FBQyxFQUFFMEQsV0FBVztvQkFDeEQ7b0JBQ0EsSUFBSSxDQUFDbEIsU0FBU04sZ0JBQWdCd0IsV0FBVzt3QkFDdkMsTUFBTTNELGdCQUFnQnpHLGNBQWN5RixHQUFHLENBQUNnQyxLQUFLZixJQUFJO3dCQUNqRCxNQUFNd0QsYUFBYSxNQUFNWCxHQUFHOUMsY0FBY3JELEtBQUssRUFBRXVDLEtBQUssQ0FBQyxNQUFNeUUsV0FBV0QsS0FBSzt3QkFDN0UsSUFBSUQsWUFBWTs0QkFDZCxNQUFNYixPQUFPNUMsZUFBZXlEO3dCQUM5QjtvQkFDRjtnQkFDRjtZQUNGO1lBRUFmLFFBQVFsQixJQUFJLENBQUNVO1FBQ2Y7UUFFQSxNQUFNVSxPQUFPbkcsUUFBUXdDO1FBRXJCLE9BQU95RDtJQUNUO0lBRUE7Ozs7Ozs7OztHQVNDLEdBQ0QsTUFBTWtCLGVBQ0pDLE1BQTRCLEVBQzVCQyxTQUEwQixFQUNNO1FBQ2hDLE1BQU0zQyxXQUFXbEksT0FBTzZLLFdBQVcsQ0FBQ3ZCLElBQU1BLEVBQUVaLFNBQVM7UUFFckQsTUFBTTtRQUNOLElBQUksQ0FBQ25ILE9BQU8sR0FBRyxJQUFJbEI7UUFDbkIsSUFBSSxDQUFDbUIsYUFBYSxHQUFHLElBQUlDO1FBQ3pCLElBQUksQ0FBQ0MsZUFBZSxHQUFHLElBQUlEO1FBRTNCLE1BQU1vSSxLQUFLekosbUJBQW1CRixPQUFPMEIsUUFBUSxDQUFDZ0osT0FBTztRQUNyRCxNQUFNRSxVQUFpQyxFQUFFO1FBRXpDLElBQUk7WUFDRix3Q0FBd0M7WUFDeEMsSUFBSSxDQUFDeEosYUFBYSxDQUFDeUosVUFBVSxDQUFDN0M7WUFDOUIsTUFBTThDLGlCQUFpQixJQUFJLENBQUMxSixhQUFhLENBQUMySixpQkFBaUI7WUFFM0QscUNBQXFDO1lBQ3JDLEtBQUssTUFBTXZDLGFBQWFzQyxlQUFnQjtnQkFDdEMsTUFBTTNJLFVBQVU2RixTQUFTbkUsSUFBSSxDQUFDLENBQUN1RixJQUFNQSxFQUFFWixTQUFTLEtBQUtBO2dCQUNyRCxJQUFJLENBQUNyRyxTQUFTO2dCQUVkLE1BQU02SSxZQUFZLENBQUMsQ0FBQzdJLFFBQVE4RyxNQUFNO2dCQUNsQyxNQUFNZ0MsWUFBWSxDQUFDLENBQUM5SSxRQUFRckMsTUFBTTtnQkFDbEMsTUFBTW9MLGVBQWVGLGFBQWFDO2dCQUVsQyxnQ0FBZ0M7Z0JBQ2hDLElBQUlDLGdCQUFnQixDQUFDL0ksUUFBUWdKLFFBQVEsRUFBRTtvQkFDckMsdUNBQXVDO29CQUN2QyxNQUFNQyxhQUFhakosUUFBUXJDLE1BQU0sRUFBRTJELE1BQU10QixRQUFROEcsTUFBTSxFQUFFeEY7b0JBQ3pEakUsT0FBTzRMO29CQUNQLElBQUksQ0FBQzVKLGVBQWUsQ0FBQzZKLEdBQUcsQ0FBQzdDLFdBQVc7d0JBQ2xDM0QsVUFBVTFDLFFBQVEwQyxRQUFRO3dCQUMxQnVHO29CQUNGO29CQUVBLENBQUN6SyxZQUNDMEQsUUFBUUMsR0FBRyxDQUNUN0UsTUFBTTZMLE1BQU0sQ0FDVixDQUFDLFFBQVEsRUFBRW5KLFFBQVEwQyxRQUFRLENBQUMsQ0FBQyxFQUFFMUMsUUFBUXNCLEVBQUUsQ0FBQyxhQUFhLEVBQUUySCxXQUFXLGtCQUFrQixDQUFDO2dCQUcvRjtZQUNGO1lBRUEsNkNBQTZDO1lBQzdDLE1BQU1HLGtCQUFrQixJQUFJaEs7WUFDNUIsTUFBTWlLLGFBQXVCLEVBQUU7WUFFL0IsS0FBSyxNQUFNaEQsYUFBYXNDLGVBQWdCO2dCQUN0QyxpQkFBaUI7Z0JBQ2pCLElBQUksSUFBSSxDQUFDdEosZUFBZSxDQUFDbUUsR0FBRyxDQUFDNkMsWUFBWTtnQkFFekMsTUFBTXJHLFVBQVU2RixTQUFTbkUsSUFBSSxDQUFDLENBQUN1RixJQUFNQSxFQUFFWixTQUFTLEtBQUtBO2dCQUNyRCxJQUFJLENBQUNyRyxTQUFTO2dCQUVkLE1BQU1tQixTQUFTbEQsY0FBY3lGLEdBQUcsQ0FBQzFELFFBQVEwQyxRQUFRO2dCQUNqRCxNQUFNdEIsWUFBWUQsT0FBT0UsS0FBSztnQkFFOUIsSUFBSSxDQUFDK0gsZ0JBQWdCNUYsR0FBRyxDQUFDcEMsWUFBWTtvQkFDbkNnSSxnQkFBZ0JGLEdBQUcsQ0FBQzlILFdBQVcsRUFBRTtvQkFDakNpSSxXQUFXbkQsSUFBSSxDQUFDOUU7Z0JBQ2xCO2dCQUNBZ0ksZ0JBQWdCMUYsR0FBRyxDQUFDdEMsWUFBWThFLEtBQUtsRztZQUN2QztZQUVBLE1BQU13SCxHQUFHOEIsV0FBVyxDQUFDLE9BQU9DO2dCQUMxQixNQUFNQyxxQkFBcUIsSUFBSXBLO2dCQUUvQixpQkFBaUI7Z0JBQ2pCLEtBQUssTUFBTWdDLGFBQWFpSSxXQUFZO29CQUNsQyxNQUFNSSxnQkFBZ0JMLGdCQUFnQjFGLEdBQUcsQ0FBQ3RDLGNBQWMsRUFBRTtvQkFDMUQsTUFBTXNJLFNBQVMsSUFBSSxDQUFDQyxvQkFBb0IsQ0FBQ0Y7b0JBRXpDLEtBQUssTUFBTUcsaUJBQWlCRixPQUFRO3dCQUNsQywyQkFBMkI7d0JBQzNCLEtBQUssTUFBTTFKLFdBQVc0SixjQUFlOzRCQUNuQyxJQUFJLENBQUNDLGVBQWUsQ0FBQzdKLFNBQVN3Sjs0QkFDOUIsQ0FBQ2hMLFlBQ0MwRCxRQUFRQyxHQUFHLENBQ1Q3RSxNQUFNd00sSUFBSSxDQUNSLENBQUMsV0FBVyxFQUFFOUosUUFBUTBDLFFBQVEsQ0FBQyxDQUFDLEVBQUUxQyxRQUFRc0IsRUFBRSxHQUFHdEIsUUFBUWdKLFFBQVEsR0FBRyxDQUFDLFdBQVcsQ0FBQyxHQUFHLElBQUk7d0JBRzlGO3dCQUVBLHlCQUF5Qjt3QkFDekIsTUFBTTNILFFBQVEsSUFBSSxDQUFDbkMsT0FBTyxDQUFDNkssUUFBUSxDQUFDM0k7d0JBQ3BDLE1BQU00SSxRQUFRM0ksTUFBTXNFLElBQUksQ0FBQzNDLEdBQUcsQ0FBQyxDQUFDVyxNQUFRQSxJQUFJc0csSUFBSTt3QkFFOUMsQ0FBQ3pMLFlBQ0MwRCxRQUFRQyxHQUFHLENBQ1Q3RSxNQUFNd00sSUFBSSxDQUNSLENBQUMsVUFBVSxFQUFFMUksVUFBVSxNQUFNLEVBQUU0SSxNQUFNcEUsTUFBTSxDQUFDLGFBQWEsRUFBRThELE9BQU9RLE9BQU8sQ0FBQ04saUJBQWlCLEVBQUUsQ0FBQyxFQUFFRixPQUFPOUQsTUFBTSxDQUFDLENBQUMsQ0FBQzt3QkFHdEgsTUFBTWpELE1BQU8sTUFBTSxJQUFJLENBQUN6RCxPQUFPLENBQUNpTCxNQUFNLENBQ3BDWixLQUNBbkk7d0JBR0Ysc0JBQXNCO3dCQUN0Qix3Q0FBd0M7d0JBQ3hDLElBQUk0SSxNQUFNcEUsTUFBTSxHQUFHLEtBQUtvRSxNQUFNcEUsTUFBTSxLQUFLakQsSUFBSWlELE1BQU0sRUFBRTs0QkFDbkQsTUFBTXdFLGNBQ0paLG1CQUFtQjlGLEdBQUcsQ0FBQ3RDLGNBQWMsSUFBSWhDOzRCQUMzQyxJQUFLLElBQUlpTCxJQUFJLEdBQUdBLElBQUlMLE1BQU1wRSxNQUFNLEVBQUV5RSxJQUFLO2dDQUNyQ0QsWUFBWWxCLEdBQUcsQ0FBQ2MsS0FBSyxDQUFDSyxFQUFFLEVBQUUxSCxHQUFHLENBQUMwSCxFQUFFOzRCQUNsQzs0QkFDQWIsbUJBQW1CTixHQUFHLENBQUM5SCxXQUFXZ0o7d0JBQ3BDLE9BQU8sSUFBSUosTUFBTXBFLE1BQU0sS0FBS2pELElBQUlpRCxNQUFNLEVBQUU7NEJBQ3RDMUQsUUFBUW9JLElBQUksQ0FDVmhOLE1BQU02TCxNQUFNLENBQ1YsQ0FBQyxxQkFBcUIsRUFBRWEsTUFBTXBFLE1BQU0sQ0FBQyxlQUFlLEVBQUVqRCxJQUFJaUQsTUFBTSxDQUFDLE1BQU0sRUFBRXhFLFdBQVc7d0JBRzFGO29CQUNGO2dCQUNGO2dCQUVBLHNCQUFzQjtnQkFDdEIsTUFBTSxJQUFJLENBQUNtSiwwQkFBMEIsQ0FBQ2hCLEtBQUsxRCxVQUFVMkQ7Z0JBRXJELHVCQUF1QjtnQkFDdkIsaURBQWlEO2dCQUNqRCxpREFBaUQ7Z0JBQ2pELENBQUNoTCxZQUFZMEQsUUFBUUMsR0FBRyxDQUFDN0UsTUFBTXdNLElBQUksQ0FBQztnQkFDcEMsS0FBSyxNQUFNMUksYUFBYWlJLFdBQVk7b0JBQ2xDLElBQUk7d0JBQ0YsdUJBQXVCO3dCQUN2QixNQUFNbEksU0FBU2xELGNBQWNpRCxjQUFjLEdBQUdRLElBQUksQ0FDaEQsQ0FBQzhJLElBQU1BLEVBQUVuSixLQUFLLEtBQUtELGFBQWFvSixFQUFFbEosRUFBRSxDQUFDQyxXQUFXLE9BQU9IO3dCQUd6RCxJQUFJRCxRQUFROzRCQUNWLE1BQU1LLFNBQVNMLE9BQU9NLEtBQUssQ0FBQ0MsSUFBSSxDQUFDLENBQUNDLElBQU1BLEVBQUVDLElBQUksS0FBSzs0QkFDbkQsTUFBTUMsU0FBU0wsUUFBUU07NEJBRXZCLHdFQUF3RTs0QkFDeEUsTUFBTUMsZUFDSkYsV0FBVyxhQUNYQSxXQUFXLGdCQUNYTCxRQUFRUSxNQUFNQyxvQkFBb0I7NEJBRXBDLElBQUksQ0FBQ0YsY0FBYztnQ0FDakIsQ0FBQ3ZELFlBQ0MwRCxRQUFRQyxHQUFHLENBQ1Q3RSxNQUFNbU4sSUFBSSxDQUNSLENBQUMsMkJBQTJCLEVBQUVySixVQUFVLFdBQVcsRUFBRVMsVUFBVSxVQUFVLENBQUMsQ0FBQztnQ0FHakY7NEJBQ0Y7d0JBQ0Y7d0JBRUEsdUNBQXVDO3dCQUN2QyxNQUFNNkksVUFBVXpNLGNBQWNpRCxjQUFjLEdBQUdRLElBQUksQ0FDakQsQ0FBQzhJLElBQU1BLEVBQUVuSixLQUFLLEtBQUtELGFBQWFvSixFQUFFbEosRUFBRSxDQUFDQyxXQUFXLE9BQU9IO3dCQUV6RCxNQUFNdUosVUFBVUQsU0FBU2pKLE1BQU1DLEtBQUssQ0FBQ0MsSUFBTUEsRUFBRUMsSUFBSSxLQUFLLE9BQU9FO3dCQUM3RCxNQUFNOEksY0FDSkQsWUFBWSxXQUNSLE1BQU1wQixJQUNIbEgsR0FBRyxDQUFDLENBQUMsdUNBQXVDLEVBQUVqQixVQUFVLENBQUMsQ0FBQyxFQUMxRHlKLElBQUksQ0FBQyxDQUFDekUsSUFBTUEsRUFBRVQsSUFBSSxDQUFDLEVBQUUsSUFDeEIsTUFBTTRELElBQUluSSxXQUFXMEosR0FBRyxDQUFDLGdCQUFnQjFDLEtBQUs7d0JBQ3BELE1BQU0yQyxRQUFRSCxhQUFhSTt3QkFFM0IsSUFBSUQsVUFBVSxRQUFRQSxVQUFVakgsV0FBVzs0QkFDekMsd0NBQXdDOzRCQUN4QyxNQUFNeUYsSUFBSWxILEdBQUcsQ0FBQyxDQUFDLGlEQUFpRCxDQUFDLEVBQUU7Z0NBQ2pFakI7Z0NBQ0EySjs2QkFDRDs0QkFDRCxDQUFDdk0sWUFBWTBELFFBQVFDLEdBQUcsQ0FBQzdFLE1BQU0yTixLQUFLLENBQUMsQ0FBQyxtQkFBbUIsRUFBRTdKLFVBQVUsRUFBRSxFQUFFMkosT0FBTzt3QkFDbEY7b0JBQ0YsRUFBRSxPQUFPRyxNQUFNO3dCQUNiLGdDQUFnQzt3QkFDaEMsQ0FBQzFNLFlBQVkwRCxRQUFRQyxHQUFHLENBQUM3RSxNQUFNbU4sSUFBSSxDQUFDLENBQUMsMkJBQTJCLEVBQUVySixXQUFXO29CQUMvRTtnQkFDRjtnQkFFQSxXQUFXO2dCQUNYLEtBQUssTUFBTXBCLFdBQVc2RixTQUFVO29CQUM5QixNQUFNMUUsU0FBU2xELGNBQWN5RixHQUFHLENBQUMxRCxRQUFRMEMsUUFBUTtvQkFFakQsZ0NBQWdDO29CQUNoQyxNQUFNeUksVUFBVSxJQUFJLENBQUM5TCxlQUFlLENBQUNxRSxHQUFHLENBQUMxRCxRQUFRcUcsU0FBUztvQkFDMUQsSUFBSThFLFNBQVM7d0JBQ1gxQyxRQUFRdkMsSUFBSSxDQUFDOzRCQUNYeEQsVUFBVTFDLFFBQVEwQyxRQUFROzRCQUMxQjBJLE1BQU0sTUFBTTdCLElBQUlwSSxPQUFPRSxLQUFLLEVBQUV1QyxLQUFLLENBQUMsTUFBTXVILFFBQVFsQyxVQUFVLEVBQUViLEtBQUs7d0JBQ3JFO3dCQUNBO29CQUNGO29CQUVBLE1BQU1pRCxNQUFNLElBQUksQ0FBQ2xNLGFBQWEsQ0FBQ3VFLEdBQUcsQ0FBQzFELFFBQVFxRyxTQUFTO29CQUNwRCxJQUFJZ0YsS0FBSzt3QkFDUCxNQUFNQyxXQUFXOUIsbUJBQW1COUYsR0FBRyxDQUFDdkMsT0FBT0UsS0FBSzt3QkFDcEQsTUFBTWtLLGFBQWFELFVBQVU1SCxJQUFJMkgsSUFBSXBCLElBQUk7d0JBRXpDLElBQUlzQixlQUFlekgsV0FBVzs0QkFDNUIyRSxRQUFRdkMsSUFBSSxDQUFDO2dDQUNYeEQsVUFBVTFDLFFBQVEwQyxRQUFRO2dDQUMxQjBJLE1BQU0sTUFBTTdCLElBQUlwSSxPQUFPRSxLQUFLLEVBQUV1QyxLQUFLLENBQUMsTUFBTTJILFlBQVluRCxLQUFLOzRCQUM3RDs0QkFFQSxDQUFDNUosWUFDQzBELFFBQVFDLEdBQUcsQ0FDVDdFLE1BQU0yTixLQUFLLENBQUMsQ0FBQyxjQUFjLEVBQUU5SixPQUFPRSxLQUFLLENBQUMsR0FBRyxFQUFFckIsUUFBUXNCLEVBQUUsQ0FBQyxLQUFLLEVBQUVpSyxZQUFZO3dCQUVuRjtvQkFDRjtnQkFDRjtZQUNGO1FBQ0YsU0FBVTtZQUNSLE1BQU0vRCxHQUFHbEYsT0FBTztRQUNsQjtRQUVBLE9BQU8zRSxPQUFPOEssU0FBUyxDQUFDckMsSUFBTSxHQUFHQSxFQUFFMUQsUUFBUSxDQUFDLENBQUMsRUFBRTBELEVBQUVnRixJQUFJLENBQUM5SixFQUFFLEVBQUU7SUFDNUQ7SUFFQTs7O0dBR0MsR0FDRCxBQUFRdUksZ0JBQ043SixPQUFzQixFQUN0QndKLGtCQUE4RCxFQUN2RDtRQUNQLE1BQU1ySSxTQUFTbEQsY0FBY3lGLEdBQUcsQ0FBQzFELFFBQVEwQyxRQUFRO1FBQ2pELE1BQU1pQixNQUErQixDQUFDO1FBRXRDLHlEQUF5RDtRQUN6RCxNQUFNNkgsaUJBQWlCeEwsUUFBUThHLE1BQU0sSUFBSTlHLFFBQVFyQyxNQUFNO1FBQ3ZELE1BQU04TixpQkFBaUJ6TCxRQUFRZ0osUUFBUSxJQUFJd0M7UUFFM0MsS0FBSyxNQUFNLENBQUNFLFVBQVVqRyxPQUFPLElBQUl0QixPQUFPQyxPQUFPLENBQUNwRSxRQUFReUcsT0FBTyxFQUFHO1lBQ2hFLE1BQU1mLE9BQU9ELE9BQU9DLElBQUk7WUFFeEIsSUFBSW5ILGNBQWNtSCxPQUFPO2dCQUN2QjtZQUNGO1lBRUEsNENBQTRDO1lBQzVDLElBQUksZUFBZUEsUUFBUUEsS0FBS2lHLFNBQVMsRUFBRTtnQkFDekM7WUFDRjtZQUVBLFFBQVE7WUFDUixJQUFJRCxhQUFhLE1BQU07Z0JBQ3JCLE1BQU1sSyxTQUFTTCxPQUFPTSxLQUFLLENBQUNDLElBQUksQ0FBQyxDQUFDQyxJQUFNQSxFQUFFQyxJQUFJLEtBQUs7Z0JBQ25ELE1BQU1HLGVBQ0pQLFFBQVFNLFNBQVMsYUFDakJOLFFBQVFNLFNBQVMsZ0JBQ2pCTixRQUFRUSxNQUFNQyxvQkFBb0I7Z0JBRXBDLElBQUl3SixrQkFBa0JELGdCQUFnQjtvQkFDcEMsa0NBQWtDO29CQUNsQzdILEdBQUcsQ0FBQytILFNBQVMsR0FBR0YsZUFBZS9FLE9BQU8sQ0FBQ2lGLFNBQVMsRUFBRW5HO2dCQUNwRCxPQUFPLElBQUksQ0FBQ3hELGNBQWM7b0JBQ3hCLGtEQUFrRDtvQkFDbEQ0QixHQUFHLENBQUMrSCxTQUFTLEdBQUdqRyxPQUFPRixLQUFLO2dCQUM5QjtnQkFFQTtZQUNGO1lBRUEsSUFBSWpILGVBQWVvSCxPQUFPO2dCQUN4QixJQUNFeEgsMkJBQTJCd0gsU0FDMUJySCx1QkFBdUJxSCxTQUFTQSxLQUFLakIsYUFBYSxFQUNuRDtvQkFDQSxNQUFNNEQsWUFBWTVDLE9BQU9GLEtBQUs7b0JBQzlCLElBQUk4QyxjQUFjLFFBQVFBLGNBQWN2RSxXQUFXO3dCQUNqRCxNQUFNOEgsbUJBQW1CLEdBQUdsRyxLQUFLZixJQUFJLENBQUMsQ0FBQyxFQUFFMEQsV0FBVzt3QkFFcEQsd0JBQXdCO3dCQUN4QixNQUFNd0Qsb0JBQW9CLElBQUksQ0FBQ3hNLGVBQWUsQ0FBQ3FFLEdBQUcsQ0FBQ2tJLG1CQUFtQjNDO3dCQUN0RSxJQUFJNEMsc0JBQXNCL0gsV0FBVzs0QkFDbkMsMENBQTBDOzRCQUMxQ0gsR0FBRyxDQUFDLEdBQUcrSCxTQUFTLEdBQUcsQ0FBQyxDQUFDLEdBQUdHO3dCQUMxQixPQUFPOzRCQUNMLE1BQU1DLGFBQWEsSUFBSSxDQUFDM00sYUFBYSxDQUFDdUUsR0FBRyxDQUFDa0k7NEJBQzFDLElBQUlFLFlBQVk7Z0NBQ2QsK0JBQStCO2dDQUMvQixNQUFNcEgsZ0JBQWdCekcsY0FBY3lGLEdBQUcsQ0FBQ2dDLEtBQUtmLElBQUk7Z0NBQ2pELE1BQU1vSCxxQkFBcUJ2QyxvQkFBb0I5RixJQUFJZ0IsY0FBY3JELEtBQUs7Z0NBQ3RFLE1BQU0ySyxXQUFXRCxvQkFBb0JySSxJQUFJb0ksV0FBVzdCLElBQUk7Z0NBRXhELElBQUkrQixhQUFhbEksV0FBVztvQ0FDMUIsd0JBQXdCO29DQUN4QkgsR0FBRyxDQUFDLEdBQUcrSCxTQUFTLEdBQUcsQ0FBQyxDQUFDLEdBQUdNO2dDQUMxQixPQUFPO29DQUNMLDBCQUEwQjtvQ0FDMUJySSxHQUFHLENBQUMsR0FBRytILFNBQVMsR0FBRyxDQUFDLENBQUMsR0FBR0k7Z0NBQzFCOzRCQUNGLE9BQU87Z0NBQ0wsb0NBQW9DO2dDQUNwQ25JLEdBQUcsQ0FBQyxHQUFHK0gsU0FBUyxHQUFHLENBQUMsQ0FBQyxHQUFHckQ7NEJBQzFCO3dCQUNGO29CQUNGLE9BQU87d0JBQ0wxRSxHQUFHLENBQUMsR0FBRytILFNBQVMsR0FBRyxDQUFDLENBQUMsR0FBRztvQkFDMUI7Z0JBQ0Y7WUFDQSw2QkFBNkI7WUFDL0IsT0FBTztnQkFDTCxRQUFRO2dCQUNSL0gsR0FBRyxDQUFDK0gsU0FBUyxHQUFHLElBQUksQ0FBQ08sa0JBQWtCLENBQUN2RyxNQUFvQkQsT0FBT0YsS0FBSztZQUMxRTtRQUNGO1FBRUEsQ0FBQy9HLFlBQ0MwRCxRQUFRQyxHQUFHLENBQUM3RSxNQUFNd00sSUFBSSxDQUFDLENBQUMsWUFBWSxFQUFFM0ksT0FBT0UsS0FBSyxDQUFDLEdBQUcsRUFBRXpELFFBQVErRixLQUFLLE9BQU8sTUFBTSxPQUFPO1FBQzNGLE1BQU0wSCxNQUFNLElBQUksQ0FBQ25NLE9BQU8sQ0FBQ2dOLFFBQVEsQ0FBQy9LLE9BQU9FLEtBQUssRUFBRXNDO1FBQ2hELElBQUksQ0FBQ3hFLGFBQWEsQ0FBQytKLEdBQUcsQ0FBQ2xKLFFBQVFxRyxTQUFTLEVBQUVnRjtRQUUxQyxPQUFPQTtJQUNUO0lBRUE7O0dBRUMsR0FDRCxBQUFRWSxtQkFBbUJ2RyxJQUFnQixFQUFFSCxLQUFjLEVBQVc7UUFDcEUsSUFBSUEsVUFBVSxRQUFRQSxVQUFVekIsV0FBVztZQUN6QyxPQUFPO1FBQ1Q7UUFFQSxPQUFRNEIsS0FBSzVELElBQUk7WUFDZixLQUFLO2dCQUNILDhEQUE4RDtnQkFDOUQsT0FBT3lEO1lBRVQsS0FBSztnQkFDSCxJQUFJLE9BQU9BLFVBQVUsWUFBWSxPQUFPQSxVQUFVLFVBQVU7b0JBQzFELE9BQU8sSUFBSTRHLEtBQUs1RztnQkFDbEI7Z0JBQ0EsT0FBT0E7WUFFVDtnQkFDRSxPQUFPQTtRQUNYO0lBQ0Y7SUFFQSxNQUFjZ0YsMkJBQ1poQixHQUFxQixFQUNyQjFELFFBQXlCLEVBQ3pCMkQsa0JBQTZELEVBQzlDO1FBQ2YsS0FBSyxNQUFNeEosV0FBVzZGLFNBQVU7WUFDOUIsTUFBTTFFLFNBQVNsRCxjQUFjeUYsR0FBRyxDQUFDMUQsUUFBUTBDLFFBQVE7WUFDakQsTUFBTTBKLFlBQVksSUFBSSxDQUFDak4sYUFBYSxDQUFDdUUsR0FBRyxDQUFDMUQsUUFBUXFHLFNBQVM7WUFFMUQsSUFBSSxDQUFDK0YsV0FBVztZQUVoQixNQUFNQyxpQkFBaUI3QyxtQkFBbUI5RixHQUFHLENBQUN2QyxPQUFPRSxLQUFLO1lBQzFELE1BQU1pTCxXQUFXRCxnQkFBZ0IzSSxJQUFJMEksVUFBVW5DLElBQUk7WUFFbkQsSUFBSXFDLGFBQWF4SSxXQUFXO1lBRTVCLEtBQUssTUFBTSxHQUFHMkIsT0FBTyxJQUFJdEIsT0FBT0MsT0FBTyxDQUFDcEUsUUFBUXlHLE9BQU8sRUFBRztnQkFDeEQsTUFBTWYsT0FBT0QsT0FBT0MsSUFBSTtnQkFFeEIsSUFBSXRILHlCQUF5QnNILFNBQVM2RyxNQUFNQyxPQUFPLENBQUMvRyxPQUFPRixLQUFLLEdBQUc7b0JBQ2pFLGlDQUFpQztvQkFDakMsTUFBTWtILGNBQWN4TyxjQUFjeUYsR0FBRyxDQUFDZ0MsS0FBS2YsSUFBSTtvQkFDL0MsSUFBSSxJQUFJLENBQUN6RixPQUFPLENBQUN3TixRQUFRLENBQUNELFlBQVlwTCxLQUFLLE1BQU0sT0FBTztvQkFFeEQsTUFBTXlHLGFBQWFyQyxPQUFPRixLQUFLO29CQUMvQixJQUFJdUMsV0FBV2xDLE1BQU0sS0FBSyxHQUFHO29CQUU3QixNQUFNOEIsWUFBWSxBQUFDaEMsS0FBZ0NnQyxTQUFTO29CQUM1RCxNQUFNaEQsZ0JBQWdCekcsY0FBY3lGLEdBQUcsQ0FBQ2dDLEtBQUtmLElBQUk7b0JBRWpELE1BQU1nSSxlQUFlLEdBQUdqUCxXQUFXa0ssV0FBVyxDQUFDekcsT0FBT0UsS0FBSyxFQUFFLEdBQUcsQ0FBQztvQkFDakUsTUFBTXVMLGVBQWUsR0FBR2xQLFdBQVdrSyxXQUFXLENBQUNsRCxjQUFjckQsS0FBSyxFQUFFLEdBQUcsQ0FBQztvQkFFeEUsS0FBSyxNQUFNZ0gsYUFBYVAsV0FBWTt3QkFDbEMsTUFBTThELG1CQUFtQixHQUFHbEcsS0FBS2YsSUFBSSxDQUFDLENBQUMsRUFBRTBELFdBQVc7d0JBQ3BELE1BQU15RCxhQUFhLElBQUksQ0FBQzNNLGFBQWEsQ0FBQ3VFLEdBQUcsQ0FBQ2tJO3dCQUUxQyxJQUFJaUI7d0JBRUosSUFBSWYsWUFBWTs0QkFDZCxNQUFNZ0Isa0JBQWtCdEQsbUJBQW1COUYsR0FBRyxDQUFDZ0IsY0FBY3JELEtBQUs7NEJBQ2xFLE1BQU0wTCxhQUFhRCxpQkFBaUJwSixJQUFJb0ksV0FBVzdCLElBQUk7NEJBRXZELElBQUk4QyxlQUFlakosV0FBVztnQ0FDNUI1QixRQUFRb0ksSUFBSSxDQUNWLENBQUMsZ0JBQWdCLEVBQUVzQixpQkFBaUIsbUNBQW1DLENBQUM7Z0NBRTFFOzRCQUNGOzRCQUNBaUIsV0FBV0U7d0JBQ2IsT0FBTzs0QkFDTEYsV0FBV3hFO3dCQUNiO3dCQUVBLGdCQUFnQjt3QkFDaEIsTUFBTSxDQUFDMkUsTUFBTSxHQUFHLE1BQU16RCxJQUFJN0IsV0FDdkI5RCxLQUFLLENBQUM7NEJBQ0wsQ0FBQytJLGFBQWEsRUFBRUw7NEJBQ2hCLENBQUNNLGFBQWEsRUFBRUM7d0JBQ2xCLEdBQ0NoSixLQUFLLENBQUM7d0JBRVQsSUFBSSxDQUFDbUosT0FBTzs0QkFDVixNQUFNekQsSUFBSTdCLFdBQVd1RixNQUFNLENBQUM7Z0NBQzFCLENBQUNOLGFBQWEsRUFBRUw7Z0NBQ2hCLENBQUNNLGFBQWEsRUFBRUM7NEJBQ2xCOzRCQUVBLENBQUNyTyxZQUNDMEQsUUFBUUMsR0FBRyxDQUNUN0UsTUFBTTJOLEtBQUssQ0FDVCxDQUFDLGNBQWMsRUFBRXZELFVBQVUsRUFBRSxFQUFFdkcsT0FBT0UsS0FBSyxDQUFDLENBQUMsRUFBRWlMLFNBQVMsSUFBSSxFQUFFNUgsY0FBY3JELEtBQUssQ0FBQyxDQUFDLEVBQUV3TCxTQUFTLENBQUMsQ0FBQzt3QkFHeEc7b0JBQ0Y7Z0JBQ0Y7WUFDRjtRQUNGO0lBQ0Y7SUFFQTs7Ozs7Ozs7O0dBU0MsR0FDRCxBQUFRbEQscUJBQXFCOUQsUUFBeUIsRUFBcUI7UUFDekUsSUFBSUEsU0FBU0QsTUFBTSxLQUFLLEdBQUc7WUFDekIsT0FBTyxFQUFFO1FBQ1g7UUFFQSxNQUFNekUsU0FBU2xELGNBQWN5RixHQUFHLENBQUNtQyxRQUFRLENBQUMsRUFBRSxDQUFDbkQsUUFBUTtRQUVyRCxrQ0FBa0M7UUFDbEMsTUFBTXdLLGVBQWUvTCxPQUFPTSxLQUFLLENBQUM2QyxNQUFNLENBQ3RDLENBQUMzQyxJQUNDckQsZUFBZXFELE1BQ2R6RCxDQUFBQSwyQkFBMkJ5RCxNQUFPdEQsdUJBQXVCc0QsTUFBTUEsRUFBRThDLGFBQWEsS0FDL0U5QyxFQUFFZ0QsSUFBSSxLQUFLeEQsT0FBT0csRUFBRTtRQUd4QixJQUFJNEwsYUFBYXRILE1BQU0sS0FBSyxHQUFHO1lBQzdCLDRCQUE0QjtZQUM1QixPQUFPO2dCQUFDQzthQUFTO1FBQ25CO1FBRUEsNEJBQTRCO1FBQzVCLE1BQU02RCxTQUE0QixFQUFFO1FBQ3BDLE1BQU15RCxZQUFZLElBQUkzSyxJQUFJcUQsU0FBUzdDLEdBQUcsQ0FBQyxDQUFDaUUsSUFBTUEsRUFBRVosU0FBUztRQUN6RCxNQUFNK0csWUFBWSxJQUFJNUs7UUFFdEIsTUFBTzJLLFVBQVVFLElBQUksR0FBRyxFQUFHO1lBQ3pCLE1BQU1DLGVBQWdDLEVBQUU7WUFFeEMsS0FBSyxNQUFNdE4sV0FBVzZGLFNBQVU7Z0JBQzlCLElBQUksQ0FBQ3NILFVBQVUzSixHQUFHLENBQUN4RCxRQUFRcUcsU0FBUyxHQUFHO2dCQUV2Qyx1Q0FBdUM7Z0JBQ3ZDLE1BQU1rSCxhQUFhTCxhQUFhTSxLQUFLLENBQUMsQ0FBQzlIO29CQUNyQyxNQUFNK0gsUUFBUXpOLFFBQVF5RyxPQUFPLENBQUNmLEtBQUs5RCxJQUFJLENBQUMsRUFBRTJEO29CQUMxQyxJQUFJa0ksVUFBVSxRQUFRQSxVQUFVM0osV0FBVyxPQUFPO29CQUNsRCxNQUFNNEosZUFBZSxHQUFHaEksS0FBS2YsSUFBSSxDQUFDLENBQUMsRUFBRThJLE9BQU87b0JBQzVDLDRDQUE0QztvQkFDNUMsT0FBT0wsVUFBVTVKLEdBQUcsQ0FBQ2tLLGlCQUFpQixDQUFDUCxVQUFVM0osR0FBRyxDQUFDa0s7Z0JBQ3ZEO2dCQUVBLElBQUlILFlBQVk7b0JBQ2RELGFBQWFwSCxJQUFJLENBQUNsRztnQkFDcEI7WUFDRjtZQUVBLElBQUlzTixhQUFhMUgsTUFBTSxLQUFLLEdBQUc7Z0JBQzdCLE1BQU0rSCxlQUFlcEIsTUFBTXFCLElBQUksQ0FBQ1QsV0FBV1UsSUFBSSxDQUFDO2dCQUNoRCxNQUFNLElBQUloUCxNQUNSLENBQUMsb0NBQW9DLEVBQUVzQyxPQUFPRSxLQUFLLENBQUMsc0JBQXNCLEVBQUVzTSxjQUFjO1lBRTlGO1lBRUEsS0FBSyxNQUFNM04sV0FBV3NOLGFBQWM7Z0JBQ2xDSCxVQUFVVyxNQUFNLENBQUM5TixRQUFRcUcsU0FBUztnQkFDbEMrRyxVQUFVM0osR0FBRyxDQUFDekQsUUFBUXFHLFNBQVM7WUFDakM7WUFFQXFELE9BQU94RCxJQUFJLENBQUNvSDtRQUNkO1FBRUEsT0FBTzVEO0lBQ1Q7SUFFQSxNQUFjMUMscUJBQXFCUSxFQUFRLEVBQUVyRyxNQUFjLEVBQUVuQixPQUFzQixFQUFFO1FBQ25GLE1BQU0rTixpQkFBaUI1TSxPQUFPNk0sT0FBTyxFQUFFMUosT0FBTyxDQUFDK0YsSUFBTUEsRUFBRXZJLElBQUksS0FBSyxhQUFhLEVBQUU7UUFFL0UsTUFBTW1NLGdCQUFnQkYsZUFBZXpKLE1BQU0sQ0FBQyxDQUFDNEosUUFDM0NBLE1BQU16SCxPQUFPLENBQUMrRyxLQUFLLENBQUMsQ0FBQy9ILFNBQVcsQ0FBQ0EsT0FBTzdELElBQUksQ0FBQ3VNLFVBQVUsQ0FBQyxHQUFHaE4sT0FBT0UsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUU3RSxJQUFJNE0sY0FBY3JJLE1BQU0sS0FBSyxHQUFHO1lBQzlCLE9BQU87UUFDVDtRQUVBLElBQUl3SSxjQUFjNUcsR0FBR3JHLE9BQU9FLEtBQUs7UUFDakMsSUFBSWdOLGVBQWU7UUFFbkIsS0FBSyxNQUFNSCxTQUFTRCxjQUFlO1lBQ2pDLGtEQUFrRDtZQUNsRCxNQUFNSyxlQUFlSixNQUFNekgsT0FBTyxDQUFDOEgsSUFBSSxDQUFDLENBQUM5STtnQkFDdkMsTUFBTW5DLFFBQVFtQyxPQUFPN0QsSUFBSSxDQUFDNE0sT0FBTyxDQUFDLFFBQVE7Z0JBQzFDLE9BQU94TyxRQUFReUcsT0FBTyxDQUFDbkQsTUFBTSxFQUFFaUMsVUFBVTtZQUMzQztZQUNBLElBQUkrSSxjQUFjO2dCQUNoQjtZQUNGO1lBRUFGLGNBQWNBLFlBQVlLLE9BQU8sQ0FBQyxDQUFDQztnQkFDakMsS0FBSyxNQUFNakosVUFBVXlJLE1BQU16SCxPQUFPLENBQUU7b0JBQ2xDLE1BQU1uRCxRQUFRbUMsT0FBTzdELElBQUksQ0FBQzRNLE9BQU8sQ0FBQyxRQUFRO29CQUUxQyxJQUFJakMsTUFBTUMsT0FBTyxDQUFDeE0sUUFBUXlHLE9BQU8sQ0FBQ25ELE1BQU0sRUFBRWlDLFFBQVE7d0JBQ2hEbUosR0FBR0MsT0FBTyxDQUFDbEosT0FBTzdELElBQUksRUFBRTVCLFFBQVF5RyxPQUFPLENBQUNuRCxNQUFNLENBQUNpQyxLQUFLO29CQUN0RCxPQUFPO3dCQUNMbUosR0FBR0UsUUFBUSxDQUFDbkosT0FBTzdELElBQUksRUFBRTVCLFFBQVF5RyxPQUFPLENBQUNuRCxNQUFNLEVBQUVpQztvQkFDbkQ7Z0JBQ0Y7WUFDRjtZQUNBOEksZUFBZTtRQUNqQjtRQUVBLElBQUksQ0FBQ0EsY0FBYztZQUNqQixPQUFPO1FBQ1Q7UUFFQSxNQUFNLENBQUNRLFlBQVksR0FBRyxNQUFNVDtRQUM1QixPQUFPUztJQUNUO0lBRUEsTUFBY2xJLHdCQUNaYSxFQUFRLEVBQ1JyRyxNQUFjLEVBQ2RuQixPQUFzQixFQUN0QnlHLE9BQWlCLEVBQ2pCO1FBQ0EsSUFBSUEsUUFBUWIsTUFBTSxLQUFLLEdBQUc7WUFDeEIsT0FBTztRQUNUO1FBRUEsTUFBTWtKLGNBQXVDLENBQUM7UUFFOUMsS0FBSyxNQUFNckosVUFBVWdCLFFBQVM7WUFDNUIsMEJBQTBCO1lBQzFCLE1BQU1mLE9BQU92RSxPQUFPTSxLQUFLLENBQUNDLElBQUksQ0FBQyxDQUFDQyxJQUFNQSxFQUFFQyxJQUFJLEtBQUs2RDtZQUNqRCxNQUFNc0osV0FBV3JKLFFBQVFwSCxlQUFlb0gsUUFBUSxHQUFHRCxPQUFPLEdBQUcsQ0FBQyxHQUFHQTtZQUNqRSxNQUFNRixRQUFRdkYsUUFBUXlHLE9BQU8sQ0FBQ2hCLE9BQU8sRUFBRUY7WUFFdkMsMEJBQTBCO1lBQzFCLElBQUlBLFVBQVUsUUFBUUEsVUFBVXpCLFdBQVc7Z0JBQ3pDLE9BQU87WUFDVDtZQUVBZ0wsV0FBVyxDQUFDQyxTQUFTLEdBQUd4SjtRQUMxQjtRQUVBLE1BQU0sQ0FBQ3lILE1BQU0sR0FBRyxNQUFNeEYsR0FBR3JHLE9BQU9FLEtBQUssRUFBRXVDLEtBQUssQ0FBQ2tMLGFBQWFqTCxLQUFLLENBQUM7UUFDaEUsT0FBT21KO0lBQ1Q7SUFFQSxNQUFNZ0MsaUJBQWlCQyxJQUFZLEVBQUU7UUFDbkMsTUFBTUMsT0FBTyxHQUFHclIsT0FBT3NSLFdBQVcsQ0FBQyx1QkFBdUIsQ0FBQztRQUMzRCxNQUFNQyxVQUFVNVIsYUFBYTBSLE1BQU1HLFFBQVE7UUFFM0MsTUFBTUMscUJBQXFCRixRQUFRbEYsT0FBTyxDQUFDO1FBQzNDLE1BQU1xRixtQkFBbUJILFFBQVFsRixPQUFPLENBQUMsTUFBTW9GO1FBRS9DLElBQUlBLHVCQUF1QixDQUFDLEtBQUtDLHFCQUFxQixDQUFDLEdBQUc7WUFDeEQsTUFBTUMsYUFBYSxHQUFHSixRQUFRN0ksS0FBSyxDQUFDLEdBQUdnSixrQkFBa0IsRUFBRSxFQUFFTixLQUFLLEVBQUUsRUFBRUcsUUFBUTdJLEtBQUssQ0FBQ2dKLG1CQUFtQjtZQUV2RzlSLGNBQWN5UixNQUFNTTtRQUN0QixPQUFPO1lBQ0wsTUFBTSxJQUFJM1EsTUFBTTtRQUNsQjtJQUNGO0FBQ0Y7QUFFQSxPQUFPLE1BQU00USxpQkFBaUIsSUFBSS9RLHNCQUFzQiJ9
790
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0aW5nL2ZpeHR1cmUtbWFuYWdlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gXCJhc3NlcnRcIjtcbmltcG9ydCBjaGFsayBmcm9tIFwiY2hhbGtcIjtcbmltcG9ydCB7IGV4ZWNTeW5jIH0gZnJvbSBcImNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCB7IHJlYWRGaWxlU3luYywgd3JpdGVGaWxlU3luYyB9IGZyb20gXCJmc1wiO1xuaW1wb3J0IGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIjtcbmltcG9ydCB0eXBlIHsgS25leCB9IGZyb20gXCJrbmV4XCI7XG5pbXBvcnQgeyB1bmlxdWUgfSBmcm9tIFwicmFkYXNoaVwiO1xuaW1wb3J0IHsgaW5zcGVjdCB9IGZyb20gXCJ1dGlsXCI7XG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpXCI7XG5pbXBvcnQgeyBCYXNlTW9kZWwgfSBmcm9tIFwiLi4vZGF0YWJhc2UvYmFzZS1tb2RlbFwiO1xuaW1wb3J0IHR5cGUgeyBTb25hbXVEQkNvbmZpZyB9IGZyb20gXCIuLi9kYXRhYmFzZS9kYlwiO1xuaW1wb3J0IHsgY3JlYXRlS25leEluc3RhbmNlIH0gZnJvbSBcIi4uL2RhdGFiYXNlL2tuZXhcIjtcbmltcG9ydCB7IHR5cGUgVUJSZWYsIFVwc2VydEJ1aWxkZXIgfSBmcm9tIFwiLi4vZGF0YWJhc2UvdXBzZXJ0LWJ1aWxkZXJcIjtcbmltcG9ydCB0eXBlIHsgRW50aXR5IH0gZnJvbSBcIi4uL2VudGl0eS9lbnRpdHlcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQge1xuICB0eXBlIEJlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcCxcbiAgdHlwZSBEYXRhYmFzZVNjaGVtYUV4dGVuZCxcbiAgdHlwZSBFbnRpdHlQcm9wLFxuICB0eXBlIEZpeHR1cmVJbXBvcnRSZXN1bHQsXG4gIHR5cGUgRml4dHVyZVJlY29yZCxcbiAgdHlwZSBGaXh0dXJlU2VhcmNoT3B0aW9ucyxcbiAgaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AsXG4gIGlzSGFzTWFueVJlbGF0aW9uUHJvcCxcbiAgaXNNYW55VG9NYW55UmVsYXRpb25Qcm9wLFxuICBpc09uZVRvT25lUmVsYXRpb25Qcm9wLFxuICBpc1JlbGF0aW9uUHJvcCxcbiAgaXNWaXJ0dWFsUHJvcCxcbiAgdHlwZSBNYW55VG9NYW55UmVsYXRpb25Qcm9wLFxuICB0eXBlIE9uZVRvT25lUmVsYXRpb25Qcm9wLFxufSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IGlzVGVzdCB9IGZyb20gXCIuLi91dGlscy9jb250cm9sbGVyXCI7XG5pbXBvcnQgeyBSZWxhdGlvbkdyYXBoIH0gZnJvbSBcIi4vX3JlbGF0aW9uLWdyYXBoXCI7XG5cbi8qKiDsgqzsmqnsnpAg7KeA7KCVIOykkeuztSDtmZXsnbgg7Lus65+8IChlbnRpdHlJZOuzhOuhnCDsp4DsoJUpICovXG5leHBvcnQgaW50ZXJmYWNlIER1cGxpY2F0ZUNoZWNrT3B0aW9ucyB7XG4gIGNvbHVtbnM/OiB7XG4gICAgW2VudGl0eUlkOiBzdHJpbmddOiBzdHJpbmdbXTtcbiAgfTtcbn1cblxuZXhwb3J0IGNsYXNzIEZpeHR1cmVNYW5hZ2VyQ2xhc3Mge1xuICBwcml2YXRlIF90ZGI6IEtuZXggfCBudWxsID0gbnVsbDtcbiAgc2V0IHRkYih0ZGI6IEtuZXgpIHtcbiAgICB0aGlzLl90ZGIgPSB0ZGI7XG4gIH1cbiAgZ2V0IHRkYigpOiBLbmV4IHtcbiAgICBpZiAodGhpcy5fdGRiID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGaXh0dXJlTWFuYWdlciBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWRcIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl90ZGI7XG4gIH1cblxuICBwcml2YXRlIF9mZGI6IEtuZXggfCBudWxsID0gbnVsbDtcbiAgc2V0IGZkYihmZGI6IEtuZXgpIHtcbiAgICB0aGlzLl9mZGIgPSBmZGI7XG4gIH1cbiAgZ2V0IGZkYigpOiBLbmV4IHtcbiAgICBpZiAodGhpcy5fZmRiID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGaXh0dXJlTWFuYWdlciBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWRcIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9mZGI7XG4gIH1cbiAgY2FjaGVkVGFibGVOYW1lczogc3RyaW5nW10gfCBudWxsID0gbnVsbDtcblxuICBwcml2YXRlIHJlbGF0aW9uR3JhcGggPSBuZXcgUmVsYXRpb25HcmFwaCgpO1xuXG4gIC8vIFVwc2VydEJ1aWxkZXIg6riw67CYIGltcG9ydOulvCDsnITtlZwg7IOB7YOcXG4gIHByaXZhdGUgYnVpbGRlcjogVXBzZXJ0QnVpbGRlciA9IG5ldyBVcHNlcnRCdWlsZGVyKCk7XG4gIHByaXZhdGUgZml4dHVyZVJlZk1hcDogTWFwPHN0cmluZywgVUJSZWY+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIHNraXBwZWRGaXh0dXJlczogTWFwPHN0cmluZywgeyBlbnRpdHlJZDogc3RyaW5nOyBleGlzdGluZ0lkOiBudW1iZXIgfCBzdHJpbmcgfT4gPVxuICAgIG5ldyBNYXAoKTtcblxuICBpbml0KCkge1xuICAgIGlmICh0aGlzLl90ZGIgIT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKFNvbmFtdS5kYkNvbmZpZy50ZXN0ICYmIFNvbmFtdS5kYkNvbmZpZy5wcm9kdWN0aW9uX21hc3Rlcikge1xuICAgICAgY29uc3QgdENvbm4gPSBTb25hbXUuZGJDb25maWcudGVzdC5jb25uZWN0aW9uIGFzIEtuZXguQ29ubmVjdGlvbkNvbmZpZyAmIHtcbiAgICAgICAgcG9ydD86IG51bWJlcjtcbiAgICAgIH07XG4gICAgICBjb25zdCBwQ29ubiA9IFNvbmFtdS5kYkNvbmZpZy5wcm9kdWN0aW9uX21hc3Rlci5jb25uZWN0aW9uIGFzIEtuZXguQ29ubmVjdGlvbkNvbmZpZyAmIHtcbiAgICAgICAgcG9ydD86IG51bWJlcjtcbiAgICAgIH07XG4gICAgICBpZiAoXG4gICAgICAgIGAke3RDb25uLmhvc3QgPz8gXCJsb2NhbGhvc3RcIn06JHt0Q29ubi5wb3J0ID8/IDU0MzJ9LyR7dENvbm4uZGF0YWJhc2V9YCA9PT1cbiAgICAgICAgYCR7cENvbm4uaG9zdCA/PyBcImxvY2FsaG9zdFwifToke3BDb25uLnBvcnQgPz8gNTQzMn0vJHtwQ29ubi5kYXRhYmFzZX1gXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGDthYzsiqTtirhEQuyZgCDtlITroZzrjZXshZhEQuyXkCDrj5nsnbztlZwg642w7J207YSw67Kg7J207Iqk6rCAIOyCrOyaqeuQmOyXiOyKteuLiOuLpC5gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnRkYiA9IGNyZWF0ZUtuZXhJbnN0YW5jZShTb25hbXUuZGJDb25maWcudGVzdCk7XG4gICAgdGhpcy5mZGIgPSBjcmVhdGVLbmV4SW5zdGFuY2UoU29uYW11LmRiQ29uZmlnLmZpeHR1cmUpO1xuICB9XG5cbiAgLyoqXG4gICAg7JuQ6rKpIGZpeHR1cmUgRELrpbwg66Gc7LusIHRlc3QgRELroZwg67O17IKs7ZWp64uI64ukLlxuICAgIHBnX2R1bXDroZwg7JuQ6rKpIERC66W8IOuNpO2UhO2VmOqzoCwgcGdfcmVzdG9yZeuhnCDroZzsu6zsl5Ag67O17JuQ7ZWp64uI64ukLlxuICAqL1xuICBhc3luYyBzeW5jKCkge1xuICAgIGNvbnN0IGZpeHR1cmVDb25uID0gU29uYW11LmRiQ29uZmlnLmZpeHR1cmUuY29ubmVjdGlvbiBhcyBLbmV4LlBnQ29ubmVjdGlvbkNvbmZpZztcbiAgICBjb25zdCB0ZXN0Q29ubiA9IFNvbmFtdS5kYkNvbmZpZy50ZXN0LmNvbm5lY3Rpb24gYXMgS25leC5QZ0Nvbm5lY3Rpb25Db25maWc7XG5cbiAgICAvLyAxLiDroZzsu6wgdGVzdCBEQiDsl7DqsrAg7KKF66OMIOuwjyDsnqzsg53shLFcbiAgICBjb25zdCB0ZXN0UGdFbnYgPSB7IFBHUEFTU1dPUkQ6IHRlc3RDb25uLnBhc3N3b3JkIHx8IFwiXCIgfTtcbiAgICBleGVjU3luYyhcbiAgICAgIGBwc3FsIC1oICR7dGVzdENvbm4uaG9zdH0gLXAgJHt0ZXN0Q29ubi5wb3J0ID8/IDU0MzJ9IC1VICR7dGVzdENvbm4udXNlcn0gLWQgcG9zdGdyZXMgLWMgXCJcbiAgICAgICAgU0VMRUNUIHBnX3Rlcm1pbmF0ZV9iYWNrZW5kKHBnX3N0YXRfYWN0aXZpdHkucGlkKVxuICAgICAgICBGUk9NIHBnX3N0YXRfYWN0aXZpdHlcbiAgICAgICAgV0hFUkUgZGF0bmFtZSA9ICcke3Rlc3RDb25uLmRhdGFiYXNlfSdcbiAgICAgICAgICBBTkQgcGlkIDw+IHBnX2JhY2tlbmRfcGlkKCk7XG4gICAgICBcImAsXG4gICAgICB7IHN0ZGlvOiBcImluaGVyaXRcIiwgZW52OiB7IC4uLnByb2Nlc3MuZW52LCAuLi50ZXN0UGdFbnYgfSBhcyBOb2RlSlMuUHJvY2Vzc0VudiB9LFxuICAgICk7XG5cbiAgICBleGVjU3luYyhcbiAgICAgIGBwc3FsIC1oICR7dGVzdENvbm4uaG9zdH0gLXAgJHt0ZXN0Q29ubi5wb3J0ID8/IDU0MzJ9IC1VICR7dGVzdENvbm4udXNlcn0gLWQgcG9zdGdyZXMgLWMgXCJEUk9QIERBVEFCQVNFIElGIEVYSVNUUyBcXFxcXCIke3Rlc3RDb25uLmRhdGFiYXNlfVxcXFxcIlwiYCxcbiAgICAgIHsgc3RkaW86IFwiaW5oZXJpdFwiLCBlbnY6IHsgLi4ucHJvY2Vzcy5lbnYsIC4uLnRlc3RQZ0VudiB9IGFzIE5vZGVKUy5Qcm9jZXNzRW52IH0sXG4gICAgKTtcblxuICAgIGV4ZWNTeW5jKFxuICAgICAgYHBzcWwgLWggJHt0ZXN0Q29ubi5ob3N0fSAtcCAke3Rlc3RDb25uLnBvcnQgPz8gNTQzMn0gLVUgJHt0ZXN0Q29ubi51c2VyfSAtZCBwb3N0Z3JlcyAtYyBcIkNSRUFURSBEQVRBQkFTRSBcXFxcXCIke3Rlc3RDb25uLmRhdGFiYXNlfVxcXFxcIlwiYCxcbiAgICAgIHsgc3RkaW86IFwiaW5oZXJpdFwiLCBlbnY6IHsgLi4ucHJvY2Vzcy5lbnYsIC4uLnRlc3RQZ0VudiB9IGFzIE5vZGVKUy5Qcm9jZXNzRW52IH0sXG4gICAgKTtcblxuICAgIC8vIDIuIOybkOqyqSBmaXh0dXJlIERCIOKGkiDroZzsu6wgdGVzdCBEQuuhnCDrs7XsgqwgKHBnX2R1bXAgfCBwZ19yZXN0b3JlKVxuICAgIGNvbnN0IGZpeHR1cmVQZ0VudiA9IHsgUEdQQVNTV09SRDogZml4dHVyZUNvbm4ucGFzc3dvcmQgfHwgXCJcIiB9O1xuICAgIGNvbnN0IGR1bXBDbWQgPSBgcGdfZHVtcCAtaCAke2ZpeHR1cmVDb25uLmhvc3R9IC1wICR7Zml4dHVyZUNvbm4ucG9ydCA/PyA1NDMyfSAtVSAke2ZpeHR1cmVDb25uLnVzZXJ9IC1kICR7Zml4dHVyZUNvbm4uZGF0YWJhc2V9IC1GY2A7XG4gICAgY29uc3QgcmVzdG9yZUNtZCA9IGBwZ19yZXN0b3JlIC1oICR7dGVzdENvbm4uaG9zdH0gLXAgJHt0ZXN0Q29ubi5wb3J0ID8/IDU0MzJ9IC1VICR7dGVzdENvbm4udXNlcn0gLWQgJHt0ZXN0Q29ubi5kYXRhYmFzZX0gLS1uby1vd25lciAtLW5vLWFjbGA7XG5cbiAgICBleGVjU3luYyhgJHtkdW1wQ21kfSB8IFBHUEFTU1dPUkQ9XCIke3Rlc3RDb25uLnBhc3N3b3JkIHx8IFwiXCJ9XCIgJHtyZXN0b3JlQ21kfWAsIHtcbiAgICAgIHN0ZGlvOiBcImluaGVyaXRcIixcbiAgICAgIGVudjogeyAuLi5wcm9jZXNzLmVudiwgLi4uZml4dHVyZVBnRW52IH0gYXMgTm9kZUpTLlByb2Nlc3NFbnYsXG4gICAgICBzaGVsbDogXCIvYmluL2Jhc2hcIixcbiAgICB9KTtcblxuICAgIC8vIDMuIOyLnO2AgOyKpCDrpqzshYsgKOuNsOydtO2EsCDrs7Xsgqwg7ZuEIOyLnO2AgOyKpOulvCBNQVgoaWQp66GcIOygleugrClcbiAgICBhd2FpdCB0aGlzLnJlc2V0U2VxdWVuY2VzKFNvbmFtdS5kYkNvbmZpZy50ZXN0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDrqqjrk6Ag7YWM7J2067iU7J2YIOyLnO2AgOyKpOulvCDtmITsnqwgTUFYKGlkKeuhnCDrpqzshYvtlanri4jri6QuXG4gICAqIGZpeHR1cmUgc3luYyDtm4Qg7Iuc7YCA7Iqk6rCAIOyLpOygnCDrjbDsnbTthLDsmYAg66ee7KeAIOyViuuKlCDrrLjsoJzrpbwg7ZW06rKw7ZWp64uI64ukLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZXNldFNlcXVlbmNlcyhkYkNvbmZpZzogU29uYW11REJDb25maWdbXCJ0ZXN0XCJdKSB7XG4gICAgY29uc3QgdGVzdERiID0gY3JlYXRlS25leEluc3RhbmNlKGRiQ29uZmlnKTtcbiAgICBjb25zdCBlbnRpdGllcyA9IEVudGl0eU1hbmFnZXIuZ2V0QWxsRW50aXRpZXMoKTtcblxuICAgIHRyeSB7XG4gICAgICBmb3IgKGNvbnN0IGVudGl0eSBvZiBlbnRpdGllcykge1xuICAgICAgICBjb25zdCB0YWJsZU5hbWUgPSBlbnRpdHkudGFibGUgfHwgZW50aXR5LmlkLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgLy8gaWQg7ZWE65Oc7J2YIO2DgOyeheydhCDtmZXsnbjtlanri4jri6RcbiAgICAgICAgY29uc3QgaWRQcm9wID0gZW50aXR5LnByb3BzLmZpbmQoKHApID0+IHAubmFtZSA9PT0gXCJpZFwiKTtcbiAgICAgICAgY29uc3QgaWRUeXBlID0gaWRQcm9wPy50eXBlO1xuXG4gICAgICAgIC8vIGludGVnZXIvYmlnSW50ZWdlcuydtOqxsOuCmCwgc3RyaW5n7J207KeA66eMIGZpeHR1cmVTdHJhdGVneT1zZXF1ZW5jZeyduCDqsr3smrDsl5Drp4wg66as7IWL7ZWp64uI64ukXG4gICAgICAgIGNvbnN0IHVzZXNTZXF1ZW5jZSA9XG4gICAgICAgICAgaWRUeXBlID09PSBcImludGVnZXJcIiB8fFxuICAgICAgICAgIGlkVHlwZSA9PT0gXCJiaWdJbnRlZ2VyXCIgfHxcbiAgICAgICAgICBpZFByb3A/LmNvbmU/LmZpeHR1cmVTdHJhdGVneSA9PT0gXCJzZXF1ZW5jZVwiO1xuXG4gICAgICAgIGlmICghdXNlc1NlcXVlbmNlKSB7XG4gICAgICAgICAgIWlzVGVzdCgpICYmXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgYFNraXBwaW5nIHNlcXVlbmNlIHJlc2V0IGZvciAke3RhYmxlTmFtZX0gKGlkIHR5cGU6ICR7aWRUeXBlIHx8IFwidW5rbm93blwifSlgLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFBvc3RncmVTUUwg7Iuc7YCA7Iqk66W8IO2YhOyerCDthYzsnbTruJTsnZggTUFYKGlkKeuhnCDrpqzshYvtlanri4jri6QuXG4gICAgICAgIC8vIHN0cmluZyDtg4DsnoXsnZgg6rK97JqwIOyIq+yekCDsupDsiqTtjIXsnbQg7ZWE7JqU7ZWp64uI64ukLlxuICAgICAgICBjb25zdCBtYXhFeHByID0gaWRUeXBlID09PSBcInN0cmluZ1wiID8gXCJNQVgoaWQ6OmJpZ2ludClcIiA6IFwiTUFYKGlkKVwiO1xuICAgICAgICBhd2FpdCB0ZXN0RGIucmF3KGBcbiAgICAgICAgICBTRUxFQ1Qgc2V0dmFsKFxuICAgICAgICAgICAgcGdfZ2V0X3NlcmlhbF9zZXF1ZW5jZSgncHVibGljLiR7dGFibGVOYW1lfScsICdpZCcpLFxuICAgICAgICAgICAgQ09BTEVTQ0UoKFNFTEVDVCAke21heEV4cHJ9IEZST00gJHt0YWJsZU5hbWV9KSwgMSlcbiAgICAgICAgICApXG4gICAgICAgIGApO1xuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCB0ZXN0RGIuZGVzdHJveSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdmlzaXRlZFJlY29yZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgYXN5bmMgaW1wb3J0Rml4dHVyZShlbnRpdHlJZDogc3RyaW5nLCBpZHM6IG51bWJlcltdKSB7XG4gICAgLy8g67Cp66y4IOq4sOuhnSDstIjquLDtmZQgKOyDiOuhnOyatCBpbXBvcnQg7J6R7JeFIOyLnOyekSlcbiAgICB0aGlzLnZpc2l0ZWRSZWNvcmRzLmNsZWFyKCk7XG5cbiAgICBjb25zdCBxdWVyaWVzID0gdW5pcXVlKFxuICAgICAgKFxuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICBpZHMubWFwKGFzeW5jIChpZCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0SW1wb3J0UXVlcmllcyhlbnRpdHlJZCwgXCJpZFwiLCBpZCk7XG4gICAgICAgICAgfSksXG4gICAgICAgIClcbiAgICAgICkuZmxhdCgpLFxuICAgICk7XG5cbiAgICBjb25zdCB3ZGIgPSBCYXNlTW9kZWwuZ2V0REIoXCJ3XCIpO1xuICAgIGZvciAoY29uc3QgcXVlcnkgb2YgcXVlcmllcykge1xuICAgICAgYXdhaXQgd2RiLnJhdyhxdWVyeSk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZ2V0SW1wb3J0UXVlcmllcyhlbnRpdHlJZDogc3RyaW5nLCBmaWVsZDogc3RyaW5nLCBpZDogbnVtYmVyKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIGNvbnN0IHJlY29yZEtleSA9IGAke2VudGl0eUlkfSMke2ZpZWxkfSMke2lkfWA7XG5cbiAgICAvLyDsiJztmZgg7LC47KGwIOuwqeyngDog7J2066+4IOuwqeusuO2VnCDroIjsvZTrk5zripQg7Iqk7YK1XG4gICAgaWYgKHRoaXMudmlzaXRlZFJlY29yZHMuaGFzKHJlY29yZEtleSkpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgdGhpcy52aXNpdGVkUmVjb3Jkcy5hZGQocmVjb3JkS2V5KTtcblxuICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKTtcbiAgICBjb25zdCB3ZGIgPSBCYXNlTW9kZWwuZ2V0REIoXCJ3XCIpO1xuXG4gICAgLy8g7Jes6riw7IScIOyLpERC7J2YIHJvdyDqsIDsoLjsmLRcbiAgICBjb25zdCBbcm93XSA9IGF3YWl0IHdkYihlbnRpdHkudGFibGUpLndoZXJlKGZpZWxkLCBpZCkubGltaXQoMSk7XG4gICAgaWYgKHJvdyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZW50aXR5SWR9IyR7aWR9IHJvd+ulvCDssL7snYQg7IiYIOyXhuyKteuLiOuLpC5gKTtcbiAgICB9XG5cbiAgICAvLyDtlL3siqTss5BEQiwg7IukREJcbiAgICBjb25zdCBmaXh0dXJlRGF0YWJhc2UgPSAoU29uYW11LmRiQ29uZmlnLmZpeHR1cmUuY29ubmVjdGlvbiBhcyBLbmV4LkNvbm5lY3Rpb25Db25maWcpLmRhdGFiYXNlO1xuICAgIGNvbnN0IHJlYWxEYXRhYmFzZSA9IChTb25hbXUuZGJDb25maWcucHJvZHVjdGlvbl9tYXN0ZXIuY29ubmVjdGlvbiBhcyBLbmV4LkNvbm5lY3Rpb25Db25maWcpXG4gICAgICAuZGF0YWJhc2U7XG5cbiAgICBjb25zdCBzZWxmUXVlcnkgPSBgSU5TRVJUIElHTk9SRSBJTlRPIFxcYCR7Zml4dHVyZURhdGFiYXNlfVxcYC5cXGAke2VudGl0eS50YWJsZX1cXGAgKFNFTEVDVCAqIEZST00gXFxgJHtyZWFsRGF0YWJhc2V9XFxgLlxcYCR7ZW50aXR5LnRhYmxlfVxcYCBXSEVSRSBcXGBpZFxcYCA9ICR7aWR9KWA7XG5cbiAgICBjb25zdCBhcmdzID0gT2JqZWN0LmVudHJpZXMoZW50aXR5LnJlbGF0aW9ucylcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgIChbLCByZWxhdGlvbl0pID0+XG4gICAgICAgICAgaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AocmVsYXRpb24pIHx8XG4gICAgICAgICAgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocmVsYXRpb24pICYmIHJlbGF0aW9uLmN1c3RvbUpvaW5DbGF1c2UgPT09IHVuZGVmaW5lZCksXG4gICAgICApXG4gICAgICAubWFwKChbLCByZWxhdGlvbl0pID0+IHtcbiAgICAgICAgLypcbiAgICAgICAgQmVsb25nc1RvT25l7J24IOqyveyasFxuICAgICAgICAgIENhdGVnb3J5IC8gJ2lkJyAvIHJvd1tjYXRlZ29yeV9pZF0g7Zi47LacXG4gICAgICAgIE9uZVRvT25l7JeQIGpvaW5Db2x1bW4gPT09IHRydWUg7J24IOqyveyasFxuICAgICAgICAgIFByb2ZpbGUgLyAnaWQnIC8gcm93W3Byb2ZpbGVfaWRdIO2YuOy2nFxuICAgICAgICBPbmVUb09uZeyXkCBqb2luQ29sdW1uID09PSBmYWxzZSDsnbgg6rK97JqwXG4gICAgICAgICAgUHJvZmlsZSAvICdwcm9maWxlX2lkJyAvIHJvd1snaWQnXSDtmLjstpxcbiAgICAgICAgKi9cbiAgICAgICAgbGV0IGZpZWxkOiBzdHJpbmc7XG4gICAgICAgIGxldCBpZDogbnVtYmVyO1xuICAgICAgICBpZiAoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChyZWxhdGlvbikgJiYgIXJlbGF0aW9uLmhhc0pvaW5Db2x1bW4pIHtcbiAgICAgICAgICBjb25zdCByZWxhdGVkRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocmVsYXRpb24ud2l0aCk7XG4gICAgICAgICAgY29uc3QgcmVsYXRlZElkQ29sdW1uTmFtZSA9IHJlbGF0ZWRFbnRpdHkucHJvcHMuZmluZChcbiAgICAgICAgICAgIChwKSA9PiBpc1JlbGF0aW9uUHJvcChwKSAmJiBwLndpdGggPT09IGVudGl0eS5pZCxcbiAgICAgICAgICApPy5uYW1lO1xuICAgICAgICAgIGlmICghcmVsYXRlZElkQ29sdW1uTmFtZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3JlbGF0ZWRFbnRpdHkuaWR97J2YICR7ZW50aXR5LmlkfSDqtIDqs4Qg7ZSE66Gt7J2EIOywvuydhCDsiJgg7JeG7Iq164uI64ukLmApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmaWVsZCA9IGAke3JlbGF0ZWRJZENvbHVtbk5hbWV9X2lkYDtcbiAgICAgICAgICBpZCA9IHJvdy5pZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmaWVsZCA9IFwiaWRcIjtcbiAgICAgICAgICBpZCA9IHJvd1tgJHtyZWxhdGlvbi5uYW1lfV9pZGBdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZW50aXR5SWQ6IHJlbGF0aW9uLndpdGgsXG4gICAgICAgICAgZmllbGQsXG4gICAgICAgICAgaWQsXG4gICAgICAgIH07XG4gICAgICB9KVxuICAgICAgLmZpbHRlcigoYXJnKSA9PiBhcmcuaWQgIT09IG51bGwpO1xuXG4gICAgY29uc3QgcmVsUXVlcmllcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgYXJncy5tYXAoYXN5bmMgKGFyZ3MpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0SW1wb3J0UXVlcmllcyhhcmdzLmVudGl0eUlkLCBhcmdzLmZpZWxkLCBhcmdzLmlkKTtcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICByZXR1cm4gWy4uLnVuaXF1ZShyZWxRdWVyaWVzLnJldmVyc2UoKS5mbGF0KCkpLCBzZWxmUXVlcnldO1xuICB9XG5cbiAgYXN5bmMgZGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5fdGRiKSB7XG4gICAgICBhd2FpdCB0aGlzLl90ZGIuZGVzdHJveSgpO1xuICAgICAgdGhpcy5fdGRiID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2ZkYikge1xuICAgICAgYXdhaXQgdGhpcy5fZmRiLmRlc3Ryb3koKTtcbiAgICAgIHRoaXMuX2ZkYiA9IG51bGw7XG4gICAgfVxuICAgIGF3YWl0IEJhc2VNb2RlbC5kZXN0cm95KCk7XG4gIH1cblxuICBhc3luYyBnZXRGaXh0dXJlcyhcbiAgICBzb3VyY2VEQk5hbWU6IGtleW9mIFNvbmFtdURCQ29uZmlnLFxuICAgIHRhcmdldERCTmFtZToga2V5b2YgU29uYW11REJDb25maWcsXG4gICAgc2VhcmNoT3B0aW9uczogRml4dHVyZVNlYXJjaE9wdGlvbnMsXG4gICAgZHVwbGljYXRlQ2hlY2s/OiBEdXBsaWNhdGVDaGVja09wdGlvbnMsXG4gICkge1xuICAgIGNvbnN0IHNvdXJjZURCID0gY3JlYXRlS25leEluc3RhbmNlKFNvbmFtdS5kYkNvbmZpZ1tzb3VyY2VEQk5hbWVdKTtcbiAgICBjb25zdCB0YXJnZXREQiA9IGNyZWF0ZUtuZXhJbnN0YW5jZShTb25hbXUuZGJDb25maWdbdGFyZ2V0REJOYW1lXSk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBlbnRpdHlJZCwgZmllbGQsIHZhbHVlLCBzZWFyY2hUeXBlIH0gPSBzZWFyY2hPcHRpb25zO1xuXG4gICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG4gICAgICBjb25zdCBjb2x1bW4gPVxuICAgICAgICBlbnRpdHkucHJvcHMuZmluZCgocHJvcCkgPT4gcHJvcC5uYW1lID09PSBmaWVsZCk/LnR5cGUgPT09IFwicmVsYXRpb25cIlxuICAgICAgICAgID8gYCR7ZmllbGR9X2lkYFxuICAgICAgICAgIDogZmllbGQ7XG5cbiAgICAgIGxldCBxdWVyeSA9IHNvdXJjZURCKGVudGl0eS50YWJsZSk7XG4gICAgICBpZiAoc2VhcmNoVHlwZSA9PT0gXCJlcXVhbHNcIikge1xuICAgICAgICBxdWVyeSA9IHF1ZXJ5LndoZXJlKGNvbHVtbiwgdmFsdWUpO1xuICAgICAgfSBlbHNlIGlmIChzZWFyY2hUeXBlID09PSBcImxpa2VcIikge1xuICAgICAgICBxdWVyeSA9IHF1ZXJ5LndoZXJlKGNvbHVtbiwgXCJsaWtlXCIsIGAlJHt2YWx1ZX0lYCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJvd3MgPSBhd2FpdCBxdWVyeTtcbiAgICAgIGlmIChyb3dzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyByZWNvcmRzIGZvdW5kXCIpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmaXh0dXJlczogRml4dHVyZVJlY29yZFtdID0gW107XG4gICAgICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7XG4gICAgICAgIGNvbnN0IGluaXRpYWxSZWNvcmRzTGVuZ3RoID0gZml4dHVyZXMubGVuZ3RoO1xuICAgICAgICBjb25zdCBuZXdSZWNvcmRzID0gYXdhaXQgdGhpcy5jcmVhdGVGaXh0dXJlUmVjb3JkKGVudGl0eSwgcm93LCB7XG4gICAgICAgICAgX2RiOiBzb3VyY2VEQixcbiAgICAgICAgfSk7XG4gICAgICAgIGZpeHR1cmVzLnB1c2goLi4ubmV3UmVjb3Jkcyk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRGaXh0dXJlUmVjb3JkID0gZml4dHVyZXMuZmluZCgocikgPT4gci5maXh0dXJlSWQgPT09IGAke2VudGl0eUlkfSMke3Jvdy5pZH1gKTtcblxuICAgICAgICBpZiAoY3VycmVudEZpeHR1cmVSZWNvcmQpIHtcbiAgICAgICAgICAvLyDtmITsnqwgZml4dHVyZeuhnOu2gO2EsCDsg53shLHrkJwgZmV0Y2hlZFJlY29yZHMg7ISk7KCVXG4gICAgICAgICAgY3VycmVudEZpeHR1cmVSZWNvcmQuZmV0Y2hlZFJlY29yZHMgPSBmaXh0dXJlc1xuICAgICAgICAgICAgLmZpbHRlcigocikgPT4gci5maXh0dXJlSWQgIT09IGN1cnJlbnRGaXh0dXJlUmVjb3JkLmZpeHR1cmVJZClcbiAgICAgICAgICAgIC5zbGljZShpbml0aWFsUmVjb3Jkc0xlbmd0aClcbiAgICAgICAgICAgIC5tYXAoKHIpID0+IHIuZml4dHVyZUlkKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmb3IgYXdhaXQgKGNvbnN0IGZpeHR1cmUgb2YgZml4dHVyZXMpIHtcbiAgICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZml4dHVyZS5lbnRpdHlJZCk7XG5cbiAgICAgICAgLy8g7IKs7Jqp7J6QIOyngOyglSDsu6zrn7wg6riw7KSAIOykkeuztSDtmZXsnbgg4oaSIHRhcmdldFxuICAgICAgICBjb25zdCBjdXN0b21Db2x1bW5zID0gZHVwbGljYXRlQ2hlY2s/LmNvbHVtbnM/LltmaXh0dXJlLmVudGl0eUlkXTtcbiAgICAgICAgaWYgKGN1c3RvbUNvbHVtbnMgJiYgY3VzdG9tQ29sdW1ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3QgY3VzdG9tRHVwbGljYXRlUm93ID0gYXdhaXQgdGhpcy5jaGVja0R1cGxpY2F0ZUJ5Q29sdW1ucyhcbiAgICAgICAgICAgIHRhcmdldERCLFxuICAgICAgICAgICAgZW50aXR5LFxuICAgICAgICAgICAgZml4dHVyZSxcbiAgICAgICAgICAgIGN1c3RvbUNvbHVtbnMsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoY3VzdG9tRHVwbGljYXRlUm93KSB7XG4gICAgICAgICAgICBjb25zdCBbcmVjb3JkXSA9IGF3YWl0IHRoaXMuY3JlYXRlRml4dHVyZVJlY29yZChlbnRpdHksIGN1c3RvbUR1cGxpY2F0ZVJvdywge1xuICAgICAgICAgICAgICBzaW5nbGVSZWNvcmQ6IHRydWUsXG4gICAgICAgICAgICAgIF9kYjogdGFyZ2V0REIsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGZpeHR1cmUudGFyZ2V0ID0gcmVjb3JkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVuaXF1ZSBpbmRleCDquLDspIAg7KSR67O1IO2ZleyduCDihpIgZml4dHVyZS51bmlxdWVcbiAgICAgICAgY29uc3QgdW5pcXVlUm93ID0gYXdhaXQgdGhpcy5jaGVja1VuaXF1ZVZpb2xhdGlvbih0YXJnZXREQiwgZW50aXR5LCBmaXh0dXJlKTtcbiAgICAgICAgaWYgKHVuaXF1ZVJvdykge1xuICAgICAgICAgIGNvbnN0IFtyZWNvcmRdID0gYXdhaXQgdGhpcy5jcmVhdGVGaXh0dXJlUmVjb3JkKGVudGl0eSwgdW5pcXVlUm93LCB7XG4gICAgICAgICAgICBzaW5nbGVSZWNvcmQ6IHRydWUsXG4gICAgICAgICAgICBfZGI6IHRhcmdldERCLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGZpeHR1cmUudW5pcXVlID0gcmVjb3JkO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB1bmlxdWUoZml4dHVyZXMsIChmKSA9PiBmLmZpeHR1cmVJZCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChbdGFyZ2V0REIuZGVzdHJveSgpLCBzb3VyY2VEQi5kZXN0cm95KCldKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBjcmVhdGVGaXh0dXJlUmVjb3JkKFxuICAgIGVudGl0eTogRW50aXR5LFxuICAgIHJvdzoge1xuICAgICAgaWQ6IG51bWJlciB8IHN0cmluZztcbiAgICAgIFtrZXk6IHN0cmluZ106IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBudWxsO1xuICAgIH0sXG4gICAgb3B0aW9ucz86IHtcbiAgICAgIHNpbmdsZVJlY29yZD86IGJvb2xlYW47XG4gICAgICBfZGI/OiBLbmV4O1xuICAgIH0sXG4gICk6IFByb21pc2U8Rml4dHVyZVJlY29yZFtdPiB7XG4gICAgY29uc3QgcmVjb3JkczogRml4dHVyZVJlY29yZFtdID0gW107XG4gICAgY29uc3QgdmlzaXRlZEVudGl0aWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICBjb25zdCBjcmVhdGUgPSBhc3luYyAoXG4gICAgICBlbnRpdHk6IEVudGl0eSxcbiAgICAgIHJvdzoge1xuICAgICAgICBpZDogbnVtYmVyIHwgc3RyaW5nO1xuICAgICAgICBba2V5OiBzdHJpbmddOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgbnVsbDtcbiAgICAgIH0sXG4gICAgKSA9PiB7XG4gICAgICBjb25zdCBmaXh0dXJlSWQgPSBgJHtlbnRpdHkuaWR9IyR7cm93LmlkfWA7XG4gICAgICBpZiAodmlzaXRlZEVudGl0aWVzLmhhcyhmaXh0dXJlSWQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHZpc2l0ZWRFbnRpdGllcy5hZGQoZml4dHVyZUlkKTtcblxuICAgICAgY29uc3QgcmVjb3JkOiBGaXh0dXJlUmVjb3JkID0ge1xuICAgICAgICBmaXh0dXJlSWQsXG4gICAgICAgIGVudGl0eUlkOiBlbnRpdHkuaWQsXG4gICAgICAgIGlkOiByb3cuaWQsXG4gICAgICAgIGNvbHVtbnM6IHt9LFxuICAgICAgICBmZXRjaGVkUmVjb3JkczogW10sXG4gICAgICAgIGJlbG9uZ3NSZWNvcmRzOiBbXSxcbiAgICAgIH07XG5cbiAgICAgIGZvciAoY29uc3QgcHJvcCBvZiBlbnRpdHkucHJvcHMpIHtcbiAgICAgICAgaWYgKGlzVmlydHVhbFByb3AocHJvcCkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlY29yZC5jb2x1bW5zW3Byb3AubmFtZV0gPSB7XG4gICAgICAgICAgcHJvcDogcHJvcCxcbiAgICAgICAgICB2YWx1ZTogcm93W3Byb3AubmFtZV0sXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgZGIgPSBvcHRpb25zPy5fZGIgPz8gQmFzZU1vZGVsLmdldERCKFwid1wiKTtcbiAgICAgICAgaWYgKGlzTWFueVRvTWFueVJlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgICAgICAgIGNvbnN0IHJlbGF0ZWRFbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChwcm9wLndpdGgpO1xuICAgICAgICAgIGNvbnN0IHRocm91Z2hUYWJsZSA9IHByb3Auam9pblRhYmxlO1xuICAgICAgICAgIGNvbnN0IGZyb21Db2x1bW4gPSBgJHtpbmZsZWN0aW9uLnNpbmd1bGFyaXplKGVudGl0eS50YWJsZSl9X2lkYDtcbiAgICAgICAgICBjb25zdCB0b0NvbHVtbiA9IGAke2luZmxlY3Rpb24uc2luZ3VsYXJpemUocmVsYXRlZEVudGl0eS50YWJsZSl9X2lkYDtcblxuICAgICAgICAgIGNvbnN0IHJlbGF0ZWRJZHMgPSBhd2FpdCBkYih0aHJvdWdoVGFibGUpLndoZXJlKGZyb21Db2x1bW4sIHJvdy5pZCkucGx1Y2sodG9Db2x1bW4pO1xuICAgICAgICAgIHJlY29yZC5jb2x1bW5zW3Byb3AubmFtZV0udmFsdWUgPSByZWxhdGVkSWRzO1xuICAgICAgICB9IGVsc2UgaWYgKGlzSGFzTWFueVJlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgICAgICAgIGNvbnN0IHJlbGF0ZWRFbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChwcm9wLndpdGgpO1xuICAgICAgICAgIGNvbnN0IHJlbGF0ZWRJZHMgPSBhd2FpdCBkYihyZWxhdGVkRW50aXR5LnRhYmxlKVxuICAgICAgICAgICAgLndoZXJlKHByb3Auam9pbkNvbHVtbiwgcm93LmlkKVxuICAgICAgICAgICAgLnBsdWNrKFwiaWRcIik7XG4gICAgICAgICAgcmVjb3JkLmNvbHVtbnNbcHJvcC5uYW1lXS52YWx1ZSA9IHJlbGF0ZWRJZHM7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChwcm9wKSAmJiAhcHJvcC5oYXNKb2luQ29sdW1uKSB7XG4gICAgICAgICAgLy8g7Jet67Cp7ZalIE9uZVRvT25lOiBGS+ulvCDqsIDsp4Qg6rSA66CoIOyXlO2LsO2LsOulvCDssL7sirXri4jri6RcbiAgICAgICAgICAvLyDsmIjsi5w6IFVzZXIgT25lVG9PbmUgRW1wbG95ZWUgKEVtcGxveWVl6rCAIHVzZXJfaWQgRkvrpbwg6rCA7KeQKVxuICAgICAgICAgIGNvbnN0IHJlbGF0ZWRFbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChwcm9wLndpdGgpO1xuICAgICAgICAgIGNvbnN0IHJlbGF0ZWRQcm9wID0gcmVsYXRlZEVudGl0eS5wcm9wcy5maW5kKFxuICAgICAgICAgICAgKHApID0+IGlzUmVsYXRpb25Qcm9wKHApICYmIHAud2l0aCA9PT0gZW50aXR5LmlkLFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKHJlbGF0ZWRQcm9wICYmIGlzUmVsYXRpb25Qcm9wKHJlbGF0ZWRQcm9wKSkge1xuICAgICAgICAgICAgLy8g6rSA66CoIOyXlO2LsO2LsOyXkOyEnCBGSyDsu6zrn7zsnLzroZwg7L+866as7ZWp64uI64ukIChpZOqwgCDslYTri5gpXG4gICAgICAgICAgICBjb25zdCBma0NvbHVtbiA9IGAke3JlbGF0ZWRQcm9wLm5hbWV9X2lkYDtcbiAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRSb3cgPSBhd2FpdCBkYihyZWxhdGVkRW50aXR5LnRhYmxlKS53aGVyZShma0NvbHVtbiwgcm93LmlkKS5maXJzdCgpO1xuICAgICAgICAgICAgcmVjb3JkLmNvbHVtbnNbcHJvcC5uYW1lXS52YWx1ZSA9IHJlbGF0ZWRSb3c/LmlkO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChpc1JlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgICAgICAgIGNvbnN0IHJlbGF0ZWRJZCA9IHJvd1tgJHtwcm9wLm5hbWV9X2lkYF07XG4gICAgICAgICAgcmVjb3JkLmNvbHVtbnNbcHJvcC5uYW1lXS52YWx1ZSA9IHJlbGF0ZWRJZDtcbiAgICAgICAgICBpZiAocmVsYXRlZElkKSB7XG4gICAgICAgICAgICByZWNvcmQuYmVsb25nc1JlY29yZHMucHVzaChgJHtwcm9wLndpdGh9IyR7cmVsYXRlZElkfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIW9wdGlvbnM/LnNpbmdsZVJlY29yZCAmJiByZWxhdGVkSWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRFbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChwcm9wLndpdGgpO1xuICAgICAgICAgICAgY29uc3QgcmVsYXRlZFJvdyA9IGF3YWl0IGRiKHJlbGF0ZWRFbnRpdHkudGFibGUpLndoZXJlKFwiaWRcIiwgcmVsYXRlZElkKS5maXJzdCgpO1xuICAgICAgICAgICAgaWYgKHJlbGF0ZWRSb3cpIHtcbiAgICAgICAgICAgICAgYXdhaXQgY3JlYXRlKHJlbGF0ZWRFbnRpdHksIHJlbGF0ZWRSb3cpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZWNvcmRzLnB1c2gocmVjb3JkKTtcbiAgICB9O1xuXG4gICAgYXdhaXQgY3JlYXRlKGVudGl0eSwgcm93KTtcblxuICAgIHJldHVybiByZWNvcmRzO1xuICB9XG5cbiAgLyoqXG4gICAqIDEuIFJlbGF0aW9uR3JhcGjroZwgZml4dHVyZSDri6jsnIQg7IK97J6FIOyInOyEnCDqs4TsgrAgKHNlbGYtcmVmZXJlbmNlIO2PrO2VqClcbiAgICogMi4g7YWM7J2067iU67OEIOugiOuyqOuzhOuhnCBVcHNlcnRCdWlsZGVy7JeQIOuTseuhnSDrsI8gdXBzZXJ0IOyLpO2WiVxuICAgKiAzLiDsiJzshJwg6riw67CYIHV1aWTihpJpZCDrp6TtlZEgKFVwc2VydEJ1aWxkZXLqsIAgdXVpZOulvCBEQuyXkCDsoIDsnqXtlZjsp4Ag7JWK7Jy866+A66GcKVxuICAgKlxuICAgKiBVcHNlcnRCdWlsZGVy64qUIHNlbGYtcmVmZXJlbmNl6rCAIOyeiOycvOuptCBidWlsZEluc2VydExldmVscygp66GcIOyerOygleugrO2VmOyXrFxuICAgKiDrk7HroZ0g7Iic7ISc7JmAIOuwmO2ZmCDsiJzshJzqsIAg64us65287KeIIOyImCDsnojsirXri4jri6QuIOydtOulvCDrsKnsp4DtlZjquLAg7JyE7ZW0XG4gICAqIEZpeHR1cmVNYW5hZ2Vy6rCAIOugiOuyqOuzhOuhnCDrgpjriKDshJwg7LKY66as7ZWY7JesIOqwgSB1cHNlcnQg7Zi47Lac7JeQ7ISc64qUXG4gICAqIHNlbGYtcmVmZXJlbmNl6rCAIOyXhuuPhOuhnSDtlanri4jri6QuXG4gICAqL1xuICBhc3luYyBpbnNlcnRGaXh0dXJlcyhcbiAgICBkYk5hbWU6IGtleW9mIFNvbmFtdURCQ29uZmlnLFxuICAgIF9maXh0dXJlczogRml4dHVyZVJlY29yZFtdLFxuICApOiBQcm9taXNlPEZpeHR1cmVJbXBvcnRSZXN1bHRbXT4ge1xuICAgIGNvbnN0IGZpeHR1cmVzID0gdW5pcXVlKF9maXh0dXJlcywgKGYpID0+IGYuZml4dHVyZUlkKTtcblxuICAgIC8vIOy0iOq4sO2ZlFxuICAgIHRoaXMuYnVpbGRlciA9IG5ldyBVcHNlcnRCdWlsZGVyKCk7XG4gICAgdGhpcy5maXh0dXJlUmVmTWFwID0gbmV3IE1hcCgpO1xuICAgIHRoaXMuc2tpcHBlZEZpeHR1cmVzID0gbmV3IE1hcCgpO1xuXG4gICAgLy8g67OR66CsIO2FjOyKpO2KuCDrqqjrk5zsl5DshJzripQgd29ya2Vy67OEIERC7JeQIOyggOyepVxuICAgIGNvbnN0IGRiQ29uZmlnID1cbiAgICAgIHByb2Nlc3MuZW52LlNPTkFNVV9XT1JLRVJfREIgPT09IFwidHJ1ZVwiICYmIHByb2Nlc3MuZW52LlZJVEVTVF9QT09MX0lEXG4gICAgICAgID8gKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHdvcmtlcklkID0gcGFyc2VJbnQocHJvY2Vzcy5lbnYuVklURVNUX1BPT0xfSUQgPz8gXCIxXCIsIDEwKTtcbiAgICAgICAgICAgIGNvbnN0IGJhc2VDb25maWcgPSBTb25hbXUuZGJDb25maWdbZGJOYW1lXTtcbiAgICAgICAgICAgIGNvbnN0IGNvbm5lY3Rpb24gPSBiYXNlQ29uZmlnLmNvbm5lY3Rpb24gYXMgeyBkYXRhYmFzZTogc3RyaW5nIH07XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAuLi5iYXNlQ29uZmlnLFxuICAgICAgICAgICAgICBjb25uZWN0aW9uOiB7IC4uLmNvbm5lY3Rpb24sIGRhdGFiYXNlOiBgJHtjb25uZWN0aW9uLmRhdGFiYXNlfV8ke3dvcmtlcklkfWAgfSxcbiAgICAgICAgICAgICAgcG9vbDogeyBtaW46IDEsIG1heDogMSB9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9KSgpXG4gICAgICAgIDogU29uYW11LmRiQ29uZmlnW2RiTmFtZV07XG4gICAgY29uc3QgZGIgPSBjcmVhdGVLbmV4SW5zdGFuY2UoZGJDb25maWcpO1xuICAgIGNvbnN0IHJlc3VsdHM6IEZpeHR1cmVJbXBvcnRSZXN1bHRbXSA9IFtdO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIDEuIFJlbGF0aW9uR3JhcGjroZwgZml4dHVyZSDri6jsnIQg7IK97J6FIOyInOyEnCDqs4TsgrBcbiAgICAgIHRoaXMucmVsYXRpb25HcmFwaC5idWlsZEdyYXBoKGZpeHR1cmVzKTtcbiAgICAgIGNvbnN0IGluc2VydGlvbk9yZGVyID0gdGhpcy5yZWxhdGlvbkdyYXBoLmdldEluc2VydGlvbk9yZGVyKCk7XG5cbiAgICAgIC8vIDIuIOyKpO2Cte2VoCBmaXh0dXJlIOuovOyggCDsspjrpqwgKG92ZXJyaWRlIOyytO2BrClcbiAgICAgIGZvciAoY29uc3QgZml4dHVyZUlkIG9mIGluc2VydGlvbk9yZGVyKSB7XG4gICAgICAgIGNvbnN0IGZpeHR1cmUgPSBmaXh0dXJlcy5maW5kKChmKSA9PiBmLmZpeHR1cmVJZCA9PT0gZml4dHVyZUlkKTtcbiAgICAgICAgaWYgKCFmaXh0dXJlKSBjb250aW51ZTtcblxuICAgICAgICBjb25zdCBoYXNUYXJnZXQgPSAhIWZpeHR1cmUudGFyZ2V0O1xuICAgICAgICBjb25zdCBoYXNVbmlxdWUgPSAhIWZpeHR1cmUudW5pcXVlO1xuICAgICAgICBjb25zdCBoYXNEdXBsaWNhdGUgPSBoYXNUYXJnZXQgfHwgaGFzVW5pcXVlO1xuXG4gICAgICAgIC8vIOykkeuzteydtCDsnojqs6Agb3ZlcnJpZGU9ZmFsc2Xsnbgg6rK97JqwOiDsiqTtgrVcbiAgICAgICAgaWYgKGhhc0R1cGxpY2F0ZSAmJiAhZml4dHVyZS5vdmVycmlkZSkge1xuICAgICAgICAgIC8vIOq4sOyhtCDroIjsvZTrk5wgSUQg7KCA7J6lICh1bmlxdWUg7Jqw7ISgLCDsl4bsnLzrqbQgdGFyZ2V0KVxuICAgICAgICAgIGNvbnN0IGV4aXN0aW5nSWQgPSBmaXh0dXJlLnVuaXF1ZT8uaWQgPz8gZml4dHVyZS50YXJnZXQ/LmlkO1xuICAgICAgICAgIGFzc2VydChleGlzdGluZ0lkKTtcbiAgICAgICAgICB0aGlzLnNraXBwZWRGaXh0dXJlcy5zZXQoZml4dHVyZUlkLCB7XG4gICAgICAgICAgICBlbnRpdHlJZDogZml4dHVyZS5lbnRpdHlJZCxcbiAgICAgICAgICAgIGV4aXN0aW5nSWQsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICBjaGFsay55ZWxsb3coXG4gICAgICAgICAgICAgICAgYFNraXBwZWQgJHtmaXh0dXJlLmVudGl0eUlkfSMke2ZpeHR1cmUuaWR9IChleGlzdGluZzogIyR7ZXhpc3RpbmdJZH0sIG92ZXJyaWRlOiBmYWxzZSlgLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyAzLiDthYzsnbTruJTrs4QgZml4dHVyZSDqt7jro7ntmZQgKGluc2VydGlvbk9yZGVyIOyInOyEnCDquLDrsJgpXG4gICAgICBjb25zdCBmaXh0dXJlc0J5VGFibGUgPSBuZXcgTWFwPHN0cmluZywgRml4dHVyZVJlY29yZFtdPigpO1xuICAgICAgY29uc3QgdGFibGVPcmRlcjogc3RyaW5nW10gPSBbXTtcblxuICAgICAgZm9yIChjb25zdCBmaXh0dXJlSWQgb2YgaW5zZXJ0aW9uT3JkZXIpIHtcbiAgICAgICAgLy8g7Iqk7YK165CcIGZpeHR1cmUg7KCc7Jm4XG4gICAgICAgIGlmICh0aGlzLnNraXBwZWRGaXh0dXJlcy5oYXMoZml4dHVyZUlkKSkgY29udGludWU7XG5cbiAgICAgICAgY29uc3QgZml4dHVyZSA9IGZpeHR1cmVzLmZpbmQoKGYpID0+IGYuZml4dHVyZUlkID09PSBmaXh0dXJlSWQpO1xuICAgICAgICBpZiAoIWZpeHR1cmUpIGNvbnRpbnVlO1xuXG4gICAgICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGZpeHR1cmUuZW50aXR5SWQpO1xuICAgICAgICBjb25zdCB0YWJsZU5hbWUgPSBlbnRpdHkudGFibGU7XG5cbiAgICAgICAgaWYgKCFmaXh0dXJlc0J5VGFibGUuaGFzKHRhYmxlTmFtZSkpIHtcbiAgICAgICAgICBmaXh0dXJlc0J5VGFibGUuc2V0KHRhYmxlTmFtZSwgW10pO1xuICAgICAgICAgIHRhYmxlT3JkZXIucHVzaCh0YWJsZU5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGZpeHR1cmVzQnlUYWJsZS5nZXQodGFibGVOYW1lKT8ucHVzaChmaXh0dXJlKTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgZGIudHJhbnNhY3Rpb24oYXN5bmMgKHRyeCkgPT4ge1xuICAgICAgICBjb25zdCBpbnNlcnRlZElkc0J5VGFibGUgPSBuZXcgTWFwPHN0cmluZywgTWFwPHN0cmluZywgbnVtYmVyIHwgc3RyaW5nPj4oKTtcblxuICAgICAgICAvLyA0LiDthYzsnbTruJTrs4Qg66CI67Ko67OEIOyymOumrFxuICAgICAgICBmb3IgKGNvbnN0IHRhYmxlTmFtZSBvZiB0YWJsZU9yZGVyKSB7XG4gICAgICAgICAgY29uc3QgdGFibGVGaXh0dXJlcyA9IGZpeHR1cmVzQnlUYWJsZS5nZXQodGFibGVOYW1lKSA/PyBbXTtcbiAgICAgICAgICBjb25zdCBsZXZlbHMgPSB0aGlzLmdyb3VwRml4dHVyZXNCeUxldmVsKHRhYmxlRml4dHVyZXMpO1xuXG4gICAgICAgICAgZm9yIChjb25zdCBsZXZlbEZpeHR1cmVzIG9mIGxldmVscykge1xuICAgICAgICAgICAgLy8g7ZW064u5IOugiOuyqOydmCBmaXh0dXJl65OkIHJlZ2lzdGVyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGZpeHR1cmUgb2YgbGV2ZWxGaXh0dXJlcykge1xuICAgICAgICAgICAgICB0aGlzLnJlZ2lzdGVyRml4dHVyZShmaXh0dXJlLCBpbnNlcnRlZElkc0J5VGFibGUpO1xuICAgICAgICAgICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICAgIGNoYWxrLmJsdWUoXG4gICAgICAgICAgICAgICAgICAgIGBSZWdpc3RlcmVkICR7Zml4dHVyZS5lbnRpdHlJZH0jJHtmaXh0dXJlLmlkfSR7Zml4dHVyZS5vdmVycmlkZSA/IGAgKG92ZXJyaWRlKWAgOiBcIlwifWAsXG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIHVwc2VydCDsi6Ttlokg7KCEIHV1aWQg66qp66GdIOyggOyepVxuICAgICAgICAgICAgY29uc3QgdGFibGUgPSB0aGlzLmJ1aWxkZXIuZ2V0VGFibGUodGFibGVOYW1lKTtcbiAgICAgICAgICAgIGNvbnN0IHV1aWRzID0gdGFibGUucm93cy5tYXAoKHJvdykgPT4gcm93LnV1aWQgYXMgc3RyaW5nKTtcblxuICAgICAgICAgICAgIWlzVGVzdCgpICYmXG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgIGNoYWxrLmJsdWUoXG4gICAgICAgICAgICAgICAgICBgVXBzZXJ0aW5nICR7dGFibGVOYW1lfSB3aXRoICR7dXVpZHMubGVuZ3RofSByb3dzIChsZXZlbCAke2xldmVscy5pbmRleE9mKGxldmVsRml4dHVyZXMpICsgMX0vJHtsZXZlbHMubGVuZ3RofSlgLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCBpZHMgPSAoYXdhaXQgdGhpcy5idWlsZGVyLnVwc2VydChcbiAgICAgICAgICAgICAgdHJ4LFxuICAgICAgICAgICAgICB0YWJsZU5hbWUgYXMga2V5b2YgRGF0YWJhc2VTY2hlbWFFeHRlbmQsXG4gICAgICAgICAgICApKSBhcyAobnVtYmVyIHwgc3RyaW5nKVtdO1xuXG4gICAgICAgICAgICAvLyDsiJzshJwg6riw67CYIHV1aWQgLT4gaWQg66ek7ZWRXG4gICAgICAgICAgICAvLyBzZWxmLXJlZmVyZW5jZeqwgCDsl4bsnLzrr4DroZwg65Ox66GdIOyInOyEnCA9IOuwmO2ZmCDsiJzshJwg67O07J6lXG4gICAgICAgICAgICBpZiAodXVpZHMubGVuZ3RoID4gMCAmJiB1dWlkcy5sZW5ndGggPT09IGlkcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgY29uc3QgZXhpc3RpbmdNYXAgPVxuICAgICAgICAgICAgICAgIGluc2VydGVkSWRzQnlUYWJsZS5nZXQodGFibGVOYW1lKSA/PyBuZXcgTWFwPHN0cmluZywgbnVtYmVyIHwgc3RyaW5nPigpO1xuICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHV1aWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgZXhpc3RpbmdNYXAuc2V0KHV1aWRzW2ldLCBpZHNbaV0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGluc2VydGVkSWRzQnlUYWJsZS5zZXQodGFibGVOYW1lLCBleGlzdGluZ01hcCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHV1aWRzLmxlbmd0aCAhPT0gaWRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgICAgY2hhbGsueWVsbG93KFxuICAgICAgICAgICAgICAgICAgYFdhcm5pbmc6IHV1aWQgY291bnQgKCR7dXVpZHMubGVuZ3RofSkgIT0gaWQgY291bnQgKCR7aWRzLmxlbmd0aH0pIGZvciAke3RhYmxlTmFtZX1gLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gNS4gTWFueVRvTWFueSDqtIDqs4Qg7LKY66asXG4gICAgICAgIGF3YWl0IHRoaXMucHJvY2Vzc01hbnlUb01hbnlSZWxhdGlvbnModHJ4LCBmaXh0dXJlcywgaW5zZXJ0ZWRJZHNCeVRhYmxlKTtcblxuICAgICAgICAvLyA2LiBQb3N0Z3JlU1FMIOyLnO2AgOyKpCDrpqzshYtcbiAgICAgICAgLy8gRml4dHVyZSDsgr3snoUg7ZuEIOqwgSDthYzsnbTruJTsnZggSUQg7Iuc7YCA7Iqk66W8IOy1nOuMgCBJRCDqsJLsnLzroZwg7JeF642w7J207Yq47ZWp64uI64ukLlxuICAgICAgICAvLyDsnbTroIfqsowg7ZWY7KeAIOyViuycvOuptCDri6TsnYwgSU5TRVJUIOyLnCBJROqwgCAyMDAw67KI64yA66GcIOyDneyEseuQoCDsiJgg7J6I7Iq164uI64ukLlxuICAgICAgICAhaXNUZXN0KCkgJiYgY29uc29sZS5sb2coY2hhbGsuYmx1ZShcIlJlc2V0dGluZyBzZXF1ZW5jZXMuLi5cIikpO1xuICAgICAgICBmb3IgKGNvbnN0IHRhYmxlTmFtZSBvZiB0YWJsZU9yZGVyKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIEVudGl0eeulvCDssL7slYTshJwgaWQg7YOA7J6FIO2ZleyduFxuICAgICAgICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXRBbGxFbnRpdGllcygpLmZpbmQoXG4gICAgICAgICAgICAgIChlKSA9PiBlLnRhYmxlID09PSB0YWJsZU5hbWUgfHwgZS5pZC50b0xvd2VyQ2FzZSgpID09PSB0YWJsZU5hbWUsXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBpZiAoZW50aXR5KSB7XG4gICAgICAgICAgICAgIGNvbnN0IGlkUHJvcCA9IGVudGl0eS5wcm9wcy5maW5kKChwKSA9PiBwLm5hbWUgPT09IFwiaWRcIik7XG4gICAgICAgICAgICAgIGNvbnN0IGlkVHlwZSA9IGlkUHJvcD8udHlwZTtcblxuICAgICAgICAgICAgICAvLyBpbnRlZ2VyL2JpZ0ludGVnZXLsnbTqsbDrgpgsIHN0cmluZ+ydtOyngOunjCBmaXh0dXJlU3RyYXRlZ3k9c2VxdWVuY2Xsnbgg6rK97Jqw7JeQ66eMIOumrOyFi+2VqeuLiOuLpFxuICAgICAgICAgICAgICBjb25zdCB1c2VzU2VxdWVuY2UgPVxuICAgICAgICAgICAgICAgIGlkVHlwZSA9PT0gXCJpbnRlZ2VyXCIgfHxcbiAgICAgICAgICAgICAgICBpZFR5cGUgPT09IFwiYmlnSW50ZWdlclwiIHx8XG4gICAgICAgICAgICAgICAgaWRQcm9wPy5jb25lPy5maXh0dXJlU3RyYXRlZ3kgPT09IFwic2VxdWVuY2VcIjtcblxuICAgICAgICAgICAgICBpZiAoIXVzZXNTZXF1ZW5jZSkge1xuICAgICAgICAgICAgICAgICFpc1Rlc3QoKSAmJlxuICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgICAgIGNoYWxrLmdyYXkoXG4gICAgICAgICAgICAgICAgICAgICAgYFNraXBwZWQgc2VxdWVuY2UgcmVzZXQgZm9yICR7dGFibGVOYW1lfSAoaWQgdHlwZTogJHtpZFR5cGUgfHwgXCJ1bmtub3duXCJ9KWAsXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIO2FjOydtOu4lOydmCDstZzrjIAgSUQg7KGw7ZqMIChzdHJpbmcg7YOA7J6F7J2AIOyIq+yekCDsupDsiqTtjIUg7ZWE7JqUKVxuICAgICAgICAgICAgY29uc3QgZW50aXR5MiA9IEVudGl0eU1hbmFnZXIuZ2V0QWxsRW50aXRpZXMoKS5maW5kKFxuICAgICAgICAgICAgICAoZSkgPT4gZS50YWJsZSA9PT0gdGFibGVOYW1lIHx8IGUuaWQudG9Mb3dlckNhc2UoKSA9PT0gdGFibGVOYW1lLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IGlkVHlwZTIgPSBlbnRpdHkyPy5wcm9wcy5maW5kKChwKSA9PiBwLm5hbWUgPT09IFwiaWRcIik/LnR5cGU7XG4gICAgICAgICAgICBjb25zdCBtYXhJZFJlc3VsdCA9XG4gICAgICAgICAgICAgIGlkVHlwZTIgPT09IFwic3RyaW5nXCJcbiAgICAgICAgICAgICAgICA/IGF3YWl0IHRyeFxuICAgICAgICAgICAgICAgICAgICAucmF3KGBTRUxFQ1QgTUFYKGlkOjpiaWdpbnQpIGFzIG1heF9pZCBGUk9NIFwiJHt0YWJsZU5hbWV9XCJgKVxuICAgICAgICAgICAgICAgICAgICAudGhlbigocikgPT4gci5yb3dzWzBdKVxuICAgICAgICAgICAgICAgIDogYXdhaXQgdHJ4KHRhYmxlTmFtZSkubWF4KFwiaWQgYXMgbWF4X2lkXCIpLmZpcnN0KCk7XG4gICAgICAgICAgICBjb25zdCBtYXhJZCA9IG1heElkUmVzdWx0Py5tYXhfaWQ7XG5cbiAgICAgICAgICAgIGlmIChtYXhJZCAhPT0gbnVsbCAmJiBtYXhJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIC8vIOyLnO2AgOyKpOuqheydhCBwZ19nZXRfc2VyaWFsX3NlcXVlbmNl66GcIOyViOyghO2VmOqyjCDsobDtmoxcbiAgICAgICAgICAgICAgYXdhaXQgdHJ4LnJhdyhgU0VMRUNUIHNldHZhbChwZ19nZXRfc2VyaWFsX3NlcXVlbmNlKD8sICdpZCcpLCA/KWAsIFtcbiAgICAgICAgICAgICAgICB0YWJsZU5hbWUsXG4gICAgICAgICAgICAgICAgbWF4SWQsXG4gICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICAhaXNUZXN0KCkgJiYgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oYFJlc2V0IHNlcXVlbmNlIGZvciAke3RhYmxlTmFtZX06ICR7bWF4SWR9YCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKF9lcnIpIHtcbiAgICAgICAgICAgIC8vIOyLnO2AgOyKpOqwgCDsl4bripQg7YWM7J2067iUKGpvaW4gdGFibGUg65OxKeydgCDrrLTsi5xcbiAgICAgICAgICAgICFpc1Rlc3QoKSAmJiBjb25zb2xlLmxvZyhjaGFsay5ncmF5KGBTa2lwcGVkIHNlcXVlbmNlIHJlc2V0IGZvciAke3RhYmxlTmFtZX1gKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gNy4g6rKw6rO8IOyImOynkVxuICAgICAgICBmb3IgKGNvbnN0IGZpeHR1cmUgb2YgZml4dHVyZXMpIHtcbiAgICAgICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChmaXh0dXJlLmVudGl0eUlkKTtcblxuICAgICAgICAgIC8vIOyKpO2CteuQnCBmaXh0dXJl64qUIOq4sOyhtCDroIjsvZTrk5wg7KCV67O066GcIOqysOqzvCDstpTqsIBcbiAgICAgICAgICBjb25zdCBza2lwcGVkID0gdGhpcy5za2lwcGVkRml4dHVyZXMuZ2V0KGZpeHR1cmUuZml4dHVyZUlkKTtcbiAgICAgICAgICBpZiAoc2tpcHBlZCkge1xuICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHtcbiAgICAgICAgICAgICAgZW50aXR5SWQ6IGZpeHR1cmUuZW50aXR5SWQsXG4gICAgICAgICAgICAgIGRhdGE6IGF3YWl0IHRyeChlbnRpdHkudGFibGUpLndoZXJlKFwiaWRcIiwgc2tpcHBlZC5leGlzdGluZ0lkKS5maXJzdCgpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCByZWYgPSB0aGlzLmZpeHR1cmVSZWZNYXAuZ2V0KGZpeHR1cmUuZml4dHVyZUlkKTtcbiAgICAgICAgICBpZiAocmVmKSB7XG4gICAgICAgICAgICBjb25zdCB1dWlkVG9JZCA9IGluc2VydGVkSWRzQnlUYWJsZS5nZXQoZW50aXR5LnRhYmxlKTtcbiAgICAgICAgICAgIGNvbnN0IGluc2VydGVkSWQgPSB1dWlkVG9JZD8uZ2V0KHJlZi51dWlkKTtcblxuICAgICAgICAgICAgaWYgKGluc2VydGVkSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICByZXN1bHRzLnB1c2goe1xuICAgICAgICAgICAgICAgIGVudGl0eUlkOiBmaXh0dXJlLmVudGl0eUlkLFxuICAgICAgICAgICAgICAgIGRhdGE6IGF3YWl0IHRyeChlbnRpdHkudGFibGUpLndoZXJlKFwiaWRcIiwgaW5zZXJ0ZWRJZCkuZmlyc3QoKSxcbiAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgIWlzVGVzdCgpICYmXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgICBjaGFsay5ncmVlbihgSW5zZXJ0ZWQgaW50byAke2VudGl0eS50YWJsZX06ICMke2ZpeHR1cmUuaWR9IC0+ICMke2luc2VydGVkSWR9YCksXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCBkYi5kZXN0cm95KCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuaXF1ZShyZXN1bHRzLCAocikgPT4gYCR7ci5lbnRpdHlJZH0jJHtyLmRhdGEuaWR9YCk7XG4gIH1cblxuICAvKipcbiAgICogRml4dHVyZVJlY29yZOulvCBVcHNlcnRCdWlsZGVy7JeQIOuTseuhnVxuICAgKiBAcGFyYW0gaW5zZXJ0ZWRJZHNCeVRhYmxlIOydtOuvuCB1cHNlcnTrkJwg7YWM7J2067iU7J2YIHV1aWTihpJpZCDrp6TtlZEgKOugiOuyqOuzhCDsspjrpqwg7IucIOyCrOyaqSlcbiAgICovXG4gIHByaXZhdGUgcmVnaXN0ZXJGaXh0dXJlKFxuICAgIGZpeHR1cmU6IEZpeHR1cmVSZWNvcmQsXG4gICAgaW5zZXJ0ZWRJZHNCeVRhYmxlPzogTWFwPHN0cmluZywgTWFwPHN0cmluZywgbnVtYmVyIHwgc3RyaW5nPj4sXG4gICk6IFVCUmVmIHtcbiAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChmaXh0dXJlLmVudGl0eUlkKTtcbiAgICBjb25zdCByb3c6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG5cbiAgICAvLyBPdmVycmlkZSDrqqjrk5wg7YyQ64uoOiB0YXJnZXQg65iQ64qUIHVuaXF1ZeqwgCDsnojqs6Agb3ZlcnJpZGU9dHJ1ZeyduCDqsr3smrBcbiAgICBjb25zdCBleGlzdGluZ1JlY29yZCA9IGZpeHR1cmUudGFyZ2V0ID8/IGZpeHR1cmUudW5pcXVlO1xuICAgIGNvbnN0IGlzT3ZlcnJpZGVNb2RlID0gZml4dHVyZS5vdmVycmlkZSAmJiBleGlzdGluZ1JlY29yZDtcblxuICAgIGZvciAoY29uc3QgW3Byb3BOYW1lLCBjb2x1bW5dIG9mIE9iamVjdC5lbnRyaWVzKGZpeHR1cmUuY29sdW1ucykpIHtcbiAgICAgIGNvbnN0IHByb3AgPSBjb2x1bW4ucHJvcDtcblxuICAgICAgaWYgKGlzVmlydHVhbFByb3AocHJvcCkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIEdlbmVyYXRlZCBjb2x1bW7snYAgSU5TRVJU7JeQ7IScIOygnOyZuCAoRELqsIAg7J6Q64+ZIOyDneyEsSlcbiAgICAgIGlmIChcImdlbmVyYXRlZFwiIGluIHByb3AgJiYgcHJvcC5nZW5lcmF0ZWQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIGlkIOyymOumrFxuICAgICAgaWYgKHByb3BOYW1lID09PSBcImlkXCIpIHtcbiAgICAgICAgY29uc3QgaWRQcm9wID0gZW50aXR5LnByb3BzLmZpbmQoKHApID0+IHAubmFtZSA9PT0gXCJpZFwiKTtcbiAgICAgICAgY29uc3QgdXNlc1NlcXVlbmNlID1cbiAgICAgICAgICBpZFByb3A/LnR5cGUgPT09IFwiaW50ZWdlclwiIHx8XG4gICAgICAgICAgaWRQcm9wPy50eXBlID09PSBcImJpZ0ludGVnZXJcIiB8fFxuICAgICAgICAgIGlkUHJvcD8uY29uZT8uZml4dHVyZVN0cmF0ZWd5ID09PSBcInNlcXVlbmNlXCI7XG5cbiAgICAgICAgaWYgKGlzT3ZlcnJpZGVNb2RlICYmIGV4aXN0aW5nUmVjb3JkKSB7XG4gICAgICAgICAgLy8gT3ZlcnJpZGU6IOq4sOyhtCDroIjsvZTrk5zsnZgg6rCSIOyCrOyaqSDihpIgVVBEQVRFXG4gICAgICAgICAgcm93W3Byb3BOYW1lXSA9IGV4aXN0aW5nUmVjb3JkLmNvbHVtbnNbcHJvcE5hbWVdPy52YWx1ZTtcbiAgICAgICAgfSBlbHNlIGlmICghdXNlc1NlcXVlbmNlKSB7XG4gICAgICAgICAgLy8gc3RyaW5nIFBLOiDsg53shLHrkJwgaWQg6rCS7J2EIElOU0VSVOyXkCDtj6ztlaggKERCIERFRkFVTFQg7JeG7J2MKVxuICAgICAgICAgIHJvd1twcm9wTmFtZV0gPSBjb2x1bW4udmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gaW50ZWdlci9iaWdJbnRlZ2VyIFBLOiBEQiDsi5ztgIDsiqTsl5Ag66eh6rmAICjqsJIg7KCc7Jm4KVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzUmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChwcm9wKSB8fFxuICAgICAgICAgIChpc09uZVRvT25lUmVsYXRpb25Qcm9wKHByb3ApICYmIHByb3AuaGFzSm9pbkNvbHVtbilcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgcmVsYXRlZElkID0gY29sdW1uLnZhbHVlIGFzIG51bWJlciB8IG51bGw7XG4gICAgICAgICAgaWYgKHJlbGF0ZWRJZCAhPT0gbnVsbCAmJiByZWxhdGVkSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgcmVsYXRlZEZpeHR1cmVJZCA9IGAke3Byb3Aud2l0aH0jJHtyZWxhdGVkSWR9YDtcblxuICAgICAgICAgICAgLy8g66i87KCAIHNraXDrkJwgZml4dHVyZeyduOyngCDtmZXsnbhcbiAgICAgICAgICAgIGNvbnN0IHNraXBwZWRFeGlzdGluZ0lkID0gdGhpcy5za2lwcGVkRml4dHVyZXMuZ2V0KHJlbGF0ZWRGaXh0dXJlSWQpPy5leGlzdGluZ0lkO1xuICAgICAgICAgICAgaWYgKHNraXBwZWRFeGlzdGluZ0lkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgLy8gc2tpcOuQnCBmaXh0dXJlIOKGkiB0YXJnZXQgRELsnZgg6riw7KG0IOugiOy9lOuTnCBpZCDsgqzsmqlcbiAgICAgICAgICAgICAgcm93W2Ake3Byb3BOYW1lfV9pZGBdID0gc2tpcHBlZEV4aXN0aW5nSWQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjb25zdCByZWxhdGVkUmVmID0gdGhpcy5maXh0dXJlUmVmTWFwLmdldChyZWxhdGVkRml4dHVyZUlkKTtcbiAgICAgICAgICAgICAgaWYgKHJlbGF0ZWRSZWYpIHtcbiAgICAgICAgICAgICAgICAvLyDsnbTrr7ggdXBzZXJ065CcIOqwmeydgCDthYzsnbTruJQgZml4dHVyZSDtmZXsnbhcbiAgICAgICAgICAgICAgICBjb25zdCByZWxhdGVkRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocHJvcC53aXRoKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZWxhdGVkSW5zZXJ0ZWRJZHMgPSBpbnNlcnRlZElkc0J5VGFibGU/LmdldChyZWxhdGVkRW50aXR5LnRhYmxlKTtcbiAgICAgICAgICAgICAgICBjb25zdCBhY3R1YWxJZCA9IHJlbGF0ZWRJbnNlcnRlZElkcz8uZ2V0KHJlbGF0ZWRSZWYudXVpZCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoYWN0dWFsSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgLy8g7J2066+4IHVwc2VydOuQqCDihpIg7Iuk7KCcIElEIOyCrOyaqVxuICAgICAgICAgICAgICAgICAgcm93W2Ake3Byb3BOYW1lfV9pZGBdID0gYWN0dWFsSWQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIC8vIOyVhOyngSB1cHNlcnQg7JWI65CoIOKGkiBVQlJlZiDsgqzsmqlcbiAgICAgICAgICAgICAgICAgIHJvd1tgJHtwcm9wTmFtZX1faWRgXSA9IHJlbGF0ZWRSZWY7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGZpeHR1cmVz7JeQIO2PrO2VqOuQmOyngCDslYrsnYAg66CI7L2U65OcIOKGkiBJRCDqt7jrjIDroZwg7IKs7JqpXG4gICAgICAgICAgICAgICAgcm93W2Ake3Byb3BOYW1lfV9pZGBdID0gcmVsYXRlZElkO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJvd1tgJHtwcm9wTmFtZX1faWRgXSA9IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEhhc01hbnksIE1hbnlUb01hbnnripQg67OE64+EIOyymOumrFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8g7J2867CYIOy7rOufvFxuICAgICAgICByb3dbcHJvcE5hbWVdID0gdGhpcy5jb252ZXJ0Q29sdW1uVmFsdWUocHJvcCBhcyBFbnRpdHlQcm9wLCBjb2x1bW4udmFsdWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgICFpc1Rlc3QoKSAmJlxuICAgICAgY29uc29sZS5sb2coY2hhbGsuYmx1ZShgUmVnaXN0ZXJpbmcgJHtlbnRpdHkudGFibGV9IC0gJHtpbnNwZWN0KHJvdywgZmFsc2UsIG51bGwsIHRydWUpfWApKTtcbiAgICBjb25zdCByZWYgPSB0aGlzLmJ1aWxkZXIucmVnaXN0ZXIoZW50aXR5LnRhYmxlLCByb3cpO1xuICAgIHRoaXMuZml4dHVyZVJlZk1hcC5zZXQoZml4dHVyZS5maXh0dXJlSWQsIHJlZik7XG5cbiAgICByZXR1cm4gcmVmO1xuICB9XG5cbiAgLyoqXG4gICAqIOy7rOufvCDqsJIg67OA7ZmYXG4gICAqL1xuICBwcml2YXRlIGNvbnZlcnRDb2x1bW5WYWx1ZShwcm9wOiBFbnRpdHlQcm9wLCB2YWx1ZTogdW5rbm93bik6IHVua25vd24ge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHByb3AudHlwZSkge1xuICAgICAgY2FzZSBcImpzb25cIjpcbiAgICAgICAgLy8gVXBzZXJ0QnVpbGRlci5yZWdpc3RlcuyXkOyEnCBKU09OLnN0cmluZ2lmeSDsspjrpqztlZjrr4DroZwgb2JqZWN0IOq3uOuMgOuhnCDsoITri6xcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuXG4gICAgICBjYXNlIFwiZGF0ZVwiOlxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgIHJldHVybiBuZXcgRGF0ZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBwcm9jZXNzTWFueVRvTWFueVJlbGF0aW9ucyhcbiAgICB0cng6IEtuZXguVHJhbnNhY3Rpb24sXG4gICAgZml4dHVyZXM6IEZpeHR1cmVSZWNvcmRbXSxcbiAgICBpbnNlcnRlZElkc0J5VGFibGU6IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIG51bWJlciB8IHN0cmluZz4+LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBmb3IgKGNvbnN0IGZpeHR1cmUgb2YgZml4dHVyZXMpIHtcbiAgICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGZpeHR1cmUuZW50aXR5SWQpO1xuICAgICAgY29uc3Qgc291cmNlUmVmID0gdGhpcy5maXh0dXJlUmVmTWFwLmdldChmaXh0dXJlLmZpeHR1cmVJZCk7XG5cbiAgICAgIGlmICghc291cmNlUmVmKSBjb250aW51ZTtcblxuICAgICAgY29uc3Qgc291cmNlVXVpZFRvSWQgPSBpbnNlcnRlZElkc0J5VGFibGUuZ2V0KGVudGl0eS50YWJsZSk7XG4gICAgICBjb25zdCBzb3VyY2VJZCA9IHNvdXJjZVV1aWRUb0lkPy5nZXQoc291cmNlUmVmLnV1aWQpO1xuXG4gICAgICBpZiAoc291cmNlSWQgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG5cbiAgICAgIGZvciAoY29uc3QgWywgY29sdW1uXSBvZiBPYmplY3QuZW50cmllcyhmaXh0dXJlLmNvbHVtbnMpKSB7XG4gICAgICAgIGNvbnN0IHByb3AgPSBjb2x1bW4ucHJvcDtcblxuICAgICAgICBpZiAoaXNNYW55VG9NYW55UmVsYXRpb25Qcm9wKHByb3ApICYmIEFycmF5LmlzQXJyYXkoY29sdW1uLnZhbHVlKSkge1xuICAgICAgICAgIC8vIOyEoO2DneuQmOyngCDslYrsnYAgTWFueVRvTWFueSDqtIDqs4TripQg7KCA7J6l7ZWY7KeAIOyViuydjFxuICAgICAgICAgIGNvbnN0IHRhcmdldFRhYmxlID0gRW50aXR5TWFuYWdlci5nZXQocHJvcC53aXRoKTtcbiAgICAgICAgICBpZiAodGhpcy5idWlsZGVyLmhhc1RhYmxlKHRhcmdldFRhYmxlLnRhYmxlKSA9PT0gZmFsc2UpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgY29uc3QgcmVsYXRlZElkcyA9IGNvbHVtbi52YWx1ZSBhcyBudW1iZXJbXTtcbiAgICAgICAgICBpZiAocmVsYXRlZElkcy5sZW5ndGggPT09IDApIGNvbnRpbnVlO1xuXG4gICAgICAgICAgY29uc3Qgam9pblRhYmxlID0gKHByb3AgYXMgTWFueVRvTWFueVJlbGF0aW9uUHJvcCkuam9pblRhYmxlO1xuICAgICAgICAgIGNvbnN0IHJlbGF0ZWRFbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChwcm9wLndpdGgpO1xuXG4gICAgICAgICAgY29uc3Qgc291cmNlQ29sdW1uID0gYCR7aW5mbGVjdGlvbi5zaW5ndWxhcml6ZShlbnRpdHkudGFibGUpfV9pZGA7XG4gICAgICAgICAgY29uc3QgdGFyZ2V0Q29sdW1uID0gYCR7aW5mbGVjdGlvbi5zaW5ndWxhcml6ZShyZWxhdGVkRW50aXR5LnRhYmxlKX1faWRgO1xuXG4gICAgICAgICAgZm9yIChjb25zdCByZWxhdGVkSWQgb2YgcmVsYXRlZElkcykge1xuICAgICAgICAgICAgY29uc3QgcmVsYXRlZEZpeHR1cmVJZCA9IGAke3Byb3Aud2l0aH0jJHtyZWxhdGVkSWR9YDtcbiAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRSZWYgPSB0aGlzLmZpeHR1cmVSZWZNYXAuZ2V0KHJlbGF0ZWRGaXh0dXJlSWQpO1xuXG4gICAgICAgICAgICBsZXQgdGFyZ2V0SWQ6IG51bWJlciB8IHN0cmluZztcblxuICAgICAgICAgICAgaWYgKHJlbGF0ZWRSZWYpIHtcbiAgICAgICAgICAgICAgY29uc3QgcmVsYXRlZFV1aWRUb0lkID0gaW5zZXJ0ZWRJZHNCeVRhYmxlLmdldChyZWxhdGVkRW50aXR5LnRhYmxlKTtcbiAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWRJZCA9IHJlbGF0ZWRVdWlkVG9JZD8uZ2V0KHJlbGF0ZWRSZWYudXVpZCk7XG5cbiAgICAgICAgICAgICAgaWYgKHJlc29sdmVkSWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgICAgIGBSZWxhdGVkIGZpeHR1cmUgJHtyZWxhdGVkRml4dHVyZUlkfSBub3QgZm91bmQgaW4gaW5zZXJ0ZWRJZHMsIHNraXBwaW5nYCxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHRhcmdldElkID0gcmVzb2x2ZWRJZDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRhcmdldElkID0gcmVsYXRlZElkO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBKb2luVGFibGXsl5Ag7IK97J6FXG4gICAgICAgICAgICBjb25zdCBbZm91bmRdID0gYXdhaXQgdHJ4KGpvaW5UYWJsZSlcbiAgICAgICAgICAgICAgLndoZXJlKHtcbiAgICAgICAgICAgICAgICBbc291cmNlQ29sdW1uXTogc291cmNlSWQsXG4gICAgICAgICAgICAgICAgW3RhcmdldENvbHVtbl06IHRhcmdldElkLFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAubGltaXQoMSk7XG5cbiAgICAgICAgICAgIGlmICghZm91bmQpIHtcbiAgICAgICAgICAgICAgYXdhaXQgdHJ4KGpvaW5UYWJsZSkuaW5zZXJ0KHtcbiAgICAgICAgICAgICAgICBbc291cmNlQ29sdW1uXTogc291cmNlSWQsXG4gICAgICAgICAgICAgICAgW3RhcmdldENvbHVtbl06IHRhcmdldElkLFxuICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICAgIGNoYWxrLmdyZWVuKFxuICAgICAgICAgICAgICAgICAgICBgSW5zZXJ0ZWQgaW50byAke2pvaW5UYWJsZX06ICR7ZW50aXR5LnRhYmxlfSgke3NvdXJjZUlkfSkgLSAke3JlbGF0ZWRFbnRpdHkudGFibGV9KCR7dGFyZ2V0SWR9KWAsXG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOqwmeydgCDthYzsnbTruJQg64K0IGZpeHR1cmXrk6TsnYQgc2VsZi1yZWZlcmVuY2Ug66CI67Ko67OE66GcIOu2hO2VoFxuICAgKiAtIHNlbGYtcmVmZXJlbmNl6rCAIOyXhuuKlCBmaXh0dXJl65OkOiBMZXZlbCAwXG4gICAqIC0gTGV2ZWwgMOydhCDssLjsobDtlZjripQgZml4dHVyZeuTpDogTGV2ZWwgMVxuICAgKiAtIOuwmOuztVxuICAgKlxuICAgKiBVcHNlcnRCdWlsZGVy6rCAIHNlbGYtcmVmZXJlbmNl6rCAIOyeiOycvOuptCBidWlsZEluc2VydExldmVscygp66GcIOyerOygleugrO2VmOyXrFxuICAgKiDrk7HroZ0g7Iic7ISc7JmAIOuwmO2ZmCDsiJzshJzqsIAg64us65287KeIIOyImCDsnojsirXri4jri6QuXG4gICAqIOydtOulvCDrsKnsp4DtlZjquLAg7JyE7ZW0IEZpeHR1cmVNYW5hZ2Vy6rCAIOugiOuyqOuzhOuhnCDrgpjriKDshJwg7LKY66as7ZWp64uI64ukLlxuICAgKi9cbiAgcHJpdmF0ZSBncm91cEZpeHR1cmVzQnlMZXZlbChmaXh0dXJlczogRml4dHVyZVJlY29yZFtdKTogRml4dHVyZVJlY29yZFtdW10ge1xuICAgIGlmIChmaXh0dXJlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChmaXh0dXJlc1swXS5lbnRpdHlJZCk7XG5cbiAgICAvLyBzZWxmLXJlZmVyZW5jZSByZWxhdGlvbiBwcm9wIOywvuq4sFxuICAgIGNvbnN0IHNlbGZSZWZQcm9wcyA9IGVudGl0eS5wcm9wcy5maWx0ZXIoXG4gICAgICAocCk6IHAgaXMgQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wIHwgT25lVG9PbmVSZWxhdGlvblByb3AgPT5cbiAgICAgICAgaXNSZWxhdGlvblByb3AocCkgJiZcbiAgICAgICAgKGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wKHApIHx8IChpc09uZVRvT25lUmVsYXRpb25Qcm9wKHApICYmIHAuaGFzSm9pbkNvbHVtbikpICYmXG4gICAgICAgIHAud2l0aCA9PT0gZW50aXR5LmlkLFxuICAgICk7XG5cbiAgICBpZiAoc2VsZlJlZlByb3BzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgLy8gc2VsZi1yZWZlcmVuY2Ug7JeG7J2MIOKGkiDri6jsnbwg66CI67KoXG4gICAgICByZXR1cm4gW2ZpeHR1cmVzXTtcbiAgICB9XG5cbiAgICAvLyDroIjrsqjrs4Qg67aE7ZWgICh0b3BvbG9naWNhbCBzb3J0KVxuICAgIGNvbnN0IGxldmVsczogRml4dHVyZVJlY29yZFtdW10gPSBbXTtcbiAgICBjb25zdCByZW1haW5pbmcgPSBuZXcgU2V0KGZpeHR1cmVzLm1hcCgoZikgPT4gZi5maXh0dXJlSWQpKTtcbiAgICBjb25zdCBwcm9jZXNzZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgIHdoaWxlIChyZW1haW5pbmcuc2l6ZSA+IDApIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRMZXZlbDogRml4dHVyZVJlY29yZFtdID0gW107XG5cbiAgICAgIGZvciAoY29uc3QgZml4dHVyZSBvZiBmaXh0dXJlcykge1xuICAgICAgICBpZiAoIXJlbWFpbmluZy5oYXMoZml4dHVyZS5maXh0dXJlSWQpKSBjb250aW51ZTtcblxuICAgICAgICAvLyBzZWxmLXJlZmVyZW5jZeqwgCDrqqjrkZAg7J2066+4IOyymOumrOuQkOqxsOuCmCBudWxs7J24IOqyveyasFxuICAgICAgICBjb25zdCBjYW5Qcm9jZXNzID0gc2VsZlJlZlByb3BzLmV2ZXJ5KChwcm9wKSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVmSWQgPSBmaXh0dXJlLmNvbHVtbnNbcHJvcC5uYW1lXT8udmFsdWUgYXMgbnVtYmVyIHwgbnVsbDtcbiAgICAgICAgICBpZiAocmVmSWQgPT09IG51bGwgfHwgcmVmSWQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRydWU7XG4gICAgICAgICAgY29uc3QgcmVmRml4dHVyZUlkID0gYCR7cHJvcC53aXRofSMke3JlZklkfWA7XG4gICAgICAgICAgLy8g7J2066+4IOyymOumrOuQkOqxsOuCmCwg7ZiE7J6sIGZpeHR1cmVz7JeQIO2PrO2VqOuQmOyngCDslYrsnYAg6rK97JqwICjsmbjrtoAg7LC47KGwKVxuICAgICAgICAgIHJldHVybiBwcm9jZXNzZWQuaGFzKHJlZkZpeHR1cmVJZCkgfHwgIXJlbWFpbmluZy5oYXMocmVmRml4dHVyZUlkKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGNhblByb2Nlc3MpIHtcbiAgICAgICAgICBjdXJyZW50TGV2ZWwucHVzaChmaXh0dXJlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoY3VycmVudExldmVsLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBjb25zdCByZW1haW5pbmdJZHMgPSBBcnJheS5mcm9tKHJlbWFpbmluZykuam9pbihcIiwgXCIpO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYENpcmN1bGFyIHNlbGYtcmVmZXJlbmNlIGRldGVjdGVkIGluICR7ZW50aXR5LnRhYmxlfS4gUmVtYWluaW5nIGZpeHR1cmVzOiAke3JlbWFpbmluZ0lkc31gLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IGZpeHR1cmUgb2YgY3VycmVudExldmVsKSB7XG4gICAgICAgIHJlbWFpbmluZy5kZWxldGUoZml4dHVyZS5maXh0dXJlSWQpO1xuICAgICAgICBwcm9jZXNzZWQuYWRkKGZpeHR1cmUuZml4dHVyZUlkKTtcbiAgICAgIH1cblxuICAgICAgbGV2ZWxzLnB1c2goY3VycmVudExldmVsKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbGV2ZWxzO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjaGVja1VuaXF1ZVZpb2xhdGlvbihkYjogS25leCwgZW50aXR5OiBFbnRpdHksIGZpeHR1cmU6IEZpeHR1cmVSZWNvcmQpIHtcbiAgICBjb25zdCBfdW5pcXVlSW5kZXhlcyA9IGVudGl0eS5pbmRleGVzPy5maWx0ZXIoKGkpID0+IGkudHlwZSA9PT0gXCJ1bmlxdWVcIikgPz8gW107XG5cbiAgICBjb25zdCB1bmlxdWVJbmRleGVzID0gX3VuaXF1ZUluZGV4ZXMuZmlsdGVyKChpbmRleCkgPT5cbiAgICAgIGluZGV4LmNvbHVtbnMuZXZlcnkoKGNvbHVtbikgPT4gIWNvbHVtbi5uYW1lLnN0YXJ0c1dpdGgoYCR7ZW50aXR5LnRhYmxlfV9fYCkpLFxuICAgICk7XG4gICAgaWYgKHVuaXF1ZUluZGV4ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBsZXQgdW5pcXVlUXVlcnkgPSBkYihlbnRpdHkudGFibGUpO1xuICAgIGxldCBoYXNDb25kaXRpb24gPSBmYWxzZTtcblxuICAgIGZvciAoY29uc3QgaW5kZXggb2YgdW5pcXVlSW5kZXhlcykge1xuICAgICAgLy8g7Lus65+8IOykkSDtlZjrgpjrnbzrj4QgbnVsbOydtOuptCDsnKDri4jtgawg7KCc7JW97J2EIOychOuwmO2VmOyngCDslYrquLAg65WM66y47JeQIO2VtOuLuSDsnbjrjbHsiqTripQg66y07IucXG4gICAgICBjb25zdCBjb250YWluc051bGwgPSBpbmRleC5jb2x1bW5zLnNvbWUoKGNvbHVtbikgPT4ge1xuICAgICAgICBjb25zdCBmaWVsZCA9IGNvbHVtbi5uYW1lLnJlcGxhY2UoL19pZCQvLCBcIlwiKTtcbiAgICAgICAgcmV0dXJuIGZpeHR1cmUuY29sdW1uc1tmaWVsZF0/LnZhbHVlID09PSBudWxsO1xuICAgICAgfSk7XG4gICAgICBpZiAoY29udGFpbnNOdWxsKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB1bmlxdWVRdWVyeSA9IHVuaXF1ZVF1ZXJ5Lm9yV2hlcmUoKHFiKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgY29sdW1uIG9mIGluZGV4LmNvbHVtbnMpIHtcbiAgICAgICAgICBjb25zdCBmaWVsZCA9IGNvbHVtbi5uYW1lLnJlcGxhY2UoL19pZCQvLCBcIlwiKTtcblxuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGZpeHR1cmUuY29sdW1uc1tmaWVsZF0/LnZhbHVlKSkge1xuICAgICAgICAgICAgcWIud2hlcmVJbihjb2x1bW4ubmFtZSwgZml4dHVyZS5jb2x1bW5zW2ZpZWxkXS52YWx1ZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHFiLmFuZFdoZXJlKGNvbHVtbi5uYW1lLCBmaXh0dXJlLmNvbHVtbnNbZmllbGRdPy52YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGhhc0NvbmRpdGlvbiA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKCFoYXNDb25kaXRpb24pIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IFt1bmlxdWVGb3VuZF0gPSBhd2FpdCB1bmlxdWVRdWVyeTtcbiAgICByZXR1cm4gdW5pcXVlRm91bmQ7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNoZWNrRHVwbGljYXRlQnlDb2x1bW5zKFxuICAgIGRiOiBLbmV4LFxuICAgIGVudGl0eTogRW50aXR5LFxuICAgIGZpeHR1cmU6IEZpeHR1cmVSZWNvcmQsXG4gICAgY29sdW1uczogc3RyaW5nW10sXG4gICkge1xuICAgIGlmIChjb2x1bW5zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3Qgd2hlcmVDbGF1c2U6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG5cbiAgICBmb3IgKGNvbnN0IGNvbHVtbiBvZiBjb2x1bW5zKSB7XG4gICAgICAvLyByZWxhdGlvbiDtlYTrk5zsnbgg6rK97JqwIF9pZCDrtpnsnbTquLBcbiAgICAgIGNvbnN0IHByb3AgPSBlbnRpdHkucHJvcHMuZmluZCgocCkgPT4gcC5uYW1lID09PSBjb2x1bW4pO1xuICAgICAgY29uc3QgZGJDb2x1bW4gPSBwcm9wICYmIGlzUmVsYXRpb25Qcm9wKHByb3ApID8gYCR7Y29sdW1ufV9pZGAgOiBjb2x1bW47XG4gICAgICBjb25zdCB2YWx1ZSA9IGZpeHR1cmUuY29sdW1uc1tjb2x1bW5dPy52YWx1ZTtcblxuICAgICAgLy8gbnVsbCDqsJLsnbQg7Y+s7ZWo65CcIOqyveyasCDspJHrs7Ug7ZmV7J24IOyKpO2CtVxuICAgICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIHdoZXJlQ2xhdXNlW2RiQ29sdW1uXSA9IHZhbHVlO1xuICAgIH1cblxuICAgIGNvbnN0IFtmb3VuZF0gPSBhd2FpdCBkYihlbnRpdHkudGFibGUpLndoZXJlKHdoZXJlQ2xhdXNlKS5saW1pdCgxKTtcbiAgICByZXR1cm4gZm91bmQ7XG4gIH1cblxuICBhc3luYyBhZGRGaXh0dXJlTG9hZGVyKGNvZGU6IHN0cmluZykge1xuICAgIGNvbnN0IHBhdGggPSBgJHtTb25hbXUuYXBpUm9vdFBhdGh9L3NyYy90ZXN0aW5nL2ZpeHR1cmUudHNgO1xuICAgIGNvbnN0IGNvbnRlbnQgPSByZWFkRmlsZVN5bmMocGF0aCkudG9TdHJpbmcoKTtcblxuICAgIGNvbnN0IGZpeHR1cmVMb2FkZXJTdGFydCA9IGNvbnRlbnQuaW5kZXhPZihcImNvbnN0IGZpeHR1cmVMb2FkZXIgPSB7XCIpO1xuICAgIGNvbnN0IGZpeHR1cmVMb2FkZXJFbmQgPSBjb250ZW50LmluZGV4T2YoXCJ9O1wiLCBmaXh0dXJlTG9hZGVyU3RhcnQpO1xuXG4gICAgaWYgKGZpeHR1cmVMb2FkZXJTdGFydCAhPT0gLTEgJiYgZml4dHVyZUxvYWRlckVuZCAhPT0gLTEpIHtcbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBgJHtjb250ZW50LnNsaWNlKDAsIGZpeHR1cmVMb2FkZXJFbmQpfSAgJHtjb2RlfVxcbiR7Y29udGVudC5zbGljZShmaXh0dXJlTG9hZGVyRW5kKX1gO1xuXG4gICAgICB3cml0ZUZpbGVTeW5jKHBhdGgsIG5ld0NvbnRlbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGYWlsZWQgdG8gZmluZCBmaXh0dXJlTG9hZGVyIGluIGZpeHR1cmUudHNcIik7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBGaXh0dXJlTWFuYWdlciA9IG5ldyBGaXh0dXJlTWFuYWdlckNsYXNzKCk7XG4iXSwibmFtZXMiOlsiYXNzZXJ0IiwiY2hhbGsiLCJleGVjU3luYyIsInJlYWRGaWxlU3luYyIsIndyaXRlRmlsZVN5bmMiLCJpbmZsZWN0aW9uIiwidW5pcXVlIiwiaW5zcGVjdCIsIlNvbmFtdSIsIkJhc2VNb2RlbCIsImNyZWF0ZUtuZXhJbnN0YW5jZSIsIlVwc2VydEJ1aWxkZXIiLCJFbnRpdHlNYW5hZ2VyIiwiaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AiLCJpc0hhc01hbnlSZWxhdGlvblByb3AiLCJpc01hbnlUb01hbnlSZWxhdGlvblByb3AiLCJpc09uZVRvT25lUmVsYXRpb25Qcm9wIiwiaXNSZWxhdGlvblByb3AiLCJpc1ZpcnR1YWxQcm9wIiwiaXNUZXN0IiwiUmVsYXRpb25HcmFwaCIsIkZpeHR1cmVNYW5hZ2VyQ2xhc3MiLCJfdGRiIiwidGRiIiwiRXJyb3IiLCJfZmRiIiwiZmRiIiwiY2FjaGVkVGFibGVOYW1lcyIsInJlbGF0aW9uR3JhcGgiLCJidWlsZGVyIiwiZml4dHVyZVJlZk1hcCIsIk1hcCIsInNraXBwZWRGaXh0dXJlcyIsImluaXQiLCJkYkNvbmZpZyIsInRlc3QiLCJwcm9kdWN0aW9uX21hc3RlciIsInRDb25uIiwiY29ubmVjdGlvbiIsInBDb25uIiwiaG9zdCIsInBvcnQiLCJkYXRhYmFzZSIsImZpeHR1cmUiLCJzeW5jIiwiZml4dHVyZUNvbm4iLCJ0ZXN0Q29ubiIsInRlc3RQZ0VudiIsIlBHUEFTU1dPUkQiLCJwYXNzd29yZCIsInVzZXIiLCJzdGRpbyIsImVudiIsInByb2Nlc3MiLCJmaXh0dXJlUGdFbnYiLCJkdW1wQ21kIiwicmVzdG9yZUNtZCIsInNoZWxsIiwicmVzZXRTZXF1ZW5jZXMiLCJ0ZXN0RGIiLCJlbnRpdGllcyIsImdldEFsbEVudGl0aWVzIiwiZW50aXR5IiwidGFibGVOYW1lIiwidGFibGUiLCJpZCIsInRvTG93ZXJDYXNlIiwiaWRQcm9wIiwicHJvcHMiLCJmaW5kIiwicCIsIm5hbWUiLCJpZFR5cGUiLCJ0eXBlIiwidXNlc1NlcXVlbmNlIiwiY29uZSIsImZpeHR1cmVTdHJhdGVneSIsImNvbnNvbGUiLCJsb2ciLCJtYXhFeHByIiwicmF3IiwiZGVzdHJveSIsInZpc2l0ZWRSZWNvcmRzIiwiU2V0IiwiaW1wb3J0Rml4dHVyZSIsImVudGl0eUlkIiwiaWRzIiwiY2xlYXIiLCJxdWVyaWVzIiwiUHJvbWlzZSIsImFsbCIsIm1hcCIsImdldEltcG9ydFF1ZXJpZXMiLCJmbGF0Iiwid2RiIiwiZ2V0REIiLCJxdWVyeSIsImZpZWxkIiwicmVjb3JkS2V5IiwiaGFzIiwiYWRkIiwiZ2V0Iiwicm93Iiwid2hlcmUiLCJsaW1pdCIsInVuZGVmaW5lZCIsImZpeHR1cmVEYXRhYmFzZSIsInJlYWxEYXRhYmFzZSIsInNlbGZRdWVyeSIsImFyZ3MiLCJPYmplY3QiLCJlbnRyaWVzIiwicmVsYXRpb25zIiwiZmlsdGVyIiwicmVsYXRpb24iLCJjdXN0b21Kb2luQ2xhdXNlIiwiaGFzSm9pbkNvbHVtbiIsInJlbGF0ZWRFbnRpdHkiLCJ3aXRoIiwicmVsYXRlZElkQ29sdW1uTmFtZSIsImFyZyIsInJlbFF1ZXJpZXMiLCJyZXZlcnNlIiwiZ2V0Rml4dHVyZXMiLCJzb3VyY2VEQk5hbWUiLCJ0YXJnZXREQk5hbWUiLCJzZWFyY2hPcHRpb25zIiwiZHVwbGljYXRlQ2hlY2siLCJzb3VyY2VEQiIsInRhcmdldERCIiwidmFsdWUiLCJzZWFyY2hUeXBlIiwiY29sdW1uIiwicHJvcCIsInJvd3MiLCJsZW5ndGgiLCJmaXh0dXJlcyIsImluaXRpYWxSZWNvcmRzTGVuZ3RoIiwibmV3UmVjb3JkcyIsImNyZWF0ZUZpeHR1cmVSZWNvcmQiLCJfZGIiLCJwdXNoIiwiY3VycmVudEZpeHR1cmVSZWNvcmQiLCJyIiwiZml4dHVyZUlkIiwiZmV0Y2hlZFJlY29yZHMiLCJzbGljZSIsImN1c3RvbUNvbHVtbnMiLCJjb2x1bW5zIiwiY3VzdG9tRHVwbGljYXRlUm93IiwiY2hlY2tEdXBsaWNhdGVCeUNvbHVtbnMiLCJyZWNvcmQiLCJzaW5nbGVSZWNvcmQiLCJ0YXJnZXQiLCJ1bmlxdWVSb3ciLCJjaGVja1VuaXF1ZVZpb2xhdGlvbiIsImYiLCJhbGxTZXR0bGVkIiwib3B0aW9ucyIsInJlY29yZHMiLCJ2aXNpdGVkRW50aXRpZXMiLCJjcmVhdGUiLCJiZWxvbmdzUmVjb3JkcyIsImRiIiwidGhyb3VnaFRhYmxlIiwiam9pblRhYmxlIiwiZnJvbUNvbHVtbiIsInNpbmd1bGFyaXplIiwidG9Db2x1bW4iLCJyZWxhdGVkSWRzIiwicGx1Y2siLCJqb2luQ29sdW1uIiwicmVsYXRlZFByb3AiLCJma0NvbHVtbiIsInJlbGF0ZWRSb3ciLCJmaXJzdCIsInJlbGF0ZWRJZCIsImluc2VydEZpeHR1cmVzIiwiZGJOYW1lIiwiX2ZpeHR1cmVzIiwiU09OQU1VX1dPUktFUl9EQiIsIlZJVEVTVF9QT09MX0lEIiwid29ya2VySWQiLCJwYXJzZUludCIsImJhc2VDb25maWciLCJwb29sIiwibWluIiwibWF4IiwicmVzdWx0cyIsImJ1aWxkR3JhcGgiLCJpbnNlcnRpb25PcmRlciIsImdldEluc2VydGlvbk9yZGVyIiwiaGFzVGFyZ2V0IiwiaGFzVW5pcXVlIiwiaGFzRHVwbGljYXRlIiwib3ZlcnJpZGUiLCJleGlzdGluZ0lkIiwic2V0IiwieWVsbG93IiwiZml4dHVyZXNCeVRhYmxlIiwidGFibGVPcmRlciIsInRyYW5zYWN0aW9uIiwidHJ4IiwiaW5zZXJ0ZWRJZHNCeVRhYmxlIiwidGFibGVGaXh0dXJlcyIsImxldmVscyIsImdyb3VwRml4dHVyZXNCeUxldmVsIiwibGV2ZWxGaXh0dXJlcyIsInJlZ2lzdGVyRml4dHVyZSIsImJsdWUiLCJnZXRUYWJsZSIsInV1aWRzIiwidXVpZCIsImluZGV4T2YiLCJ1cHNlcnQiLCJleGlzdGluZ01hcCIsImkiLCJ3YXJuIiwicHJvY2Vzc01hbnlUb01hbnlSZWxhdGlvbnMiLCJlIiwiZ3JheSIsImVudGl0eTIiLCJpZFR5cGUyIiwibWF4SWRSZXN1bHQiLCJ0aGVuIiwibWF4SWQiLCJtYXhfaWQiLCJncmVlbiIsIl9lcnIiLCJza2lwcGVkIiwiZGF0YSIsInJlZiIsInV1aWRUb0lkIiwiaW5zZXJ0ZWRJZCIsImV4aXN0aW5nUmVjb3JkIiwiaXNPdmVycmlkZU1vZGUiLCJwcm9wTmFtZSIsImdlbmVyYXRlZCIsInJlbGF0ZWRGaXh0dXJlSWQiLCJza2lwcGVkRXhpc3RpbmdJZCIsInJlbGF0ZWRSZWYiLCJyZWxhdGVkSW5zZXJ0ZWRJZHMiLCJhY3R1YWxJZCIsImNvbnZlcnRDb2x1bW5WYWx1ZSIsInJlZ2lzdGVyIiwiRGF0ZSIsInNvdXJjZVJlZiIsInNvdXJjZVV1aWRUb0lkIiwic291cmNlSWQiLCJBcnJheSIsImlzQXJyYXkiLCJ0YXJnZXRUYWJsZSIsImhhc1RhYmxlIiwic291cmNlQ29sdW1uIiwidGFyZ2V0Q29sdW1uIiwidGFyZ2V0SWQiLCJyZWxhdGVkVXVpZFRvSWQiLCJyZXNvbHZlZElkIiwiZm91bmQiLCJpbnNlcnQiLCJzZWxmUmVmUHJvcHMiLCJyZW1haW5pbmciLCJwcm9jZXNzZWQiLCJzaXplIiwiY3VycmVudExldmVsIiwiY2FuUHJvY2VzcyIsImV2ZXJ5IiwicmVmSWQiLCJyZWZGaXh0dXJlSWQiLCJyZW1haW5pbmdJZHMiLCJmcm9tIiwiam9pbiIsImRlbGV0ZSIsIl91bmlxdWVJbmRleGVzIiwiaW5kZXhlcyIsInVuaXF1ZUluZGV4ZXMiLCJpbmRleCIsInN0YXJ0c1dpdGgiLCJ1bmlxdWVRdWVyeSIsImhhc0NvbmRpdGlvbiIsImNvbnRhaW5zTnVsbCIsInNvbWUiLCJyZXBsYWNlIiwib3JXaGVyZSIsInFiIiwid2hlcmVJbiIsImFuZFdoZXJlIiwidW5pcXVlRm91bmQiLCJ3aGVyZUNsYXVzZSIsImRiQ29sdW1uIiwiYWRkRml4dHVyZUxvYWRlciIsImNvZGUiLCJwYXRoIiwiYXBpUm9vdFBhdGgiLCJjb250ZW50IiwidG9TdHJpbmciLCJmaXh0dXJlTG9hZGVyU3RhcnQiLCJmaXh0dXJlTG9hZGVyRW5kIiwibmV3Q29udGVudCIsIkZpeHR1cmVNYW5hZ2VyIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxZQUFZLFNBQVM7QUFDNUIsT0FBT0MsV0FBVyxRQUFRO0FBQzFCLFNBQVNDLFFBQVEsUUFBUSxnQkFBZ0I7QUFDekMsU0FBU0MsWUFBWSxFQUFFQyxhQUFhLFFBQVEsS0FBSztBQUNqRCxPQUFPQyxnQkFBZ0IsYUFBYTtBQUVwQyxTQUFTQyxNQUFNLFFBQVEsVUFBVTtBQUNqQyxTQUFTQyxPQUFPLFFBQVEsT0FBTztBQUMvQixTQUFTQyxNQUFNLFFBQVEsa0JBQVM7QUFDaEMsU0FBU0MsU0FBUyxRQUFRLDRCQUF5QjtBQUVuRCxTQUFTQyxrQkFBa0IsUUFBUSxzQkFBbUI7QUFD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