@itwin/core-common 3.3.0-dev.50 → 3.3.0-dev.53

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 (49) hide show
  1. package/lib/cjs/ColorDef.d.ts +2 -0
  2. package/lib/cjs/ColorDef.d.ts.map +1 -1
  3. package/lib/cjs/ColorDef.js +4 -0
  4. package/lib/cjs/ColorDef.js.map +1 -1
  5. package/lib/cjs/DisplayStyleSettings.d.ts +56 -55
  6. package/lib/cjs/DisplayStyleSettings.d.ts.map +1 -1
  7. package/lib/cjs/DisplayStyleSettings.js +23 -26
  8. package/lib/cjs/DisplayStyleSettings.js.map +1 -1
  9. package/lib/cjs/FeatureIndex.d.ts +0 -1
  10. package/lib/cjs/FeatureIndex.d.ts.map +1 -1
  11. package/lib/cjs/FeatureIndex.js +0 -1
  12. package/lib/cjs/FeatureIndex.js.map +1 -1
  13. package/lib/cjs/FeatureTable.d.ts +6 -2
  14. package/lib/cjs/FeatureTable.d.ts.map +1 -1
  15. package/lib/cjs/FeatureTable.js +26 -6
  16. package/lib/cjs/FeatureTable.js.map +1 -1
  17. package/lib/cjs/RenderSchedule.d.ts +65 -7
  18. package/lib/cjs/RenderSchedule.d.ts.map +1 -1
  19. package/lib/cjs/RenderSchedule.js +227 -7
  20. package/lib/cjs/RenderSchedule.js.map +1 -1
  21. package/lib/cjs/RgbColor.d.ts +1 -0
  22. package/lib/cjs/RgbColor.d.ts.map +1 -1
  23. package/lib/cjs/RgbColor.js +4 -0
  24. package/lib/cjs/RgbColor.js.map +1 -1
  25. package/lib/esm/ColorDef.d.ts +2 -0
  26. package/lib/esm/ColorDef.d.ts.map +1 -1
  27. package/lib/esm/ColorDef.js +4 -0
  28. package/lib/esm/ColorDef.js.map +1 -1
  29. package/lib/esm/DisplayStyleSettings.d.ts +56 -55
  30. package/lib/esm/DisplayStyleSettings.d.ts.map +1 -1
  31. package/lib/esm/DisplayStyleSettings.js +23 -26
  32. package/lib/esm/DisplayStyleSettings.js.map +1 -1
  33. package/lib/esm/FeatureIndex.d.ts +0 -1
  34. package/lib/esm/FeatureIndex.d.ts.map +1 -1
  35. package/lib/esm/FeatureIndex.js +0 -1
  36. package/lib/esm/FeatureIndex.js.map +1 -1
  37. package/lib/esm/FeatureTable.d.ts +6 -2
  38. package/lib/esm/FeatureTable.d.ts.map +1 -1
  39. package/lib/esm/FeatureTable.js +26 -6
  40. package/lib/esm/FeatureTable.js.map +1 -1
  41. package/lib/esm/RenderSchedule.d.ts +65 -7
  42. package/lib/esm/RenderSchedule.d.ts.map +1 -1
  43. package/lib/esm/RenderSchedule.js +228 -8
  44. package/lib/esm/RenderSchedule.js.map +1 -1
  45. package/lib/esm/RgbColor.d.ts +1 -0
  46. package/lib/esm/RgbColor.d.ts.map +1 -1
  47. package/lib/esm/RgbColor.js +4 -0
  48. package/lib/esm/RgbColor.js.map +1 -1
  49. package/package.json +7 -7
