@angular/compiler 17.0.0-next.0 → 17.0.0-next.2

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 (67) hide show
  1. package/esm2022/src/compiler.mjs +2 -2
  2. package/esm2022/src/output/abstract_emitter.mjs +1 -1
  3. package/esm2022/src/output/abstract_js_emitter.mjs +25 -1
  4. package/esm2022/src/output/output_ast.mjs +44 -1
  5. package/esm2022/src/render3/partial/class_metadata.mjs +1 -1
  6. package/esm2022/src/render3/partial/directive.mjs +9 -4
  7. package/esm2022/src/render3/partial/factory.mjs +1 -1
  8. package/esm2022/src/render3/partial/injectable.mjs +1 -1
  9. package/esm2022/src/render3/partial/injector.mjs +1 -1
  10. package/esm2022/src/render3/partial/ng_module.mjs +1 -1
  11. package/esm2022/src/render3/partial/pipe.mjs +1 -1
  12. package/esm2022/src/render3/r3_ast.mjs +3 -4
  13. package/esm2022/src/render3/r3_control_flow.mjs +68 -25
  14. package/esm2022/src/render3/r3_identifiers.mjs +6 -1
  15. package/esm2022/src/render3/view/compiler.mjs +26 -9
  16. package/esm2022/src/render3/view/template.mjs +272 -36
  17. package/esm2022/src/render3/view/util.mjs +5 -2
  18. package/esm2022/src/template/pipeline/ir/src/enums.mjs +41 -17
  19. package/esm2022/src/template/pipeline/ir/src/expression.mjs +69 -2
  20. package/esm2022/src/template/pipeline/ir/src/operations.mjs +13 -1
  21. package/esm2022/src/template/pipeline/ir/src/ops/create.mjs +46 -25
  22. package/esm2022/src/template/pipeline/ir/src/ops/host.mjs +3 -2
  23. package/esm2022/src/template/pipeline/ir/src/ops/update.mjs +18 -2
  24. package/esm2022/src/template/pipeline/src/compilation.mjs +107 -87
  25. package/esm2022/src/template/pipeline/src/emit.mjs +69 -72
  26. package/esm2022/src/template/pipeline/src/ingest.mjs +93 -58
  27. package/esm2022/src/template/pipeline/src/instruction.mjs +27 -9
  28. package/esm2022/src/template/pipeline/src/phases/align_pipe_variadic_var_offset.mjs +4 -4
  29. package/esm2022/src/template/pipeline/src/phases/any_cast.mjs +4 -4
  30. package/esm2022/src/template/pipeline/src/phases/attribute_extraction.mjs +34 -12
  31. package/esm2022/src/template/pipeline/src/phases/binding_specialization.mjs +4 -5
  32. package/esm2022/src/template/pipeline/src/phases/chaining.mjs +4 -1
  33. package/esm2022/src/template/pipeline/src/phases/conditionals.mjs +44 -0
  34. package/esm2022/src/template/pipeline/src/phases/const_collection.mjs +49 -13
  35. package/esm2022/src/template/pipeline/src/phases/empty_elements.mjs +5 -4
  36. package/esm2022/src/template/pipeline/src/phases/generate_advance.mjs +5 -5
  37. package/esm2022/src/template/pipeline/src/phases/generate_i18n_blocks.mjs +38 -0
  38. package/esm2022/src/template/pipeline/src/phases/generate_variables.mjs +3 -3
  39. package/esm2022/src/template/pipeline/src/phases/host_style_property_parsing.mjs +10 -4
  40. package/esm2022/src/template/pipeline/src/phases/i18n_message_extraction.mjs +108 -0
  41. package/esm2022/src/template/pipeline/src/phases/i18n_text_extraction.mjs +32 -0
  42. package/esm2022/src/template/pipeline/src/phases/local_refs.mjs +5 -5
  43. package/esm2022/src/template/pipeline/src/phases/namespace.mjs +3 -3
  44. package/esm2022/src/template/pipeline/src/phases/naming.mjs +19 -14
  45. package/esm2022/src/template/pipeline/src/phases/next_context_merging.mjs +5 -5
  46. package/esm2022/src/template/pipeline/src/phases/ng_container.mjs +4 -4
  47. package/esm2022/src/template/pipeline/src/phases/nonbindable.mjs +3 -3
  48. package/esm2022/src/template/pipeline/src/phases/ordering.mjs +97 -0
  49. package/esm2022/src/template/pipeline/src/phases/parse_extracted_styles.mjs +3 -3
  50. package/esm2022/src/template/pipeline/src/phases/pipe_creation.mjs +9 -9
  51. package/esm2022/src/template/pipeline/src/phases/pipe_variadic.mjs +4 -4
  52. package/esm2022/src/template/pipeline/src/phases/reify.mjs +31 -3
  53. package/esm2022/src/template/pipeline/src/phases/resolve_dollar_event.mjs +6 -6
  54. package/esm2022/src/template/pipeline/src/phases/resolve_i18n_placeholders.mjs +63 -0
  55. package/esm2022/src/template/pipeline/src/phases/resolve_sanitizers.mjs +5 -5
  56. package/esm2022/src/template/pipeline/src/phases/save_restore_view.mjs +8 -8
  57. package/esm2022/src/template/pipeline/src/phases/slot_allocation.mjs +8 -8
  58. package/esm2022/src/template/pipeline/src/phases/var_counting.mjs +3 -3
  59. package/esm2022/src/template/pipeline/src/util/elements.mjs +3 -3
  60. package/esm2022/src/version.mjs +1 -1
  61. package/fesm2022/compiler.mjs +10290 -9380
  62. package/fesm2022/compiler.mjs.map +1 -1
  63. package/fesm2022/testing.mjs +1 -1
  64. package/index.d.ts +36 -4
  65. package/package.json +2 -2
  66. package/testing/index.d.ts +1 -1
  67. 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.0
