@angular/compiler 17.0.0-next.1 → 17.0.0-next.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/esm2022/src/compiler.mjs +2 -2
  2. package/esm2022/src/compiler_util/expression_converter.mjs +22 -2
  3. package/esm2022/src/constant_pool.mjs +21 -2
  4. package/esm2022/src/output/abstract_emitter.mjs +1 -1
  5. package/esm2022/src/output/abstract_js_emitter.mjs +25 -1
  6. package/esm2022/src/output/output_ast.mjs +49 -3
  7. package/esm2022/src/render3/partial/class_metadata.mjs +1 -1
  8. package/esm2022/src/render3/partial/directive.mjs +1 -1
  9. package/esm2022/src/render3/partial/factory.mjs +1 -1
  10. package/esm2022/src/render3/partial/injectable.mjs +1 -1
  11. package/esm2022/src/render3/partial/injector.mjs +1 -1
  12. package/esm2022/src/render3/partial/ng_module.mjs +1 -1
  13. package/esm2022/src/render3/partial/pipe.mjs +1 -1
  14. package/esm2022/src/render3/r3_ast.mjs +1 -1
  15. package/esm2022/src/render3/r3_control_flow.mjs +7 -2
  16. package/esm2022/src/render3/r3_identifiers.mjs +6 -1
  17. package/esm2022/src/render3/view/compiler.mjs +26 -9
  18. package/esm2022/src/render3/view/template.mjs +215 -31
  19. package/esm2022/src/render3/view/util.mjs +2 -1
  20. package/esm2022/src/template/pipeline/ir/src/enums.mjs +41 -17
  21. package/esm2022/src/template/pipeline/ir/src/expression.mjs +69 -2
  22. package/esm2022/src/template/pipeline/ir/src/operations.mjs +13 -1
  23. package/esm2022/src/template/pipeline/ir/src/ops/create.mjs +46 -25
  24. package/esm2022/src/template/pipeline/ir/src/ops/host.mjs +3 -2
  25. package/esm2022/src/template/pipeline/ir/src/ops/update.mjs +18 -2
  26. package/esm2022/src/template/pipeline/src/compilation.mjs +107 -87
  27. package/esm2022/src/template/pipeline/src/emit.mjs +69 -72
  28. package/esm2022/src/template/pipeline/src/ingest.mjs +93 -58
  29. package/esm2022/src/template/pipeline/src/instruction.mjs +27 -9
  30. package/esm2022/src/template/pipeline/src/phases/align_pipe_variadic_var_offset.mjs +4 -4
  31. package/esm2022/src/template/pipeline/src/phases/any_cast.mjs +4 -4
  32. package/esm2022/src/template/pipeline/src/phases/attribute_extraction.mjs +34 -12
  33. package/esm2022/src/template/pipeline/src/phases/binding_specialization.mjs +4 -5
  34. package/esm2022/src/template/pipeline/src/phases/chaining.mjs +4 -1
  35. package/esm2022/src/template/pipeline/src/phases/conditionals.mjs +44 -0
  36. package/esm2022/src/template/pipeline/src/phases/const_collection.mjs +49 -13
  37. package/esm2022/src/template/pipeline/src/phases/empty_elements.mjs +5 -4
  38. package/esm2022/src/template/pipeline/src/phases/generate_advance.mjs +5 -5
  39. package/esm2022/src/template/pipeline/src/phases/generate_i18n_blocks.mjs +38 -0
  40. package/esm2022/src/template/pipeline/src/phases/generate_variables.mjs +3 -3
  41. package/esm2022/src/template/pipeline/src/phases/host_style_property_parsing.mjs +10 -4
  42. package/esm2022/src/template/pipeline/src/phases/i18n_message_extraction.mjs +108 -0
  43. package/esm2022/src/template/pipeline/src/phases/i18n_text_extraction.mjs +32 -0
  44. package/esm2022/src/template/pipeline/src/phases/local_refs.mjs +5 -5
  45. package/esm2022/src/template/pipeline/src/phases/namespace.mjs +3 -3
  46. package/esm2022/src/template/pipeline/src/phases/naming.mjs +19 -14
  47. package/esm2022/src/template/pipeline/src/phases/next_context_merging.mjs +5 -5
  48. package/esm2022/src/template/pipeline/src/phases/ng_container.mjs +4 -4
  49. package/esm2022/src/template/pipeline/src/phases/nonbindable.mjs +3 -3
  50. package/esm2022/src/template/pipeline/src/phases/ordering.mjs +97 -0
  51. package/esm2022/src/template/pipeline/src/phases/parse_extracted_styles.mjs +3 -3
  52. package/esm2022/src/template/pipeline/src/phases/pipe_creation.mjs +9 -9
  53. package/esm2022/src/template/pipeline/src/phases/pipe_variadic.mjs +4 -4
  54. package/esm2022/src/template/pipeline/src/phases/reify.mjs +31 -3
  55. package/esm2022/src/template/pipeline/src/phases/resolve_dollar_event.mjs +6 -6
  56. package/esm2022/src/template/pipeline/src/phases/resolve_i18n_placeholders.mjs +63 -0
  57. package/esm2022/src/template/pipeline/src/phases/resolve_sanitizers.mjs +5 -5
  58. package/esm2022/src/template/pipeline/src/phases/save_restore_view.mjs +8 -8
  59. package/esm2022/src/template/pipeline/src/phases/slot_allocation.mjs +8 -8
  60. package/esm2022/src/template/pipeline/src/phases/var_counting.mjs +3 -3
  61. package/esm2022/src/template/pipeline/src/util/elements.mjs +3 -3
  62. package/esm2022/src/version.mjs +1 -1
  63. package/fesm2022/compiler.mjs +10287 -9431
  64. package/fesm2022/compiler.mjs.map +1 -1
  65. package/fesm2022/testing.mjs +1 -1
  66. package/index.d.ts +28 -5
  67. package/package.json +2 -2
  68. package/testing/index.d.ts +1 -1
  69. package/esm2022/src/template/pipeline/src/phases/property_ordering.mjs +0 -99
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license Angular v17.0.0-next.1
2
+ * @license Angular v17.0.0-next.3
3
3
  * (c) 2010-2022 Google LLC. https://angular.io/