@@ -18,6 +18,22 @@ function interpolate(start, end, fraction) {
18
18
  function interpolateRgb(start, end, fraction) {
19
19
  return new RgbColor_1.RgbColor(interpolate(start.r, end.r, fraction), interpolate(start.g, end.g, fraction), interpolate(start.b, end.b, fraction));
20
20
  }
21
+ function compareXYZ(lhs, rhs) {
22
+ return (0, core_bentley_1.compareNumbers)(lhs.x, rhs.x) || (0, core_bentley_1.compareNumbers)(lhs.y, rhs.y) || (0, core_bentley_1.compareNumbers)(lhs.z, rhs.z);
23
+ }
24
+ function compare4d(lhs, rhs) {
25
+ return (0, core_bentley_1.compareNumbers)(lhs.x, rhs.x) || (0, core_bentley_1.compareNumbers)(lhs.y, rhs.y) || (0, core_bentley_1.compareNumbers)(lhs.z, rhs.z) || (0, core_bentley_1.compareNumbers)(lhs.w, rhs.w);
26
+ }
27
+ const scratchVec3a = new core_geometry_1.Vector3d();
28
+ const scratchVec3b = new core_geometry_1.Vector3d();
29
+ function compareMatrices(lhs, rhs) {
30
+ return compareXYZ(lhs.columnX(scratchVec3a), rhs.columnX(scratchVec3b))
31
+ || compareXYZ(lhs.columnY(scratchVec3a), rhs.columnY(scratchVec3b))
32
+ || compareXYZ(lhs.columnZ(scratchVec3a), rhs.columnZ(scratchVec3b));
33
+ }
34
+ function compareDurations(lhs, rhs) {
35
+ return (0, core_bentley_1.compareNumbers)(lhs.low, rhs.low) || (0, core_bentley_1.compareNumbers)(lhs.high, rhs.high);
36
+ }
21
37
  /** Namespace containing types that collectively define a script that animates the contents of a view by adjusting the visibility, position,
22
38
  * and/or symbology of groups of elements over time. A [[RenderSchedule.Script]] is hosted by a [RenderTimeline]($backend) element. The script
23
39
  * can be associated with a [DisplayStyleState]($frontend) by way of its [[DisplayStyleSettings.renderTimeline]] property.
@@ -57,6 +73,12 @@ var RenderSchedule;
57
73
  props.interpolation = this.interpolation;
58
74
  return props;
59
75
  }
76
+ compareTo(other) {
77
+ return (0, core_bentley_1.compareNumbers)(this.interpolation, other.interpolation) || (0, core_bentley_1.compareNumbers)(this.time, other.time);
78
+ }
79
+ equals(other) {
80
+ return 0 === this.compareTo(other);
81
+ }
60
82
  }
61
83
  RenderSchedule.TimelineEntry = TimelineEntry;
62
84
  /** A timeline entry that controls the visibility of the associated geometry. */
@@ -74,6 +96,10 @@ var RenderSchedule;
74
96
  props.value = this.value;
75
97
  return props;
76
98
  }
99
+ compareTo(other) {
100
+ (0, core_bentley_1.assert)(other instanceof VisibilityEntry);
101
+ return super.compareTo(other) || (0, core_bentley_1.compareNumbers)(this.value, other.value);
102
+ }
77
103
  }
78
104
  RenderSchedule.VisibilityEntry = VisibilityEntry;
79
105
  /** A timeline entry controlling the color of the affected geometry. */
@@ -94,6 +120,10 @@ var RenderSchedule;
94
120
  }
95
121
  return props;
96
122
  }
123
+ compareTo(other) {
124
+ (0, core_bentley_1.assert)(other instanceof ColorEntry);
125
+ return super.compareTo(other) || (0, core_bentley_1.comparePossiblyUndefined)((lhs, rhs) => lhs.compareTo(rhs), this.value, other.value);
126
+ }
97
127
  }
98
128
  RenderSchedule.ColorEntry = ColorEntry;
99
129
  /** Describes the components of a [[RenderSchedule.TransformEntry]] as a rotation around a pivot point followed by a translation. */
@@ -116,6 +146,12 @@ var RenderSchedule;
116
146
  orientation: [this.orientation.x, this.orientation.y, this.orientation.z, this.orientation.w],
117
147
  };
118
148
  }
149
+ compareTo(other) {
150
+ return compareXYZ(this.pivot, other.pivot) || compareXYZ(this.position, other.position) || compare4d(this.orientation, other.orientation);
151
+ }
152
+ equals(other) {
153
+ return this.pivot.isAlmostEqual(other.pivot) && this.position.isAlmostEqual(other.position) && this.orientation.isAlmostEqual(other.orientation);
154
+ }
119
155
  }
120
156
  RenderSchedule.TransformComponents = TransformComponents;
121
157
  /** A timeline entry that applies rotation, scaling, and/or translation to the affected geometry. */
@@ -137,6 +173,18 @@ var RenderSchedule;
137
173
  }