2
+ * @license Angular v17.0.0-next.2
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.0
2
+ * @license Angular v17.0.0-next.2
3
3
  * (c) 2010-2022 Google LLC. https://angular.io/
4
4
  * License: MIT
5
5
  */
@@ -34,6 +34,18 @@ 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
+ }
48
+
37
49
  export declare abstract class AST {
38
50
  span: ParseSpan;
39
51
  /**
@@ -1291,6 +1303,7 @@ export declare interface ExpressionVisitor {
1291
1303
  visitCommaExpr(ast: CommaExpr, context: any): any;
1292
1304
  visitWrappedNodeExpr(ast: WrappedNodeExpr<any>, context: any): any;
1293
1305
  visitTypeofExpr(ast: TypeofExpr, context: any): any;
1306
+ visitArrowFunctionExpr(ast: ArrowFunctionExpr, context: any): any;
1294
1307
  }
1295
1308
 
1296
1309
  export declare class ExternalExpr extends Expression {
@@ -1340,6 +1353,15 @@ declare class FnParam {
1340
1353
  clone(): FnParam;
1341
1354
  }
1342
1355
 
1356
+ declare interface ForLoopBlockContext {
1357
+ $index?: string;
1358
+ $first?: string;
1359
+ $last?: string;
1360
+ $even?: string;
1361
+ $odd?: string;
1362
+ $count?: string;
1363
+ }
1364
+
1343
1365
  /**
1344
1366
  * Specifies how a forward ref has been handled in a MaybeForwardRefExpression
1345
1367
  */
@@ -2033,6 +2055,7 @@ declare namespace outputAst {
2033
2055
  unary,
2034
2056
  not,
2035
2057
  fn,
2058
+ arrowFn,
2036
2059
  ifStmt,
2037
2060
  taggedTemplate,
2038
2061
  literal,
@@ -2082,6 +2105,7 @@ declare namespace outputAst {
2082
2105
  NotExpr,
2083
2106
  FnParam,
2084
2107
  FunctionExpr,
2108
+ ArrowFunctionExpr,
2085
2109
  UnaryOperatorExpr,
2086
2110
  BinaryOperatorExpr,
2087
2111
  ReadPropExpr,
@@ -3719,6 +3743,11 @@ export declare class R3Identifiers {
3719
3743
  static deferPrefetchOnHover: outputAst.ExternalReference;
3720
3744
  static deferPrefetchOnInteraction: outputAst.ExternalReference;
3721
3745
  static deferPrefetchOnViewport: outputAst.ExternalReference;
3746
+ static conditional: outputAst.ExternalReference;
3747
+ static repeater: outputAst.ExternalReference;
3748
+ static repeaterCreate: outputAst.ExternalReference;
3749
+ static repeaterTrackByIndex: outputAst.ExternalReference;
3750
+ static repeaterTrackByIdentity: outputAst.ExternalReference;
3722
3751
  static text: outputAst.ExternalReference;
3723
3752
  static enableBindings: outputAst.ExternalReference;
3724
3753
  static disableBindings: outputAst.ExternalReference;
@@ -4249,6 +4278,7 @@ declare class RecursiveAstVisitor_2 implements StatementVisitor, ExpressionVisit
4249
4278
  visitConditionalExpr(ast: ConditionalExpr, context: any): any;
4250
4279
  visitNotExpr(ast: NotExpr, context: any): any;
4251
4280
  visitFunctionExpr(ast: FunctionExpr, context: any): any;
4281
+ visitArrowFunctionExpr(ast: ArrowFunctionExpr, context: any): any;
4252
4282
  visitUnaryOperatorExpr(ast: UnaryOperatorExpr, context: any): any;
4253
4283
  visitBinaryOperatorExpr(ast: BinaryOperatorExpr, context: any): any;
4254
4284
  visitReadPropExpr(ast: ReadPropExpr, context: any): any;
@@ -4518,6 +4548,7 @@ declare namespace t {
4518
4548
  TmplAstDeferredBlock as DeferredBlock,
4519
4549
  TmplAstSwitchBlock as SwitchBlock,
4520
4550
  TmplAstSwitchBlockCase as SwitchBlockCase,
4551
+ ForLoopBlockContext,
4521
4552
  TmplAstForLoopBlock as ForLoopBlock,
4522
4553
  TmplAstForLoopBlockEmpty as ForLoopBlockEmpty,
4523
4554
  TmplAstIfBlock as IfBlock,
@@ -4800,14 +4831,15 @@ export declare class TmplAstElement implements TmplAstNode {
4800
4831
 
4801
4832
  export declare class TmplAstForLoopBlock implements TmplAstNode {
4802
4833
  itemName: string;
4803
- expression: AST;
4804
- trackBy: string;
4834
+ expression: ASTWithSource;
4835
+ trackBy: ASTWithSource;
4836
+ contextVariables: ForLoopBlockContext | null;
4805
4837
  children: TmplAstNode[];
4806
4838
  empty: TmplAstForLoopBlockEmpty | null;
4807
4839
  sourceSpan: ParseSourceSpan;
4808
4840
  startSourceSpan: ParseSourceSpan;
4809
4841
  endSourceSpan: ParseSourceSpan | null;
4810
- constructor(itemName: string, expression: AST, trackBy: string, children: TmplAstNode[], empty: TmplAstForLoopBlockEmpty | null, sourceSpan: ParseSourceSpan, startSourceSpan: ParseSourceSpan, endSourceSpan: ParseSourceSpan | null);
4842
+ constructor(itemName: string, expression: ASTWithSource, trackBy: ASTWithSource, contextVariables: ForLoopBlockContext | null, children: TmplAstNode[], empty: TmplAstForLoopBlockEmpty | null, sourceSpan: ParseSourceSpan, startSourceSpan: ParseSourceSpan, endSourceSpan: ParseSourceSpan | null);
4811
4843
  visit<Result>(visitor: Visitor_3<Result>): Result;
4812
4844
  }
4813
4845
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@angular/compiler",
3
- "version": "17.0.0-next.0",
3
+ "version": "17.0.0-next.2",
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.0"
14
+ "@angular/core": "17.0.0-next.2"
15
15
  },
16
16
  "peerDependenciesMeta": {
17
17
  "@angular/core": {
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license Angular v17.0.0-next.0
2
+ * @license Angular v17.0.0-next.2
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=