sonamu 0.9.13 → 0.9.15

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.
@@ -43,6 +43,7 @@ type PgIndex = {
43
43
  nulls_not_distinct: boolean;
44
44
  column_order: number;
45
45
  index_definition: string;
46
+ predicate?: string | null;
46
47
  };
47
48
  type PgForeign = {
48
49
  constraint_name: string;
@@ -1 +1 @@
1
- {"version":3,"file":"postgresql-schema-reader.d.ts","sourceRoot":"","sources":["../../src/migration/postgresql-schema-reader.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,MAAM,CAAC;AAGjC,OAAO,EACL,KAAK,eAAe,EAGpB,KAAK,YAAY,EACjB,KAAK,UAAU,EAChB,MAAM,gBAAgB,CAAC;AAExB;;;GAGG;AACH,MAAM,MAAM,qBAAqB,GAAG;IAClC,mBAAmB;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,6BAA6B;IAC7B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,yBAAyB;IACzB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,mBAAmB;IACnB,QAAQ,EAAE,UAAU,CAAC;IACrB,mBAAmB;IACnB,QAAQ,EAAE,UAAU,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,wBAAwB,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC;CACtC,CAAC;AAEF,KAAK,OAAO,GAAG;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,KAAK,GAAG,MAAM,CAAC;IAC3B,kBAAkB,EAAE,OAAO,CAAC;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,KAAK,SAAS,GAAG;IACf,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,KAAK,cAAc,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AAExC,cAAM,2BAA2B;IAC/B,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAyD;IAE3F;;;;;OAKG;IACG,qBAAqB,CACzB,SAAS,EAAE,cAAc,EACzB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAiJ/B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAW3B;;OAEG;IACG,SAAS,CACb,SAAS,EAAE,cAAc,EACzB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;IA6HhD,OAAO,CAAC,yBAAyB;IAajC,OAAO,CAAC,mBAAmB;IAe3B,OAAO,CAAC,uBAAuB;IAwB/B,OAAO,CAAC,kBAAkB;IAS1B,OAAO,CAAC,yBAAyB;IAsBjC,OAAO,CAAC,oBAAoB;IA8B5B,OAAO,CAAC,uBAAuB;IAa/B,OAAO,CAAC,aAAa;IAiErB,OAAO,CAAC,gBAAgB;IAuFxB,OAAO,CAAC,uBAAuB;IA+C/B;;;OAGG;IACG,yBAAyB,CAAC,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC;IA+C9F;;;OAGG;YACW,mBAAmB;IAwBjC;;OAEG;IACH,gBAAgB,CACd,QAAQ,EAAE,QAAQ,GACjB,IAAI,CACL,eAAe,EACf,MAAM,GAAG,QAAQ,GAAG,WAAW,GAAG,OAAO,GAAG,YAAY,GAAG,YAAY,CACxE;CA+FF;AAED,eAAO,MAAM,sBAAsB,6BAAoC,CAAC"}
1
+ {"version":3,"file":"postgresql-schema-reader.d.ts","sourceRoot":"","sources":["../../src/migration/postgresql-schema-reader.ts"],"names":[],"mappings":"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"}
@@ -88,6 +88,7 @@ var init_postgresql_schema_reader = __esmMin((() => {
88
88
  } : {}
89
89
  })),
90
90
  nullsNotDistinct: firstIndex.nulls_not_distinct,
91
+ ...firstIndex.predicate ? { where: firstIndex.predicate } : {},
91
92
  ...using ? { using } : {},
92
93
  ...this.parseVectorIndexOptions(restoredIndexType, parsedIndexDefinition.withOptions)
93
94
  };