138
174
  return props;
139
175
  }
176
+ compareTo(other) {
177
+ (0, core_bentley_1.assert)(other instanceof TransformEntry);
178
+ const cmp = super.compareTo(other);
179
+ if (0 !== cmp)
180
+ return cmp;
181
+ if (this.components || other.components) {
182
+ if (!this.components || !other.components)
183
+ return this.components ? 1 : -1;
184
+ return this.components.compareTo(other.components);
185
+ }
186
+ return compareXYZ(this.value.origin, other.value.origin) || compareMatrices(this.value.matrix, other.value.matrix);
187
+ }
140
188
  }
141
189
  RenderSchedule.TransformEntry = TransformEntry;
142
190
  /** Defines a [ClipPlane]($core-geometry) associated with a [[RenderSchedule.CuttingPlaneEntry]]. */
@@ -158,6 +206,12 @@ var RenderSchedule;
158
206
  props.hidden = true;
159
207
  return props;
160
208
  }
209
+ compareTo(other) {
210
+ return compareXYZ(this.position, other.position) || compareXYZ(this.direction, other.direction) || (0, core_bentley_1.compareBooleans)(this.visible, other.visible) || (0, core_bentley_1.compareBooleans)(this.hidden, other.hidden);
211
+ }
212
+ equals(other) {
213
+ return 0 === this.compareTo(other);
214
+ }
161
215
  }
162
216
  RenderSchedule.CuttingPlane = CuttingPlane;
163
217
  /** A timeline entry that applies a [ClipPlane]($core-geometry) to the affected geometry. */
@@ -173,6 +227,10 @@ var RenderSchedule;
173
227
  props.value = this.value.toJSON();
174
228
  return props;
175
229
  }
230
+ compareTo(other) {
231
+ (0, core_bentley_1.assert)(other instanceof CuttingPlaneEntry);
232
+ return super.compareTo(other) || (0, core_bentley_1.comparePossiblyUndefined)((x, y) => x.compareTo(y), this.value, other.value);
233
+ }
176
234
  }
177
235
  RenderSchedule.CuttingPlaneEntry = CuttingPlaneEntry;
178
236
  /** Identifies a fractional position along a [[RenderSchedule.Timeline]] between any two [[RenderSchedule.TimelineEntry]]'s within a [[RenderSchedule.TimelineEntryList]].
@@ -223,6 +281,18 @@ var RenderSchedule;
223
281
  toJSON() {
224
282
  return this._entries.map((x) => x.toJSON());
225
283
  }
284
+ compareTo(other) {
285
+ let cmp = (0, core_bentley_1.compareNumbers)(this._entries.length, other._entries.length) || compareDurations(this.duration, other.duration);
286
+ if (0 === cmp) {
287
+ for (let i = 0; i < this.length; i++)
288
+ if (0 !== (cmp = this._entries[i].compareTo(other._entries[i])))
289
+ break;
290
+ }
291
+ return cmp;
292
+ }
293
+ equals(other) {
294
+ return 0 === this.compareTo(other);
295
+ }
226
296
  /** @internal */
227
297
  findInterval(time, interval) {
228
298
  if (this.length === 0)
@@ -306,6 +376,25 @@ var RenderSchedule;
306
376
  cuttingPlaneTimeline: (_d = this.cuttingPlane) === null || _d === void 0 ? void 0 : _d.toJSON(),
307
377
  };
308
378
  }
379
+ compareTo(other) {
380
+ const cmp = compareDurations(this.duration, other.duration);
381
+ if (0 !== cmp)
382
+ return cmp;
383
+ // Do cheaper checks before iterating through timeline entries
384
+ if (!!this.visibility !== !!other.visibility)
385
+ return this.visibility ? 1 : -1;
386
+ else if (!!this.color !== !!other.color)
387
+ return this.color ? 1 : -1;
388
+ else if (!!this.transform !== !!other.transform)
389
+ return this.transform ? 1 : -1;
390
+ else if (!!this.cuttingPlane !== !!other.cuttingPlane)
391
+ return this.cuttingPlane ? 1 : -1;
392
+ return (0, core_bentley_1.comparePossiblyUndefined)((x, y) => x.compareTo(y), this.visibility, other.visibility) || (0, core_bentley_1.comparePossiblyUndefined)((x, y) => x.compareTo(y), this.color, other.color)
393
+ || (0, core_bentley_1.comparePossiblyUndefined)((x, y) => x.compareTo(y), this.transform, other.transform) || (0, core_bentley_1.comparePossiblyUndefined)((x, y) => x.compareTo(y), this.cuttingPlane, other.cuttingPlane);
394
+ }
395
+ equals(other) {
396
+ return 0 === this.compareTo(other);
397
+ }
309
398
  /** Get the visibility of the geometry at the specified time point. */