4
4
  * License: MIT
5
5
  */
package/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license Angular v17.0.0-next.1
2
+ * @license Angular v17.0.0-next.3
3
3
  * (c) 2010-2022 Google LLC. https://angular.io/
4
4
  * License: MIT
5
5
  */
@@ -34,6 +34,19 @@ export declare class ArrayType extends Type {
34
34
  visitType(visitor: TypeVisitor, context: any): any;
35
35
  }
36
36
 
37
+ declare function arrowFn(params: FnParam[], body: Expression | Statement[], type?: Type | null, sourceSpan?: ParseSourceSpan | null): ArrowFunctionExpr;
38
+
39
+ export declare class ArrowFunctionExpr extends Expression {
40
+ params: FnParam[];
41
+ body: Expression | Statement[];
42
+ constructor(params: FnParam[], body: Expression | Statement[], type?: Type | null, sourceSpan?: ParseSourceSpan | null);
43
+ isEquivalent(e: Expression): boolean;
44
+ isConstant(): boolean;
45
+ visitExpression(visitor: ExpressionVisitor, context: any): any;
46
+ clone(): Expression;
47
+ toDeclStmt(name: string, modifiers?: StmtModifier): DeclareVarStmt;
48
+ }
49
+
37
50
  export declare abstract class AST {
38
51
  span: ParseSpan;
39
52
  /**
@@ -774,6 +787,7 @@ export declare class ConstantPool {
774
787
  literalFactory: outputAst.Expression;
775
788
  literalFactoryArguments: outputAst.Expression[];
776
789
  };
790
+ getSharedFunctionReference(fn: outputAst.FunctionExpr | outputAst.ArrowFunctionExpr, prefix: string): outputAst.Expression;
777
791
  private _getLiteralFactory;
778
792
  /**
779
793
  * Produce a unique name.
@@ -1291,6 +1305,7 @@ export declare interface ExpressionVisitor {
1291
1305
  visitCommaExpr(ast: CommaExpr, context: any): any;
1292
1306
  visitWrappedNodeExpr(ast: WrappedNodeExpr<any>, context: any): any;
1293
1307
  visitTypeofExpr(ast: TypeofExpr, context: any): any;
1308
+ visitArrowFunctionExpr(ast: ArrowFunctionExpr, context: any): any;
1294
1309
  }
1295
1310
 
1296
1311
  export declare class ExternalExpr extends Expression {
@@ -1368,7 +1383,7 @@ export declare class FunctionExpr extends Expression {
1368
1383
  statements: Statement[];
1369
1384
  name?: string | null | undefined;
1370
1385
  constructor(params: FnParam[], statements: Statement[], type?: Type | null, sourceSpan?: ParseSourceSpan | null, name?: string | null | undefined);
1371
- isEquivalent(e: Expression): boolean;
1386
+ isEquivalent(e: Expression | Statement): boolean;
1372
1387
  isConstant(): boolean;
1373
1388
  visitExpression(visitor: ExpressionVisitor, context: any): any;
1374
1389
  toDeclStmt(name: string, modifiers?: StmtModifier): DeclareFunctionStmt;
@@ -2042,6 +2057,7 @@ declare namespace outputAst {
2042
2057
  unary,
2043
2058
  not,
2044
2059
  fn,
2060
+ arrowFn,
2045
2061
  ifStmt,
2046
2062
  taggedTemplate,
2047
2063
  literal,
@@ -2091,6 +2107,7 @@ declare namespace outputAst {
2091
2107
  NotExpr,
2092
2108
  FnParam,
2093
2109
  FunctionExpr,
2110
+ ArrowFunctionExpr,
2094
2111
  UnaryOperatorExpr,
2095
2112
  BinaryOperatorExpr,
2096
2113
  ReadPropExpr,
@@ -3729,6 +3746,11 @@ export declare class R3Identifiers {
3729
3746
  static deferPrefetchOnInteraction: outputAst.ExternalReference;
3730
3747
  static deferPrefetchOnViewport: outputAst.ExternalReference;
3731
3748
  static conditional: outputAst.ExternalReference;
3749
+ static repeater: outputAst.ExternalReference;
3750
+ static repeaterCreate: outputAst.ExternalReference;
3751
+ static repeaterTrackByIndex: outputAst.ExternalReference;
3752
+ static repeaterTrackByIdentity: outputAst.ExternalReference;
3753
+ static componentInstance: outputAst.ExternalReference;
3732
3754
  static text: outputAst.ExternalReference;
3733
3755
  static enableBindings: outputAst.ExternalReference;
3734
3756
  static disableBindings: outputAst.ExternalReference;
@@ -4259,6 +4281,7 @@ declare class RecursiveAstVisitor_2 implements StatementVisitor, ExpressionVisit
4259
4281
  visitConditionalExpr(ast: ConditionalExpr, context: any): any;
4260
4282
  visitNotExpr(ast: NotExpr, context: any): any;
4261
4283
  visitFunctionExpr(ast: FunctionExpr, context: any): any;
4284
+ visitArrowFunctionExpr(ast: ArrowFunctionExpr, context: any): any;
4262
4285
  visitUnaryOperatorExpr(ast: UnaryOperatorExpr, context: any): any;
4263
4286
  visitBinaryOperatorExpr(ast: BinaryOperatorExpr, context: any): any;
4264
4287
  visitReadPropExpr(ast: ReadPropExpr, context: any): any;
@@ -4811,15 +4834,15 @@ export declare class TmplAstElement implements TmplAstNode {
4811
4834
 
4812
4835
  export declare class TmplAstForLoopBlock implements TmplAstNode {
4813
4836
  itemName: string;
4814
- expression: AST;
4815
- trackBy: AST;
4837
+ expression: ASTWithSource;
4838
+ trackBy: ASTWithSource;
4816
4839
  contextVariables: ForLoopBlockContext | null;
4817
4840
  children: TmplAstNode[];
4818
4841
  empty: TmplAstForLoopBlockEmpty | null;
4819
4842
  sourceSpan: ParseSourceSpan;
4820
4843
  startSourceSpan: ParseSourceSpan;
4821
4844
  endSourceSpan: ParseSourceSpan | null;
4822
- constructor(itemName: string, expression: AST, trackBy: AST, contextVariables: ForLoopBlockContext | null, children: TmplAstNode[], empty: TmplAstForLoopBlockEmpty | null, sourceSpan: ParseSourceSpan, startSourceSpan: ParseSourceSpan, endSourceSpan: ParseSourceSpan | null);
4845
+ constructor(itemName: string, expression: ASTWithSource, trackBy: ASTWithSource, contextVariables: ForLoopBlockContext | null, children: TmplAstNode[], empty: TmplAstForLoopBlockEmpty | null, sourceSpan: ParseSourceSpan, startSourceSpan: ParseSourceSpan, endSourceSpan: ParseSourceSpan | null);
4823
4846
  visit<Result>(visitor: Visitor_3<Result>): Result;
4824
4847
  }
4825
4848
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@angular/compiler",
3
- "version": "17.0.0-next.1",
3
+ "version": "17.0.0-next.3",
4
4
  "description": "Angular - the compiler library",
5
5
  "author": "angular",
6
6
  "license": "MIT",
@@ -11,7 +11,7 @@
11
11
  "tslib": "^2.3.0"
12
12
  },
13
13
  "peerDependencies": {
14
- "@angular/core": "17.0.0-next.1"
14
+ "@angular/core": "17.0.0-next.3"
15
15
  },
16
16
  "peerDependenciesMeta": {
17
17
  "@angular/core": {
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license Angular v17.0.0-next.1
2
+ * @license Angular v17.0.0-next.3
3
3
  * (c) 2010-2022 Google LLC. https://angular.io/
4
4
  * License: MIT
5
5
  */
@@ -1,99 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright Google LLC All Rights Reserved.
4
- *
5
- * Use of this source code is governed by an MIT-style license that can be
6
- * found in the LICENSE file at https://angular.io/license
7
- */
8
- import * as ir from '../../ir';
9
- function kindTest(kind) {
10
- return (op) => op.kind === kind;
11
- }
12
- /**
13
- * Defines the groups based on `OpKind` that ops will be divided into. Ops will be collected into
14
- * groups, then optionally transformed, before recombining the groups in the order defined here.
15
- */
16
- const ORDERING = [
17
- { test: kindTest(ir.OpKind.StyleMap), transform: keepLast },
18
- { test: kindTest(ir.OpKind.ClassMap), transform: keepLast },
19
- { test: kindTest(ir.OpKind.StyleProp) },
20
- { test: kindTest(ir.OpKind.ClassProp) },
21
- {
22
- test: (op) => (op.kind === ir.OpKind.Property || op.kind === ir.OpKind.HostProperty) &&
23
- op.expression instanceof ir.Interpolation
24
- },
25
- {
26
- test: (op) => (op.kind === ir.OpKind.Property || op.kind === ir.OpKind.HostProperty) &&
27
- !(op.expression instanceof ir.Interpolation)
28
- },
29
- { test: kindTest(ir.OpKind.Attribute) },
30
- ];
31
- /**
32
- * The set of all op kinds we handle in the reordering phase.
33
- */
34
- const handledOpKinds = new Set([
35
- ir.OpKind.StyleMap,
36
- ir.OpKind.ClassMap,
37
- ir.OpKind.StyleProp,
38
- ir.OpKind.ClassProp,
39
- ir.OpKind.Property,
40
- ir.OpKind.HostProperty,
41
- ir.OpKind.Attribute,
42
- ]);
43
- /**
44
- * Reorders property and attribute ops according to the following ordering:
45
- * 1. styleMap & styleMapInterpolate (drops all but the last op in the group)
46
- * 2. classMap & classMapInterpolate (drops all but the last op in the group)
47
- * 3. styleProp & stylePropInterpolate (ordering preserved within group)
48
- * 4. classProp (ordering preserved within group)
49
- * 5. propertyInterpolate (ordering preserved within group)
50
- * 6. property (ordering preserved within group)
51
- * 7. attribute & attributeInterpolate (ordering preserve within group)
52
- */
53
- export function phasePropertyOrdering(cpl) {
54
- for (const unit of cpl.units) {
55
- let opsToOrder = [];
56
- for (const op of unit.update) {
57
- if (handledOpKinds.has(op.kind)) {
58
- // Pull out ops that need o be ordered.
59
- opsToOrder.push(op);
60
- ir.OpList.remove(op);
61
- }
62
- else {
63
- // When we encounter an op that shouldn't be reordered, put the ones we've pulled so far
64
- // back in the correct order.
65
- for (const orderedOp of reorder(opsToOrder)) {
66
- ir.OpList.insertBefore(orderedOp, op);
67
- }
68
- opsToOrder = [];
69
- }
70
- }
71
- // If we still have ops pulled at the end, put them back in the correct order.
72
- for (const orderedOp of reorder(opsToOrder)) {
73
- unit.update.push(orderedOp);
74
- }
75
- }
76
- }
77
- /**
78
- * Reorders the given list of ops according to the ordering defined by `ORDERING`.
79
- */
80
- function reorder(ops) {
81
- // Break the ops list into groups based on OpKind.
82
- const groups = Array.from(ORDERING, () => new Array());
83
- for (const op of ops) {
84
- const groupIndex = ORDERING.findIndex(o => o.test(op));
85
- groups[groupIndex].push(op);
86
- }
87
- // Reassemble the groups into a single list, in the correct order.
88
- return groups.flatMap((group, i) => {
89
- const transform = ORDERING[i].transform;
90
- return transform ? transform(group) : group;
91
- });
92
- }
93
- /**
94
- * Keeps only the last op in a list of ops.
95
- */
96
- function keepLast(ops) {
97
- return ops.slice(ops.length - 1);
98
- }
99
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcGVydHlfb3JkZXJpbmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21waWxlci9zcmMvdGVtcGxhdGUvcGlwZWxpbmUvc3JjL3BoYXNlcy9wcm9wZXJ0eV9vcmRlcmluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFFSCxPQUFPLEtBQUssRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUcvQixTQUFTLFFBQVEsQ0FBQyxJQUFlO0lBQy9CLE9BQU8sQ0FBQyxFQUFlLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDO0FBQy9DLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFFBQVEsR0FJVjtJQUNFLEVBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUM7SUFDekQsRUFBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBQztJQUN6RCxFQUFDLElBQUksRUFBRSxRQUFRLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBQztJQUNyQyxFQUFDLElBQUksRUFBRSxRQUFRLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBQztJQUNyQztRQUNFLElBQUksRUFBRSxDQUFDLEVBQWUsRUFBRSxFQUFFLENBQ3RCLENBQUMsRUFBRSxDQUFDLElBQUksS0FBSyxFQUFFLENBQUMsTUFBTSxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUMsSUFBSSxLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDO1lBQ3RFLEVBQUUsQ0FBQyxVQUFVLFlBQVksRUFBRSxDQUFDLGFBQWE7S0FDOUM7SUFDRDtRQUNFLElBQUks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QUVEOztHQUVHO0FBQ0gsU0FBUyxRQUFRLENBQUksR0FBYTtJQUNoQyxPQUFPLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNuQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbmltcG9ydCAqIGFzIGlyIGZyb20gJy4uLy4uL2lyJztcbmltcG9ydCB0eXBlIHtDb21waWxhdGlvbkpvYn0gZnJvbSAnLi4vY29tcGlsYXRpb24nO1xuXG5mdW5jdGlvbiBraW5kVGVzdChraW5kOiBpci5PcEtpbmQpOiAob3A6IGlyLlVwZGF0ZU9wKSA9PiBib29sZWFuIHtcbiAgcmV0dXJuIChvcDogaXIuVXBkYXRlT3ApID0+IG9wLmtpbmQgPT09IGtpbmQ7XG59XG5cbi8qKlxuICogRGVmaW5lcyB0aGUgZ3JvdXBzIGJhc2VkIG9uIGBPcEtpbmRgIHRoYXQgb3BzIHdpbGwgYmUgZGl2aWRlZCBpbnRvLiBPcHMgd2lsbCBiZSBjb2xsZWN0ZWQgaW50b1xuICogZ3JvdXBzLCB0aGVuIG9wdGlvbmFsbHkgdHJhbnNmb3JtZWQsIGJlZm9yZSByZWNvbWJpbmluZyB0aGUgZ3JvdXBzIGluIHRoZSBvcmRlciBkZWZpbmVkIGhlcmUuXG4gKi9cbmNvbnN0IE9SREVSSU5HOiB7XG4gIHRlc3Q6IChvcDogaXIuVXBkYXRlT3ApID0+IGJvb2xlYW4sXG4gIHRyYW5zZm9ybT86IChvcHM6IEFycmF5PGlyLlVwZGF0ZU9wPikgPT4gQXJyYXk8aXIuVXBkYXRlT3A+XG59W10gPVxuICAgIFtcbiAgICAgIHt0ZXN0OiBraW5kVGVzdChpci5PcEtpbmQuU3R5bGVNYXApLCB0cmFuc2Zvcm06IGtlZXBMYXN0fSxcbiAgICAgIHt0ZXN0OiBraW5kVGVzdChpci5PcEtpbmQuQ2xhc3NNYXApLCB0cmFuc2Zvcm06IGtlZXBMYXN0fSxcbiAgICAgIHt0ZXN0OiBraW5kVGVzdChpci5PcEtpbmQuU3R5bGVQcm9wKX0sXG4gICAgICB7dGVzdDoga2luZFRlc3QoaXIuT3BLaW5kLkNsYXNzUHJvcCl9LFxuICAgICAge1xuICAgICAgICB0ZXN0OiAob3A6IGlyLlVwZGF0ZU9wKSA9PlxuICAgICAgICAgICAgKG9wLmtpbmQgPT09IGlyLk9wS2luZC5Qcm9wZXJ0eSB8fCBvcC5raW5kID09PSBpci5PcEtpbmQuSG9zdFByb3BlcnR5KSAmJlxuICAgICAgICAgICAgb3AuZXhwcmVzc2lvbiBpbnN0YW5jZW9mIGlyLkludGVycG9sYXRpb25cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHRlc3Q6IChvcDogaXIuVXBkYXRlT3ApID0+XG4gICAgICAgICAgICAob3Aua2luZCA9PT0gaXIuT3BLaW5kLlByb3BlcnR5IHx8IG9wLmtpbmQgPT09IGlyLk9wS2luZC5Ib3N0UHJvcGVydHkpICYmXG4gICAgICAgICAgICAhKG9wLmV4cHJlc3Npb24gaW5zdGFuY2VvZiBpci5JbnRlcnBvbGF0aW9uKVxuICAgICAgfSxcbiAgICAgIHt0ZXN0OiBraW5kVGVzdChpci5PcEtpbmQuQXR0cmlidXRlKX0sXG4gICAgXTtcblxuLyoqXG4gKiBUaGUgc2V0IG9mIGFsbCBvcCBraW5kcyB3ZSBoYW5kbGUgaW4gdGhlIHJlb3JkZXJpbmcgcGhhc2UuXG4gKi9cbmNvbnN0IGhhbmRsZWRPcEtpbmRzID0gbmV3IFNldChbXG4gIGlyLk9wS2luZC5TdHlsZU1hcCxcbiAgaXIuT3BLaW5kLkNsYXNzTWFwLFxuICBpci5PcEtpbmQuU3R5bGVQcm9wLFxuICBpci5PcEtpbmQuQ2xhc3NQcm9wLFxuICBpci5PcEtpbmQuUHJvcGVydHksXG4gIGlyLk9wS2luZC5Ib3N0UHJvcGVydHksXG4gIGlyLk9wS2luZC5BdHRyaWJ1dGUsXG5dKTtcblxuLyoqXG4gKiBSZW9yZGVycyBwcm9wZXJ0eSBhbmQgYXR0cmlidXRlIG9wcyBhY2NvcmRpbmcgdG8gdGhlIGZvbGxvd2luZyBvcmRlcmluZzpcbiAqIDEuIHN0eWxlTWFwICYgc3R5bGVNYXBJbnRlcnBvbGF0ZSAoZHJvcHMgYWxsIGJ1dCB0aGUgbGFzdCBvcCBpbiB0aGUgZ3JvdXApXG4gKiAyLiBjbGFzc01hcCAmIGNsYXNzTWFwSW50ZXJwb2xhdGUgKGRyb3BzIGFsbCBidXQgdGhlIGxhc3Qgb3AgaW4gdGhlIGdyb3VwKVxuICogMy4gc3R5bGVQcm9wICYgc3R5bGVQcm9wSW50ZXJwb2xhdGUgKG9yZGVyaW5nIHByZXNlcnZlZCB3aXRoaW4gZ3JvdXApXG4gKiA0LiBjbGFzc1Byb3AgKG9yZGVyaW5nIHByZXNlcnZlZCB3aXRoaW4gZ3JvdXApXG4gKiA1LiBwcm9wZXJ0eUludGVycG9sYXRlIChvcmRlcmluZyBwcmVzZXJ2ZWQgd2l0aGluIGdyb3VwKVxuICogNi4gcHJvcGVydHkgKG9yZGVyaW5nIHByZXNlcnZlZCB3aXRoaW4gZ3JvdXApXG4gKiA3LiBhdHRyaWJ1dGUgJiBhdHRyaWJ1dGVJbnRlcnBvbGF0ZSAob3JkZXJpbmcgcHJlc2VydmUgd2l0aGluIGdyb3VwKVxuICovXG5leHBvcnQgZnVuY3Rpb24gcGhhc2VQcm9wZXJ0eU9yZGVyaW5nKGNwbDogQ29tcGlsYXRpb25Kb2IpIHtcbiAgZm9yIChjb25zdCB1bml0IG9mIGNwbC51bml0cykge1xuICAgIGxldCBvcHNUb09yZGVyID0gW107XG4gICAgZm9yIChjb25zdCBvcCBvZiB1bml0LnVwZGF0ZSkge1xuICAgICAgaWYgKGhhbmRsZWRPcEtpbmRzLmhhcyhvcC5raW5kKSkge1xuICAgICAgICAvLyBQdWxsIG91dCBvcHMgdGhhdCBuZWVkIG8gYmUgb3JkZXJlZC5cbiAgICAgICAgb3BzVG9PcmRlci5wdXNoKG9wKTtcbiAgICAgICAgaXIuT3BMaXN0LnJlbW92ZShvcCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBXaGVuIHdlIGVuY291bnRlciBhbiBvcCB0aGF0IHNob3VsZG4ndCBiZSByZW9yZGVyZWQsIHB1dCB0aGUgb25lcyB3ZSd2ZSBwdWxsZWQgc28gZmFyXG4gICAgICAgIC8vIGJhY2sgaW4gdGhlIGNvcnJlY3Qgb3JkZXIuXG4gICAgICAgIGZvciAoY29uc3Qgb3JkZXJlZE9wIG9mIHJlb3JkZXIob3BzVG9PcmRlcikpIHtcbiAgICAgICAgICBpci5PcExpc3QuaW5zZXJ0QmVmb3JlKG9yZGVyZWRPcCwgb3ApO1xuICAgICAgICB9XG4gICAgICAgIG9wc1RvT3JkZXIgPSBbXTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gSWYgd2Ugc3RpbGwgaGF2ZSBvcHMgcHVsbGVkIGF0IHRoZSBlbmQsIHB1dCB0aGVtIGJhY2sgaW4gdGhlIGNvcnJlY3Qgb3JkZXIuXG4gICAgZm9yIChjb25zdCBvcmRlcmVkT3Agb2YgcmVvcmRlcihvcHNUb09yZGVyKSkge1xuICAgICAgdW5pdC51cGRhdGUucHVzaChvcmRlcmVkT3ApO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFJlb3JkZXJzIHRoZSBnaXZlbiBsaXN0IG9mIG9wcyBhY2NvcmRpbmcgdG8gdGhlIG9yZGVyaW5nIGRlZmluZWQgYnkgYE9SREVSSU5HYC5cbiAqL1xuZnVuY3Rpb24gcmVvcmRlcihvcHM6IEFycmF5PGlyLlVwZGF0ZU9wPik6IEFycmF5PGlyLlVwZGF0ZU9wPiB7XG4gIC8vIEJyZWFrIHRoZSBvcHMgbGlzdCBpbnRvIGdyb3VwcyBiYXNlZCBvbiBPcEtpbmQuXG4gIGNvbnN0IGdyb3VwcyA9IEFycmF5LmZyb20oT1JERVJJTkcsICgpID0+IG5ldyBBcnJheTxpci5VcGRhdGVPcD4oKSk7XG4gIGZvciAoY29uc3Qgb3Agb2Ygb3BzKSB7XG4gICAgY29uc3QgZ3JvdXBJbmRleCA9IE9SREVSSU5HLmZpbmRJbmRleChvID0+IG8udGVzdChvcCkpO1xuICAgIGdyb3Vwc1tncm91cEluZGV4XS5wdXNoKG9wKTtcbiAgfVxuICAvLyBSZWFzc2VtYmxlIHRoZSBncm91cHMgaW50byBhIHNpbmdsZSBsaXN0LCBpbiB0aGUgY29ycmVjdCBvcmRlci5cbiAgcmV0dXJuIGdyb3Vwcy5mbGF0TWFwKChncm91cCwgaSkgPT4ge1xuICAgIGNvbnN0IHRyYW5zZm9ybSA9IE9SREVSSU5HW2ldLnRyYW5zZm9ybTtcbiAgICByZXR1cm4gdHJhbnNmb3JtID8gdHJhbnNmb3JtKGdyb3VwKSA6IGdyb3VwO1xuICB9KTtcbn1cblxuLyoqXG4gKiBLZWVwcyBvbmx5IHRoZSBsYXN0IG9wIGluIGEgbGlzdCBvZiBvcHMuXG4gKi9cbmZ1bmN0aW9uIGtlZXBMYXN0PFQ+KG9wczogQXJyYXk8VD4pIHtcbiAgcmV0dXJuIG9wcy5zbGljZShvcHMubGVuZ3RoIC0gMSk7XG59XG4iXX0=