@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.
- package/esm2022/src/compiler.mjs +2 -2
- package/esm2022/src/output/abstract_emitter.mjs +1 -1
- package/esm2022/src/output/abstract_js_emitter.mjs +25 -1
- package/esm2022/src/output/output_ast.mjs +44 -1
- package/esm2022/src/render3/partial/class_metadata.mjs +1 -1
- package/esm2022/src/render3/partial/directive.mjs +9 -4
- package/esm2022/src/render3/partial/factory.mjs +1 -1
- package/esm2022/src/render3/partial/injectable.mjs +1 -1
- package/esm2022/src/render3/partial/injector.mjs +1 -1
- package/esm2022/src/render3/partial/ng_module.mjs +1 -1
- package/esm2022/src/render3/partial/pipe.mjs +1 -1
- package/esm2022/src/render3/r3_ast.mjs +3 -4
- package/esm2022/src/render3/r3_control_flow.mjs +68 -25
- package/esm2022/src/render3/r3_identifiers.mjs +6 -1
- package/esm2022/src/render3/view/compiler.mjs +26 -9
- package/esm2022/src/render3/view/template.mjs +272 -36
- package/esm2022/src/render3/view/util.mjs +5 -2
- package/esm2022/src/template/pipeline/ir/src/enums.mjs +41 -17
- package/esm2022/src/template/pipeline/ir/src/expression.mjs +69 -2
- package/esm2022/src/template/pipeline/ir/src/operations.mjs +13 -1
- package/esm2022/src/template/pipeline/ir/src/ops/create.mjs +46 -25
- package/esm2022/src/template/pipeline/ir/src/ops/host.mjs +3 -2
- package/esm2022/src/template/pipeline/ir/src/ops/update.mjs +18 -2
- package/esm2022/src/template/pipeline/src/compilation.mjs +107 -87
- package/esm2022/src/template/pipeline/src/emit.mjs +69 -72
- package/esm2022/src/template/pipeline/src/ingest.mjs +93 -58
- package/esm2022/src/template/pipeline/src/instruction.mjs +27 -9
- package/esm2022/src/template/pipeline/src/phases/align_pipe_variadic_var_offset.mjs +4 -4
- package/esm2022/src/template/pipeline/src/phases/any_cast.mjs +4 -4
- package/esm2022/src/template/pipeline/src/phases/attribute_extraction.mjs +34 -12
- package/esm2022/src/template/pipeline/src/phases/binding_specialization.mjs +4 -5
- package/esm2022/src/template/pipeline/src/phases/chaining.mjs +4 -1
- package/esm2022/src/template/pipeline/src/phases/conditionals.mjs +44 -0
- package/esm2022/src/template/pipeline/src/phases/const_collection.mjs +49 -13
- package/esm2022/src/template/pipeline/src/phases/empty_elements.mjs +5 -4
- package/esm2022/src/template/pipeline/src/phases/generate_advance.mjs +5 -5
- package/esm2022/src/template/pipeline/src/phases/generate_i18n_blocks.mjs +38 -0
- package/esm2022/src/template/pipeline/src/phases/generate_variables.mjs +3 -3
- package/esm2022/src/template/pipeline/src/phases/host_style_property_parsing.mjs +10 -4
- package/esm2022/src/template/pipeline/src/phases/i18n_message_extraction.mjs +108 -0
- package/esm2022/src/template/pipeline/src/phases/i18n_text_extraction.mjs +32 -0
- package/esm2022/src/template/pipeline/src/phases/local_refs.mjs +5 -5
- package/esm2022/src/template/pipeline/src/phases/namespace.mjs +3 -3
- package/esm2022/src/template/pipeline/src/phases/naming.mjs +19 -14
- package/esm2022/src/template/pipeline/src/phases/next_context_merging.mjs +5 -5
- package/esm2022/src/template/pipeline/src/phases/ng_container.mjs +4 -4
- package/esm2022/src/template/pipeline/src/phases/nonbindable.mjs +3 -3
- package/esm2022/src/template/pipeline/src/phases/ordering.mjs +97 -0
- package/esm2022/src/template/pipeline/src/phases/parse_extracted_styles.mjs +3 -3
- package/esm2022/src/template/pipeline/src/phases/pipe_creation.mjs +9 -9
- package/esm2022/src/template/pipeline/src/phases/pipe_variadic.mjs +4 -4
- package/esm2022/src/template/pipeline/src/phases/reify.mjs +31 -3
- package/esm2022/src/template/pipeline/src/phases/resolve_dollar_event.mjs +6 -6
- package/esm2022/src/template/pipeline/src/phases/resolve_i18n_placeholders.mjs +63 -0
- package/esm2022/src/template/pipeline/src/phases/resolve_sanitizers.mjs +5 -5
- package/esm2022/src/template/pipeline/src/phases/save_restore_view.mjs +8 -8
- package/esm2022/src/template/pipeline/src/phases/slot_allocation.mjs +8 -8
- package/esm2022/src/template/pipeline/src/phases/var_counting.mjs +3 -3
- package/esm2022/src/template/pipeline/src/util/elements.mjs +3 -3
- package/esm2022/src/version.mjs +1 -1
- package/fesm2022/compiler.mjs +10290 -9380
- package/fesm2022/compiler.mjs.map +1 -1
- package/fesm2022/testing.mjs +1 -1
- package/index.d.ts +36 -4
- package/package.json +2 -2
- package/testing/index.d.ts +1 -1
- package/esm2022/src/template/pipeline/src/phases/property_ordering.mjs +0 -99
package/fesm2022/testing.mjs
CHANGED
package/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @license Angular v17.0.0-next.
|
|
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:
|
|
4804
|
-
trackBy:
|
|
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:
|
|
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.
|
|
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.
|
|
14
|
+
"@angular/core": "17.0.0-next.2"
|
|
15
15
|
},
|
|
16
16
|
"peerDependenciesMeta": {
|
|
17
17
|
"@angular/core": {
|
package/testing/index.d.ts
CHANGED
|
@@ -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=
|