310
399
  getVisibility(time) {
311
400
  var _a, _b;
@@ -422,6 +511,38 @@ var RenderSchedule;
422
511
  elementIds: this._elementIds,
423
512
  };
424
513
  }
514
+ get containsElementIds() {
515
+ return this._elementIds.length > 0;
516
+ }
517
+ compareElementIds(other) {
518
+ if (typeof this._elementIds === typeof other._elementIds) {
519
+ const cmp = (0, core_bentley_1.compareNumbers)(this._elementIds.length, other._elementIds.length);
520
+ if (0 !== cmp)
521
+ return cmp;
522
+ if (typeof this._elementIds === "string") {
523
+ (0, core_bentley_1.assert)(typeof other._elementIds === "string");
524
+ return (0, core_bentley_1.compareStrings)(this._elementIds, other._elementIds);
525
+ }
526
+ }
527
+ // One or both are stored as arrays, in which case they might contain the same Ids in different orders. We will consider them different in that case.
528
+ const mine = this.elementIds[Symbol.iterator]();
529
+ const theirs = other.elementIds[Symbol.iterator]();
530
+ while (true) {
531
+ const a = mine.next();
532
+ const b = theirs.next();
533
+ if (a.done !== b.done)
534
+ return (0, core_bentley_1.compareBooleans)(!!a.done, !!b.done);
535
+ else if (a.done)
536
+ return 0;
537
+ const cmp = (0, core_bentley_1.compareStrings)(a.value, b.value);
538
+ if (0 !== cmp)
539
+ return cmp;
540
+ }
541
+ }
542
+ compareTo(other) {
543
+ (0, core_bentley_1.assert)(other instanceof ElementTimeline);
544
+ return (0, core_bentley_1.compareNumbers)(this.batchId, other.batchId) || this.compareElementIds(other) || super.compareTo(other);
545
+ }
425
546
  /** @internal */
426
547
  static getElementIds(ids) {
427
548
  if (typeof ids === "string")
@@ -471,6 +592,8 @@ var RenderSchedule;
471
592
  class ModelTimeline extends Timeline {
472
593
  constructor(props) {
473
594
  super(props);
595
+ /** Tile tree suppliers perform **very** frequent ordered comparisons of ModelTimelines. They need to be fast. */
596
+ this._cachedComparisons = new WeakMap();
474
597
  this.modelId = props.modelId;
475
598
  this.realityModelUrl = props.realityModelUrl;
476
599
  this.containsModelClipping = undefined !== this.cuttingPlane;
@@ -479,6 +602,7 @@ var RenderSchedule;
479
602
  let containsTransform = false;
480
603
  const transformBatchIds = [];
481
604
  const elementTimelines = [];
605
+ let containsElementIds = false;
482
606
  for (const elProps of props.elementTimelines) {
483
607
  const el = ElementTimeline.fromJSON(elProps);
484
608
  elementTimelines.push(el);
@@ -490,9 +614,11 @@ var RenderSchedule;
490
614
  }
491
615
  containsFeatureOverrides || (containsFeatureOverrides = el.containsFeatureOverrides);
492
616
  requiresBatching || (requiresBatching = el.requiresBatching);
617
+ containsElementIds = containsElementIds || el.containsElementIds;
493
618
  }
494
619
  this.elementTimelines = elementTimelines;
495
620
  this.transformBatchIds = transformBatchIds;
621
+ this.omitsElementIds = elementTimelines.length > 0 && !containsElementIds;
496
622
  this.containsFeatureOverrides = containsFeatureOverrides;
497
623
  this.requiresBatching = requiresBatching;
498
624
  this.containsTransform = containsTransform;
@@ -508,6 +634,26 @@ var RenderSchedule;
508
634
  elementTimelines: this.elementTimelines.map((x) => x.toJSON()),
509
635
  };
510
636
  }
