uicore-ts 1.1.185 → 1.1.188
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/compiledScripts/UIAutocompleteTextField.js +7 -6
- package/compiledScripts/UIAutocompleteTextField.js.map +2 -2
- package/compiledScripts/UIRectangle.js +16 -12
- package/compiledScripts/UIRectangle.js.map +2 -2
- package/compiledScripts/UIView.d.ts +4 -1
- package/compiledScripts/UIView.js +11 -2
- package/compiledScripts/UIView.js.map +2 -2
- package/package.json +1 -1
- package/scripts/UIAutocompleteTextField.ts +8 -7
- package/scripts/UIRectangle.ts +32 -25
- package/scripts/UIView.ts +22 -7
|
@@ -50,7 +50,8 @@ const _UIAutocompleteTextField = class extends import_UITextField.UITextField {
|
|
|
50
50
|
this.openDropdown();
|
|
51
51
|
}
|
|
52
52
|
});
|
|
53
|
-
this.textElementView.addTargetForControlEvent(import_UIView.UIView.controlEvent.DownArrowDown, () => {
|
|
53
|
+
this.textElementView.addTargetForControlEvent(import_UIView.UIView.controlEvent.DownArrowDown, (sender, event) => {
|
|
54
|
+
event.preventDefault();
|
|
54
55
|
if (!this._isDropdownOpen) {
|
|
55
56
|
this.openDropdown();
|
|
56
57
|
return;
|
|
@@ -60,7 +61,8 @@ const _UIAutocompleteTextField = class extends import_UITextField.UITextField {
|
|
|
60
61
|
this._dropdownView.highlightedRowIndex = this._dropdownView.highlightedRowIndex + 1;
|
|
61
62
|
}
|
|
62
63
|
});
|
|
63
|
-
this.textElementView.addTargetForControlEvent(import_UIView.UIView.controlEvent.UpArrowDown, () => {
|
|
64
|
+
this.textElementView.addTargetForControlEvent(import_UIView.UIView.controlEvent.UpArrowDown, (sender, event) => {
|
|
65
|
+
event.preventDefault();
|
|
64
66
|
if (this._dropdownView.highlightedRowIndex > 0) {
|
|
65
67
|
this._dropdownView.highlightedRowIndex = this._dropdownView.highlightedRowIndex - 1;
|
|
66
68
|
}
|
|
@@ -134,21 +136,20 @@ const _UIAutocompleteTextField = class extends import_UITextField.UITextField {
|
|
|
134
136
|
}
|
|
135
137
|
const isExactSingleMatch = filtered.length === 1 && filtered[0].label.toLowerCase() === filterText;
|
|
136
138
|
this._dropdownView.filteredItems = isExactSingleMatch ? [] : filtered;
|
|
139
|
+
if (this._dropdownView.filteredItems.length > 0) {
|
|
140
|
+
this._dropdownView.highlightedRowIndex = 0;
|
|
141
|
+
}
|
|
137
142
|
if (this._isDropdownOpen) {
|
|
138
143
|
this._dropdownView.showAnchoredToView(this);
|
|
139
144
|
}
|
|
140
145
|
}
|
|
141
146
|
openDropdown() {
|
|
142
|
-
var _a;
|
|
143
147
|
if (this._isDropdownOpen) {
|
|
144
148
|
return;
|
|
145
149
|
}
|
|
146
150
|
this._isDropdownOpen = import_UIObject.YES;
|
|
147
151
|
this.updateFilteredItems();
|
|
148
152
|
this._dropdownView.showAnchoredToView(this);
|
|
149
|
-
if ((_a = this._dropdownView.filteredItems) == null ? void 0 : _a.length) {
|
|
150
|
-
this._dropdownView.highlightedRowIndex = 0;
|
|
151
|
-
}
|
|
152
153
|
}
|
|
153
154
|
closeDropdown() {
|
|
154
155
|
if (!this._isDropdownOpen) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../scripts/UIAutocompleteTextField.ts"],
|
|
4
|
-
"sourcesContent": ["
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;
|
|
4
|
+
"sourcesContent": ["import { UIAutocompleteDropdownView } from \"./UIAutocompleteDropdownView\"\nimport { UIAutocompleteItem } from \"./UIAutocompleteRowView\"\nimport { IS, IS_NOT, NO, YES } from \"./UIObject\"\nimport { UITextField } from \"./UITextField\"\nimport { UIView, UIViewAddControlEventTargetObject } from \"./UIView\"\n\n\nexport class UIAutocompleteTextField<T = string> extends UITextField {\n \n _autocompleteItems: UIAutocompleteItem<T>[] = []\n _selectedItem?: UIAutocompleteItem<T>\n _dropdownView: UIAutocompleteDropdownView<T>\n _isDropdownOpen: boolean = NO\n _strictSelection: boolean = NO\n _isValid: boolean = YES\n \n \n static override controlEvent = Object.assign({}, UITextField.controlEvent, {\n \"SelectionDidChange\": \"SelectionDidChange\"\n })\n \n override get controlEventTargetAccumulator(): UIViewAddControlEventTargetObject<typeof UIAutocompleteTextField> {\n return (super.controlEventTargetAccumulator as any)\n }\n \n \n constructor(elementID?: string) {\n \n super(elementID)\n \n this._dropdownView = this.newDropdownView()\n \n this._dropdownView.didSelectItem = (item) => {\n this.commitSelection(item)\n }\n \n // Open dropdown on focus\n this.controlEventTargetAccumulator.Focus = () => {\n this.openDropdown()\n this.textElementView.viewHTMLElement.select()\n }\n \n // Close on blur\n this.controlEventTargetAccumulator.Blur = () => {\n this.closeDropdown()\n }\n \n // Filter on text change\n this.addTargetForControlEvent(UITextField.controlEvent.TextChange, () => {\n this._selectedItem = undefined\n this.updateFilteredItems()\n if (!this._isDropdownOpen) {\n this.openDropdown()\n }\n })\n \n // Keyboard navigation: down arrow\n this.textElementView.addTargetForControlEvent(UIView.controlEvent.DownArrowDown, (sender, event) => {\n event.preventDefault()\n if (!this._isDropdownOpen) {\n this.openDropdown()\n return\n }\n const maxIndex = this._dropdownView.filteredItems.length - 1\n if (this._dropdownView.highlightedRowIndex < maxIndex) {\n this._dropdownView.highlightedRowIndex = this._dropdownView.highlightedRowIndex + 1\n }\n })\n \n // Keyboard navigation: up arrow\n this.textElementView.addTargetForControlEvent(UIView.controlEvent.UpArrowDown, (sender, event) => {\n event.preventDefault()\n if (this._dropdownView.highlightedRowIndex > 0) {\n this._dropdownView.highlightedRowIndex = this._dropdownView.highlightedRowIndex - 1\n }\n })\n \n // Enter: commit focused item\n this.addTargetForControlEvent(UIView.controlEvent.EnterDown, () => {\n const highlightedItem = this._dropdownView.highlightedItem\n if (IS(highlightedItem)) {\n this.commitSelection(highlightedItem)\n }\n else if (this._isDropdownOpen) {\n this.closeDropdown()\n }\n })\n \n // Escape: dismiss dropdown\n this.addTargetForControlEvent(UIView.controlEvent.EscDown, () => {\n if (this._isDropdownOpen) {\n this.closeDropdown()\n }\n })\n \n }\n \n \n /** Override in subclass to provide a custom dropdown view. */\n newDropdownView(): UIAutocompleteDropdownView<T> {\n return new UIAutocompleteDropdownView<T>(\n this.elementID ? this.elementID + \"Dropdown\" : undefined\n )\n }\n \n \n // MARK: - Selection\n \n get selectedItem(): T | undefined {\n return this._selectedItem?.value\n }\n \n \n get strictSelection(): boolean {\n return this._strictSelection\n }\n \n set strictSelection(strict: boolean) {\n this._strictSelection = strict\n this.updateValidationVisuals()\n }\n \n \n commitSelection(item: UIAutocompleteItem<T>) {\n \n this._selectedItem = item\n this.text = item.label\n this.closeDropdown()\n this.updateValidationVisuals()\n this.sendControlEventForKey(UIAutocompleteTextField.controlEvent.SelectionDidChange)\n \n }\n \n \n // MARK: - Data\n \n /** Convenience: set string suggestions. Each string becomes { label: s, value: s }. */\n set autocompleteStrings(strings: string[]) {\n this._autocompleteItems = strings.map(s => ({\n label: s,\n value: s as unknown as T\n }))\n this.updateFilteredItems()\n }\n \n get autocompleteStrings(): string[] {\n return this._autocompleteItems.map(item => item.label)\n }\n \n set autocompleteData(items: UIAutocompleteItem<T>[]) {\n this._autocompleteItems = items\n this.updateFilteredItems()\n }\n \n get autocompleteData(): UIAutocompleteItem<T>[] {\n return this._autocompleteItems\n }\n \n \n // MARK: - Filtering\n \n updateFilteredItems() {\n \n const filterText = this.text.toLowerCase().trim()\n \n let filtered: UIAutocompleteItem<T>[]\n \n if (filterText.length === 0) {\n filtered = this._autocompleteItems\n }\n else {\n filtered = this._autocompleteItems.filter(item =>\n item.label.toLowerCase().includes(filterText)\n )\n }\n \n // If the only remaining result is an exact match for the current text,\n // the user has already made their selection \u2014 no need to show the dropdown.\n const isExactSingleMatch = filtered.length === 1 &&\n filtered[0].label.toLowerCase() === filterText\n \n this._dropdownView.filteredItems = isExactSingleMatch ? [] : filtered\n \n if (this._dropdownView.filteredItems.length > 0) {\n this._dropdownView.highlightedRowIndex = 0\n }\n \n if (this._isDropdownOpen) {\n this._dropdownView.showAnchoredToView(this)\n }\n \n }\n \n \n // MARK: - Dropdown Lifecycle\n \n openDropdown() {\n \n if (this._isDropdownOpen) {\n return\n }\n \n this._isDropdownOpen = YES\n this.updateFilteredItems()\n this._dropdownView.showAnchoredToView(this)\n \n }\n \n closeDropdown() {\n \n if (!this._isDropdownOpen) {\n return\n }\n \n this._isDropdownOpen = NO\n this._dropdownView.dismiss()\n \n // In strict mode, clear text if it doesn't match any item\n if (this._strictSelection && IS_NOT(this._selectedItem)) {\n const currentText = this.text.trim()\n if (currentText.length > 0) {\n const matchingItem = this._autocompleteItems.find(\n item => item.label === currentText\n )\n if (IS(matchingItem)) {\n this._selectedItem = matchingItem\n }\n else {\n this.text = \"\"\n this._selectedItem = undefined\n }\n }\n }\n \n this.updateValidationVisuals()\n \n }\n \n \n // MARK: - Validation\n \n /** Whether the current text is valid given the strictSelection setting. */\n get isValid(): boolean {\n \n if (!this._strictSelection) {\n return YES\n }\n \n const currentText = this.text.trim()\n \n if (currentText.length === 0) {\n return YES\n }\n \n return this._autocompleteItems.some(item => item.label === currentText)\n \n }\n \n \n \n \n /**\n * Hook for subclasses to apply custom visual styling based on validation state.\n * Called after dropdown closes and after selection changes.\n */\n updateValidationVisuals() {\n // Base implementation does nothing. Subclasses override.\n }\n \n \n // MARK: - Cleanup\n \n override wasRemovedFromViewTree() {\n \n super.wasRemovedFromViewTree()\n \n this._dropdownView.removeFromSuperview()\n \n }\n \n \n // MARK: - Layout\n \n override layoutSubviews() {\n \n super.layoutSubviews()\n \n if (this._isDropdownOpen) {\n this._dropdownView.showAnchoredToView(this)\n }\n \n }\n \n \n}\n\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -783,14 +783,15 @@ class UIRectangleConditionalBlock {
|
|
|
783
783
|
resultBeforeIF: null,
|
|
784
784
|
currentResult: initialResult,
|
|
785
785
|
originalResult: initialResult,
|
|
786
|
-
|
|
786
|
+
anyConditionMet: condition,
|
|
787
|
+
currentBranchActive: condition
|
|
787
788
|
}];
|
|
788
789
|
}
|
|
789
790
|
get _top() {
|
|
790
791
|
return this._stack[this._stack.length - 1];
|
|
791
792
|
}
|
|
792
|
-
get
|
|
793
|
-
return this._stack.every((frame) => frame.
|
|
793
|
+
get _shouldExecute() {
|
|
794
|
+
return this._stack.every((frame) => frame.currentBranchActive);
|
|
794
795
|
}
|
|
795
796
|
createProxy() {
|
|
796
797
|
const self = this;
|
|
@@ -802,14 +803,15 @@ class UIRectangleConditionalBlock {
|
|
|
802
803
|
resultBeforeIF: self._top.currentResult,
|
|
803
804
|
currentResult: self._top.currentResult,
|
|
804
805
|
originalResult: self._top.currentResult,
|
|
805
|
-
|
|
806
|
+
anyConditionMet: condition,
|
|
807
|
+
currentBranchActive: condition
|
|
806
808
|
});
|
|
807
809
|
return self.createProxy();
|
|
808
810
|
};
|
|
809
811
|
}
|
|
810
812
|
if (prop === "TRANSFORM") {
|
|
811
813
|
return (fn) => {
|
|
812
|
-
if (self.
|
|
814
|
+
if (self._shouldExecute) {
|
|
813
815
|
self._top.currentResult = fn(self._top.currentResult);
|
|
814
816
|
}
|
|
815
817
|
return self.createProxy();
|
|
@@ -818,8 +820,9 @@ class UIRectangleConditionalBlock {
|
|
|
818
820
|
if (prop === "ELSE_IF") {
|
|
819
821
|
return (condition) => {
|
|
820
822
|
const top = self._top;
|
|
821
|
-
|
|
822
|
-
|
|
823
|
+
top.currentBranchActive = !top.anyConditionMet && condition;
|
|
824
|
+
if (top.currentBranchActive) {
|
|
825
|
+
top.anyConditionMet = true;
|
|
823
826
|
top.currentResult = top.originalResult;
|
|
824
827
|
}
|
|
825
828
|
return self.createProxy();
|
|
@@ -828,8 +831,9 @@ class UIRectangleConditionalBlock {
|
|
|
828
831
|
if (prop === "ELSE") {
|
|
829
832
|
return () => {
|
|
830
833
|
const top = self._top;
|
|
831
|
-
|
|
832
|
-
|
|
834
|
+
top.currentBranchActive = !top.anyConditionMet;
|
|
835
|
+
if (top.currentBranchActive) {
|
|
836
|
+
top.anyConditionMet = true;
|
|
833
837
|
top.currentResult = top.originalResult;
|
|
834
838
|
}
|
|
835
839
|
return self.createProxy();
|
|
@@ -842,7 +846,7 @@ class UIRectangleConditionalBlock {
|
|
|
842
846
|
return performFunction ? performFunction(result) : result;
|
|
843
847
|
}
|
|
844
848
|
const completedFrame = self._stack.pop();
|
|
845
|
-
const resolvedResult = completedFrame.
|
|
849
|
+
const resolvedResult = completedFrame.anyConditionMet ? completedFrame.currentResult : completedFrame.resultBeforeIF;
|
|
846
850
|
const finalResult = performFunction ? performFunction(resolvedResult) : resolvedResult;
|
|
847
851
|
self._top.currentResult = finalResult;
|
|
848
852
|
return self.createProxy();
|
|
@@ -853,13 +857,13 @@ class UIRectangleConditionalBlock {
|
|
|
853
857
|
const value = self._top.currentResult[prop];
|
|
854
858
|
if (typeof value === "function") {
|
|
855
859
|
return (...args) => {
|
|
856
|
-
if (self.
|
|
860
|
+
if (self._shouldExecute) {
|
|
857
861
|
self._top.currentResult = value.apply(self._top.currentResult, args);
|
|
858
862
|
}
|
|
859
863
|
return self.createProxy();
|
|
860
864
|
};
|
|
861
865
|
}
|
|
862
|
-
if (self.
|
|
866
|
+
if (self._shouldExecute) {
|
|
863
867
|
self._top.currentResult = value;
|
|
864
868
|
}
|
|
865
869
|
return self.createProxy();
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../scripts/UIRectangle.ts"],
|
|
4
|
-
"sourcesContent": ["import { FIRST_OR_NIL, IS, IS_DEFINED, IS_NIL, IS_NOT_LIKE_NULL, IS_NOT_NIL, nil, NO, UIObject, YES } from \"./UIObject\"\nimport { UIPoint } from \"./UIPoint\"\nimport { UIView } from \"./UIView\"\n\n\nexport type SizeNumberOrFunctionOrView = number | ((constrainingOrthogonalSize: number) => number) | UIView\n\nexport class UIRectangle extends UIObject {\n \n _isBeingUpdated: boolean\n rectanglePointDidChange?: (b: any) => void\n \n // COW: Internal data structure that can be shared\n private _data: {\n min: UIPoint\n max: UIPoint\n minHeight?: number\n maxHeight?: number\n minWidth?: number\n maxWidth?: number\n refCount: number\n }\n \n // COW: Flag to indicate this is a lazy copy\n private _isLazyCopy: boolean\n \n \n constructor(x: number = 0, y: number = 0, height: number = 0, width: number = 0) {\n \n super()\n \n this._isLazyCopy = NO\n this._isBeingUpdated = NO\n \n // COW: Create the shared data structure\n this._data = {\n min: new UIPoint(x, y),\n max: new UIPoint(x + width, y + height),\n refCount: 1\n }\n \n this._setupPointCallbacks()\n \n if (IS_NIL(height)) {\n this._data.max.y = height\n }\n \n if (IS_NIL(width)) {\n this._data.max.x = width\n }\n \n }\n \n // COW: Setup callbacks for point changes\n private _setupPointCallbacks() {\n this._data.min.didChange = (point) => {\n this.rectanglePointDidChange?.(point)\n this._rectanglePointDidChange()\n }\n this._data.max.didChange = (point) => {\n this.rectanglePointDidChange?.(point)\n this._rectanglePointDidChange()\n }\n }\n \n // COW: Materialize a lazy copy before mutation\n materialize() {\n if (this._isLazyCopy || this._data.refCount > 1) {\n this._data.refCount--\n \n const oldData = this._data\n this._data = {\n min: oldData.min.copy(),\n max: oldData.max.copy(),\n minHeight: oldData.minHeight,\n maxHeight: oldData.maxHeight,\n minWidth: oldData.minWidth,\n maxWidth: oldData.maxWidth,\n refCount: 1\n }\n \n this._setupPointCallbacks()\n this._isLazyCopy = NO\n }\n }\n \n // Copy on write: Lazy copy that shares data\n // Tested to reduce CPU time from 2.2% to 1% during heavy resizing\n lazyCopy(): UIRectangle {\n const result = Object.create(UIRectangle.prototype)\n result._data = this._data\n result._data.refCount++\n result._isLazyCopy = YES\n result._isBeingUpdated = NO\n result.rectanglePointDidChange = this.rectanglePointDidChange\n return result\n }\n \n // COW: Getters and setters that materialize on write\n get min(): UIPoint {\n return this._data.min\n }\n \n set min(value: UIPoint) {\n this.materialize()\n this._data.min = value\n this._setupPointCallbacks()\n }\n \n get max(): UIPoint {\n return this._data.max\n }\n \n set max(value: UIPoint) {\n this.materialize()\n this._data.max = value\n this._setupPointCallbacks()\n }\n \n get minHeight(): number | undefined {\n return this._data.minHeight\n }\n \n set minHeight(value: number | undefined) {\n this.materialize()\n this._data.minHeight = value\n }\n \n get maxHeight(): number | undefined {\n return this._data.maxHeight\n }\n \n set maxHeight(value: number | undefined) {\n this.materialize()\n this._data.maxHeight = value\n }\n \n get minWidth(): number | undefined {\n return this._data.minWidth\n }\n \n set minWidth(value: number | undefined) {\n this.materialize()\n this._data.minWidth = value\n }\n \n get maxWidth(): number | undefined {\n return this._data.maxWidth\n }\n \n set maxWidth(value: number | undefined) {\n this.materialize()\n this._data.maxWidth = value\n }\n \n \n copy() {\n \n const result = new UIRectangle(this.x, this.y, this.height, this.width)\n \n result.minHeight = this.minHeight\n result.minWidth = this.minWidth\n result.maxHeight = this.maxHeight\n result.maxWidth = this.maxWidth\n \n return result\n \n }\n \n isEqualTo(rectangle: UIRectangle | null | undefined) {\n return (IS(rectangle) && this.min.isEqualTo(rectangle.min) && this.max.isEqualTo(rectangle.max))\n }\n \n static zero() {\n return new UIRectangle(0, 0, 0, 0)\n }\n \n containsPoint(point: UIPoint) {\n return this.min.x <= point.x && this.min.y <= point.y &&\n point.x <= this.max.x && point.y <= this.max.y\n }\n \n updateByAddingPoint(point: UIPoint) {\n \n this.materialize() // COW: Materialize before mutation\n \n if (!point) {\n point = new UIPoint(0, 0)\n }\n \n this.beginUpdates()\n \n const min = this.min.copy()\n if (min.x === nil) {\n min.x = this.max.x\n }\n if (min.y === nil) {\n min.y = this.max.y\n }\n \n const max = this.max.copy()\n if (max.x === nil) {\n max.x = this.min.x\n }\n if (max.y === nil) {\n max.y = this.min.y\n }\n \n this.min.x = Math.min(min.x, point.x)\n this.min.y = Math.min(min.y, point.y)\n this.max.x = Math.max(max.x, point.x)\n this.max.y = Math.max(max.y, point.y)\n \n this.finishUpdates()\n \n }\n \n scale(scale: number) {\n this.materialize() // COW: Materialize before mutation\n if (IS_NOT_NIL(this.max.y)) {\n this.height = this.height * scale\n }\n if (IS_NOT_NIL(this.max.x)) {\n this.width = this.width * scale\n }\n }\n \n get height() {\n if (this.max.y === nil) {\n return nil\n }\n return this.max.y - this.min.y\n }\n \n set height(height: number) {\n this.materialize() // COW: Materialize before mutation\n this._data.max.y = this.min.y + height\n }\n \n \n get width() {\n if (this.max.x === nil) {\n return nil\n }\n return this.max.x - this.min.x\n }\n \n set width(width: number) {\n this.materialize() // COW: Materialize before mutation\n this._data.max.x = this.min.x + width\n }\n \n \n get x() {\n return this.min.x\n }\n \n set x(x: number) {\n \n this.materialize() // COW: Materialize before mutation\n this.beginUpdates()\n \n const width = this.width\n this._data.min.x = x\n this._data.max.x = this.min.x + width\n \n this.finishUpdates()\n \n }\n \n \n get y() {\n return this.min.y\n }\n \n \n set y(y: number) {\n \n this.materialize() // COW: Materialize before mutation\n this.beginUpdates()\n \n const height = this.height\n this._data.min.y = y\n this._data.max.y = this.min.y + height\n \n this.finishUpdates()\n \n }\n \n \n get topLeft() {\n return this.min.copy()\n }\n \n get topRight() {\n return new UIPoint(this.max.x, this.y)\n }\n \n get bottomLeft() {\n return new UIPoint(this.x, this.max.y)\n }\n \n get bottomRight() {\n return this.max.copy()\n }\n \n \n get center() {\n return this.min.copy().add(this.min.to(this.max).scale(0.5))\n }\n \n set center(center: UIPoint) {\n this.materialize() // COW: Materialize before mutation\n const offset = this.center.to(center)\n this.offsetByPoint(offset)\n }\n \n offsetByPoint(offset: UIPoint) {\n this.materialize() // COW: Materialize before mutation\n this.min.add(offset)\n this.max.add(offset)\n \n return this\n }\n \n \n concatenateWithRectangle(rectangle: UIRectangle) {\n this.updateByAddingPoint(rectangle.bottomRight)\n this.updateByAddingPoint(rectangle.topLeft)\n return this\n }\n \n rectangleByConcatenatingWithRectangle(rectangle: UIRectangle) {\n return this.lazyCopy().concatenateWithRectangle(rectangle) // COW: Use lazyCopy\n }\n \n \n intersectionRectangleWithRectangle(rectangle: UIRectangle): UIRectangle {\n \n const result = this.lazyCopy() // COW: Use lazyCopy\n result.materialize() // COW: We're going to modify it\n \n result.beginUpdates()\n \n const min = result.min\n if (min.x === nil) {\n min.x = rectangle.max.x - Math.min(result.width, rectangle.width)\n }\n if (min.y === nil) {\n min.y = rectangle.max.y - Math.min(result.height, rectangle.height)\n }\n \n const max = result.max\n if (max.x === nil) {\n max.x = rectangle.min.x + Math.min(result.width, rectangle.width)\n }\n if (max.y === nil) {\n max.y = rectangle.min.y + Math.min(result.height, rectangle.height)\n }\n \n result.min.x = Math.max(result.min.x, rectangle.min.x)\n result.min.y = Math.max(result.min.y, rectangle.min.y)\n result.max.x = Math.min(result.max.x, rectangle.max.x)\n result.max.y = Math.min(result.max.y, rectangle.max.y)\n \n \n if (result.height < 0) {\n \n const averageY = (this.center.y + rectangle.center.y) * 0.5\n result.min.y = averageY\n result.max.y = averageY\n \n }\n \n if (result.width < 0) {\n \n const averageX = (this.center.x + rectangle.center.x) * 0.5\n result.min.x = averageX\n result.max.x = averageX\n \n }\n \n result.finishUpdates()\n \n return result\n \n }\n \n \n get area() {\n return this.height * this.width\n }\n \n \n intersectsWithRectangle(rectangle: UIRectangle) {\n return (this.intersectionRectangleWithRectangle(rectangle).area != 0)\n }\n \n \n // add some space around the rectangle\n rectangleWithInsets(left: number, right: number, bottom: number, top: number) {\n const result = this.lazyCopy() // COW: Use lazyCopy\n result.materialize() // COW: We're modifying multiple properties\n result.min.x = this.min.x + left\n result.max.x = this.max.x - right\n result.min.y = this.min.y + top\n result.max.y = this.max.y - bottom\n return result\n }\n \n rectangleWithInset(inset: number) {\n return this.rectangleWithInsets(inset, inset, inset, inset)\n }\n \n rectangleWithHeight(height: SizeNumberOrFunctionOrView, centeredOnPosition: number = nil) {\n \n height = this._heightNumberFromSizeNumberOrFunctionOrView(height)\n \n if (isNaN(centeredOnPosition)) {\n centeredOnPosition = nil\n }\n \n const result = this.lazyCopy() // COW: Use lazyCopy\n result.height = height\n \n if (centeredOnPosition != nil) {\n const change = height - this.height\n result.offsetByPoint(new UIPoint(0, change * centeredOnPosition).scale(-1))\n }\n \n return result\n \n }\n \n rectangleWithWidth(width: SizeNumberOrFunctionOrView, centeredOnPosition: number = nil) {\n \n width = this._widthNumberFromSizeNumberOrFunctionOrView(width)\n \n if (isNaN(centeredOnPosition)) {\n centeredOnPosition = nil\n }\n \n const result = this.lazyCopy() // COW: Use lazyCopy\n result.width = width\n \n if (centeredOnPosition != nil) {\n const change = width - this.width\n result.offsetByPoint(new UIPoint(change * centeredOnPosition, 0).scale(-1))\n }\n \n return result\n \n }\n \n rectangleWithHeightRelativeToWidth(heightRatio: number = 1, centeredOnPosition: number = nil) {\n return this.rectangleWithHeight(this.width * heightRatio, centeredOnPosition)\n }\n \n rectangleWithWidthRelativeToHeight(widthRatio: number = 1, centeredOnPosition: number = nil) {\n return this.rectangleWithWidth(this.height * widthRatio, centeredOnPosition)\n }\n \n rectangleWithX(x: number, centeredOnPosition: number = 0) {\n \n const result = this.lazyCopy() // COW: Use lazyCopy\n result.x = x - result.width * centeredOnPosition\n \n return result\n \n }\n \n rectangleWithY(y: number, centeredOnPosition: number = 0) {\n \n const result = this.lazyCopy() // COW: Use lazyCopy\n result.y = y - result.height * centeredOnPosition\n \n return result\n \n }\n \n \n rectangleByAddingX(x: number) {\n \n const result = this.lazyCopy() // COW: Use lazyCopy\n result.x = this.x + x\n \n return result\n \n }\n \n rectangleByAddingY(y: number) {\n \n const result = this.lazyCopy() // COW: Use lazyCopy\n result.y = this.y + y\n \n return result\n \n }\n \n rectangleByAddingWidth(widthToAdd: number, centeredOnPosition = 0) {\n \n const result = this.rectangleWithWidth(this.width + widthToAdd, centeredOnPosition)\n \n return result\n \n }\n \n rectangleByAddingHeight(heightToAdd: number, centeredOnPosition = 0) {\n \n const result = this.rectangleWithHeight(this.height + heightToAdd, centeredOnPosition)\n \n return result\n \n }\n \n \n rectangleWithRelativeValues(\n relativeXPosition: number,\n widthMultiplier: number,\n relativeYPosition: number,\n heightMultiplier: number\n ) {\n \n const result = this.lazyCopy() // COW: Use lazyCopy\n result.materialize() // COW: We're modifying multiple properties\n \n const width = result.width\n const height = result.height\n \n result.width = widthMultiplier * width\n result.height = heightMultiplier * height\n \n result.center = new UIPoint(\n relativeXPosition * width,\n relativeYPosition * height\n )\n \n return result\n \n }\n \n \n /**\n * Returns a rectangle with a maximum width constraint\n * If current width exceeds max, centers the constrained width\n */\n rectangleWithMaxWidth(maxWidth: number, centeredOnPosition: number = 0): UIRectangle {\n if (this.width <= maxWidth) {\n return this.lazyCopy() // COW: Use lazyCopy\n }\n return this.rectangleWithWidth(maxWidth, centeredOnPosition)\n }\n \n /**\n * Returns a rectangle with a maximum height constraint\n */\n rectangleWithMaxHeight(maxHeight: number, centeredOnPosition: number = 0): UIRectangle {\n if (this.height <= maxHeight) {\n return this.lazyCopy() // COW: Use lazyCopy\n }\n return this.rectangleWithHeight(maxHeight, centeredOnPosition)\n }\n \n /**\n * Returns a rectangle with minimum width constraint\n */\n rectangleWithMinWidth(minWidth: number, centeredOnPosition: number = 0): UIRectangle {\n if (this.width >= minWidth) {\n return this.lazyCopy() // COW: Use lazyCopy\n }\n return this.rectangleWithWidth(minWidth, centeredOnPosition)\n }\n \n /**\n * Returns a rectangle with minimum height constraint\n */\n rectangleWithMinHeight(minHeight: number, centeredOnPosition: number = 0): UIRectangle {\n if (this.height >= minHeight) {\n return this.lazyCopy() // COW: Use lazyCopy\n }\n return this.rectangleWithHeight(minHeight, centeredOnPosition)\n }\n \n // Returns a new rectangle that is positioned relative to the reference rectangle\n // By default, it makes a copy of this rectangle taht is centered in the target rectangle\n rectangleByCenteringInRectangle(referenceRectangle: UIRectangle, xPosition = 0.5, yPosition = 0.5) {\n const result = this.lazyCopy() // COW: Use lazyCopy\n result.center = referenceRectangle.topLeft\n .pointByAddingX(xPosition * referenceRectangle.width)\n .pointByAddingY(yPosition * referenceRectangle.height)\n return result\n }\n \n \n rectanglesBySplittingWidth(\n weights: SizeNumberOrFunctionOrView[],\n paddings: SizeNumberOrFunctionOrView | SizeNumberOrFunctionOrView[] = 0,\n absoluteWidths: SizeNumberOrFunctionOrView | SizeNumberOrFunctionOrView[] = nil\n ) {\n \n if (IS_NIL(paddings)) {\n paddings = 1\n }\n if (!((paddings as any) instanceof Array)) {\n paddings = [paddings].arrayByRepeating(weights.length - 1)\n }\n paddings = (paddings as any[]).arrayByTrimmingToLengthIfLonger(weights.length - 1)\n paddings = paddings.map(padding => this._widthNumberFromSizeNumberOrFunctionOrView(padding))\n if (!(absoluteWidths instanceof Array) && IS_NOT_NIL(absoluteWidths)) {\n absoluteWidths = [absoluteWidths].arrayByRepeating(weights.length)\n }\n absoluteWidths = absoluteWidths.map(\n width => this._widthNumberFromSizeNumberOrFunctionOrView(width)\n )\n \n weights = weights.map(weight => this._widthNumberFromSizeNumberOrFunctionOrView(weight))\n const result: UIRectangle[] = []\n const sumOfWeights = (weights as number[]).reduce(\n (a, b, index) => {\n if (IS_NOT_NIL((absoluteWidths as number[])[index])) {\n b = 0\n }\n return a + b\n },\n 0\n )\n const sumOfPaddings = paddings.summedValue as number\n const sumOfAbsoluteWidths = (absoluteWidths as number[]).summedValue\n const totalRelativeWidth = this.width - sumOfPaddings - sumOfAbsoluteWidths\n let previousCellMaxX = this.x\n \n for (let i = 0; i < weights.length; i++) {\n \n let resultWidth: number\n if (IS_NOT_NIL(absoluteWidths[i])) {\n resultWidth = (absoluteWidths[i] || 0) as number\n }\n else {\n resultWidth = totalRelativeWidth * (weights[i] as number / sumOfWeights)\n }\n \n const rectangle = this.rectangleWithWidth(resultWidth)\n \n let padding = 0\n if (paddings.length > i && paddings[i]) {\n padding = paddings[i] as number\n }\n \n rectangle.x = previousCellMaxX\n previousCellMaxX = rectangle.max.x + padding\n result.push(rectangle)\n \n }\n \n return result\n \n }\n \n rectanglesBySplittingHeight(\n weights: SizeNumberOrFunctionOrView[],\n paddings: SizeNumberOrFunctionOrView | SizeNumberOrFunctionOrView[] = 0,\n absoluteHeights: SizeNumberOrFunctionOrView | SizeNumberOrFunctionOrView[] = nil\n ) {\n \n if (IS_NIL(paddings)) {\n paddings = 1\n }\n if (!((paddings as any) instanceof Array)) {\n paddings = [paddings].arrayByRepeating(weights.length - 1)\n }\n paddings = (paddings as number[]).arrayByTrimmingToLengthIfLonger(weights.length - 1)\n paddings = paddings.map(padding => this._heightNumberFromSizeNumberOrFunctionOrView(padding))\n if (!(absoluteHeights instanceof Array) && IS_NOT_NIL(absoluteHeights)) {\n absoluteHeights = [absoluteHeights].arrayByRepeating(weights.length)\n }\n absoluteHeights = absoluteHeights.map(\n height => this._heightNumberFromSizeNumberOrFunctionOrView(height)\n )\n \n weights = weights.map(weight => this._heightNumberFromSizeNumberOrFunctionOrView(weight))\n const result: UIRectangle[] = []\n const sumOfWeights = (weights as number[]).reduce(\n (a, b, index) => {\n if (IS_NOT_NIL((absoluteHeights as number[])[index])) {\n b = 0\n }\n return a + b\n },\n 0\n )\n const sumOfPaddings = paddings.summedValue as number\n const sumOfAbsoluteHeights = (absoluteHeights as number[]).summedValue\n const totalRelativeHeight = this.height - sumOfPaddings - sumOfAbsoluteHeights\n let previousCellMaxY = this.y\n \n for (let i = 0; i < weights.length; i++) {\n let resultHeight: number\n if (IS_NOT_NIL(absoluteHeights[i])) {\n \n resultHeight = (absoluteHeights[i] || 0) as number\n \n }\n else {\n \n resultHeight = totalRelativeHeight * (weights[i] as number / sumOfWeights)\n \n }\n \n const rectangle = this.rectangleWithHeight(resultHeight)\n \n let padding = 0\n if (paddings.length > i && paddings[i]) {\n padding = paddings[i] as number\n }\n \n rectangle.y = previousCellMaxY\n previousCellMaxY = rectangle.max.y + padding\n //rectangle = rectangle.rectangleWithInsets(0, 0, padding, 0);\n result.push(rectangle)\n }\n \n return result\n \n }\n \n \n rectanglesByEquallySplittingWidth(numberOfFrames: number, padding: number = 0) {\n const result: UIRectangle[] = []\n const totalPadding = padding * (numberOfFrames - 1)\n const resultWidth = (this.width - totalPadding) / numberOfFrames\n for (var i = 0; i < numberOfFrames; i++) {\n const rectangle = this.rectangleWithWidth(resultWidth, i / (numberOfFrames - 1))\n result.push(rectangle)\n }\n return result\n }\n \n rectanglesByEquallySplittingHeight(numberOfFrames: number, padding: number = 0) {\n const result: UIRectangle[] = []\n const totalPadding = padding * (numberOfFrames - 1)\n const resultHeight = (this.height - totalPadding) / numberOfFrames\n for (var i = 0; i < numberOfFrames; i++) {\n const rectangle = this.rectangleWithHeight(resultHeight, i / (numberOfFrames - 1))\n result.push(rectangle)\n }\n return result\n }\n \n \n distributeViewsAlongWidth(\n views: UIView[],\n weights: SizeNumberOrFunctionOrView | SizeNumberOrFunctionOrView[] = 1,\n paddings?: SizeNumberOrFunctionOrView | SizeNumberOrFunctionOrView[],\n absoluteWidths?: SizeNumberOrFunctionOrView | SizeNumberOrFunctionOrView[]\n ) {\n if (!(weights instanceof Array)) {\n weights = [weights].arrayByRepeating(views.length)\n }\n const frames = this.rectanglesBySplittingWidth(weights, paddings, absoluteWidths)\n frames.forEach((frame, index) => FIRST_OR_NIL(views[index]).frame = frame)\n return this\n }\n \n distributeViewsAlongHeight(\n views: UIView[],\n weights: SizeNumberOrFunctionOrView | SizeNumberOrFunctionOrView[] = 1,\n paddings?: SizeNumberOrFunctionOrView | SizeNumberOrFunctionOrView[],\n absoluteHeights?: SizeNumberOrFunctionOrView | SizeNumberOrFunctionOrView[]\n ) {\n if (!(weights instanceof Array)) {\n weights = [weights].arrayByRepeating(views.length)\n }\n const frames = this.rectanglesBySplittingHeight(weights, paddings, absoluteHeights)\n frames.forEach((frame, index) => FIRST_OR_NIL(views[index]).frame = frame)\n return this\n }\n \n \n distributeViewsEquallyAlongWidth(views: UIView[], padding: number) {\n const frames = this.rectanglesByEquallySplittingWidth(views.length, padding)\n frames.forEach((frame, index) => views[index].frame = frame)\n return this\n }\n \n distributeViewsEquallyAlongHeight(views: UIView[], padding: number) {\n const frames = this.rectanglesByEquallySplittingHeight(views.length, padding)\n frames.forEach((frame, index) => views[index].frame = frame)\n return this\n }\n \n \n _heightNumberFromSizeNumberOrFunctionOrView(height: SizeNumberOrFunctionOrView) {\n if (height instanceof Function) {\n return height(this.width)\n }\n if (height instanceof UIView) {\n return height.intrinsicContentHeight(this.width)\n }\n return height\n }\n \n _widthNumberFromSizeNumberOrFunctionOrView(width: SizeNumberOrFunctionOrView) {\n if (width instanceof Function) {\n return width(this.height)\n }\n if (width instanceof UIView) {\n return width.intrinsicContentWidth(this.height)\n }\n return width\n }\n \n rectangleForNextRow(padding: number = 0, height: SizeNumberOrFunctionOrView = this.height) {\n const heightNumber = this._heightNumberFromSizeNumberOrFunctionOrView(height)\n const result = this.rectangleWithY(this.max.y + padding)\n if (heightNumber != this.height) {\n result.height = heightNumber\n }\n return result\n }\n \n rectangleForNextColumn(padding: number = 0, width: SizeNumberOrFunctionOrView = this.width) {\n const widthNumber = this._widthNumberFromSizeNumberOrFunctionOrView(width)\n const result = this.rectangleWithX(this.max.x + padding)\n if (widthNumber != this.width) {\n result.width = widthNumber\n }\n return result\n }\n \n rectangleForPreviousRow(padding: number = 0, height: SizeNumberOrFunctionOrView = this.height) {\n const heightNumber = this._heightNumberFromSizeNumberOrFunctionOrView(height)\n const result = this.rectangleWithY(this.min.y - heightNumber - padding)\n if (heightNumber != this.height) {\n result.height = heightNumber\n }\n return result\n }\n \n rectangleForPreviousColumn(padding: number = 0, width: SizeNumberOrFunctionOrView = this.width) {\n const widthNumber = this._widthNumberFromSizeNumberOrFunctionOrView(width)\n const result = this.rectangleWithX(this.min.x - widthNumber - padding)\n if (widthNumber != this.width) {\n result.width = widthNumber\n }\n return result\n \n }\n \n /**\n * Distributes views vertically as a column, assigning frames and returning them.\n * Each view is positioned below the previous one with optional padding between them.\n * @param views - Array of views to distribute\n * @param paddings - Padding between views (single value or array of values)\n * @param absoluteHeights - Optional fixed heights for views (overrides intrinsic height)\n * @returns Array of rectangles representing the frame for each view\n */\n framesByDistributingViewsAsColumn(\n views: UIView[],\n paddings: SizeNumberOrFunctionOrView | SizeNumberOrFunctionOrView[] = 0,\n absoluteHeights: SizeNumberOrFunctionOrView | SizeNumberOrFunctionOrView[] = nil\n ) {\n const frames: UIRectangle[] = []\n let currentRectangle = this.lazyCopy() // COW: Use lazyCopy\n \n if (!(paddings instanceof Array)) {\n paddings = [paddings].arrayByRepeating(views.length - 1)\n }\n paddings = paddings.map(padding => this._heightNumberFromSizeNumberOrFunctionOrView(padding))\n \n if (!(absoluteHeights instanceof Array) && IS_NOT_NIL(absoluteHeights)) {\n absoluteHeights = [absoluteHeights].arrayByRepeating(views.length)\n }\n absoluteHeights = absoluteHeights.map(\n height => this._heightNumberFromSizeNumberOrFunctionOrView(height)\n )\n \n for (let i = 0; i < views.length; i++) {\n const frame = currentRectangle.rectangleWithHeight(views[i])\n \n if (IS_NOT_NIL(absoluteHeights[i])) {\n frame.height = absoluteHeights[i] as number\n }\n \n views[i].frame = frame\n frames.push(frame)\n \n const padding = (paddings[i] || 0) as number\n currentRectangle = frame.rectangleForNextRow(padding)\n }\n \n return frames\n }\n \n /**\n * Distributes views horizontally as a row, assigning frames and returning them.\n * Each view is positioned to the right of the previous one with optional padding between them.\n * @param views - Array of views to distribute\n * @param paddings - Padding between views (single value or array of values)\n * @param absoluteWidths - Optional fixed widths for views (overrides intrinsic width)\n * @returns Array of rectangles representing the frame for each view\n */\n framesByDistributingViewsAsRow(\n views: UIView[],\n paddings: SizeNumberOrFunctionOrView | SizeNumberOrFunctionOrView[] = 0,\n absoluteWidths: SizeNumberOrFunctionOrView | SizeNumberOrFunctionOrView[] = nil\n ) {\n const frames: UIRectangle[] = []\n let currentRectangle = this.lazyCopy() // COW: Use lazyCopy\n \n if (!(paddings instanceof Array)) {\n paddings = [paddings].arrayByRepeating(views.length - 1)\n }\n paddings = paddings.map(padding => this._widthNumberFromSizeNumberOrFunctionOrView(padding))\n \n if (!(absoluteWidths instanceof Array) && IS_NOT_NIL(absoluteWidths)) {\n absoluteWidths = [absoluteWidths].arrayByRepeating(views.length)\n }\n absoluteWidths = absoluteWidths.map(\n width => this._widthNumberFromSizeNumberOrFunctionOrView(width)\n )\n \n for (let i = 0; i < views.length; i++) {\n const frame = currentRectangle.rectangleWithWidth(views[i])\n \n if (IS_NOT_NIL(absoluteWidths[i])) {\n frame.width = absoluteWidths[i] as number\n }\n \n views[i].frame = frame\n frames.push(frame)\n \n const padding = (paddings[i] || 0) as number\n currentRectangle = frame.rectangleForNextColumn(padding)\n }\n \n return frames\n }\n \n /**\n * Distributes views as a grid (2D array), assigning frames and returning them.\n * The first index represents rows (vertical), the second index represents columns (horizontal).\n * Example: views[0] is the first row, views[0][0] is the first column in the first row.\n * Each row is laid out horizontally, and rows are stacked vertically.\n * @param views - 2D array where views[row][column] represents the grid structure\n * @param paddings - Vertical padding between rows (single value or array of values)\n * @param absoluteHeights - Optional fixed heights for each row (overrides intrinsic height)\n * @returns 2D array of rectangles where frames[row][column] matches views[row][column]\n */\n framesByDistributingViewsAsGrid(\n views: UIView[][],\n paddings: SizeNumberOrFunctionOrView | SizeNumberOrFunctionOrView[] = 0,\n absoluteHeights: SizeNumberOrFunctionOrView | SizeNumberOrFunctionOrView[] = nil\n ) {\n const frames: UIRectangle[][] = []\n let currentRowRectangle = this.lazyCopy() // COW: Use lazyCopy\n \n if (!(paddings instanceof Array)) {\n paddings = [paddings].arrayByRepeating(views.length - 1)\n }\n paddings = paddings.map(padding => this._heightNumberFromSizeNumberOrFunctionOrView(padding))\n \n if (!(absoluteHeights instanceof Array) && IS_NOT_NIL(absoluteHeights)) {\n absoluteHeights = [absoluteHeights].arrayByRepeating(views.length)\n }\n absoluteHeights = absoluteHeights.map(\n height => this._heightNumberFromSizeNumberOrFunctionOrView(height)\n )\n \n for (let i = 0; i < views.length; i++) {\n const rowViews = views[i]\n const rowFrames = currentRowRectangle.framesByDistributingViewsAsRow(rowViews)\n \n if (IS_NOT_NIL(absoluteHeights[i])) {\n const heightNumber = absoluteHeights[i] as number\n rowFrames.forEach((frame, j) => {\n frame.height = heightNumber\n rowViews[j].frame = frame\n })\n }\n \n frames.push(rowFrames)\n \n const padding = (paddings[i] || 0) as number\n const maxHeight = Math.max(...rowFrames.map(f => f.height))\n currentRowRectangle = currentRowRectangle.rectangleForNextRow(padding, maxHeight)\n }\n \n return frames\n }\n \n rectangleWithIntrinsicContentSizeForView(view: UIView, centeredOnXPosition = 0, centeredOnYPosition = 0) {\n const intrinsicContentSize = view.intrinsicContentSize()\n return this.rectangleWithHeight(intrinsicContentSize.height, centeredOnYPosition)\n .rectangleWithWidth(intrinsicContentSize.width, centeredOnXPosition)\n }\n \n settingMinHeight(minHeight?: number) {\n this.minHeight = minHeight\n return this\n }\n \n settingMinWidth(minWidth?: number) {\n this.minWidth = minWidth\n return this\n }\n \n settingMaxHeight(maxHeight?: number) {\n this.maxHeight = maxHeight\n return this\n }\n \n settingMaxWidth(maxWidth?: number) {\n this.maxWidth = maxWidth\n return this\n }\n \n rectangleByEnforcingMinAndMaxSizes(centeredOnXPosition = 0, centeredOnYPosition = 0) {\n return this.rectangleWithHeight(\n [\n [this.height, this.maxHeight].filter(value => IS_NOT_LIKE_NULL(value)).min(),\n this.minHeight\n ].filter(value => IS_NOT_LIKE_NULL(value)).max(),\n centeredOnYPosition\n ).rectangleWithWidth(\n [\n [this.width, this.maxWidth].filter(value => IS_NOT_LIKE_NULL(value)).min(),\n this.minWidth\n ].filter(value => IS_NOT_LIKE_NULL(value)).max(),\n centeredOnXPosition\n )\n }\n \n \n assignedAsFrameOfView(view: UIView, isWeakFrame = view.hasWeakFrame) {\n view.frame = this\n view.hasWeakFrame = isWeakFrame\n return this\n }\n \n \n override toString() {\n \n const result = \"[\" + this.class.name + \"] { x: \" + this.x + \", y: \" + this.y + \", \" +\n \"height: \" + this.height.toFixed(2) + \", width: \" + this.height.toFixed(2) + \" }\"\n \n return result\n \n }\n \n get [Symbol.toStringTag]() {\n return this.toString()\n }\n \n \n IF(condition: boolean): UIRectangleConditionalChain<UIRectangle> {\n const conditionalBlock = new UIRectangleConditionalBlock(this, condition)\n // @ts-ignore\n return conditionalBlock.getProxy()\n }\n \n // These will be intercepted by the proxy, but we define them for TypeScript\n ELSE_IF(condition: boolean): UIRectangle {\n return this\n }\n \n ELSE(): UIRectangle {\n return this\n }\n \n ENDIF(): this\n ENDIF<T, R>(performFunction: (result: T) => R): R\n ENDIF<T, R>(performFunction?: (result: T) => R): R | this {\n if (performFunction) {\n return performFunction(this as any)\n }\n return this\n }\n \n \n // Bounding box\n static boundingBoxForPoints(points: UIPoint[]) {\n const result = new UIRectangle()\n for (let i = 0; i < points.length; i++) {\n result.updateByAddingPoint(points[i])\n }\n return result\n }\n \n static boundingBoxForRectanglesAndPoints(rectanglesAndPoints: (UIPoint | UIRectangle)[]) {\n const result = new UIRectangle()\n for (let i = 0; i < rectanglesAndPoints.length; i++) {\n const rectangleOrPoint = rectanglesAndPoints[i]\n if (rectangleOrPoint instanceof UIRectangle) {\n result.updateByAddingPoint(rectangleOrPoint.min)\n result.updateByAddingPoint(rectangleOrPoint.max)\n }\n else {\n result.updateByAddingPoint(rectangleOrPoint)\n }\n }\n return result\n }\n \n \n beginUpdates() {\n this._isBeingUpdated = YES\n }\n \n finishUpdates() {\n this._isBeingUpdated = NO\n this.didChange()\n }\n \n \n didChange() {\n \n // Callback to be set by delegate\n \n }\n \n _rectanglePointDidChange() {\n if (!this._isBeingUpdated) {\n this.didChange()\n }\n }\n \n \n}\n\n\n// 1. Methods available when holding a UIRectangle\ntype RectangleChainMethods<TResult> = {\n [K in keyof UIRectangle as (\n K extends 'IF' | 'ELSE' | 'ELSE_IF' | 'ENDIF' ? never : K\n )]:\n UIRectangle[K] extends (...args: infer Args) => infer R\n ? R extends UIRectangle | UIRectangle[]\n // CHANGE: We do NOT add 'R' to 'TResult' here. We only update the current state (R).\n ? (...args: Args) => UIRectangleConditionalChain<R, TResult>\n : never\n : never\n};\n\n// 2. Methods available when holding a UIRectangle[]\ntype ArrayChainMethods<TResult> = {\n [K in keyof UIRectangle[]]:\n UIRectangle[][K] extends UIRectangle\n ? UIRectangleConditionalChain<UIRectangle, TResult> // No accumulation for properties\n : UIRectangle[][K] extends (...args: infer Args) => infer R\n ? R extends UIRectangle | UIRectangle[]\n // CHANGE: We do NOT add 'R' to 'TResult' here either.\n ? (...args: Args) => UIRectangleConditionalChain<R, TResult>\n : never\n : never\n};\n\n// 3. Methods available in both states (Control Flow + Transform)\ntype SharedChainMethods<TCurrent, TResult> = {\n // IF opens a nested conditional block. After the matching ENDIF(), the chain resumes\n // as a UIRectangle \u2014 both at runtime (the proxy forwards to the current rectangle) and\n // at the type level. Nesting is supported to arbitrary depth.\n IF(condition: boolean): UIRectangleConditionalChain<UIRectangle, TResult>;\n \n // TRANSFORM applies an inline function and continues the chain.\n TRANSFORM<R extends UIRectangle>(fn: (current: TCurrent) => R): UIRectangleConditionalChain<R, TResult>;\n \n // ELSE_IF / ELSE reset the branch state.\n ELSE_IF(condition: boolean): UIRectangleConditionalChain<UIRectangle, TResult | TCurrent>;\n ELSE(): UIRectangleConditionalChain<UIRectangle, TResult | TCurrent>;\n \n // ENDIF closes this IF block.\n // No-arg: always typed as UIRectangle so rectangle methods are available immediately\n // after. At runtime the proxy wraps the current rectangle and forwards all calls.\n // With transform fn: returns R directly, escaping the chain entirely.\n ENDIF(): UIRectangle;\n ENDIF<R>(performFunction: (result: TResult | TCurrent) => R): R;\n};\n\n// 4. The Main Type (No changes needed here, just re-stating for context)\ntype UIRectangleConditionalChain<TCurrent, TResult = TCurrent> =\n (TCurrent extends UIRectangle ? RectangleChainMethods<TResult> : {}) &\n (TCurrent extends UIRectangle[] ? ArrayChainMethods<TResult> : {}) &\n SharedChainMethods<TCurrent, TResult>;\n\n\ninterface UIRectangleConditionalFrame {\n // The result to resume from when this frame's ENDIF is reached\n resultBeforeIF: any\n // The result accumulated inside this frame's active branch\n currentResult: any\n // The original result at the point of IF (used to reset for ELSE/ELSE_IF branches)\n originalResult: any\n // Whether any branch of this frame has already been taken\n conditionMet: boolean\n}\n\nclass UIRectangleConditionalBlock {\n \n // Stack of nested IF frames. The top of the stack is the innermost active IF.\n private _stack: UIRectangleConditionalFrame[]\n \n constructor(initialResult: UIRectangle, condition: boolean) {\n // Seed the stack with the first IF frame.\n // resultBeforeIF is nil here because this is the outermost block;\n // ENDIF on the last frame simply returns currentResult.\n this._stack = [{\n resultBeforeIF: null,\n currentResult: initialResult,\n originalResult: initialResult,\n conditionMet: condition,\n }]\n }\n \n // Convenience getters that operate on the innermost frame.\n private get _top(): UIRectangleConditionalFrame {\n return this._stack[this._stack.length - 1]\n }\n \n private get _conditionMet(): boolean {\n // A branch is only truly active when every enclosing frame is also active.\n return this._stack.every(frame => frame.conditionMet)\n }\n \n private createProxy(): UIRectangleConditionalChain<any, any> {\n const self = this\n \n return new Proxy({}, {\n get(_, prop) {\n \n // \u2500\u2500 Control Flow \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n \n if (prop === 'IF') {\n return (condition: boolean) => {\n // Push a new frame. The new frame's result starts as a copy of\n // the current innermost result so that chaining inside the nested\n // IF begins from the right value.\n self._stack.push({\n resultBeforeIF: self._top.currentResult,\n currentResult: self._top.currentResult,\n originalResult: self._top.currentResult,\n conditionMet: condition,\n })\n return self.createProxy()\n }\n }\n \n if (prop === 'TRANSFORM') {\n return <R extends UIRectangle>(fn: (current: any) => R) => {\n if (self._conditionMet) {\n self._top.currentResult = fn(self._top.currentResult)\n }\n return self.createProxy()\n }\n }\n \n if (prop === 'ELSE_IF') {\n return (condition: boolean) => {\n const top = self._top\n if (!top.conditionMet) {\n top.conditionMet = condition\n top.currentResult = top.originalResult\n }\n return self.createProxy()\n }\n }\n \n if (prop === 'ELSE') {\n return () => {\n const top = self._top\n if (!top.conditionMet) {\n top.conditionMet = true\n top.currentResult = top.originalResult\n }\n return self.createProxy()\n }\n }\n \n if (prop === 'ENDIF') {\n function endif(): any\n function endif<R>(performFunction: (result: any) => R): R\n function endif<R>(performFunction?: (result: any) => R): R | any {\n \n if (self._stack.length === 1) {\n // Outermost ENDIF. Return the bare rectangle (or transform it).\n // TypeScript types this as UIRectangle, and that is what we return.\n const result = self._top.currentResult\n return performFunction ? performFunction(result) : result\n }\n \n // Pop the innermost (nested) frame.\n const completedFrame = self._stack.pop()!\n \n // If the condition was met use the accumulated result; otherwise\n // fall back to the value that existed before entering this IF.\n const resolvedResult = completedFrame.conditionMet\n ? completedFrame.currentResult\n : completedFrame.resultBeforeIF\n \n // Optionally transform, then write back into the parent frame.\n const finalResult = performFunction ? performFunction(resolvedResult) : resolvedResult\n self._top.currentResult = finalResult\n \n // Return the proxy so the outer chain can continue.\n // TypeScript also types this as UIRectangle (the proxy forwards\n // all rectangle methods to the current result).\n return self.createProxy()\n }\n return endif\n }\n \n // \u2500\u2500 Forward to currentResult (UIRectangle or UIRectangle[]) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n \n const value = self._top.currentResult[prop]\n \n // Case A: method call\n if (typeof value === 'function') {\n return (...args: any[]) => {\n if (self._conditionMet) {\n self._top.currentResult = value.apply(self._top.currentResult, args)\n }\n return self.createProxy()\n }\n }\n \n // Case B: property access (e.g. array .lastElement)\n if (self._conditionMet) {\n self._top.currentResult = value\n }\n \n return self.createProxy()\n }\n }) as any\n }\n \n getProxy(): UIRectangleConditionalChain<any, any> {\n return this.createProxy()\n }\n \n}\n\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAA2G;AAC3G,qBAAwB;AACxB,oBAAuB;AAKhB,MAAM,oBAAoB,yBAAS;AAAA,EAoBtC,YAAY,IAAY,GAAG,IAAY,GAAG,SAAiB,GAAG,QAAgB,GAAG;AAE7E,UAAM;AAEN,SAAK,cAAc;AACnB,SAAK,kBAAkB;AAGvB,SAAK,QAAQ;AAAA,MACT,KAAK,IAAI,uBAAQ,GAAG,CAAC;AAAA,MACrB,KAAK,IAAI,uBAAQ,IAAI,OAAO,IAAI,MAAM;AAAA,MACtC,UAAU;AAAA,IACd;AAEA,SAAK,qBAAqB;AAE1B,YAAI,wBAAO,MAAM,GAAG;AAChB,WAAK,MAAM,IAAI,IAAI;AAAA,IACvB;AAEA,YAAI,wBAAO,KAAK,GAAG;AACf,WAAK,MAAM,IAAI,IAAI;AAAA,IACvB;AAAA,EAEJ;AAAA,EAGQ,uBAAuB;AAC3B,SAAK,MAAM,IAAI,YAAY,CAAC,UAAU;AAvD9C;AAwDY,iBAAK,4BAAL,8BAA+B;AAC/B,WAAK,yBAAyB;AAAA,IAClC;AACA,SAAK,MAAM,IAAI,YAAY,CAAC,UAAU;AA3D9C;AA4DY,iBAAK,4BAAL,8BAA+B;AAC/B,WAAK,yBAAyB;AAAA,IAClC;AAAA,EACJ;AAAA,EAGA,cAAc;AACV,QAAI,KAAK,eAAe,KAAK,MAAM,WAAW,GAAG;AAC7C,WAAK,MAAM;AAEX,YAAM,UAAU,KAAK;AACrB,WAAK,QAAQ;AAAA,QACT,KAAK,QAAQ,IAAI,KAAK;AAAA,QACtB,KAAK,QAAQ,IAAI,KAAK;AAAA,QACtB,WAAW,QAAQ;AAAA,QACnB,WAAW,QAAQ;AAAA,QACnB,UAAU,QAAQ;AAAA,QAClB,UAAU,QAAQ;AAAA,QAClB,UAAU;AAAA,MACd;AAEA,WAAK,qBAAqB;AAC1B,WAAK,cAAc;AAAA,IACvB;AAAA,EACJ;AAAA,EAIA,WAAwB;AACpB,UAAM,SAAS,OAAO,OAAO,YAAY,SAAS;AAClD,WAAO,QAAQ,KAAK;AACpB,WAAO,MAAM;AACb,WAAO,cAAc;AACrB,WAAO,kBAAkB;AACzB,WAAO,0BAA0B,KAAK;AACtC,WAAO;AAAA,EACX;AAAA,EAGA,IAAI,MAAe;AACf,WAAO,KAAK,MAAM;AAAA,EACtB;AAAA,EAEA,IAAI,IAAI,OAAgB;AACpB,SAAK,YAAY;AACjB,SAAK,MAAM,MAAM;AACjB,SAAK,qBAAqB;AAAA,EAC9B;AAAA,EAEA,IAAI,MAAe;AACf,WAAO,KAAK,MAAM;AAAA,EACtB;AAAA,EAEA,IAAI,IAAI,OAAgB;AACpB,SAAK,YAAY;AACjB,SAAK,MAAM,MAAM;AACjB,SAAK,qBAAqB;AAAA,EAC9B;AAAA,EAEA,IAAI,YAAgC;AAChC,WAAO,KAAK,MAAM;AAAA,EACtB;AAAA,EAEA,IAAI,UAAU,OAA2B;AACrC,SAAK,YAAY;AACjB,SAAK,MAAM,YAAY;AAAA,EAC3B;AAAA,EAEA,IAAI,YAAgC;AAChC,WAAO,KAAK,MAAM;AAAA,EACtB;AAAA,EAEA,IAAI,UAAU,OAA2B;AACrC,SAAK,YAAY;AACjB,SAAK,MAAM,YAAY;AAAA,EAC3B;AAAA,EAEA,IAAI,WAA+B;AAC/B,WAAO,KAAK,MAAM;AAAA,EACtB;AAAA,EAEA,IAAI,SAAS,OAA2B;AACpC,SAAK,YAAY;AACjB,SAAK,MAAM,WAAW;AAAA,EAC1B;AAAA,EAEA,IAAI,WAA+B;AAC/B,WAAO,KAAK,MAAM;AAAA,EACtB;AAAA,EAEA,IAAI,SAAS,OAA2B;AACpC,SAAK,YAAY;AACjB,SAAK,MAAM,WAAW;AAAA,EAC1B;AAAA,EAGA,OAAO;AAEH,UAAM,SAAS,IAAI,YAAY,KAAK,GAAG,KAAK,GAAG,KAAK,QAAQ,KAAK,KAAK;AAEtE,WAAO,YAAY,KAAK;AACxB,WAAO,WAAW,KAAK;AACvB,WAAO,YAAY,KAAK;AACxB,WAAO,WAAW,KAAK;AAEvB,WAAO;AAAA,EAEX;AAAA,EAEA,UAAU,WAA2C;AACjD,eAAQ,oBAAG,SAAS,KAAK,KAAK,IAAI,UAAU,UAAU,GAAG,KAAK,KAAK,IAAI,UAAU,UAAU,GAAG;AAAA,EAClG;AAAA,EAEA,OAAO,OAAO;AACV,WAAO,IAAI,YAAY,GAAG,GAAG,GAAG,CAAC;AAAA,EACrC;AAAA,EAEA,cAAc,OAAgB;AAC1B,WAAO,KAAK,IAAI,KAAK,MAAM,KAAK,KAAK,IAAI,KAAK,MAAM,KAChD,MAAM,KAAK,KAAK,IAAI,KAAK,MAAM,KAAK,KAAK,IAAI;AAAA,EACrD;AAAA,EAEA,oBAAoB,OAAgB;AAEhC,SAAK,YAAY;AAEjB,QAAI,CAAC,OAAO;AACR,cAAQ,IAAI,uBAAQ,GAAG,CAAC;AAAA,IAC5B;AAEA,SAAK,aAAa;AAElB,UAAM,MAAM,KAAK,IAAI,KAAK;AAC1B,QAAI,IAAI,MAAM,qBAAK;AACf,UAAI,IAAI,KAAK,IAAI;AAAA,IACrB;AACA,QAAI,IAAI,MAAM,qBAAK;AACf,UAAI,IAAI,KAAK,IAAI;AAAA,IACrB;AAEA,UAAM,MAAM,KAAK,IAAI,KAAK;AAC1B,QAAI,IAAI,MAAM,qBAAK;AACf,UAAI,IAAI,KAAK,IAAI;AAAA,IACrB;AACA,QAAI,IAAI,MAAM,qBAAK;AACf,UAAI,IAAI,KAAK,IAAI;AAAA,IACrB;AAEA,SAAK,IAAI,IAAI,KAAK,IAAI,IAAI,GAAG,MAAM,CAAC;AACpC,SAAK,IAAI,IAAI,KAAK,IAAI,IAAI,GAAG,MAAM,CAAC;AACpC,SAAK,IAAI,IAAI,KAAK,IAAI,IAAI,GAAG,MAAM,CAAC;AACpC,SAAK,IAAI,IAAI,KAAK,IAAI,IAAI,GAAG,MAAM,CAAC;AAEpC,SAAK,cAAc;AAAA,EAEvB;AAAA,EAEA,MAAM,OAAe;AACjB,SAAK,YAAY;AACjB,YAAI,4BAAW,KAAK,IAAI,CAAC,GAAG;AACxB,WAAK,SAAS,KAAK,SAAS;AAAA,IAChC;AACA,YAAI,4BAAW,KAAK,IAAI,CAAC,GAAG;AACxB,WAAK,QAAQ,KAAK,QAAQ;AAAA,IAC9B;AAAA,EACJ;AAAA,EAEA,IAAI,SAAS;AACT,QAAI,KAAK,IAAI,MAAM,qBAAK;AACpB,aAAO;AAAA,IACX;AACA,WAAO,KAAK,IAAI,IAAI,KAAK,IAAI;AAAA,EACjC;AAAA,EAEA,IAAI,OAAO,QAAgB;AACvB,SAAK,YAAY;AACjB,SAAK,MAAM,IAAI,IAAI,KAAK,IAAI,IAAI;AAAA,EACpC;AAAA,EAGA,IAAI,QAAQ;AACR,QAAI,KAAK,IAAI,MAAM,qBAAK;AACpB,aAAO;AAAA,IACX;AACA,WAAO,KAAK,IAAI,IAAI,KAAK,IAAI;AAAA,EACjC;AAAA,EAEA,IAAI,MAAM,OAAe;AACrB,SAAK,YAAY;AACjB,SAAK,MAAM,IAAI,IAAI,KAAK,IAAI,IAAI;AAAA,EACpC;AAAA,EAGA,IAAI,IAAI;AACJ,WAAO,KAAK,IAAI;AAAA,EACpB;AAAA,EAEA,IAAI,EAAE,GAAW;AAEb,SAAK,YAAY;AACjB,SAAK,aAAa;AAElB,UAAM,QAAQ,KAAK;AACnB,SAAK,MAAM,IAAI,IAAI;AACnB,SAAK,MAAM,IAAI,IAAI,KAAK,IAAI,IAAI;AAEhC,SAAK,cAAc;AAAA,EAEvB;AAAA,EAGA,IAAI,IAAI;AACJ,WAAO,KAAK,IAAI;AAAA,EACpB;AAAA,EAGA,IAAI,EAAE,GAAW;AAEb,SAAK,YAAY;AACjB,SAAK,aAAa;AAElB,UAAM,SAAS,KAAK;AACpB,SAAK,MAAM,IAAI,IAAI;AACnB,SAAK,MAAM,IAAI,IAAI,KAAK,IAAI,IAAI;AAEhC,SAAK,cAAc;AAAA,EAEvB;AAAA,EAGA,IAAI,UAAU;AACV,WAAO,KAAK,IAAI,KAAK;AAAA,EACzB;AAAA,EAEA,IAAI,WAAW;AACX,WAAO,IAAI,uBAAQ,KAAK,IAAI,GAAG,KAAK,CAAC;AAAA,EACzC;AAAA,EAEA,IAAI,aAAa;AACb,WAAO,IAAI,uBAAQ,KAAK,GAAG,KAAK,IAAI,CAAC;AAAA,EACzC;AAAA,EAEA,IAAI,cAAc;AACd,WAAO,KAAK,IAAI,KAAK;AAAA,EACzB;AAAA,EAGA,IAAI,SAAS;AACT,WAAO,KAAK,IAAI,KAAK,EAAE,IAAI,KAAK,IAAI,GAAG,KAAK,GAAG,EAAE,MAAM,GAAG,CAAC;AAAA,EAC/D;AAAA,EAEA,IAAI,OAAO,QAAiB;AACxB,SAAK,YAAY;AACjB,UAAM,SAAS,KAAK,OAAO,GAAG,MAAM;AACpC,SAAK,cAAc,MAAM;AAAA,EAC7B;AAAA,EAEA,cAAc,QAAiB;AAC3B,SAAK,YAAY;AACjB,SAAK,IAAI,IAAI,MAAM;AACnB,SAAK,IAAI,IAAI,MAAM;AAEnB,WAAO;AAAA,EACX;AAAA,EAGA,yBAAyB,WAAwB;AAC7C,SAAK,oBAAoB,UAAU,WAAW;AAC9C,SAAK,oBAAoB,UAAU,OAAO;AAC1C,WAAO;AAAA,EACX;AAAA,EAEA,sCAAsC,WAAwB;AAC1D,WAAO,KAAK,SAAS,EAAE,yBAAyB,SAAS;AAAA,EAC7D;AAAA,EAGA,mCAAmC,WAAqC;AAEpE,UAAM,SAAS,KAAK,SAAS;AAC7B,WAAO,YAAY;AAEnB,WAAO,aAAa;AAEpB,UAAM,MAAM,OAAO;AACnB,QAAI,IAAI,MAAM,qBAAK;AACf,UAAI,IAAI,UAAU,IAAI,IAAI,KAAK,IAAI,OAAO,OAAO,UAAU,KAAK;AAAA,IACpE;AACA,QAAI,IAAI,MAAM,qBAAK;AACf,UAAI,IAAI,UAAU,IAAI,IAAI,KAAK,IAAI,OAAO,QAAQ,UAAU,MAAM;AAAA,IACtE;AAEA,UAAM,MAAM,OAAO;AACnB,QAAI,IAAI,MAAM,qBAAK;AACf,UAAI,IAAI,UAAU,IAAI,IAAI,KAAK,IAAI,OAAO,OAAO,UAAU,KAAK;AAAA,IACpE;AACA,QAAI,IAAI,MAAM,qBAAK;AACf,UAAI,IAAI,UAAU,IAAI,IAAI,KAAK,IAAI,OAAO,QAAQ,UAAU,MAAM;AAAA,IACtE;AAEA,WAAO,IAAI,IAAI,KAAK,IAAI,OAAO,IAAI,GAAG,UAAU,IAAI,CAAC;AACrD,WAAO,IAAI,IAAI,KAAK,IAAI,OAAO,IAAI,GAAG,UAAU,IAAI,CAAC;AACrD,WAAO,IAAI,IAAI,KAAK,IAAI,OAAO,IAAI,GAAG,UAAU,IAAI,CAAC;AACrD,WAAO,IAAI,IAAI,KAAK,IAAI,OAAO,IAAI,GAAG,UAAU,IAAI,CAAC;AAGrD,QAAI,OAAO,SAAS,GAAG;AAEnB,YAAM,YAAY,KAAK,OAAO,IAAI,UAAU,OAAO,KAAK;AACxD,aAAO,IAAI,IAAI;AACf,aAAO,IAAI,IAAI;AAAA,IAEnB;AAEA,QAAI,OAAO,QAAQ,GAAG;AAElB,YAAM,YAAY,KAAK,OAAO,IAAI,UAAU,OAAO,KAAK;AACxD,aAAO,IAAI,IAAI;AACf,aAAO,IAAI,IAAI;AAAA,IAEnB;AAEA,WAAO,cAAc;AAErB,WAAO;AAAA,EAEX;AAAA,EAGA,IAAI,OAAO;AACP,WAAO,KAAK,SAAS,KAAK;AAAA,EAC9B;AAAA,EAGA,wBAAwB,WAAwB;AAC5C,WAAQ,KAAK,mCAAmC,SAAS,EAAE,QAAQ;AAAA,EACvE;AAAA,EAIA,oBAAoB,MAAc,OAAe,QAAgB,KAAa;AAC1E,UAAM,SAAS,KAAK,SAAS;AAC7B,WAAO,YAAY;AACnB,WAAO,IAAI,IAAI,KAAK,IAAI,IAAI;AAC5B,WAAO,IAAI,IAAI,KAAK,IAAI,IAAI;AAC5B,WAAO,IAAI,IAAI,KAAK,IAAI,IAAI;AAC5B,WAAO,IAAI,IAAI,KAAK,IAAI,IAAI;AAC5B,WAAO;AAAA,EACX;AAAA,EAEA,mBAAmB,OAAe;AAC9B,WAAO,KAAK,oBAAoB,OAAO,OAAO,OAAO,KAAK;AAAA,EAC9D;AAAA,EAEA,oBAAoB,QAAoC,qBAA6B,qBAAK;AAEtF,aAAS,KAAK,4CAA4C,MAAM;AAEhE,QAAI,MAAM,kBAAkB,GAAG;AAC3B,2BAAqB;AAAA,IACzB;AAEA,UAAM,SAAS,KAAK,SAAS;AAC7B,WAAO,SAAS;AAEhB,QAAI,sBAAsB,qBAAK;AAC3B,YAAM,SAAS,SAAS,KAAK;AAC7B,aAAO,cAAc,IAAI,uBAAQ,GAAG,SAAS,kBAAkB,EAAE,MAAM,EAAE,CAAC;AAAA,IAC9E;AAEA,WAAO;AAAA,EAEX;AAAA,EAEA,mBAAmB,OAAmC,qBAA6B,qBAAK;AAEpF,YAAQ,KAAK,2CAA2C,KAAK;AAE7D,QAAI,MAAM,kBAAkB,GAAG;AAC3B,2BAAqB;AAAA,IACzB;AAEA,UAAM,SAAS,KAAK,SAAS;AAC7B,WAAO,QAAQ;AAEf,QAAI,sBAAsB,qBAAK;AAC3B,YAAM,SAAS,QAAQ,KAAK;AAC5B,aAAO,cAAc,IAAI,uBAAQ,SAAS,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;AAAA,IAC9E;AAEA,WAAO;AAAA,EAEX;AAAA,EAEA,mCAAmC,cAAsB,GAAG,qBAA6B,qBAAK;AAC1F,WAAO,KAAK,oBAAoB,KAAK,QAAQ,aAAa,kBAAkB;AAAA,EAChF;AAAA,EAEA,mCAAmC,aAAqB,GAAG,qBAA6B,qBAAK;AACzF,WAAO,KAAK,mBAAmB,KAAK,SAAS,YAAY,kBAAkB;AAAA,EAC/E;AAAA,EAEA,eAAe,GAAW,qBAA6B,GAAG;AAEtD,UAAM,SAAS,KAAK,SAAS;AAC7B,WAAO,IAAI,IAAI,OAAO,QAAQ;AAE9B,WAAO;AAAA,EAEX;AAAA,EAEA,eAAe,GAAW,qBAA6B,GAAG;AAEtD,UAAM,SAAS,KAAK,SAAS;AAC7B,WAAO,IAAI,IAAI,OAAO,SAAS;AAE/B,WAAO;AAAA,EAEX;AAAA,EAGA,mBAAmB,GAAW;AAE1B,UAAM,SAAS,KAAK,SAAS;AAC7B,WAAO,IAAI,KAAK,IAAI;AAEpB,WAAO;AAAA,EAEX;AAAA,EAEA,mBAAmB,GAAW;AAE1B,UAAM,SAAS,KAAK,SAAS;AAC7B,WAAO,IAAI,KAAK,IAAI;AAEpB,WAAO;AAAA,EAEX;AAAA,EAEA,uBAAuB,YAAoB,qBAAqB,GAAG;AAE/D,UAAM,SAAS,KAAK,mBAAmB,KAAK,QAAQ,YAAY,kBAAkB;AAElF,WAAO;AAAA,EAEX;AAAA,EAEA,wBAAwB,aAAqB,qBAAqB,GAAG;AAEjE,UAAM,SAAS,KAAK,oBAAoB,KAAK,SAAS,aAAa,kBAAkB;AAErF,WAAO;AAAA,EAEX;AAAA,EAGA,4BACI,mBACA,iBACA,mBACA,kBACF;AAEE,UAAM,SAAS,KAAK,SAAS;AAC7B,WAAO,YAAY;AAEnB,UAAM,QAAQ,OAAO;AACrB,UAAM,SAAS,OAAO;AAEtB,WAAO,QAAQ,kBAAkB;AACjC,WAAO,SAAS,mBAAmB;AAEnC,WAAO,SAAS,IAAI;AAAA,MAChB,oBAAoB;AAAA,MACpB,oBAAoB;AAAA,IACxB;AAEA,WAAO;AAAA,EAEX;AAAA,EAOA,sBAAsB,UAAkB,qBAA6B,GAAgB;AACjF,QAAI,KAAK,SAAS,UAAU;AACxB,aAAO,KAAK,SAAS;AAAA,IACzB;AACA,WAAO,KAAK,mBAAmB,UAAU,kBAAkB;AAAA,EAC/D;AAAA,EAKA,uBAAuB,WAAmB,qBAA6B,GAAgB;AACnF,QAAI,KAAK,UAAU,WAAW;AAC1B,aAAO,KAAK,SAAS;AAAA,IACzB;AACA,WAAO,KAAK,oBAAoB,WAAW,kBAAkB;AAAA,EACjE;AAAA,EAKA,sBAAsB,UAAkB,qBAA6B,GAAgB;AACjF,QAAI,KAAK,SAAS,UAAU;AACxB,aAAO,KAAK,SAAS;AAAA,IACzB;AACA,WAAO,KAAK,mBAAmB,UAAU,kBAAkB;AAAA,EAC/D;AAAA,EAKA,uBAAuB,WAAmB,qBAA6B,GAAgB;AACnF,QAAI,KAAK,UAAU,WAAW;AAC1B,aAAO,KAAK,SAAS;AAAA,IACzB;AACA,WAAO,KAAK,oBAAoB,WAAW,kBAAkB;AAAA,EACjE;AAAA,EAIA,gCAAgC,oBAAiC,YAAY,KAAK,YAAY,KAAK;AAC/F,UAAM,SAAS,KAAK,SAAS;AAC7B,WAAO,SAAS,mBAAmB,QAC9B,eAAe,YAAY,mBAAmB,KAAK,EACnD,eAAe,YAAY,mBAAmB,MAAM;AACzD,WAAO;AAAA,EACX;AAAA,EAGA,2BACI,SACA,WAAsE,GACtE,iBAA4E,qBAC9E;AAEE,YAAI,wBAAO,QAAQ,GAAG;AAClB,iBAAW;AAAA,IACf;AACA,QAAI,EAAG,oBAA4B,QAAQ;AACvC,iBAAW,CAAC,QAAQ,EAAE,iBAAiB,QAAQ,SAAS,CAAC;AAAA,IAC7D;AACA,eAAY,SAAmB,gCAAgC,QAAQ,SAAS,CAAC;AACjF,eAAW,SAAS,IAAI,aAAW,KAAK,2CAA2C,OAAO,CAAC;AAC3F,QAAI,EAAE,0BAA0B,cAAU,4BAAW,cAAc,GAAG;AAClE,uBAAiB,CAAC,cAAc,EAAE,iBAAiB,QAAQ,MAAM;AAAA,IACrE;AACA,qBAAiB,eAAe;AAAA,MAC5B,WAAS,KAAK,2CAA2C,KAAK;AAAA,IAClE;AAEA,cAAU,QAAQ,IAAI,YAAU,KAAK,2CAA2C,MAAM,CAAC;AACvF,UAAM,SAAwB,CAAC;AAC/B,UAAM,eAAgB,QAAqB;AAAA,MACvC,CAAC,GAAG,GAAG,UAAU;AACb,gBAAI,4BAAY,eAA4B,MAAM,GAAG;AACjD,cAAI;AAAA,QACR;AACA,eAAO,IAAI;AAAA,MACf;AAAA,MACA;AAAA,IACJ;AACA,UAAM,gBAAgB,SAAS;AAC/B,UAAM,sBAAuB,eAA4B;AACzD,UAAM,qBAAqB,KAAK,QAAQ,gBAAgB;AACxD,QAAI,mBAAmB,KAAK;AAE5B,aAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AAErC,UAAI;AACJ,cAAI,4BAAW,eAAe,EAAE,GAAG;AAC/B,sBAAe,eAAe,MAAM;AAAA,MACxC,OACK;AACD,sBAAc,sBAAsB,QAAQ,KAAe;AAAA,MAC/D;AAEA,YAAM,YAAY,KAAK,mBAAmB,WAAW;AAErD,UAAI,UAAU;AACd,UAAI,SAAS,SAAS,KAAK,SAAS,IAAI;AACpC,kBAAU,SAAS;AAAA,MACvB;AAEA,gBAAU,IAAI;AACd,yBAAmB,UAAU,IAAI,IAAI;AACrC,aAAO,KAAK,SAAS;AAAA,IAEzB;AAEA,WAAO;AAAA,EAEX;AAAA,EAEA,4BACI,SACA,WAAsE,GACtE,kBAA6E,qBAC/E;AAEE,YAAI,wBAAO,QAAQ,GAAG;AAClB,iBAAW;AAAA,IACf;AACA,QAAI,EAAG,oBAA4B,QAAQ;AACvC,iBAAW,CAAC,QAAQ,EAAE,iBAAiB,QAAQ,SAAS,CAAC;AAAA,IAC7D;AACA,eAAY,SAAsB,gCAAgC,QAAQ,SAAS,CAAC;AACpF,eAAW,SAAS,IAAI,aAAW,KAAK,4CAA4C,OAAO,CAAC;AAC5F,QAAI,EAAE,2BAA2B,cAAU,4BAAW,eAAe,GAAG;AACpE,wBAAkB,CAAC,eAAe,EAAE,iBAAiB,QAAQ,MAAM;AAAA,IACvE;AACA,sBAAkB,gBAAgB;AAAA,MAC9B,YAAU,KAAK,4CAA4C,MAAM;AAAA,IACrE;AAEA,cAAU,QAAQ,IAAI,YAAU,KAAK,4CAA4C,MAAM,CAAC;AACxF,UAAM,SAAwB,CAAC;AAC/B,UAAM,eAAgB,QAAqB;AAAA,MACvC,CAAC,GAAG,GAAG,UAAU;AACb,gBAAI,4BAAY,gBAA6B,MAAM,GAAG;AAClD,cAAI;AAAA,QACR;AACA,eAAO,IAAI;AAAA,MACf;AAAA,MACA;AAAA,IACJ;AACA,UAAM,gBAAgB,SAAS;AAC/B,UAAM,uBAAwB,gBAA6B;AAC3D,UAAM,sBAAsB,KAAK,SAAS,gBAAgB;AAC1D,QAAI,mBAAmB,KAAK;AAE5B,aAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACrC,UAAI;AACJ,cAAI,4BAAW,gBAAgB,EAAE,GAAG;AAEhC,uBAAgB,gBAAgB,MAAM;AAAA,MAE1C,OACK;AAED,uBAAe,uBAAuB,QAAQ,KAAe;AAAA,MAEjE;AAEA,YAAM,YAAY,KAAK,oBAAoB,YAAY;AAEvD,UAAI,UAAU;AACd,UAAI,SAAS,SAAS,KAAK,SAAS,IAAI;AACpC,kBAAU,SAAS;AAAA,MACvB;AAEA,gBAAU,IAAI;AACd,yBAAmB,UAAU,IAAI,IAAI;AAErC,aAAO,KAAK,SAAS;AAAA,IACzB;AAEA,WAAO;AAAA,EAEX;AAAA,EAGA,kCAAkC,gBAAwB,UAAkB,GAAG;AAC3E,UAAM,SAAwB,CAAC;AAC/B,UAAM,eAAe,WAAW,iBAAiB;AACjD,UAAM,eAAe,KAAK,QAAQ,gBAAgB;AAClD,aAAS,IAAI,GAAG,IAAI,gBAAgB,KAAK;AACrC,YAAM,YAAY,KAAK,mBAAmB,aAAa,KAAK,iBAAiB,EAAE;AAC/E,aAAO,KAAK,SAAS;AAAA,IACzB;AACA,WAAO;AAAA,EACX;AAAA,EAEA,mCAAmC,gBAAwB,UAAkB,GAAG;AAC5E,UAAM,SAAwB,CAAC;AAC/B,UAAM,eAAe,WAAW,iBAAiB;AACjD,UAAM,gBAAgB,KAAK,SAAS,gBAAgB;AACpD,aAAS,IAAI,GAAG,IAAI,gBAAgB,KAAK;AACrC,YAAM,YAAY,KAAK,oBAAoB,cAAc,KAAK,iBAAiB,EAAE;AACjF,aAAO,KAAK,SAAS;AAAA,IACzB;AACA,WAAO;AAAA,EACX;AAAA,EAGA,0BACI,OACA,UAAqE,GACrE,UACA,gBACF;AACE,QAAI,EAAE,mBAAmB,QAAQ;AAC7B,gBAAU,CAAC,OAAO,EAAE,iBAAiB,MAAM,MAAM;AAAA,IACrD;AACA,UAAM,SAAS,KAAK,2BAA2B,SAAS,UAAU,cAAc;AAChF,WAAO,QAAQ,CAAC,OAAO,cAAU,8BAAa,MAAM,MAAM,EAAE,QAAQ,KAAK;AACzE,WAAO;AAAA,EACX;AAAA,EAEA,2BACI,OACA,UAAqE,GACrE,UACA,iBACF;AACE,QAAI,EAAE,mBAAmB,QAAQ;AAC7B,gBAAU,CAAC,OAAO,EAAE,iBAAiB,MAAM,MAAM;AAAA,IACrD;AACA,UAAM,SAAS,KAAK,4BAA4B,SAAS,UAAU,eAAe;AAClF,WAAO,QAAQ,CAAC,OAAO,cAAU,8BAAa,MAAM,MAAM,EAAE,QAAQ,KAAK;AACzE,WAAO;AAAA,EACX;AAAA,EAGA,iCAAiC,OAAiB,SAAiB;AAC/D,UAAM,SAAS,KAAK,kCAAkC,MAAM,QAAQ,OAAO;AAC3E,WAAO,QAAQ,CAAC,OAAO,UAAU,MAAM,OAAO,QAAQ,KAAK;AAC3D,WAAO;AAAA,EACX;AAAA,EAEA,kCAAkC,OAAiB,SAAiB;AAChE,UAAM,SAAS,KAAK,mCAAmC,MAAM,QAAQ,OAAO;AAC5E,WAAO,QAAQ,CAAC,OAAO,UAAU,MAAM,OAAO,QAAQ,KAAK;AAC3D,WAAO;AAAA,EACX;AAAA,EAGA,4CAA4C,QAAoC;AAC5E,QAAI,kBAAkB,UAAU;AAC5B,aAAO,OAAO,KAAK,KAAK;AAAA,IAC5B;AACA,QAAI,kBAAkB,sBAAQ;AAC1B,aAAO,OAAO,uBAAuB,KAAK,KAAK;AAAA,IACnD;AACA,WAAO;AAAA,EACX;AAAA,EAEA,2CAA2C,OAAmC;AAC1E,QAAI,iBAAiB,UAAU;AAC3B,aAAO,MAAM,KAAK,MAAM;AAAA,IAC5B;AACA,QAAI,iBAAiB,sBAAQ;AACzB,aAAO,MAAM,sBAAsB,KAAK,MAAM;AAAA,IAClD;AACA,WAAO;AAAA,EACX;AAAA,EAEA,oBAAoB,UAAkB,GAAG,SAAqC,KAAK,QAAQ;AACvF,UAAM,eAAe,KAAK,4CAA4C,MAAM;AAC5E,UAAM,SAAS,KAAK,eAAe,KAAK,IAAI,IAAI,OAAO;AACvD,QAAI,gBAAgB,KAAK,QAAQ;AAC7B,aAAO,SAAS;AAAA,IACpB;AACA,WAAO;AAAA,EACX;AAAA,EAEA,uBAAuB,UAAkB,GAAG,QAAoC,KAAK,OAAO;AACxF,UAAM,cAAc,KAAK,2CAA2C,KAAK;AACzE,UAAM,SAAS,KAAK,eAAe,KAAK,IAAI,IAAI,OAAO;AACvD,QAAI,eAAe,KAAK,OAAO;AAC3B,aAAO,QAAQ;AAAA,IACnB;AACA,WAAO;AAAA,EACX;AAAA,EAEA,wBAAwB,UAAkB,GAAG,SAAqC,KAAK,QAAQ;AAC3F,UAAM,eAAe,KAAK,4CAA4C,MAAM;AAC5E,UAAM,SAAS,KAAK,eAAe,KAAK,IAAI,IAAI,eAAe,OAAO;AACtE,QAAI,gBAAgB,KAAK,QAAQ;AAC7B,aAAO,SAAS;AAAA,IACpB;AACA,WAAO;AAAA,EACX;AAAA,EAEA,2BAA2B,UAAkB,GAAG,QAAoC,KAAK,OAAO;AAC5F,UAAM,cAAc,KAAK,2CAA2C,KAAK;AACzE,UAAM,SAAS,KAAK,eAAe,KAAK,IAAI,IAAI,cAAc,OAAO;AACrE,QAAI,eAAe,KAAK,OAAO;AAC3B,aAAO,QAAQ;AAAA,IACnB;AACA,WAAO;AAAA,EAEX;AAAA,EAUA,kCACI,OACA,WAAsE,GACtE,kBAA6E,qBAC/E;AACE,UAAM,SAAwB,CAAC;AAC/B,QAAI,mBAAmB,KAAK,SAAS;AAErC,QAAI,EAAE,oBAAoB,QAAQ;AAC9B,iBAAW,CAAC,QAAQ,EAAE,iBAAiB,MAAM,SAAS,CAAC;AAAA,IAC3D;AACA,eAAW,SAAS,IAAI,aAAW,KAAK,4CAA4C,OAAO,CAAC;AAE5F,QAAI,EAAE,2BAA2B,cAAU,4BAAW,eAAe,GAAG;AACpE,wBAAkB,CAAC,eAAe,EAAE,iBAAiB,MAAM,MAAM;AAAA,IACrE;AACA,sBAAkB,gBAAgB;AAAA,MAC9B,YAAU,KAAK,4CAA4C,MAAM;AAAA,IACrE;AAEA,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACnC,YAAM,QAAQ,iBAAiB,oBAAoB,MAAM,EAAE;AAE3D,cAAI,4BAAW,gBAAgB,EAAE,GAAG;AAChC,cAAM,SAAS,gBAAgB;AAAA,MACnC;AAEA,YAAM,GAAG,QAAQ;AACjB,aAAO,KAAK,KAAK;AAEjB,YAAM,UAAW,SAAS,MAAM;AAChC,yBAAmB,MAAM,oBAAoB,OAAO;AAAA,IACxD;AAEA,WAAO;AAAA,EACX;AAAA,EAUA,+BACI,OACA,WAAsE,GACtE,iBAA4E,qBAC9E;AACE,UAAM,SAAwB,CAAC;AAC/B,QAAI,mBAAmB,KAAK,SAAS;AAErC,QAAI,EAAE,oBAAoB,QAAQ;AAC9B,iBAAW,CAAC,QAAQ,EAAE,iBAAiB,MAAM,SAAS,CAAC;AAAA,IAC3D;AACA,eAAW,SAAS,IAAI,aAAW,KAAK,2CAA2C,OAAO,CAAC;AAE3F,QAAI,EAAE,0BAA0B,cAAU,4BAAW,cAAc,GAAG;AAClE,uBAAiB,CAAC,cAAc,EAAE,iBAAiB,MAAM,MAAM;AAAA,IACnE;AACA,qBAAiB,eAAe;AAAA,MAC5B,WAAS,KAAK,2CAA2C,KAAK;AAAA,IAClE;AAEA,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACnC,YAAM,QAAQ,iBAAiB,mBAAmB,MAAM,EAAE;AAE1D,cAAI,4BAAW,eAAe,EAAE,GAAG;AAC/B,cAAM,QAAQ,eAAe;AAAA,MACjC;AAEA,YAAM,GAAG,QAAQ;AACjB,aAAO,KAAK,KAAK;AAEjB,YAAM,UAAW,SAAS,MAAM;AAChC,yBAAmB,MAAM,uBAAuB,OAAO;AAAA,IAC3D;AAEA,WAAO;AAAA,EACX;AAAA,EAYA,gCACI,OACA,WAAsE,GACtE,kBAA6E,qBAC/E;AACE,UAAM,SAA0B,CAAC;AACjC,QAAI,sBAAsB,KAAK,SAAS;AAExC,QAAI,EAAE,oBAAoB,QAAQ;AAC9B,iBAAW,CAAC,QAAQ,EAAE,iBAAiB,MAAM,SAAS,CAAC;AAAA,IAC3D;AACA,eAAW,SAAS,IAAI,aAAW,KAAK,4CAA4C,OAAO,CAAC;AAE5F,QAAI,EAAE,2BAA2B,cAAU,4BAAW,eAAe,GAAG;AACpE,wBAAkB,CAAC,eAAe,EAAE,iBAAiB,MAAM,MAAM;AAAA,IACrE;AACA,sBAAkB,gBAAgB;AAAA,MAC9B,YAAU,KAAK,4CAA4C,MAAM;AAAA,IACrE;AAEA,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACnC,YAAM,WAAW,MAAM;AACvB,YAAM,YAAY,oBAAoB,+BAA+B,QAAQ;AAE7E,cAAI,4BAAW,gBAAgB,EAAE,GAAG;AAChC,cAAM,eAAe,gBAAgB;AACrC,kBAAU,QAAQ,CAAC,OAAO,MAAM;AAC5B,gBAAM,SAAS;AACf,mBAAS,GAAG,QAAQ;AAAA,QACxB,CAAC;AAAA,MACL;AAEA,aAAO,KAAK,SAAS;AAErB,YAAM,UAAW,SAAS,MAAM;AAChC,YAAM,YAAY,KAAK,IAAI,GAAG,UAAU,IAAI,OAAK,EAAE,MAAM,CAAC;AAC1D,4BAAsB,oBAAoB,oBAAoB,SAAS,SAAS;AAAA,IACpF;AAEA,WAAO;AAAA,EACX;AAAA,EAEA,yCAAyC,MAAc,sBAAsB,GAAG,sBAAsB,GAAG;AACrG,UAAM,uBAAuB,KAAK,qBAAqB;AACvD,WAAO,KAAK,oBAAoB,qBAAqB,QAAQ,mBAAmB,EAC3E,mBAAmB,qBAAqB,OAAO,mBAAmB;AAAA,EAC3E;AAAA,EAEA,iBAAiB,WAAoB;AACjC,SAAK,YAAY;AACjB,WAAO;AAAA,EACX;AAAA,EAEA,gBAAgB,UAAmB;AAC/B,SAAK,WAAW;AAChB,WAAO;AAAA,EACX;AAAA,EAEA,iBAAiB,WAAoB;AACjC,SAAK,YAAY;AACjB,WAAO;AAAA,EACX;AAAA,EAEA,gBAAgB,UAAmB;AAC/B,SAAK,WAAW;AAChB,WAAO;AAAA,EACX;AAAA,EAEA,mCAAmC,sBAAsB,GAAG,sBAAsB,GAAG;AACjF,WAAO,KAAK;AAAA,MACR;AAAA,QACI,CAAC,KAAK,QAAQ,KAAK,SAAS,EAAE,OAAO,eAAS,kCAAiB,KAAK,CAAC,EAAE,IAAI;AAAA,QAC3E,KAAK;AAAA,MACT,EAAE,OAAO,eAAS,kCAAiB,KAAK,CAAC,EAAE,IAAI;AAAA,MAC/C;AAAA,IACJ,EAAE;AAAA,MACE;AAAA,QACI,CAAC,KAAK,OAAO,KAAK,QAAQ,EAAE,OAAO,eAAS,kCAAiB,KAAK,CAAC,EAAE,IAAI;AAAA,QACzE,KAAK;AAAA,MACT,EAAE,OAAO,eAAS,kCAAiB,KAAK,CAAC,EAAE,IAAI;AAAA,MAC/C;AAAA,IACJ;AAAA,EACJ;AAAA,EAGA,sBAAsB,MAAc,cAAc,KAAK,cAAc;AACjE,SAAK,QAAQ;AACb,SAAK,eAAe;AACpB,WAAO;AAAA,EACX;AAAA,EAGS,WAAW;AAEhB,UAAM,SAAS,MAAM,KAAK,MAAM,OAAO,YAAY,KAAK,IAAI,UAAU,KAAK,IAAI,eAC9D,KAAK,OAAO,QAAQ,CAAC,IAAI,cAAc,KAAK,OAAO,QAAQ,CAAC,IAAI;AAEjF,WAAO;AAAA,EAEX;AAAA,EAEA,KAAK,OAAO,eAAe;AACvB,WAAO,KAAK,SAAS;AAAA,EACzB;AAAA,EAGA,GAAG,WAA8D;AAC7D,UAAM,mBAAmB,IAAI,4BAA4B,MAAM,SAAS;AAExE,WAAO,iBAAiB,SAAS;AAAA,EACrC;AAAA,EAGA,QAAQ,WAAiC;AACrC,WAAO;AAAA,EACX;AAAA,EAEA,OAAoB;AAChB,WAAO;AAAA,EACX;AAAA,EAIA,MAAY,iBAA8C;AACtD,QAAI,iBAAiB;AACjB,aAAO,gBAAgB,IAAW;AAAA,IACtC;AACA,WAAO;AAAA,EACX;AAAA,EAIA,OAAO,qBAAqB,QAAmB;AAC3C,UAAM,SAAS,IAAI,YAAY;AAC/B,aAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACpC,aAAO,oBAAoB,OAAO,EAAE;AAAA,IACxC;AACA,WAAO;AAAA,EACX;AAAA,EAEA,OAAO,kCAAkC,qBAAgD;AACrF,UAAM,SAAS,IAAI,YAAY;AAC/B,aAAS,IAAI,GAAG,IAAI,oBAAoB,QAAQ,KAAK;AACjD,YAAM,mBAAmB,oBAAoB;AAC7C,UAAI,4BAA4B,aAAa;AACzC,eAAO,oBAAoB,iBAAiB,GAAG;AAC/C,eAAO,oBAAoB,iBAAiB,GAAG;AAAA,MACnD,OACK;AACD,eAAO,oBAAoB,gBAAgB;AAAA,MAC/C;AAAA,IACJ;AACA,WAAO;AAAA,EACX;AAAA,EAGA,eAAe;AACX,SAAK,kBAAkB;AAAA,EAC3B;AAAA,EAEA,gBAAgB;AACZ,SAAK,kBAAkB;AACvB,SAAK,UAAU;AAAA,EACnB;AAAA,EAGA,YAAY;AAAA,EAIZ;AAAA,EAEA,2BAA2B;AACvB,QAAI,CAAC,KAAK,iBAAiB;AACvB,WAAK,UAAU;AAAA,IACnB;AAAA,EACJ;AAGJ;AAqEA,MAAM,4BAA4B;AAAA,EAK9B,YAAY,eAA4B,WAAoB;AAIxD,SAAK,SAAS,CAAC;AAAA,MACX,gBAAgB;AAAA,MAChB,eAAe;AAAA,MACf,gBAAgB;AAAA,MAChB,cAAc;AAAA,IAClB,CAAC;AAAA,EACL;AAAA,EAGA,IAAY,OAAoC;AAC5C,WAAO,KAAK,OAAO,KAAK,OAAO,SAAS;AAAA,EAC5C;AAAA,EAEA,IAAY,gBAAyB;AAEjC,WAAO,KAAK,OAAO,MAAM,WAAS,MAAM,YAAY;AAAA,EACxD;AAAA,EAEQ,cAAqD;AACzD,UAAM,OAAO;AAEb,WAAO,IAAI,MAAM,CAAC,GAAG;AAAA,MACjB,IAAI,GAAG,MAAM;AAIT,YAAI,SAAS,MAAM;AACf,iBAAO,CAAC,cAAuB;AAI3B,iBAAK,OAAO,KAAK;AAAA,cACb,gBAAgB,KAAK,KAAK;AAAA,cAC1B,eAAe,KAAK,KAAK;AAAA,cACzB,gBAAgB,KAAK,KAAK;AAAA,cAC1B,cAAc;AAAA,YAClB,CAAC;AACD,mBAAO,KAAK,YAAY;AAAA,UAC5B;AAAA,QACJ;AAEA,YAAI,SAAS,aAAa;AACtB,iBAAO,CAAwB,OAA4B;AACvD,gBAAI,KAAK,eAAe;AACpB,mBAAK,KAAK,gBAAgB,GAAG,KAAK,KAAK,aAAa;AAAA,YACxD;AACA,mBAAO,KAAK,YAAY;AAAA,UAC5B;AAAA,QACJ;AAEA,YAAI,SAAS,WAAW;AACpB,iBAAO,CAAC,cAAuB;AAC3B,kBAAM,MAAM,KAAK;AACjB,gBAAI,CAAC,IAAI,cAAc;AACnB,kBAAI,eAAe;AACnB,kBAAI,gBAAgB,IAAI;AAAA,YAC5B;AACA,mBAAO,KAAK,YAAY;AAAA,UAC5B;AAAA,QACJ;AAEA,YAAI,SAAS,QAAQ;AACjB,iBAAO,MAAM;AACT,kBAAM,MAAM,KAAK;AACjB,gBAAI,CAAC,IAAI,cAAc;AACnB,kBAAI,eAAe;AACnB,kBAAI,gBAAgB,IAAI;AAAA,YAC5B;AACA,mBAAO,KAAK,YAAY;AAAA,UAC5B;AAAA,QACJ;AAEA,YAAI,SAAS,SAAS;AAGlB,cAASA,SAAT,SAAkB,iBAA+C;AAE7D,gBAAI,KAAK,OAAO,WAAW,GAAG;AAG1B,oBAAM,SAAS,KAAK,KAAK;AACzB,qBAAO,kBAAkB,gBAAgB,MAAM,IAAI;AAAA,YACvD;AAGA,kBAAM,iBAAiB,KAAK,OAAO,IAAI;AAIvC,kBAAM,iBAAiB,eAAe,eACb,eAAe,gBACf,eAAe;AAGxC,kBAAM,cAAc,kBAAkB,gBAAgB,cAAc,IAAI;AACxE,iBAAK,KAAK,gBAAgB;AAK1B,mBAAO,KAAK,YAAY;AAAA,UAC5B;AA1BS,sBAAAA;AA2BT,iBAAOA;AAAA,QACX;AAIA,cAAM,QAAQ,KAAK,KAAK,cAAc;AAGtC,YAAI,OAAO,UAAU,YAAY;AAC7B,iBAAO,IAAI,SAAgB;AACvB,gBAAI,KAAK,eAAe;AACpB,mBAAK,KAAK,gBAAgB,MAAM,MAAM,KAAK,KAAK,eAAe,IAAI;AAAA,YACvE;AACA,mBAAO,KAAK,YAAY;AAAA,UAC5B;AAAA,QACJ;AAGA,YAAI,KAAK,eAAe;AACpB,eAAK,KAAK,gBAAgB;AAAA,QAC9B;AAEA,eAAO,KAAK,YAAY;AAAA,MAC5B;AAAA,IACJ,CAAC;AAAA,EACL;AAAA,EAEA,WAAkD;AAC9C,WAAO,KAAK,YAAY;AAAA,EAC5B;AAEJ;",
|
|
4
|
+
"sourcesContent": ["import { FIRST_OR_NIL, IS, IS_DEFINED, IS_NIL, IS_NOT_LIKE_NULL, IS_NOT_NIL, nil, NO, UIObject, YES } from \"./UIObject\"\nimport { UIPoint } from \"./UIPoint\"\nimport { UIView } from \"./UIView\"\n\n\nexport type SizeNumberOrFunctionOrView = number | ((constrainingOrthogonalSize: number) => number) | UIView\n\nexport class UIRectangle extends UIObject {\n \n _isBeingUpdated: boolean\n rectanglePointDidChange?: (b: any) => void\n \n // COW: Internal data structure that can be shared\n private _data: {\n min: UIPoint\n max: UIPoint\n minHeight?: number\n maxHeight?: number\n minWidth?: number\n maxWidth?: number\n refCount: number\n }\n \n // COW: Flag to indicate this is a lazy copy\n private _isLazyCopy: boolean\n \n \n constructor(x: number = 0, y: number = 0, height: number = 0, width: number = 0) {\n \n super()\n \n this._isLazyCopy = NO\n this._isBeingUpdated = NO\n \n // COW: Create the shared data structure\n this._data = {\n min: new UIPoint(x, y),\n max: new UIPoint(x + width, y + height),\n refCount: 1\n }\n \n this._setupPointCallbacks()\n \n if (IS_NIL(height)) {\n this._data.max.y = height\n }\n \n if (IS_NIL(width)) {\n this._data.max.x = width\n }\n \n }\n \n // COW: Setup callbacks for point changes\n private _setupPointCallbacks() {\n this._data.min.didChange = (point) => {\n this.rectanglePointDidChange?.(point)\n this._rectanglePointDidChange()\n }\n this._data.max.didChange = (point) => {\n this.rectanglePointDidChange?.(point)\n this._rectanglePointDidChange()\n }\n }\n \n // COW: Materialize a lazy copy before mutation\n materialize() {\n if (this._isLazyCopy || this._data.refCount > 1) {\n this._data.refCount--\n \n const oldData = this._data\n this._data = {\n min: oldData.min.copy(),\n max: oldData.max.copy(),\n minHeight: oldData.minHeight,\n maxHeight: oldData.maxHeight,\n minWidth: oldData.minWidth,\n maxWidth: oldData.maxWidth,\n refCount: 1\n }\n \n this._setupPointCallbacks()\n this._isLazyCopy = NO\n }\n }\n \n // Copy on write: Lazy copy that shares data\n // Tested to reduce CPU time from 2.2% to 1% during heavy resizing\n lazyCopy(): UIRectangle {\n const result = Object.create(UIRectangle.prototype)\n result._data = this._data\n result._data.refCount++\n result._isLazyCopy = YES\n result._isBeingUpdated = NO\n result.rectanglePointDidChange = this.rectanglePointDidChange\n return result\n }\n \n // COW: Getters and setters that materialize on write\n get min(): UIPoint {\n return this._data.min\n }\n \n set min(value: UIPoint) {\n this.materialize()\n this._data.min = value\n this._setupPointCallbacks()\n }\n \n get max(): UIPoint {\n return this._data.max\n }\n \n set max(value: UIPoint) {\n this.materialize()\n this._data.max = value\n this._setupPointCallbacks()\n }\n \n get minHeight(): number | undefined {\n return this._data.minHeight\n }\n \n set minHeight(value: number | undefined) {\n this.materialize()\n this._data.minHeight = value\n }\n \n get maxHeight(): number | undefined {\n return this._data.maxHeight\n }\n \n set maxHeight(value: number | undefined) {\n this.materialize()\n this._data.maxHeight = value\n }\n \n get minWidth(): number | undefined {\n return this._data.minWidth\n }\n \n set minWidth(value: number | undefined) {\n this.materialize()\n this._data.minWidth = value\n }\n \n get maxWidth(): number | undefined {\n return this._data.maxWidth\n }\n \n set maxWidth(value: number | undefined) {\n this.materialize()\n this._data.maxWidth = value\n }\n \n \n copy() {\n \n const result = new UIRectangle(this.x, this.y, this.height, this.width)\n \n result.minHeight = this.minHeight\n result.minWidth = this.minWidth\n result.maxHeight = this.maxHeight\n result.maxWidth = this.maxWidth\n \n return result\n \n }\n \n isEqualTo(rectangle: UIRectangle | null | undefined) {\n return (IS(rectangle) && this.min.isEqualTo(rectangle.min) && this.max.isEqualTo(rectangle.max))\n }\n \n static zero() {\n return new UIRectangle(0, 0, 0, 0)\n }\n \n containsPoint(point: UIPoint) {\n return this.min.x <= point.x && this.min.y <= point.y &&\n point.x <= this.max.x && point.y <= this.max.y\n }\n \n updateByAddingPoint(point: UIPoint) {\n \n this.materialize() // COW: Materialize before mutation\n \n if (!point) {\n point = new UIPoint(0, 0)\n }\n \n this.beginUpdates()\n \n const min = this.min.copy()\n if (min.x === nil) {\n min.x = this.max.x\n }\n if (min.y === nil) {\n min.y = this.max.y\n }\n \n const max = this.max.copy()\n if (max.x === nil) {\n max.x = this.min.x\n }\n if (max.y === nil) {\n max.y = this.min.y\n }\n \n this.min.x = Math.min(min.x, point.x)\n this.min.y = Math.min(min.y, point.y)\n this.max.x = Math.max(max.x, point.x)\n this.max.y = Math.max(max.y, point.y)\n \n this.finishUpdates()\n \n }\n \n scale(scale: number) {\n this.materialize() // COW: Materialize before mutation\n if (IS_NOT_NIL(this.max.y)) {\n this.height = this.height * scale\n }\n if (IS_NOT_NIL(this.max.x)) {\n this.width = this.width * scale\n }\n }\n \n get height() {\n if (this.max.y === nil) {\n return nil\n }\n return this.max.y - this.min.y\n }\n \n set height(height: number) {\n this.materialize() // COW: Materialize before mutation\n this._data.max.y = this.min.y + height\n }\n \n \n get width() {\n if (this.max.x === nil) {\n return nil\n }\n return this.max.x - this.min.x\n }\n \n set width(width: number) {\n this.materialize() // COW: Materialize before mutation\n this._data.max.x = this.min.x + width\n }\n \n \n get x() {\n return this.min.x\n }\n \n set x(x: number) {\n \n this.materialize() // COW: Materialize before mutation\n this.beginUpdates()\n \n const width = this.width\n this._data.min.x = x\n this._data.max.x = this.min.x + width\n \n this.finishUpdates()\n \n }\n \n \n get y() {\n return this.min.y\n }\n \n \n set y(y: number) {\n \n this.materialize() // COW: Materialize before mutation\n this.beginUpdates()\n \n const height = this.height\n this._data.min.y = y\n this._data.max.y = this.min.y + height\n \n this.finishUpdates()\n \n }\n \n \n get topLeft() {\n return this.min.copy()\n }\n \n get topRight() {\n return new UIPoint(this.max.x, this.y)\n }\n \n get bottomLeft() {\n return new UIPoint(this.x, this.max.y)\n }\n \n get bottomRight() {\n return this.max.copy()\n }\n \n \n get center() {\n return this.min.copy().add(this.min.to(this.max).scale(0.5))\n }\n \n set center(center: UIPoint) {\n this.materialize() // COW: Materialize before mutation\n const offset = this.center.to(center)\n this.offsetByPoint(offset)\n }\n \n offsetByPoint(offset: UIPoint) {\n this.materialize() // COW: Materialize before mutation\n this.min.add(offset)\n this.max.add(offset)\n \n return this\n }\n \n \n concatenateWithRectangle(rectangle: UIRectangle) {\n this.updateByAddingPoint(rectangle.bottomRight)\n this.updateByAddingPoint(rectangle.topLeft)\n return this\n }\n \n rectangleByConcatenatingWithRectangle(rectangle: UIRectangle) {\n return this.lazyCopy().concatenateWithRectangle(rectangle) // COW: Use lazyCopy\n }\n \n \n intersectionRectangleWithRectangle(rectangle: UIRectangle): UIRectangle {\n \n const result = this.lazyCopy() // COW: Use lazyCopy\n result.materialize() // COW: We're going to modify it\n \n result.beginUpdates()\n \n const min = result.min\n if (min.x === nil) {\n min.x = rectangle.max.x - Math.min(result.width, rectangle.width)\n }\n if (min.y === nil) {\n min.y = rectangle.max.y - Math.min(result.height, rectangle.height)\n }\n \n const max = result.max\n if (max.x === nil) {\n max.x = rectangle.min.x + Math.min(result.width, rectangle.width)\n }\n if (max.y === nil) {\n max.y = rectangle.min.y + Math.min(result.height, rectangle.height)\n }\n \n result.min.x = Math.max(result.min.x, rectangle.min.x)\n result.min.y = Math.max(result.min.y, rectangle.min.y)\n result.max.x = Math.min(result.max.x, rectangle.max.x)\n result.max.y = Math.min(result.max.y, rectangle.max.y)\n \n \n if (result.height < 0) {\n \n const averageY = (this.center.y + rectangle.center.y) * 0.5\n result.min.y = averageY\n result.max.y = averageY\n \n }\n \n if (result.width < 0) {\n \n const averageX = (this.center.x + rectangle.center.x) * 0.5\n result.min.x = averageX\n result.max.x = averageX\n \n }\n \n result.finishUpdates()\n \n return result\n \n }\n \n \n get area() {\n return this.height * this.width\n }\n \n \n intersectsWithRectangle(rectangle: UIRectangle) {\n return (this.intersectionRectangleWithRectangle(rectangle).area != 0)\n }\n \n \n // add some space around the rectangle\n rectangleWithInsets(left: number, right: number, bottom: number, top: number) {\n const result = this.lazyCopy() // COW: Use lazyCopy\n result.materialize() // COW: We're modifying multiple properties\n result.min.x = this.min.x + left\n result.max.x = this.max.x - right\n result.min.y = this.min.y + top\n result.max.y = this.max.y - bottom\n return result\n }\n \n rectangleWithInset(inset: number) {\n return this.rectangleWithInsets(inset, inset, inset, inset)\n }\n \n rectangleWithHeight(height: SizeNumberOrFunctionOrView, centeredOnPosition: number = nil) {\n \n height = this._heightNumberFromSizeNumberOrFunctionOrView(height)\n \n if (isNaN(centeredOnPosition)) {\n centeredOnPosition = nil\n }\n \n const result = this.lazyCopy() // COW: Use lazyCopy\n result.height = height\n \n if (centeredOnPosition != nil) {\n const change = height - this.height\n result.offsetByPoint(new UIPoint(0, change * centeredOnPosition).scale(-1))\n }\n \n return result\n \n }\n \n rectangleWithWidth(width: SizeNumberOrFunctionOrView, centeredOnPosition: number = nil) {\n \n width = this._widthNumberFromSizeNumberOrFunctionOrView(width)\n \n if (isNaN(centeredOnPosition)) {\n centeredOnPosition = nil\n }\n \n const result = this.lazyCopy() // COW: Use lazyCopy\n result.width = width\n \n if (centeredOnPosition != nil) {\n const change = width - this.width\n result.offsetByPoint(new UIPoint(change * centeredOnPosition, 0).scale(-1))\n }\n \n return result\n \n }\n \n rectangleWithHeightRelativeToWidth(heightRatio: number = 1, centeredOnPosition: number = nil) {\n return this.rectangleWithHeight(this.width * heightRatio, centeredOnPosition)\n }\n \n rectangleWithWidthRelativeToHeight(widthRatio: number = 1, centeredOnPosition: number = nil) {\n return this.rectangleWithWidth(this.height * widthRatio, centeredOnPosition)\n }\n \n rectangleWithX(x: number, centeredOnPosition: number = 0) {\n \n const result = this.lazyCopy() // COW: Use lazyCopy\n result.x = x - result.width * centeredOnPosition\n \n return result\n \n }\n \n rectangleWithY(y: number, centeredOnPosition: number = 0) {\n \n const result = this.lazyCopy() // COW: Use lazyCopy\n result.y = y - result.height * centeredOnPosition\n \n return result\n \n }\n \n \n rectangleByAddingX(x: number) {\n \n const result = this.lazyCopy() // COW: Use lazyCopy\n result.x = this.x + x\n \n return result\n \n }\n \n rectangleByAddingY(y: number) {\n \n const result = this.lazyCopy() // COW: Use lazyCopy\n result.y = this.y + y\n \n return result\n \n }\n \n rectangleByAddingWidth(widthToAdd: number, centeredOnPosition = 0) {\n \n const result = this.rectangleWithWidth(this.width + widthToAdd, centeredOnPosition)\n \n return result\n \n }\n \n rectangleByAddingHeight(heightToAdd: number, centeredOnPosition = 0) {\n \n const result = this.rectangleWithHeight(this.height + heightToAdd, centeredOnPosition)\n \n return result\n \n }\n \n \n rectangleWithRelativeValues(\n relativeXPosition: number,\n widthMultiplier: number,\n relativeYPosition: number,\n heightMultiplier: number\n ) {\n \n const result = this.lazyCopy() // COW: Use lazyCopy\n result.materialize() // COW: We're modifying multiple properties\n \n const width = result.width\n const height = result.height\n \n result.width = widthMultiplier * width\n result.height = heightMultiplier * height\n \n result.center = new UIPoint(\n relativeXPosition * width,\n relativeYPosition * height\n )\n \n return result\n \n }\n \n \n /**\n * Returns a rectangle with a maximum width constraint\n * If current width exceeds max, centers the constrained width\n */\n rectangleWithMaxWidth(maxWidth: number, centeredOnPosition: number = 0): UIRectangle {\n if (this.width <= maxWidth) {\n return this.lazyCopy() // COW: Use lazyCopy\n }\n return this.rectangleWithWidth(maxWidth, centeredOnPosition)\n }\n \n /**\n * Returns a rectangle with a maximum height constraint\n */\n rectangleWithMaxHeight(maxHeight: number, centeredOnPosition: number = 0): UIRectangle {\n if (this.height <= maxHeight) {\n return this.lazyCopy() // COW: Use lazyCopy\n }\n return this.rectangleWithHeight(maxHeight, centeredOnPosition)\n }\n \n /**\n * Returns a rectangle with minimum width constraint\n */\n rectangleWithMinWidth(minWidth: number, centeredOnPosition: number = 0): UIRectangle {\n if (this.width >= minWidth) {\n return this.lazyCopy() // COW: Use lazyCopy\n }\n return this.rectangleWithWidth(minWidth, centeredOnPosition)\n }\n \n /**\n * Returns a rectangle with minimum height constraint\n */\n rectangleWithMinHeight(minHeight: number, centeredOnPosition: number = 0): UIRectangle {\n if (this.height >= minHeight) {\n return this.lazyCopy() // COW: Use lazyCopy\n }\n return this.rectangleWithHeight(minHeight, centeredOnPosition)\n }\n \n // Returns a new rectangle that is positioned relative to the reference rectangle\n // By default, it makes a copy of this rectangle taht is centered in the target rectangle\n rectangleByCenteringInRectangle(referenceRectangle: UIRectangle, xPosition = 0.5, yPosition = 0.5) {\n const result = this.lazyCopy() // COW: Use lazyCopy\n result.center = referenceRectangle.topLeft\n .pointByAddingX(xPosition * referenceRectangle.width)\n .pointByAddingY(yPosition * referenceRectangle.height)\n return result\n }\n \n \n rectanglesBySplittingWidth(\n weights: SizeNumberOrFunctionOrView[],\n paddings: SizeNumberOrFunctionOrView | SizeNumberOrFunctionOrView[] = 0,\n absoluteWidths: SizeNumberOrFunctionOrView | SizeNumberOrFunctionOrView[] = nil\n ) {\n \n if (IS_NIL(paddings)) {\n paddings = 1\n }\n if (!((paddings as any) instanceof Array)) {\n paddings = [paddings].arrayByRepeating(weights.length - 1)\n }\n paddings = (paddings as any[]).arrayByTrimmingToLengthIfLonger(weights.length - 1)\n paddings = paddings.map(padding => this._widthNumberFromSizeNumberOrFunctionOrView(padding))\n if (!(absoluteWidths instanceof Array) && IS_NOT_NIL(absoluteWidths)) {\n absoluteWidths = [absoluteWidths].arrayByRepeating(weights.length)\n }\n absoluteWidths = absoluteWidths.map(\n width => this._widthNumberFromSizeNumberOrFunctionOrView(width)\n )\n \n weights = weights.map(weight => this._widthNumberFromSizeNumberOrFunctionOrView(weight))\n const result: UIRectangle[] = []\n const sumOfWeights = (weights as number[]).reduce(\n (a, b, index) => {\n if (IS_NOT_NIL((absoluteWidths as number[])[index])) {\n b = 0\n }\n return a + b\n },\n 0\n )\n const sumOfPaddings = paddings.summedValue as number\n const sumOfAbsoluteWidths = (absoluteWidths as number[]).summedValue\n const totalRelativeWidth = this.width - sumOfPaddings - sumOfAbsoluteWidths\n let previousCellMaxX = this.x\n \n for (let i = 0; i < weights.length; i++) {\n \n let resultWidth: number\n if (IS_NOT_NIL(absoluteWidths[i])) {\n resultWidth = (absoluteWidths[i] || 0) as number\n }\n else {\n resultWidth = totalRelativeWidth * (weights[i] as number / sumOfWeights)\n }\n \n const rectangle = this.rectangleWithWidth(resultWidth)\n \n let padding = 0\n if (paddings.length > i && paddings[i]) {\n padding = paddings[i] as number\n }\n \n rectangle.x = previousCellMaxX\n previousCellMaxX = rectangle.max.x + padding\n result.push(rectangle)\n \n }\n \n return result\n \n }\n \n rectanglesBySplittingHeight(\n weights: SizeNumberOrFunctionOrView[],\n paddings: SizeNumberOrFunctionOrView | SizeNumberOrFunctionOrView[] = 0,\n absoluteHeights: SizeNumberOrFunctionOrView | SizeNumberOrFunctionOrView[] = nil\n ) {\n \n if (IS_NIL(paddings)) {\n paddings = 1\n }\n if (!((paddings as any) instanceof Array)) {\n paddings = [paddings].arrayByRepeating(weights.length - 1)\n }\n paddings = (paddings as number[]).arrayByTrimmingToLengthIfLonger(weights.length - 1)\n paddings = paddings.map(padding => this._heightNumberFromSizeNumberOrFunctionOrView(padding))\n if (!(absoluteHeights instanceof Array) && IS_NOT_NIL(absoluteHeights)) {\n absoluteHeights = [absoluteHeights].arrayByRepeating(weights.length)\n }\n absoluteHeights = absoluteHeights.map(\n height => this._heightNumberFromSizeNumberOrFunctionOrView(height)\n )\n \n weights = weights.map(weight => this._heightNumberFromSizeNumberOrFunctionOrView(weight))\n const result: UIRectangle[] = []\n const sumOfWeights = (weights as number[]).reduce(\n (a, b, index) => {\n if (IS_NOT_NIL((absoluteHeights as number[])[index])) {\n b = 0\n }\n return a + b\n },\n 0\n )\n const sumOfPaddings = paddings.summedValue as number\n const sumOfAbsoluteHeights = (absoluteHeights as number[]).summedValue\n const totalRelativeHeight = this.height - sumOfPaddings - sumOfAbsoluteHeights\n let previousCellMaxY = this.y\n \n for (let i = 0; i < weights.length; i++) {\n let resultHeight: number\n if (IS_NOT_NIL(absoluteHeights[i])) {\n \n resultHeight = (absoluteHeights[i] || 0) as number\n \n }\n else {\n \n resultHeight = totalRelativeHeight * (weights[i] as number / sumOfWeights)\n \n }\n \n const rectangle = this.rectangleWithHeight(resultHeight)\n \n let padding = 0\n if (paddings.length > i && paddings[i]) {\n padding = paddings[i] as number\n }\n \n rectangle.y = previousCellMaxY\n previousCellMaxY = rectangle.max.y + padding\n //rectangle = rectangle.rectangleWithInsets(0, 0, padding, 0);\n result.push(rectangle)\n }\n \n return result\n \n }\n \n \n rectanglesByEquallySplittingWidth(numberOfFrames: number, padding: number = 0) {\n const result: UIRectangle[] = []\n const totalPadding = padding * (numberOfFrames - 1)\n const resultWidth = (this.width - totalPadding) / numberOfFrames\n for (var i = 0; i < numberOfFrames; i++) {\n const rectangle = this.rectangleWithWidth(resultWidth, i / (numberOfFrames - 1))\n result.push(rectangle)\n }\n return result\n }\n \n rectanglesByEquallySplittingHeight(numberOfFrames: number, padding: number = 0) {\n const result: UIRectangle[] = []\n const totalPadding = padding * (numberOfFrames - 1)\n const resultHeight = (this.height - totalPadding) / numberOfFrames\n for (var i = 0; i < numberOfFrames; i++) {\n const rectangle = this.rectangleWithHeight(resultHeight, i / (numberOfFrames - 1))\n result.push(rectangle)\n }\n return result\n }\n \n \n distributeViewsAlongWidth(\n views: UIView[],\n weights: SizeNumberOrFunctionOrView | SizeNumberOrFunctionOrView[] = 1,\n paddings?: SizeNumberOrFunctionOrView | SizeNumberOrFunctionOrView[],\n absoluteWidths?: SizeNumberOrFunctionOrView | SizeNumberOrFunctionOrView[]\n ) {\n if (!(weights instanceof Array)) {\n weights = [weights].arrayByRepeating(views.length)\n }\n const frames = this.rectanglesBySplittingWidth(weights, paddings, absoluteWidths)\n frames.forEach((frame, index) => FIRST_OR_NIL(views[index]).frame = frame)\n return this\n }\n \n distributeViewsAlongHeight(\n views: UIView[],\n weights: SizeNumberOrFunctionOrView | SizeNumberOrFunctionOrView[] = 1,\n paddings?: SizeNumberOrFunctionOrView | SizeNumberOrFunctionOrView[],\n absoluteHeights?: SizeNumberOrFunctionOrView | SizeNumberOrFunctionOrView[]\n ) {\n if (!(weights instanceof Array)) {\n weights = [weights].arrayByRepeating(views.length)\n }\n const frames = this.rectanglesBySplittingHeight(weights, paddings, absoluteHeights)\n frames.forEach((frame, index) => FIRST_OR_NIL(views[index]).frame = frame)\n return this\n }\n \n \n distributeViewsEquallyAlongWidth(views: UIView[], padding: number) {\n const frames = this.rectanglesByEquallySplittingWidth(views.length, padding)\n frames.forEach((frame, index) => views[index].frame = frame)\n return this\n }\n \n distributeViewsEquallyAlongHeight(views: UIView[], padding: number) {\n const frames = this.rectanglesByEquallySplittingHeight(views.length, padding)\n frames.forEach((frame, index) => views[index].frame = frame)\n return this\n }\n \n \n _heightNumberFromSizeNumberOrFunctionOrView(height: SizeNumberOrFunctionOrView) {\n if (height instanceof Function) {\n return height(this.width)\n }\n if (height instanceof UIView) {\n return height.intrinsicContentHeight(this.width)\n }\n return height\n }\n \n _widthNumberFromSizeNumberOrFunctionOrView(width: SizeNumberOrFunctionOrView) {\n if (width instanceof Function) {\n return width(this.height)\n }\n if (width instanceof UIView) {\n return width.intrinsicContentWidth(this.height)\n }\n return width\n }\n \n rectangleForNextRow(padding: number = 0, height: SizeNumberOrFunctionOrView = this.height) {\n const heightNumber = this._heightNumberFromSizeNumberOrFunctionOrView(height)\n const result = this.rectangleWithY(this.max.y + padding)\n if (heightNumber != this.height) {\n result.height = heightNumber\n }\n return result\n }\n \n rectangleForNextColumn(padding: number = 0, width: SizeNumberOrFunctionOrView = this.width) {\n const widthNumber = this._widthNumberFromSizeNumberOrFunctionOrView(width)\n const result = this.rectangleWithX(this.max.x + padding)\n if (widthNumber != this.width) {\n result.width = widthNumber\n }\n return result\n }\n \n rectangleForPreviousRow(padding: number = 0, height: SizeNumberOrFunctionOrView = this.height) {\n const heightNumber = this._heightNumberFromSizeNumberOrFunctionOrView(height)\n const result = this.rectangleWithY(this.min.y - heightNumber - padding)\n if (heightNumber != this.height) {\n result.height = heightNumber\n }\n return result\n }\n \n rectangleForPreviousColumn(padding: number = 0, width: SizeNumberOrFunctionOrView = this.width) {\n const widthNumber = this._widthNumberFromSizeNumberOrFunctionOrView(width)\n const result = this.rectangleWithX(this.min.x - widthNumber - padding)\n if (widthNumber != this.width) {\n result.width = widthNumber\n }\n return result\n \n }\n \n /**\n * Distributes views vertically as a column, assigning frames and returning them.\n * Each view is positioned below the previous one with optional padding between them.\n * @param views - Array of views to distribute\n * @param paddings - Padding between views (single value or array of values)\n * @param absoluteHeights - Optional fixed heights for views (overrides intrinsic height)\n * @returns Array of rectangles representing the frame for each view\n */\n framesByDistributingViewsAsColumn(\n views: UIView[],\n paddings: SizeNumberOrFunctionOrView | SizeNumberOrFunctionOrView[] = 0,\n absoluteHeights: SizeNumberOrFunctionOrView | SizeNumberOrFunctionOrView[] = nil\n ) {\n const frames: UIRectangle[] = []\n let currentRectangle = this.lazyCopy() // COW: Use lazyCopy\n \n if (!(paddings instanceof Array)) {\n paddings = [paddings].arrayByRepeating(views.length - 1)\n }\n paddings = paddings.map(padding => this._heightNumberFromSizeNumberOrFunctionOrView(padding))\n \n if (!(absoluteHeights instanceof Array) && IS_NOT_NIL(absoluteHeights)) {\n absoluteHeights = [absoluteHeights].arrayByRepeating(views.length)\n }\n absoluteHeights = absoluteHeights.map(\n height => this._heightNumberFromSizeNumberOrFunctionOrView(height)\n )\n \n for (let i = 0; i < views.length; i++) {\n const frame = currentRectangle.rectangleWithHeight(views[i])\n \n if (IS_NOT_NIL(absoluteHeights[i])) {\n frame.height = absoluteHeights[i] as number\n }\n \n views[i].frame = frame\n frames.push(frame)\n \n const padding = (paddings[i] || 0) as number\n currentRectangle = frame.rectangleForNextRow(padding)\n }\n \n return frames\n }\n \n /**\n * Distributes views horizontally as a row, assigning frames and returning them.\n * Each view is positioned to the right of the previous one with optional padding between them.\n * @param views - Array of views to distribute\n * @param paddings - Padding between views (single value or array of values)\n * @param absoluteWidths - Optional fixed widths for views (overrides intrinsic width)\n * @returns Array of rectangles representing the frame for each view\n */\n framesByDistributingViewsAsRow(\n views: UIView[],\n paddings: SizeNumberOrFunctionOrView | SizeNumberOrFunctionOrView[] = 0,\n absoluteWidths: SizeNumberOrFunctionOrView | SizeNumberOrFunctionOrView[] = nil\n ) {\n const frames: UIRectangle[] = []\n let currentRectangle = this.lazyCopy() // COW: Use lazyCopy\n \n if (!(paddings instanceof Array)) {\n paddings = [paddings].arrayByRepeating(views.length - 1)\n }\n paddings = paddings.map(padding => this._widthNumberFromSizeNumberOrFunctionOrView(padding))\n \n if (!(absoluteWidths instanceof Array) && IS_NOT_NIL(absoluteWidths)) {\n absoluteWidths = [absoluteWidths].arrayByRepeating(views.length)\n }\n absoluteWidths = absoluteWidths.map(\n width => this._widthNumberFromSizeNumberOrFunctionOrView(width)\n )\n \n for (let i = 0; i < views.length; i++) {\n const frame = currentRectangle.rectangleWithWidth(views[i])\n \n if (IS_NOT_NIL(absoluteWidths[i])) {\n frame.width = absoluteWidths[i] as number\n }\n \n views[i].frame = frame\n frames.push(frame)\n \n const padding = (paddings[i] || 0) as number\n currentRectangle = frame.rectangleForNextColumn(padding)\n }\n \n return frames\n }\n \n /**\n * Distributes views as a grid (2D array), assigning frames and returning them.\n * The first index represents rows (vertical), the second index represents columns (horizontal).\n * Example: views[0] is the first row, views[0][0] is the first column in the first row.\n * Each row is laid out horizontally, and rows are stacked vertically.\n * @param views - 2D array where views[row][column] represents the grid structure\n * @param paddings - Vertical padding between rows (single value or array of values)\n * @param absoluteHeights - Optional fixed heights for each row (overrides intrinsic height)\n * @returns 2D array of rectangles where frames[row][column] matches views[row][column]\n */\n framesByDistributingViewsAsGrid(\n views: UIView[][],\n paddings: SizeNumberOrFunctionOrView | SizeNumberOrFunctionOrView[] = 0,\n absoluteHeights: SizeNumberOrFunctionOrView | SizeNumberOrFunctionOrView[] = nil\n ) {\n const frames: UIRectangle[][] = []\n let currentRowRectangle = this.lazyCopy() // COW: Use lazyCopy\n \n if (!(paddings instanceof Array)) {\n paddings = [paddings].arrayByRepeating(views.length - 1)\n }\n paddings = paddings.map(padding => this._heightNumberFromSizeNumberOrFunctionOrView(padding))\n \n if (!(absoluteHeights instanceof Array) && IS_NOT_NIL(absoluteHeights)) {\n absoluteHeights = [absoluteHeights].arrayByRepeating(views.length)\n }\n absoluteHeights = absoluteHeights.map(\n height => this._heightNumberFromSizeNumberOrFunctionOrView(height)\n )\n \n for (let i = 0; i < views.length; i++) {\n const rowViews = views[i]\n const rowFrames = currentRowRectangle.framesByDistributingViewsAsRow(rowViews)\n \n if (IS_NOT_NIL(absoluteHeights[i])) {\n const heightNumber = absoluteHeights[i] as number\n rowFrames.forEach((frame, j) => {\n frame.height = heightNumber\n rowViews[j].frame = frame\n })\n }\n \n frames.push(rowFrames)\n \n const padding = (paddings[i] || 0) as number\n const maxHeight = Math.max(...rowFrames.map(f => f.height))\n currentRowRectangle = currentRowRectangle.rectangleForNextRow(padding, maxHeight)\n }\n \n return frames\n }\n \n rectangleWithIntrinsicContentSizeForView(view: UIView, centeredOnXPosition = 0, centeredOnYPosition = 0) {\n const intrinsicContentSize = view.intrinsicContentSize()\n return this.rectangleWithHeight(intrinsicContentSize.height, centeredOnYPosition)\n .rectangleWithWidth(intrinsicContentSize.width, centeredOnXPosition)\n }\n \n settingMinHeight(minHeight?: number) {\n this.minHeight = minHeight\n return this\n }\n \n settingMinWidth(minWidth?: number) {\n this.minWidth = minWidth\n return this\n }\n \n settingMaxHeight(maxHeight?: number) {\n this.maxHeight = maxHeight\n return this\n }\n \n settingMaxWidth(maxWidth?: number) {\n this.maxWidth = maxWidth\n return this\n }\n \n rectangleByEnforcingMinAndMaxSizes(centeredOnXPosition = 0, centeredOnYPosition = 0) {\n return this.rectangleWithHeight(\n [\n [this.height, this.maxHeight].filter(value => IS_NOT_LIKE_NULL(value)).min(),\n this.minHeight\n ].filter(value => IS_NOT_LIKE_NULL(value)).max(),\n centeredOnYPosition\n ).rectangleWithWidth(\n [\n [this.width, this.maxWidth].filter(value => IS_NOT_LIKE_NULL(value)).min(),\n this.minWidth\n ].filter(value => IS_NOT_LIKE_NULL(value)).max(),\n centeredOnXPosition\n )\n }\n \n \n assignedAsFrameOfView(view: UIView, isWeakFrame = view.hasWeakFrame) {\n view.frame = this\n view.hasWeakFrame = isWeakFrame\n return this\n }\n \n \n override toString() {\n \n const result = \"[\" + this.class.name + \"] { x: \" + this.x + \", y: \" + this.y + \", \" +\n \"height: \" + this.height.toFixed(2) + \", width: \" + this.height.toFixed(2) + \" }\"\n \n return result\n \n }\n \n get [Symbol.toStringTag]() {\n return this.toString()\n }\n \n \n IF(condition: boolean): UIRectangleConditionalChain<UIRectangle> {\n const conditionalBlock = new UIRectangleConditionalBlock(this, condition)\n // @ts-ignore\n return conditionalBlock.getProxy()\n }\n \n // These will be intercepted by the proxy, but we define them for TypeScript\n ELSE_IF(condition: boolean): UIRectangle {\n return this\n }\n \n ELSE(): UIRectangle {\n return this\n }\n \n ENDIF(): this\n ENDIF<T, R>(performFunction: (result: T) => R): R\n ENDIF<T, R>(performFunction?: (result: T) => R): R | this {\n if (performFunction) {\n return performFunction(this as any)\n }\n return this\n }\n \n \n // Bounding box\n static boundingBoxForPoints(points: UIPoint[]) {\n const result = new UIRectangle()\n for (let i = 0; i < points.length; i++) {\n result.updateByAddingPoint(points[i])\n }\n return result\n }\n \n static boundingBoxForRectanglesAndPoints(rectanglesAndPoints: (UIPoint | UIRectangle)[]) {\n const result = new UIRectangle()\n for (let i = 0; i < rectanglesAndPoints.length; i++) {\n const rectangleOrPoint = rectanglesAndPoints[i]\n if (rectangleOrPoint instanceof UIRectangle) {\n result.updateByAddingPoint(rectangleOrPoint.min)\n result.updateByAddingPoint(rectangleOrPoint.max)\n }\n else {\n result.updateByAddingPoint(rectangleOrPoint)\n }\n }\n return result\n }\n \n \n beginUpdates() {\n this._isBeingUpdated = YES\n }\n \n finishUpdates() {\n this._isBeingUpdated = NO\n this.didChange()\n }\n \n \n didChange() {\n \n // Callback to be set by delegate\n \n }\n \n _rectanglePointDidChange() {\n if (!this._isBeingUpdated) {\n this.didChange()\n }\n }\n \n \n}\n\n\n// 1. Methods available when holding a UIRectangle\ntype RectangleChainMethods<TResult> = {\n [K in keyof UIRectangle as (\n K extends 'IF' | 'ELSE' | 'ELSE_IF' | 'ENDIF' ? never : K\n )]:\n UIRectangle[K] extends (...args: infer Args) => infer R\n ? R extends UIRectangle | UIRectangle[]\n // CHANGE: We do NOT add 'R' to 'TResult' here. We only update the current state (R).\n ? (...args: Args) => UIRectangleConditionalChain<R, TResult>\n : never\n : never\n};\n\n// 2. Methods available when holding a UIRectangle[]\ntype ArrayChainMethods<TResult> = {\n [K in keyof UIRectangle[]]:\n UIRectangle[][K] extends UIRectangle\n ? UIRectangleConditionalChain<UIRectangle, TResult> // No accumulation for properties\n : UIRectangle[][K] extends (...args: infer Args) => infer R\n ? R extends UIRectangle | UIRectangle[]\n // CHANGE: We do NOT add 'R' to 'TResult' here either.\n ? (...args: Args) => UIRectangleConditionalChain<R, TResult>\n : never\n : never\n};\n\n// 3. Methods available in both states (Control Flow + Transform)\ntype SharedChainMethods<TCurrent, TResult> = {\n // IF opens a nested conditional block. After the matching ENDIF(), the chain resumes\n // as a UIRectangle \u2014 both at runtime (the proxy forwards to the current rectangle) and\n // at the type level. Nesting is supported to arbitrary depth.\n IF(condition: boolean): UIRectangleConditionalChain<UIRectangle, TResult>;\n \n // TRANSFORM applies an inline function and continues the chain.\n TRANSFORM<R extends UIRectangle>(fn: (current: TCurrent) => R): UIRectangleConditionalChain<R, TResult>;\n \n // ELSE_IF / ELSE reset the branch state.\n ELSE_IF(condition: boolean): UIRectangleConditionalChain<UIRectangle, TResult | TCurrent>;\n ELSE(): UIRectangleConditionalChain<UIRectangle, TResult | TCurrent>;\n \n // ENDIF closes this IF block.\n // No-arg: always typed as UIRectangle so rectangle methods are available immediately\n // after. At runtime the proxy wraps the current rectangle and forwards all calls.\n // With transform fn: returns R directly, escaping the chain entirely.\n ENDIF(): UIRectangle;\n ENDIF<R>(performFunction: (result: TResult | TCurrent) => R): R;\n};\n\n// 4. The Main Type (No changes needed here, just re-stating for context)\ntype UIRectangleConditionalChain<TCurrent, TResult = TCurrent> =\n (TCurrent extends UIRectangle ? RectangleChainMethods<TResult> : {}) &\n (TCurrent extends UIRectangle[] ? ArrayChainMethods<TResult> : {}) &\n SharedChainMethods<TCurrent, TResult>;\n\n\ninterface UIRectangleConditionalFrame {\n // The result to resume from when this frame's ENDIF is reached (if no branch matched)\n resultBeforeIF: any\n // The result accumulated inside the active branch of this frame\n currentResult: any\n // The result at the point of IF \u2014 used to reset currentResult when entering each new branch\n originalResult: any\n // Whether any branch of this frame has already been taken (latches to true, never resets)\n anyConditionMet: boolean\n // Whether the current branch is the one that was taken (flips per ELSE_IF / ELSE)\n currentBranchActive: boolean\n}\n\nclass UIRectangleConditionalBlock {\n \n // Stack of nested IF frames. The top of the stack is the innermost active IF.\n private _stack: UIRectangleConditionalFrame[]\n \n constructor(initialResult: UIRectangle, condition: boolean) {\n // Seed the stack with the first IF frame.\n // resultBeforeIF is null here because this is the outermost block;\n // ENDIF on the last frame simply returns currentResult.\n this._stack = [{\n resultBeforeIF: null,\n currentResult: initialResult,\n originalResult: initialResult,\n anyConditionMet: condition,\n currentBranchActive: condition,\n }]\n }\n \n // Convenience getter that operates on the innermost frame.\n private get _top(): UIRectangleConditionalFrame {\n return this._stack[this._stack.length - 1]\n }\n \n // A method body should only execute when every frame in the stack has its\n // current branch active (handles nested IFs correctly).\n private get _shouldExecute(): boolean {\n return this._stack.every(frame => frame.currentBranchActive)\n }\n \n private createProxy(): UIRectangleConditionalChain<any, any> {\n const self = this\n \n return new Proxy({}, {\n get(_, prop) {\n \n // \u2500\u2500 Control Flow \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n \n if (prop === 'IF') {\n return (condition: boolean) => {\n // Push a new frame. The new frame's result starts as a copy of\n // the current innermost result so that chaining inside the nested\n // IF begins from the right value.\n self._stack.push({\n resultBeforeIF: self._top.currentResult,\n currentResult: self._top.currentResult,\n originalResult: self._top.currentResult,\n anyConditionMet: condition,\n currentBranchActive: condition,\n })\n return self.createProxy()\n }\n }\n \n if (prop === 'TRANSFORM') {\n return <R extends UIRectangle>(fn: (current: any) => R) => {\n if (self._shouldExecute) {\n self._top.currentResult = fn(self._top.currentResult)\n }\n return self.createProxy()\n }\n }\n \n if (prop === 'ELSE_IF') {\n return (condition: boolean) => {\n const top = self._top\n // Only consider this branch if no prior branch has been taken.\n // Always deactivate the current branch first, then activate only\n // if this condition is true and nothing has matched yet.\n top.currentBranchActive = !top.anyConditionMet && condition\n if (top.currentBranchActive) {\n top.anyConditionMet = true\n top.currentResult = top.originalResult\n }\n return self.createProxy()\n }\n }\n \n if (prop === 'ELSE') {\n return () => {\n const top = self._top\n top.currentBranchActive = !top.anyConditionMet\n if (top.currentBranchActive) {\n top.anyConditionMet = true\n top.currentResult = top.originalResult\n }\n return self.createProxy()\n }\n }\n \n if (prop === 'ENDIF') {\n function endif(): any\n function endif<R>(performFunction: (result: any) => R): R\n function endif<R>(performFunction?: (result: any) => R): R | any {\n \n if (self._stack.length === 1) {\n // Outermost ENDIF. Return the bare rectangle (or transform it).\n const result = self._top.currentResult\n return performFunction ? performFunction(result) : result\n }\n \n // Pop the innermost (nested) frame.\n const completedFrame = self._stack.pop()!\n \n // If any branch was taken use its accumulated result; otherwise\n // fall back to the value that existed before entering this IF.\n const resolvedResult = completedFrame.anyConditionMet\n ? completedFrame.currentResult\n : completedFrame.resultBeforeIF\n \n // Optionally transform, then write back into the parent frame.\n const finalResult = performFunction ? performFunction(resolvedResult) : resolvedResult\n self._top.currentResult = finalResult\n \n // Return the proxy so the outer chain can continue.\n return self.createProxy()\n }\n return endif\n }\n \n // \u2500\u2500 Forward to currentResult (UIRectangle or UIRectangle[]) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n \n const value = self._top.currentResult[prop]\n \n // Case A: method call\n if (typeof value === 'function') {\n return (...args: any[]) => {\n if (self._shouldExecute) {\n self._top.currentResult = value.apply(self._top.currentResult, args)\n }\n return self.createProxy()\n }\n }\n \n // Case B: property access (e.g. array .lastElement)\n if (self._shouldExecute) {\n self._top.currentResult = value\n }\n \n return self.createProxy()\n }\n }) as any\n }\n \n getProxy(): UIRectangleConditionalChain<any, any> {\n return this.createProxy()\n }\n \n}\n\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAA2G;AAC3G,qBAAwB;AACxB,oBAAuB;AAKhB,MAAM,oBAAoB,yBAAS;AAAA,EAoBtC,YAAY,IAAY,GAAG,IAAY,GAAG,SAAiB,GAAG,QAAgB,GAAG;AAE7E,UAAM;AAEN,SAAK,cAAc;AACnB,SAAK,kBAAkB;AAGvB,SAAK,QAAQ;AAAA,MACT,KAAK,IAAI,uBAAQ,GAAG,CAAC;AAAA,MACrB,KAAK,IAAI,uBAAQ,IAAI,OAAO,IAAI,MAAM;AAAA,MACtC,UAAU;AAAA,IACd;AAEA,SAAK,qBAAqB;AAE1B,YAAI,wBAAO,MAAM,GAAG;AAChB,WAAK,MAAM,IAAI,IAAI;AAAA,IACvB;AAEA,YAAI,wBAAO,KAAK,GAAG;AACf,WAAK,MAAM,IAAI,IAAI;AAAA,IACvB;AAAA,EAEJ;AAAA,EAGQ,uBAAuB;AAC3B,SAAK,MAAM,IAAI,YAAY,CAAC,UAAU;AAvD9C;AAwDY,iBAAK,4BAAL,8BAA+B;AAC/B,WAAK,yBAAyB;AAAA,IAClC;AACA,SAAK,MAAM,IAAI,YAAY,CAAC,UAAU;AA3D9C;AA4DY,iBAAK,4BAAL,8BAA+B;AAC/B,WAAK,yBAAyB;AAAA,IAClC;AAAA,EACJ;AAAA,EAGA,cAAc;AACV,QAAI,KAAK,eAAe,KAAK,MAAM,WAAW,GAAG;AAC7C,WAAK,MAAM;AAEX,YAAM,UAAU,KAAK;AACrB,WAAK,QAAQ;AAAA,QACT,KAAK,QAAQ,IAAI,KAAK;AAAA,QACtB,KAAK,QAAQ,IAAI,KAAK;AAAA,QACtB,WAAW,QAAQ;AAAA,QACnB,WAAW,QAAQ;AAAA,QACnB,UAAU,QAAQ;AAAA,QAClB,UAAU,QAAQ;AAAA,QAClB,UAAU;AAAA,MACd;AAEA,WAAK,qBAAqB;AAC1B,WAAK,cAAc;AAAA,IACvB;AAAA,EACJ;AAAA,EAIA,WAAwB;AACpB,UAAM,SAAS,OAAO,OAAO,YAAY,SAAS;AAClD,WAAO,QAAQ,KAAK;AACpB,WAAO,MAAM;AACb,WAAO,cAAc;AACrB,WAAO,kBAAkB;AACzB,WAAO,0BAA0B,KAAK;AACtC,WAAO;AAAA,EACX;AAAA,EAGA,IAAI,MAAe;AACf,WAAO,KAAK,MAAM;AAAA,EACtB;AAAA,EAEA,IAAI,IAAI,OAAgB;AACpB,SAAK,YAAY;AACjB,SAAK,MAAM,MAAM;AACjB,SAAK,qBAAqB;AAAA,EAC9B;AAAA,EAEA,IAAI,MAAe;AACf,WAAO,KAAK,MAAM;AAAA,EACtB;AAAA,EAEA,IAAI,IAAI,OAAgB;AACpB,SAAK,YAAY;AACjB,SAAK,MAAM,MAAM;AACjB,SAAK,qBAAqB;AAAA,EAC9B;AAAA,EAEA,IAAI,YAAgC;AAChC,WAAO,KAAK,MAAM;AAAA,EACtB;AAAA,EAEA,IAAI,UAAU,OAA2B;AACrC,SAAK,YAAY;AACjB,SAAK,MAAM,YAAY;AAAA,EAC3B;AAAA,EAEA,IAAI,YAAgC;AAChC,WAAO,KAAK,MAAM;AAAA,EACtB;AAAA,EAEA,IAAI,UAAU,OAA2B;AACrC,SAAK,YAAY;AACjB,SAAK,MAAM,YAAY;AAAA,EAC3B;AAAA,EAEA,IAAI,WAA+B;AAC/B,WAAO,KAAK,MAAM;AAAA,EACtB;AAAA,EAEA,IAAI,SAAS,OAA2B;AACpC,SAAK,YAAY;AACjB,SAAK,MAAM,WAAW;AAAA,EAC1B;AAAA,EAEA,IAAI,WAA+B;AAC/B,WAAO,KAAK,MAAM;AAAA,EACtB;AAAA,EAEA,IAAI,SAAS,OAA2B;AACpC,SAAK,YAAY;AACjB,SAAK,MAAM,WAAW;AAAA,EAC1B;AAAA,EAGA,OAAO;AAEH,UAAM,SAAS,IAAI,YAAY,KAAK,GAAG,KAAK,GAAG,KAAK,QAAQ,KAAK,KAAK;AAEtE,WAAO,YAAY,KAAK;AACxB,WAAO,WAAW,KAAK;AACvB,WAAO,YAAY,KAAK;AACxB,WAAO,WAAW,KAAK;AAEvB,WAAO;AAAA,EAEX;AAAA,EAEA,UAAU,WAA2C;AACjD,eAAQ,oBAAG,SAAS,KAAK,KAAK,IAAI,UAAU,UAAU,GAAG,KAAK,KAAK,IAAI,UAAU,UAAU,GAAG;AAAA,EAClG;AAAA,EAEA,OAAO,OAAO;AACV,WAAO,IAAI,YAAY,GAAG,GAAG,GAAG,CAAC;AAAA,EACrC;AAAA,EAEA,cAAc,OAAgB;AAC1B,WAAO,KAAK,IAAI,KAAK,MAAM,KAAK,KAAK,IAAI,KAAK,MAAM,KAChD,MAAM,KAAK,KAAK,IAAI,KAAK,MAAM,KAAK,KAAK,IAAI;AAAA,EACrD;AAAA,EAEA,oBAAoB,OAAgB;AAEhC,SAAK,YAAY;AAEjB,QAAI,CAAC,OAAO;AACR,cAAQ,IAAI,uBAAQ,GAAG,CAAC;AAAA,IAC5B;AAEA,SAAK,aAAa;AAElB,UAAM,MAAM,KAAK,IAAI,KAAK;AAC1B,QAAI,IAAI,MAAM,qBAAK;AACf,UAAI,IAAI,KAAK,IAAI;AAAA,IACrB;AACA,QAAI,IAAI,MAAM,qBAAK;AACf,UAAI,IAAI,KAAK,IAAI;AAAA,IACrB;AAEA,UAAM,MAAM,KAAK,IAAI,KAAK;AAC1B,QAAI,IAAI,MAAM,qBAAK;AACf,UAAI,IAAI,KAAK,IAAI;AAAA,IACrB;AACA,QAAI,IAAI,MAAM,qBAAK;AACf,UAAI,IAAI,KAAK,IAAI;AAAA,IACrB;AAEA,SAAK,IAAI,IAAI,KAAK,IAAI,IAAI,GAAG,MAAM,CAAC;AACpC,SAAK,IAAI,IAAI,KAAK,IAAI,IAAI,GAAG,MAAM,CAAC;AACpC,SAAK,IAAI,IAAI,KAAK,IAAI,IAAI,GAAG,MAAM,CAAC;AACpC,SAAK,IAAI,IAAI,KAAK,IAAI,IAAI,GAAG,MAAM,CAAC;AAEpC,SAAK,cAAc;AAAA,EAEvB;AAAA,EAEA,MAAM,OAAe;AACjB,SAAK,YAAY;AACjB,YAAI,4BAAW,KAAK,IAAI,CAAC,GAAG;AACxB,WAAK,SAAS,KAAK,SAAS;AAAA,IAChC;AACA,YAAI,4BAAW,KAAK,IAAI,CAAC,GAAG;AACxB,WAAK,QAAQ,KAAK,QAAQ;AAAA,IAC9B;AAAA,EACJ;AAAA,EAEA,IAAI,SAAS;AACT,QAAI,KAAK,IAAI,MAAM,qBAAK;AACpB,aAAO;AAAA,IACX;AACA,WAAO,KAAK,IAAI,IAAI,KAAK,IAAI;AAAA,EACjC;AAAA,EAEA,IAAI,OAAO,QAAgB;AACvB,SAAK,YAAY;AACjB,SAAK,MAAM,IAAI,IAAI,KAAK,IAAI,IAAI;AAAA,EACpC;AAAA,EAGA,IAAI,QAAQ;AACR,QAAI,KAAK,IAAI,MAAM,qBAAK;AACpB,aAAO;AAAA,IACX;AACA,WAAO,KAAK,IAAI,IAAI,KAAK,IAAI;AAAA,EACjC;AAAA,EAEA,IAAI,MAAM,OAAe;AACrB,SAAK,YAAY;AACjB,SAAK,MAAM,IAAI,IAAI,KAAK,IAAI,IAAI;AAAA,EACpC;AAAA,EAGA,IAAI,IAAI;AACJ,WAAO,KAAK,IAAI;AAAA,EACpB;AAAA,EAEA,IAAI,EAAE,GAAW;AAEb,SAAK,YAAY;AACjB,SAAK,aAAa;AAElB,UAAM,QAAQ,KAAK;AACnB,SAAK,MAAM,IAAI,IAAI;AACnB,SAAK,MAAM,IAAI,IAAI,KAAK,IAAI,IAAI;AAEhC,SAAK,cAAc;AAAA,EAEvB;AAAA,EAGA,IAAI,IAAI;AACJ,WAAO,KAAK,IAAI;AAAA,EACpB;AAAA,EAGA,IAAI,EAAE,GAAW;AAEb,SAAK,YAAY;AACjB,SAAK,aAAa;AAElB,UAAM,SAAS,KAAK;AACpB,SAAK,MAAM,IAAI,IAAI;AACnB,SAAK,MAAM,IAAI,IAAI,KAAK,IAAI,IAAI;AAEhC,SAAK,cAAc;AAAA,EAEvB;AAAA,EAGA,IAAI,UAAU;AACV,WAAO,KAAK,IAAI,KAAK;AAAA,EACzB;AAAA,EAEA,IAAI,WAAW;AACX,WAAO,IAAI,uBAAQ,KAAK,IAAI,GAAG,KAAK,CAAC;AAAA,EACzC;AAAA,EAEA,IAAI,aAAa;AACb,WAAO,IAAI,uBAAQ,KAAK,GAAG,KAAK,IAAI,CAAC;AAAA,EACzC;AAAA,EAEA,IAAI,cAAc;AACd,WAAO,KAAK,IAAI,KAAK;AAAA,EACzB;AAAA,EAGA,IAAI,SAAS;AACT,WAAO,KAAK,IAAI,KAAK,EAAE,IAAI,KAAK,IAAI,GAAG,KAAK,GAAG,EAAE,MAAM,GAAG,CAAC;AAAA,EAC/D;AAAA,EAEA,IAAI,OAAO,QAAiB;AACxB,SAAK,YAAY;AACjB,UAAM,SAAS,KAAK,OAAO,GAAG,MAAM;AACpC,SAAK,cAAc,MAAM;AAAA,EAC7B;AAAA,EAEA,cAAc,QAAiB;AAC3B,SAAK,YAAY;AACjB,SAAK,IAAI,IAAI,MAAM;AACnB,SAAK,IAAI,IAAI,MAAM;AAEnB,WAAO;AAAA,EACX;AAAA,EAGA,yBAAyB,WAAwB;AAC7C,SAAK,oBAAoB,UAAU,WAAW;AAC9C,SAAK,oBAAoB,UAAU,OAAO;AAC1C,WAAO;AAAA,EACX;AAAA,EAEA,sCAAsC,WAAwB;AAC1D,WAAO,KAAK,SAAS,EAAE,yBAAyB,SAAS;AAAA,EAC7D;AAAA,EAGA,mCAAmC,WAAqC;AAEpE,UAAM,SAAS,KAAK,SAAS;AAC7B,WAAO,YAAY;AAEnB,WAAO,aAAa;AAEpB,UAAM,MAAM,OAAO;AACnB,QAAI,IAAI,MAAM,qBAAK;AACf,UAAI,IAAI,UAAU,IAAI,IAAI,KAAK,IAAI,OAAO,OAAO,UAAU,KAAK;AAAA,IACpE;AACA,QAAI,IAAI,MAAM,qBAAK;AACf,UAAI,IAAI,UAAU,IAAI,IAAI,KAAK,IAAI,OAAO,QAAQ,UAAU,MAAM;AAAA,IACtE;AAEA,UAAM,MAAM,OAAO;AACnB,QAAI,IAAI,MAAM,qBAAK;AACf,UAAI,IAAI,UAAU,IAAI,IAAI,KAAK,IAAI,OAAO,OAAO,UAAU,KAAK;AAAA,IACpE;AACA,QAAI,IAAI,MAAM,qBAAK;AACf,UAAI,IAAI,UAAU,IAAI,IAAI,KAAK,IAAI,OAAO,QAAQ,UAAU,MAAM;AAAA,IACtE;AAEA,WAAO,IAAI,IAAI,KAAK,IAAI,OAAO,IAAI,GAAG,UAAU,IAAI,CAAC;AACrD,WAAO,IAAI,IAAI,KAAK,IAAI,OAAO,IAAI,GAAG,UAAU,IAAI,CAAC;AACrD,WAAO,IAAI,IAAI,KAAK,IAAI,OAAO,IAAI,GAAG,UAAU,IAAI,CAAC;AACrD,WAAO,IAAI,IAAI,KAAK,IAAI,OAAO,IAAI,GAAG,UAAU,IAAI,CAAC;AAGrD,QAAI,OAAO,SAAS,GAAG;AAEnB,YAAM,YAAY,KAAK,OAAO,IAAI,UAAU,OAAO,KAAK;AACxD,aAAO,IAAI,IAAI;AACf,aAAO,IAAI,IAAI;AAAA,IAEnB;AAEA,QAAI,OAAO,QAAQ,GAAG;AAElB,YAAM,YAAY,KAAK,OAAO,IAAI,UAAU,OAAO,KAAK;AACxD,aAAO,IAAI,IAAI;AACf,aAAO,IAAI,IAAI;AAAA,IAEnB;AAEA,WAAO,cAAc;AAErB,WAAO;AAAA,EAEX;AAAA,EAGA,IAAI,OAAO;AACP,WAAO,KAAK,SAAS,KAAK;AAAA,EAC9B;AAAA,EAGA,wBAAwB,WAAwB;AAC5C,WAAQ,KAAK,mCAAmC,SAAS,EAAE,QAAQ;AAAA,EACvE;AAAA,EAIA,oBAAoB,MAAc,OAAe,QAAgB,KAAa;AAC1E,UAAM,SAAS,KAAK,SAAS;AAC7B,WAAO,YAAY;AACnB,WAAO,IAAI,IAAI,KAAK,IAAI,IAAI;AAC5B,WAAO,IAAI,IAAI,KAAK,IAAI,IAAI;AAC5B,WAAO,IAAI,IAAI,KAAK,IAAI,IAAI;AAC5B,WAAO,IAAI,IAAI,KAAK,IAAI,IAAI;AAC5B,WAAO;AAAA,EACX;AAAA,EAEA,mBAAmB,OAAe;AAC9B,WAAO,KAAK,oBAAoB,OAAO,OAAO,OAAO,KAAK;AAAA,EAC9D;AAAA,EAEA,oBAAoB,QAAoC,qBAA6B,qBAAK;AAEtF,aAAS,KAAK,4CAA4C,MAAM;AAEhE,QAAI,MAAM,kBAAkB,GAAG;AAC3B,2BAAqB;AAAA,IACzB;AAEA,UAAM,SAAS,KAAK,SAAS;AAC7B,WAAO,SAAS;AAEhB,QAAI,sBAAsB,qBAAK;AAC3B,YAAM,SAAS,SAAS,KAAK;AAC7B,aAAO,cAAc,IAAI,uBAAQ,GAAG,SAAS,kBAAkB,EAAE,MAAM,EAAE,CAAC;AAAA,IAC9E;AAEA,WAAO;AAAA,EAEX;AAAA,EAEA,mBAAmB,OAAmC,qBAA6B,qBAAK;AAEpF,YAAQ,KAAK,2CAA2C,KAAK;AAE7D,QAAI,MAAM,kBAAkB,GAAG;AAC3B,2BAAqB;AAAA,IACzB;AAEA,UAAM,SAAS,KAAK,SAAS;AAC7B,WAAO,QAAQ;AAEf,QAAI,sBAAsB,qBAAK;AAC3B,YAAM,SAAS,QAAQ,KAAK;AAC5B,aAAO,cAAc,IAAI,uBAAQ,SAAS,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;AAAA,IAC9E;AAEA,WAAO;AAAA,EAEX;AAAA,EAEA,mCAAmC,cAAsB,GAAG,qBAA6B,qBAAK;AAC1F,WAAO,KAAK,oBAAoB,KAAK,QAAQ,aAAa,kBAAkB;AAAA,EAChF;AAAA,EAEA,mCAAmC,aAAqB,GAAG,qBAA6B,qBAAK;AACzF,WAAO,KAAK,mBAAmB,KAAK,SAAS,YAAY,kBAAkB;AAAA,EAC/E;AAAA,EAEA,eAAe,GAAW,qBAA6B,GAAG;AAEtD,UAAM,SAAS,KAAK,SAAS;AAC7B,WAAO,IAAI,IAAI,OAAO,QAAQ;AAE9B,WAAO;AAAA,EAEX;AAAA,EAEA,eAAe,GAAW,qBAA6B,GAAG;AAEtD,UAAM,SAAS,KAAK,SAAS;AAC7B,WAAO,IAAI,IAAI,OAAO,SAAS;AAE/B,WAAO;AAAA,EAEX;AAAA,EAGA,mBAAmB,GAAW;AAE1B,UAAM,SAAS,KAAK,SAAS;AAC7B,WAAO,IAAI,KAAK,IAAI;AAEpB,WAAO;AAAA,EAEX;AAAA,EAEA,mBAAmB,GAAW;AAE1B,UAAM,SAAS,KAAK,SAAS;AAC7B,WAAO,IAAI,KAAK,IAAI;AAEpB,WAAO;AAAA,EAEX;AAAA,EAEA,uBAAuB,YAAoB,qBAAqB,GAAG;AAE/D,UAAM,SAAS,KAAK,mBAAmB,KAAK,QAAQ,YAAY,kBAAkB;AAElF,WAAO;AAAA,EAEX;AAAA,EAEA,wBAAwB,aAAqB,qBAAqB,GAAG;AAEjE,UAAM,SAAS,KAAK,oBAAoB,KAAK,SAAS,aAAa,kBAAkB;AAErF,WAAO;AAAA,EAEX;AAAA,EAGA,4BACI,mBACA,iBACA,mBACA,kBACF;AAEE,UAAM,SAAS,KAAK,SAAS;AAC7B,WAAO,YAAY;AAEnB,UAAM,QAAQ,OAAO;AACrB,UAAM,SAAS,OAAO;AAEtB,WAAO,QAAQ,kBAAkB;AACjC,WAAO,SAAS,mBAAmB;AAEnC,WAAO,SAAS,IAAI;AAAA,MAChB,oBAAoB;AAAA,MACpB,oBAAoB;AAAA,IACxB;AAEA,WAAO;AAAA,EAEX;AAAA,EAOA,sBAAsB,UAAkB,qBAA6B,GAAgB;AACjF,QAAI,KAAK,SAAS,UAAU;AACxB,aAAO,KAAK,SAAS;AAAA,IACzB;AACA,WAAO,KAAK,mBAAmB,UAAU,kBAAkB;AAAA,EAC/D;AAAA,EAKA,uBAAuB,WAAmB,qBAA6B,GAAgB;AACnF,QAAI,KAAK,UAAU,WAAW;AAC1B,aAAO,KAAK,SAAS;AAAA,IACzB;AACA,WAAO,KAAK,oBAAoB,WAAW,kBAAkB;AAAA,EACjE;AAAA,EAKA,sBAAsB,UAAkB,qBAA6B,GAAgB;AACjF,QAAI,KAAK,SAAS,UAAU;AACxB,aAAO,KAAK,SAAS;AAAA,IACzB;AACA,WAAO,KAAK,mBAAmB,UAAU,kBAAkB;AAAA,EAC/D;AAAA,EAKA,uBAAuB,WAAmB,qBAA6B,GAAgB;AACnF,QAAI,KAAK,UAAU,WAAW;AAC1B,aAAO,KAAK,SAAS;AAAA,IACzB;AACA,WAAO,KAAK,oBAAoB,WAAW,kBAAkB;AAAA,EACjE;AAAA,EAIA,gCAAgC,oBAAiC,YAAY,KAAK,YAAY,KAAK;AAC/F,UAAM,SAAS,KAAK,SAAS;AAC7B,WAAO,SAAS,mBAAmB,QAC9B,eAAe,YAAY,mBAAmB,KAAK,EACnD,eAAe,YAAY,mBAAmB,MAAM;AACzD,WAAO;AAAA,EACX;AAAA,EAGA,2BACI,SACA,WAAsE,GACtE,iBAA4E,qBAC9E;AAEE,YAAI,wBAAO,QAAQ,GAAG;AAClB,iBAAW;AAAA,IACf;AACA,QAAI,EAAG,oBAA4B,QAAQ;AACvC,iBAAW,CAAC,QAAQ,EAAE,iBAAiB,QAAQ,SAAS,CAAC;AAAA,IAC7D;AACA,eAAY,SAAmB,gCAAgC,QAAQ,SAAS,CAAC;AACjF,eAAW,SAAS,IAAI,aAAW,KAAK,2CAA2C,OAAO,CAAC;AAC3F,QAAI,EAAE,0BAA0B,cAAU,4BAAW,cAAc,GAAG;AAClE,uBAAiB,CAAC,cAAc,EAAE,iBAAiB,QAAQ,MAAM;AAAA,IACrE;AACA,qBAAiB,eAAe;AAAA,MAC5B,WAAS,KAAK,2CAA2C,KAAK;AAAA,IAClE;AAEA,cAAU,QAAQ,IAAI,YAAU,KAAK,2CAA2C,MAAM,CAAC;AACvF,UAAM,SAAwB,CAAC;AAC/B,UAAM,eAAgB,QAAqB;AAAA,MACvC,CAAC,GAAG,GAAG,UAAU;AACb,gBAAI,4BAAY,eAA4B,MAAM,GAAG;AACjD,cAAI;AAAA,QACR;AACA,eAAO,IAAI;AAAA,MACf;AAAA,MACA;AAAA,IACJ;AACA,UAAM,gBAAgB,SAAS;AAC/B,UAAM,sBAAuB,eAA4B;AACzD,UAAM,qBAAqB,KAAK,QAAQ,gBAAgB;AACxD,QAAI,mBAAmB,KAAK;AAE5B,aAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AAErC,UAAI;AACJ,cAAI,4BAAW,eAAe,EAAE,GAAG;AAC/B,sBAAe,eAAe,MAAM;AAAA,MACxC,OACK;AACD,sBAAc,sBAAsB,QAAQ,KAAe;AAAA,MAC/D;AAEA,YAAM,YAAY,KAAK,mBAAmB,WAAW;AAErD,UAAI,UAAU;AACd,UAAI,SAAS,SAAS,KAAK,SAAS,IAAI;AACpC,kBAAU,SAAS;AAAA,MACvB;AAEA,gBAAU,IAAI;AACd,yBAAmB,UAAU,IAAI,IAAI;AACrC,aAAO,KAAK,SAAS;AAAA,IAEzB;AAEA,WAAO;AAAA,EAEX;AAAA,EAEA,4BACI,SACA,WAAsE,GACtE,kBAA6E,qBAC/E;AAEE,YAAI,wBAAO,QAAQ,GAAG;AAClB,iBAAW;AAAA,IACf;AACA,QAAI,EAAG,oBAA4B,QAAQ;AACvC,iBAAW,CAAC,QAAQ,EAAE,iBAAiB,QAAQ,SAAS,CAAC;AAAA,IAC7D;AACA,eAAY,SAAsB,gCAAgC,QAAQ,SAAS,CAAC;AACpF,eAAW,SAAS,IAAI,aAAW,KAAK,4CAA4C,OAAO,CAAC;AAC5F,QAAI,EAAE,2BAA2B,cAAU,4BAAW,eAAe,GAAG;AACpE,wBAAkB,CAAC,eAAe,EAAE,iBAAiB,QAAQ,MAAM;AAAA,IACvE;AACA,sBAAkB,gBAAgB;AAAA,MAC9B,YAAU,KAAK,4CAA4C,MAAM;AAAA,IACrE;AAEA,cAAU,QAAQ,IAAI,YAAU,KAAK,4CAA4C,MAAM,CAAC;AACxF,UAAM,SAAwB,CAAC;AAC/B,UAAM,eAAgB,QAAqB;AAAA,MACvC,CAAC,GAAG,GAAG,UAAU;AACb,gBAAI,4BAAY,gBAA6B,MAAM,GAAG;AAClD,cAAI;AAAA,QACR;AACA,eAAO,IAAI;AAAA,MACf;AAAA,MACA;AAAA,IACJ;AACA,UAAM,gBAAgB,SAAS;AAC/B,UAAM,uBAAwB,gBAA6B;AAC3D,UAAM,sBAAsB,KAAK,SAAS,gBAAgB;AAC1D,QAAI,mBAAmB,KAAK;AAE5B,aAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACrC,UAAI;AACJ,cAAI,4BAAW,gBAAgB,EAAE,GAAG;AAEhC,uBAAgB,gBAAgB,MAAM;AAAA,MAE1C,OACK;AAED,uBAAe,uBAAuB,QAAQ,KAAe;AAAA,MAEjE;AAEA,YAAM,YAAY,KAAK,oBAAoB,YAAY;AAEvD,UAAI,UAAU;AACd,UAAI,SAAS,SAAS,KAAK,SAAS,IAAI;AACpC,kBAAU,SAAS;AAAA,MACvB;AAEA,gBAAU,IAAI;AACd,yBAAmB,UAAU,IAAI,IAAI;AAErC,aAAO,KAAK,SAAS;AAAA,IACzB;AAEA,WAAO;AAAA,EAEX;AAAA,EAGA,kCAAkC,gBAAwB,UAAkB,GAAG;AAC3E,UAAM,SAAwB,CAAC;AAC/B,UAAM,eAAe,WAAW,iBAAiB;AACjD,UAAM,eAAe,KAAK,QAAQ,gBAAgB;AAClD,aAAS,IAAI,GAAG,IAAI,gBAAgB,KAAK;AACrC,YAAM,YAAY,KAAK,mBAAmB,aAAa,KAAK,iBAAiB,EAAE;AAC/E,aAAO,KAAK,SAAS;AAAA,IACzB;AACA,WAAO;AAAA,EACX;AAAA,EAEA,mCAAmC,gBAAwB,UAAkB,GAAG;AAC5E,UAAM,SAAwB,CAAC;AAC/B,UAAM,eAAe,WAAW,iBAAiB;AACjD,UAAM,gBAAgB,KAAK,SAAS,gBAAgB;AACpD,aAAS,IAAI,GAAG,IAAI,gBAAgB,KAAK;AACrC,YAAM,YAAY,KAAK,oBAAoB,cAAc,KAAK,iBAAiB,EAAE;AACjF,aAAO,KAAK,SAAS;AAAA,IACzB;AACA,WAAO;AAAA,EACX;AAAA,EAGA,0BACI,OACA,UAAqE,GACrE,UACA,gBACF;AACE,QAAI,EAAE,mBAAmB,QAAQ;AAC7B,gBAAU,CAAC,OAAO,EAAE,iBAAiB,MAAM,MAAM;AAAA,IACrD;AACA,UAAM,SAAS,KAAK,2BAA2B,SAAS,UAAU,cAAc;AAChF,WAAO,QAAQ,CAAC,OAAO,cAAU,8BAAa,MAAM,MAAM,EAAE,QAAQ,KAAK;AACzE,WAAO;AAAA,EACX;AAAA,EAEA,2BACI,OACA,UAAqE,GACrE,UACA,iBACF;AACE,QAAI,EAAE,mBAAmB,QAAQ;AAC7B,gBAAU,CAAC,OAAO,EAAE,iBAAiB,MAAM,MAAM;AAAA,IACrD;AACA,UAAM,SAAS,KAAK,4BAA4B,SAAS,UAAU,eAAe;AAClF,WAAO,QAAQ,CAAC,OAAO,cAAU,8BAAa,MAAM,MAAM,EAAE,QAAQ,KAAK;AACzE,WAAO;AAAA,EACX;AAAA,EAGA,iCAAiC,OAAiB,SAAiB;AAC/D,UAAM,SAAS,KAAK,kCAAkC,MAAM,QAAQ,OAAO;AAC3E,WAAO,QAAQ,CAAC,OAAO,UAAU,MAAM,OAAO,QAAQ,KAAK;AAC3D,WAAO;AAAA,EACX;AAAA,EAEA,kCAAkC,OAAiB,SAAiB;AAChE,UAAM,SAAS,KAAK,mCAAmC,MAAM,QAAQ,OAAO;AAC5E,WAAO,QAAQ,CAAC,OAAO,UAAU,MAAM,OAAO,QAAQ,KAAK;AAC3D,WAAO;AAAA,EACX;AAAA,EAGA,4CAA4C,QAAoC;AAC5E,QAAI,kBAAkB,UAAU;AAC5B,aAAO,OAAO,KAAK,KAAK;AAAA,IAC5B;AACA,QAAI,kBAAkB,sBAAQ;AAC1B,aAAO,OAAO,uBAAuB,KAAK,KAAK;AAAA,IACnD;AACA,WAAO;AAAA,EACX;AAAA,EAEA,2CAA2C,OAAmC;AAC1E,QAAI,iBAAiB,UAAU;AAC3B,aAAO,MAAM,KAAK,MAAM;AAAA,IAC5B;AACA,QAAI,iBAAiB,sBAAQ;AACzB,aAAO,MAAM,sBAAsB,KAAK,MAAM;AAAA,IAClD;AACA,WAAO;AAAA,EACX;AAAA,EAEA,oBAAoB,UAAkB,GAAG,SAAqC,KAAK,QAAQ;AACvF,UAAM,eAAe,KAAK,4CAA4C,MAAM;AAC5E,UAAM,SAAS,KAAK,eAAe,KAAK,IAAI,IAAI,OAAO;AACvD,QAAI,gBAAgB,KAAK,QAAQ;AAC7B,aAAO,SAAS;AAAA,IACpB;AACA,WAAO;AAAA,EACX;AAAA,EAEA,uBAAuB,UAAkB,GAAG,QAAoC,KAAK,OAAO;AACxF,UAAM,cAAc,KAAK,2CAA2C,KAAK;AACzE,UAAM,SAAS,KAAK,eAAe,KAAK,IAAI,IAAI,OAAO;AACvD,QAAI,eAAe,KAAK,OAAO;AAC3B,aAAO,QAAQ;AAAA,IACnB;AACA,WAAO;AAAA,EACX;AAAA,EAEA,wBAAwB,UAAkB,GAAG,SAAqC,KAAK,QAAQ;AAC3F,UAAM,eAAe,KAAK,4CAA4C,MAAM;AAC5E,UAAM,SAAS,KAAK,eAAe,KAAK,IAAI,IAAI,eAAe,OAAO;AACtE,QAAI,gBAAgB,KAAK,QAAQ;AAC7B,aAAO,SAAS;AAAA,IACpB;AACA,WAAO;AAAA,EACX;AAAA,EAEA,2BAA2B,UAAkB,GAAG,QAAoC,KAAK,OAAO;AAC5F,UAAM,cAAc,KAAK,2CAA2C,KAAK;AACzE,UAAM,SAAS,KAAK,eAAe,KAAK,IAAI,IAAI,cAAc,OAAO;AACrE,QAAI,eAAe,KAAK,OAAO;AAC3B,aAAO,QAAQ;AAAA,IACnB;AACA,WAAO;AAAA,EAEX;AAAA,EAUA,kCACI,OACA,WAAsE,GACtE,kBAA6E,qBAC/E;AACE,UAAM,SAAwB,CAAC;AAC/B,QAAI,mBAAmB,KAAK,SAAS;AAErC,QAAI,EAAE,oBAAoB,QAAQ;AAC9B,iBAAW,CAAC,QAAQ,EAAE,iBAAiB,MAAM,SAAS,CAAC;AAAA,IAC3D;AACA,eAAW,SAAS,IAAI,aAAW,KAAK,4CAA4C,OAAO,CAAC;AAE5F,QAAI,EAAE,2BAA2B,cAAU,4BAAW,eAAe,GAAG;AACpE,wBAAkB,CAAC,eAAe,EAAE,iBAAiB,MAAM,MAAM;AAAA,IACrE;AACA,sBAAkB,gBAAgB;AAAA,MAC9B,YAAU,KAAK,4CAA4C,MAAM;AAAA,IACrE;AAEA,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACnC,YAAM,QAAQ,iBAAiB,oBAAoB,MAAM,EAAE;AAE3D,cAAI,4BAAW,gBAAgB,EAAE,GAAG;AAChC,cAAM,SAAS,gBAAgB;AAAA,MACnC;AAEA,YAAM,GAAG,QAAQ;AACjB,aAAO,KAAK,KAAK;AAEjB,YAAM,UAAW,SAAS,MAAM;AAChC,yBAAmB,MAAM,oBAAoB,OAAO;AAAA,IACxD;AAEA,WAAO;AAAA,EACX;AAAA,EAUA,+BACI,OACA,WAAsE,GACtE,iBAA4E,qBAC9E;AACE,UAAM,SAAwB,CAAC;AAC/B,QAAI,mBAAmB,KAAK,SAAS;AAErC,QAAI,EAAE,oBAAoB,QAAQ;AAC9B,iBAAW,CAAC,QAAQ,EAAE,iBAAiB,MAAM,SAAS,CAAC;AAAA,IAC3D;AACA,eAAW,SAAS,IAAI,aAAW,KAAK,2CAA2C,OAAO,CAAC;AAE3F,QAAI,EAAE,0BAA0B,cAAU,4BAAW,cAAc,GAAG;AAClE,uBAAiB,CAAC,cAAc,EAAE,iBAAiB,MAAM,MAAM;AAAA,IACnE;AACA,qBAAiB,eAAe;AAAA,MAC5B,WAAS,KAAK,2CAA2C,KAAK;AAAA,IAClE;AAEA,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACnC,YAAM,QAAQ,iBAAiB,mBAAmB,MAAM,EAAE;AAE1D,cAAI,4BAAW,eAAe,EAAE,GAAG;AAC/B,cAAM,QAAQ,eAAe;AAAA,MACjC;AAEA,YAAM,GAAG,QAAQ;AACjB,aAAO,KAAK,KAAK;AAEjB,YAAM,UAAW,SAAS,MAAM;AAChC,yBAAmB,MAAM,uBAAuB,OAAO;AAAA,IAC3D;AAEA,WAAO;AAAA,EACX;AAAA,EAYA,gCACI,OACA,WAAsE,GACtE,kBAA6E,qBAC/E;AACE,UAAM,SAA0B,CAAC;AACjC,QAAI,sBAAsB,KAAK,SAAS;AAExC,QAAI,EAAE,oBAAoB,QAAQ;AAC9B,iBAAW,CAAC,QAAQ,EAAE,iBAAiB,MAAM,SAAS,CAAC;AAAA,IAC3D;AACA,eAAW,SAAS,IAAI,aAAW,KAAK,4CAA4C,OAAO,CAAC;AAE5F,QAAI,EAAE,2BAA2B,cAAU,4BAAW,eAAe,GAAG;AACpE,wBAAkB,CAAC,eAAe,EAAE,iBAAiB,MAAM,MAAM;AAAA,IACrE;AACA,sBAAkB,gBAAgB;AAAA,MAC9B,YAAU,KAAK,4CAA4C,MAAM;AAAA,IACrE;AAEA,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACnC,YAAM,WAAW,MAAM;AACvB,YAAM,YAAY,oBAAoB,+BAA+B,QAAQ;AAE7E,cAAI,4BAAW,gBAAgB,EAAE,GAAG;AAChC,cAAM,eAAe,gBAAgB;AACrC,kBAAU,QAAQ,CAAC,OAAO,MAAM;AAC5B,gBAAM,SAAS;AACf,mBAAS,GAAG,QAAQ;AAAA,QACxB,CAAC;AAAA,MACL;AAEA,aAAO,KAAK,SAAS;AAErB,YAAM,UAAW,SAAS,MAAM;AAChC,YAAM,YAAY,KAAK,IAAI,GAAG,UAAU,IAAI,OAAK,EAAE,MAAM,CAAC;AAC1D,4BAAsB,oBAAoB,oBAAoB,SAAS,SAAS;AAAA,IACpF;AAEA,WAAO;AAAA,EACX;AAAA,EAEA,yCAAyC,MAAc,sBAAsB,GAAG,sBAAsB,GAAG;AACrG,UAAM,uBAAuB,KAAK,qBAAqB;AACvD,WAAO,KAAK,oBAAoB,qBAAqB,QAAQ,mBAAmB,EAC3E,mBAAmB,qBAAqB,OAAO,mBAAmB;AAAA,EAC3E;AAAA,EAEA,iBAAiB,WAAoB;AACjC,SAAK,YAAY;AACjB,WAAO;AAAA,EACX;AAAA,EAEA,gBAAgB,UAAmB;AAC/B,SAAK,WAAW;AAChB,WAAO;AAAA,EACX;AAAA,EAEA,iBAAiB,WAAoB;AACjC,SAAK,YAAY;AACjB,WAAO;AAAA,EACX;AAAA,EAEA,gBAAgB,UAAmB;AAC/B,SAAK,WAAW;AAChB,WAAO;AAAA,EACX;AAAA,EAEA,mCAAmC,sBAAsB,GAAG,sBAAsB,GAAG;AACjF,WAAO,KAAK;AAAA,MACR;AAAA,QACI,CAAC,KAAK,QAAQ,KAAK,SAAS,EAAE,OAAO,eAAS,kCAAiB,KAAK,CAAC,EAAE,IAAI;AAAA,QAC3E,KAAK;AAAA,MACT,EAAE,OAAO,eAAS,kCAAiB,KAAK,CAAC,EAAE,IAAI;AAAA,MAC/C;AAAA,IACJ,EAAE;AAAA,MACE;AAAA,QACI,CAAC,KAAK,OAAO,KAAK,QAAQ,EAAE,OAAO,eAAS,kCAAiB,KAAK,CAAC,EAAE,IAAI;AAAA,QACzE,KAAK;AAAA,MACT,EAAE,OAAO,eAAS,kCAAiB,KAAK,CAAC,EAAE,IAAI;AAAA,MAC/C;AAAA,IACJ;AAAA,EACJ;AAAA,EAGA,sBAAsB,MAAc,cAAc,KAAK,cAAc;AACjE,SAAK,QAAQ;AACb,SAAK,eAAe;AACpB,WAAO;AAAA,EACX;AAAA,EAGS,WAAW;AAEhB,UAAM,SAAS,MAAM,KAAK,MAAM,OAAO,YAAY,KAAK,IAAI,UAAU,KAAK,IAAI,eAC9D,KAAK,OAAO,QAAQ,CAAC,IAAI,cAAc,KAAK,OAAO,QAAQ,CAAC,IAAI;AAEjF,WAAO;AAAA,EAEX;AAAA,EAEA,KAAK,OAAO,eAAe;AACvB,WAAO,KAAK,SAAS;AAAA,EACzB;AAAA,EAGA,GAAG,WAA8D;AAC7D,UAAM,mBAAmB,IAAI,4BAA4B,MAAM,SAAS;AAExE,WAAO,iBAAiB,SAAS;AAAA,EACrC;AAAA,EAGA,QAAQ,WAAiC;AACrC,WAAO;AAAA,EACX;AAAA,EAEA,OAAoB;AAChB,WAAO;AAAA,EACX;AAAA,EAIA,MAAY,iBAA8C;AACtD,QAAI,iBAAiB;AACjB,aAAO,gBAAgB,IAAW;AAAA,IACtC;AACA,WAAO;AAAA,EACX;AAAA,EAIA,OAAO,qBAAqB,QAAmB;AAC3C,UAAM,SAAS,IAAI,YAAY;AAC/B,aAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACpC,aAAO,oBAAoB,OAAO,EAAE;AAAA,IACxC;AACA,WAAO;AAAA,EACX;AAAA,EAEA,OAAO,kCAAkC,qBAAgD;AACrF,UAAM,SAAS,IAAI,YAAY;AAC/B,aAAS,IAAI,GAAG,IAAI,oBAAoB,QAAQ,KAAK;AACjD,YAAM,mBAAmB,oBAAoB;AAC7C,UAAI,4BAA4B,aAAa;AACzC,eAAO,oBAAoB,iBAAiB,GAAG;AAC/C,eAAO,oBAAoB,iBAAiB,GAAG;AAAA,MACnD,OACK;AACD,eAAO,oBAAoB,gBAAgB;AAAA,MAC/C;AAAA,IACJ;AACA,WAAO;AAAA,EACX;AAAA,EAGA,eAAe;AACX,SAAK,kBAAkB;AAAA,EAC3B;AAAA,EAEA,gBAAgB;AACZ,SAAK,kBAAkB;AACvB,SAAK,UAAU;AAAA,EACnB;AAAA,EAGA,YAAY;AAAA,EAIZ;AAAA,EAEA,2BAA2B;AACvB,QAAI,CAAC,KAAK,iBAAiB;AACvB,WAAK,UAAU;AAAA,IACnB;AAAA,EACJ;AAGJ;AAuEA,MAAM,4BAA4B;AAAA,EAK9B,YAAY,eAA4B,WAAoB;AAIxD,SAAK,SAAS,CAAC;AAAA,MACX,gBAAgB;AAAA,MAChB,eAAe;AAAA,MACf,gBAAgB;AAAA,MAChB,iBAAiB;AAAA,MACjB,qBAAqB;AAAA,IACzB,CAAC;AAAA,EACL;AAAA,EAGA,IAAY,OAAoC;AAC5C,WAAO,KAAK,OAAO,KAAK,OAAO,SAAS;AAAA,EAC5C;AAAA,EAIA,IAAY,iBAA0B;AAClC,WAAO,KAAK,OAAO,MAAM,WAAS,MAAM,mBAAmB;AAAA,EAC/D;AAAA,EAEQ,cAAqD;AACzD,UAAM,OAAO;AAEb,WAAO,IAAI,MAAM,CAAC,GAAG;AAAA,MACjB,IAAI,GAAG,MAAM;AAIT,YAAI,SAAS,MAAM;AACf,iBAAO,CAAC,cAAuB;AAI3B,iBAAK,OAAO,KAAK;AAAA,cACb,gBAAgB,KAAK,KAAK;AAAA,cAC1B,eAAe,KAAK,KAAK;AAAA,cACzB,gBAAgB,KAAK,KAAK;AAAA,cAC1B,iBAAiB;AAAA,cACjB,qBAAqB;AAAA,YACzB,CAAC;AACD,mBAAO,KAAK,YAAY;AAAA,UAC5B;AAAA,QACJ;AAEA,YAAI,SAAS,aAAa;AACtB,iBAAO,CAAwB,OAA4B;AACvD,gBAAI,KAAK,gBAAgB;AACrB,mBAAK,KAAK,gBAAgB,GAAG,KAAK,KAAK,aAAa;AAAA,YACxD;AACA,mBAAO,KAAK,YAAY;AAAA,UAC5B;AAAA,QACJ;AAEA,YAAI,SAAS,WAAW;AACpB,iBAAO,CAAC,cAAuB;AAC3B,kBAAM,MAAM,KAAK;AAIjB,gBAAI,sBAAsB,CAAC,IAAI,mBAAmB;AAClD,gBAAI,IAAI,qBAAqB;AACzB,kBAAI,kBAAkB;AACtB,kBAAI,gBAAgB,IAAI;AAAA,YAC5B;AACA,mBAAO,KAAK,YAAY;AAAA,UAC5B;AAAA,QACJ;AAEA,YAAI,SAAS,QAAQ;AACjB,iBAAO,MAAM;AACT,kBAAM,MAAM,KAAK;AACjB,gBAAI,sBAAsB,CAAC,IAAI;AAC/B,gBAAI,IAAI,qBAAqB;AACzB,kBAAI,kBAAkB;AACtB,kBAAI,gBAAgB,IAAI;AAAA,YAC5B;AACA,mBAAO,KAAK,YAAY;AAAA,UAC5B;AAAA,QACJ;AAEA,YAAI,SAAS,SAAS;AAGlB,cAASA,SAAT,SAAkB,iBAA+C;AAE7D,gBAAI,KAAK,OAAO,WAAW,GAAG;AAE1B,oBAAM,SAAS,KAAK,KAAK;AACzB,qBAAO,kBAAkB,gBAAgB,MAAM,IAAI;AAAA,YACvD;AAGA,kBAAM,iBAAiB,KAAK,OAAO,IAAI;AAIvC,kBAAM,iBAAiB,eAAe,kBACb,eAAe,gBACf,eAAe;AAGxC,kBAAM,cAAc,kBAAkB,gBAAgB,cAAc,IAAI;AACxE,iBAAK,KAAK,gBAAgB;AAG1B,mBAAO,KAAK,YAAY;AAAA,UAC5B;AAvBS,sBAAAA;AAwBT,iBAAOA;AAAA,QACX;AAIA,cAAM,QAAQ,KAAK,KAAK,cAAc;AAGtC,YAAI,OAAO,UAAU,YAAY;AAC7B,iBAAO,IAAI,SAAgB;AACvB,gBAAI,KAAK,gBAAgB;AACrB,mBAAK,KAAK,gBAAgB,MAAM,MAAM,KAAK,KAAK,eAAe,IAAI;AAAA,YACvE;AACA,mBAAO,KAAK,YAAY;AAAA,UAC5B;AAAA,QACJ;AAGA,YAAI,KAAK,gBAAgB;AACrB,eAAK,KAAK,gBAAgB;AAAA,QAC9B;AAEA,eAAO,KAAK,YAAY;AAAA,MAC5B;AAAA,IACJ,CAAC;AAAA,EACL;AAAA,EAEA,WAAkD;AAC9C,WAAO,KAAK,YAAY;AAAA,EAC5B;AAEJ;",
|
|
6
6
|
"names": ["endif"]
|
|
7
7
|
}
|
|
@@ -60,7 +60,7 @@ type Mutable<T> = {
|
|
|
60
60
|
export type UIViewAddControlEventTargetObject<T extends {
|
|
61
61
|
controlEvent: Record<string, any>;
|
|
62
62
|
}> = Mutable<{
|
|
63
|
-
[K in keyof T["controlEvent"]]: ((sender: UIView, event: Event) => void) & Partial<UIViewAddControlEventTargetObject<T>>;
|
|
63
|
+
-readonly [K in keyof T["controlEvent"]]: ((sender: UIView, event: Event) => void) & Partial<UIViewAddControlEventTargetObject<T>>;
|
|
64
64
|
}>;
|
|
65
65
|
interface Constraint {
|
|
66
66
|
constant: number;
|
|
@@ -358,6 +358,9 @@ export declare class UIView extends UIObject {
|
|
|
358
358
|
willAppear(): void;
|
|
359
359
|
willMoveToSuperview(superview: UIView): void;
|
|
360
360
|
didMoveToSuperview(superview: UIView): void;
|
|
361
|
+
static annotatePathOnViewHTMLElements: boolean;
|
|
362
|
+
_annotatePathOnViewHTMLElementsInSubtree(): void;
|
|
363
|
+
_annotatePathOnViewHTMLElement(): void;
|
|
361
364
|
wasAddedToViewTree(): void;
|
|
362
365
|
wasRemovedFromViewTree(): void;
|
|
363
366
|
get isMemberOfViewTree(): boolean;
|
|
@@ -1300,9 +1300,11 @@ const _UIView = class extends import_UIObject.UIObject {
|
|
|
1300
1300
|
didMoveToSuperview(superview) {
|
|
1301
1301
|
this.superview = superview;
|
|
1302
1302
|
}
|
|
1303
|
-
|
|
1303
|
+
_annotatePathOnViewHTMLElementsInSubtree() {
|
|
1304
|
+
this.forEachViewInSubtree((view) => view._annotatePathOnViewHTMLElement());
|
|
1305
|
+
}
|
|
1306
|
+
_annotatePathOnViewHTMLElement() {
|
|
1304
1307
|
var _a, _b, _c;
|
|
1305
|
-
_UIView.resizeObserver.observe(this.viewHTMLElement);
|
|
1306
1308
|
try {
|
|
1307
1309
|
const descriptors = this.propertyDescriptors;
|
|
1308
1310
|
const bestDescriptor = (_a = descriptors.find((descriptor) => !descriptor.name.startsWith("subviews."))) != null ? _a : descriptors.firstElement;
|
|
@@ -1316,6 +1318,12 @@ const _UIView = class extends import_UIObject.UIObject {
|
|
|
1316
1318
|
} catch (exception) {
|
|
1317
1319
|
}
|
|
1318
1320
|
}
|
|
1321
|
+
wasAddedToViewTree() {
|
|
1322
|
+
_UIView.resizeObserver.observe(this.viewHTMLElement);
|
|
1323
|
+
if (_UIView.annotatePathOnViewHTMLElements) {
|
|
1324
|
+
this._annotatePathOnViewHTMLElement();
|
|
1325
|
+
}
|
|
1326
|
+
}
|
|
1319
1327
|
wasRemovedFromViewTree() {
|
|
1320
1328
|
_UIView.resizeObserver.unobserve(this.viewHTMLElement);
|
|
1321
1329
|
}
|
|
@@ -2583,6 +2591,7 @@ UIView.constraintRelation = {
|
|
|
2583
2591
|
"lessThanOrEqual": AutoLayout.Relation.LEQ,
|
|
2584
2592
|
"greaterThanOrEqual": AutoLayout.Relation.GEQ
|
|
2585
2593
|
};
|
|
2594
|
+
UIView.annotatePathOnViewHTMLElements = import_UIObject.NO;
|
|
2586
2595
|
UIView.controlEvent = {
|
|
2587
2596
|
"PointerDown": "PointerDown",
|
|
2588
2597
|
"PointerMove": "PointerMove",
|