@@ -184,7 +185,8 @@ var init_postgresql_schema_reader = __esmMin((() => {
184
185
  END AS sort_order,
185
186
  ix.indnullsnotdistinct AS nulls_not_distinct,
186
187
  u.ord AS column_order,
187
- pg_get_indexdef(ix.indexrelid) AS index_definition
188
+ pg_get_indexdef(ix.indexrelid) AS index_definition,
189
+ pg_get_expr(ix.indpred, ix.indrelid) AS predicate
188
190
  FROM pg_class t
189
191
  JOIN pg_index ix ON t.oid = ix.indrelid
190
192
  JOIN pg_class i ON i.oid = ix.indexrelid
@@ -643,4 +645,4 @@ var init_postgresql_schema_reader = __esmMin((() => {
643
645
  //#endregion
644
646
  init_postgresql_schema_reader();
645
647
  export { PostgreSQLSchemaReader, init_postgresql_schema_reader };
646
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9zdGdyZXNxbC1zY2hlbWEtcmVhZGVyLmpzIiwibmFtZXMiOlsiZGJDb2x1bW5zOiBQZ0NvbHVtbltdIiwiZGJJbmRleGVzOiBQZ0luZGV4W10iLCJkYkZvcmVpZ25zOiBQZ0ZvcmVpZ25bXSIsImU6IHVua25vd24iLCJjb2x1bW5zOiBNaWdyYXRpb25Db2x1bW5bXSIsImluZGV4ZXM6IE1pZ3JhdGlvbkluZGV4W10iLCJmb3JlaWduczogTWlncmF0aW9uRm9yZWlnbltdIiwiYWN0aW9uTWFwOiBSZWNvcmQ8c3RyaW5nLCBSZWxhdGlvbk9uPiIsIml0ZW1zOiBzdHJpbmdbXSIsInRva2Vuczogc3RyaW5nW10iLCJkaW1lbnNpb25zOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+Il0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL21pZ3JhdGlvbi9wb3N0Z3Jlc3FsLXNjaGVtYS1yZWFkZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tIFwiYXNzZXJ0XCI7XG5cbmltcG9ydCB7IHR5cGUgS25leCB9IGZyb20gXCJrbmV4XCI7XG5pbXBvcnQgeyBncm91cCB9IGZyb20gXCJyYWRhc2hpXCI7XG5cbmltcG9ydCB7XG4gIHR5cGUgTWlncmF0aW9uQ29sdW1uLFxuICB0eXBlIE1pZ3JhdGlvbkZvcmVpZ24sXG4gIHR5cGUgTWlncmF0aW9uSW5kZXgsXG4gIHR5cGUgTWlncmF0aW9uU2V0LFxuICB0eXBlIFJlbGF0aW9uT24sXG59IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuXG4vKipcbiAqIO2KueyglSDthYzsnbTruJTsnZggUEvrpbwg7LC47KGw7ZWY64qUIOuLpOuluCDthYzsnbTruJTsnZggRksg7KCV67O07J6F64uI64ukLlxuICogUEsg7YOA7J6FIOuzgOqyvSDsi5wg6rSA66CoIEZLIOygnOyVveyhsOqxtOydhCDsspjrpqztlZjquLAg7JyE7ZW0IOyCrOyaqeuQqeuLiOuLpC5cbiAqL1xuZXhwb3J0IHR5cGUgUmVmZXJlbmNpbmdGb3JlaWduS2V5ID0ge1xuICAvKiogRkvqsIAg7KCV7J2Y65CcIO2FjOydtOu4lOuqhSAqL1xuICB0YWJsZU5hbWU6IHN0cmluZztcbiAgLyoqIEZLIOygnOyVveyhsOqxtCDsnbTrpoQgKi9cbiAgY29uc3RyYWludE5hbWU6IHN0cmluZztcbiAgLyoqIEZLIOy7rOufvOuqhSAqL1xuICBjb2x1bW5OYW1lOiBzdHJpbmc7XG4gIC8qKiDssLjsobDtlZjripQg7YWM7J2067iU66qFIChQS+qwgCDsnojripQg7YWM7J2067iUKSAqL1xuICByZWZlcmVuY2VkVGFibGVOYW1lOiBzdHJpbmc7XG4gIC8qKiDssLjsobDtlZjripQg7Lus65+866qFICjrs7TthrUgJ2lkJykgKi9cbiAgcmVmZXJlbmNlZENvbHVtbk5hbWU6IHN0cmluZztcbiAgLyoqIE9OIFVQREFURSDslaHshZggKi9cbiAgb25VcGRhdGU6IFJlbGF0aW9uT247XG4gIC8qKiBPTiBERUxFVEUg7JWh7IWYICovXG4gIG9uRGVsZXRlOiBSZWxhdGlvbk9uO1xufTtcblxuZXhwb3J0IHR5cGUgUGdDb2x1bW4gPSB7XG4gIGNvbHVtbl9uYW1lOiBzdHJpbmc7XG4gIGRhdGFfdHlwZTogc3RyaW5nO1xuICB1ZHRfbmFtZTogc3RyaW5nO1xuICBjaGFyYWN0ZXJfbWF4aW11bV9sZW5ndGg6IG51bWJlciB8IG51bGw7XG4gIHByZWNpc2lvbjogbnVtYmVyIHwgbnVsbDtcbiAgbnVtZXJpY19zY2FsZTogbnVtYmVyIHwgbnVsbDtcbiAgaXNfbnVsbGFibGU6IHN0cmluZztcbiAgY29sdW1uX2RlZmF1bHQ6IHN0cmluZyB8IG51bGw7XG4gIGlzX2dlbmVyYXRlZDogc3RyaW5nOyAvLyAncycgPSBTVE9SRUQsICd2JyA9IFZJUlRVQUwsICcnID0gbm9uZVxuICBnZW5lcmF0aW9uX2V4cHJlc3Npb246IHN0cmluZyB8IG51bGw7XG59O1xuXG50eXBlIFBnSW5kZXggPSB7XG4gIGluZGV4X25hbWU6IHN0cmluZztcbiAgY29sdW1uX25hbWU6IHN0cmluZztcbiAgaXNfdW5pcXVlOiBib29sZWFuO1xuICBpc19wcmltYXJ5OiBib29sZWFuO1xuICBpbmRleF90eXBlOiBzdHJpbmc7XG4gIG51bGxzX2ZpcnN0OiBib29sZWFuO1xuICBzb3J0X29yZGVyOiBcIkFTQ1wiIHwgXCJERVNDXCI7XG4gIG51bGxzX25vdF9kaXN0aW5jdDogYm9vbGVhbjtcbiAgY29sdW1uX29yZGVyOiBudW1iZXI7XG4gIGluZGV4X2RlZmluaXRpb246IHN0cmluZztcbn07XG5cbnR5cGUgUGdGb3JlaWduID0ge1xuICBjb25zdHJhaW50X25hbWU6IHN0cmluZztcbiAgY29sdW1uX25hbWU6IHN0cmluZztcbiAgZm9yZWlnbl90YWJsZV9uYW1lOiBzdHJpbmc7XG4gIGZvcmVpZ25fY29sdW1uX25hbWU6IHN0cmluZztcbiAgdXBkYXRlX3J1bGU6IHN0cmluZztcbiAgZGVsZXRlX3J1bGU6IHN0cmluZztcbn07XG5cbnR5cGUgUmF3Q2FwYWJsZUtuZXggPSBQaWNrPEtuZXgsIFwicmF3XCI+O1xuXG5jbGFzcyBQb3N0Z3JlU1FMU2NoZW1hUmVhZGVyQ2xhc3Mge1xuICBwcml2YXRlIHJlYWRvbmx5IGdlbmVyaWNJbmRleFR5cGVzID0gbmV3IFNldChbXCJidHJlZVwiLCBcImhhc2hcIiwgXCJnaW5cIiwgXCJnaXN0XCIsIFwicGdyb29uZ2FcIl0pO1xuXG4gIC8qKlxuICAgKiBEQuyXkOyEnCDthYzsnbTruJQg7KCV67O066W8IOydveyWtOyEnCBNaWdyYXRpb25TZXTsnYQg66eM65Ok7Ja07Ji164uI64ukLlxuICAgKiBAcGFyYW0gY29tcGFyZURCIEtuZXgg7J247Iqk7YS07IqkXG4gICAqIEBwYXJhbSB0YWJsZSDthYzsnbTruJQg7J2066aEXG4gICAqIEByZXR1cm5zIE1pZ3JhdGlvblNldCDqsJ3ssrRcbiAgICovXG4gIGFzeW5jIGdldE1pZ3JhdGlvblNldEZyb21EQihcbiAgICBjb21wYXJlREI6IFJhd0NhcGFibGVLbmV4LFxuICAgIHRhYmxlOiBzdHJpbmcsXG4gICk6IFByb21pc2U8TWlncmF0aW9uU2V0IHwgbnVsbD4ge1xuICAgIGxldCBkYkNvbHVtbnM6IFBnQ29sdW1uW10sIGRiSW5kZXhlczogUGdJbmRleFtdLCBkYkZvcmVpZ25zOiBQZ0ZvcmVpZ25bXTtcbiAgICB0cnkge1xuICAgICAgW2RiQ29sdW1ucywgZGJJbmRleGVzLCBkYkZvcmVpZ25zXSA9IGF3YWl0IHRoaXMucmVhZFRhYmxlKGNvbXBhcmVEQiwgdGFibGUpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIGlmIChlIGluc3RhbmNlb2YgRXJyb3IgJiYgZS5tZXNzYWdlLmluY2x1ZGVzKFwiVGFibGUgbm90IGZvdW5kXCIpKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIHZlY3RvciDsu6zrn7zsnZggZGltZW5zaW9ucyDsobDtmoxcbiAgICBjb25zdCB2ZWN0b3JEaW1lbnNpb25zID0gYXdhaXQgdGhpcy5nZXRWZWN0b3JEaW1lbnNpb25zKGNvbXBhcmVEQiwgdGFibGUpO1xuXG4gICAgY29uc3QgY29sdW1uczogTWlncmF0aW9uQ29sdW1uW10gPSBkYkNvbHVtbnMubWFwKChkYkNvbHVtbikgPT4ge1xuICAgICAgY29uc3QgZGJDb2xUeXBlID0gdGhpcy5yZXNvbHZlREJDb2xUeXBlKGRiQ29sdW1uKTtcblxuICAgICAgLy8gdmVjdG9yIO2DgOyeheyduCDqsr3smrAgZGltZW5zaW9ucyDshKTsoJVcbiAgICAgIGlmIChkYkNvbFR5cGUudHlwZSA9PT0gXCJ2ZWN0b3JcIikge1xuICAgICAgICBkYkNvbFR5cGUuZGltZW5zaW9ucyA9IHZlY3RvckRpbWVuc2lvbnNbZGJDb2x1bW4uY29sdW1uX25hbWVdID8/IDA7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5hbWU6IGRiQ29sdW1uLmNvbHVtbl9uYW1lLFxuICAgICAgICBudWxsYWJsZTogZGJDb2x1bW4uaXNfbnVsbGFibGUgPT09IFwiWUVTXCIsXG4gICAgICAgIC4uLmRiQ29sVHlwZSxcbiAgICAgICAgLy8gR2VuZXJhdGVkIENvbHVtbiDsspjrpqxcbiAgICAgICAgLi4uKCgpID0+IHtcbiAgICAgICAgICBpZiAoZGJDb2x1bW4uaXNfZ2VuZXJhdGVkID09PSBcInNcIiB8fCBkYkNvbHVtbi5pc19nZW5lcmF0ZWQgPT09IFwidlwiKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBnZW5lcmF0ZWQ6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiBkYkNvbHVtbi5pc19nZW5lcmF0ZWQgPT09IFwic1wiID8gXCJTVE9SRURcIiA6IFwiVklSVFVBTFwiLFxuICAgICAgICAgICAgICAgIGV4cHJlc3Npb246IGRiQ29sdW1uLmdlbmVyYXRpb25fZXhwcmVzc2lvbiA/PyBcIlwiLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICB9KSgpLFxuICAgICAgICAvLyBEZWZhdWx0IOqwkiDsspjrpqwgKEdlbmVyYXRlZCBDb2x1bW7snbQg7JWE64uMIOqyveyasOunjClcbiAgICAgICAgLi4uKCgpID0+IHtcbiAgICAgICAgICAvLyBHZW5lcmF0ZWQgQ29sdW1u7J2AIGRlZmF1bHQg6rCS7J20IOyXhuydjFxuICAgICAgICAgIGlmIChkYkNvbHVtbi5pc19nZW5lcmF0ZWQgPT09IFwic1wiIHx8IGRiQ29sdW1uLmlzX2dlbmVyYXRlZCA9PT0gXCJ2XCIpIHtcbiAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoZGJDb2x1bW4uY29sdW1uX2RlZmF1bHQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIFBvc3RncmVTUUwgZGVmYXVsdCDqsJIg7KCV66asIChuZXh0dmFsLCBDVVJSRU5UX1RJTUVTVEFNUCDrk7EpXG4gICAgICAgICAgICBsZXQgZGVmYXVsdFZhbHVlID0gZGJDb2x1bW4uY29sdW1uX2RlZmF1bHQ7XG5cbiAgICAgICAgICAgIC8vIG5leHR2YWwg7KCc6rGwIChTRVJJQUwg7YOA7J6FKVxuICAgICAgICAgICAgaWYgKGRlZmF1bHRWYWx1ZS5zdGFydHNXaXRoKFwibmV4dHZhbChcIikpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyDtg4DsnoUg7LqQ7Iqk7YyFIOygnOqxsCAo7JiIOiAnMSc6OmludGVnZXIg4oaSIDEpXG4gICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWUucmVwbGFjZSgvOjpbXFx3XFxzXSskL2csIFwiXCIpO1xuXG4gICAgICAgICAgICAvLyDrlLDsmLTtkZzqsIAgc2luZ2xlIHF1b3Rl7J24IOqyveyasCBkb3VibGUgcXVvdGXroZwg67OA7ZmYXG4gICAgICAgICAgICBpZiAoZGVmYXVsdFZhbHVlLnN0YXJ0c1dpdGgoXCInXCIpICYmIGRlZmF1bHRWYWx1ZS5lbmRzV2l0aChcIidcIikpIHtcbiAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gZGVmYXVsdFZhbHVlLnJlcGxhY2VBbGwoXCInXCIsICdcIicpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBkZWZhdWx0VG86IGRlZmF1bHRWYWx1ZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgfSkoKSxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvLyBQUklNQVJZIEtFWeyZgCBmb3JlaWduIGtleeyaqSDsnbjrjbHsiqQg7KCc7Jm4XG4gICAgY29uc3QgZGJJbmRleGVzR3JvdXAgPSBncm91cChcbiAgICAgIGRiSW5kZXhlcy5maWx0ZXIoXG4gICAgICAgIChkYkluZGV4KSA9PlxuICAgICAgICAgICFkYkluZGV4LmlzX3ByaW1hcnkgJiZcbiAgICAgICAgICAhZGJGb3JlaWducy5maW5kKChkYkZvcmVpZ24pID0+IGRiSW5kZXguaW5kZXhfbmFtZS5pbmNsdWRlcyhkYkZvcmVpZ24uY29uc3RyYWludF9uYW1lKSksXG4gICAgICApLFxuICAgICAgKGRiSW5kZXgpID0+IGRiSW5kZXguaW5kZXhfbmFtZSxcbiAgICApO1xuXG4gICAgLy8gaW5kZXhlcyDsspjrpqxcbiAgICBjb25zdCBpbmRleGVzOiBNaWdyYXRpb25JbmRleFtdID0gT2JqZWN0LmtleXMoZGJJbmRleGVzR3JvdXApLm1hcCgoaW5kZXhOYW1lKSA9PiB7XG4gICAgICBjb25zdCBjdXJyZW50SW5kZXhlcyA9IGRiSW5kZXhlc0dyb3VwW2luZGV4TmFtZV0/LnRvU29ydGVkKFxuICAgICAgICAobGVmdCwgcmlnaHQpID0+IGxlZnQuY29sdW1uX29yZGVyIC0gcmlnaHQuY29sdW1uX29yZGVyLFxuICAgICAgKTtcbiAgICAgIGFzc2VydChjdXJyZW50SW5kZXhlcyk7XG5cbiAgICAgIGNvbnN0IGZpcnN0SW5kZXggPSBjdXJyZW50SW5kZXhlc1swXTtcbiAgICAgIGNvbnN0IHBhcnNlZEluZGV4RGVmaW5pdGlvbiA9IHRoaXMucGFyc2VJbmRleERlZmluaXRpb24oZmlyc3RJbmRleC5pbmRleF9kZWZpbml0aW9uKTtcbiAgICAgIGNvbnN0IHJlc3RvcmVkSW5kZXhUeXBlID0gdGhpcy5yZXN0b3JlTWlncmF0aW9uSW5kZXhUeXBlKFxuICAgICAgICBmaXJzdEluZGV4LFxuICAgICAgICBwYXJzZWRJbmRleERlZmluaXRpb24uYWNjZXNzTWV0aG9kLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHVzaW5nID0gdGhpcy5yZXN0b3JlR2VuZXJpY1VzaW5nKFxuICAgICAgICBwYXJzZWRJbmRleERlZmluaXRpb24uYWNjZXNzTWV0aG9kID8/IGZpcnN0SW5kZXguaW5kZXhfdHlwZSxcbiAgICAgICk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IHJlc3RvcmVkSW5kZXhUeXBlLFxuICAgICAgICBuYW1lOiBpbmRleE5hbWUsXG4gICAgICAgIGNvbHVtbnM6IGN1cnJlbnRJbmRleGVzLm1hcCgoaWR4KSA9PiAoe1xuICAgICAgICAgIG5hbWU6IGlkeC5jb2x1bW5fbmFtZSxcbiAgICAgICAgICAuLi4odGhpcy5leHRyYWN0SW5kZXhDb2x1bW5PcGNsYXNzKFxuICAgICAgICAgICAgcGFyc2VkSW5kZXhEZWZpbml0aW9uLmNvbHVtbkRlZmluaXRpb25zW2lkeC5jb2x1bW5fb3JkZXIgLSAxXSxcbiAgICAgICAgICApXG4gICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICBvcGNsYXNzOiB0aGlzLmV4dHJhY3RJbmRleENvbHVtbk9wY2xhc3MoXG4gICAgICAgICAgICAgICAgICBwYXJzZWRJbmRleERlZmluaXRpb24uY29sdW1uRGVmaW5pdGlvbnNbaWR4LmNvbHVtbl9vcmRlciAtIDFdLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgIC4uLih1c2luZyA9PT0gXCJidHJlZVwiXG4gICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICBzb3J0T3JkZXI6IGlkeC5zb3J0X29yZGVyLFxuICAgICAgICAgICAgICAgIG51bGxzRmlyc3Q6IGlkeC5udWxsc19maXJzdCxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiB7fSksXG4gICAgICAgIH0pKSxcblxuICAgICAgICBudWxsc05vdERpc3RpbmN0OiBmaXJzdEluZGV4Lm51bGxzX25vdF9kaXN0aW5jdCxcbiAgICAgICAgLi4uKHVzaW5nID8geyB1c2luZyB9IDoge30pLFxuICAgICAgICAuLi50aGlzLnBhcnNlVmVjdG9ySW5kZXhPcHRpb25zKHJlc3RvcmVkSW5kZXhUeXBlLCBwYXJzZWRJbmRleERlZmluaXRpb24ud2l0aE9wdGlvbnMpLFxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIC8vIGZvcmVpZ25zIOyymOumrFxuICAgIGNvbnN0IGZvcmVpZ25zOiBNaWdyYXRpb25Gb3JlaWduW10gPSBkYkZvcmVpZ25zLm1hcCgoZGJGb3JlaWduKSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb2x1bW5zOiBbZGJGb3JlaWduLmNvbHVtbl9uYW1lXSxcbiAgICAgICAgdG86IGAke2RiRm9yZWlnbi5mb3JlaWduX3RhYmxlX25hbWV9LiR7ZGJGb3JlaWduLmZvcmVpZ25fY29sdW1uX25hbWV9YCxcbiAgICAgICAgb25VcGRhdGU6IHRoaXMubWFwQ29uc3RyYWludEFjdGlvbihkYkZvcmVpZ24udXBkYXRlX3J1bGUpLFxuICAgICAgICBvbkRlbGV0ZTogdGhpcy5tYXBDb25zdHJhaW50QWN0aW9uKGRiRm9yZWlnbi5kZWxldGVfcnVsZSksXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHRhYmxlLFxuICAgICAgY29sdW1ucyxcbiAgICAgIGluZGV4ZXMsXG4gICAgICBmb3JlaWducyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFBvc3RncmVTUUzsnZggY29uc3RyYWludCBhY3Rpb27snYQgS25leCDtmJXsi53snLzroZwg67OA7ZmYXG4gICAqL1xuICBwcml2YXRlIG1hcENvbnN0cmFpbnRBY3Rpb24oYWN0aW9uOiBzdHJpbmcpOiBSZWxhdGlvbk9uIHtcbiAgICBjb25zdCBhY3Rpb25NYXA6IFJlY29yZDxzdHJpbmcsIFJlbGF0aW9uT24+ID0ge1xuICAgICAgXCJOTyBBQ1RJT05cIjogXCJOTyBBQ1RJT05cIixcbiAgICAgIFJFU1RSSUNUOiBcIlJFU1RSSUNUXCIsXG4gICAgICBDQVNDQURFOiBcIkNBU0NBREVcIixcbiAgICAgIFwiU0VUIE5VTExcIjogXCJTRVQgTlVMTFwiLFxuICAgICAgXCJTRVQgREVGQVVMVFwiOiBcIlNFVCBERUZBVUxUXCIsXG4gICAgfTtcbiAgICByZXR1cm4gYWN0aW9uTWFwW2FjdGlvbl0gPz8gXCJOTyBBQ1RJT05cIjtcbiAgfVxuXG4gIC8qKlxuICAgKiDquLDsobQg7YWM7J2067iUIOydveyWtOyEnCBjb2xzLCBpbmRleGVzLCBmb3JlaWducyDrsJjtmZhcbiAgICovXG4gIGFzeW5jIHJlYWRUYWJsZShcbiAgICBjb21wYXJlREI6IFJhd0NhcGFibGVLbmV4LFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICApOiBQcm9taXNlPFtQZ0NvbHVtbltdLCBQZ0luZGV4W10sIFBnRm9yZWlnbltdXT4ge1xuICAgIC8vIENvbHVtbnMg7KGw7ZqMIChHZW5lcmF0ZWQgQ29sdW1uIOygleuztCDtj6ztlagpXG4gICAgY29uc3QgY29sdW1uc1F1ZXJ5ID0gYFxuICAgICAgU0VMRUNUXG4gICAgICAgIGMuY29sdW1uX25hbWUsXG4gICAgICAgIGMuZGF0YV90eXBlLFxuICAgICAgICBjLnVkdF9uYW1lLFxuICAgICAgICBDT0FMRVNDRShcbiAgICAgICAgICBjLmNoYXJhY3Rlcl9tYXhpbXVtX2xlbmd0aCxcbiAgICAgICAgICBDQVNFIFdIRU4gYy5kYXRhX3R5cGUgPSAnQVJSQVknIEFORCBhLmF0dHR5cG1vZCA+IDBcbiAgICAgICAgICAgIFRIRU4gYS5hdHR0eXBtb2QgLSA0XG4gICAgICAgICAgICBFTFNFIE5VTExcbiAgICAgICAgICBFTkRcbiAgICAgICAgKSBBUyBjaGFyYWN0ZXJfbWF4aW11bV9sZW5ndGgsXG4gICAgICAgIENPQUxFU0NFKGMuZGF0ZXRpbWVfcHJlY2lzaW9uLCBjLm51bWVyaWNfcHJlY2lzaW9uKSBBUyBwcmVjaXNpb24sXG4gICAgICAgIGMubnVtZXJpY19zY2FsZSxcbiAgICAgICAgYy5pc19udWxsYWJsZSxcbiAgICAgICAgYy5jb2x1bW5fZGVmYXVsdCxcbiAgICAgICAgQ09BTEVTQ0UoYS5hdHRnZW5lcmF0ZWQsICcnKSBhcyBpc19nZW5lcmF0ZWQsXG4gICAgICAgIGMuZ2VuZXJhdGlvbl9leHByZXNzaW9uXG4gICAgICBGUk9NIGluZm9ybWF0aW9uX3NjaGVtYS5jb2x1bW5zIGNcbiAgICAgIExFRlQgSk9JTiBwZ19hdHRyaWJ1dGUgYSBPTiBhLmF0dG5hbWUgPSBjLmNvbHVtbl9uYW1lXG4gICAgICAgIEFORCBhLmF0dHJlbGlkID0gKFxuICAgICAgICAgIFNFTEVDVCBvaWQgRlJPTSBwZ19jbGFzcyBXSEVSRSByZWxuYW1lID0gYy50YWJsZV9uYW1lXG4gICAgICAgICAgQU5EIHJlbG5hbWVzcGFjZSA9IChTRUxFQ1Qgb2lkIEZST00gcGdfbmFtZXNwYWNlIFdIRVJFIG5zcG5hbWUgPSBjLnRhYmxlX3NjaGVtYSlcbiAgICAgICAgKVxuICAgICAgV0hFUkUgYy50YWJsZV9uYW1lID0gP1xuICAgICAgICBBTkQgYy50YWJsZV9zY2hlbWEgPSAncHVibGljJ1xuICAgICAgT1JERVIgQlkgYy5vcmRpbmFsX3Bvc2l0aW9uXG4gICAgYDtcbiAgICBjb25zdCBjb2x1bW5zID0gKGF3YWl0IGNvbXBhcmVEQi5yYXcoY29sdW1uc1F1ZXJ5LCBbdGFibGVOYW1lXSkpLnJvd3MgYXMgUGdDb2x1bW5bXTtcbiAgICBpZiAoY29sdW1ucy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGFibGUgbm90IGZvdW5kOiAke3RhYmxlTmFtZX1gKTtcbiAgICB9XG5cbiAgICAvLyBJbmRleGVzIOyhsO2ajCAoUEdyb29uZ2Eg7ZGc7ZiE7IudIOyduOuNseyKpCDtj6ztlagpXG4gICAgY29uc3QgaW5kZXhlc1F1ZXJ5ID0gYFxuICAgICAgU0VMRUNUXG4gICAgICAgICAgaS5yZWxuYW1lIEFTIGluZGV4X25hbWUsXG4gICAgICAgICAgQ0FTRVxuICAgICAgICAgICAgICBXSEVOIGFtLmFtbmFtZSA9ICdwZ3Jvb25nYScgQU5EIHUuYXR0bnVtID0gMCBUSEVOXG4gICAgICAgICAgICAgICAgICByZWdleHBfcmVwbGFjZShcbiAgICAgICAgICAgICAgICAgICAgICByZWdleHBfcmVwbGFjZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgVFJJTShwZ3Jvb25nYV9jb2wuY29sdW1uX2V4cHIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAnOjp0ZXh0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICdnJ1xuICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgJ1soKV0nLFxuICAgICAgICAgICAgICAgICAgICAgICcnLFxuICAgICAgICAgICAgICAgICAgICAgICdnJ1xuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBFTFNFIGEuYXR0bmFtZVxuICAgICAgICAgIEVORCBBUyBjb2x1bW5fbmFtZSxcbiAgICAgICAgICBpeC5pbmRpc3VuaXF1ZSBBUyBpc191bmlxdWUsXG4gICAgICAgICAgaXguaW5kaXNwcmltYXJ5IEFTIGlzX3ByaW1hcnksXG4gICAgICAgICAgYW0uYW1uYW1lIEFTIGluZGV4X3R5cGUsXG4gICAgICAgICAgQ09BTEVTQ0UoKHUub3B0ICYgMikgPSAyLCBGQUxTRSkgQVMgbnVsbHNfZmlyc3QsXG4gICAgICAgICAgQ0FTRSBcbiAgICAgICAgICAgICAgV0hFTiAodS5vcHQgJiAxKSA9IDEgVEhFTiAnREVTQydcbiAgICAgICAgICAgICAgRUxTRSAnQVNDJ1xuICAgICAgICAgIEVORCBBUyBzb3J0X29yZGVyLFxuICAgICAgICAgIGl4LmluZG51bGxzbm90ZGlzdGluY3QgQVMgbnVsbHNfbm90X2Rpc3RpbmN0LFxuICAgICAgICAgIHUub3JkIEFTIGNvbHVtbl9vcmRlcixcbiAgICAgICAgICBwZ19nZXRfaW5kZXhkZWYoaXguaW5kZXhyZWxpZCkgQVMgaW5kZXhfZGVmaW5pdGlvblxuICAgICAgRlJPTSBwZ19jbGFzcyB0XG4gICAgICBKT0lOIHBnX2luZGV4IGl4IE9OIHQub2lkID0gaXguaW5kcmVsaWRcbiAgICAgIEpPSU4gcGdfY2xhc3MgaSBPTiBpLm9pZCA9IGl4LmluZGV4cmVsaWRcbiAgICAgIEpPSU4gcGdfYW0gYW0gT04gaS5yZWxhbSA9IGFtLm9pZFxuICAgICAgSk9JTiBMQVRFUkFMIHVubmVzdChpeC5pbmRrZXksIGl4LmluZG9wdGlvbilcbiAgICAgICAgICBXSVRIIE9SRElOQUxJVFkgQVMgdShhdHRudW0sIG9wdCwgb3JkKSBPTiB0cnVlXG4gICAgICBMRUZUIEpPSU4gcGdfYXR0cmlidXRlIGEgT04gYS5hdHRyZWxpZCA9IHQub2lkIFxuICAgICAgICAgIEFORCBhLmF0dG51bSA9IHUuYXR0bnVtIFxuICAgICAgICAgIEFORCB1LmF0dG51bSA+IDBcbiAgICAgIExFRlQgSk9JTiBMQVRFUkFMIChcbiAgICAgICAgICBTRUxFQ1QgXG4gICAgICAgICAgICAgIHVubmVzdChcbiAgICAgICAgICAgICAgICAgIENBU0UgXG4gICAgICAgICAgICAgICAgICAgICAgV0hFTiBwZ19nZXRfZXhwcihpeC5pbmRleHBycywgaXguaW5kcmVsaWQpIH4gJ15BUlJBWVxcXFxbJyBUSEVOXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ190b19hcnJheShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2V4cF9yZXBsYWNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBnX2dldF9leHByKGl4LmluZGV4cHJzLCBpeC5pbmRyZWxpZCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ15BUlJBWVxcXFxbKC4qKVxcXFxdJCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1xcXFwxJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcsICdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgIEVMU0VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgQVJSQVlbcGdfZ2V0X2V4cHIoaXguaW5kZXhwcnMsIGl4LmluZHJlbGlkKV1cbiAgICAgICAgICAgICAgICAgIEVORFxuICAgICAgICAgICAgICApIGFzIGNvbHVtbl9leHByXG4gICAgICApIHBncm9vbmdhX2NvbCBPTiBhbS5hbW5hbWUgPSAncGdyb29uZ2EnIEFORCB1LmF0dG51bSA9IDBcbiAgICAgIFdIRVJFIHQucmVsbmFtZSA9ID9cbiAgICAgICAgICBBTkQgKHUuYXR0bnVtID4gMCBPUiAoYW0uYW1uYW1lID0gJ3Bncm9vbmdhJyBBTkQgdS5hdHRudW0gPSAwKSlcbiAgICAgIE9SREVSIEJZIGkucmVsbmFtZSwgdS5vcmQ7XG5gO1xuICAgIGNvbnN0IGluZGV4ZXMgPSAoYXdhaXQgY29tcGFyZURCLnJhdyhpbmRleGVzUXVlcnksIFt0YWJsZU5hbWVdKSkucm93cztcblxuICAgIC8vIEZvcmVpZ24gS2V5cyDsobDtmoxcbiAgICBjb25zdCBmb3JlaWduc1F1ZXJ5ID0gYFxuICAgICAgU0VMRUNUXG4gICAgICAgIHRjLmNvbnN0cmFpbnRfbmFtZSxcbiAgICAgICAga2N1LmNvbHVtbl9uYW1lLFxuICAgICAgICBjY3UudGFibGVfbmFtZSBBUyBmb3JlaWduX3RhYmxlX25hbWUsXG4gICAgICAgIGNjdS5jb2x1bW5fbmFtZSBBUyBmb3JlaWduX2NvbHVtbl9uYW1lLFxuICAgICAgICByYy51cGRhdGVfcnVsZSxcbiAgICAgICAgcmMuZGVsZXRlX3J1bGVcbiAgICAgIEZST00gaW5mb3JtYXRpb25fc2NoZW1hLnRhYmxlX2NvbnN0cmFpbnRzIEFTIHRjXG4gICAgICBKT0lOIGluZm9ybWF0aW9uX3NjaGVtYS5rZXlfY29sdW1uX3VzYWdlIEFTIGtjdVxuICAgICAgICBPTiB0Yy5jb25zdHJhaW50X25hbWUgPSBrY3UuY29uc3RyYWludF9uYW1lXG4gICAgICAgIEFORCB0Yy50YWJsZV9zY2hlbWEgPSBrY3UudGFibGVfc2NoZW1hXG4gICAgICBKT0lOIGluZm9ybWF0aW9uX3NjaGVtYS5jb25zdHJhaW50X2NvbHVtbl91c2FnZSBBUyBjY3VcbiAgICAgICAgT04gY2N1LmNvbnN0cmFpbnRfbmFtZSA9IHRjLmNvbnN0cmFpbnRfbmFtZVxuICAgICAgICBBTkQgY2N1LnRhYmxlX3NjaGVtYSA9IHRjLnRhYmxlX3NjaGVtYVxuICAgICAgSk9JTiBpbmZvcm1hdGlvbl9zY2hlbWEucmVmZXJlbnRpYWxfY29uc3RyYWludHMgQVMgcmNcbiAgICAgICAgT04gcmMuY29uc3RyYWludF9uYW1lID0gdGMuY29uc3RyYWludF9uYW1lXG4gICAgICAgIEFORCByYy5jb25zdHJhaW50X3NjaGVtYSA9IHRjLnRhYmxlX3NjaGVtYVxuICAgICAgV0hFUkUgdGMuY29uc3RyYWludF90eXBlID0gJ0ZPUkVJR04gS0VZJ1xuICAgICAgICBBTkQgdGMudGFibGVfbmFtZSA9ID9cbiAgICBgO1xuICAgIGNvbnN0IGZvcmVpZ25zID0gKGF3YWl0IGNvbXBhcmVEQi5yYXcoZm9yZWlnbnNRdWVyeSwgW3RhYmxlTmFtZV0pKS5yb3dzO1xuXG4gICAgcmV0dXJuIFtjb2x1bW5zLCBpbmRleGVzLCBmb3JlaWduc107XG4gIH1cblxuICBwcml2YXRlIHJlc3RvcmVNaWdyYXRpb25JbmRleFR5cGUoXG4gICAgaW5kZXg6IFBpY2s8UGdJbmRleCwgXCJpc191bmlxdWVcIiB8IFwiaW5kZXhfdHlwZVwiPixcbiAgICBhY2Nlc3NNZXRob2Q/OiBzdHJpbmcsXG4gICk6IE1pZ3JhdGlvbkluZGV4W1widHlwZVwiXSB7XG4gICAgY29uc3QgcmVzb2x2ZWRBY2Nlc3NNZXRob2QgPSAoYWNjZXNzTWV0aG9kID8/IGluZGV4LmluZGV4X3R5cGUpLnRvTG93ZXJDYXNlKCk7XG5cbiAgICBpZiAocmVzb2x2ZWRBY2Nlc3NNZXRob2QgPT09IFwiaG5zd1wiIHx8IHJlc29sdmVkQWNjZXNzTWV0aG9kID09PSBcIml2ZmZsYXRcIikge1xuICAgICAgcmV0dXJuIHJlc29sdmVkQWNjZXNzTWV0aG9kO1xuICAgIH1cblxuICAgIHJldHVybiBpbmRleC5pc191bmlxdWUgPyBcInVuaXF1ZVwiIDogXCJpbmRleFwiO1xuICB9XG5cbiAgcHJpdmF0ZSByZXN0b3JlR2VuZXJpY1VzaW5nKFxuICAgIGFjY2Vzc01ldGhvZDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICApOiBNaWdyYXRpb25JbmRleFtcInVzaW5nXCJdIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIWFjY2Vzc01ldGhvZCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBjb25zdCBub3JtYWxpemVkID0gYWNjZXNzTWV0aG9kLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKCF0aGlzLmdlbmVyaWNJbmRleFR5cGVzLmhhcyhub3JtYWxpemVkKSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICByZXR1cm4gbm9ybWFsaXplZCBhcyBNaWdyYXRpb25JbmRleFtcInVzaW5nXCJdO1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZVZlY3RvckluZGV4T3B0aW9ucyhcbiAgICB0eXBlOiBNaWdyYXRpb25JbmRleFtcInR5cGVcIl0sXG4gICAgd2l0aE9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gICk6IFBpY2s8TWlncmF0aW9uSW5kZXgsIFwibVwiIHwgXCJlZkNvbnN0cnVjdGlvblwiIHwgXCJsaXN0c1wiPiB7XG4gICAgaWYgKHR5cGUgPT09IFwiaG5zd1wiKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi4odGhpcy5wYXJzZUludGVnZXJPcHRpb24od2l0aE9wdGlvbnMubSkgIT09IHVuZGVmaW5lZFxuICAgICAgICAgID8geyBtOiB0aGlzLnBhcnNlSW50ZWdlck9wdGlvbih3aXRoT3B0aW9ucy5tKSB9XG4gICAgICAgICAgOiB7fSksXG4gICAgICAgIC4uLih0aGlzLnBhcnNlSW50ZWdlck9wdGlvbih3aXRoT3B0aW9ucy5lZl9jb25zdHJ1Y3Rpb24pICE9PSB1bmRlZmluZWRcbiAgICAgICAgICA/IHsgZWZDb25zdHJ1Y3Rpb246IHRoaXMucGFyc2VJbnRlZ2VyT3B0aW9uKHdpdGhPcHRpb25zLmVmX2NvbnN0cnVjdGlvbikgfVxuICAgICAgICAgIDoge30pLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAodHlwZSA9PT0gXCJpdmZmbGF0XCIpIHtcbiAgICAgIHJldHVybiB0aGlzLnBhcnNlSW50ZWdlck9wdGlvbih3aXRoT3B0aW9ucy5saXN0cykgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IHsgbGlzdHM6IHRoaXMucGFyc2VJbnRlZ2VyT3B0aW9uKHdpdGhPcHRpb25zLmxpc3RzKSB9XG4gICAgICAgIDoge307XG4gICAgfVxuXG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZUludGVnZXJPcHRpb24odmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJzZWQgPSBOdW1iZXIucGFyc2VJbnQodmFsdWUsIDEwKTtcbiAgICByZXR1cm4gTnVtYmVyLmlzTmFOKHBhcnNlZCkgPyB1bmRlZmluZWQgOiBwYXJzZWQ7XG4gIH1cblxuICBwcml2YXRlIGV4dHJhY3RJbmRleENvbHVtbk9wY2xhc3MoY29sdW1uRGVmaW5pdGlvbjogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIWNvbHVtbkRlZmluaXRpb24pIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgdHJpbW1lZCA9IGNvbHVtbkRlZmluaXRpb25cbiAgICAgIC5yZXBsYWNlKC9cXHMrTlVMTFNcXHMrKEZJUlNUfExBU1QpXFxzKiQvaSwgXCJcIilcbiAgICAgIC5yZXBsYWNlKC9cXHMrKEFTQ3xERVNDKVxccyokL2ksIFwiXCIpXG4gICAgICAudHJpbSgpO1xuICAgIGNvbnN0IHRva2VucyA9IHRoaXMudG9rZW5pemVUb3BMZXZlbCh0cmltbWVkKTtcblxuICAgIGlmICh0b2tlbnMubGVuZ3RoIDwgMikge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAodG9rZW5zW3Rva2Vucy5sZW5ndGggLSAyXT8udG9VcHBlckNhc2UoKSA9PT0gXCJDT0xMQVRFXCIpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRva2Vucy5hdCgtMSk7XG4gIH1cblxuICBwcml2YXRlIHBhcnNlSW5kZXhEZWZpbml0aW9uKGluZGV4RGVmaW5pdGlvbjogc3RyaW5nKToge1xuICAgIGFjY2Vzc01ldGhvZD86IHN0cmluZztcbiAgICBjb2x1bW5EZWZpbml0aW9uczogc3RyaW5nW107XG4gICAgd2l0aE9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIH0ge1xuICAgIGNvbnN0IGFjY2Vzc01ldGhvZCA9IGluZGV4RGVmaW5pdGlvbi5tYXRjaCgvXFxiVVNJTkdcXHMrKFthLXpfXVtcXHddKikvaSk/LlsxXT8udG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCB1c2luZ01hdGNoSW5kZXggPSBpbmRleERlZmluaXRpb24uc2VhcmNoKC9cXGJVU0lOR1xcYi9pKTtcbiAgICBjb25zdCBjb2x1bW5zU3RhcnQgPSB1c2luZ01hdGNoSW5kZXggPj0gMCA/IGluZGV4RGVmaW5pdGlvbi5pbmRleE9mKFwiKFwiLCB1c2luZ01hdGNoSW5kZXgpIDogLTE7XG4gICAgY29uc3QgY29sdW1uc0VuZCA9XG4gICAgICBjb2x1bW5zU3RhcnQgPj0gMCA/IHRoaXMuZmluZE1hdGNoaW5nUGFyZW50aGVzaXMoaW5kZXhEZWZpbml0aW9uLCBjb2x1bW5zU3RhcnQpIDogLTE7XG4gICAgY29uc3QgY29sdW1uRGVmaW5pdGlvbnMgPVxuICAgICAgY29sdW1uc1N0YXJ0ID49IDAgJiYgY29sdW1uc0VuZCA+IGNvbHVtbnNTdGFydFxuICAgICAgICA/IHRoaXMuc3BsaXRUb3BMZXZlbChpbmRleERlZmluaXRpb24uc2xpY2UoY29sdW1uc1N0YXJ0ICsgMSwgY29sdW1uc0VuZCksIFwiLFwiKVxuICAgICAgICA6IFtdO1xuXG4gICAgY29uc3Qgd2l0aE1hdGNoID0gL1xcYldJVEhcXHMqXFwoL2kuZXhlYyhpbmRleERlZmluaXRpb24pO1xuICAgIGNvbnN0IHdpdGhTdGFydCA9IHdpdGhNYXRjaCA/IGluZGV4RGVmaW5pdGlvbi5pbmRleE9mKFwiKFwiLCB3aXRoTWF0Y2guaW5kZXgpIDogLTE7XG4gICAgY29uc3Qgd2l0aEVuZCA9IHdpdGhTdGFydCA+PSAwID8gdGhpcy5maW5kTWF0Y2hpbmdQYXJlbnRoZXNpcyhpbmRleERlZmluaXRpb24sIHdpdGhTdGFydCkgOiAtMTtcbiAgICBjb25zdCB3aXRoT3B0aW9ucyA9XG4gICAgICB3aXRoU3RhcnQgPj0gMCAmJiB3aXRoRW5kID4gd2l0aFN0YXJ0XG4gICAgICAgID8gdGhpcy5wYXJzZUluZGV4T3B0aW9uRW50cmllcyhpbmRleERlZmluaXRpb24uc2xpY2Uod2l0aFN0YXJ0ICsgMSwgd2l0aEVuZCkpXG4gICAgICAgIDoge307XG5cbiAgICByZXR1cm4ge1xuICAgICAgYWNjZXNzTWV0aG9kLFxuICAgICAgY29sdW1uRGVmaW5pdGlvbnMsXG4gICAgICB3aXRoT3B0aW9ucyxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZUluZGV4T3B0aW9uRW50cmllcyhvcHRpb25Tb3VyY2U6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLnNwbGl0VG9wTGV2ZWwob3B0aW9uU291cmNlLCBcIixcIikucmVkdWNlPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+KChyZXN1bHQsIGVudHJ5KSA9PiB7XG4gICAgICBjb25zdCBtYXRjaGVkID0gZW50cnkudHJpbSgpLm1hdGNoKC9eKFthLXpfXVtcXHddKilcXHMqPVxccyooLispJC9pKTtcbiAgICAgIGlmICghbWF0Y2hlZCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBbLCBrZXksIHJhd1ZhbHVlXSA9IG1hdGNoZWQ7XG4gICAgICByZXN1bHRba2V5LnRvTG93ZXJDYXNlKCldID0gcmF3VmFsdWUudHJpbSgpLnJlcGxhY2UoL15bJ1wiXXxbJ1wiXSQvZywgXCJcIik7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sIHt9KTtcbiAgfVxuXG4gIHByaXZhdGUgc3BsaXRUb3BMZXZlbChzb3VyY2U6IHN0cmluZywgZGVsaW1pdGVyOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgaXRlbXM6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IHN0YXJ0ID0gMDtcbiAgICBsZXQgcGFyZW5EZXB0aCA9IDA7XG4gICAgbGV0IGJyYWNrZXREZXB0aCA9IDA7XG4gICAgbGV0IGluU2luZ2xlUXVvdGUgPSBmYWxzZTtcbiAgICBsZXQgaW5Eb3VibGVRdW90ZSA9IGZhbHNlO1xuXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHNvdXJjZS5sZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICAgIGNvbnN0IGNoYXIgPSBzb3VyY2VbaW5kZXhdO1xuICAgICAgY29uc3QgbmV4dENoYXIgPSBzb3VyY2VbaW5kZXggKyAxXTtcblxuICAgICAgaWYgKGNoYXIgPT09IFwiJ1wiICYmICFpbkRvdWJsZVF1b3RlKSB7XG4gICAgICAgIGlmIChpblNpbmdsZVF1b3RlICYmIG5leHRDaGFyID09PSBcIidcIikge1xuICAgICAgICAgIGluZGV4ICs9IDE7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaW5TaW5nbGVRdW90ZSA9ICFpblNpbmdsZVF1b3RlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNoYXIgPT09ICdcIicgJiYgIWluU2luZ2xlUXVvdGUpIHtcbiAgICAgICAgaWYgKGluRG91YmxlUXVvdGUgJiYgbmV4dENoYXIgPT09ICdcIicpIHtcbiAgICAgICAgICBpbmRleCArPSAxO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGluRG91YmxlUXVvdGUgPSAhaW5Eb3VibGVRdW90ZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChpblNpbmdsZVF1b3RlIHx8IGluRG91YmxlUXVvdGUpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChjaGFyID09PSBcIihcIikge1xuICAgICAgICBwYXJlbkRlcHRoICs9IDE7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGNoYXIgPT09IFwiKVwiKSB7XG4gICAgICAgIHBhcmVuRGVwdGggLT0gMTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoY2hhciA9PT0gXCJbXCIpIHtcbiAgICAgICAgYnJhY2tldERlcHRoICs9IDE7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGNoYXIgPT09IFwiXVwiKSB7XG4gICAgICAgIGJyYWNrZXREZXB0aCAtPSAxO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNoYXIgPT09IGRlbGltaXRlciAmJiBwYXJlbkRlcHRoID09PSAwICYmIGJyYWNrZXREZXB0aCA9PT0gMCkge1xuICAgICAgICBpdGVtcy5wdXNoKHNvdXJjZS5zbGljZShzdGFydCwgaW5kZXgpLnRyaW0oKSk7XG4gICAgICAgIHN0YXJ0ID0gaW5kZXggKyAxO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHRhaWwgPSBzb3VyY2Uuc2xpY2Uoc3RhcnQpLnRyaW0oKTtcbiAgICBpZiAodGFpbC5sZW5ndGggPiAwKSB7XG4gICAgICBpdGVtcy5wdXNoKHRhaWwpO1xuICAgIH1cblxuICAgIHJldHVybiBpdGVtcztcbiAgfVxuXG4gIHByaXZhdGUgdG9rZW5pemVUb3BMZXZlbChzb3VyY2U6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCB0b2tlbnM6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IHN0YXJ0ID0gLTE7XG4gICAgbGV0IHBhcmVuRGVwdGggPSAwO1xuICAgIGxldCBicmFja2V0RGVwdGggPSAwO1xuICAgIGxldCBpblNpbmdsZVF1b3RlID0gZmFsc2U7XG4gICAgbGV0IGluRG91YmxlUXVvdGUgPSBmYWxzZTtcblxuICAgIGNvbnN0IHB1c2hUb2tlbiA9IChlbmRJbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICBpZiAoc3RhcnQgPCAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdG9rZW4gPSBzb3VyY2Uuc2xpY2Uoc3RhcnQsIGVuZEluZGV4KS50cmltKCk7XG4gICAgICBpZiAodG9rZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG4gICAgICB9XG4gICAgICBzdGFydCA9IC0xO1xuICAgIH07XG5cbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgc291cmNlLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAgY29uc3QgY2hhciA9IHNvdXJjZVtpbmRleF07XG4gICAgICBjb25zdCBuZXh0Q2hhciA9IHNvdXJjZVtpbmRleCArIDFdO1xuXG4gICAgICBpZiAoY2hhciA9PT0gXCInXCIgJiYgIWluRG91YmxlUXVvdGUpIHtcbiAgICAgICAgaWYgKHN0YXJ0IDwgMCkge1xuICAgICAgICAgIHN0YXJ0ID0gaW5kZXg7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGluU2luZ2xlUXVvdGUgJiYgbmV4dENoYXIgPT09IFwiJ1wiKSB7XG4gICAgICAgICAgaW5kZXggKz0gMTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpblNpbmdsZVF1b3RlID0gIWluU2luZ2xlUXVvdGU7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2hhciA9PT0gJ1wiJyAmJiAhaW5TaW5nbGVRdW90ZSkge1xuICAgICAgICBpZiAoc3RhcnQgPCAwKSB7XG4gICAgICAgICAgc3RhcnQgPSBpbmRleDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5Eb3VibGVRdW90ZSAmJiBuZXh0Q2hhciA9PT0gJ1wiJykge1xuICAgICAgICAgIGluZGV4ICs9IDE7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaW5Eb3VibGVRdW90ZSA9ICFpbkRvdWJsZVF1b3RlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFpblNpbmdsZVF1b3RlICYmICFpbkRvdWJsZVF1b3RlKSB7XG4gICAgICAgIGlmIChjaGFyID09PSBcIihcIikge1xuICAgICAgICAgIGlmIChzdGFydCA8IDApIHtcbiAgICAgICAgICAgIHN0YXJ0ID0gaW5kZXg7XG4gICAgICAgICAgfVxuICAgICAgICAgIHBhcmVuRGVwdGggKz0gMTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hhciA9PT0gXCIpXCIpIHtcbiAgICAgICAgICBwYXJlbkRlcHRoIC09IDE7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoYXIgPT09IFwiW1wiKSB7XG4gICAgICAgICAgaWYgKHN0YXJ0IDwgMCkge1xuICAgICAgICAgICAgc3RhcnQgPSBpbmRleDtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJhY2tldERlcHRoICs9IDE7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoYXIgPT09IFwiXVwiKSB7XG4gICAgICAgICAgYnJhY2tldERlcHRoIC09IDE7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoL1xccy8udGVzdChjaGFyKSAmJiBwYXJlbkRlcHRoID09PSAwICYmIGJyYWNrZXREZXB0aCA9PT0gMCkge1xuICAgICAgICAgIHB1c2hUb2tlbihpbmRleCk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHN0YXJ0IDwgMCkge1xuICAgICAgICBzdGFydCA9IGluZGV4O1xuICAgICAgfVxuICAgIH1cblxuICAgIHB1c2hUb2tlbihzb3VyY2UubGVuZ3RoKTtcbiAgICByZXR1cm4gdG9rZW5zO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5kTWF0Y2hpbmdQYXJlbnRoZXNpcyhzb3VyY2U6IHN0cmluZywgb3BlbkluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGxldCBkZXB0aCA9IDA7XG4gICAgbGV0IGluU2luZ2xlUXVvdGUgPSBmYWxzZTtcbiAgICBsZXQgaW5Eb3VibGVRdW90ZSA9IGZhbHNlO1xuXG4gICAgZm9yIChsZXQgaW5kZXggPSBvcGVuSW5kZXg7IGluZGV4IDwgc291cmNlLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAgY29uc3QgY2hhciA9IHNvdXJjZVtpbmRleF07XG4gICAgICBjb25zdCBuZXh0Q2hhciA9IHNvdXJjZVtpbmRleCArIDFdO1xuXG4gICAgICBpZiAoY2hhciA9PT0gXCInXCIgJiYgIWluRG91YmxlUXVvdGUpIHtcbiAgICAgICAgaWYgKGluU2luZ2xlUXVvdGUgJiYgbmV4dENoYXIgPT09IFwiJ1wiKSB7XG4gICAgICAgICAgaW5kZXggKz0gMTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpblNpbmdsZVF1b3RlID0gIWluU2luZ2xlUXVvdGU7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2hhciA9PT0gJ1wiJyAmJiAhaW5TaW5nbGVRdW90ZSkge1xuICAgICAgICBpZiAoaW5Eb3VibGVRdW90ZSAmJiBuZXh0Q2hhciA9PT0gJ1wiJykge1xuICAgICAgICAgIGluZGV4ICs9IDE7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaW5Eb3VibGVRdW90ZSA9ICFpbkRvdWJsZVF1b3RlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGluU2luZ2xlUXVvdGUgfHwgaW5Eb3VibGVRdW90ZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNoYXIgPT09IFwiKFwiKSB7XG4gICAgICAgIGRlcHRoICs9IDE7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2hhciA9PT0gXCIpXCIpIHtcbiAgICAgICAgZGVwdGggLT0gMTtcbiAgICAgICAgaWYgKGRlcHRoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIC0xO1xuICB9XG5cbiAgLyoqXG4gICAqIO2KueyglSDthYzsnbTruJTsnZggUEvrpbwg7LC47KGw7ZWY64qUIOuLpOuluCDthYzsnbTruJTsnZggRksg66qp66Gd7J2EIOyhsO2ajO2VqeuLiOuLpC5cbiAgICogUEsg7YOA7J6FIOuzgOqyvSDsi5wg6rSA66CoIEZLIOygnOyVveyhsOqxtOydhCDsgq3soJwv67O16rWs7ZWY6riwIOychO2VtCDsgqzsmqnrkKnri4jri6QuXG4gICAqL1xuICBhc3luYyBnZXRSZWZlcmVuY2luZ0ZvcmVpZ25LZXlzKGRiOiBLbmV4LCB0YWJsZU5hbWU6IHN0cmluZyk6IFByb21pc2U8UmVmZXJlbmNpbmdGb3JlaWduS2V5W10+IHtcbiAgICBjb25zdCBxdWVyeSA9IGBcbiAgICAgIFNFTEVDVFxuICAgICAgICB0Yy50YWJsZV9uYW1lLFxuICAgICAgICB0Yy5jb25zdHJhaW50X25hbWUsXG4gICAgICAgIGtjdS5jb2x1bW5fbmFtZSxcbiAgICAgICAgY2N1LnRhYmxlX25hbWUgQVMgcmVmZXJlbmNlZF90YWJsZV9uYW1lLFxuICAgICAgICBjY3UuY29sdW1uX25hbWUgQVMgcmVmZXJlbmNlZF9jb2x1bW5fbmFtZSxcbiAgICAgICAgcmMudXBkYXRlX3J1bGUsXG4gICAgICAgIHJjLmRlbGV0ZV9ydWxlXG4gICAgICBGUk9NIGluZm9ybWF0aW9uX3NjaGVtYS50YWJsZV9jb25zdHJhaW50cyBBUyB0Y1xuICAgICAgSk9JTiBpbmZvcm1hdGlvbl9zY2hlbWEua2V5X2NvbHVtbl91c2FnZSBBUyBrY3VcbiAgICAgICAgT04gdGMuY29uc3RyYWludF9uYW1lID0ga2N1LmNvbnN0cmFpbnRfbmFtZVxuICAgICAgICBBTkQgdGMudGFibGVfc2NoZW1hID0ga2N1LnRhYmxlX3NjaGVtYVxuICAgICAgSk9JTiBpbmZvcm1hdGlvbl9zY2hlbWEuY29uc3RyYWludF9jb2x1bW5fdXNhZ2UgQVMgY2N1XG4gICAgICAgIE9OIGNjdS5jb25zdHJhaW50X25hbWUgPSB0Yy5jb25zdHJhaW50X25hbWVcbiAgICAgICAgQU5EIGNjdS50YWJsZV9zY2hlbWEgPSB0Yy50YWJsZV9zY2hlbWFcbiAgICAgIEpPSU4gaW5mb3JtYXRpb25fc2NoZW1hLnJlZmVyZW50aWFsX2NvbnN0cmFpbnRzIEFTIHJjXG4gICAgICAgIE9OIHJjLmNvbnN0cmFpbnRfbmFtZSA9IHRjLmNvbnN0cmFpbnRfbmFtZVxuICAgICAgICBBTkQgcmMuY29uc3RyYWludF9zY2hlbWEgPSB0Yy50YWJsZV9zY2hlbWFcbiAgICAgIFdIRVJFIHRjLmNvbnN0cmFpbnRfdHlwZSA9ICdGT1JFSUdOIEtFWSdcbiAgICAgICAgQU5EIGNjdS50YWJsZV9uYW1lID0gP1xuICAgICAgICBBTkQgdGMudGFibGVfc2NoZW1hID0gJ3B1YmxpYydcbiAgICBgO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZGIucmF3KHF1ZXJ5LCBbdGFibGVOYW1lXSk7XG4gICAgcmV0dXJuIHJlc3VsdC5yb3dzLm1hcChcbiAgICAgIChyb3c6IHtcbiAgICAgICAgdGFibGVfbmFtZTogc3RyaW5nO1xuICAgICAgICBjb25zdHJhaW50X25hbWU6IHN0cmluZztcbiAgICAgICAgY29sdW1uX25hbWU6IHN0cmluZztcbiAgICAgICAgcmVmZXJlbmNlZF90YWJsZV9uYW1lOiBzdHJpbmc7XG4gICAgICAgIHJlZmVyZW5jZWRfY29sdW1uX25hbWU6IHN0cmluZztcbiAgICAgICAgdXBkYXRlX3J1bGU6IHN0cmluZztcbiAgICAgICAgZGVsZXRlX3J1bGU6IHN0cmluZztcbiAgICAgIH0pID0+ICh7XG4gICAgICAgIHRhYmxlTmFtZTogcm93LnRhYmxlX25hbWUsXG4gICAgICAgIGNvbnN0cmFpbnROYW1lOiByb3cuY29uc3RyYWludF9uYW1lLFxuICAgICAgICBjb2x1bW5OYW1lOiByb3cuY29sdW1uX25hbWUsXG4gICAgICAgIHJlZmVyZW5jZWRUYWJsZU5hbWU6IHJvdy5yZWZlcmVuY2VkX3RhYmxlX25hbWUsXG4gICAgICAgIHJlZmVyZW5jZWRDb2x1bW5OYW1lOiByb3cucmVmZXJlbmNlZF9jb2x1bW5fbmFtZSxcbiAgICAgICAgb25VcGRhdGU6IHRoaXMubWFwQ29uc3RyYWludEFjdGlvbihyb3cudXBkYXRlX3J1bGUpLFxuICAgICAgICBvbkRlbGV0ZTogdGhpcy5tYXBDb25zdHJhaW50QWN0aW9uKHJvdy5kZWxldGVfcnVsZSksXG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIHZlY3RvciDsu6zrn7zsnZggZGltZW5zaW9uc+ulvCDsobDtmoztlanri4jri6QuXG4gICAqIHBnX2F0dHJpYnV0ZeydmCBhdHR0eXBtb2Tsl5DshJwg7LCo7JuQIOyImOulvCDstpTstpztlanri4jri6QuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdldFZlY3RvckRpbWVuc2lvbnMoXG4gICAgY29tcGFyZURCOiBSYXdDYXBhYmxlS25leCxcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBudW1iZXI+PiB7XG4gICAgY29uc3QgcXVlcnkgPSBgXG4gICAgICBTRUxFQ1RcbiAgICAgICAgYS5hdHRuYW1lIGFzIGNvbHVtbl9uYW1lLFxuICAgICAgICBhLmF0dHR5cG1vZCBhcyBkaW1lbnNpb25zXG4gICAgICBGUk9NIHBnX2F0dHJpYnV0ZSBhXG4gICAgICBKT0lOIHBnX2NsYXNzIGMgT04gYS5hdHRyZWxpZCA9IGMub2lkXG4gICAgICBKT0lOIHBnX3R5cGUgdCBPTiBhLmF0dHR5cGlkID0gdC5vaWRcbiAgICAgIFdIRVJFIGMucmVsbmFtZSA9ID9cbiAgICAgICAgQU5EIHQudHlwbmFtZSA9ICd2ZWN0b3InXG4gICAgICAgIEFORCBhLmF0dG51bSA+IDBcbiAgICBgO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNvbXBhcmVEQi5yYXcocXVlcnksIFt0YWJsZU5hbWVdKTtcbiAgICBjb25zdCBkaW1lbnNpb25zOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0ge307XG4gICAgZm9yIChjb25zdCByb3cgb2YgcmVzdWx0LnJvd3MpIHtcbiAgICAgIC8vIGF0dHR5cG1vZOyXkOyEnCDsi6TsoJwgZGltZW5zaW9ucyDqsJIg7LaU7LacXG4gICAgICBkaW1lbnNpb25zW3Jvdy5jb2x1bW5fbmFtZV0gPSByb3cuZGltZW5zaW9ucyA+IDAgPyByb3cuZGltZW5zaW9ucyA6IDA7XG4gICAgfVxuICAgIHJldHVybiBkaW1lbnNpb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIFBvc3RncmVTUUwg7Lus65+8IO2DgOyeheydhCDrtoTshJ3tlZjsl6wgTWlncmF0aW9uQ29sdW1uIOqwneyytOuhnCDrs4DtmZjtlanri4jri6QuXG4gICAqL1xuICByZXNvbHZlREJDb2xUeXBlKFxuICAgIGRiQ29sdW1uOiBQZ0NvbHVtbixcbiAgKTogUGljazxcbiAgICBNaWdyYXRpb25Db2x1bW4sXG4gICAgXCJ0eXBlXCIgfCBcImxlbmd0aFwiIHwgXCJwcmVjaXNpb25cIiB8IFwic2NhbGVcIiB8IFwibnVtYmVyVHlwZVwiIHwgXCJkaW1lbnNpb25zXCJcbiAgPiB7XG4gICAgY29uc3QgeyB1ZHRfbmFtZTogX3VkdF9uYW1lLCBjaGFyYWN0ZXJfbWF4aW11bV9sZW5ndGgsIHByZWNpc2lvbiwgbnVtZXJpY19zY2FsZSB9ID0gZGJDb2x1bW47XG5cbiAgICBjb25zdCB7IHVkdF9uYW1lLCBzaW5nbGVPckFycmF5IH0gPSAoKCkgPT4ge1xuICAgICAgaWYgKF91ZHRfbmFtZS5zdGFydHNXaXRoKFwiX1wiKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHVkdF9uYW1lOiBfdWR0X25hbWUuc3Vic3RyaW5nKDEpLFxuICAgICAgICAgIHNpbmdsZU9yQXJyYXk6IFwiW11cIiBhcyBjb25zdCxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHVkdF9uYW1lOiBfdWR0X25hbWUsXG4gICAgICAgIHNpbmdsZU9yQXJyYXk6IFwiXCIgYXMgY29uc3QsXG4gICAgICB9O1xuICAgIH0pKCk7XG5cbiAgICAvLyBVVUlEXG4gICAgaWYgKHVkdF9uYW1lID09PSBcInV1aWRcIikge1xuICAgICAgcmV0dXJuIHsgdHlwZTogYHV1aWQke3NpbmdsZU9yQXJyYXl9YCB9O1xuICAgIH1cblxuICAgIC8vIEludGVnZXIgdHlwZXNcbiAgICBpZiAodWR0X25hbWUgPT09IFwiaW50NFwiKSB7XG4gICAgICByZXR1cm4geyB0eXBlOiBgaW50ZWdlciR7c2luZ2xlT3JBcnJheX1gIH07XG4gICAgfVxuICAgIGlmICh1ZHRfbmFtZSA9PT0gXCJpbnQ4XCIpIHtcbiAgICAgIHJldHVybiB7IHR5cGU6IGBiaWdJbnRlZ2VyJHtzaW5nbGVPckFycmF5fWAgfTtcbiAgICB9XG5cbiAgICAvLyBTdHJpbmcgdHlwZXNcbiAgICBpZiAodWR0X25hbWUgPT09IFwidmFyY2hhclwiKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBgc3RyaW5nJHtzaW5nbGVPckFycmF5fWAsXG4gICAgICAgIC4uLihjaGFyYWN0ZXJfbWF4aW11bV9sZW5ndGggJiYge1xuICAgICAgICAgIGxlbmd0aDogY2hhcmFjdGVyX21heGltdW1fbGVuZ3RoLFxuICAgICAgICB9KSxcbiAgICAgIH07XG4gICAgfVxuICAgIGlmICh1ZHRfbmFtZSA9PT0gXCJ0ZXh0XCIpIHtcbiAgICAgIHJldHVybiB7IHR5cGU6IGBzdHJpbmcke3NpbmdsZU9yQXJyYXl9YCB9OyAvLyBTdHJpbmdQcm9wIHdpdGhvdXQgbGVuZ3RoXG4gICAgfVxuXG4gICAgLy8gTnVtYmVyT3JOdW1lcmljIHR5cGVzXG4gICAgaWYgKHVkdF9uYW1lID09PSBcIm51bWVyaWNcIikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogYG51bWJlck9yTnVtZXJpYyR7c2luZ2xlT3JBcnJheX1gLFxuICAgICAgICBudW1iZXJUeXBlOiBcIm51bWVyaWNcIixcbiAgICAgICAgLi4uKHByZWNpc2lvbiAhPT0gbnVsbCAmJlxuICAgICAgICAgIG51bWVyaWNfc2NhbGUgIT09IG51bGwgJiYge1xuICAgICAgICAgICAgcHJlY2lzaW9uOiBwcmVjaXNpb24sXG4gICAgICAgICAgICBzY2FsZTogbnVtZXJpY19zY2FsZSxcbiAgICAgICAgICB9KSxcbiAgICAgIH07XG4gICAgfVxuICAgIGlmICh1ZHRfbmFtZSA9PT0gXCJmbG9hdDRcIikge1xuICAgICAgcmV0dXJuIHsgdHlwZTogYG51bWJlck9yTnVtZXJpYyR7c2luZ2xlT3JBcnJheX1gLCBudW1iZXJUeXBlOiBcInJlYWxcIiB9O1xuICAgIH1cbiAgICBpZiAodWR0X25hbWUgPT09IFwiZmxvYXQ4XCIpIHtcbiAgICAgIHJldHVybiB7IHR5cGU6IGBudW1iZXJPck51bWVyaWMke3NpbmdsZU9yQXJyYXl9YCwgbnVtYmVyVHlwZTogXCJkb3VibGUgcHJlY2lzaW9uXCIgfTtcbiAgICB9XG5cbiAgICAvLyBCb29sZWFuXG4gICAgaWYgKHVkdF9uYW1lID09PSBcImJvb2xcIikge1xuICAgICAgcmV0dXJuIHsgdHlwZTogYGJvb2xlYW4ke3NpbmdsZU9yQXJyYXl9YCB9O1xuICAgIH1cblxuICAgIC8vIFRpbWVzdGFtcHogdHlwZXNcbiAgICBpZiAodWR0X25hbWUgPT09IFwidGltZXN0YW1wdHpcIikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogYGRhdGUke3NpbmdsZU9yQXJyYXl9YCxcbiAgICAgICAgLi4uKHByZWNpc2lvbiAhPT0gbnVsbCAmJiB7XG4gICAgICAgICAgcHJlY2lzaW9uOiBwcmVjaXNpb24sXG4gICAgICAgIH0pLFxuICAgICAgfTsgLy8gRGF0ZVByb3Ag4oaSIHRpbWVzdGFtcHR6XG4gICAgfVxuXG4gICAgLy8gSlNPTlxuICAgIGlmICh1ZHRfbmFtZSA9PT0gXCJqc29uXCIgfHwgdWR0X25hbWUgPT09IFwianNvbmJcIikge1xuICAgICAgcmV0dXJuIHsgdHlwZTogXCJqc29uXCIgfTtcbiAgICB9XG5cbiAgICAvLyBWZWN0b3IgKHBndmVjdG9yKVxuICAgIGlmICh1ZHRfbmFtZSA9PT0gXCJ2ZWN0b3JcIikge1xuICAgICAgLy8gdmVjdG9yIO2DgOyeheydmCDssKjsm5Ag7IiY64qUIGNvbHVtbl9kZWZhdWx064KYIOuzhOuPhCDsv7zrpqzroZwg7ZmV7J247ZW07JW8IO2VqFxuICAgICAgLy8g7ZiE7J6s64qUIOq4sOuzuOqwkiAw7Jy866GcIOyEpOyglSAo7Iuk7KCcIGRpbWVuc2lvbnPripQgZ2V0TWlncmF0aW9uU2V0RnJvbURC7JeQ7IScIOuzhOuPhCDsv7zrpqzroZwg7ZmV7J24KVxuICAgICAgcmV0dXJuIHsgdHlwZTogYHZlY3RvciR7c2luZ2xlT3JBcnJheX1gLCBkaW1lbnNpb25zOiAwIH07XG4gICAgfVxuXG4gICAgLy8gdHN2ZWN0b3IgKFBvc3RncmVTUUwg7KCE66y4IOqygOyDieyaqSDtg4DsnoUpXG4gICAgaWYgKHVkdF9uYW1lID09PSBcInRzdmVjdG9yXCIpIHtcbiAgICAgIHJldHVybiB7IHR5cGU6IFwidHN2ZWN0b3JcIiB9O1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihgcmVzb2x2ZSDrtojqsIDriqXtlZwgUG9zdGdyZVNRTCDsu6zrn7wg7YOA7J6FOiAke3VkdF9uYW1lfWApO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBQb3N0Z3JlU1FMU2NoZW1hUmVhZGVyID0gbmV3IFBvc3RncmVTUUxTY2hlbWFSZWFkZXJDbGFzcygpO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0NBdUVN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
648
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9zdGdyZXNxbC1zY2hlbWEtcmVhZGVyLmpzIiwibmFtZXMiOlsiZGJDb2x1bW5zOiBQZ0NvbHVtbltdIiwiZGJJbmRleGVzOiBQZ0luZGV4W10iLCJkYkZvcmVpZ25zOiBQZ0ZvcmVpZ25bXSIsImU6IHVua25vd24iLCJjb2x1bW5zOiBNaWdyYXRpb25Db2x1bW5bXSIsImluZGV4ZXM6IE1pZ3JhdGlvbkluZGV4W10iLCJmb3JlaWduczogTWlncmF0aW9uRm9yZWlnbltdIiwiYWN0aW9uTWFwOiBSZWNvcmQ8c3RyaW5nLCBSZWxhdGlvbk9uPiIsIml0ZW1zOiBzdHJpbmdbXSIsInRva2Vuczogc3RyaW5nW10iLCJkaW1lbnNpb25zOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+Il0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL21pZ3JhdGlvbi9wb3N0Z3Jlc3FsLXNjaGVtYS1yZWFkZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tIFwiYXNzZXJ0XCI7XG5cbmltcG9ydCB7IHR5cGUgS25leCB9IGZyb20gXCJrbmV4XCI7XG5pbXBvcnQgeyBncm91cCB9IGZyb20gXCJyYWRhc2hpXCI7XG5cbmltcG9ydCB7XG4gIHR5cGUgTWlncmF0aW9uQ29sdW1uLFxuICB0eXBlIE1pZ3JhdGlvbkZvcmVpZ24sXG4gIHR5cGUgTWlncmF0aW9uSW5kZXgsXG4gIHR5cGUgTWlncmF0aW9uU2V0LFxuICB0eXBlIFJlbGF0aW9uT24sXG59IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuXG4vKipcbiAqIO2KueyglSDthYzsnbTruJTsnZggUEvrpbwg7LC47KGw7ZWY64qUIOuLpOuluCDthYzsnbTruJTsnZggRksg7KCV67O07J6F64uI64ukLlxuICogUEsg7YOA7J6FIOuzgOqyvSDsi5wg6rSA66CoIEZLIOygnOyVveyhsOqxtOydhCDsspjrpqztlZjquLAg7JyE7ZW0IOyCrOyaqeuQqeuLiOuLpC5cbiAqL1xuZXhwb3J0IHR5cGUgUmVmZXJlbmNpbmdGb3JlaWduS2V5ID0ge1xuICAvKiogRkvqsIAg7KCV7J2Y65CcIO2FjOydtOu4lOuqhSAqL1xuICB0YWJsZU5hbWU6IHN0cmluZztcbiAgLyoqIEZLIOygnOyVveyhsOqxtCDsnbTrpoQgKi9cbiAgY29uc3RyYWludE5hbWU6IHN0cmluZztcbiAgLyoqIEZLIOy7rOufvOuqhSAqL1xuICBjb2x1bW5OYW1lOiBzdHJpbmc7XG4gIC8qKiDssLjsobDtlZjripQg7YWM7J2067iU66qFIChQS+qwgCDsnojripQg7YWM7J2067iUKSAqL1xuICByZWZlcmVuY2VkVGFibGVOYW1lOiBzdHJpbmc7XG4gIC8qKiDssLjsobDtlZjripQg7Lus65+866qFICjrs7TthrUgJ2lkJykgKi9cbiAgcmVmZXJlbmNlZENvbHVtbk5hbWU6IHN0cmluZztcbiAgLyoqIE9OIFVQREFURSDslaHshZggKi9cbiAgb25VcGRhdGU6IFJlbGF0aW9uT247XG4gIC8qKiBPTiBERUxFVEUg7JWh7IWYICovXG4gIG9uRGVsZXRlOiBSZWxhdGlvbk9uO1xufTtcblxuZXhwb3J0IHR5cGUgUGdDb2x1bW4gPSB7XG4gIGNvbHVtbl9uYW1lOiBzdHJpbmc7XG4gIGRhdGFfdHlwZTogc3RyaW5nO1xuICB1ZHRfbmFtZTogc3RyaW5nO1xuICBjaGFyYWN0ZXJfbWF4aW11bV9sZW5ndGg6IG51bWJlciB8IG51bGw7XG4gIHByZWNpc2lvbjogbnVtYmVyIHwgbnVsbDtcbiAgbnVtZXJpY19zY2FsZTogbnVtYmVyIHwgbnVsbDtcbiAgaXNfbnVsbGFibGU6IHN0cmluZztcbiAgY29sdW1uX2RlZmF1bHQ6IHN0cmluZyB8IG51bGw7XG4gIGlzX2dlbmVyYXRlZDogc3RyaW5nOyAvLyAncycgPSBTVE9SRUQsICd2JyA9IFZJUlRVQUwsICcnID0gbm9uZVxuICBnZW5lcmF0aW9uX2V4cHJlc3Npb246IHN0cmluZyB8IG51bGw7XG59O1xuXG50eXBlIFBnSW5kZXggPSB7XG4gIGluZGV4X25hbWU6IHN0cmluZztcbiAgY29sdW1uX25hbWU6IHN0cmluZztcbiAgaXNfdW5pcXVlOiBib29sZWFuO1xuICBpc19wcmltYXJ5OiBib29sZWFuO1xuICBpbmRleF90eXBlOiBzdHJpbmc7XG4gIG51bGxzX2ZpcnN0OiBib29sZWFuO1xuICBzb3J0X29yZGVyOiBcIkFTQ1wiIHwgXCJERVNDXCI7XG4gIG51bGxzX25vdF9kaXN0aW5jdDogYm9vbGVhbjtcbiAgY29sdW1uX29yZGVyOiBudW1iZXI7XG4gIGluZGV4X2RlZmluaXRpb246IHN0cmluZztcbiAgcHJlZGljYXRlPzogc3RyaW5nIHwgbnVsbDtcbn07XG5cbnR5cGUgUGdGb3JlaWduID0ge1xuICBjb25zdHJhaW50X25hbWU6IHN0cmluZztcbiAgY29sdW1uX25hbWU6IHN0cmluZztcbiAgZm9yZWlnbl90YWJsZV9uYW1lOiBzdHJpbmc7XG4gIGZvcmVpZ25fY29sdW1uX25hbWU6IHN0cmluZztcbiAgdXBkYXRlX3J1bGU6IHN0cmluZztcbiAgZGVsZXRlX3J1bGU6IHN0cmluZztcbn07XG5cbnR5cGUgUmF3Q2FwYWJsZUtuZXggPSBQaWNrPEtuZXgsIFwicmF3XCI+O1xuXG5jbGFzcyBQb3N0Z3JlU1FMU2NoZW1hUmVhZGVyQ2xhc3Mge1xuICBwcml2YXRlIHJlYWRvbmx5IGdlbmVyaWNJbmRleFR5cGVzID0gbmV3IFNldChbXCJidHJlZVwiLCBcImhhc2hcIiwgXCJnaW5cIiwgXCJnaXN0XCIsIFwicGdyb29uZ2FcIl0pO1xuXG4gIC8qKlxuICAgKiBEQuyXkOyEnCDthYzsnbTruJQg7KCV67O066W8IOydveyWtOyEnCBNaWdyYXRpb25TZXTsnYQg66eM65Ok7Ja07Ji164uI64ukLlxuICAgKiBAcGFyYW0gY29tcGFyZURCIEtuZXgg7J247Iqk7YS07IqkXG4gICAqIEBwYXJhbSB0YWJsZSDthYzsnbTruJQg7J2066aEXG4gICAqIEByZXR1cm5zIE1pZ3JhdGlvblNldCDqsJ3ssrRcbiAgICovXG4gIGFzeW5jIGdldE1pZ3JhdGlvblNldEZyb21EQihcbiAgICBjb21wYXJlREI6IFJhd0NhcGFibGVLbmV4LFxuICAgIHRhYmxlOiBzdHJpbmcsXG4gICk6IFByb21pc2U8TWlncmF0aW9uU2V0IHwgbnVsbD4ge1xuICAgIGxldCBkYkNvbHVtbnM6IFBnQ29sdW1uW10sIGRiSW5kZXhlczogUGdJbmRleFtdLCBkYkZvcmVpZ25zOiBQZ0ZvcmVpZ25bXTtcbiAgICB0cnkge1xuICAgICAgW2RiQ29sdW1ucywgZGJJbmRleGVzLCBkYkZvcmVpZ25zXSA9IGF3YWl0IHRoaXMucmVhZFRhYmxlKGNvbXBhcmVEQiwgdGFibGUpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIGlmIChlIGluc3RhbmNlb2YgRXJyb3IgJiYgZS5tZXNzYWdlLmluY2x1ZGVzKFwiVGFibGUgbm90IGZvdW5kXCIpKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIHZlY3RvciDsu6zrn7zsnZggZGltZW5zaW9ucyDsobDtmoxcbiAgICBjb25zdCB2ZWN0b3JEaW1lbnNpb25zID0gYXdhaXQgdGhpcy5nZXRWZWN0b3JEaW1lbnNpb25zKGNvbXBhcmVEQiwgdGFibGUpO1xuXG4gICAgY29uc3QgY29sdW1uczogTWlncmF0aW9uQ29sdW1uW10gPSBkYkNvbHVtbnMubWFwKChkYkNvbHVtbikgPT4ge1xuICAgICAgY29uc3QgZGJDb2xUeXBlID0gdGhpcy5yZXNvbHZlREJDb2xUeXBlKGRiQ29sdW1uKTtcblxuICAgICAgLy8gdmVjdG9yIO2DgOyeheyduCDqsr3smrAgZGltZW5zaW9ucyDshKTsoJVcbiAgICAgIGlmIChkYkNvbFR5cGUudHlwZSA9PT0gXCJ2ZWN0b3JcIikge1xuICAgICAgICBkYkNvbFR5cGUuZGltZW5zaW9ucyA9IHZlY3RvckRpbWVuc2lvbnNbZGJDb2x1bW4uY29sdW1uX25hbWVdID8/IDA7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5hbWU6IGRiQ29sdW1uLmNvbHVtbl9uYW1lLFxuICAgICAgICBudWxsYWJsZTogZGJDb2x1bW4uaXNfbnVsbGFibGUgPT09IFwiWUVTXCIsXG4gICAgICAgIC4uLmRiQ29sVHlwZSxcbiAgICAgICAgLy8gR2VuZXJhdGVkIENvbHVtbiDsspjrpqxcbiAgICAgICAgLi4uKCgpID0+IHtcbiAgICAgICAgICBpZiAoZGJDb2x1bW4uaXNfZ2VuZXJhdGVkID09PSBcInNcIiB8fCBkYkNvbHVtbi5pc19nZW5lcmF0ZWQgPT09IFwidlwiKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBnZW5lcmF0ZWQ6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiBkYkNvbHVtbi5pc19nZW5lcmF0ZWQgPT09IFwic1wiID8gXCJTVE9SRURcIiA6IFwiVklSVFVBTFwiLFxuICAgICAgICAgICAgICAgIGV4cHJlc3Npb246IGRiQ29sdW1uLmdlbmVyYXRpb25fZXhwcmVzc2lvbiA/PyBcIlwiLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICB9KSgpLFxuICAgICAgICAvLyBEZWZhdWx0IOqwkiDsspjrpqwgKEdlbmVyYXRlZCBDb2x1bW7snbQg7JWE64uMIOqyveyasOunjClcbiAgICAgICAgLi4uKCgpID0+IHtcbiAgICAgICAgICAvLyBHZW5lcmF0ZWQgQ29sdW1u7J2AIGRlZmF1bHQg6rCS7J20IOyXhuydjFxuICAgICAgICAgIGlmIChkYkNvbHVtbi5pc19nZW5lcmF0ZWQgPT09IFwic1wiIHx8IGRiQ29sdW1uLmlzX2dlbmVyYXRlZCA9PT0gXCJ2XCIpIHtcbiAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoZGJDb2x1bW4uY29sdW1uX2RlZmF1bHQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIFBvc3RncmVTUUwgZGVmYXVsdCDqsJIg7KCV66asIChuZXh0dmFsLCBDVVJSRU5UX1RJTUVTVEFNUCDrk7EpXG4gICAgICAgICAgICBsZXQgZGVmYXVsdFZhbHVlID0gZGJDb2x1bW4uY29sdW1uX2RlZmF1bHQ7XG5cbiAgICAgICAgICAgIC8vIG5leHR2YWwg7KCc6rGwIChTRVJJQUwg7YOA7J6FKVxuICAgICAgICAgICAgaWYgKGRlZmF1bHRWYWx1ZS5zdGFydHNXaXRoKFwibmV4dHZhbChcIikpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyDtg4DsnoUg7LqQ7Iqk7YyFIOygnOqxsCAo7JiIOiAnMSc6OmludGVnZXIg4oaSIDEpXG4gICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWUucmVwbGFjZSgvOjpbXFx3XFxzXSskL2csIFwiXCIpO1xuXG4gICAgICAgICAgICAvLyDrlLDsmLTtkZzqsIAgc2luZ2xlIHF1b3Rl7J24IOqyveyasCBkb3VibGUgcXVvdGXroZwg67OA7ZmYXG4gICAgICAgICAgICBpZiAoZGVmYXVsdFZhbHVlLnN0YXJ0c1dpdGgoXCInXCIpICYmIGRlZmF1bHRWYWx1ZS5lbmRzV2l0aChcIidcIikpIHtcbiAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gZGVmYXVsdFZhbHVlLnJlcGxhY2VBbGwoXCInXCIsICdcIicpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBkZWZhdWx0VG86IGRlZmF1bHRWYWx1ZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgfSkoKSxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvLyBQUklNQVJZIEtFWeyZgCBmb3JlaWduIGtleeyaqSDsnbjrjbHsiqQg7KCc7Jm4XG4gICAgY29uc3QgZGJJbmRleGVzR3JvdXAgPSBncm91cChcbiAgICAgIGRiSW5kZXhlcy5maWx0ZXIoXG4gICAgICAgIChkYkluZGV4KSA9PlxuICAgICAgICAgICFkYkluZGV4LmlzX3ByaW1hcnkgJiZcbiAgICAgICAgICAhZGJGb3JlaWducy5maW5kKChkYkZvcmVpZ24pID0+IGRiSW5kZXguaW5kZXhfbmFtZS5pbmNsdWRlcyhkYkZvcmVpZ24uY29uc3RyYWludF9uYW1lKSksXG4gICAgICApLFxuICAgICAgKGRiSW5kZXgpID0+IGRiSW5kZXguaW5kZXhfbmFtZSxcbiAgICApO1xuXG4gICAgLy8gaW5kZXhlcyDsspjrpqxcbiAgICBjb25zdCBpbmRleGVzOiBNaWdyYXRpb25JbmRleFtdID0gT2JqZWN0LmtleXMoZGJJbmRleGVzR3JvdXApLm1hcCgoaW5kZXhOYW1lKSA9PiB7XG4gICAgICBjb25zdCBjdXJyZW50SW5kZXhlcyA9IGRiSW5kZXhlc0dyb3VwW2luZGV4TmFtZV0/LnRvU29ydGVkKFxuICAgICAgICAobGVmdCwgcmlnaHQpID0+IGxlZnQuY29sdW1uX29yZGVyIC0gcmlnaHQuY29sdW1uX29yZGVyLFxuICAgICAgKTtcbiAgICAgIGFzc2VydChjdXJyZW50SW5kZXhlcyk7XG5cbiAgICAgIGNvbnN0IGZpcnN0SW5kZXggPSBjdXJyZW50SW5kZXhlc1swXTtcbiAgICAgIGNvbnN0IHBhcnNlZEluZGV4RGVmaW5pdGlvbiA9IHRoaXMucGFyc2VJbmRleERlZmluaXRpb24oZmlyc3RJbmRleC5pbmRleF9kZWZpbml0aW9uKTtcbiAgICAgIGNvbnN0IHJlc3RvcmVkSW5kZXhUeXBlID0gdGhpcy5yZXN0b3JlTWlncmF0aW9uSW5kZXhUeXBlKFxuICAgICAgICBmaXJzdEluZGV4LFxuICAgICAgICBwYXJzZWRJbmRleERlZmluaXRpb24uYWNjZXNzTWV0aG9kLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHVzaW5nID0gdGhpcy5yZXN0b3JlR2VuZXJpY1VzaW5nKFxuICAgICAgICBwYXJzZWRJbmRleERlZmluaXRpb24uYWNjZXNzTWV0aG9kID8/IGZpcnN0SW5kZXguaW5kZXhfdHlwZSxcbiAgICAgICk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IHJlc3RvcmVkSW5kZXhUeXBlLFxuICAgICAgICBuYW1lOiBpbmRleE5hbWUsXG4gICAgICAgIGNvbHVtbnM6IGN1cnJlbnRJbmRleGVzLm1hcCgoaWR4KSA9PiAoe1xuICAgICAgICAgIG5hbWU6IGlkeC5jb2x1bW5fbmFtZSxcbiAgICAgICAgICAuLi4odGhpcy5leHRyYWN0SW5kZXhDb2x1bW5PcGNsYXNzKFxuICAgICAgICAgICAgcGFyc2VkSW5kZXhEZWZpbml0aW9uLmNvbHVtbkRlZmluaXRpb25zW2lkeC5jb2x1bW5fb3JkZXIgLSAxXSxcbiAgICAgICAgICApXG4gICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICBvcGNsYXNzOiB0aGlzLmV4dHJhY3RJbmRleENvbHVtbk9wY2xhc3MoXG4gICAgICAgICAgICAgICAgICBwYXJzZWRJbmRleERlZmluaXRpb24uY29sdW1uRGVmaW5pdGlvbnNbaWR4LmNvbHVtbl9vcmRlciAtIDFdLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgIC4uLih1c2luZyA9PT0gXCJidHJlZVwiXG4gICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICBzb3J0T3JkZXI6IGlkeC5zb3J0X29yZGVyLFxuICAgICAgICAgICAgICAgIG51bGxzRmlyc3Q6IGlkeC5udWxsc19maXJzdCxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiB7fSksXG4gICAgICAgIH0pKSxcblxuICAgICAgICBudWxsc05vdERpc3RpbmN0OiBmaXJzdEluZGV4Lm51bGxzX25vdF9kaXN0aW5jdCxcbiAgICAgICAgLi4uKGZpcnN0SW5kZXgucHJlZGljYXRlID8geyB3aGVyZTogZmlyc3RJbmRleC5wcmVkaWNhdGUgfSA6IHt9KSxcbiAgICAgICAgLi4uKHVzaW5nID8geyB1c2luZyB9IDoge30pLFxuICAgICAgICAuLi50aGlzLnBhcnNlVmVjdG9ySW5kZXhPcHRpb25zKHJlc3RvcmVkSW5kZXhUeXBlLCBwYXJzZWRJbmRleERlZmluaXRpb24ud2l0aE9wdGlvbnMpLFxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIC8vIGZvcmVpZ25zIOyymOumrFxuICAgIGNvbnN0IGZvcmVpZ25zOiBNaWdyYXRpb25Gb3JlaWduW10gPSBkYkZvcmVpZ25zLm1hcCgoZGJGb3JlaWduKSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb2x1bW5zOiBbZGJGb3JlaWduLmNvbHVtbl9uYW1lXSxcbiAgICAgICAgdG86IGAke2RiRm9yZWlnbi5mb3JlaWduX3RhYmxlX25hbWV9LiR7ZGJGb3JlaWduLmZvcmVpZ25fY29sdW1uX25hbWV9YCxcbiAgICAgICAgb25VcGRhdGU6IHRoaXMubWFwQ29uc3RyYWludEFjdGlvbihkYkZvcmVpZ24udXBkYXRlX3J1bGUpLFxuICAgICAgICBvbkRlbGV0ZTogdGhpcy5tYXBDb25zdHJhaW50QWN0aW9uKGRiRm9yZWlnbi5kZWxldGVfcnVsZSksXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHRhYmxlLFxuICAgICAgY29sdW1ucyxcbiAgICAgIGluZGV4ZXMsXG4gICAgICBmb3JlaWducyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFBvc3RncmVTUUzsnZggY29uc3RyYWludCBhY3Rpb27snYQgS25leCDtmJXsi53snLzroZwg67OA7ZmYXG4gICAqL1xuICBwcml2YXRlIG1hcENvbnN0cmFpbnRBY3Rpb24oYWN0aW9uOiBzdHJpbmcpOiBSZWxhdGlvbk9uIHtcbiAgICBjb25zdCBhY3Rpb25NYXA6IFJlY29yZDxzdHJpbmcsIFJlbGF0aW9uT24+ID0ge1xuICAgICAgXCJOTyBBQ1RJT05cIjogXCJOTyBBQ1RJT05cIixcbiAgICAgIFJFU1RSSUNUOiBcIlJFU1RSSUNUXCIsXG4gICAgICBDQVNDQURFOiBcIkNBU0NBREVcIixcbiAgICAgIFwiU0VUIE5VTExcIjogXCJTRVQgTlVMTFwiLFxuICAgICAgXCJTRVQgREVGQVVMVFwiOiBcIlNFVCBERUZBVUxUXCIsXG4gICAgfTtcbiAgICByZXR1cm4gYWN0aW9uTWFwW2FjdGlvbl0gPz8gXCJOTyBBQ1RJT05cIjtcbiAgfVxuXG4gIC8qKlxuICAgKiDquLDsobQg7YWM7J2067iUIOydveyWtOyEnCBjb2xzLCBpbmRleGVzLCBmb3JlaWducyDrsJjtmZhcbiAgICovXG4gIGFzeW5jIHJlYWRUYWJsZShcbiAgICBjb21wYXJlREI6IFJhd0NhcGFibGVLbmV4LFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICApOiBQcm9taXNlPFtQZ0NvbHVtbltdLCBQZ0luZGV4W10sIFBnRm9yZWlnbltdXT4ge1xuICAgIC8vIENvbHVtbnMg7KGw7ZqMIChHZW5lcmF0ZWQgQ29sdW1uIOygleuztCDtj6ztlagpXG4gICAgY29uc3QgY29sdW1uc1F1ZXJ5ID0gYFxuICAgICAgU0VMRUNUXG4gICAgICAgIGMuY29sdW1uX25hbWUsXG4gICAgICAgIGMuZGF0YV90eXBlLFxuICAgICAgICBjLnVkdF9uYW1lLFxuICAgICAgICBDT0FMRVNDRShcbiAgICAgICAgICBjLmNoYXJhY3Rlcl9tYXhpbXVtX2xlbmd0aCxcbiAgICAgICAgICBDQVNFIFdIRU4gYy5kYXRhX3R5cGUgPSAnQVJSQVknIEFORCBhLmF0dHR5cG1vZCA+IDBcbiAgICAgICAgICAgIFRIRU4gYS5hdHR0eXBtb2QgLSA0XG4gICAgICAgICAgICBFTFNFIE5VTExcbiAgICAgICAgICBFTkRcbiAgICAgICAgKSBBUyBjaGFyYWN0ZXJfbWF4aW11bV9sZW5ndGgsXG4gICAgICAgIENPQUxFU0NFKGMuZGF0ZXRpbWVfcHJlY2lzaW9uLCBjLm51bWVyaWNfcHJlY2lzaW9uKSBBUyBwcmVjaXNpb24sXG4gICAgICAgIGMubnVtZXJpY19zY2FsZSxcbiAgICAgICAgYy5pc19udWxsYWJsZSxcbiAgICAgICAgYy5jb2x1bW5fZGVmYXVsdCxcbiAgICAgICAgQ09BTEVTQ0UoYS5hdHRnZW5lcmF0ZWQsICcnKSBhcyBpc19nZW5lcmF0ZWQsXG4gICAgICAgIGMuZ2VuZXJhdGlvbl9leHByZXNzaW9uXG4gICAgICBGUk9NIGluZm9ybWF0aW9uX3NjaGVtYS5jb2x1bW5zIGNcbiAgICAgIExFRlQgSk9JTiBwZ19hdHRyaWJ1dGUgYSBPTiBhLmF0dG5hbWUgPSBjLmNvbHVtbl9uYW1lXG4gICAgICAgIEFORCBhLmF0dHJlbGlkID0gKFxuICAgICAgICAgIFNFTEVDVCBvaWQgRlJPTSBwZ19jbGFzcyBXSEVSRSByZWxuYW1lID0gYy50YWJsZV9uYW1lXG4gICAgICAgICAgQU5EIHJlbG5hbWVzcGFjZSA9IChTRUxFQ1Qgb2lkIEZST00gcGdfbmFtZXNwYWNlIFdIRVJFIG5zcG5hbWUgPSBjLnRhYmxlX3NjaGVtYSlcbiAgICAgICAgKVxuICAgICAgV0hFUkUgYy50YWJsZV9uYW1lID0gP1xuICAgICAgICBBTkQgYy50YWJsZV9zY2hlbWEgPSAncHVibGljJ1xuICAgICAgT1JERVIgQlkgYy5vcmRpbmFsX3Bvc2l0aW9uXG4gICAgYDtcbiAgICBjb25zdCBjb2x1bW5zID0gKGF3YWl0IGNvbXBhcmVEQi5yYXcoY29sdW1uc1F1ZXJ5LCBbdGFibGVOYW1lXSkpLnJvd3MgYXMgUGdDb2x1bW5bXTtcbiAgICBpZiAoY29sdW1ucy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGFibGUgbm90IGZvdW5kOiAke3RhYmxlTmFtZX1gKTtcbiAgICB9XG5cbiAgICAvLyBJbmRleGVzIOyhsO2ajCAoUEdyb29uZ2Eg7ZGc7ZiE7IudIOyduOuNseyKpCDtj6ztlagpXG4gICAgY29uc3QgaW5kZXhlc1F1ZXJ5ID0gYFxuICAgICAgU0VMRUNUXG4gICAgICAgICAgaS5yZWxuYW1lIEFTIGluZGV4X25hbWUsXG4gICAgICAgICAgQ0FTRVxuICAgICAgICAgICAgICBXSEVOIGFtLmFtbmFtZSA9ICdwZ3Jvb25nYScgQU5EIHUuYXR0bnVtID0gMCBUSEVOXG4gICAgICAgICAgICAgICAgICByZWdleHBfcmVwbGFjZShcbiAgICAgICAgICAgICAgICAgICAgICByZWdleHBfcmVwbGFjZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgVFJJTShwZ3Jvb25nYV9jb2wuY29sdW1uX2V4cHIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAnOjp0ZXh0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICdnJ1xuICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgJ1soKV0nLFxuICAgICAgICAgICAgICAgICAgICAgICcnLFxuICAgICAgICAgICAgICAgICAgICAgICdnJ1xuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBFTFNFIGEuYXR0bmFtZVxuICAgICAgICAgIEVORCBBUyBjb2x1bW5fbmFtZSxcbiAgICAgICAgICBpeC5pbmRpc3VuaXF1ZSBBUyBpc191bmlxdWUsXG4gICAgICAgICAgaXguaW5kaXNwcmltYXJ5IEFTIGlzX3ByaW1hcnksXG4gICAgICAgICAgYW0uYW1uYW1lIEFTIGluZGV4X3R5cGUsXG4gICAgICAgICAgQ09BTEVTQ0UoKHUub3B0ICYgMikgPSAyLCBGQUxTRSkgQVMgbnVsbHNfZmlyc3QsXG4gICAgICAgICAgQ0FTRSBcbiAgICAgICAgICAgICAgV0hFTiAodS5vcHQgJiAxKSA9IDEgVEhFTiAnREVTQydcbiAgICAgICAgICAgICAgRUxTRSAnQVNDJ1xuICAgICAgICAgIEVORCBBUyBzb3J0X29yZGVyLFxuICAgICAgICAgIGl4LmluZG51bGxzbm90ZGlzdGluY3QgQVMgbnVsbHNfbm90X2Rpc3RpbmN0LFxuICAgICAgICAgIHUub3JkIEFTIGNvbHVtbl9vcmRlcixcbiAgICAgICAgICBwZ19nZXRfaW5kZXhkZWYoaXguaW5kZXhyZWxpZCkgQVMgaW5kZXhfZGVmaW5pdGlvbixcbiAgICAgICAgICBwZ19nZXRfZXhwcihpeC5pbmRwcmVkLCBpeC5pbmRyZWxpZCkgQVMgcHJlZGljYXRlXG4gICAgICBGUk9NIHBnX2NsYXNzIHRcbiAgICAgIEpPSU4gcGdfaW5kZXggaXggT04gdC5vaWQgPSBpeC5pbmRyZWxpZFxuICAgICAgSk9JTiBwZ19jbGFzcyBpIE9OIGkub2lkID0gaXguaW5kZXhyZWxpZFxuICAgICAgSk9JTiBwZ19hbSBhbSBPTiBpLnJlbGFtID0gYW0ub2lkXG4gICAgICBKT0lOIExBVEVSQUwgdW5uZXN0KGl4LmluZGtleSwgaXguaW5kb3B0aW9uKVxuICAgICAgICAgIFdJVEggT1JESU5BTElUWSBBUyB1KGF0dG51bSwgb3B0LCBvcmQpIE9OIHRydWVcbiAgICAgIExFRlQgSk9JTiBwZ19hdHRyaWJ1dGUgYSBPTiBhLmF0dHJlbGlkID0gdC5vaWQgXG4gICAgICAgICAgQU5EIGEuYXR0bnVtID0gdS5hdHRudW0gXG4gICAgICAgICAgQU5EIHUuYXR0bnVtID4gMFxuICAgICAgTEVGVCBKT0lOIExBVEVSQUwgKFxuICAgICAgICAgIFNFTEVDVCBcbiAgICAgICAgICAgICAgdW5uZXN0KFxuICAgICAgICAgICAgICAgICAgQ0FTRSBcbiAgICAgICAgICAgICAgICAgICAgICBXSEVOIHBnX2dldF9leHByKGl4LmluZGV4cHJzLCBpeC5pbmRyZWxpZCkgfiAnXkFSUkFZXFxcXFsnIFRIRU5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX3RvX2FycmF5KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnZXhwX3JlcGxhY2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGdfZ2V0X2V4cHIoaXguaW5kZXhwcnMsIGl4LmluZHJlbGlkKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXkFSUkFZXFxcXFsoLiopXFxcXF0kJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXFxcXDEnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJywgJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgRUxTRVxuICAgICAgICAgICAgICAgICAgICAgICAgICBBUlJBWVtwZ19nZXRfZXhwcihpeC5pbmRleHBycywgaXguaW5kcmVsaWQpXVxuICAgICAgICAgICAgICAgICAgRU5EXG4gICAgICAgICAgICAgICkgYXMgY29sdW1uX2V4cHJcbiAgICAgICkgcGdyb29uZ2FfY29sIE9OIGFtLmFtbmFtZSA9ICdwZ3Jvb25nYScgQU5EIHUuYXR0bnVtID0gMFxuICAgICAgV0hFUkUgdC5yZWxuYW1lID0gP1xuICAgICAgICAgIEFORCAodS5hdHRudW0gPiAwIE9SIChhbS5hbW5hbWUgPSAncGdyb29uZ2EnIEFORCB1LmF0dG51bSA9IDApKVxuICAgICAgT1JERVIgQlkgaS5yZWxuYW1lLCB1Lm9yZDtcbmA7XG4gICAgY29uc3QgaW5kZXhlcyA9IChhd2FpdCBjb21wYXJlREIucmF3KGluZGV4ZXNRdWVyeSwgW3RhYmxlTmFtZV0pKS5yb3dzO1xuXG4gICAgLy8gRm9yZWlnbiBLZXlzIOyhsO2ajFxuICAgIGNvbnN0IGZvcmVpZ25zUXVlcnkgPSBgXG4gICAgICBTRUxFQ1RcbiAgICAgICAgdGMuY29uc3RyYWludF9uYW1lLFxuICAgICAgICBrY3UuY29sdW1uX25hbWUsXG4gICAgICAgIGNjdS50YWJsZV9uYW1lIEFTIGZvcmVpZ25fdGFibGVfbmFtZSxcbiAgICAgICAgY2N1LmNvbHVtbl9uYW1lIEFTIGZvcmVpZ25fY29sdW1uX25hbWUsXG4gICAgICAgIHJjLnVwZGF0ZV9ydWxlLFxuICAgICAgICByYy5kZWxldGVfcnVsZVxuICAgICAgRlJPTSBpbmZvcm1hdGlvbl9zY2hlbWEudGFibGVfY29uc3RyYWludHMgQVMgdGNcbiAgICAgIEpPSU4gaW5mb3JtYXRpb25fc2NoZW1hLmtleV9jb2x1bW5fdXNhZ2UgQVMga2N1XG4gICAgICAgIE9OIHRjLmNvbnN0cmFpbnRfbmFtZSA9IGtjdS5jb25zdHJhaW50X25hbWVcbiAgICAgICAgQU5EIHRjLnRhYmxlX3NjaGVtYSA9IGtjdS50YWJsZV9zY2hlbWFcbiAgICAgIEpPSU4gaW5mb3JtYXRpb25fc2NoZW1hLmNvbnN0cmFpbnRfY29sdW1uX3VzYWdlIEFTIGNjdVxuICAgICAgICBPTiBjY3UuY29uc3RyYWludF9uYW1lID0gdGMuY29uc3RyYWludF9uYW1lXG4gICAgICAgIEFORCBjY3UudGFibGVfc2NoZW1hID0gdGMudGFibGVfc2NoZW1hXG4gICAgICBKT0lOIGluZm9ybWF0aW9uX3NjaGVtYS5yZWZlcmVudGlhbF9jb25zdHJhaW50cyBBUyByY1xuICAgICAgICBPTiByYy5jb25zdHJhaW50X25hbWUgPSB0Yy5jb25zdHJhaW50X25hbWVcbiAgICAgICAgQU5EIHJjLmNvbnN0cmFpbnRfc2NoZW1hID0gdGMudGFibGVfc2NoZW1hXG4gICAgICBXSEVSRSB0Yy5jb25zdHJhaW50X3R5cGUgPSAnRk9SRUlHTiBLRVknXG4gICAgICAgIEFORCB0Yy50YWJsZV9uYW1lID0gP1xuICAgIGA7XG4gICAgY29uc3QgZm9yZWlnbnMgPSAoYXdhaXQgY29tcGFyZURCLnJhdyhmb3JlaWduc1F1ZXJ5LCBbdGFibGVOYW1lXSkpLnJvd3M7XG5cbiAgICByZXR1cm4gW2NvbHVtbnMsIGluZGV4ZXMsIGZvcmVpZ25zXTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzdG9yZU1pZ3JhdGlvbkluZGV4VHlwZShcbiAgICBpbmRleDogUGljazxQZ0luZGV4LCBcImlzX3VuaXF1ZVwiIHwgXCJpbmRleF90eXBlXCI+LFxuICAgIGFjY2Vzc01ldGhvZD86IHN0cmluZyxcbiAgKTogTWlncmF0aW9uSW5kZXhbXCJ0eXBlXCJdIHtcbiAgICBjb25zdCByZXNvbHZlZEFjY2Vzc01ldGhvZCA9IChhY2Nlc3NNZXRob2QgPz8gaW5kZXguaW5kZXhfdHlwZSkudG9Mb3dlckNhc2UoKTtcblxuICAgIGlmIChyZXNvbHZlZEFjY2Vzc01ldGhvZCA9PT0gXCJobnN3XCIgfHwgcmVzb2x2ZWRBY2Nlc3NNZXRob2QgPT09IFwiaXZmZmxhdFwiKSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZWRBY2Nlc3NNZXRob2Q7XG4gICAgfVxuXG4gICAgcmV0dXJuIGluZGV4LmlzX3VuaXF1ZSA/IFwidW5pcXVlXCIgOiBcImluZGV4XCI7XG4gIH1cblxuICBwcml2YXRlIHJlc3RvcmVHZW5lcmljVXNpbmcoXG4gICAgYWNjZXNzTWV0aG9kOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICk6IE1pZ3JhdGlvbkluZGV4W1widXNpbmdcIl0gfCB1bmRlZmluZWQge1xuICAgIGlmICghYWNjZXNzTWV0aG9kKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBhY2Nlc3NNZXRob2QudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAoIXRoaXMuZ2VuZXJpY0luZGV4VHlwZXMuaGFzKG5vcm1hbGl6ZWQpKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHJldHVybiBub3JtYWxpemVkIGFzIE1pZ3JhdGlvbkluZGV4W1widXNpbmdcIl07XG4gIH1cblxuICBwcml2YXRlIHBhcnNlVmVjdG9ySW5kZXhPcHRpb25zKFxuICAgIHR5cGU6IE1pZ3JhdGlvbkluZGV4W1widHlwZVwiXSxcbiAgICB3aXRoT3B0aW9uczogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgKTogUGljazxNaWdyYXRpb25JbmRleCwgXCJtXCIgfCBcImVmQ29uc3RydWN0aW9uXCIgfCBcImxpc3RzXCI+IHtcbiAgICBpZiAodHlwZSA9PT0gXCJobnN3XCIpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLih0aGlzLnBhcnNlSW50ZWdlck9wdGlvbih3aXRoT3B0aW9ucy5tKSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyB7IG06IHRoaXMucGFyc2VJbnRlZ2VyT3B0aW9uKHdpdGhPcHRpb25zLm0pIH1cbiAgICAgICAgICA6IHt9KSxcbiAgICAgICAgLi4uKHRoaXMucGFyc2VJbnRlZ2VyT3B0aW9uKHdpdGhPcHRpb25zLmVmX2NvbnN0cnVjdGlvbikgIT09IHVuZGVmaW5lZFxuICAgICAgICAgID8geyBlZkNvbnN0cnVjdGlvbjogdGhpcy5wYXJzZUludGVnZXJPcHRpb24od2l0aE9wdGlvbnMuZWZfY29uc3RydWN0aW9uKSB9XG4gICAgICAgICAgOiB7fSksXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmICh0eXBlID09PSBcIml2ZmZsYXRcIikge1xuICAgICAgcmV0dXJuIHRoaXMucGFyc2VJbnRlZ2VyT3B0aW9uKHdpdGhPcHRpb25zLmxpc3RzKSAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8geyBsaXN0czogdGhpcy5wYXJzZUludGVnZXJPcHRpb24od2l0aE9wdGlvbnMubGlzdHMpIH1cbiAgICAgICAgOiB7fTtcbiAgICB9XG5cbiAgICByZXR1cm4ge307XG4gIH1cblxuICBwcml2YXRlIHBhcnNlSW50ZWdlck9wdGlvbih2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcnNlZCA9IE51bWJlci5wYXJzZUludCh2YWx1ZSwgMTApO1xuICAgIHJldHVybiBOdW1iZXIuaXNOYU4ocGFyc2VkKSA/IHVuZGVmaW5lZCA6IHBhcnNlZDtcbiAgfVxuXG4gIHByaXZhdGUgZXh0cmFjdEluZGV4Q29sdW1uT3BjbGFzcyhjb2x1bW5EZWZpbml0aW9uOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICghY29sdW1uRGVmaW5pdGlvbikge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBjb25zdCB0cmltbWVkID0gY29sdW1uRGVmaW5pdGlvblxuICAgICAgLnJlcGxhY2UoL1xccytOVUxMU1xccysoRklSU1R8TEFTVClcXHMqJC9pLCBcIlwiKVxuICAgICAgLnJlcGxhY2UoL1xccysoQVNDfERFU0MpXFxzKiQvaSwgXCJcIilcbiAgICAgIC50cmltKCk7XG4gICAgY29uc3QgdG9rZW5zID0gdGhpcy50b2tlbml6ZVRvcExldmVsKHRyaW1tZWQpO1xuXG4gICAgaWYgKHRva2Vucy5sZW5ndGggPCAyKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGlmICh0b2tlbnNbdG9rZW5zLmxlbmd0aCAtIDJdPy50b1VwcGVyQ2FzZSgpID09PSBcIkNPTExBVEVcIikge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICByZXR1cm4gdG9rZW5zLmF0KC0xKTtcbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VJbmRleERlZmluaXRpb24oaW5kZXhEZWZpbml0aW9uOiBzdHJpbmcpOiB7XG4gICAgYWNjZXNzTWV0aG9kPzogc3RyaW5nO1xuICAgIGNvbHVtbkRlZmluaXRpb25zOiBzdHJpbmdbXTtcbiAgICB3aXRoT3B0aW9uczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgfSB7XG4gICAgY29uc3QgYWNjZXNzTWV0aG9kID0gaW5kZXhEZWZpbml0aW9uLm1hdGNoKC9cXGJVU0lOR1xccysoW2Etel9dW1xcd10qKS9pKT8uWzFdPy50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IHVzaW5nTWF0Y2hJbmRleCA9IGluZGV4RGVmaW5pdGlvbi5zZWFyY2goL1xcYlVTSU5HXFxiL2kpO1xuICAgIGNvbnN0IGNvbHVtbnNTdGFydCA9IHVzaW5nTWF0Y2hJbmRleCA+PSAwID8gaW5kZXhEZWZpbml0aW9uLmluZGV4T2YoXCIoXCIsIHVzaW5nTWF0Y2hJbmRleCkgOiAtMTtcbiAgICBjb25zdCBjb2x1bW5zRW5kID1cbiAgICAgIGNvbHVtbnNTdGFydCA+PSAwID8gdGhpcy5maW5kTWF0Y2hpbmdQYXJlbnRoZXNpcyhpbmRleERlZmluaXRpb24sIGNvbHVtbnNTdGFydCkgOiAtMTtcbiAgICBjb25zdCBjb2x1bW5EZWZpbml0aW9ucyA9XG4gICAgICBjb2x1bW5zU3RhcnQgPj0gMCAmJiBjb2x1bW5zRW5kID4gY29sdW1uc1N0YXJ0XG4gICAgICAgID8gdGhpcy5zcGxpdFRvcExldmVsKGluZGV4RGVmaW5pdGlvbi5zbGljZShjb2x1bW5zU3RhcnQgKyAxLCBjb2x1bW5zRW5kKSwgXCIsXCIpXG4gICAgICAgIDogW107XG5cbiAgICBjb25zdCB3aXRoTWF0Y2ggPSAvXFxiV0lUSFxccypcXCgvaS5leGVjKGluZGV4RGVmaW5pdGlvbik7XG4gICAgY29uc3Qgd2l0aFN0YXJ0ID0gd2l0aE1hdGNoID8gaW5kZXhEZWZpbml0aW9uLmluZGV4T2YoXCIoXCIsIHdpdGhNYXRjaC5pbmRleCkgOiAtMTtcbiAgICBjb25zdCB3aXRoRW5kID0gd2l0aFN0YXJ0ID49IDAgPyB0aGlzLmZpbmRNYXRjaGluZ1BhcmVudGhlc2lzKGluZGV4RGVmaW5pdGlvbiwgd2l0aFN0YXJ0KSA6IC0xO1xuICAgIGNvbnN0IHdpdGhPcHRpb25zID1cbiAgICAgIHdpdGhTdGFydCA+PSAwICYmIHdpdGhFbmQgPiB3aXRoU3RhcnRcbiAgICAgICAgPyB0aGlzLnBhcnNlSW5kZXhPcHRpb25FbnRyaWVzKGluZGV4RGVmaW5pdGlvbi5zbGljZSh3aXRoU3RhcnQgKyAxLCB3aXRoRW5kKSlcbiAgICAgICAgOiB7fTtcblxuICAgIHJldHVybiB7XG4gICAgICBhY2Nlc3NNZXRob2QsXG4gICAgICBjb2x1bW5EZWZpbml0aW9ucyxcbiAgICAgIHdpdGhPcHRpb25zLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHBhcnNlSW5kZXhPcHRpb25FbnRyaWVzKG9wdGlvblNvdXJjZTogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuc3BsaXRUb3BMZXZlbChvcHRpb25Tb3VyY2UsIFwiLFwiKS5yZWR1Y2U8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4oKHJlc3VsdCwgZW50cnkpID0+IHtcbiAgICAgIGNvbnN0IG1hdGNoZWQgPSBlbnRyeS50cmltKCkubWF0Y2goL14oW2Etel9dW1xcd10qKVxccyo9XFxzKiguKykkL2kpO1xuICAgICAgaWYgKCFtYXRjaGVkKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IFssIGtleSwgcmF3VmFsdWVdID0gbWF0Y2hlZDtcbiAgICAgIHJlc3VsdFtrZXkudG9Mb3dlckNhc2UoKV0gPSByYXdWYWx1ZS50cmltKCkucmVwbGFjZSgvXlsnXCJdfFsnXCJdJC9nLCBcIlwiKTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSwge30pO1xuICB9XG5cbiAgcHJpdmF0ZSBzcGxpdFRvcExldmVsKHNvdXJjZTogc3RyaW5nLCBkZWxpbWl0ZXI6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBpdGVtczogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgc3RhcnQgPSAwO1xuICAgIGxldCBwYXJlbkRlcHRoID0gMDtcbiAgICBsZXQgYnJhY2tldERlcHRoID0gMDtcbiAgICBsZXQgaW5TaW5nbGVRdW90ZSA9IGZhbHNlO1xuICAgIGxldCBpbkRvdWJsZVF1b3RlID0gZmFsc2U7XG5cbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgc291cmNlLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAgY29uc3QgY2hhciA9IHNvdXJjZVtpbmRleF07XG4gICAgICBjb25zdCBuZXh0Q2hhciA9IHNvdXJjZVtpbmRleCArIDFdO1xuXG4gICAgICBpZiAoY2hhciA9PT0gXCInXCIgJiYgIWluRG91YmxlUXVvdGUpIHtcbiAgICAgICAgaWYgKGluU2luZ2xlUXVvdGUgJiYgbmV4dENoYXIgPT09IFwiJ1wiKSB7XG4gICAgICAgICAgaW5kZXggKz0gMTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpblNpbmdsZVF1b3RlID0gIWluU2luZ2xlUXVvdGU7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2hhciA9PT0gJ1wiJyAmJiAhaW5TaW5nbGVRdW90ZSkge1xuICAgICAgICBpZiAoaW5Eb3VibGVRdW90ZSAmJiBuZXh0Q2hhciA9PT0gJ1wiJykge1xuICAgICAgICAgIGluZGV4ICs9IDE7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaW5Eb3VibGVRdW90ZSA9ICFpbkRvdWJsZVF1b3RlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGluU2luZ2xlUXVvdGUgfHwgaW5Eb3VibGVRdW90ZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNoYXIgPT09IFwiKFwiKSB7XG4gICAgICAgIHBhcmVuRGVwdGggKz0gMTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoY2hhciA9PT0gXCIpXCIpIHtcbiAgICAgICAgcGFyZW5EZXB0aCAtPSAxO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChjaGFyID09PSBcIltcIikge1xuICAgICAgICBicmFja2V0RGVwdGggKz0gMTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoY2hhciA9PT0gXCJdXCIpIHtcbiAgICAgICAgYnJhY2tldERlcHRoIC09IDE7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2hhciA9PT0gZGVsaW1pdGVyICYmIHBhcmVuRGVwdGggPT09IDAgJiYgYnJhY2tldERlcHRoID09PSAwKSB7XG4gICAgICAgIGl0ZW1zLnB1c2goc291cmNlLnNsaWNlKHN0YXJ0LCBpbmRleCkudHJpbSgpKTtcbiAgICAgICAgc3RhcnQgPSBpbmRleCArIDE7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgdGFpbCA9IHNvdXJjZS5zbGljZShzdGFydCkudHJpbSgpO1xuICAgIGlmICh0YWlsLmxlbmd0aCA+IDApIHtcbiAgICAgIGl0ZW1zLnB1c2godGFpbCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGl0ZW1zO1xuICB9XG5cbiAgcHJpdmF0ZSB0b2tlbml6ZVRvcExldmVsKHNvdXJjZTogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHRva2Vuczogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgc3RhcnQgPSAtMTtcbiAgICBsZXQgcGFyZW5EZXB0aCA9IDA7XG4gICAgbGV0IGJyYWNrZXREZXB0aCA9IDA7XG4gICAgbGV0IGluU2luZ2xlUXVvdGUgPSBmYWxzZTtcbiAgICBsZXQgaW5Eb3VibGVRdW90ZSA9IGZhbHNlO1xuXG4gICAgY29uc3QgcHVzaFRva2VuID0gKGVuZEluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgIGlmIChzdGFydCA8IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB0b2tlbiA9IHNvdXJjZS5zbGljZShzdGFydCwgZW5kSW5kZXgpLnRyaW0oKTtcbiAgICAgIGlmICh0b2tlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgIH1cbiAgICAgIHN0YXJ0ID0gLTE7XG4gICAgfTtcblxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBzb3VyY2UubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgICBjb25zdCBjaGFyID0gc291cmNlW2luZGV4XTtcbiAgICAgIGNvbnN0IG5leHRDaGFyID0gc291cmNlW2luZGV4ICsgMV07XG5cbiAgICAgIGlmIChjaGFyID09PSBcIidcIiAmJiAhaW5Eb3VibGVRdW90ZSkge1xuICAgICAgICBpZiAoc3RhcnQgPCAwKSB7XG4gICAgICAgICAgc3RhcnQgPSBpbmRleDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5TaW5nbGVRdW90ZSAmJiBuZXh0Q2hhciA9PT0gXCInXCIpIHtcbiAgICAgICAgICBpbmRleCArPSAxO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGluU2luZ2xlUXVvdGUgPSAhaW5TaW5nbGVRdW90ZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChjaGFyID09PSAnXCInICYmICFpblNpbmdsZVF1b3RlKSB7XG4gICAgICAgIGlmIChzdGFydCA8IDApIHtcbiAgICAgICAgICBzdGFydCA9IGluZGV4O1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbkRvdWJsZVF1b3RlICYmIG5leHRDaGFyID09PSAnXCInKSB7XG4gICAgICAgICAgaW5kZXggKz0gMTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpbkRvdWJsZVF1b3RlID0gIWluRG91YmxlUXVvdGU7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWluU2luZ2xlUXVvdGUgJiYgIWluRG91YmxlUXVvdGUpIHtcbiAgICAgICAgaWYgKGNoYXIgPT09IFwiKFwiKSB7XG4gICAgICAgICAgaWYgKHN0YXJ0IDwgMCkge1xuICAgICAgICAgICAgc3RhcnQgPSBpbmRleDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcGFyZW5EZXB0aCArPSAxO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGFyID09PSBcIilcIikge1xuICAgICAgICAgIHBhcmVuRGVwdGggLT0gMTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hhciA9PT0gXCJbXCIpIHtcbiAgICAgICAgICBpZiAoc3RhcnQgPCAwKSB7XG4gICAgICAgICAgICBzdGFydCA9IGluZGV4O1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmFja2V0RGVwdGggKz0gMTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hhciA9PT0gXCJdXCIpIHtcbiAgICAgICAgICBicmFja2V0RGVwdGggLT0gMTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgvXFxzLy50ZXN0KGNoYXIpICYmIHBhcmVuRGVwdGggPT09IDAgJiYgYnJhY2tldERlcHRoID09PSAwKSB7XG4gICAgICAgICAgcHVzaFRva2VuKGluZGV4KTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoc3RhcnQgPCAwKSB7XG4gICAgICAgIHN0YXJ0ID0gaW5kZXg7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHVzaFRva2VuKHNvdXJjZS5sZW5ndGgpO1xuICAgIHJldHVybiB0b2tlbnM7XG4gIH1cblxuICBwcml2YXRlIGZpbmRNYXRjaGluZ1BhcmVudGhlc2lzKHNvdXJjZTogc3RyaW5nLCBvcGVuSW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgbGV0IGRlcHRoID0gMDtcbiAgICBsZXQgaW5TaW5nbGVRdW90ZSA9IGZhbHNlO1xuICAgIGxldCBpbkRvdWJsZVF1b3RlID0gZmFsc2U7XG5cbiAgICBmb3IgKGxldCBpbmRleCA9IG9wZW5JbmRleDsgaW5kZXggPCBzb3VyY2UubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgICBjb25zdCBjaGFyID0gc291cmNlW2luZGV4XTtcbiAgICAgIGNvbnN0IG5leHRDaGFyID0gc291cmNlW2luZGV4ICsgMV07XG5cbiAgICAgIGlmIChjaGFyID09PSBcIidcIiAmJiAhaW5Eb3VibGVRdW90ZSkge1xuICAgICAgICBpZiAoaW5TaW5nbGVRdW90ZSAmJiBuZXh0Q2hhciA9PT0gXCInXCIpIHtcbiAgICAgICAgICBpbmRleCArPSAxO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGluU2luZ2xlUXVvdGUgPSAhaW5TaW5nbGVRdW90ZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChjaGFyID09PSAnXCInICYmICFpblNpbmdsZVF1b3RlKSB7XG4gICAgICAgIGlmIChpbkRvdWJsZVF1b3RlICYmIG5leHRDaGFyID09PSAnXCInKSB7XG4gICAgICAgICAgaW5kZXggKz0gMTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpbkRvdWJsZVF1b3RlID0gIWluRG91YmxlUXVvdGU7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoaW5TaW5nbGVRdW90ZSB8fCBpbkRvdWJsZVF1b3RlKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2hhciA9PT0gXCIoXCIpIHtcbiAgICAgICAgZGVwdGggKz0gMTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChjaGFyID09PSBcIilcIikge1xuICAgICAgICBkZXB0aCAtPSAxO1xuICAgICAgICBpZiAoZGVwdGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gLTE7XG4gIH1cblxuICAvKipcbiAgICog7Yq57KCVIO2FjOydtOu4lOydmCBQS+ulvCDssLjsobDtlZjripQg64uk66W4IO2FjOydtOu4lOydmCBGSyDrqqnroZ3snYQg7KGw7ZqM7ZWp64uI64ukLlxuICAgKiBQSyDtg4DsnoUg67OA6rK9IOyLnCDqtIDroKggRksg7KCc7JW97KGw6rG07J2EIOyCreygnC/rs7XqtaztlZjquLAg7JyE7ZW0IOyCrOyaqeuQqeuLiOuLpC5cbiAgICovXG4gIGFzeW5jIGdldFJlZmVyZW5jaW5nRm9yZWlnbktleXMoZGI6IEtuZXgsIHRhYmxlTmFtZTogc3RyaW5nKTogUHJvbWlzZTxSZWZlcmVuY2luZ0ZvcmVpZ25LZXlbXT4ge1xuICAgIGNvbnN0IHF1ZXJ5ID0gYFxuICAgICAgU0VMRUNUXG4gICAgICAgIHRjLnRhYmxlX25hbWUsXG4gICAgICAgIHRjLmNvbnN0cmFpbnRfbmFtZSxcbiAgICAgICAga2N1LmNvbHVtbl9uYW1lLFxuICAgICAgICBjY3UudGFibGVfbmFtZSBBUyByZWZlcmVuY2VkX3RhYmxlX25hbWUsXG4gICAgICAgIGNjdS5jb2x1bW5fbmFtZSBBUyByZWZlcmVuY2VkX2NvbHVtbl9uYW1lLFxuICAgICAgICByYy51cGRhdGVfcnVsZSxcbiAgICAgICAgcmMuZGVsZXRlX3J1bGVcbiAgICAgIEZST00gaW5mb3JtYXRpb25fc2NoZW1hLnRhYmxlX2NvbnN0cmFpbnRzIEFTIHRjXG4gICAgICBKT0lOIGluZm9ybWF0aW9uX3NjaGVtYS5rZXlfY29sdW1uX3VzYWdlIEFTIGtjdVxuICAgICAgICBPTiB0Yy5jb25zdHJhaW50X25hbWUgPSBrY3UuY29uc3RyYWludF9uYW1lXG4gICAgICAgIEFORCB0Yy50YWJsZV9zY2hlbWEgPSBrY3UudGFibGVfc2NoZW1hXG4gICAgICBKT0lOIGluZm9ybWF0aW9uX3NjaGVtYS5jb25zdHJhaW50X2NvbHVtbl91c2FnZSBBUyBjY3VcbiAgICAgICAgT04gY2N1LmNvbnN0cmFpbnRfbmFtZSA9IHRjLmNvbnN0cmFpbnRfbmFtZVxuICAgICAgICBBTkQgY2N1LnRhYmxlX3NjaGVtYSA9IHRjLnRhYmxlX3NjaGVtYVxuICAgICAgSk9JTiBpbmZvcm1hdGlvbl9zY2hlbWEucmVmZXJlbnRpYWxfY29uc3RyYWludHMgQVMgcmNcbiAgICAgICAgT04gcmMuY29uc3RyYWludF9uYW1lID0gdGMuY29uc3RyYWludF9uYW1lXG4gICAgICAgIEFORCByYy5jb25zdHJhaW50X3NjaGVtYSA9IHRjLnRhYmxlX3NjaGVtYVxuICAgICAgV0hFUkUgdGMuY29uc3RyYWludF90eXBlID0gJ0ZPUkVJR04gS0VZJ1xuICAgICAgICBBTkQgY2N1LnRhYmxlX25hbWUgPSA/XG4gICAgICAgIEFORCB0Yy50YWJsZV9zY2hlbWEgPSAncHVibGljJ1xuICAgIGA7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBkYi5yYXcocXVlcnksIFt0YWJsZU5hbWVdKTtcbiAgICByZXR1cm4gcmVzdWx0LnJvd3MubWFwKFxuICAgICAgKHJvdzoge1xuICAgICAgICB0YWJsZV9uYW1lOiBzdHJpbmc7XG4gICAgICAgIGNvbnN0cmFpbnRfbmFtZTogc3RyaW5nO1xuICAgICAgICBjb2x1bW5fbmFtZTogc3RyaW5nO1xuICAgICAgICByZWZlcmVuY2VkX3RhYmxlX25hbWU6IHN0cmluZztcbiAgICAgICAgcmVmZXJlbmNlZF9jb2x1bW5fbmFtZTogc3RyaW5nO1xuICAgICAgICB1cGRhdGVfcnVsZTogc3RyaW5nO1xuICAgICAgICBkZWxldGVfcnVsZTogc3RyaW5nO1xuICAgICAgfSkgPT4gKHtcbiAgICAgICAgdGFibGVOYW1lOiByb3cudGFibGVfbmFtZSxcbiAgICAgICAgY29uc3RyYWludE5hbWU6IHJvdy5jb25zdHJhaW50X25hbWUsXG4gICAgICAgIGNvbHVtbk5hbWU6IHJvdy5jb2x1bW5fbmFtZSxcbiAgICAgICAgcmVmZXJlbmNlZFRhYmxlTmFtZTogcm93LnJlZmVyZW5jZWRfdGFibGVfbmFtZSxcbiAgICAgICAgcmVmZXJlbmNlZENvbHVtbk5hbWU6IHJvdy5yZWZlcmVuY2VkX2NvbHVtbl9uYW1lLFxuICAgICAgICBvblVwZGF0ZTogdGhpcy5tYXBDb25zdHJhaW50QWN0aW9uKHJvdy51cGRhdGVfcnVsZSksXG4gICAgICAgIG9uRGVsZXRlOiB0aGlzLm1hcENvbnN0cmFpbnRBY3Rpb24ocm93LmRlbGV0ZV9ydWxlKSxcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogdmVjdG9yIOy7rOufvOydmCBkaW1lbnNpb25z66W8IOyhsO2ajO2VqeuLiOuLpC5cbiAgICogcGdfYXR0cmlidXRl7J2YIGF0dHR5cG1vZOyXkOyEnCDssKjsm5Ag7IiY66W8IOy2lOy2nO2VqeuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZ2V0VmVjdG9yRGltZW5zaW9ucyhcbiAgICBjb21wYXJlREI6IFJhd0NhcGFibGVLbmV4LFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIG51bWJlcj4+IHtcbiAgICBjb25zdCBxdWVyeSA9IGBcbiAgICAgIFNFTEVDVFxuICAgICAgICBhLmF0dG5hbWUgYXMgY29sdW1uX25hbWUsXG4gICAgICAgIGEuYXR0dHlwbW9kIGFzIGRpbWVuc2lvbnNcbiAgICAgIEZST00gcGdfYXR0cmlidXRlIGFcbiAgICAgIEpPSU4gcGdfY2xhc3MgYyBPTiBhLmF0dHJlbGlkID0gYy5vaWRcbiAgICAgIEpPSU4gcGdfdHlwZSB0IE9OIGEuYXR0dHlwaWQgPSB0Lm9pZFxuICAgICAgV0hFUkUgYy5yZWxuYW1lID0gP1xuICAgICAgICBBTkQgdC50eXBuYW1lID0gJ3ZlY3RvcidcbiAgICAgICAgQU5EIGEuYXR0bnVtID4gMFxuICAgIGA7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY29tcGFyZURCLnJhdyhxdWVyeSwgW3RhYmxlTmFtZV0pO1xuICAgIGNvbnN0IGRpbWVuc2lvbnM6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IHJvdyBvZiByZXN1bHQucm93cykge1xuICAgICAgLy8gYXR0dHlwbW9k7JeQ7IScIOyLpOygnCBkaW1lbnNpb25zIOqwkiDstpTstpxcbiAgICAgIGRpbWVuc2lvbnNbcm93LmNvbHVtbl9uYW1lXSA9IHJvdy5kaW1lbnNpb25zID4gMCA/IHJvdy5kaW1lbnNpb25zIDogMDtcbiAgICB9XG4gICAgcmV0dXJuIGRpbWVuc2lvbnM7XG4gIH1cblxuICAvKipcbiAgICogUG9zdGdyZVNRTCDsu6zrn7wg7YOA7J6F7J2EIOu2hOyEne2VmOyXrCBNaWdyYXRpb25Db2x1bW4g6rCd7LK066GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAgICovXG4gIHJlc29sdmVEQkNvbFR5cGUoXG4gICAgZGJDb2x1bW46IFBnQ29sdW1uLFxuICApOiBQaWNrPFxuICAgIE1pZ3JhdGlvbkNvbHVtbixcbiAgICBcInR5cGVcIiB8IFwibGVuZ3RoXCIgfCBcInByZWNpc2lvblwiIHwgXCJzY2FsZVwiIHwgXCJudW1iZXJUeXBlXCIgfCBcImRpbWVuc2lvbnNcIlxuICA+IHtcbiAgICBjb25zdCB7IHVkdF9uYW1lOiBfdWR0X25hbWUsIGNoYXJhY3Rlcl9tYXhpbXVtX2xlbmd0aCwgcHJlY2lzaW9uLCBudW1lcmljX3NjYWxlIH0gPSBkYkNvbHVtbjtcblxuICAgIGNvbnN0IHsgdWR0X25hbWUsIHNpbmdsZU9yQXJyYXkgfSA9ICgoKSA9PiB7XG4gICAgICBpZiAoX3VkdF9uYW1lLnN0YXJ0c1dpdGgoXCJfXCIpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdWR0X25hbWU6IF91ZHRfbmFtZS5zdWJzdHJpbmcoMSksXG4gICAgICAgICAgc2luZ2xlT3JBcnJheTogXCJbXVwiIGFzIGNvbnN0LFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdWR0X25hbWU6IF91ZHRfbmFtZSxcbiAgICAgICAgc2luZ2xlT3JBcnJheTogXCJcIiBhcyBjb25zdCxcbiAgICAgIH07XG4gICAgfSkoKTtcblxuICAgIC8vIFVVSURcbiAgICBpZiAodWR0X25hbWUgPT09IFwidXVpZFwiKSB7XG4gICAgICByZXR1cm4geyB0eXBlOiBgdXVpZCR7c2luZ2xlT3JBcnJheX1gIH07XG4gICAgfVxuXG4gICAgLy8gSW50ZWdlciB0eXBlc1xuICAgIGlmICh1ZHRfbmFtZSA9PT0gXCJpbnQ0XCIpIHtcbiAgICAgIHJldHVybiB7IHR5cGU6IGBpbnRlZ2VyJHtzaW5nbGVPckFycmF5fWAgfTtcbiAgICB9XG4gICAgaWYgKHVkdF9uYW1lID09PSBcImludDhcIikge1xuICAgICAgcmV0dXJuIHsgdHlwZTogYGJpZ0ludGVnZXIke3NpbmdsZU9yQXJyYXl9YCB9O1xuICAgIH1cblxuICAgIC8vIFN0cmluZyB0eXBlc1xuICAgIGlmICh1ZHRfbmFtZSA9PT0gXCJ2YXJjaGFyXCIpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IGBzdHJpbmcke3NpbmdsZU9yQXJyYXl9YCxcbiAgICAgICAgLi4uKGNoYXJhY3Rlcl9tYXhpbXVtX2xlbmd0aCAmJiB7XG4gICAgICAgICAgbGVuZ3RoOiBjaGFyYWN0ZXJfbWF4aW11bV9sZW5ndGgsXG4gICAgICAgIH0pLFxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKHVkdF9uYW1lID09PSBcInRleHRcIikge1xuICAgICAgcmV0dXJuIHsgdHlwZTogYHN0cmluZyR7c2luZ2xlT3JBcnJheX1gIH07IC8vIFN0cmluZ1Byb3Agd2l0aG91dCBsZW5ndGhcbiAgICB9XG5cbiAgICAvLyBOdW1iZXJPck51bWVyaWMgdHlwZXNcbiAgICBpZiAodWR0X25hbWUgPT09IFwibnVtZXJpY1wiKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBgbnVtYmVyT3JOdW1lcmljJHtzaW5nbGVPckFycmF5fWAsXG4gICAgICAgIG51bWJlclR5cGU6IFwibnVtZXJpY1wiLFxuICAgICAgICAuLi4ocHJlY2lzaW9uICE9PSBudWxsICYmXG4gICAgICAgICAgbnVtZXJpY19zY2FsZSAhPT0gbnVsbCAmJiB7XG4gICAgICAgICAgICBwcmVjaXNpb246IHByZWNpc2lvbixcbiAgICAgICAgICAgIHNjYWxlOiBudW1lcmljX3NjYWxlLFxuICAgICAgICAgIH0pLFxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKHVkdF9uYW1lID09PSBcImZsb2F0NFwiKSB7XG4gICAgICByZXR1cm4geyB0eXBlOiBgbnVtYmVyT3JOdW1lcmljJHtzaW5nbGVPckFycmF5fWAsIG51bWJlclR5cGU6IFwicmVhbFwiIH07XG4gICAgfVxuICAgIGlmICh1ZHRfbmFtZSA9PT0gXCJmbG9hdDhcIikge1xuICAgICAgcmV0dXJuIHsgdHlwZTogYG51bWJlck9yTnVtZXJpYyR7c2luZ2xlT3JBcnJheX1gLCBudW1iZXJUeXBlOiBcImRvdWJsZSBwcmVjaXNpb25cIiB9O1xuICAgIH1cblxuICAgIC8vIEJvb2xlYW5cbiAgICBpZiAodWR0X25hbWUgPT09IFwiYm9vbFwiKSB7XG4gICAgICByZXR1cm4geyB0eXBlOiBgYm9vbGVhbiR7c2luZ2xlT3JBcnJheX1gIH07XG4gICAgfVxuXG4gICAgLy8gVGltZXN0YW1weiB0eXBlc1xuICAgIGlmICh1ZHRfbmFtZSA9PT0gXCJ0aW1lc3RhbXB0elwiKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBgZGF0ZSR7c2luZ2xlT3JBcnJheX1gLFxuICAgICAgICAuLi4ocHJlY2lzaW9uICE9PSBudWxsICYmIHtcbiAgICAgICAgICBwcmVjaXNpb246IHByZWNpc2lvbixcbiAgICAgICAgfSksXG4gICAgICB9OyAvLyBEYXRlUHJvcCDihpIgdGltZXN0YW1wdHpcbiAgICB9XG5cbiAgICAvLyBKU09OXG4gICAgaWYgKHVkdF9uYW1lID09PSBcImpzb25cIiB8fCB1ZHRfbmFtZSA9PT0gXCJqc29uYlwiKSB7XG4gICAgICByZXR1cm4geyB0eXBlOiBcImpzb25cIiB9O1xuICAgIH1cblxuICAgIC8vIFZlY3RvciAocGd2ZWN0b3IpXG4gICAgaWYgKHVkdF9uYW1lID09PSBcInZlY3RvclwiKSB7XG4gICAgICAvLyB2ZWN0b3Ig7YOA7J6F7J2YIOywqOybkCDsiJjripQgY29sdW1uX2RlZmF1bHTrgpgg67OE64+EIOy/vOumrOuhnCDtmZXsnbjtlbTslbwg7ZWoXG4gICAgICAvLyDtmITsnqzripQg6riw67O46rCSIDDsnLzroZwg7ISk7KCVICjsi6TsoJwgZGltZW5zaW9uc+uKlCBnZXRNaWdyYXRpb25TZXRGcm9tRELsl5DshJwg67OE64+EIOy/vOumrOuhnCDtmZXsnbgpXG4gICAgICByZXR1cm4geyB0eXBlOiBgdmVjdG9yJHtzaW5nbGVPckFycmF5fWAsIGRpbWVuc2lvbnM6IDAgfTtcbiAgICB9XG5cbiAgICAvLyB0c3ZlY3RvciAoUG9zdGdyZVNRTCDsoITrrLgg6rKA7IOJ7JqpIO2DgOyehSlcbiAgICBpZiAodWR0X25hbWUgPT09IFwidHN2ZWN0b3JcIikge1xuICAgICAgcmV0dXJuIHsgdHlwZTogXCJ0c3ZlY3RvclwiIH07XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGByZXNvbHZlIOu2iOqwgOuKpe2VnCBQb3N0Z3JlU1FMIOy7rOufvCDtg4DsnoU6ICR7dWR0X25hbWV9YCk7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IFBvc3RncmVTUUxTY2hlbWFSZWFkZXIgPSBuZXcgUG9zdGdyZVNRTFNjaGVtYVJlYWRlckNsYXNzKCk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Q0F3RU0sOEJBQU4sTUFBa0M7RUFDaEMsQUFBaUIsb0JBQW9CLElBQUksSUFBSTtHQUFDO0dBQVM7R0FBUTtHQUFPO0dBQVE7R0FBVyxDQUFDOzs7Ozs7O0VBUTFGLE1BQU0sc0JBQ0osV0FDQSxPQUM4QjtHQUM5QixJQUFJQSxXQUF1QkMsV0FBc0JDO0FBQ2pELE9BQUk7QUFDRixLQUFDLFdBQVcsV0FBVyxjQUFjLE1BQU0sS0FBSyxVQUFVLFdBQVcsTUFBTTtZQUNwRUMsR0FBWTtBQUNuQixRQUFJLGFBQWEsU0FBUyxFQUFFLFFBQVEsU0FBUyxrQkFBa0IsRUFBRTtBQUMvRCxZQUFPOztBQUVULFlBQVEsTUFBTSxFQUFFO0FBQ2hCLFdBQU87O0dBSVQsTUFBTSxtQkFBbUIsTUFBTSxLQUFLLG9CQUFvQixXQUFXLE1BQU07R0FFekUsTUFBTUMsVUFBNkIsVUFBVSxLQUFLLGFBQWE7SUFDN0QsTUFBTSxZQUFZLEtBQUssaUJBQWlCLFNBQVM7QUFHakQsUUFBSSxVQUFVLFNBQVMsVUFBVTtBQUMvQixlQUFVLGFBQWEsaUJBQWlCLFNBQVMsZ0JBQWdCOztBQUduRSxXQUFPO0tBQ0wsTUFBTSxTQUFTO0tBQ2YsVUFBVSxTQUFTLGdCQUFnQjtLQUNuQyxHQUFHO0tBRUgsVUFBVTtBQUNSLFVBQUksU0FBUyxpQkFBaUIsT0FBTyxTQUFTLGlCQUFpQixLQUFLO0FBQ2xFLGNBQU8sRUFDTCxXQUFXO1FBQ1QsTUFBTSxTQUFTLGlCQUFpQixNQUFNLFdBQVc7UUFDakQsWUFBWSxTQUFTLHlCQUF5QjtRQUMvQyxFQUNGOztBQUVILGFBQU8sRUFBRTtTQUNQO0tBRUosVUFBVTtBQUVSLFVBQUksU0FBUyxpQkFBaUIsT0FBTyxT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
@@ -1 +1 @@
1
- {"version":3,"file":"sd.template.d.ts","sourceRoot":"","sources":["../../../src/template/implementations/sd.template.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC;;;GAGG;AACH,qBAAa,YAAa,SAAQ,QAAQ;;IAKxC,gBAAgB,CAAC,MAAM,CAAC,EAAE,iBAAiB,EAAE,QAAQ,CAAC,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK;;;;IAW7E,MAAM,CAAC,OAAO,EAAE,eAAe,CAAC,IAAI,CAAC;;;;;;;IAiOrC;;;OAGG;IACH,OAAO,CAAC,uBAAuB;IAoC/B;;;;;;OAMG;IACH,OAAO,CAAC,mBAAmB;IAiC3B;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAYhC,OAAO,CAAC,YAAY;CAGrB"}
1
+ {"version":3,"file":"sd.template.d.ts","sourceRoot":"","sources":["../../../src/template/implementations/sd.template.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC;;;GAGG;AACH,qBAAa,YAAa,SAAQ,QAAQ;;IAKxC,gBAAgB,CAAC,MAAM,CAAC,EAAE,iBAAiB,EAAE,QAAQ,CAAC,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK;;;;IAW7E,MAAM,CAAC,OAAO,EAAE,eAAe,CAAC,IAAI,CAAC;;;;;;;IAyRrC;;;OAGG;IACH,OAAO,CAAC,uBAAuB;IAoC/B;;;;;;OAMG;IACH,OAAO,CAAC,mBAAmB;IAiC3B;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAYhC,OAAO,CAAC,YAAY;CAGrB"}
@@ -175,27 +175,83 @@ type LocalizedBaseColumn<T> = {
175
175
  * @example
176
176
  * localizedColumn(tag, "name")
177
177
  */
178
+ type LocalizedColumnScalarValue = string | number | boolean | bigint;
179
+ type LocalizedColumnValue = string | string[];
180
+ type NestedLocalizedColumnValueFrom<V> = V extends string
181
+ ? string
182
+ : V extends readonly string[]
183
+ ? string[]
184
+ : never;
185
+ type LocalizedColumnValueFrom<V> = V extends string
186
+ ? string
187
+ : V extends readonly string[]
188
+ ? string[]
189
+ : V extends number | boolean | bigint
190
+ ? string
191
+ : V extends Partial<Record<(typeof SUPPORTED_LOCALES)[number], infer LV>>
192
+ ? NestedLocalizedColumnValueFrom<LV>
193
+ : never;
194
+ type LocalizedColumnCandidate<T, K extends string> =
195
+ | (K extends keyof T ? T[K] : never)
196
+ | {
197
+ [L in (typeof SUPPORTED_LOCALES)[number]]: \`\${K}_\${L}\` extends keyof T ? T[\`\${K}_\${L}\`] : never;
198
+ }[(typeof SUPPORTED_LOCALES)[number]];
199
+ type LocalizedColumnReturn<T, K extends string> =
200
+ | LocalizedColumnValueFrom<LocalizedColumnCandidate<T, K>>
201
+ | undefined;
202
+ type LocaleValueMap = Partial<Record<(typeof SUPPORTED_LOCALES)[number], unknown>>;
203
+
204
+ function isLocalizedColumnValue(value: unknown): value is LocalizedColumnValue {
205
+ return typeof value === "string" || (Array.isArray(value) && value.every((item) => typeof item === "string"));
206
+ }
207
+
208
+ function isLocalizedColumnScalarValue(value: unknown): value is LocalizedColumnScalarValue {
209
+ return ["string", "number", "boolean", "bigint"].includes(typeof value);
210
+ }
211
+
212
+ function isEmptyLocalizedColumnValue(value: unknown): value is null | undefined | "" {
213
+ return value === null || value === undefined || value === "";
214
+ }
215
+
216
+ function getNestedLocaleValue<T extends Record<string, unknown>, K extends LocalizedBaseColumn<T>>(
217
+ row: T,
218
+ column: K,
219
+ locale: (typeof SUPPORTED_LOCALES)[number],
220
+ ): unknown {
221
+ const columnValue = row[column];
222
+ if (columnValue === null || typeof columnValue !== "object" || Array.isArray(columnValue)) {
223
+ return undefined;
224
+ }
225
+
226
+ return (columnValue as LocaleValueMap)[locale];
227
+ }
228
+
178
229
  export function localizedColumn<T extends Record<string, unknown>, K extends LocalizedBaseColumn<T>>(
179
230
  row: T,
180
231
  column: K,
181
- ): string | undefined {
182
- const locale = getCurrentLocale();
232
+ ): LocalizedColumnReturn<T, K> {
233
+ const currentLocale = getCurrentLocale();
234
+ const locale = SUPPORTED_LOCALES.includes(currentLocale) ? currentLocale : DEFAULT_LOCALE;
183
235
  const otherLocales = SUPPORTED_LOCALES.filter((l: string) => l !== locale && l !== DEFAULT_LOCALE);
184
236
  const localizedKey = (column: K, locale: (typeof SUPPORTED_LOCALES)[number]) => \`\${column}_\${locale}\`;
185
- const keys = [
186
- localizedKey(column, locale),
187
- column,
188
- localizedKey(column, DEFAULT_LOCALE),
189
- ...otherLocales.map((l) => localizedKey(column, l)),
237
+ const values = [
238
+ { value: row[localizedKey(column, locale)], source: "direct" },
239
+ { value: getNestedLocaleValue(row, column, locale), source: "nested" },
240
+ { value: row[column], source: "direct" },
241
+ { value: row[localizedKey(column, DEFAULT_LOCALE)], source: "direct" },
242
+ { value: getNestedLocaleValue(row, column, DEFAULT_LOCALE), source: "nested" },
243
+ ...otherLocales.flatMap((l) => [
244
+ { value: row[localizedKey(column, l)], source: "direct" },
245
+ { value: getNestedLocaleValue(row, column, l), source: "nested" },
246
+ ]),
190
247
  ];
191
248
 
192
- for (const key of keys) {
193
- if (!(key in row)) {
194
- continue;
249
+ for (const { value, source } of values) {
250
+ if (!isEmptyLocalizedColumnValue(value) && isLocalizedColumnValue(value)) {
251
+ return value as LocalizedColumnReturn<T, K>;
195
252
  }
196
-
197
- if (row[key] !== null && row[key] !== undefined && row[key] !== "") {
198
- return String(row[key]);
253
+ if (source === "direct" && !isEmptyLocalizedColumnValue(value) && isLocalizedColumnScalarValue(value)) {
254
+ return String(value) as LocalizedColumnReturn<T, K>;
199
255
  }
200
256
  }
201
257
 
@@ -313,4 +369,4 @@ ${entries.join("\n")}
313
369
 
314
370
  //#endregion
315
371
  export { Template__sd };
316
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2QudGVtcGxhdGUuanMiLCJuYW1lcyI6WyJsYWJlbHM6IHsga2V5OiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfVtdIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3RlbXBsYXRlL2ltcGxlbWVudGF0aW9ucy9zZC50ZW1wbGF0ZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZnMgZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IGZpbGVVUkxUb1BhdGggfSBmcm9tIFwibm9kZTp1cmxcIjtcblxuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uLy4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyB0eXBlIEVudGl0eU5hbWVzUmVjb3JkIH0gZnJvbSBcIi4uLy4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiO1xuaW1wb3J0IHsgdHlwZSBUZW1wbGF0ZU9wdGlvbnMgfSBmcm9tIFwiLi4vLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IGV4dHJhY3RPYmplY3REZWNsYXJhdGlvbiB9IGZyb20gXCIuLi9oZWxwZXJzXCI7XG5pbXBvcnQgeyBUZW1wbGF0ZSB9IGZyb20gXCIuLi90ZW1wbGF0ZVwiO1xuXG4vKipcbiAqIFNvbmFtdSBEaWN0aW9uYXJ5IChTRCkg7YWc7ZSM66a/XG4gKiBpMThu7J2EIOychO2VnCBzZC5nZW5lcmF0ZWQudHMg7YyM7J287J2EIOyDneyEse2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGNsYXNzIFRlbXBsYXRlX19zZCBleHRlbmRzIFRlbXBsYXRlIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoXCJzZFwiKTtcbiAgfVxuXG4gIGdldFRhcmdldEFuZFBhdGgoX25hbWVzPzogRW50aXR5TmFtZXNSZWNvcmQsIHNkVGFyZ2V0PzogXCJhcGlcIiB8IFwid2ViXCIgfCBcImFwcFwiKSB7XG4gICAgY29uc3QgdGFyZ2V0ID0gc2RUYXJnZXQgPz8gXCJhcGlcIjtcbiAgICAvLyBhcGkuZGly7J2AIOyDgeuMgCDqsr3roZwoXCJhcGlcIinsnbTrr4DroZwsIHdlYi9hcHDrj4Qg7IOB64yAIOqyveuhnOuhnCDrp57stqRcbiAgICBjb25zdCBkaXIgPSB0YXJnZXQgPT09IFwiYXBpXCIgPyBTb25hbXUuY29uZmlnLmFwaS5kaXIgOiB0YXJnZXQ7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdGFyZ2V0OiBgJHtkaXJ9L3NyYy9pMThuYCxcbiAgICAgIHBhdGg6IFwic2QuZ2VuZXJhdGVkLnRzXCIsXG4gICAgfTtcbiAgfVxuXG4gIHJlbmRlcihvcHRpb25zOiBUZW1wbGF0ZU9wdGlvbnNbXCJzZFwiXSkge1xuICAgIGNvbnN0IHsgdGFyZ2V0IH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IGkxOG5Db25maWcgPSBTb25hbXUuY29uZmlnLmkxOG47XG5cbiAgICBjb25zdCB7IGRlZmF1bHRMb2NhbGUsIHN1cHBvcnRlZExvY2FsZXMgfSA9IGkxOG5Db25maWc7XG5cbiAgICAvLyBlbnRpdHkuanNvbuyXkOyEnCBlbnRpdHkgbGFiZWxzIOy2lOy2nFxuICAgIGNvbnN0IGVudGl0eUxhYmVscyA9IHRoaXMuZXh0cmFjdEVudGl0eUxhYmVscygpO1xuXG4gICAgLy8gcmMta2V5cyDshozsiqQg7L2U65OcIOy2lOy2nFxuICAgIGNvbnN0IHJjS2V5c1NvdXJjZUNvZGUgPSB0aGlzLmV4dHJhY3RSQ0tleXNTb3VyY2VDb2RlKCk7XG5cbiAgICAvLyDtlIzrnqvtj7zrs4QgbG9jYWxlIOq0gOumrCDsvZTrk5xcbiAgICBjb25zdCBsb2NhbGVNYW5hZ2VtZW50Q29kZSA9XG4gICAgICB0YXJnZXQgPT09IFwiYXBpXCJcbiAgICAgICAgPyBgXG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwic29uYW11XCI7XG5cbmNvbnN0IERFRkFVTFRfTE9DQUxFID0gXCIke2RlZmF1bHRMb2NhbGV9XCIgYXMgY29uc3Q7XG5jb25zdCBTVVBQT1JURURfTE9DQUxFUyA9ICR7SlNPTi5zdHJpbmdpZnkoc3VwcG9ydGVkTG9jYWxlcyl9IGFzIGNvbnN0O1xuZnVuY3Rpb24gZ2V0Q3VycmVudExvY2FsZSgpOiAodHlwZW9mIFNVUFBPUlRFRF9MT0NBTEVTKVtudW1iZXJdIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBjdHggPSBTb25hbXUuZ2V0Q29udGV4dCgpO1xuICAgIHJldHVybiBjdHgubG9jYWxlIGFzICh0eXBlb2YgU1VQUE9SVEVEX0xPQ0FMRVMpW251bWJlcl0gPz8gREVGQVVMVF9MT0NBTEU7XG4gIH0gY2F0Y2ggKF8pIHtcbiAgICByZXR1cm4gREVGQVVMVF9MT0NBTEU7XG4gIH1cbn1cbmAudHJpbSgpXG4gICAgICAgIDogYFxuY29uc3QgREVGQVVMVF9MT0NBTEUgPSBcIiR7ZGVmYXVsdExvY2FsZX1cIiBhcyBjb25zdDtcbmV4cG9ydCBjb25zdCBTVVBQT1JURURfTE9DQUxFUyA9ICR7SlNPTi5zdHJpbmdpZnkoc3VwcG9ydGVkTG9jYWxlcyl9IGFzIGNvbnN0O1xubGV0IF9jdXJyZW50TG9jYWxlOiAodHlwZW9mIFNVUFBPUlRFRF9MT0NBTEVTKVtudW1iZXJdID0gREVGQVVMVF9MT0NBTEU7XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRMb2NhbGUobG9jYWxlOiAodHlwZW9mIFNVUFBPUlRFRF9MT0NBTEVTKVtudW1iZXJdKSB7XG4gIF9jdXJyZW50TG9jYWxlID0gbG9jYWxlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q3VycmVudExvY2FsZSgpOiAodHlwZW9mIFNVUFBPUlRFRF9MT0NBTEVTKVtudW1iZXJdIHtcbiAgcmV0dXJuIF9jdXJyZW50TG9jYWxlO1xufVxuYC50cmltKCk7XG5cbiAgICAvLyBsb2NhbGUgaW1wb3J0XG4gICAgY29uc3QgbG9jYWxlSW1wb3J0cyA9IHN1cHBvcnRlZExvY2FsZXNcbiAgICAgIC5tYXAoKGxvY2FsZSkgPT4gYGltcG9ydCAke2xvY2FsZX0gZnJvbSBcIi4vJHtsb2NhbGV9XCI7YClcbiAgICAgIC5qb2luKFwiXFxuXCIpO1xuXG4gICAgLy8gZW50aXR5TGFiZWxz66W8IOy9lOuTnOuhnCDrs4DtmZhcbiAgICBjb25zdCBlbnRpdHlMYWJlbHNDb2RlID0gdGhpcy5nZW5lcmF0ZUVudGl0eUxhYmVsc0NvZGUoZW50aXR5TGFiZWxzKTtcblxuICAgIC8vIGxvY2FsZeuzhCByY0tleXMg67OA7IiY66qFIOunpO2VkVxuICAgIGNvbnN0IGdldFJDS2V5c1Zhck5hbWUgPSAobG9jYWxlOiBzdHJpbmcpID0+IHtcbiAgICAgIC8vIHN1cHBvcnRlZExvY2FsZXPsl5Ag7Y+s7ZWo65CcIGxvY2FsZeunjCDtlbTri7kg67OA7IiYIOuwmO2ZmFxuICAgICAgaWYgKGxvY2FsZSA9PT0gXCJrb1wiICYmIHN1cHBvcnRlZExvY2FsZXMuaW5jbHVkZXMoXCJrb1wiKSkgcmV0dXJuIFwicmNLZXlzS29cIjtcbiAgICAgIGlmIChsb2NhbGUgPT09IFwiZW5cIiAmJiBzdXBwb3J0ZWRMb2NhbGVzLmluY2x1ZGVzKFwiZW5cIikpIHJldHVybiBcInJjS2V5c0VuXCI7XG4gICAgICAvLyBmYWxsYmFjazogZGVmYXVsdExvY2FsZeydmCByY0tleXNcbiAgICAgIGlmIChsb2NhbGUgIT09IGRlZmF1bHRMb2NhbGUpIHtcbiAgICAgICAgcmV0dXJuIGdldFJDS2V5c1Zhck5hbWUoZGVmYXVsdExvY2FsZSk7XG4gICAgICB9XG4gICAgICAvLyBkZWZhdWx0TG9jYWxl7KGw7LCoIOyXhuuKlCDqsr3smrAgZW7snYQgZmFsbGJhY2vsnLzroZwg7IKs7JqpXG4gICAgICByZXR1cm4gXCJyY0tleXNFblwiO1xuICAgIH07XG5cbiAgICBjb25zdCBib2R5ID0gYFxuJHtsb2NhbGVNYW5hZ2VtZW50Q29kZX1cblxuJHtsb2NhbGVJbXBvcnRzfVxuXG4vLyByZWFjdC1jb21wb25lbnRzIGkxOG4ga2V5c1xuJHtzdXBwb3J0ZWRMb2NhbGVzLmluY2x1ZGVzKFwia29cIikgPyByY0tleXNTb3VyY2VDb2RlLmtvIDogXCJcIn1cblxuJHtzdXBwb3J0ZWRMb2NhbGVzLmluY2x1ZGVzKFwiZW5cIikgPyByY0tleXNTb3VyY2VDb2RlLmVuIDogXCJcIn1cblxuLy8gZW50aXR5Lmpzb27sl5DshJwg7LaU7Lac7ZWcIGVudGl0eSBsYWJlbHMgKGRlZmF1bHRMb2NhbGUg7KCE7JqpKVxuJHtlbnRpdHlMYWJlbHNDb2RlfVxuXG4vLyBkZWZhdWx0TG9jYWxl7J2YIGRpY3Rpb25hcnnrpbwg6riw7KSA7Jy866GcIO2CpCDstpTstpxcbnR5cGUgUkNLZXlzID0gdHlwZW9mICR7Z2V0UkNLZXlzVmFyTmFtZShkZWZhdWx0TG9jYWxlKX07XG50eXBlIFByb2plY3REaWN0aW9uYXJ5ID0gdHlwZW9mICR7ZGVmYXVsdExvY2FsZX07XG50eXBlIEVudGl0eUxhYmVscyA9IHR5cGVvZiBlbnRpdHlMYWJlbHM7XG50eXBlIFJhd01lcmdlZERpY3Rpb25hcnkgPSBSQ0tleXMgJiBPbWl0PEVudGl0eUxhYmVscywga2V5b2YgKFJDS2V5cyAmIFByb2plY3REaWN0aW9uYXJ5KT4gJiBQcm9qZWN0RGljdGlvbmFyeTtcblxuLy8g7YKk64qUIOycoOyngO2VmOuQmCwg6rCSIO2DgOyeheydgCBzdHJpbmcg65iQ64qUIO2VqOyImOuhnCDsnbzrsJjtmZQgKOuLpOuluCBsb2NhbGXsnZgg66as7YSw65+0IO2DgOyehSDstqnrj4wg67Cp7KeAKVxuZXhwb3J0IHR5cGUgTWVyZ2VkRGljdGlvbmFyeSA9IHtcbiAgW0sgaW4ga2V5b2YgUmF3TWVyZ2VkRGljdGlvbmFyeV06IFJhd01lcmdlZERpY3Rpb25hcnlbS10gZXh0ZW5kcyAoLi4uYXJnczogaW5mZXIgUCkgPT4gc3RyaW5nXG4gICAgPyAoLi4uYXJnczogUCkgPT4gc3RyaW5nXG4gICAgOiBzdHJpbmc7XG59O1xuZXhwb3J0IHR5cGUgRGljdEtleSA9IGtleW9mIE1lcmdlZERpY3Rpb25hcnk7XG5leHBvcnQgdHlwZSBMb2NhbGl6ZWRTdHJpbmcgPSBzdHJpbmcgJiB7IF9fYnJhbmQ6IFwiTG9jYWxpemVkU3RyaW5nXCIgfTtcblxuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZUxvY2FsZShkaWN0OiBQYXJ0aWFsPE1lcmdlZERpY3Rpb25hcnk+KSB7XG4gIHJldHVybiBkaWN0O1xufVxuXG4vLyDqsIEgbG9jYWxl67OE66GcIHJjLWtleXMgKyBlbnRpdHkgbGFiZWxzICsg7ZSE66Gc7KCd7Yq4IGRpY3Qg7ZWp7LmoXG5jb25zdCBkaWN0aW9uYXJpZXM6IFJlY29yZDxzdHJpbmcsIFBhcnRpYWw8TWVyZ2VkRGljdGlvbmFyeT4+ID0ge1xuICAke2RlZmF1bHRMb2NhbGV9OiB7IC4uLiR7Z2V0UkNLZXlzVmFyTmFtZShkZWZhdWx0TG9jYWxlKX0sIC4uLmVudGl0eUxhYmVscywgLi4uJHtkZWZhdWx0TG9jYWxlfSB9LFxuICAke3N1cHBvcnRlZExvY2FsZXNcbiAgICAuZmlsdGVyKChsb2NhbGUpID0+IGxvY2FsZSAhPT0gZGVmYXVsdExvY2FsZSlcbiAgICAubWFwKChsb2NhbGUpID0+IGAgICR7bG9jYWxlfTogeyAuLi4ke2dldFJDS2V5c1Zhck5hbWUobG9jYWxlKX0sIC4uLiR7bG9jYWxlfSB9LGApXG4gICAgLmpvaW4oXCJcXG5cIil9XG59O1xuXG50eXBlIFNEUmV0dXJuVHlwZTxLIGV4dGVuZHMgRGljdEtleT4gPSBNZXJnZWREaWN0aW9uYXJ5W0tdIGV4dGVuZHMgKC4uLmFyZ3M6IGluZmVyIFApID0+IHN0cmluZ1xuICA/ICguLi5hcmdzOiBQKSA9PiBMb2NhbGl6ZWRTdHJpbmdcbiAgOiBMb2NhbGl6ZWRTdHJpbmc7XG5cbmZ1bmN0aW9uIGdldERpY3RWYWx1ZTxLIGV4dGVuZHMgRGljdEtleT4oa2V5OiBLLCBsb2NhbGU6IHN0cmluZyk6IFNEUmV0dXJuVHlwZTxLPiB7XG4gIC8vIDEuIOyngOygleuQnCBsb2NhbGXsl5DshJwg7KGw7ZqMXG4gIGNvbnN0IGRpY3QgPSBkaWN0aW9uYXJpZXNbbG9jYWxlXTtcbiAgaWYgKGRpY3Q/LltrZXldICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gZGljdFtrZXldIGFzIHVua25vd24gYXMgU0RSZXR1cm5UeXBlPEs+O1xuICB9XG5cbiAgLy8gMi4gZGVmYXVsdCBsb2NhbGXsl5DshJwg7KGw7ZqMXG4gIGlmIChsb2NhbGUgIT09IERFRkFVTFRfTE9DQUxFICYmIGRpY3Rpb25hcmllc1tERUZBVUxUX0xPQ0FMRV0/LltrZXldICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gZGljdGlvbmFyaWVzW0RFRkFVTFRfTE9DQUxFXVtrZXldIGFzIHVua25vd24gYXMgU0RSZXR1cm5UeXBlPEs+O1xuICB9XG5cbiAgLy8gMy4gc3VwcG9ydGVkIGxvY2FsZXMg7Iic7ZqMXG4gIGZvciAoY29uc3Qgc3VwcG9ydGVkTG9jYWxlIG9mIFNVUFBPUlRFRF9MT0NBTEVTKSB7XG4gICAgaWYgKHN1cHBvcnRlZExvY2FsZSAhPT0gbG9jYWxlICYmIHN1cHBvcnRlZExvY2FsZSAhPT0gREVGQVVMVF9MT0NBTEUpIHtcbiAgICAgIGlmIChkaWN0aW9uYXJpZXNbc3VwcG9ydGVkTG9jYWxlXT8uW2tleV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gZGljdGlvbmFyaWVzW3N1cHBvcnRlZExvY2FsZV1ba2V5XSBhcyB1bmtub3duIGFzIFNEUmV0dXJuVHlwZTxLPjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyA0LiDrqqjrkZAg7Iuk7YyoIOyLnCBrZXkg67CY7ZmYXG4gIHJldHVybiBrZXkgYXMgdW5rbm93biBhcyBTRFJldHVyblR5cGU8Sz47XG59XG5cbi8qKlxuICogU29uYW11IERpY3Rpb25hcnkg7ZWo7IiYXG4gKiBsb2NhbGXsl5Ag66ee64qUIOuyiOyXrSDthY3siqTtirjrpbwg67CY7ZmY7ZWp64uI64ukLlxuICpcbiAqIEBleGFtcGxlXG4gKiBTRChcImNvbW1vbi5zYXZlXCIpICAvLyDihpIgXCLsoIDsnqVcIiAoTG9jYWxpemVkU3RyaW5nKVxuICogU0QoXCJ1c2VyLm5vdEZvdW5kXCIpKDEpICAvLyDihpIgXCLsobTsnqztlZjsp4Ag7JWK64qUIFVzZXIgSUQgMVwiIChMb2NhbGl6ZWRTdHJpbmcpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBTRDxLIGV4dGVuZHMgRGljdEtleT4oa2V5OiBLKTogU0RSZXR1cm5UeXBlPEs+IHtcbiAgY29uc3QgbG9jYWxlID0gZ2V0Q3VycmVudExvY2FsZSgpO1xuICByZXR1cm4gZ2V0RGljdFZhbHVlKGtleSwgbG9jYWxlKTtcbn1cblxuLyoqXG4gKiDtirnsoJUgbG9jYWxl7J2YIOuyiOyXrSDthY3siqTtirjrpbwg67CY7ZmY7ZWY64qUIO2VqOyImOulvCDsg53shLHtlanri4jri6QuXG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IEVOID0gU0QubG9jYWxlKFwiZW5cIik7XG4gKiBFTihcImNvbW1vbi5zYXZlXCIpICAvLyDihpIgXCJTYXZlXCJcbiAqL1xuU0QubG9jYWxlID0gKGxvY2FsZTogKHR5cGVvZiBTVVBQT1JURURfTE9DQUxFUylbbnVtYmVyXSkgPT4gPEsgZXh0ZW5kcyBEaWN0S2V5PihrZXk6IEspOiBTRFJldHVyblR5cGU8Sz4gPT4ge1xuICByZXR1cm4gZ2V0RGljdFZhbHVlKGtleSwgbG9jYWxlKTtcbn07XG5cbi8vIExvY2FsaXplZCDqsIDriqXtlZwgQ29sdW1uIO2DgOyehSDqs4TsgrBcbnR5cGUgTG9jYWxpemVkQmFzZUNvbHVtbjxUPiA9IHtcbiAgW0sgaW4ga2V5b2YgVCAmIHN0cmluZ106IEsgZXh0ZW5kcyBcXGBcXCR7aW5mZXIgQmFzZX1fXFwkeyh0eXBlb2YgU1VQUE9SVEVEX0xPQ0FMRVMpW251bWJlcl19XFxgID8gQmFzZSA6IEs7XG59W2tleW9mIFQgJiBzdHJpbmddO1xuXG4vKipcbiAqIGxvY2FsZeyXkCDrlLDrnbwg7KCB7KCI7ZWcIOy7rOufvCDqsJLsnYQg67CY7ZmY7ZWp64uI64ukLlxuICogRELsl5AgbmFtZSwgbmFtZV9rbywgbmFtZV9lbuyymOufvCBsb2NhbGl6ZWQgY29sdW1u7J20IOyeiOydhCDrlYwg7IKs7Jqp7ZWp64uI64ukLlxuICpcbiAqIOyasOyEoOyInOychCAo7KeA7JuQIOuhnOy8gOydvOydgCBrby9qcC9lbuydtOqzoCwg7ISc67mE7Iqk7J2YIOq4sOuzuCDroZzsvIDsnbzsnYAga28sIOyCrOyaqeyekOydmCDroZzsvIDsnbzsnYAganDsnbwg65WMKTogY29sdW1uX2pwIOKGkiBjb2x1bW4g4oaSIGNvbHVtbl9rbyDihpIgY29sdW1uX2VuXG4gKiDsmrDshKDsiJzsnIQgKOyngOybkCDroZzsvIDsnbzsnYAga28vanAvZW7snbTqs6AsIOyEnOu5hOyKpOydmCDquLDrs7gg66Gc7LyA7J287J2AIGVuLCDsgqzsmqnsnpDsnZgg66Gc7LyA7J287J2AIGtv7J28IOuVjCk6IGNvbHVtbl9rbyDihpIgY29sdW1uIOKGkiBjb2x1bW5fZW4g4oaSIGNvbHVtbl9qcFxuICpcbiAqIEBleGFtcGxlXG4gKiBsb2NhbGl6ZWRDb2x1bW4odGFnLCBcIm5hbWVcIilcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvY2FsaXplZENvbHVtbjxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIEsgZXh0ZW5kcyBMb2NhbGl6ZWRCYXNlQ29sdW1uPFQ+PihcbiAgcm93OiBULFxuICBjb2x1bW46IEssXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBsb2NhbGUgPSBnZXRDdXJyZW50TG9jYWxlKCk7XG4gIGNvbnN0IG90aGVyTG9jYWxlcyA9IFNVUFBPUlRFRF9MT0NBTEVTLmZpbHRlcigobDogc3RyaW5nKSA9PiBsICE9PSBsb2NhbGUgJiYgbCAhPT0gREVGQVVMVF9MT0NBTEUpO1xuICBjb25zdCBsb2NhbGl6ZWRLZXkgPSAoY29sdW1uOiBLLCBsb2NhbGU6ICh0eXBlb2YgU1VQUE9SVEVEX0xPQ0FMRVMpW251bWJlcl0pID0+IFxcYFxcJHtjb2x1bW59X1xcJHtsb2NhbGV9XFxgO1xuICBjb25zdCBrZXlzID0gW1xuICAgIGxvY2FsaXplZEtleShjb2x1bW4sIGxvY2FsZSksXG4gICAgY29sdW1uLFxuICAgIGxvY2FsaXplZEtleShjb2x1bW4sIERFRkFVTFRfTE9DQUxFKSxcbiAgICAuLi5vdGhlckxvY2FsZXMubWFwKChsKSA9PiBsb2NhbGl6ZWRLZXkoY29sdW1uLCBsKSksXG4gIF07XG5cbiAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgIGlmICghKGtleSBpbiByb3cpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAocm93W2tleV0gIT09IG51bGwgJiYgcm93W2tleV0gIT09IHVuZGVmaW5lZCAmJiByb3dba2V5XSAhPT0gXCJcIikge1xuICAgICAgcmV0dXJuIFN0cmluZyhyb3dba2V5XSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBFbnVt7J2YIGxvY2FsaXplZCBsYWJlbHPrpbwgUHJveHnroZwg67CY7ZmY7ZWp64uI64ukLlxuICogU2VsZWN0IOy7tO2PrOuEjO2KuCDrk7Hsl5DshJwgRW51bUxhYmVsW2tleV0g64yA7IugIOyCrOyaqe2VqeuLiOuLpC5cbiAqXG4gKiBAZXhhbXBsZVxuICogU0QuZW51bUxhYmVscyhcIlRhZ09yZGVyQnlcIilba2V5XSAgLy8g4oaSIO2YhOyerCBsb2NhbGXsnZgg652867KoXG4gKi9cblNELmVudW1MYWJlbHMgPSAoZW51bU5hbWU6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIExvY2FsaXplZFN0cmluZz4gPT4ge1xuICByZXR1cm4gbmV3IFByb3h5KHt9IGFzIFJlY29yZDxzdHJpbmcsIExvY2FsaXplZFN0cmluZz4sIHtcbiAgICBnZXQoXywga2V5OiBzdHJpbmcpIHtcbiAgICAgIGNvbnN0IGRpY3RLZXkgPSBcXGBlbnVtLlxcJHtlbnVtTmFtZX0uXFwke2tleX1cXGAgYXMgRGljdEtleTtcbiAgICAgIHJldHVybiBnZXREaWN0VmFsdWUoZGljdEtleSwgZ2V0Q3VycmVudExvY2FsZSgpKTtcbiAgICB9XG4gIH0pO1xufTtcbmAudHJpbSgpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnRoaXMuZ2V0VGFyZ2V0QW5kUGF0aCh1bmRlZmluZWQsIHRhcmdldCksXG4gICAgICBib2R5LFxuICAgICAgaW1wb3J0S2V5czogW10sXG4gICAgICBjdXN0b21IZWFkZXJzOiBbXCIvKipcIiwgXCIgKiBAZ2VuZXJhdGVkXCIsIFwiICog7KeB7KCRIOyImOygle2VmOyngCDrp4jshLjsmpQuXCIsIFwiICovXCIsIFwiXCJdLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogcmVhY3QtY29tcG9uZW50c+ydmCByYy1rZXlz66W8IOy2lOy2nO2VqVxuICAgKiBzb25hbXUvc3JjL2RpY3QvcmMta2V5cy50cyDtjIzsnbzsnZgg7IaM7IqkIOy9lOuTnOulvCDsp4HsoJEg7J297Ja07IScIOuwmO2ZmFxuICAgKi9cbiAgcHJpdmF0ZSBleHRyYWN0UkNLZXlzU291cmNlQ29kZSgpOiB7IGtvOiBzdHJpbmc7IGVuOiBzdHJpbmcgfSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIHJjLWtleXMudHMg7YyM7J28IOqyveuhnFxuICAgICAgY29uc3QgX19maWxlbmFtZSA9IGZpbGVVUkxUb1BhdGgoaW1wb3J0Lm1ldGEudXJsKTtcbiAgICAgIGNvbnN0IF9fZGlybmFtZSA9IHBhdGguZGlybmFtZShfX2ZpbGVuYW1lKTtcblxuICAgICAgLy8gZGlzdOyXkOyEnCDsi6TtlonrkKAg65WM64qUIHNyY+uhnCDqsr3roZwg67OA6rK9XG4gICAgICBjb25zdCBiYXNlUGF0aCA9IF9fZGlybmFtZS5pbmNsdWRlcyhcIi9kaXN0L1wiKVxuICAgICAgICA/IF9fZGlybmFtZS5yZXBsYWNlKFwiL2Rpc3QvXCIsIFwiL3NyYy9cIilcbiAgICAgICAgOiBfX2Rpcm5hbWU7XG5cbiAgICAgIGNvbnN0IHJjS2V5c1BhdGggPSBwYXRoLmpvaW4oYmFzZVBhdGgsIFwiLi4vLi4vZGljdC9yYy1rZXlzLnRzXCIpO1xuXG4gICAgICAvLyDtjIzsnbwg7J296riwXG4gICAgICBjb25zdCBzb3VyY2VDb2RlID0gZnMucmVhZEZpbGVTeW5jKHJjS2V5c1BhdGgsIFwidXRmLThcIik7XG5cbiAgICAgIC8vIHJjS2V5c0tvIOy2lOy2nCAo7KSR6rSE7Zi4IOy5tOyatO2MhSDrsKnsi50pXG4gICAgICBjb25zdCBrb0NvZGUgPSBleHRyYWN0T2JqZWN0RGVjbGFyYXRpb24oc291cmNlQ29kZSwgXCJyY0tleXNLb1wiKTtcblxuICAgICAgLy8gcmNLZXlzRW4g7LaU7LacICjspJHqtITtmLgg7Lm07Jq07YyFIOuwqeyLnSlcbiAgICAgIGNvbnN0IGVuQ29kZSA9IGV4dHJhY3RPYmplY3REZWNsYXJhdGlvbihzb3VyY2VDb2RlLCBcInJjS2V5c0VuXCIpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBrbzoga29Db2RlLnJlcGxhY2UoL15leHBvcnQgLywgXCJcIiksXG4gICAgICAgIGVuOiBlbkNvZGUucmVwbGFjZSgvXmV4cG9ydCAvLCBcIlwiKS5yZXBsYWNlKC8gc2F0aXNmaWVzIFJDS2V5cy8sIFwiIGFzIGNvbnN0XCIpLFxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gcmMta2V5cyDtjIzsnbzsnbQg7JeG64qUIOqyveyasCDruYgg7L2U65OcIOuwmO2ZmFxuICAgICAgY29uc29sZS53YXJuKFwiRmFpbGVkIHRvIGxvYWQgcmMta2V5cyBzb3VyY2U6XCIsIGVycm9yKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGtvOiBcImNvbnN0IHJjS2V5c0tvID0ge30gYXMgY29uc3Q7XCIsXG4gICAgICAgIGVuOiBcImNvbnN0IHJjS2V5c0VuID0ge30gYXMgY29uc3Q7XCIsXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDrqqjrk6AgZW50aXR5Lmpzb27sl5DshJwgZW50aXR5IGxhYmVscyDstpTstpxcbiAgICogZW50aXR5Lmpzb27sl5DshJwg7KeB7KCRIOq0gOumrOuQmOuKlCDqsJLrp4wg7Y+s7ZWoICjsnpDrj5kg7IOd7ISxIOqwkiDsoJzsmbgpXG4gICAqIC0gZW50aXR5LntlbnRpdHlJZH06IGVudGl0eSB0aXRsZVxuICAgKiAtIGVudGl0eS57ZW50aXR5SWR9Lntwcm9wTmFtZX06IHByb3AgZGVzY1xuICAgKiAtIGVudW0ue0VudW1JZH0ue3ZhbHVlfTogZW51bSBsYWJlbFxuICAgKi9cbiAgcHJpdmF0ZSBleHRyYWN0RW50aXR5TGFiZWxzKCk6IHsga2V5OiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfVtdIHtcbiAgICBjb25zdCBsYWJlbHM6IHsga2V5OiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfVtdID0gW107XG5cbiAgICBpZiAoIUVudGl0eU1hbmFnZXIuaXNBdXRvbG9hZGVkKSB7XG4gICAgICByZXR1cm4gbGFiZWxzO1xuICAgIH1cblxuICAgIGNvbnN0IGVudGl0eUlkcyA9IEVudGl0eU1hbmFnZXIuZ2V0QWxsSWRzKCk7XG5cbiAgICBmb3IgKGNvbnN0IGVudGl0eUlkIG9mIGVudGl0eUlkcykge1xuICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuXG4gICAgICAvLyBlbnRpdHkgdGl0bGUgKGVudGl0eS5qc29u7JeQ7IScIOq0gOumrClcbiAgICAgIGxhYmVscy5wdXNoKHsga2V5OiBgZW50aXR5LiR7ZW50aXR5SWR9YCwgdmFsdWU6IGVudGl0eS50aXRsZSB9KTtcblxuICAgICAgLy8gcHJvcCBsYWJlbHMgKGVudGl0eS5qc29u7JeQ7IScIOq0gOumrClcbiAgICAgIGZvciAoY29uc3QgcHJvcCBvZiBlbnRpdHkucHJvcHMpIHtcbiAgICAgICAgaWYgKHByb3AuZGVzYykge1xuICAgICAgICAgIGxhYmVscy5wdXNoKHsga2V5OiBgZW50aXR5LiR7ZW50aXR5SWR9LiR7cHJvcC5uYW1lfWAsIHZhbHVlOiBwcm9wLmRlc2MgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gZW51bSBsYWJlbHMgKGVudGl0eS5qc29u7JeQ7IScIOq0gOumrClcbiAgICAgIGZvciAoY29uc3QgW2VudW1JZCwgZW51bUxhYmVsc01hcF0gb2YgT2JqZWN0LmVudHJpZXMoZW50aXR5LmVudW1MYWJlbHMpKSB7XG4gICAgICAgIGZvciAoY29uc3QgW3ZhbHVlLCBsYWJlbF0gb2YgT2JqZWN0LmVudHJpZXMoZW51bUxhYmVsc01hcCkpIHtcbiAgICAgICAgICBsYWJlbHMucHVzaCh7IGtleTogYGVudW0uJHtlbnVtSWR9LiR7dmFsdWV9YCwgdmFsdWU6IGxhYmVsIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGxhYmVscztcbiAgfVxuXG4gIC8qKlxuICAgKiBlbnRpdHlMYWJlbHPrpbwgVHlwZVNjcmlwdCDsvZTrk5zroZwg67OA7ZmYXG4gICAqL1xuICBwcml2YXRlIGdlbmVyYXRlRW50aXR5TGFiZWxzQ29kZShsYWJlbHM6IHsga2V5OiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfVtdKTogc3RyaW5nIHtcbiAgICBpZiAobGFiZWxzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFwiY29uc3QgZW50aXR5TGFiZWxzID0ge30gYXMgY29uc3Q7XCI7XG4gICAgfVxuXG4gICAgY29uc3QgZW50cmllcyA9IGxhYmVscy5tYXAoKHsga2V5LCB2YWx1ZSB9KSA9PiBgICBcIiR7a2V5fVwiOiBcIiR7dGhpcy5lc2NhcGVTdHJpbmcodmFsdWUpfVwiLGApO1xuXG4gICAgcmV0dXJuIGBjb25zdCBlbnRpdHlMYWJlbHMgPSB7XG4ke2VudHJpZXMuam9pbihcIlxcblwiKX1cbn0gYXMgY29uc3Q7YDtcbiAgfVxuXG4gIHByaXZhdGUgZXNjYXBlU3RyaW5nKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoL1xcXFwvZywgXCJcXFxcXFxcXFwiKS5yZXBsYWNlKC9cIi9nLCAnXFxcXFwiJykucmVwbGFjZSgvXFxuL2csIFwiXFxcXG5cIik7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O2FBSTBDO3FCQUNrQjtjQUdOO2VB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
372
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2QudGVtcGxhdGUuanMiLCJuYW1lcyI6WyJsYWJlbHM6IHsga2V5OiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfVtdIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3RlbXBsYXRlL2ltcGxlbWVudGF0aW9ucy9zZC50ZW1wbGF0ZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZnMgZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IGZpbGVVUkxUb1BhdGggfSBmcm9tIFwibm9kZTp1cmxcIjtcblxuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uLy4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyB0eXBlIEVudGl0eU5hbWVzUmVjb3JkIH0gZnJvbSBcIi4uLy4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiO1xuaW1wb3J0IHsgdHlwZSBUZW1wbGF0ZU9wdGlvbnMgfSBmcm9tIFwiLi4vLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IGV4dHJhY3RPYmplY3REZWNsYXJhdGlvbiB9IGZyb20gXCIuLi9oZWxwZXJzXCI7XG5pbXBvcnQgeyBUZW1wbGF0ZSB9IGZyb20gXCIuLi90ZW1wbGF0ZVwiO1xuXG4vKipcbiAqIFNvbmFtdSBEaWN0aW9uYXJ5IChTRCkg7YWc7ZSM66a/XG4gKiBpMThu7J2EIOychO2VnCBzZC5nZW5lcmF0ZWQudHMg7YyM7J287J2EIOyDneyEse2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGNsYXNzIFRlbXBsYXRlX19zZCBleHRlbmRzIFRlbXBsYXRlIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoXCJzZFwiKTtcbiAgfVxuXG4gIGdldFRhcmdldEFuZFBhdGgoX25hbWVzPzogRW50aXR5TmFtZXNSZWNvcmQsIHNkVGFyZ2V0PzogXCJhcGlcIiB8IFwid2ViXCIgfCBcImFwcFwiKSB7XG4gICAgY29uc3QgdGFyZ2V0ID0gc2RUYXJnZXQgPz8gXCJhcGlcIjtcbiAgICAvLyBhcGkuZGly7J2AIOyDgeuMgCDqsr3roZwoXCJhcGlcIinsnbTrr4DroZwsIHdlYi9hcHDrj4Qg7IOB64yAIOqyveuhnOuhnCDrp57stqRcbiAgICBjb25zdCBkaXIgPSB0YXJnZXQgPT09IFwiYXBpXCIgPyBTb25hbXUuY29uZmlnLmFwaS5kaXIgOiB0YXJnZXQ7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdGFyZ2V0OiBgJHtkaXJ9L3NyYy9pMThuYCxcbiAgICAgIHBhdGg6IFwic2QuZ2VuZXJhdGVkLnRzXCIsXG4gICAgfTtcbiAgfVxuXG4gIHJlbmRlcihvcHRpb25zOiBUZW1wbGF0ZU9wdGlvbnNbXCJzZFwiXSkge1xuICAgIGNvbnN0IHsgdGFyZ2V0IH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IGkxOG5Db25maWcgPSBTb25hbXUuY29uZmlnLmkxOG47XG5cbiAgICBjb25zdCB7IGRlZmF1bHRMb2NhbGUsIHN1cHBvcnRlZExvY2FsZXMgfSA9IGkxOG5Db25maWc7XG5cbiAgICAvLyBlbnRpdHkuanNvbuyXkOyEnCBlbnRpdHkgbGFiZWxzIOy2lOy2nFxuICAgIGNvbnN0IGVudGl0eUxhYmVscyA9IHRoaXMuZXh0cmFjdEVudGl0eUxhYmVscygpO1xuXG4gICAgLy8gcmMta2V5cyDshozsiqQg7L2U65OcIOy2lOy2nFxuICAgIGNvbnN0IHJjS2V5c1NvdXJjZUNvZGUgPSB0aGlzLmV4dHJhY3RSQ0tleXNTb3VyY2VDb2RlKCk7XG5cbiAgICAvLyDtlIzrnqvtj7zrs4QgbG9jYWxlIOq0gOumrCDsvZTrk5xcbiAgICBjb25zdCBsb2NhbGVNYW5hZ2VtZW50Q29kZSA9XG4gICAgICB0YXJnZXQgPT09IFwiYXBpXCJcbiAgICAgICAgPyBgXG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwic29uYW11XCI7XG5cbmNvbnN0IERFRkFVTFRfTE9DQUxFID0gXCIke2RlZmF1bHRMb2NhbGV9XCIgYXMgY29uc3Q7XG5jb25zdCBTVVBQT1JURURfTE9DQUxFUyA9ICR7SlNPTi5zdHJpbmdpZnkoc3VwcG9ydGVkTG9jYWxlcyl9IGFzIGNvbnN0O1xuZnVuY3Rpb24gZ2V0Q3VycmVudExvY2FsZSgpOiAodHlwZW9mIFNVUFBPUlRFRF9MT0NBTEVTKVtudW1iZXJdIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBjdHggPSBTb25hbXUuZ2V0Q29udGV4dCgpO1xuICAgIHJldHVybiBjdHgubG9jYWxlIGFzICh0eXBlb2YgU1VQUE9SVEVEX0xPQ0FMRVMpW251bWJlcl0gPz8gREVGQVVMVF9MT0NBTEU7XG4gIH0gY2F0Y2ggKF8pIHtcbiAgICByZXR1cm4gREVGQVVMVF9MT0NBTEU7XG4gIH1cbn1cbmAudHJpbSgpXG4gICAgICAgIDogYFxuY29uc3QgREVGQVVMVF9MT0NBTEUgPSBcIiR7ZGVmYXVsdExvY2FsZX1cIiBhcyBjb25zdDtcbmV4cG9ydCBjb25zdCBTVVBQT1JURURfTE9DQUxFUyA9ICR7SlNPTi5zdHJpbmdpZnkoc3VwcG9ydGVkTG9jYWxlcyl9IGFzIGNvbnN0O1xubGV0IF9jdXJyZW50TG9jYWxlOiAodHlwZW9mIFNVUFBPUlRFRF9MT0NBTEVTKVtudW1iZXJdID0gREVGQVVMVF9MT0NBTEU7XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRMb2NhbGUobG9jYWxlOiAodHlwZW9mIFNVUFBPUlRFRF9MT0NBTEVTKVtudW1iZXJdKSB7XG4gIF9jdXJyZW50TG9jYWxlID0gbG9jYWxlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q3VycmVudExvY2FsZSgpOiAodHlwZW9mIFNVUFBPUlRFRF9MT0NBTEVTKVtudW1iZXJdIHtcbiAgcmV0dXJuIF9jdXJyZW50TG9jYWxlO1xufVxuYC50cmltKCk7XG5cbiAgICAvLyBsb2NhbGUgaW1wb3J0XG4gICAgY29uc3QgbG9jYWxlSW1wb3J0cyA9IHN1cHBvcnRlZExvY2FsZXNcbiAgICAgIC5tYXAoKGxvY2FsZSkgPT4gYGltcG9ydCAke2xvY2FsZX0gZnJvbSBcIi4vJHtsb2NhbGV9XCI7YClcbiAgICAgIC5qb2luKFwiXFxuXCIpO1xuXG4gICAgLy8gZW50aXR5TGFiZWxz66W8IOy9lOuTnOuhnCDrs4DtmZhcbiAgICBjb25zdCBlbnRpdHlMYWJlbHNDb2RlID0gdGhpcy5nZW5lcmF0ZUVudGl0eUxhYmVsc0NvZGUoZW50aXR5TGFiZWxzKTtcblxuICAgIC8vIGxvY2FsZeuzhCByY0tleXMg67OA7IiY66qFIOunpO2VkVxuICAgIGNvbnN0IGdldFJDS2V5c1Zhck5hbWUgPSAobG9jYWxlOiBzdHJpbmcpID0+IHtcbiAgICAgIC8vIHN1cHBvcnRlZExvY2FsZXPsl5Ag7Y+s7ZWo65CcIGxvY2FsZeunjCDtlbTri7kg67OA7IiYIOuwmO2ZmFxuICAgICAgaWYgKGxvY2FsZSA9PT0gXCJrb1wiICYmIHN1cHBvcnRlZExvY2FsZXMuaW5jbHVkZXMoXCJrb1wiKSkgcmV0dXJuIFwicmNLZXlzS29cIjtcbiAgICAgIGlmIChsb2NhbGUgPT09IFwiZW5cIiAmJiBzdXBwb3J0ZWRMb2NhbGVzLmluY2x1ZGVzKFwiZW5cIikpIHJldHVybiBcInJjS2V5c0VuXCI7XG4gICAgICAvLyBmYWxsYmFjazogZGVmYXVsdExvY2FsZeydmCByY0tleXNcbiAgICAgIGlmIChsb2NhbGUgIT09IGRlZmF1bHRMb2NhbGUpIHtcbiAgICAgICAgcmV0dXJuIGdldFJDS2V5c1Zhck5hbWUoZGVmYXVsdExvY2FsZSk7XG4gICAgICB9XG4gICAgICAvLyBkZWZhdWx0TG9jYWxl7KGw7LCoIOyXhuuKlCDqsr3smrAgZW7snYQgZmFsbGJhY2vsnLzroZwg7IKs7JqpXG4gICAgICByZXR1cm4gXCJyY0tleXNFblwiO1xuICAgIH07XG5cbiAgICBjb25zdCBib2R5ID0gYFxuJHtsb2NhbGVNYW5hZ2VtZW50Q29kZX1cblxuJHtsb2NhbGVJbXBvcnRzfVxuXG4vLyByZWFjdC1jb21wb25lbnRzIGkxOG4ga2V5c1xuJHtzdXBwb3J0ZWRMb2NhbGVzLmluY2x1ZGVzKFwia29cIikgPyByY0tleXNTb3VyY2VDb2RlLmtvIDogXCJcIn1cblxuJHtzdXBwb3J0ZWRMb2NhbGVzLmluY2x1ZGVzKFwiZW5cIikgPyByY0tleXNTb3VyY2VDb2RlLmVuIDogXCJcIn1cblxuLy8gZW50aXR5Lmpzb27sl5DshJwg7LaU7Lac7ZWcIGVudGl0eSBsYWJlbHMgKGRlZmF1bHRMb2NhbGUg7KCE7JqpKVxuJHtlbnRpdHlMYWJlbHNDb2RlfVxuXG4vLyBkZWZhdWx0TG9jYWxl7J2YIGRpY3Rpb25hcnnrpbwg6riw7KSA7Jy866GcIO2CpCDstpTstpxcbnR5cGUgUkNLZXlzID0gdHlwZW9mICR7Z2V0UkNLZXlzVmFyTmFtZShkZWZhdWx0TG9jYWxlKX07XG50eXBlIFByb2plY3REaWN0aW9uYXJ5ID0gdHlwZW9mICR7ZGVmYXVsdExvY2FsZX07XG50eXBlIEVudGl0eUxhYmVscyA9IHR5cGVvZiBlbnRpdHlMYWJlbHM7XG50eXBlIFJhd01lcmdlZERpY3Rpb25hcnkgPSBSQ0tleXMgJiBPbWl0PEVudGl0eUxhYmVscywga2V5b2YgKFJDS2V5cyAmIFByb2plY3REaWN0aW9uYXJ5KT4gJiBQcm9qZWN0RGljdGlvbmFyeTtcblxuLy8g7YKk64qUIOycoOyngO2VmOuQmCwg6rCSIO2DgOyeheydgCBzdHJpbmcg65iQ64qUIO2VqOyImOuhnCDsnbzrsJjtmZQgKOuLpOuluCBsb2NhbGXsnZgg66as7YSw65+0IO2DgOyehSDstqnrj4wg67Cp7KeAKVxuZXhwb3J0IHR5cGUgTWVyZ2VkRGljdGlvbmFyeSA9IHtcbiAgW0sgaW4ga2V5b2YgUmF3TWVyZ2VkRGljdGlvbmFyeV06IFJhd01lcmdlZERpY3Rpb25hcnlbS10gZXh0ZW5kcyAoLi4uYXJnczogaW5mZXIgUCkgPT4gc3RyaW5nXG4gICAgPyAoLi4uYXJnczogUCkgPT4gc3RyaW5nXG4gICAgOiBzdHJpbmc7XG59O1xuZXhwb3J0IHR5cGUgRGljdEtleSA9IGtleW9mIE1lcmdlZERpY3Rpb25hcnk7XG5leHBvcnQgdHlwZSBMb2NhbGl6ZWRTdHJpbmcgPSBzdHJpbmcgJiB7IF9fYnJhbmQ6IFwiTG9jYWxpemVkU3RyaW5nXCIgfTtcblxuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZUxvY2FsZShkaWN0OiBQYXJ0aWFsPE1lcmdlZERpY3Rpb25hcnk+KSB7XG4gIHJldHVybiBkaWN0O1xufVxuXG4vLyDqsIEgbG9jYWxl67OE66GcIHJjLWtleXMgKyBlbnRpdHkgbGFiZWxzICsg7ZSE66Gc7KCd7Yq4IGRpY3Qg7ZWp7LmoXG5jb25zdCBkaWN0aW9uYXJpZXM6IFJlY29yZDxzdHJpbmcsIFBhcnRpYWw8TWVyZ2VkRGljdGlvbmFyeT4+ID0ge1xuICAke2RlZmF1bHRMb2NhbGV9OiB7IC4uLiR7Z2V0UkNLZXlzVmFyTmFtZShkZWZhdWx0TG9jYWxlKX0sIC4uLmVudGl0eUxhYmVscywgLi4uJHtkZWZhdWx0TG9jYWxlfSB9LFxuICAke3N1cHBvcnRlZExvY2FsZXNcbiAgICAuZmlsdGVyKChsb2NhbGUpID0+IGxvY2FsZSAhPT0gZGVmYXVsdExvY2FsZSlcbiAgICAubWFwKChsb2NhbGUpID0+IGAgICR7bG9jYWxlfTogeyAuLi4ke2dldFJDS2V5c1Zhck5hbWUobG9jYWxlKX0sIC4uLiR7bG9jYWxlfSB9LGApXG4gICAgLmpvaW4oXCJcXG5cIil9XG59O1xuXG50eXBlIFNEUmV0dXJuVHlwZTxLIGV4dGVuZHMgRGljdEtleT4gPSBNZXJnZWREaWN0aW9uYXJ5W0tdIGV4dGVuZHMgKC4uLmFyZ3M6IGluZmVyIFApID0+IHN0cmluZ1xuICA/ICguLi5hcmdzOiBQKSA9PiBMb2NhbGl6ZWRTdHJpbmdcbiAgOiBMb2NhbGl6ZWRTdHJpbmc7XG5cbmZ1bmN0aW9uIGdldERpY3RWYWx1ZTxLIGV4dGVuZHMgRGljdEtleT4oa2V5OiBLLCBsb2NhbGU6IHN0cmluZyk6IFNEUmV0dXJuVHlwZTxLPiB7XG4gIC8vIDEuIOyngOygleuQnCBsb2NhbGXsl5DshJwg7KGw7ZqMXG4gIGNvbnN0IGRpY3QgPSBkaWN0aW9uYXJpZXNbbG9jYWxlXTtcbiAgaWYgKGRpY3Q/LltrZXldICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gZGljdFtrZXldIGFzIHVua25vd24gYXMgU0RSZXR1cm5UeXBlPEs+O1xuICB9XG5cbiAgLy8gMi4gZGVmYXVsdCBsb2NhbGXsl5DshJwg7KGw7ZqMXG4gIGlmIChsb2NhbGUgIT09IERFRkFVTFRfTE9DQUxFICYmIGRpY3Rpb25hcmllc1tERUZBVUxUX0xPQ0FMRV0/LltrZXldICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gZGljdGlvbmFyaWVzW0RFRkFVTFRfTE9DQUxFXVtrZXldIGFzIHVua25vd24gYXMgU0RSZXR1cm5UeXBlPEs+O1xuICB9XG5cbiAgLy8gMy4gc3VwcG9ydGVkIGxvY2FsZXMg7Iic7ZqMXG4gIGZvciAoY29uc3Qgc3VwcG9ydGVkTG9jYWxlIG9mIFNVUFBPUlRFRF9MT0NBTEVTKSB7XG4gICAgaWYgKHN1cHBvcnRlZExvY2FsZSAhPT0gbG9jYWxlICYmIHN1cHBvcnRlZExvY2FsZSAhPT0gREVGQVVMVF9MT0NBTEUpIHtcbiAgICAgIGlmIChkaWN0aW9uYXJpZXNbc3VwcG9ydGVkTG9jYWxlXT8uW2tleV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gZGljdGlvbmFyaWVzW3N1cHBvcnRlZExvY2FsZV1ba2V5XSBhcyB1bmtub3duIGFzIFNEUmV0dXJuVHlwZTxLPjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyA0LiDrqqjrkZAg7Iuk7YyoIOyLnCBrZXkg67CY7ZmYXG4gIHJldHVybiBrZXkgYXMgdW5rbm93biBhcyBTRFJldHVyblR5cGU8Sz47XG59XG5cbi8qKlxuICogU29uYW11IERpY3Rpb25hcnkg7ZWo7IiYXG4gKiBsb2NhbGXsl5Ag66ee64qUIOuyiOyXrSDthY3siqTtirjrpbwg67CY7ZmY7ZWp64uI64ukLlxuICpcbiAqIEBleGFtcGxlXG4gKiBTRChcImNvbW1vbi5zYXZlXCIpICAvLyDihpIgXCLsoIDsnqVcIiAoTG9jYWxpemVkU3RyaW5nKVxuICogU0QoXCJ1c2VyLm5vdEZvdW5kXCIpKDEpICAvLyDihpIgXCLsobTsnqztlZjsp4Ag7JWK64qUIFVzZXIgSUQgMVwiIChMb2NhbGl6ZWRTdHJpbmcpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBTRDxLIGV4dGVuZHMgRGljdEtleT4oa2V5OiBLKTogU0RSZXR1cm5UeXBlPEs+IHtcbiAgY29uc3QgbG9jYWxlID0gZ2V0Q3VycmVudExvY2FsZSgpO1xuICByZXR1cm4gZ2V0RGljdFZhbHVlKGtleSwgbG9jYWxlKTtcbn1cblxuLyoqXG4gKiDtirnsoJUgbG9jYWxl7J2YIOuyiOyXrSDthY3siqTtirjrpbwg67CY7ZmY7ZWY64qUIO2VqOyImOulvCDsg53shLHtlanri4jri6QuXG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IEVOID0gU0QubG9jYWxlKFwiZW5cIik7XG4gKiBFTihcImNvbW1vbi5zYXZlXCIpICAvLyDihpIgXCJTYXZlXCJcbiAqL1xuU0QubG9jYWxlID0gKGxvY2FsZTogKHR5cGVvZiBTVVBQT1JURURfTE9DQUxFUylbbnVtYmVyXSkgPT4gPEsgZXh0ZW5kcyBEaWN0S2V5PihrZXk6IEspOiBTRFJldHVyblR5cGU8Sz4gPT4ge1xuICByZXR1cm4gZ2V0RGljdFZhbHVlKGtleSwgbG9jYWxlKTtcbn07XG5cbi8vIExvY2FsaXplZCDqsIDriqXtlZwgQ29sdW1uIO2DgOyehSDqs4TsgrBcbnR5cGUgTG9jYWxpemVkQmFzZUNvbHVtbjxUPiA9IHtcbiAgW0sgaW4ga2V5b2YgVCAmIHN0cmluZ106IEsgZXh0ZW5kcyBcXGBcXCR7aW5mZXIgQmFzZX1fXFwkeyh0eXBlb2YgU1VQUE9SVEVEX0xPQ0FMRVMpW251bWJlcl19XFxgID8gQmFzZSA6IEs7XG59W2tleW9mIFQgJiBzdHJpbmddO1xuXG4vKipcbiAqIGxvY2FsZeyXkCDrlLDrnbwg7KCB7KCI7ZWcIOy7rOufvCDqsJLsnYQg67CY7ZmY7ZWp64uI64ukLlxuICogRELsl5AgbmFtZSwgbmFtZV9rbywgbmFtZV9lbuyymOufvCBsb2NhbGl6ZWQgY29sdW1u7J20IOyeiOydhCDrlYwg7IKs7Jqp7ZWp64uI64ukLlxuICpcbiAqIOyasOyEoOyInOychCAo7KeA7JuQIOuhnOy8gOydvOydgCBrby9qcC9lbuydtOqzoCwg7ISc67mE7Iqk7J2YIOq4sOuzuCDroZzsvIDsnbzsnYAga28sIOyCrOyaqeyekOydmCDroZzsvIDsnbzsnYAganDsnbwg65WMKTogY29sdW1uX2pwIOKGkiBjb2x1bW4g4oaSIGNvbHVtbl9rbyDihpIgY29sdW1uX2VuXG4gKiDsmrDshKDsiJzsnIQgKOyngOybkCDroZzsvIDsnbzsnYAga28vanAvZW7snbTqs6AsIOyEnOu5hOyKpOydmCDquLDrs7gg66Gc7LyA7J287J2AIGVuLCDsgqzsmqnsnpDsnZgg66Gc7LyA7J287J2AIGtv7J28IOuVjCk6IGNvbHVtbl9rbyDihpIgY29sdW1uIOKGkiBjb2x1bW5fZW4g4oaSIGNvbHVtbl9qcFxuICpcbiAqIEBleGFtcGxlXG4gKiBsb2NhbGl6ZWRDb2x1bW4odGFnLCBcIm5hbWVcIilcbiAqL1xudHlwZSBMb2NhbGl6ZWRDb2x1bW5TY2FsYXJWYWx1ZSA9IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBiaWdpbnQ7XG50eXBlIExvY2FsaXplZENvbHVtblZhbHVlID0gc3RyaW5nIHwgc3RyaW5nW107XG50eXBlIE5lc3RlZExvY2FsaXplZENvbHVtblZhbHVlRnJvbTxWPiA9IFYgZXh0ZW5kcyBzdHJpbmdcbiAgPyBzdHJpbmdcbiAgOiBWIGV4dGVuZHMgcmVhZG9ubHkgc3RyaW5nW11cbiAgICA/IHN0cmluZ1tdXG4gICAgOiBuZXZlcjtcbnR5cGUgTG9jYWxpemVkQ29sdW1uVmFsdWVGcm9tPFY+ID0gViBleHRlbmRzIHN0cmluZ1xuICA/IHN0cmluZ1xuICA6IFYgZXh0ZW5kcyByZWFkb25seSBzdHJpbmdbXVxuICAgID8gc3RyaW5nW11cbiAgICA6IFYgZXh0ZW5kcyBudW1iZXIgfCBib29sZWFuIHwgYmlnaW50XG4gICAgICA/IHN0cmluZ1xuICAgICAgOiBWIGV4dGVuZHMgUGFydGlhbDxSZWNvcmQ8KHR5cGVvZiBTVVBQT1JURURfTE9DQUxFUylbbnVtYmVyXSwgaW5mZXIgTFY+PlxuICAgICAgICA/IE5lc3RlZExvY2FsaXplZENvbHVtblZhbHVlRnJvbTxMVj5cbiAgICAgIDogbmV2ZXI7XG50eXBlIExvY2FsaXplZENvbHVtbkNhbmRpZGF0ZTxULCBLIGV4dGVuZHMgc3RyaW5nPiA9XG4gIHwgKEsgZXh0ZW5kcyBrZXlvZiBUID8gVFtLXSA6IG5ldmVyKVxuICB8IHtcbiAgICAgIFtMIGluICh0eXBlb2YgU1VQUE9SVEVEX0xPQ0FMRVMpW251bWJlcl1dOiBcXGBcXCR7S31fXFwke0x9XFxgIGV4dGVuZHMga2V5b2YgVCA/IFRbXFxgXFwke0t9X1xcJHtMfVxcYF0gOiBuZXZlcjtcbiAgICB9Wyh0eXBlb2YgU1VQUE9SVEVEX0xPQ0FMRVMpW251bWJlcl1dO1xudHlwZSBMb2NhbGl6ZWRDb2x1bW5SZXR1cm48VCwgSyBleHRlbmRzIHN0cmluZz4gPVxuICB8IExvY2FsaXplZENvbHVtblZhbHVlRnJvbTxMb2NhbGl6ZWRDb2x1bW5DYW5kaWRhdGU8VCwgSz4+XG4gIHwgdW5kZWZpbmVkO1xudHlwZSBMb2NhbGVWYWx1ZU1hcCA9IFBhcnRpYWw8UmVjb3JkPCh0eXBlb2YgU1VQUE9SVEVEX0xPQ0FMRVMpW251bWJlcl0sIHVua25vd24+PjtcblxuZnVuY3Rpb24gaXNMb2NhbGl6ZWRDb2x1bW5WYWx1ZSh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIExvY2FsaXplZENvbHVtblZhbHVlIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fCAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUuZXZlcnkoKGl0ZW0pID0+IHR5cGVvZiBpdGVtID09PSBcInN0cmluZ1wiKSk7XG59XG5cbmZ1bmN0aW9uIGlzTG9jYWxpemVkQ29sdW1uU2NhbGFyVmFsdWUodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBMb2NhbGl6ZWRDb2x1bW5TY2FsYXJWYWx1ZSB7XG4gIHJldHVybiBbXCJzdHJpbmdcIiwgXCJudW1iZXJcIiwgXCJib29sZWFuXCIsIFwiYmlnaW50XCJdLmluY2x1ZGVzKHR5cGVvZiB2YWx1ZSk7XG59XG5cbmZ1bmN0aW9uIGlzRW1wdHlMb2NhbGl6ZWRDb2x1bW5WYWx1ZSh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIG51bGwgfCB1bmRlZmluZWQgfCBcIlwiIHtcbiAgcmV0dXJuIHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IFwiXCI7XG59XG5cbmZ1bmN0aW9uIGdldE5lc3RlZExvY2FsZVZhbHVlPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgSyBleHRlbmRzIExvY2FsaXplZEJhc2VDb2x1bW48VD4+KFxuICByb3c6IFQsXG4gIGNvbHVtbjogSyxcbiAgbG9jYWxlOiAodHlwZW9mIFNVUFBPUlRFRF9MT0NBTEVTKVtudW1iZXJdLFxuKTogdW5rbm93biB7XG4gIGNvbnN0IGNvbHVtblZhbHVlID0gcm93W2NvbHVtbl07XG4gIGlmIChjb2x1bW5WYWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgY29sdW1uVmFsdWUgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShjb2x1bW5WYWx1ZSkpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcmV0dXJuIChjb2x1bW5WYWx1ZSBhcyBMb2NhbGVWYWx1ZU1hcClbbG9jYWxlXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxvY2FsaXplZENvbHVtbjxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIEsgZXh0ZW5kcyBMb2NhbGl6ZWRCYXNlQ29sdW1uPFQ+PihcbiAgcm93OiBULFxuICBjb2x1bW46IEssXG4pOiBMb2NhbGl6ZWRDb2x1bW5SZXR1cm48VCwgSz4ge1xuICBjb25zdCBjdXJyZW50TG9jYWxlID0gZ2V0Q3VycmVudExvY2FsZSgpO1xuICBjb25zdCBsb2NhbGUgPSBTVVBQT1JURURfTE9DQUxFUy5pbmNsdWRlcyhjdXJyZW50TG9jYWxlKSA/IGN1cnJlbnRMb2NhbGUgOiBERUZBVUxUX0xPQ0FMRTtcbiAgY29uc3Qgb3RoZXJMb2NhbGVzID0gU1VQUE9SVEVEX0xPQ0FMRVMuZmlsdGVyKChsOiBzdHJpbmcpID0+IGwgIT09IGxvY2FsZSAmJiBsICE9PSBERUZBVUxUX0xPQ0FMRSk7XG4gIGNvbnN0IGxvY2FsaXplZEtleSA9IChjb2x1bW46IEssIGxvY2FsZTogKHR5cGVvZiBTVVBQT1JURURfTE9DQUxFUylbbnVtYmVyXSkgPT4gXFxgXFwke2NvbHVtbn1fXFwke2xvY2FsZX1cXGA7XG4gIGNvbnN0IHZhbHVlcyA9IFtcbiAgICB7IHZhbHVlOiByb3dbbG9jYWxpemVkS2V5KGNvbHVtbiwgbG9jYWxlKV0sIHNvdXJjZTogXCJkaXJlY3RcIiB9LFxuICAgIHsgdmFsdWU6IGdldE5lc3RlZExvY2FsZVZhbHVlKHJvdywgY29sdW1uLCBsb2NhbGUpLCBzb3VyY2U6IFwibmVzdGVkXCIgfSxcbiAgICB7IHZhbHVlOiByb3dbY29sdW1uXSwgc291cmNlOiBcImRpcmVjdFwiIH0sXG4gICAgeyB2YWx1ZTogcm93W2xvY2FsaXplZEtleShjb2x1bW4sIERFRkFVTFRfTE9DQUxFKV0sIHNvdXJjZTogXCJkaXJlY3RcIiB9LFxuICAgIHsgdmFsdWU6IGdldE5lc3RlZExvY2FsZVZhbHVlKHJvdywgY29sdW1uLCBERUZBVUxUX0xPQ0FMRSksIHNvdXJjZTogXCJuZXN0ZWRcIiB9LFxuICAgIC4uLm90aGVyTG9jYWxlcy5mbGF0TWFwKChsKSA9PiBbXG4gICAgICB7IHZhbHVlOiByb3dbbG9jYWxpemVkS2V5KGNvbHVtbiwgbCldLCBzb3VyY2U6IFwiZGlyZWN0XCIgfSxcbiAgICAgIHsgdmFsdWU6IGdldE5lc3RlZExvY2FsZVZhbHVlKHJvdywgY29sdW1uLCBsKSwgc291cmNlOiBcIm5lc3RlZFwiIH0sXG4gICAgXSksXG4gIF07XG5cbiAgZm9yIChjb25zdCB7IHZhbHVlLCBzb3VyY2UgfSBvZiB2YWx1ZXMpIHtcbiAgICBpZiAoIWlzRW1wdHlMb2NhbGl6ZWRDb2x1bW5WYWx1ZSh2YWx1ZSkgJiYgaXNMb2NhbGl6ZWRDb2x1bW5WYWx1ZSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB2YWx1ZSBhcyBMb2NhbGl6ZWRDb2x1bW5SZXR1cm48VCwgSz47XG4gICAgfVxuICAgIGlmIChzb3VyY2UgPT09IFwiZGlyZWN0XCIgJiYgIWlzRW1wdHlMb2NhbGl6ZWRDb2x1bW5WYWx1ZSh2YWx1ZSkgJiYgaXNMb2NhbGl6ZWRDb2x1bW5TY2FsYXJWYWx1ZSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpIGFzIExvY2FsaXplZENvbHVtblJldHVybjxULCBLPjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEVudW3snZggbG9jYWxpemVkIGxhYmVsc+ulvCBQcm94eeuhnCDrsJjtmZjtlanri4jri6QuXG4gKiBTZWxlY3Qg7Lu07Y+s64SM7Yq4IOuTseyXkOyEnCBFbnVtTGFiZWxba2V5XSDrjIDsi6Ag7IKs7Jqp7ZWp64uI64ukLlxuICpcbiAqIEBleGFtcGxlXG4gKiBTRC5lbnVtTGFiZWxzKFwiVGFnT3JkZXJCeVwiKVtrZXldICAvLyDihpIg7ZiE7J6sIGxvY2FsZeydmCDrnbzrsqhcbiAqL1xuU0QuZW51bUxhYmVscyA9IChlbnVtTmFtZTogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgTG9jYWxpemVkU3RyaW5nPiA9PiB7XG4gIHJldHVybiBuZXcgUHJveHkoe30gYXMgUmVjb3JkPHN0cmluZywgTG9jYWxpemVkU3RyaW5nPiwge1xuICAgIGdldChfLCBrZXk6IHN0cmluZykge1xuICAgICAgY29uc3QgZGljdEtleSA9IFxcYGVudW0uXFwke2VudW1OYW1lfS5cXCR7a2V5fVxcYCBhcyBEaWN0S2V5O1xuICAgICAgcmV0dXJuIGdldERpY3RWYWx1ZShkaWN0S2V5LCBnZXRDdXJyZW50TG9jYWxlKCkpO1xuICAgIH1cbiAgfSk7XG59O1xuYC50cmltKCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4udGhpcy5nZXRUYXJnZXRBbmRQYXRoKHVuZGVmaW5lZCwgdGFyZ2V0KSxcbiAgICAgIGJvZHksXG4gICAgICBpbXBvcnRLZXlzOiBbXSxcbiAgICAgIGN1c3RvbUhlYWRlcnM6IFtcIi8qKlwiLCBcIiAqIEBnZW5lcmF0ZWRcIiwgXCIgKiDsp4HsoJEg7IiY7KCV7ZWY7KeAIOuniOyEuOyalC5cIiwgXCIgKi9cIiwgXCJcIl0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiByZWFjdC1jb21wb25lbnRz7J2YIHJjLWtleXPrpbwg7LaU7Lac7ZWpXG4gICAqIHNvbmFtdS9zcmMvZGljdC9yYy1rZXlzLnRzIO2MjOydvOydmCDshozsiqQg7L2U65Oc66W8IOyngeygkSDsnb3slrTshJwg67CY7ZmYXG4gICAqL1xuICBwcml2YXRlIGV4dHJhY3RSQ0tleXNTb3VyY2VDb2RlKCk6IHsga286IHN0cmluZzsgZW46IHN0cmluZyB9IHtcbiAgICB0cnkge1xuICAgICAgLy8gcmMta2V5cy50cyDtjIzsnbwg6rK966GcXG4gICAgICBjb25zdCBfX2ZpbGVuYW1lID0gZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpO1xuICAgICAgY29uc3QgX19kaXJuYW1lID0gcGF0aC5kaXJuYW1lKF9fZmlsZW5hbWUpO1xuXG4gICAgICAvLyBkaXN07JeQ7IScIOyLpO2WieuQoCDrlYzripQgc3Jj66GcIOqyveuhnCDrs4Dqsr1cbiAgICAgIGNvbnN0IGJhc2VQYXRoID0gX19kaXJuYW1lLmluY2x1ZGVzKFwiL2Rpc3QvXCIpXG4gICAgICAgID8gX19kaXJuYW1lLnJlcGxhY2UoXCIvZGlzdC9cIiwgXCIvc3JjL1wiKVxuICAgICAgICA6IF9fZGlybmFtZTtcblxuICAgICAgY29uc3QgcmNLZXlzUGF0aCA9IHBhdGguam9pbihiYXNlUGF0aCwgXCIuLi8uLi9kaWN0L3JjLWtleXMudHNcIik7XG5cbiAgICAgIC8vIO2MjOydvCDsnb3quLBcbiAgICAgIGNvbnN0IHNvdXJjZUNvZGUgPSBmcy5yZWFkRmlsZVN5bmMocmNLZXlzUGF0aCwgXCJ1dGYtOFwiKTtcblxuICAgICAgLy8gcmNLZXlzS28g7LaU7LacICjspJHqtITtmLgg7Lm07Jq07YyFIOuwqeyLnSlcbiAgICAgIGNvbnN0IGtvQ29kZSA9IGV4dHJhY3RPYmplY3REZWNsYXJhdGlvbihzb3VyY2VDb2RlLCBcInJjS2V5c0tvXCIpO1xuXG4gICAgICAvLyByY0tleXNFbiDstpTstpwgKOykkeq0hO2YuCDsubTsmrTtjIUg67Cp7IudKVxuICAgICAgY29uc3QgZW5Db2RlID0gZXh0cmFjdE9iamVjdERlY2xhcmF0aW9uKHNvdXJjZUNvZGUsIFwicmNLZXlzRW5cIik7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGtvOiBrb0NvZGUucmVwbGFjZSgvXmV4cG9ydCAvLCBcIlwiKSxcbiAgICAgICAgZW46IGVuQ29kZS5yZXBsYWNlKC9eZXhwb3J0IC8sIFwiXCIpLnJlcGxhY2UoLyBzYXRpc2ZpZXMgUkNLZXlzLywgXCIgYXMgY29uc3RcIiksXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyByYy1rZXlzIO2MjOydvOydtCDsl4bripQg6rK97JqwIOu5iCDsvZTrk5wg67CY7ZmYXG4gICAgICBjb25zb2xlLndhcm4oXCJGYWlsZWQgdG8gbG9hZCByYy1rZXlzIHNvdXJjZTpcIiwgZXJyb3IpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAga286IFwiY29uc3QgcmNLZXlzS28gPSB7fSBhcyBjb25zdDtcIixcbiAgICAgICAgZW46IFwiY29uc3QgcmNLZXlzRW4gPSB7fSBhcyBjb25zdDtcIixcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOuqqOuToCBlbnRpdHkuanNvbuyXkOyEnCBlbnRpdHkgbGFiZWxzIOy2lOy2nFxuICAgKiBlbnRpdHkuanNvbuyXkOyEnCDsp4HsoJEg6rSA66as65CY64qUIOqwkuunjCDtj6ztlaggKOyekOuPmSDsg53shLEg6rCSIOygnOyZuClcbiAgICogLSBlbnRpdHkue2VudGl0eUlkfTogZW50aXR5IHRpdGxlXG4gICAqIC0gZW50aXR5LntlbnRpdHlJZH0ue3Byb3BOYW1lfTogcHJvcCBkZXNjXG4gICAqIC0gZW51bS57RW51bUlkfS57dmFsdWV9OiBlbnVtIGxhYmVsXG4gICAqL1xuICBwcml2YXRlIGV4dHJhY3RFbnRpdHlMYWJlbHMoKTogeyBrZXk6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9W10ge1xuICAgIGNvbnN0IGxhYmVsczogeyBrZXk6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9W10gPSBbXTtcblxuICAgIGlmICghRW50aXR5TWFuYWdlci5pc0F1dG9sb2FkZWQpIHtcbiAgICAgIHJldHVybiBsYWJlbHM7XG4gICAgfVxuXG4gICAgY29uc3QgZW50aXR5SWRzID0gRW50aXR5TWFuYWdlci5nZXRBbGxJZHMoKTtcblxuICAgIGZvciAoY29uc3QgZW50aXR5SWQgb2YgZW50aXR5SWRzKSB7XG4gICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG5cbiAgICAgIC8vIGVudGl0eSB0aXRsZSAoZW50aXR5Lmpzb27sl5DshJwg6rSA66asKVxuICAgICAgbGFiZWxzLnB1c2goeyBrZXk6IGBlbnRpdHkuJHtlbnRpdHlJZH1gLCB2YWx1ZTogZW50aXR5LnRpdGxlIH0pO1xuXG4gICAgICAvLyBwcm9wIGxhYmVscyAoZW50aXR5Lmpzb27sl5DshJwg6rSA66asKVxuICAgICAgZm9yIChjb25zdCBwcm9wIG9mIGVudGl0eS5wcm9wcykge1xuICAgICAgICBpZiAocHJvcC5kZXNjKSB7XG4gICAgICAgICAgbGFiZWxzLnB1c2goeyBrZXk6IGBlbnRpdHkuJHtlbnRpdHlJZH0uJHtwcm9wLm5hbWV9YCwgdmFsdWU6IHByb3AuZGVzYyB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBlbnVtIGxhYmVscyAoZW50aXR5Lmpzb27sl5DshJwg6rSA66asKVxuICAgICAgZm9yIChjb25zdCBbZW51bUlkLCBlbnVtTGFiZWxzTWFwXSBvZiBPYmplY3QuZW50cmllcyhlbnRpdHkuZW51bUxhYmVscykpIHtcbiAgICAgICAgZm9yIChjb25zdCBbdmFsdWUsIGxhYmVsXSBvZiBPYmplY3QuZW50cmllcyhlbnVtTGFiZWxzTWFwKSkge1xuICAgICAgICAgIGxhYmVscy5wdXNoKHsga2V5OiBgZW51bS4ke2VudW1JZH0uJHt2YWx1ZX1gLCB2YWx1ZTogbGFiZWwgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbGFiZWxzO1xuICB9XG5cbiAgLyoqXG4gICAqIGVudGl0eUxhYmVsc+ulvCBUeXBlU2NyaXB0IOy9lOuTnOuhnCDrs4DtmZhcbiAgICovXG4gIHByaXZhdGUgZ2VuZXJhdGVFbnRpdHlMYWJlbHNDb2RlKGxhYmVsczogeyBrZXk6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9W10pOiBzdHJpbmcge1xuICAgIGlmIChsYWJlbHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gXCJjb25zdCBlbnRpdHlMYWJlbHMgPSB7fSBhcyBjb25zdDtcIjtcbiAgICB9XG5cbiAgICBjb25zdCBlbnRyaWVzID0gbGFiZWxzLm1hcCgoeyBrZXksIHZhbHVlIH0pID0+IGAgIFwiJHtrZXl9XCI6IFwiJHt0aGlzLmVzY2FwZVN0cmluZyh2YWx1ZSl9XCIsYCk7XG5cbiAgICByZXR1cm4gYGNvbnN0IGVudGl0eUxhYmVscyA9IHtcbiR7ZW50cmllcy5qb2luKFwiXFxuXCIpfVxufSBhcyBjb25zdDtgO1xuICB9XG5cbiAgcHJpdmF0ZSBlc2NhcGVTdHJpbmcoc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBzdHIucmVwbGFjZSgvXFxcXC9nLCBcIlxcXFxcXFxcXCIpLnJlcGxhY2UoL1wiL2csICdcXFxcXCInKS5yZXBsYWNlKC9cXG4vZywgXCJcXFxcblwiKTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7YUFJMEM7cUJBQ2tCO2NBR047ZUFDZjs7Ozs7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
@@ -333,6 +333,8 @@ export type EntityIndex = {
333
333
  name: string;
334
334
  using?: "btree" | "hash" | "gin" | "gist" | "pgroonga";
335
335
  nullsNotDistinct?: boolean;
336
+ /** PostgreSQL partial index predicate. Raw SQL WHERE expression without the WHERE keyword. */
337
+ where?: string;
336
338
  /**
337
339
  * HNSW (Hierarchical Navigable Small World) 인덱스: 각 노드의 최대 연결 수
338
340
  *
@@ -596,6 +598,8 @@ export type MigrationIndex = {
596
598
  name: string;
597
599
  using?: "btree" | "hash" | "gin" | "gist" | "pgroonga";
598
600
  nullsNotDistinct?: boolean;
601
+ /** PostgreSQL partial index predicate. Raw SQL WHERE expression without the WHERE keyword. */
602
+ where?: string;
599
603
  /** HNSW (Hierarchical Navigable Small World): 각 노드의 최대 연결 수 */
600
604
  m?: number;
601
605
  /** HNSW (Hierarchical Navigable Small World): 구성 시 탐색 범위 */
@@ -2659,6 +2663,7 @@ export declare const EntityJsonSchema: z.ZodObject<{
2659
2663
  pgroonga: "pgroonga";
2660
2664
  }>>;
2661
2665
  nullsNotDistinct: z.ZodOptional<z.ZodBoolean>;
2666
+ where: z.ZodOptional<z.ZodString>;
2662
2667
  m: z.ZodOptional<z.ZodNumber>;
2663
2668
  efConstruction: z.ZodOptional<z.ZodNumber>;
2664
2669
  lists: z.ZodOptional<z.ZodNumber>;
@@ -3708,6 +3713,7 @@ export declare const TemplateOptions: z.ZodObject<{
3708
3713
  pgroonga: "pgroonga";
3709
3714
  }>>;
3710
3715
  nullsNotDistinct: z.ZodOptional<z.ZodBoolean>;
3716
+ where: z.ZodOptional<z.ZodString>;
3711
3717
  m: z.ZodOptional<z.ZodNumber>;
3712
3718
  efConstruction: z.ZodOptional<z.ZodNumber>;
3713
3719
  lists: z.ZodOptional<z.ZodNumber>;