637
+ compareTo(other) {
638
+ if (this === other)
639
+ return 0;
640
+ const cached = this._cachedComparisons.get(other);
641
+ if (undefined !== cached)
642
+ return cached;
643
+ (0, core_bentley_1.assert)(other instanceof ModelTimeline);
644
+ let cmp = (0, core_bentley_1.compareStrings)(this.modelId, other.modelId) || (0, core_bentley_1.compareStringsOrUndefined)(this.realityModelUrl, other.realityModelUrl)
645
+ || (0, core_bentley_1.compareNumbers)(this.elementTimelines.length, other.elementTimelines.length) || (0, core_bentley_1.compareBooleans)(this.containsFeatureOverrides, other.containsFeatureOverrides)
646
+ || (0, core_bentley_1.compareBooleans)(this.containsModelClipping, other.containsModelClipping) || (0, core_bentley_1.compareBooleans)(this.containsTransform, other.containsTransform)
647
+ || super.compareTo(other);
648
+ if (0 === cmp) {
649
+ for (let i = 0; i < this.elementTimelines.length; i++)
650
+ if (0 !== (cmp = this.elementTimelines[i].compareTo(other.elementTimelines[i])))
651
+ break;
652
+ }
653
+ this._cachedComparisons.set(other, cmp);
654
+ other._cachedComparisons.set(this, -cmp);
655
+ return cmp;
656
+ }
511
657
  /** Look up the element timeline with the specified batch Id. */
512
658
  findByBatchId(batchId) {
513
659
  return this.elementTimelines.find((x) => x.batchId === batchId);
@@ -525,6 +671,43 @@ var RenderSchedule;
525
671
  var _a;
526
672
  return (_a = this.findByBatchId(batchId)) === null || _a === void 0 ? void 0 : _a.getAnimationTransform(time);
527
673
  }
674
+ /** Get the highest batchId of any ElementTimeline in this timeline. */
675
+ get maxBatchId() {
676
+ if (undefined === this._maxBatchId) {
677
+ this._maxBatchId = 0;
678
+ for (const elem of this.elementTimelines)
679
+ this._maxBatchId = Math.max(this._maxBatchId, elem.batchId);
680
+ }
681
+ return this._maxBatchId;
682
+ }
683
+ /** Given the two halves of an [Id64]($bentley) return the [[ElementTimeline]] containing the corresponding element.
684
+ * @note The first call to this method populates a mapping for fast lookup.
685
+ * @alpha
686
+ */
687
+ getTimelineForElement(idLo, idHi) {
688
+ if (!this._idPairToElementTimeline) {
689
+ this._idPairToElementTimeline = new core_bentley_1.Id64.Uint32Map();
690
+ for (const timeline of this.elementTimelines) {
691
+ for (const elementId of timeline.elementIds) {
692
+ // NB: a malformed script may place the same element Id into multiple timelines. We're not going to check for such data errors here.
693
+ this._idPairToElementTimeline.setById(elementId, timeline);
694
+ }
695
+ }
696
+ }
697
+ return this._idPairToElementTimeline.get(idLo, idHi);
698
+ }
699
+ /** The batch Ids of the subset of [[elementTimelines]] that apply a transform and/or cutting plane.
700
+ * @alpha
701
+ */
702
+ get discreteBatchIds() {
703
+ if (!this._discreteBatchIds) {
704
+ this._discreteBatchIds = new Set(this.transformBatchIds);
705
+ for (const timeline of this.elementTimelines)
706
+ if (!timeline.containsTransform && undefined !== timeline.cuttingPlane)
707
+ this._discreteBatchIds.add(timeline.batchId);
708
+ }
709
+ return this._discreteBatchIds;
710
+ }
528
711
  }
529
712
  RenderSchedule.ModelTimeline = ModelTimeline;
530
713
  /** Specifies how to animate the contents of a [ViewState]($frontend) over time. The script contains any number of [[RenderSchedule.ModelTimeline]]s, each describing how
@@ -536,6 +719,8 @@ var RenderSchedule;
536
719
  */
537
720
  class Script {
538
721
  constructor(props) {
722
+ /** Tile tree references perform **very** frequent ordered comparisons of Scripts. They need to be fast. */
723
+ this._cachedComparisons = new WeakMap();
539
724
  this.duration = core_geometry_1.Range1d.createNull();
540
725
  const transformBatchIds = new Set();
541
726
  const modelTimelines = [];
@@ -561,6 +746,27 @@ var RenderSchedule;
561
746
  this.containsFeatureOverrides = containsFeatureOverrides;
562
747
  this.transformBatchIds = transformBatchIds;
563
748
  }
749
+ compareTo(other) {
750
+ if (this === other)
751
+ return 0;
752
+ const cached = this._cachedComparisons.get(other);
753
+ if (undefined !== cached)
754
+ return cached;
755
+ let cmp = (0, core_bentley_1.compareNumbers)(this.modelTimelines.length, other.modelTimelines.length) || (0, core_bentley_1.compareBooleans)(this.containsModelClipping, other.containsModelClipping)
756
+ || (0, core_bentley_1.compareBooleans)(this.requiresBatching, other.requiresBatching) || (0, core_bentley_1.compareBooleans)(this.containsTransform, other.containsTransform)
757
+ || (0, core_bentley_1.compareBooleans)(this.containsFeatureOverrides, other.containsFeatureOverrides) || compareDurations(this.duration, other.duration);
758
+ if (0 === cmp) {
759
+ for (let i = 0; i < this.modelTimelines.length; i++)
760
+ if (0 !== (cmp = this.modelTimelines[i].compareTo(other.modelTimelines[i])))
761
+ break;
762
+ }
763
+ this._cachedComparisons.set(other, cmp);
764
+ other._cachedComparisons.set(this, -cmp);
765
+ return cmp;
766
+ }
767
+ equals(other) {
768
+ return 0 === this.compareTo(other);
769
+ }
564
770
  static fromJSON(props) {
565
771
  if (!Array.isArray(props) || props.length === 0)
566
772
  return undefined;
@@ -599,17 +805,31 @@ var RenderSchedule;
599
805
  ids.add(id);
600
806
  }
601
807
  }
808
+ /** @internal */
809
+ modelRequiresBatching(modelId) {
810
+ // Only if the script contains animation (cutting plane, transform or visibility by node ID) do we require separate tilesets for animations.
811
+ return this.requiresBatching && this.modelTimelines.some((x) => x.modelId === modelId && x.requiresBatching);
812
+ }
602
813
  }
603
814
  RenderSchedule.Script = Script;
604
- /** A reference to a [[RenderSchedule.Script]] indicating the persistent [Element]($backend) from which the script was obtained.
605
- * Prior to the introduction of the [RenderTimeline]($backend) class in version 01.00.13 of the BisCore ECSchema, scripts were
606
- * stored in the JSON properties of [DisplayStyle]($backend) elements. Now they are stored in the Script property of a RenderTimeline element.
607
- * The `sourceId` can refer to either a DisplayStyle or a RenderTimeline.
815
+ /** A reference to a [[RenderSchedule.Script]], optionally identifying the source of the script.
816
+ * @see [DisplayStyle.loadScheduleScript]($backend) and [DisplayStyleState.scheduleScript]($frontend) to obtain the script reference for a display style on the frontend
817
+ * and backend respectively.
818
+ * @see [DisplayStyleState.scheduleScript]($frontend) or [DisplayStyleState.changeRenderTimeline]($frontend) to change a display style's script on the frontend.
608
819
  */
609
820
  class ScriptReference {
610
- constructor(sourceId, script) {
611
- this.sourceId = sourceId;
612
- this.script = script;
821
+ /** @internal Use one of the public constructor overloads which forward to this one. */
822
+ constructor(sourceIdOrScript, scriptIfSourceId) {
823
+ if (typeof sourceIdOrScript === "string") {
824
+ (0, core_bentley_1.assert)(scriptIfSourceId instanceof Script);
825
+ this.sourceId = sourceIdOrScript;
826
+ this.script = scriptIfSourceId;
827
+ }
828
+ else {
829
+ (0, core_bentley_1.assert)(undefined === scriptIfSourceId);
830
+ this.script = sourceIdOrScript;
831
+ this.sourceId = core_bentley_1.Id64.invalid;
832
+ }
613
833
  }
614
834
  }
615
835
  RenderSchedule.ScriptReference = ScriptReference;